Skip to content

Commit 277b967

Browse files
konradybciorobclark
authored andcommitted
drm/msm/a6xx: Add a helper for software-resetting the GPU
Introduce a6xx_gpu_sw_reset() in preparation for adding GMU wrapper GPUs and reuse it in a6xx_gmu_force_off(). This helper, contrary to the original usage in GMU code paths, adds a readback+delay sequence to ensure that the reset is never deasserted too quickly due to e.g. OoO execution going crazy. Signed-off-by: Konrad Dybcio <[email protected]> Patchwork: https://patchwork.freedesktop.org/patch/542758/ Signed-off-by: Rob Clark <[email protected]>
1 parent 3773a57 commit 277b967

File tree

3 files changed

+14
-2
lines changed

3 files changed

+14
-2
lines changed

drivers/gpu/drm/msm/adreno/a6xx_gmu.c

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -899,8 +899,7 @@ static void a6xx_gmu_force_off(struct a6xx_gmu *gmu)
899899
a6xx_bus_clear_pending_transactions(adreno_gpu, true);
900900

901901
/* Reset GPU core blocks */
902-
gpu_write(gpu, REG_A6XX_RBBM_SW_RESET_CMD, 1);
903-
udelay(100);
902+
a6xx_gpu_sw_reset(gpu, true);
904903
}
905904

906905
static void a6xx_gmu_set_initial_freq(struct msm_gpu *gpu, struct a6xx_gmu *gmu)

drivers/gpu/drm/msm/adreno/a6xx_gpu.c

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1742,6 +1742,18 @@ void a6xx_bus_clear_pending_transactions(struct adreno_gpu *adreno_gpu, bool gx_
17421742
gpu_write(gpu, REG_A6XX_GBIF_HALT, 0x0);
17431743
}
17441744

1745+
void a6xx_gpu_sw_reset(struct msm_gpu *gpu, bool assert)
1746+
{
1747+
gpu_write(gpu, REG_A6XX_RBBM_SW_RESET_CMD, assert);
1748+
/* Perform a bogus read and add a brief delay to ensure ordering. */
1749+
gpu_read(gpu, REG_A6XX_RBBM_SW_RESET_CMD);
1750+
udelay(1);
1751+
1752+
/* The reset line needs to be asserted for at least 100 us */
1753+
if (assert)
1754+
udelay(100);
1755+
}
1756+
17451757
static int a6xx_pm_resume(struct msm_gpu *gpu)
17461758
{
17471759
struct adreno_gpu *adreno_gpu = to_adreno_gpu(gpu);

drivers/gpu/drm/msm/adreno/a6xx_gpu.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -89,5 +89,6 @@ struct msm_gpu_state *a6xx_gpu_state_get(struct msm_gpu *gpu);
8989
int a6xx_gpu_state_put(struct msm_gpu_state *state);
9090

9191
void a6xx_bus_clear_pending_transactions(struct adreno_gpu *adreno_gpu, bool gx_off);
92+
void a6xx_gpu_sw_reset(struct msm_gpu *gpu, bool assert);
9293

9394
#endif /* __A6XX_GPU_H__ */

0 commit comments

Comments
 (0)