]> www.infradead.org Git - nvme.git/commitdiff
drm/amd/display: prevent register access while in IPS
authorHamza Mahfooz <hamza.mahfooz@amd.com>
Mon, 3 Jun 2024 14:16:45 +0000 (10:16 -0400)
committerAlex Deucher <alexander.deucher@amd.com>
Wed, 19 Jun 2024 18:17:25 +0000 (14:17 -0400)
We can't read/write to DCN registers while in IPS. Since, that can cause
the system to hang. So, before proceeding with the access in that
scenario, force the system out of IPS.

Cc: stable@vger.kernel.org # 6.6+
Reviewed-by: Roman Li <roman.li@amd.com>
Signed-off-by: Hamza Mahfooz <hamza.mahfooz@amd.com>
Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c

index e426adf95d7de60cdce35458f7fa92f598c1b689..e9ac20bed0f2b79324abf4e346507eae48f0e893 100644 (file)
@@ -11437,6 +11437,12 @@ void amdgpu_dm_trigger_timing_sync(struct drm_device *dev)
        mutex_unlock(&adev->dm.dc_lock);
 }
 
+static inline void amdgpu_dm_exit_ips_for_hw_access(struct dc *dc)
+{
+       if (dc->ctx->dmub_srv && !dc->ctx->dmub_srv->idle_exit_counter)
+               dc_exit_ips_for_hw_access(dc);
+}
+
 void dm_write_reg_func(const struct dc_context *ctx, uint32_t address,
                       u32 value, const char *func_name)
 {
@@ -11447,6 +11453,8 @@ void dm_write_reg_func(const struct dc_context *ctx, uint32_t address,
                return;
        }
 #endif
+
+       amdgpu_dm_exit_ips_for_hw_access(ctx->dc);
        cgs_write_register(ctx->cgs_device, address, value);
        trace_amdgpu_dc_wreg(&ctx->perf_trace->write_count, address, value);
 }
@@ -11470,6 +11478,8 @@ uint32_t dm_read_reg_func(const struct dc_context *ctx, uint32_t address,
                return 0;
        }
 
+       amdgpu_dm_exit_ips_for_hw_access(ctx->dc);
+
        value = cgs_read_register(ctx->cgs_device, address);
 
        trace_amdgpu_dc_rreg(&ctx->perf_trace->read_count, address, value);