public inbox for linux-arm-kernel@lists.infradead.org
 help / color / mirror / Atom feed
* [PATCH v3] pmdomain: imx: gpcv2: Fix the imx8mm gpu hang due to wrong adb400 reset
@ 2026-01-23  2:51 Jacky Bai
  2026-01-24 20:37 ` Philipp Zabel
                   ` (2 more replies)
  0 siblings, 3 replies; 5+ messages in thread
From: Jacky Bai @ 2026-01-23  2:51 UTC (permalink / raw)
  To: Ulf Hansson, Shawn Guo, Sascha Hauer, Lucas Stach,
	Pengutronix Kernel Team, Fabio Estevam, Rob Herring,
	Krzysztof Kozlowski, Conor Dooley
  Cc: linux-pm, imx, linux-arm-kernel, linux-kernel, devicetree,
	Jacky Bai

On i.MX8MM, the GPUMIX, GPU2D, and GPU3D blocks share a common reset
domain. Due to this hardware limitation, powering off/on GPU2D or GPU3D
also triggers a reset of the GPUMIX domain, including its ADB400 port.
However, the ADB400 interface must always be placed into power‑down mode
before being reset.

Currently the GPUMIX and GPU2D/3D power domains rely on runtime PM to
handle dependency ordering. In some corner cases, the GPUMIX power off
sequence is skipped, leaving the ADB400 port active when GPU2D/3D reset.
This causes the GPUMIX ADB400 port to be reset while still active,
leading to unpredictable bus behavior and GPU hangs.

To avoid this, refine the power‑domain control logic so that the GPUMIX
ADB400 port is explicitly powered down and powered up as part of the GPU
power domain on/off sequence. This ensures proper ordering and prevents
incorrect ADB400 reset.

Suggested-by: Lucas Stach <l.stach@pengutronix.de>
Signed-off-by: Jacky Bai <ping.bai@nxp.com>
---
Changes in v3:
- Fix the Suggested-by tag typo
- Link to v2: https://lore.kernel.org/r/20260120-imx8mm_gpu_power_domain-v2-1-be10fd018108@nxp.com

Changes in v2:
- add prefix to patch subject as suggested by Krzysztof
- refine the patch to move the GPUMIX ADB400 into GPU power domain
- Link to v1: https://lore.kernel.org/r/20260119-imx8mm_gpu_power_domain-v1-0-34d81c766916@nxp.com
---
 drivers/pmdomain/imx/gpcv2.c | 8 ++------
 1 file changed, 2 insertions(+), 6 deletions(-)

diff --git a/drivers/pmdomain/imx/gpcv2.c b/drivers/pmdomain/imx/gpcv2.c
index b7cea89140ee8923f32486eab953c0e1a36bf06d..a829f8da5be70d0392276bd135fb7fc1bbf10496 100644
--- a/drivers/pmdomain/imx/gpcv2.c
+++ b/drivers/pmdomain/imx/gpcv2.c
@@ -165,13 +165,11 @@
 #define IMX8M_VPU_HSK_PWRDNREQN			BIT(5)
 #define IMX8M_DISP_HSK_PWRDNREQN		BIT(4)
 
-#define IMX8MM_GPUMIX_HSK_PWRDNACKN		BIT(29)
-#define IMX8MM_GPU_HSK_PWRDNACKN		(BIT(27) | BIT(28))
+#define IMX8MM_GPU_HSK_PWRDNACKN		GENMASK(29, 27)
 #define IMX8MM_VPUMIX_HSK_PWRDNACKN		BIT(26)
 #define IMX8MM_DISPMIX_HSK_PWRDNACKN		BIT(25)
 #define IMX8MM_HSIO_HSK_PWRDNACKN		(BIT(23) | BIT(24))
-#define IMX8MM_GPUMIX_HSK_PWRDNREQN		BIT(11)
-#define IMX8MM_GPU_HSK_PWRDNREQN		(BIT(9) | BIT(10))
+#define IMX8MM_GPU_HSK_PWRDNREQN		GENMASK(11, 9)
 #define IMX8MM_VPUMIX_HSK_PWRDNREQN		BIT(8)
 #define IMX8MM_DISPMIX_HSK_PWRDNREQN		BIT(7)
 #define IMX8MM_HSIO_HSK_PWRDNREQN		(BIT(5) | BIT(6))
