DF-5206 / fix.diff
--- a/sys/dev/drm/radeon/trinity_smc.c 2026-10-01 02:42:43.448792892 +0000 +++ b/sys/dev/drm/radeon/trinity_smc.c 2026-10-01 02:42:43.476792533 +0000 @@ -109,16 +109,20 @@ return trinity_notify_message_to_smu(rdev, PPSMC_MSG_PG_SIMD_Config); } -void trinity_acquire_mutex(struct radeon_device *rdev) +int trinity_acquire_mutex(struct radeon_device *rdev) { int i; WREG32(SMC_INT_REQ, 1); for (i = 0; i < rdev->usec_timeout; i++) { if ((RREG32(SMC_INT_REQ) & 0xffff) == 1) - break; + return 0; udelay(1); } + + DRM_ERROR("SMC failed to grant the SMC mutex\n"); + WREG32(SMC_INT_REQ, 0); + return -ETIME; } void trinity_release_mutex(struct radeon_device *rdev) --- a/sys/dev/drm/radeon/trinity_dpm.h 2026-06-29 12:51:19.000000000 +0000 +++ b/sys/dev/drm/radeon/trinity_dpm.h 2026-10-01 02:42:43.476792533 +0000 @@ -128,7 +128,7 @@ int trinity_dce_enable_voltage_adjustment(struct radeon_device *rdev, bool enable); int trinity_gfx_dynamic_mgpg_config(struct radeon_device *rdev); -void trinity_acquire_mutex(struct radeon_device *rdev); +int trinity_acquire_mutex(struct radeon_device *rdev); void trinity_release_mutex(struct radeon_device *rdev); #endif --- a/sys/dev/drm/radeon/trinity_dpm.c 2026-06-29 12:51:19.000000000 +0000 +++ b/sys/dev/drm/radeon/trinity_dpm.c 2026-10-01 02:42:43.476792533 +0000 @@ -1096,7 +1096,8 @@ struct trinity_power_info *pi = trinity_get_pi(rdev); if (pi->enable_bapm) { - trinity_acquire_mutex(rdev); + if (trinity_acquire_mutex(rdev)) + return; trinity_dpm_bapm_enable(rdev, enable); trinity_release_mutex(rdev); } @@ -1106,7 +1107,8 @@ { struct trinity_power_info *pi = trinity_get_pi(rdev); - trinity_acquire_mutex(rdev); + if (trinity_acquire_mutex(rdev)) + return -ETIME; if (trinity_dpm_enabled(rdev)) { trinity_release_mutex(rdev); @@ -1135,7 +1137,8 @@ { int ret; - trinity_acquire_mutex(rdev); + if (trinity_acquire_mutex(rdev)) + return -ETIME; trinity_enable_clock_power_gating(rdev); if (rdev->irq.installed && @@ -1155,7 +1158,8 @@ void trinity_dpm_disable(struct radeon_device *rdev) { - trinity_acquire_mutex(rdev); + if (trinity_acquire_mutex(rdev)) + return; if (!trinity_dpm_enabled(rdev)) { trinity_release_mutex(rdev); return; @@ -1255,7 +1259,8 @@ struct radeon_ps *new_ps = &pi->requested_rps; struct radeon_ps *old_ps = &pi->current_rps; - trinity_acquire_mutex(rdev); + if (trinity_acquire_mutex(rdev)) + return; if (pi->enable_dpm) { if (pi->enable_bapm) trinity_dpm_bapm_enable(rdev, rdev->pm.dpm.ac_power); @@ -1285,7 +1290,8 @@ void trinity_dpm_setup_asic(struct radeon_device *rdev) { - trinity_acquire_mutex(rdev); + if (trinity_acquire_mutex(rdev)) + return; sumo_program_sstp(rdev); sumo_take_smu_control(rdev, true); trinity_get_min_sclk_divider(rdev); |