From: Konrad Dybcio <konrad.dybcio@oss.qualcomm.com>
To: Dikshita Agarwal <quic_dikshita@quicinc.com>,
Vikash Garodia <quic_vgarodia@quicinc.com>,
Abhinav Kumar <abhinav.kumar@linux.dev>,
Bryan O'Donoghue <bryan.odonoghue@linaro.org>,
Mauro Carvalho Chehab <mchehab@kernel.org>
Cc: linux-media@vger.kernel.org, linux-arm-msm@vger.kernel.org,
linux-kernel@vger.kernel.org,
Neil Armstrong <neil.armstrong@linaro.org>
Subject: Re: [PATCH] media: iris: vpu3x: Add MNoC low power handshake during hardware power-off
Date: Tue, 12 Aug 2025 10:58:40 +0200 [thread overview]
Message-ID: <7376d383-632d-42ce-bbdb-68c245d3879d@oss.qualcomm.com> (raw)
In-Reply-To: <20250812-sm8650-power-sequence-fix-v1-1-a51e7f99c56c@quicinc.com>
On 8/12/25 9:48 AM, Dikshita Agarwal wrote:
> Add the missing write to AON_WRAPPER_MVP_NOC_LPI_CONTROL before
> reading the LPI status register. Introduce a handshake loop to ensure
> MNoC enters low power mode reliably during VPU3 hardware power-off with
> timeout handling.
>
> Signed-off-by: Dikshita Agarwal <quic_dikshita@quicinc.com>
> ---
> drivers/media/platform/qcom/iris/iris_vpu3x.c | 23 +++++++++++++++++++++--
> 1 file changed, 21 insertions(+), 2 deletions(-)
>
> diff --git a/drivers/media/platform/qcom/iris/iris_vpu3x.c b/drivers/media/platform/qcom/iris/iris_vpu3x.c
> index 9b7c9a1495ee2f51c60b1142b2ed4680ff798f0a..c2e6af575cbe4b3e3f2a019b24eecf3a5d469566 100644
> --- a/drivers/media/platform/qcom/iris/iris_vpu3x.c
> +++ b/drivers/media/platform/qcom/iris/iris_vpu3x.c
> @@ -110,6 +110,7 @@ static void iris_vpu3_power_off_hardware(struct iris_core *core)
> static void iris_vpu33_power_off_hardware(struct iris_core *core)
> {
> u32 reg_val = 0, value, i;
> + u32 count = 0;
> int ret;
>
> if (iris_vpu3x_hw_power_collapsed(core))
> @@ -128,13 +129,31 @@ static void iris_vpu33_power_off_hardware(struct iris_core *core)
> goto disable_power;
> }
>
> + /* set MNoC to low power */
> + writel(REQ_POWER_DOWN_PREP, core->reg_base + AON_WRAPPER_MVP_NOC_LPI_CONTROL);
> +
> + value = readl(core->reg_base + AON_WRAPPER_MVP_NOC_LPI_STATUS);
> +
> + while (!(value & BIT(0)) && (value & BIT(2) || value & BIT(1))) {
It would be useful to introduce some defines for these bits, so that
we can reason about why bit 0 must always be set or neither bit 1 nor
bit 2 can be, in order to consider this done
> + writel(0, core->reg_base + AON_WRAPPER_MVP_NOC_LPI_CONTROL);
This write may be left unobserved by the hardware for quite some time,
but IIUC it's vital for the next write to make sense (i.e. you won't
meet the delay below as they may be buffered and reach the endpoint
essentially together)
> +
> + usleep_range(10, 20);
https://www.kernel.org/doc/Documentation/timers/timers-howto.txt
suggests this should be an udelay, so that we can accurately reach
this (small) period
> +
> + writel(REQ_POWER_DOWN_PREP, core->reg_base + AON_WRAPPER_MVP_NOC_LPI_CONTROL);
If these writes aren't actually necessary to be repeated a 1000 times,
you may want to use readl_poll_timeout
Konrad
> +
> + value = readl(core->reg_base + AON_WRAPPER_MVP_NOC_LPI_STATUS);
> + if (++count >= 1000) {
> + dev_err(core->dev, "LPI handshake timeout\n");
> + break;
> + }
> + }
> +
> ret = readl_poll_timeout(core->reg_base + AON_WRAPPER_MVP_NOC_LPI_STATUS,
> reg_val, reg_val & BIT(0), 200, 2000);
> if (ret)
> goto disable_power;
>
> - /* set MNoC to low power, set PD_NOC_QREQ (bit 0) */
> - writel(BIT(0), core->reg_base + AON_WRAPPER_MVP_NOC_LPI_CONTROL);
> + writel(0, core->reg_base + AON_WRAPPER_MVP_NOC_LPI_CONTROL);
>
> writel(CORE_BRIDGE_SW_RESET | CORE_BRIDGE_HW_RESET_DISABLE,
> core->reg_base + CPU_CS_AHB_BRIDGE_SYNC_RESET);
>
> ---
> base-commit: d968e50b5c26642754492dea23cbd3592bde62d8
> change-id: 20250812-sm8650-power-sequence-fix-ba9a92098233
>
> Best regards,
next prev parent reply other threads:[~2025-08-12 8:58 UTC|newest]
Thread overview: 6+ messages / expand[flat|nested] mbox.gz Atom feed top
2025-08-12 7:48 Dikshita Agarwal
2025-08-12 8:06 ` Neil Armstrong
2025-08-12 9:24 ` Jorge Ramirez
2025-08-12 8:58 ` Konrad Dybcio [this message]
2025-08-12 9:00 ` Bryan O'Donoghue
2025-08-12 9:31 ` Dikshita Agarwal
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=7376d383-632d-42ce-bbdb-68c245d3879d@oss.qualcomm.com \
--to=konrad.dybcio@oss.qualcomm.com \
--cc=abhinav.kumar@linux.dev \
--cc=bryan.odonoghue@linaro.org \
--cc=linux-arm-msm@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-media@vger.kernel.org \
--cc=mchehab@kernel.org \
--cc=neil.armstrong@linaro.org \
--cc=quic_dikshita@quicinc.com \
--cc=quic_vgarodia@quicinc.com \
/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
all inboxes | Powered by JetHome®