⬢ DragonFlyBSD Kernel Audit
DF-5206 / fix.diff
← back to finding ↓ download raw
--- 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);