From: Bjorn Andersson <bjorn.andersson@linaro.org>
To: Sibi Sankar <sibis@codeaurora.org>
Cc: mka@chromium.org, swboyd@chromium.org, robh+dt@kernel.org,
ulf.hansson@linaro.org, rjw@rjwysocki.net, agross@kernel.org,
ohad@wizery.com, mathieu.poirier@linaro.org,
linux-arm-msm@vger.kernel.org, linux-remoteproc@vger.kernel.org,
devicetree@vger.kernel.org, linux-kernel@vger.kernel.org,
dianders@chromium.org, rishabhb@codeaurora.org,
sidgup@codeaurora.org
Subject: Re: [PATCH v4 04/13] remoteproc: qcom: q6v5: Use qmp_send to update co-processor load state
Date: Fri, 30 Jul 2021 11:36:46 -0500 [thread overview]
Message-ID: <YQQqnoOJLP9ixWn1@builder.lan> (raw)
In-Reply-To: <1626755807-11865-5-git-send-email-sibis@codeaurora.org>
On Mon 19 Jul 23:36 CDT 2021, Sibi Sankar wrote:
> The power domains exposed by the AOSS QMP driver control the load state
> resources linked to modem, adsp, cdsp remoteprocs. These are used to
> notify the Always on Subsystem (AOSS) that a particular co-processor is
> up/down. AOSS uses this information to wait for the co-processors to
> suspend before starting its sleep sequence.
>
> These co-processors enter low-power modes independent to that of the
> application processor and the load state resources linked to them are
> expected to remain unaltered across system suspend/resume cycles. To
> achieve this behavior lets stop using the power-domains exposed by the
> AOSS QMP node and replace them with generic qmp_send interface instead.
>
> Signed-off-by: Sibi Sankar <sibis@codeaurora.org>
> ---
>
> v4:
> * Drop unused pdev and kfree the load state string in q6v5_deinit
> /probe path for patch 4. [Matthias]
>
> drivers/remoteproc/qcom_q6v5.c | 57 ++++++++++++++++++++++++-
> drivers/remoteproc/qcom_q6v5.h | 7 ++-
> drivers/remoteproc/qcom_q6v5_adsp.c | 7 ++-
> drivers/remoteproc/qcom_q6v5_mss.c | 44 ++++---------------
> drivers/remoteproc/qcom_q6v5_pas.c | 85 +++++++++----------------------------
> drivers/remoteproc/qcom_q6v5_wcss.c | 4 +-
> 6 files changed, 96 insertions(+), 108 deletions(-)
>
> diff --git a/drivers/remoteproc/qcom_q6v5.c b/drivers/remoteproc/qcom_q6v5.c
> index 7e9244c748da..997ff21271f7 100644
> --- a/drivers/remoteproc/qcom_q6v5.c
> +++ b/drivers/remoteproc/qcom_q6v5.c
> @@ -16,8 +16,28 @@
> #include "qcom_common.h"
> #include "qcom_q6v5.h"
>
> +#define Q6V5_LOAD_STATE_MSG_LEN 64
> #define Q6V5_PANIC_DELAY_MS 200
>
> +static int q6v5_load_state_toggle(struct qcom_q6v5 *q6v5, bool enable)
> +{
> + char buf[Q6V5_LOAD_STATE_MSG_LEN] = {};
> + int ret;
> +
> + if (IS_ERR(q6v5->qmp))
I would prefer that you keep it NULL when there's no qmp.
> + return 0;
> +
> + snprintf(buf, sizeof(buf),
> + "{class: image, res: load_state, name: %s, val: %s}",
> + q6v5->load_state, enable ? "on" : "off");
> +
> + ret = qmp_send(q6v5->qmp, buf, sizeof(buf));
> + if (ret)
> + dev_err(q6v5->dev, "failed to toggle load state\n");
> +
> + return ret;
> +}
> +
> /**
> * qcom_q6v5_prepare() - reinitialize the qcom_q6v5 context before start
> * @q6v5: reference to qcom_q6v5 context to be reinitialized
> @@ -26,6 +46,12 @@
> */
> int qcom_q6v5_prepare(struct qcom_q6v5 *q6v5)
> {
> + int ret;
> +
> + ret = q6v5_load_state_toggle(q6v5, true);
> + if (ret)
> + return ret;
> +
> reinit_completion(&q6v5->start_done);
> reinit_completion(&q6v5->stop_done);
>
> @@ -47,6 +73,7 @@ EXPORT_SYMBOL_GPL(qcom_q6v5_prepare);
> int qcom_q6v5_unprepare(struct qcom_q6v5 *q6v5)
> {
> disable_irq(q6v5->handover_irq);
> + q6v5_load_state_toggle(q6v5, false);
>
> return !q6v5->handover_issued;
> }
> @@ -196,12 +223,13 @@ EXPORT_SYMBOL_GPL(qcom_q6v5_panic);
> * @pdev: platform_device reference for acquiring resources
> * @rproc: associated remoteproc instance
> * @crash_reason: SMEM id for crash reason string, or 0 if none
> + * @load_state: load state resource string
> * @handover: function to be called when proxy resources should be released
> *
> * Return: 0 on success, negative errno on failure
> */
> int qcom_q6v5_init(struct qcom_q6v5 *q6v5, struct platform_device *pdev,
> - struct rproc *rproc, int crash_reason,
> + struct rproc *rproc, int crash_reason, const char *load_state,
> void (*handover)(struct qcom_q6v5 *q6v5))
> {
> int ret;
> @@ -286,9 +314,36 @@ int qcom_q6v5_init(struct qcom_q6v5 *q6v5, struct platform_device *pdev,
> return PTR_ERR(q6v5->state);
> }
>
> + q6v5->load_state = kstrdup_const(load_state, GFP_KERNEL);
Can't you use devm_kstrdup_const(&pdev->dev, ...) for this?
> + q6v5->qmp = qmp_get(&pdev->dev);
> + if (IS_ERR(q6v5->qmp)) {
> + if (PTR_ERR(q6v5->qmp) != -ENODEV) {
> + if (PTR_ERR(q6v5->qmp) != -EPROBE_DEFER)
> + dev_err(&pdev->dev, "failed to acquire load state\n");
> + kfree_const(q6v5->load_state);
Then you don't need to free it here.
> + return PTR_ERR(q6v5->qmp);
> + }
> + } else {
> + if (!q6v5->load_state) {
> + dev_err(&pdev->dev, "load state resource string empty\n");
> + return -EINVAL;
I see two cases here:
1) kstrdup_const() failed to allocate memory, the error print is
unnecessary and misleading and it would be more appropriate to return
-ENOMEM.
2) kstrdup_const() failed because you passed load_state == NULL, in
which case the error message could be more helpful by saying "unexpected
qcom,qmp property found" or something like that.
> + }
> + }
> +
> return 0;
> }
> EXPORT_SYMBOL_GPL(qcom_q6v5_init);
>
> +/**
> + * qcom_q6v5_deinit() - deinitialize the q6v5 common struct
> + * @q6v5: reference to qcom_q6v5 context to be deinitialized
> + */
> +void qcom_q6v5_deinit(struct qcom_q6v5 *q6v5)
> +{
> + kfree_const(q6v5->load_state);
> + qmp_put(q6v5->qmp);
> +}
> +EXPORT_SYMBOL_GPL(qcom_q6v5_deinit);
> +
> MODULE_LICENSE("GPL v2");
> MODULE_DESCRIPTION("Qualcomm Peripheral Image Loader for Q6V5");
> diff --git a/drivers/remoteproc/qcom_q6v5.h b/drivers/remoteproc/qcom_q6v5.h
> index 1c212f670cbc..f35e04471ed7 100644
> --- a/drivers/remoteproc/qcom_q6v5.h
> +++ b/drivers/remoteproc/qcom_q6v5.h
> @@ -5,6 +5,7 @@
>
> #include <linux/kernel.h>
> #include <linux/completion.h>
> +#include <linux/soc/qcom/qcom_aoss.h>
>
> struct rproc;
> struct qcom_smem_state;
> @@ -15,6 +16,8 @@ struct qcom_q6v5 {
> struct rproc *rproc;
>
> struct qcom_smem_state *state;
> + struct qmp *qmp;
> +
> unsigned stop_bit;
>
> int wdog_irq;
> @@ -32,12 +35,14 @@ struct qcom_q6v5 {
>
> bool running;
>
> + const char *load_state;
> void (*handover)(struct qcom_q6v5 *q6v5);
> };
>
> int qcom_q6v5_init(struct qcom_q6v5 *q6v5, struct platform_device *pdev,
> - struct rproc *rproc, int crash_reason,
> + struct rproc *rproc, int crash_reason, const char *load_state,
> void (*handover)(struct qcom_q6v5 *q6v5));
> +void qcom_q6v5_deinit(struct qcom_q6v5 *q6v5);
>
> int qcom_q6v5_prepare(struct qcom_q6v5 *q6v5);
> int qcom_q6v5_unprepare(struct qcom_q6v5 *q6v5);
> diff --git a/drivers/remoteproc/qcom_q6v5_adsp.c b/drivers/remoteproc/qcom_q6v5_adsp.c
> index 8b0d8bbacd2e..098362e6e233 100644
> --- a/drivers/remoteproc/qcom_q6v5_adsp.c
> +++ b/drivers/remoteproc/qcom_q6v5_adsp.c
> @@ -185,7 +185,9 @@ static int adsp_start(struct rproc *rproc)
> int ret;
> unsigned int val;
>
> - qcom_q6v5_prepare(&adsp->q6v5);
> + ret = qcom_q6v5_prepare(&adsp->q6v5);
> + if (ret)
> + return ret;
In the (hopefully unlikely) case that we have instances of
qcom_q6v5_prepare() failing today, the switch to the new qmp interface
would also introduce a regression in the same commit.
Could you please add the error handling in a separate commit? Just so
that we can pinpoint which of the two changes caused any issues if we
need to bisect this?
Regards,
Bjorn
next prev parent reply other threads:[~2021-07-30 16:36 UTC|newest]
Thread overview: 25+ messages / expand[flat|nested] mbox.gz Atom feed top
2021-07-20 4:36 [PATCH v4 00/13] Use qmp_send to update co-processor load state Sibi Sankar
2021-07-20 4:36 ` [PATCH v4 01/13] dt-bindings: soc: qcom: aoss: Drop the load state power-domain Sibi Sankar
2021-07-20 21:10 ` Matthias Kaehlcke
2021-07-21 5:31 ` Stephen Boyd
2021-07-26 22:37 ` Rob Herring
2021-07-20 4:36 ` [PATCH v4 02/13] dt-bindings: remoteproc: qcom: pas: Add QMP property Sibi Sankar
2021-07-20 23:10 ` Matthias Kaehlcke
2021-07-21 16:58 ` Sibi Sankar
2021-07-20 4:36 ` [PATCH v4 03/13] dt-bindings: remoteproc: qcom: " Sibi Sankar
2021-07-20 4:36 ` [PATCH v4 04/13] remoteproc: qcom: q6v5: Use qmp_send to update co-processor load state Sibi Sankar
2021-07-21 5:26 ` Stephen Boyd
2021-07-21 17:27 ` Sibi Sankar
2021-07-30 16:36 ` Bjorn Andersson [this message]
2021-07-20 4:36 ` [PATCH v4 05/13] arm64: dts: qcom: sc7180: Use QMP property to control " Sibi Sankar
2021-07-20 4:36 ` [PATCH v4 06/13] arm64: dts: qcom: sc7280: " Sibi Sankar
2021-07-20 4:36 ` [PATCH v4 07/13] arm64: dts: qcom: sdm845: " Sibi Sankar
2021-07-20 4:36 ` [PATCH v4 08/13] arm64: dts: qcom: sm8150: " Sibi Sankar
2021-07-20 4:36 ` [PATCH v4 09/13] arm64: dts: qcom: sm8250: " Sibi Sankar
2021-07-20 4:36 ` [PATCH v4 10/13] arm64: dts: qcom: sm8350: " Sibi Sankar
2021-07-20 4:36 ` [PATCH v4 11/13] soc: qcom: aoss: Drop power domain support Sibi Sankar
2021-07-20 22:53 ` Matthias Kaehlcke
2021-07-21 5:35 ` Stephen Boyd
2021-07-20 4:36 ` [PATCH v4 12/13] dt-bindings: msm/dp: Remove aoss-qmp header Sibi Sankar
2021-07-21 5:16 ` Stephen Boyd
2021-07-20 4:36 ` [PATCH v4 13/13] dt-bindings: soc: qcom: aoss: Delete unused power-domain definitions Sibi Sankar
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=YQQqnoOJLP9ixWn1@builder.lan \
--to=bjorn.andersson@linaro.org \
--cc=agross@kernel.org \
--cc=devicetree@vger.kernel.org \
--cc=dianders@chromium.org \
--cc=linux-arm-msm@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-remoteproc@vger.kernel.org \
--cc=mathieu.poirier@linaro.org \
--cc=mka@chromium.org \
--cc=ohad@wizery.com \
--cc=rishabhb@codeaurora.org \
--cc=rjw@rjwysocki.net \
--cc=robh+dt@kernel.org \
--cc=sibis@codeaurora.org \
--cc=sidgup@codeaurora.org \
--cc=swboyd@chromium.org \
--cc=ulf.hansson@linaro.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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.