From: Rishabh Bhatnagar <rishabhb@codeaurora.org>
To: linux-kernel@vger.kernel.org, linux-remoteproc@vger.kernel.org,
bjorn.andersson@linaro.org
Cc: psodagud@codeaurora.org, tsoni@codeaurora.org,
sidgup@codeaurora.org,
Rishabh Bhatnagar <rishabhb@codeaurora.org>
Subject: [PATCH 1/2] remoteproc: qcom: Add bus scaling capability during bootup
Date: Fri, 27 Mar 2020 17:59:07 -0700 [thread overview]
Message-ID: <1585357147-4616-1-git-send-email-rishabhb@codeaurora.org> (raw)
During bootup since remote processors cannot request for
additional bus bandwidth from the interconect framework,
platform driver should provide the proxy resources. This
is useful for scenarios where the Q6 tries to access the DDR
memory in the initial stages of bootup. For e.g. during
bootup or after recovery modem Q6 tries to zero out the bss
section in the DDR. Since this is a big chunk of memory if
don't bump up the bandwidth we might encounter timeout issues.
This patch makes a proxy vote for maximizing the bus bandwidth
during bootup and removes it once processor is up.
Signed-off-by: Rishabh Bhatnagar <rishabhb@codeaurora.org>
---
drivers/remoteproc/qcom_q6v5_pas.c | 43 +++++++++++++++++++++++++++++++++++++-
1 file changed, 42 insertions(+), 1 deletion(-)
diff --git a/drivers/remoteproc/qcom_q6v5_pas.c b/drivers/remoteproc/qcom_q6v5_pas.c
index edf9d0e..8f5db8d 100644
--- a/drivers/remoteproc/qcom_q6v5_pas.c
+++ b/drivers/remoteproc/qcom_q6v5_pas.c
@@ -20,6 +20,7 @@
#include <linux/qcom_scm.h>
#include <linux/regulator/consumer.h>
#include <linux/remoteproc.h>
+#include <linux/interconnect.h>
#include <linux/soc/qcom/mdt_loader.h>
#include <linux/soc/qcom/smem.h>
#include <linux/soc/qcom/smem_state.h>
@@ -28,6 +29,9 @@
#include "qcom_q6v5.h"
#include "remoteproc_internal.h"
+#define PIL_TZ_AVG_BW 0
+#define PIL_TZ_PEAK_BW UINT_MAX
+
struct adsp_data {
int crash_reason_smem;
const char *firmware_name;
@@ -62,6 +66,7 @@ struct qcom_adsp {
int proxy_pd_count;
int pas_id;
+ struct icc_path *bus_client;
int crash_reason_smem;
bool has_aggre2_clk;
@@ -124,6 +129,25 @@ static int adsp_load(struct rproc *rproc, const struct firmware *fw)
}
+static int do_bus_scaling(struct qcom_adsp *adsp, bool enable)
+{
+ int rc;
+ u32 avg_bw = enable ? PIL_TZ_AVG_BW : 0;
+ u32 peak_bw = enable ? PIL_TZ_PEAK_BW : 0;
+
+ if (adsp->bus_client) {
+ rc = icc_set_bw(adsp->bus_client, avg_bw, peak_bw);
+ if (rc) {
+ dev_err(adsp->dev, "bandwidth request failed(rc:%d)\n",
+ rc);
+ return rc;
+ }
+ } else
+ dev_info(adsp->dev, "Bus scaling not setup for %s\n",
+ adsp->rproc->name);
+ return 0;
+}
+
static int adsp_start(struct rproc *rproc)
{
struct qcom_adsp *adsp = (struct qcom_adsp *)rproc->priv;
@@ -131,9 +155,13 @@ static int adsp_start(struct rproc *rproc)
qcom_q6v5_prepare(&adsp->q6v5);
+ ret = do_bus_scaling(adsp, true);
+ if (ret)
+ goto disable_irqs;
+
ret = adsp_pds_enable(adsp, adsp->active_pds, adsp->active_pd_count);
if (ret < 0)
- goto disable_irqs;
+ goto unscale_bus;
ret = adsp_pds_enable(adsp, adsp->proxy_pds, adsp->proxy_pd_count);
if (ret < 0)
@@ -183,6 +211,8 @@ static int adsp_start(struct rproc *rproc)
adsp_pds_disable(adsp, adsp->proxy_pds, adsp->proxy_pd_count);
disable_active_pds:
adsp_pds_disable(adsp, adsp->active_pds, adsp->active_pd_count);
+unscale_bus:
+ do_bus_scaling(adsp, false);
disable_irqs:
qcom_q6v5_unprepare(&adsp->q6v5);
@@ -198,6 +228,7 @@ static void qcom_pas_handover(struct qcom_q6v5 *q6v5)
clk_disable_unprepare(adsp->aggre2_clk);
clk_disable_unprepare(adsp->xo);
adsp_pds_disable(adsp, adsp->proxy_pds, adsp->proxy_pd_count);
+ do_bus_scaling(adsp, false);
}
static int adsp_stop(struct rproc *rproc)
@@ -280,6 +311,14 @@ static int adsp_init_regulator(struct qcom_adsp *adsp)
return PTR_ERR_OR_ZERO(adsp->px_supply);
}
+static void adsp_init_bus_scaling(struct qcom_adsp *adsp)
+{
+ adsp->bus_client = of_icc_get(adsp->dev, NULL);
+ if (!adsp->bus_client)
+ dev_warn(adsp->dev, "%s: unable to get bus client \n",
+ __func__);
+}
+
static int adsp_pds_attach(struct device *dev, struct device **devs,
char **pd_names)
{
@@ -410,6 +449,8 @@ static int adsp_probe(struct platform_device *pdev)
if (ret)
goto free_rproc;
+ adsp_init_bus_scaling(adsp);
+
ret = adsp_pds_attach(&pdev->dev, adsp->active_pds,
desc->active_pd_names);
if (ret < 0)
--
The Qualcomm Innovation Center, Inc. is a member of the Code Aurora Forum,
a Linux Foundation Collaborative Project
next reply other threads:[~2020-03-28 0:59 UTC|newest]
Thread overview: 5+ messages / expand[flat|nested] mbox.gz Atom feed top
2020-03-28 0:59 Rishabh Bhatnagar [this message]
2020-03-30 16:06 ` [PATCH 1/2] remoteproc: qcom: Add bus scaling capability during bootup Mathieu Poirier
2020-03-30 16:13 ` Mathieu Poirier
2020-03-30 19:03 ` rishabhb
2020-04-01 20:17 ` Bjorn Andersson
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=1585357147-4616-1-git-send-email-rishabhb@codeaurora.org \
--to=rishabhb@codeaurora.org \
--cc=bjorn.andersson@linaro.org \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-remoteproc@vger.kernel.org \
--cc=psodagud@codeaurora.org \
--cc=sidgup@codeaurora.org \
--cc=tsoni@codeaurora.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).