Received: by 2002:ac0:a582:0:0:0:0:0 with SMTP id m2-v6csp2377860imm; Wed, 3 Oct 2018 02:57:16 -0700 (PDT) X-Google-Smtp-Source: ACcGV63IZLhU+OJ0/j5g+rIImFO/1rhupCmP5Tmv4Edq/WW/GLsMTOFq1Lgm6x7gzpoYFI/El5v3 X-Received: by 2002:a65:4882:: with SMTP id n2-v6mr620161pgs.225.1538560636822; Wed, 03 Oct 2018 02:57:16 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1538560636; cv=none; d=google.com; s=arc-20160816; b=NXuZmmQGSqkYPuYgjeMS7apRjgSKD+GuiTV1O1X2/CzrKcwfqx2yBNqQflLgYzVVOo qlQIkryd76Q1I8kzwyTjCRTx1DXbRedje1xofqdFRNCP9uzluLzr9w2HNjE7KK/mFMa5 YvFueA6jCe5OZyd03zn3hhDfC44CZrkcSemoPFuBBRaEBhdcpyjqrxuPMEn8t5e8eqHB LMHqGmtAQznKoRhH7BZcNNAK03bE/GG9d4k97RJ6AHbsvMdmWPAdE0pQqnYcxNDs+Dom G4NNJSTCnLU7V6swF01JwBP9ZV8GF/Ztwgo0ksok4qE93voNiyH2DB4vTmcXHZV0r0A0 z63w== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:references:in-reply-to:message-id:date :subject:cc:to:from:dmarc-filter:dkim-signature:dkim-signature; bh=DPSgaeRmldl0rPDSZyvXqn4moqpmZuZwUtbEHZ5VrLA=; b=y4tDPgjW9UmBFyOcOFIQD9TQhoY9LwsWU8MTBW+sddSrn6mJKukhsReDTYP5rRb3hA o0ISQtgZKyXKz3ulqAbnw+LzJJ5HxAqp9DvYnw6nyFp1Q/Q2aFYF42Q6Lc8mhc5cHjMo MrulfQrcpXU2Q4lg/fT8DpAqFeMner24kRFFmjwr7Iaz389r6m3HTjfJgtMHHjjLaH+b 2zPLdMNJPwpiKpIzexJepzWxLoAIbPeVYoqis6pMQ6NhYJQl9MiXrLhNChe870cXQcMB 2OMjuKprRUgS6gb5Zgb/IHSJAeLvMSVSY22zSWX4Qkz+baOImU+rFGzoMUJ3bAnyaVok Yg/g== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@codeaurora.org header.s=default header.b=REWr8bte; dkim=pass header.i=@codeaurora.org header.s=default header.b=NsM1GuOi; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id h7-v6si1052968plt.21.2018.10.03.02.57.01; Wed, 03 Oct 2018 02:57:16 -0700 (PDT) Received-SPF: pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) client-ip=209.132.180.67; Authentication-Results: mx.google.com; dkim=pass header.i=@codeaurora.org header.s=default header.b=REWr8bte; dkim=pass header.i=@codeaurora.org header.s=default header.b=NsM1GuOi; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1726747AbeJCQoa (ORCPT + 99 others); Wed, 3 Oct 2018 12:44:30 -0400 Received: from smtp.codeaurora.org ([198.145.29.96]:58798 "EHLO smtp.codeaurora.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1725746AbeJCQo3 (ORCPT ); Wed, 3 Oct 2018 12:44:29 -0400 Received: by smtp.codeaurora.org (Postfix, from userid 1000) id 3D33A60C67; Wed, 3 Oct 2018 09:56:49 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=codeaurora.org; s=default; t=1538560609; bh=Zb1BDeDMzPO6PFG2EEGJgomfN06TTE0wBcGgP/4g40g=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=REWr8bteprvF8j1s3T2eqMIRMS/pXOmjb75D6SPtSEpWZPE/NIY9crvRZQHIXBeQR EYTmeWdAnb4lgZlqJaOCA1yFygNVmc7H76OBmq4ZH24F80idfsyU+pFb8AEnADNjCH iMCU4i4e8qEiF9OxTv30fRx0QaBVQqx8YWWMt3jw= X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on pdx-caf-mail.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-2.2 required=2.0 tests=ALL_TRUSTED,BAYES_00, DKIM_INVALID,DKIM_SIGNED,FROM_LOCAL_NOVOWEL autolearn=no autolearn_force=no version=3.4.0 Received: from rplsssn-linux.qualcomm.com (blr-c-bdr-fw-01_globalnat_allzones-outside.qualcomm.com [103.229.19.19]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-SHA256 (128/128 bits)) (No client certificate requested) (Authenticated sender: rplsssn@smtp.codeaurora.org) by smtp.codeaurora.org (Postfix) with ESMTPSA id EC439602F1; Wed, 3 Oct 2018 09:56:43 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=codeaurora.org; s=default; t=1538560608; bh=Zb1BDeDMzPO6PFG2EEGJgomfN06TTE0wBcGgP/4g40g=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=NsM1GuOiDR2qPwYPbCDg6bltdJ2fEKrv5yg4dAHTCITPEYp2hyfX6XyPac4giDvKh u+9BDKWXxAtkzNxn3iN6Gk+jCU9POCqu9gG6QNvB0iw+yGyWBuQKtrW+aIsZzYDEKJ /JoyQT1XsuagCOPHY1nltVb1yCEole+j/Km1xC5A= DMARC-Filter: OpenDMARC Filter v1.3.2 smtp.codeaurora.org EC439602F1 Authentication-Results: pdx-caf-mail.web.codeaurora.org; dmarc=none (p=none dis=none) header.from=codeaurora.org Authentication-Results: pdx-caf-mail.web.codeaurora.org; spf=none smtp.mailfrom=rplsssn@codeaurora.org From: "Raju P.L.S.S.S.N" To: andy.gross@linaro.org, david.brown@linaro.org, linux-arm-msm@vger.kernel.org, linux-soc@vger.kernel.org Cc: rnayak@codeaurora.org, bjorn.andersson@linaro.org, linux-kernel@vger.kernel.org, linux-pm@vger.kernel.org, sboyd@kernel.org, evgreen@chromium.org, dianders@chromium.org, mka@chromium.org, ilina@codeaurora.org, "Raju P.L.S.S.S.N" Subject: [PATCH v1 1/2] drivers: qcom: rpmh-rsc: clear active mode configuration for wake TCS Date: Wed, 3 Oct 2018 15:26:34 +0530 Message-Id: <1538560595-6275-2-git-send-email-rplsssn@codeaurora.org> X-Mailer: git-send-email 1.9.1 In-Reply-To: <1538560595-6275-1-git-send-email-rplsssn@codeaurora.org> References: <1538560595-6275-1-git-send-email-rplsssn@codeaurora.org> Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org For RSCs that have sleep & wake TCS but no dedicated active TCS, wake TCS can be re-purposed to send active requests. Once the active requests are sent and response is received, the active mode configuration needs to be cleared so that controller can use wake TCS for sending wake requests. Signed-off-by: Raju P.L.S.S.S.N Reviewed-by: Matthias Kaehlcke --- drivers/soc/qcom/rpmh-rsc.c | 77 +++++++++++++++++++++++++++++++-------------- 1 file changed, 54 insertions(+), 23 deletions(-) diff --git a/drivers/soc/qcom/rpmh-rsc.c b/drivers/soc/qcom/rpmh-rsc.c index 75bd9a8..6cc7f21 100644 --- a/drivers/soc/qcom/rpmh-rsc.c +++ b/drivers/soc/qcom/rpmh-rsc.c @@ -201,6 +201,42 @@ static const struct tcs_request *get_req_from_tcs(struct rsc_drv *drv, return NULL; } +static void __tcs_trigger(struct rsc_drv *drv, int tcs_id, bool trigger) +{ + u32 enable; + + /* + * HW req: Clear the DRV_CONTROL and enable TCS again + * While clearing ensure that the AMC mode trigger is cleared + * and then the mode enable is cleared. + */ + enable = read_tcs_reg(drv, RSC_DRV_CONTROL, tcs_id, 0); + enable &= ~TCS_AMC_MODE_TRIGGER; + write_tcs_reg_sync(drv, RSC_DRV_CONTROL, tcs_id, enable); + enable &= ~TCS_AMC_MODE_ENABLE; + write_tcs_reg_sync(drv, RSC_DRV_CONTROL, tcs_id, enable); + + if (trigger) { + /* Enable the AMC mode on the TCS and then trigger the TCS */ + enable = TCS_AMC_MODE_ENABLE; + write_tcs_reg_sync(drv, RSC_DRV_CONTROL, tcs_id, enable); + enable |= TCS_AMC_MODE_TRIGGER; + write_tcs_reg_sync(drv, RSC_DRV_CONTROL, tcs_id, enable); + } +} + +static inline void enable_tcs_irq(struct rsc_drv *drv, int tcs_id, bool enable) +{ + u32 data; + + data = read_tcs_reg(drv, RSC_DRV_IRQ_ENABLE, 0, 0); + if (enable) + data |= BIT(tcs_id); + else + data &= ~BIT(tcs_id); + write_tcs_reg(drv, RSC_DRV_IRQ_ENABLE, 0, data); +} + /** * tcs_tx_done: TX Done interrupt handler */ @@ -237,6 +273,21 @@ static irqreturn_t tcs_tx_done(int irq, void *p) } trace_rpmh_tx_done(drv, i, req, err); + + /* + * if wake tcs was re-purposed for sending active + * votes, clear AMC trigger & enable modes and + * disable interrupt for this TCS + */ + if (!drv->tcs[ACTIVE_TCS].num_tcs) { + __tcs_trigger(drv, i, false); + /* + * Disable interrupt for this TCS to avoid being + * spammed with interrupts coming when the solver + * sends its wake votes. + */ + enable_tcs_irq(drv, i, false); + } skip: /* Reclaim the TCS */ write_tcs_reg(drv, RSC_DRV_CMD_ENABLE, i, 0); @@ -285,28 +336,6 @@ static void __tcs_buffer_write(struct rsc_drv *drv, int tcs_id, int cmd_id, write_tcs_reg(drv, RSC_DRV_CMD_ENABLE, tcs_id, cmd_enable); } -static void __tcs_trigger(struct rsc_drv *drv, int tcs_id) -{ - u32 enable; - - /* - * HW req: Clear the DRV_CONTROL and enable TCS again - * While clearing ensure that the AMC mode trigger is cleared - * and then the mode enable is cleared. - */ - enable = read_tcs_reg(drv, RSC_DRV_CONTROL, tcs_id, 0); - enable &= ~TCS_AMC_MODE_TRIGGER; - write_tcs_reg_sync(drv, RSC_DRV_CONTROL, tcs_id, enable); - enable &= ~TCS_AMC_MODE_ENABLE; - write_tcs_reg_sync(drv, RSC_DRV_CONTROL, tcs_id, enable); - - /* Enable the AMC mode on the TCS and then trigger the TCS */ - enable = TCS_AMC_MODE_ENABLE; - write_tcs_reg_sync(drv, RSC_DRV_CONTROL, tcs_id, enable); - enable |= TCS_AMC_MODE_TRIGGER; - write_tcs_reg_sync(drv, RSC_DRV_CONTROL, tcs_id, enable); -} - static int check_for_req_inflight(struct rsc_drv *drv, struct tcs_group *tcs, const struct tcs_request *msg) { @@ -377,10 +406,12 @@ static int tcs_write(struct rsc_drv *drv, const struct tcs_request *msg) tcs->req[tcs_id - tcs->offset] = msg; set_bit(tcs_id, drv->tcs_in_use); + if (msg->state == RPMH_ACTIVE_ONLY_STATE && tcs->type != ACTIVE_TCS) + enable_tcs_irq(drv, tcs_id, true); spin_unlock(&drv->lock); __tcs_buffer_write(drv, tcs_id, 0, msg); - __tcs_trigger(drv, tcs_id); + __tcs_trigger(drv, tcs_id, true); done_write: spin_unlock_irqrestore(&tcs->lock, flags); -- QUALCOMM INDIA, on behalf of Qualcomm Innovation Center, Inc. is a member of the Code Aurora Forum, hosted by The Linux Foundation.