Commit 0514dda3 authored by Evan Quan's avatar Evan Quan Committed by Alex Deucher
Browse files

drm/amd/pm: correct the logics for retreiving SMU13 OD setting limits



To better meet the growing demainds for more OD features.

Signed-off-by: default avatarEvan Quan <evan.quan@amd.com>
Acked-by: default avatarAlex Deucher <alexander.deucher@amd.com>
Signed-off-by: default avatarAlex Deucher <alexander.deucher@amd.com>
parent b7cc5b42
Loading
Loading
Loading
Loading
+32 −38
Original line number Diff line number Diff line
@@ -96,6 +96,12 @@
 */
#define SUPPORT_ECCTABLE_SMU_13_0_10_VERSION 0x00502200

#define PP_OD_FEATURE_GFXCLK_FMIN			0
#define PP_OD_FEATURE_GFXCLK_FMAX			1
#define PP_OD_FEATURE_UCLK_FMIN				2
#define PP_OD_FEATURE_UCLK_FMAX				3
#define PP_OD_FEATURE_GFX_VF_CURVE			4

static struct cmn2asic_msg_mapping smu_v13_0_0_message_map[SMU_MSG_MAX_COUNT] = {
	MSG_MAP(TestMessage,			PPSMC_MSG_TestMessage,                 1),
	MSG_MAP(GetSmuVersion,			PPSMC_MSG_GetSmuVersion,               1),
@@ -1058,7 +1064,6 @@ static bool smu_v13_0_0_is_od_feature_supported(struct smu_context *smu,

static void smu_v13_0_0_get_od_setting_limits(struct smu_context *smu,
					      int od_feature_bit,
					      bool lower_boundary,
					      int32_t *min,
					      int32_t *max)
{
@@ -1070,29 +1075,28 @@ static void smu_v13_0_0_get_od_setting_limits(struct smu_context *smu,
	int32_t od_min_setting, od_max_setting;

	switch (od_feature_bit) {
	case PP_OD_FEATURE_GFXCLK_BIT:
		if (lower_boundary) {
	case PP_OD_FEATURE_GFXCLK_FMIN:
		od_min_setting = overdrive_lowerlimits->GfxclkFmin;
		od_max_setting = overdrive_upperlimits->GfxclkFmin;
		} else {
		break;
	case PP_OD_FEATURE_GFXCLK_FMAX:
		od_min_setting = overdrive_lowerlimits->GfxclkFmax;
		od_max_setting = overdrive_upperlimits->GfxclkFmax;
		}
		break;
	case PP_OD_FEATURE_UCLK_BIT:
		if (lower_boundary) {
	case PP_OD_FEATURE_UCLK_FMIN:
		od_min_setting = overdrive_lowerlimits->UclkFmin;
		od_max_setting = overdrive_upperlimits->UclkFmin;
		} else {
		break;
	case PP_OD_FEATURE_UCLK_FMAX:
		od_min_setting = overdrive_lowerlimits->UclkFmax;
		od_max_setting = overdrive_upperlimits->UclkFmax;
		}
		break;
	case PP_OD_FEATURE_GFX_VF_CURVE_BIT:
	case PP_OD_FEATURE_GFX_VF_CURVE:
		od_min_setting = overdrive_lowerlimits->VoltageOffsetPerZoneBoundary;
		od_max_setting = overdrive_upperlimits->VoltageOffsetPerZoneBoundary;
		break;
	default:
		od_min_setting = od_max_setting = INT_MAX;
		break;
	}

@@ -1318,13 +1322,11 @@ static int smu_v13_0_0_print_clk_levels(struct smu_context *smu,

		if (smu_v13_0_0_is_od_feature_supported(smu, PP_OD_FEATURE_GFXCLK_BIT)) {
			smu_v13_0_0_get_od_setting_limits(smu,
							  PP_OD_FEATURE_GFXCLK_BIT,
							  true,
							  PP_OD_FEATURE_GFXCLK_FMIN,
							  &min_value,
							  NULL);
			smu_v13_0_0_get_od_setting_limits(smu,
							  PP_OD_FEATURE_GFXCLK_BIT,
							  false,
							  PP_OD_FEATURE_GFXCLK_FMAX,
							  NULL,
							  &max_value);
			size += sysfs_emit_at(buf, size, "SCLK: %7uMhz %10uMhz\n",
@@ -1333,13 +1335,11 @@ static int smu_v13_0_0_print_clk_levels(struct smu_context *smu,

		if (smu_v13_0_0_is_od_feature_supported(smu, PP_OD_FEATURE_UCLK_BIT)) {
			smu_v13_0_0_get_od_setting_limits(smu,
							  PP_OD_FEATURE_UCLK_BIT,
							  true,
							  PP_OD_FEATURE_UCLK_FMIN,
							  &min_value,
							  NULL);
			smu_v13_0_0_get_od_setting_limits(smu,
							  PP_OD_FEATURE_UCLK_BIT,
							  false,
							  PP_OD_FEATURE_UCLK_FMAX,
							  NULL,
							  &max_value);
			size += sysfs_emit_at(buf, size, "MCLK: %7uMhz %10uMhz\n",
@@ -1348,8 +1348,7 @@ static int smu_v13_0_0_print_clk_levels(struct smu_context *smu,

		if (smu_v13_0_0_is_od_feature_supported(smu, PP_OD_FEATURE_GFX_VF_CURVE_BIT)) {
			smu_v13_0_0_get_od_setting_limits(smu,
							  PP_OD_FEATURE_GFX_VF_CURVE_BIT,
							  true,
							  PP_OD_FEATURE_GFX_VF_CURVE,
							  &min_value,
							  &max_value);
			size += sysfs_emit_at(buf, size, "VDDC_CURVE: %7dmv %10dmv\n",
@@ -1394,8 +1393,7 @@ static int smu_v13_0_0_od_edit_dpm_table(struct smu_context *smu,
			switch (input[i]) {
			case 0:
				smu_v13_0_0_get_od_setting_limits(smu,
								  PP_OD_FEATURE_GFXCLK_BIT,
								  true,
								  PP_OD_FEATURE_GFXCLK_FMIN,
								  &minimum,
								  &maximum);
				if (input[i + 1] < minimum ||
@@ -1411,8 +1409,7 @@ static int smu_v13_0_0_od_edit_dpm_table(struct smu_context *smu,

			case 1:
				smu_v13_0_0_get_od_setting_limits(smu,
								  PP_OD_FEATURE_GFXCLK_BIT,
								  false,
								  PP_OD_FEATURE_GFXCLK_FMAX,
								  &minimum,
								  &maximum);
				if (input[i + 1] < minimum ||
@@ -1457,8 +1454,7 @@ static int smu_v13_0_0_od_edit_dpm_table(struct smu_context *smu,
			switch (input[i]) {
			case 0:
				smu_v13_0_0_get_od_setting_limits(smu,
								  PP_OD_FEATURE_UCLK_BIT,
								  true,
								  PP_OD_FEATURE_UCLK_FMIN,
								  &minimum,
								  &maximum);
				if (input[i + 1] < minimum ||
@@ -1474,8 +1470,7 @@ static int smu_v13_0_0_od_edit_dpm_table(struct smu_context *smu,

			case 1:
				smu_v13_0_0_get_od_setting_limits(smu,
								  PP_OD_FEATURE_UCLK_BIT,
								  false,
								  PP_OD_FEATURE_UCLK_FMAX,
								  &minimum,
								  &maximum);
				if (input[i + 1] < minimum ||
@@ -1516,8 +1511,7 @@ static int smu_v13_0_0_od_edit_dpm_table(struct smu_context *smu,
			return -EINVAL;

		smu_v13_0_0_get_od_setting_limits(smu,
						  PP_OD_FEATURE_GFX_VF_CURVE_BIT,
						  true,
						  PP_OD_FEATURE_GFX_VF_CURVE,
						  &minimum,
						  &maximum);
		if (input[1] < minimum ||
+32 −38
Original line number Diff line number Diff line
@@ -72,6 +72,12 @@

#define MP0_MP1_DATA_REGION_SIZE_COMBOPPTABLE	0x4000

#define PP_OD_FEATURE_GFXCLK_FMIN			0
#define PP_OD_FEATURE_GFXCLK_FMAX			1
#define PP_OD_FEATURE_UCLK_FMIN				2
#define PP_OD_FEATURE_UCLK_FMAX				3
#define PP_OD_FEATURE_GFX_VF_CURVE			4

static struct cmn2asic_msg_mapping smu_v13_0_7_message_map[SMU_MSG_MAX_COUNT] = {
	MSG_MAP(TestMessage,			PPSMC_MSG_TestMessage,                 1),
	MSG_MAP(GetSmuVersion,			PPSMC_MSG_GetSmuVersion,               1),
@@ -1039,7 +1045,6 @@ static bool smu_v13_0_7_is_od_feature_supported(struct smu_context *smu,

static void smu_v13_0_7_get_od_setting_limits(struct smu_context *smu,
					      int od_feature_bit,
					      bool lower_boundary,
					      int32_t *min,
					      int32_t *max)
{
@@ -1051,29 +1056,28 @@ static void smu_v13_0_7_get_od_setting_limits(struct smu_context *smu,
	int32_t od_min_setting, od_max_setting;

	switch (od_feature_bit) {
	case PP_OD_FEATURE_GFXCLK_BIT:
		if (lower_boundary) {
	case PP_OD_FEATURE_GFXCLK_FMIN:
		od_min_setting = overdrive_lowerlimits->GfxclkFmin;
		od_max_setting = overdrive_upperlimits->GfxclkFmin;
		} else {
		break;
	case PP_OD_FEATURE_GFXCLK_FMAX:
		od_min_setting = overdrive_lowerlimits->GfxclkFmax;
		od_max_setting = overdrive_upperlimits->GfxclkFmax;
		}
		break;
	case PP_OD_FEATURE_UCLK_BIT:
		if (lower_boundary) {
	case PP_OD_FEATURE_UCLK_FMIN:
		od_min_setting = overdrive_lowerlimits->UclkFmin;
		od_max_setting = overdrive_upperlimits->UclkFmin;
		} else {
		break;
	case PP_OD_FEATURE_UCLK_FMAX:
		od_min_setting = overdrive_lowerlimits->UclkFmax;
		od_max_setting = overdrive_upperlimits->UclkFmax;
		}
		break;
	case PP_OD_FEATURE_GFX_VF_CURVE_BIT:
	case PP_OD_FEATURE_GFX_VF_CURVE:
		od_min_setting = overdrive_lowerlimits->VoltageOffsetPerZoneBoundary;
		od_max_setting = overdrive_upperlimits->VoltageOffsetPerZoneBoundary;
		break;
	default:
		od_min_setting = od_max_setting = INT_MAX;
		break;
	}

@@ -1299,13 +1303,11 @@ static int smu_v13_0_7_print_clk_levels(struct smu_context *smu,

		if (smu_v13_0_7_is_od_feature_supported(smu, PP_OD_FEATURE_GFXCLK_BIT)) {
			smu_v13_0_7_get_od_setting_limits(smu,
							  PP_OD_FEATURE_GFXCLK_BIT,
							  true,
							  PP_OD_FEATURE_GFXCLK_FMIN,
							  &min_value,
							  NULL);
			smu_v13_0_7_get_od_setting_limits(smu,
							  PP_OD_FEATURE_GFXCLK_BIT,
							  false,
							  PP_OD_FEATURE_GFXCLK_FMAX,
							  NULL,
							  &max_value);
			size += sysfs_emit_at(buf, size, "SCLK: %7uMhz %10uMhz\n",
@@ -1314,13 +1316,11 @@ static int smu_v13_0_7_print_clk_levels(struct smu_context *smu,

		if (smu_v13_0_7_is_od_feature_supported(smu, PP_OD_FEATURE_UCLK_BIT)) {
			smu_v13_0_7_get_od_setting_limits(smu,
							  PP_OD_FEATURE_UCLK_BIT,
							  true,
							  PP_OD_FEATURE_UCLK_FMIN,
							  &min_value,
							  NULL);
			smu_v13_0_7_get_od_setting_limits(smu,
							  PP_OD_FEATURE_UCLK_BIT,
							  false,
							  PP_OD_FEATURE_UCLK_FMAX,
							  NULL,
							  &max_value);
			size += sysfs_emit_at(buf, size, "MCLK: %7uMhz %10uMhz\n",
@@ -1329,8 +1329,7 @@ static int smu_v13_0_7_print_clk_levels(struct smu_context *smu,

		if (smu_v13_0_7_is_od_feature_supported(smu, PP_OD_FEATURE_GFX_VF_CURVE_BIT)) {
			smu_v13_0_7_get_od_setting_limits(smu,
							  PP_OD_FEATURE_GFX_VF_CURVE_BIT,
							  true,
							  PP_OD_FEATURE_GFX_VF_CURVE,
							  &min_value,
							  &max_value);
			size += sysfs_emit_at(buf, size, "VDDC_CURVE: %7dmv %10dmv\n",
@@ -1375,8 +1374,7 @@ static int smu_v13_0_7_od_edit_dpm_table(struct smu_context *smu,
			switch (input[i]) {
			case 0:
				smu_v13_0_7_get_od_setting_limits(smu,
								  PP_OD_FEATURE_GFXCLK_BIT,
								  true,
								  PP_OD_FEATURE_GFXCLK_FMIN,
								  &minimum,
								  &maximum);
				if (input[i + 1] < minimum ||
@@ -1392,8 +1390,7 @@ static int smu_v13_0_7_od_edit_dpm_table(struct smu_context *smu,

			case 1:
				smu_v13_0_7_get_od_setting_limits(smu,
								  PP_OD_FEATURE_GFXCLK_BIT,
								  false,
								  PP_OD_FEATURE_GFXCLK_FMAX,
								  &minimum,
								  &maximum);
				if (input[i + 1] < minimum ||
@@ -1438,8 +1435,7 @@ static int smu_v13_0_7_od_edit_dpm_table(struct smu_context *smu,
			switch (input[i]) {
			case 0:
				smu_v13_0_7_get_od_setting_limits(smu,
								  PP_OD_FEATURE_UCLK_BIT,
								  true,
								  PP_OD_FEATURE_UCLK_FMIN,
								  &minimum,
								  &maximum);
				if (input[i + 1] < minimum ||
@@ -1455,8 +1451,7 @@ static int smu_v13_0_7_od_edit_dpm_table(struct smu_context *smu,

			case 1:
				smu_v13_0_7_get_od_setting_limits(smu,
								  PP_OD_FEATURE_UCLK_BIT,
								  false,
								  PP_OD_FEATURE_UCLK_FMAX,
								  &minimum,
								  &maximum);
				if (input[i + 1] < minimum ||
@@ -1497,8 +1492,7 @@ static int smu_v13_0_7_od_edit_dpm_table(struct smu_context *smu,
			return -EINVAL;

		smu_v13_0_7_get_od_setting_limits(smu,
						  PP_OD_FEATURE_GFX_VF_CURVE_BIT,
						  true,
						  PP_OD_FEATURE_GFX_VF_CURVE,
						  &minimum,
						  &maximum);
		if (input[1] < minimum ||