[PATCH 1/2] drm/imagination: Remove wrong soft reset code from GPU start sequence

From: Alexandru Dadu

Date: Tue Oct 06 2026 - 07:12:07 EST


From: Alessio Belle <alessio.belle@xxxxxxxxxx>

SOFT_RESET2 is not dependent on XE_TPU2, but on S7_TOP_INFRASTRUCTURE.

Since no released Rogue cores have that feature or register, remove any
writes to it.

Fixes: cc1aeedb98ad ("drm/imagination: Implement firmware infrastructure and META FW support")
Signed-off-by: Alessio Belle <alessio.belle@xxxxxxxxxx>
Signed-off-by: Alexandru Dadu <alexandru.dadu@xxxxxxxxxx>
---
drivers/gpu/drm/imagination/pvr_fw_startstop.c | 16 +++-------------
1 file changed, 3 insertions(+), 13 deletions(-)

diff --git a/drivers/gpu/drm/imagination/pvr_fw_startstop.c b/drivers/gpu/drm/imagination/pvr_fw_startstop.c
index 98ca2692239d..34c757267a22 100644
--- a/drivers/gpu/drm/imagination/pvr_fw_startstop.c
+++ b/drivers/gpu/drm/imagination/pvr_fw_startstop.c
@@ -110,10 +110,12 @@ rogue_slc_init(struct pvr_device *pvr_dev)
int
pvr_fw_start(struct pvr_device *pvr_dev)
{
- bool has_reset2 = PVR_HAS_FEATURE(pvr_dev, xe_tpu2);
u64 soft_reset_mask;
int err;

+ /* No Rogue cores should have this feature which requires additional reset steps. */
+ WARN_ON_ONCE(PVR_HAS_FEATURE(pvr_dev, s7_top_infrastructure));
+
if (PVR_HAS_FEATURE(pvr_dev, pbe2_in_xe))
soft_reset_mask = ROGUE_CR_SOFT_RESET__PBE2_XE__MASKFULL;
else
@@ -133,32 +135,20 @@ pvr_fw_start(struct pvr_device *pvr_dev)

/* Set Rogue in soft-reset. */
pvr_cr_write64(pvr_dev, ROGUE_CR_SOFT_RESET, soft_reset_mask);
- if (has_reset2)
- pvr_cr_write64(pvr_dev, ROGUE_CR_SOFT_RESET2, ROGUE_CR_SOFT_RESET2_MASKFULL);

/* Read soft-reset to fence previous write in order to clear the SOCIF pipeline. */
(void)pvr_cr_read64(pvr_dev, ROGUE_CR_SOFT_RESET);
- if (has_reset2)
- (void)pvr_cr_read64(pvr_dev, ROGUE_CR_SOFT_RESET2);

/* Take Rascal and Dust out of reset. */
pvr_cr_write64(pvr_dev, ROGUE_CR_SOFT_RESET,
soft_reset_mask ^ ROGUE_CR_SOFT_RESET_RASCALDUSTS_EN);
- if (has_reset2)
- pvr_cr_write64(pvr_dev, ROGUE_CR_SOFT_RESET2, 0);

(void)pvr_cr_read64(pvr_dev, ROGUE_CR_SOFT_RESET);
- if (has_reset2)
- (void)pvr_cr_read64(pvr_dev, ROGUE_CR_SOFT_RESET2);

/* Take everything out of reset but the FW processor. */
pvr_cr_write64(pvr_dev, ROGUE_CR_SOFT_RESET, ROGUE_CR_SOFT_RESET_GARTEN_EN);
- if (has_reset2)
- pvr_cr_write64(pvr_dev, ROGUE_CR_SOFT_RESET2, 0);

(void)pvr_cr_read64(pvr_dev, ROGUE_CR_SOFT_RESET);
- if (has_reset2)
- (void)pvr_cr_read64(pvr_dev, ROGUE_CR_SOFT_RESET2);

err = rogue_slc_init(pvr_dev);
if (err)

--
2.43.0