From 634fc7f144655efe6ec324b8c91da9aa352cb8db Mon Sep 17 00:00:00 2001
From: Alex Deucher <alexander.deucher@amd.com>
Date: Wed, 27 Jan 2021 16:29:37 -0500
Subject: [PATCH] drm/amdgpu/pm/smu11: query hw for manual fan control

if no setting has been specified yet.

Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
---
 drivers/gpu/drm/amd/pm/swsmu/smu11/arcturus_ppt.c     | 11 ++++++++++-
 drivers/gpu/drm/amd/pm/swsmu/smu11/navi10_ppt.c       | 11 ++++++++++-
 .../gpu/drm/amd/pm/swsmu/smu11/sienna_cichlid_ppt.c   | 11 ++++++++++-
 3 files changed, 30 insertions(+), 3 deletions(-)

diff --git a/drivers/gpu/drm/amd/pm/swsmu/smu11/arcturus_ppt.c b/drivers/gpu/drm/amd/pm/swsmu/smu11/arcturus_ppt.c
index f0cc4de9ced50..ee7827c55626e 100644
--- a/drivers/gpu/drm/amd/pm/swsmu/smu11/arcturus_ppt.c
+++ b/drivers/gpu/drm/amd/pm/swsmu/smu11/arcturus_ppt.c
@@ -1098,7 +1098,16 @@ static int arcturus_get_fan_speed_percent(struct smu_context *smu,
 			*speed = rpm * 100 / smu->fan_max_rpm;
 		return ret;
 	default:
-		*speed = smu->user_dpm_profile.fan_speed_percent;
+		if (smu->user_dpm_profile.fan_speed_percent) {
+			*speed = smu->user_dpm_profile.fan_speed_percent;
+		} else {
+			ret = arcturus_get_smu_metrics_data(smu,
+							    METRICS_CURR_FANSPEED,
+							    &rpm);
+			if (!ret && smu->fan_max_rpm)
+				*speed = rpm * 100 / smu->fan_max_rpm;
+			return ret;
+		}
 		return 0;
 	}
 }
diff --git a/drivers/gpu/drm/amd/pm/swsmu/smu11/navi10_ppt.c b/drivers/gpu/drm/amd/pm/swsmu/smu11/navi10_ppt.c
index f7f78daffd275..943f870f1109e 100644
--- a/drivers/gpu/drm/amd/pm/swsmu/smu11/navi10_ppt.c
+++ b/drivers/gpu/drm/amd/pm/swsmu/smu11/navi10_ppt.c
@@ -1335,7 +1335,16 @@ static int navi10_get_fan_speed_percent(struct smu_context *smu,
 			*speed = rpm * 100 / smu->fan_max_rpm;
 		return ret;
 	default:
-		*speed = smu->user_dpm_profile.fan_speed_percent;
+		if (smu->user_dpm_profile.fan_speed_percent) {
+			*speed = smu->user_dpm_profile.fan_speed_percent;
+		} else {
+			ret = navi10_get_smu_metrics_data(smu,
+							  METRICS_CURR_FANSPEED,
+							  &rpm);
+			if (!ret && smu->fan_max_rpm)
+				*speed = rpm * 100 / smu->fan_max_rpm;
+			return ret;
+		}
 		return 0;
 	}
 }
diff --git a/drivers/gpu/drm/amd/pm/swsmu/smu11/sienna_cichlid_ppt.c b/drivers/gpu/drm/amd/pm/swsmu/smu11/sienna_cichlid_ppt.c
index e3ba40d9f83f9..5447ecfe59845 100644
--- a/drivers/gpu/drm/amd/pm/swsmu/smu11/sienna_cichlid_ppt.c
+++ b/drivers/gpu/drm/amd/pm/swsmu/smu11/sienna_cichlid_ppt.c
@@ -1255,7 +1255,16 @@ static int sienna_cichlid_get_fan_speed_percent(struct smu_context *smu,
 			*speed = rpm * 100 / smu->fan_max_rpm;
 		return ret;
 	default:
-		*speed = smu->user_dpm_profile.fan_speed_percent;
+		if (smu->user_dpm_profile.fan_speed_percent) {
+			*speed = smu->user_dpm_profile.fan_speed_percent;
+		} else {
+			ret = sienna_cichlid_get_smu_metrics_data(smu,
+								  METRICS_CURR_FANSPEED,
+								  &rpm);
+			if (!ret && smu->fan_max_rpm)
+				*speed = rpm * 100 / smu->fan_max_rpm;
+			return ret;
+		}
 		return 0;
 	}
 }
-- 
GitLab