@@ -794,8 +792,6 @@ static const struct imx_pgc_domain imx8mm_pgc_domains[] = {
 		.bits  = {
 			.pxx = IMX8MM_GPUMIX_SW_Pxx_REQ,
 			.map = IMX8MM_GPUMIX_A53_DOMAIN,
-			.hskreq = IMX8MM_GPUMIX_HSK_PWRDNREQN,
-			.hskack = IMX8MM_GPUMIX_HSK_PWRDNACKN,
 		},
 		.pgc   = BIT(IMX8MM_PGC_GPUMIX),
 		.keep_clocks = true,

---
base-commit: 0f853ca2a798ead9d24d39cad99b0966815c582a
change-id: 20260113-imx8mm_gpu_power_domain-56c22ce012a1

Best regards,
-- 
Jacky Bai <ping.bai@nxp.com>



^ permalink raw reply related	[flat|nested] 5+ messages in thread

* Re: [PATCH v3] pmdomain: imx: gpcv2: Fix the imx8mm gpu hang due to wrong adb400 reset
  2026-01-23  2:51 [PATCH v3] pmdomain: imx: gpcv2: Fix the imx8mm gpu hang due to wrong adb400 reset Jacky Bai
@ 2026-01-24 20:37 ` Philipp Zabel
  2026-01-24 21:20 ` Fabio Estevam
  2026-01-27 14:27 ` Ulf Hansson
  2 siblings, 0 replies; 5+ messages in thread
From: Philipp Zabel @ 2026-01-24 20:37 UTC (permalink / raw)
  To: Jacky Bai
  Cc: Ulf Hansson, Shawn Guo, Sascha Hauer, Lucas Stach,
	Pengutronix Kernel Team, Fabio Estevam, Rob Herring,
	Krzysztof Kozlowski, Conor Dooley, imx, devicetree, linux-pm,
	linux-kernel, linux-arm-kernel

On Fri, Jan 23, 2026 at 10:51:26AM +0800, Jacky Bai wrote:
> On i.MX8MM, the GPUMIX, GPU2D, and GPU3D blocks share a common reset
> domain. Due to this hardware limitation, powering off/on GPU2D or GPU3D
> also triggers a reset of the GPUMIX domain, including its ADB400 port.
> However, the ADB400 interface must always be placed into power‑down mode
> before being reset.
> 
> Currently the GPUMIX and GPU2D/3D power domains rely on runtime PM to
> handle dependency ordering. In some corner cases, the GPUMIX power off
> sequence is skipped, leaving the ADB400 port active when GPU2D/3D reset.
> This causes the GPUMIX ADB400 port to be reset while still active,
> leading to unpredictable bus behavior and GPU hangs.
> 
> To avoid this, refine the power‑domain control logic so that the GPUMIX
> ADB400 port is explicitly powered down and powered up as part of the GPU
> power domain on/off sequence. This ensures proper ordering and prevents
> incorrect ADB400 reset.
> 
> Suggested-by: Lucas Stach <l.stach@pengutronix.de>
> Signed-off-by: Jacky Bai <ping.bai@nxp.com>

Tested-by: Philipp Zabel <p.zabel@pengutronix.de>

This fixes a sporadic system freeze after a few hours of alternating
between GPU activity and GPU runtime suspend that I could reproduce on
i.MX8MM since commit 055467378bf1 ("driver core: Enable fw_devlink=rpm
by default").

regards
Philipp


^ permalink raw reply	[flat|nested] 5+ messages in thread

* Re: [PATCH v3] pmdomain: imx: gpcv2: Fix the imx8mm gpu hang due to wrong adb400 reset
  2026-01-23  2:51 [PATCH v3] pmdomain: imx: gpcv2: Fix the imx8mm gpu hang due to wrong adb400 reset Jacky Bai
  2026-01-24 20:37 ` Philipp Zabel
@ 2026-01-24 21:20 ` Fabio Estevam
  2026-01-26  9:21   ` Lucas Stach
  2026-01-27 14:27 ` Ulf Hansson
  2 siblings, 1 reply; 5+ messages in thread
From: Fabio Estevam @ 2026-01-24 21:20 UTC (permalink / raw)
  To: Jacky Bai
  Cc: Ulf Hansson, Shawn Guo, Sascha Hauer, Lucas Stach,
	Pengutronix Kernel Team, Rob Herring, Krzysztof Kozlowski,
	Conor Dooley, linux-pm, imx, linux-arm-kernel, linux-kernel,
	devicetree

On Thu, Jan 22, 2026 at 11:51 PM Jacky Bai <ping.bai@nxp.com> wrote:
>
> On i.MX8MM, the GPUMIX, GPU2D, and GPU3D blocks share a common reset
> domain. Due to this hardware limitation, powering off/on GPU2D or GPU3D
> also triggers a reset of the GPUMIX domain, including its ADB400 port.
> However, the ADB400 interface must always be placed into power‑down mode
> before being reset.
>
> Currently the GPUMIX and GPU2D/3D power domains rely on runtime PM to
> handle dependency ordering. In some corner cases, the GPUMIX power off
> sequence is skipped, leaving the ADB400 port active when GPU2D/3D reset.
> This causes the GPUMIX ADB400 port to be reset while still active,
> leading to unpredictable bus behavior and GPU hangs.
>
> To avoid this, refine the power‑domain control logic so that the GPUMIX
> ADB400 port is explicitly powered down and powered up as part of the GPU
> power domain on/off sequence. This ensures proper ordering and prevents
> incorrect ADB400 reset.
>
> Suggested-by: Lucas Stach <l.stach@pengutronix.de>
> Signed-off-by: Jacky Bai <ping.bai@nxp.com>

Shouldn't this have a Fixes tag?


^ permalink raw reply	[flat|nested] 5+ messages in thread

* Re: [PATCH v3] pmdomain: imx: gpcv2: Fix the imx8mm gpu hang due to wrong adb400 reset
  2026-01-24 21:20 ` Fabio Estevam
@ 2026-01-26  9:21   ` Lucas Stach
  0 siblings, 0 replies; 5+ messages in thread
From: Lucas Stach @ 2026-01-26  9:21 UTC (permalink / raw)
  To: Fabio Estevam, Jacky Bai
  Cc: Ulf Hansson, Shawn Guo, Sascha Hauer, Pengutronix Kernel Team,
	Rob Herring, Krzysztof Kozlowski, Conor Dooley, linux-pm, imx,
	linux-arm-kernel, linux-kernel, devicetree

Am Samstag, dem 24.01.2026 um 18:20 -0300 schrieb Fabio Estevam:
> On Thu, Jan 22, 2026 at 11:51 PM Jacky Bai <ping.bai@nxp.com> wrote:
> > 
> > On i.MX8MM, the GPUMIX, GPU2D, and GPU3D blocks share a common reset
> > domain. Due to this hardware limitation, powering off/on GPU2D or GPU3D
> > also triggers a reset of the GPUMIX domain, including its ADB400 port.
> > However, the ADB400 interface must always be placed into power‑down mode
> > before being reset.
> > 
> > Currently the GPUMIX and GPU2D/3D power domains rely on runtime PM to
> > handle dependency ordering. In some corner cases, the GPUMIX power off
> > sequence is skipped, leaving the ADB400 port active when GPU2D/3D reset.
> > This causes the GPUMIX ADB400 port to be reset while still active,
> > leading to unpredictable bus behavior and GPU hangs.
> > 
> > To avoid this, refine the power‑domain control logic so that the GPUMIX
> > ADB400 port is explicitly powered down and powered up as part of the GPU
> > power domain on/off sequence. This ensures proper ordering and prevents
> > incorrect ADB400 reset.
> > 
> > Suggested-by: Lucas Stach <l.stach@pengutronix.de>
> > Signed-off-by: Jacky Bai <ping.bai@nxp.com>
> 
> Shouldn't this have a Fixes tag?

Yes, it needs to go into at least the active 6.12 LTS series, as the
patch changing the domain suspend ordering is in 6.10. Other than the
missing tags:

Reviewed-by: Lucas Stach <l.stach@pengutronix.de>

Regards,
Lucas


^ permalink raw reply	[flat|nested] 5+ messages in thread

* Re: [PATCH v3] pmdomain: imx: gpcv2: Fix the imx8mm gpu hang due to wrong adb400 reset
  2026-01-23  2:51 [PATCH v3] pmdomain: imx: gpcv2: Fix the imx8mm gpu hang due to wrong adb400 reset Jacky Bai
  2026-01-24 20:37 ` Philipp Zabel
  2026-01-24 21:20 ` Fabio Estevam
@ 2026-01-27 14:27 ` Ulf Hansson
  2 siblings, 0 replies; 5+ messages in thread
From: Ulf Hansson @ 2026-01-27 14:27 UTC (permalink / raw)
  To: Jacky Bai
  Cc: Shawn Guo, Sascha Hauer, Lucas Stach, Pengutronix Kernel Team,
	Fabio Estevam, Rob Herring, Krzysztof Kozlowski, Conor Dooley,
	linux-pm, imx, linux-arm-kernel, linux-kernel, devicetree

On Fri, 23 Jan 2026 at 03:51, Jacky Bai <ping.bai@nxp.com> wrote:
>
> On i.MX8MM, the GPUMIX, GPU2D, and GPU3D blocks share a common reset
> domain. Due to this hardware limitation, powering off/on GPU2D or GPU3D
> also triggers a reset of the GPUMIX domain, including its ADB400 port.
> However, the ADB400 interface must always be placed into power‑down mode
> before being reset.
>
> Currently the GPUMIX and GPU2D/3D power domains rely on runtime PM to
> handle dependency ordering. In some corner cases, the GPUMIX power off
> sequence is skipped, leaving the ADB400 port active when GPU2D/3D reset.
> This causes the GPUMIX ADB400 port to be reset while still active,
> leading to unpredictable bus behavior and GPU hangs.
>
> To avoid this, refine the power‑domain control logic so that the GPUMIX
> ADB400 port is explicitly powered down and powered up as part of the GPU
> power domain on/off sequence. This ensures proper ordering and prevents
> incorrect ADB400 reset.
>
> Suggested-by: Lucas Stach <l.stach@pengutronix.de>
> Signed-off-by: Jacky Bai <ping.bai@nxp.com>

Applied for fixes and by adding a stable tag, thanks!

Kind regards
Uffe


> ---
> Changes in v3:
> - Fix the Suggested-by tag typo
> - Link to v2: https://lore.kernel.org/r/20260120-imx8mm_gpu_power_domain-v2-1-be10fd018108@nxp.com
>
> Changes in v2:
> - add prefix to patch subject as suggested by Krzysztof
> - refine the patch to move the GPUMIX ADB400 into GPU power domain
> - Link to v1: https://lore.kernel.org/r/20260119-imx8mm_gpu_power_domain-v1-0-34d81c766916@nxp.com
> ---
>  drivers/pmdomain/imx/gpcv2.c | 8 ++------
>  1 file changed, 2 insertions(+), 6 deletions(-)
>
> diff --git a/drivers/pmdomain/imx/gpcv2.c b/drivers/pmdomain/imx/gpcv2.c
> index b7cea89140ee8923f32486eab953c0e1a36bf06d..a829f8da5be70d0392276bd135fb7fc1bbf10496 100644
> --- a/drivers/pmdomain/imx/gpcv2.c
> +++ b/drivers/pmdomain/imx/gpcv2.c
> @@ -165,13 +165,11 @@
>  #define IMX8M_VPU_HSK_PWRDNREQN                        BIT(5)
>  #define IMX8M_DISP_HSK_PWRDNREQN               BIT(4)
>
> -#define IMX8MM_GPUMIX_HSK_PWRDNACKN            BIT(29)
> -#define IMX8MM_GPU_HSK_PWRDNACKN               (BIT(27) | BIT(28))
> +#define IMX8MM_GPU_HSK_PWRDNACKN               GENMASK(29, 27)
>  #define IMX8MM_VPUMIX_HSK_PWRDNACKN            BIT(26)
>  #define IMX8MM_DISPMIX_HSK_PWRDNACKN           BIT(25)
>  #define IMX8MM_HSIO_HSK_PWRDNACKN              (BIT(23) | BIT(24))
> -#define IMX8MM_GPUMIX_HSK_PWRDNREQN            BIT(11)
> -#define IMX8MM_GPU_HSK_PWRDNREQN               (BIT(9) | BIT(10))
> +#define IMX8MM_GPU_HSK_PWRDNREQN               GENMASK(11, 9)
>  #define IMX8MM_VPUMIX_HSK_PWRDNREQN            BIT(8)
>  #define IMX8MM_DISPMIX_HSK_PWRDNREQN           BIT(7)
>  #define IMX8MM_HSIO_HSK_PWRDNREQN              (BIT(5) | BIT(6))
> @@ -794,8 +792,6 @@ static const struct imx_pgc_domain imx8mm_pgc_domains[] = {
>                 .bits  = {
>                         .pxx = IMX8MM_GPUMIX_SW_Pxx_REQ,
>                         .map = IMX8MM_GPUMIX_A53_DOMAIN,
> -                       .hskreq = IMX8MM_GPUMIX_HSK_PWRDNREQN,
> -                       .hskack = IMX8MM_GPUMIX_HSK_PWRDNACKN,
>                 },
>                 .pgc   = BIT(IMX8MM_PGC_GPUMIX),
>                 .keep_clocks = true,
>
> ---
> base-commit: 0f853ca2a798ead9d24d39cad99b0966815c582a
> change-id: 20260113-imx8mm_gpu_power_domain-56c22ce012a1
>
> Best regards,
> --
> Jacky Bai <ping.bai@nxp.com>
>


^ permalink raw reply	[flat|nested] 5+ messages in thread

end of thread, other threads:[~2026-01-27 14:28 UTC | newest]

Thread overview: 5+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2026-01-23  2:51 [PATCH v3] pmdomain: imx: gpcv2: Fix the imx8mm gpu hang due to wrong adb400 reset Jacky Bai
2026-01-24 20:37 ` Philipp Zabel
2026-01-24 21:20 ` Fabio Estevam
2026-01-26  9:21   ` Lucas Stach
2026-01-27 14:27 ` Ulf Hansson

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox