RE: [PATCH] drm/amdgpu/pm: Handle SCLK offset correctly in overdrive for smu 14.0.2

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



[AMD Official Use Only - AMD Internal Distribution Only]

It looks good to me.

Reviewed-by: Yang Wang <kevinyang.wang@xxxxxxx>

Best Regards,
Kevin

-----Original Message-----
From: amd-gfx <amd-gfx-bounces@xxxxxxxxxxxxxxxxxxxxx> On Behalf Of Tomasz Pakula
Sent: Wednesday, March 12, 2025 05:39
To: amd-gfx@xxxxxxxxxxxxxxxxxxxxx
Cc: Deucher, Alexander <Alexander.Deucher@xxxxxxx>
Subject: [PATCH] drm/amdgpu/pm: Handle SCLK offset correctly in overdrive for smu 14.0.2

Currently, it seems like the code was carried over from RDNA3 because it assumes two possible values to set. RDNA4, instead of having:
0: min SCLK
1: max SCLK
only has
0: SCLK offset

This change makes it so it only reports current offset value instead of showing possible min/max values and their indices. Moreover, it now only accepts the offset as a value, without the indice index.

Additionally, the lower bound was printed as %u by mistake.

Old:
OD_SCLK_OFFSET:
0: -500Mhz
1: 1000Mhz
OD_MCLK:
0: 97Mhz
1: 1259MHz
OD_VDDGFX_OFFSET:
0mV
OD_RANGE:
SCLK_OFFSET:    -500Mhz       1000Mhz
MCLK:      97Mhz       1500Mhz
VDDGFX_OFFSET:    -200mv          0mv

New:
OD_SCLK_OFFSET:
0Mhz
OD_MCLK:
0: 97Mhz
1: 1259MHz
OD_VDDGFX_OFFSET:
0mV
OD_RANGE:
SCLK_OFFSET:    -500Mhz       1000Mhz
MCLK:      97Mhz       1500Mhz
VDDGFX_OFFSET:    -200mv          0mv

Setting this offset:
Old: "s 1 <offset>"
New: "s <offset>"

Signed-off-by: Tomasz Pakuła <tomasz.pakula.oficjalny@xxxxxxxxx>
---
 .../drm/amd/pm/swsmu/smu14/smu_v14_0_2_ppt.c  | 59 ++++++-------------
 1 file changed, 18 insertions(+), 41 deletions(-)

diff --git a/drivers/gpu/drm/amd/pm/swsmu/smu14/smu_v14_0_2_ppt.c b/drivers/gpu/drm/amd/pm/swsmu/smu14/smu_v14_0_2_ppt.c
index 5cad09c5f2ff..62bd9647541a 100644
--- a/drivers/gpu/drm/amd/pm/swsmu/smu14/smu_v14_0_2_ppt.c
+++ b/drivers/gpu/drm/amd/pm/swsmu/smu14/smu_v14_0_2_ppt.c
@@ -1193,16 +1193,9 @@ static int smu_v14_0_2_print_clk_levels(struct smu_context *smu,
                                                         PP_OD_FEATURE_GFXCLK_BIT))
                        break;

-               PPTable_t *pptable = smu->smu_table.driver_pptable;
-               const OverDriveLimits_t * const overdrive_upperlimits =
-                                       &pptable->SkuTable.OverDriveLimitsBasicMax;
-               const OverDriveLimits_t * const overdrive_lowerlimits =
-                                       &pptable->SkuTable.OverDriveLimitsBasicMin;
-
                size += sysfs_emit_at(buf, size, "OD_SCLK_OFFSET:\n");
-               size += sysfs_emit_at(buf, size, "0: %dMhz\n1: %uMhz\n",
-                                       overdrive_lowerlimits->GfxclkFoffset,
-                                       overdrive_upperlimits->GfxclkFoffset);
+               size += sysfs_emit_at(buf, size, "%dMhz\n",
+                                       od_table->OverDriveTable.GfxclkFoffset);
                break;

        case SMU_OD_MCLK:
@@ -1336,13 +1329,9 @@ static int smu_v14_0_2_print_clk_levels(struct smu_context *smu,
                size += sysfs_emit_at(buf, size, "%s:\n", "OD_RANGE");

                if (smu_v14_0_2_is_od_feature_supported(smu, PP_OD_FEATURE_GFXCLK_BIT)) {
-                       smu_v14_0_2_get_od_setting_limits(smu,
-                                                         PP_OD_FEATURE_GFXCLK_FMIN,
-                                                         &min_value,
-                                                         NULL);
                        smu_v14_0_2_get_od_setting_limits(smu,
                                                          PP_OD_FEATURE_GFXCLK_FMAX,
-                                                         NULL,
+                                                         &min_value,
                                                          &max_value);
                        size += sysfs_emit_at(buf, size, "SCLK_OFFSET: %7dMhz %10uMhz\n",
                                              min_value, max_value);
@@ -2417,36 +2406,24 @@ static int smu_v14_0_2_od_edit_dpm_table(struct smu_context *smu,
                        return -ENOTSUPP;
                }

-               for (i = 0; i < size; i += 2) {
-                       if (i + 2 > size) {
-                               dev_info(adev->dev, "invalid number of input parameters %d\n", size);
-                               return -EINVAL;
-                       }
-
-                       switch (input[i]) {
-                       case 1:
-                               smu_v14_0_2_get_od_setting_limits(smu,
-                                                                 PP_OD_FEATURE_GFXCLK_FMAX,
-                                                                 &minimum,
-                                                                 &maximum);
-                               if (input[i + 1] < minimum ||
-                                   input[i + 1] > maximum) {
-                                       dev_info(adev->dev, "GfxclkFmax (%ld) must be within [%u, %u]!\n",
-                                               input[i + 1], minimum, maximum);
-                                       return -EINVAL;
-                               }
-
-                               od_table->OverDriveTable.GfxclkFoffset = input[i + 1];
-                               od_table->OverDriveTable.FeatureCtrlMask |= 1U << PP_OD_FEATURE_GFXCLK_BIT;
-                               break;
+               if (size != 1) {
+                       dev_info(adev->dev, "invalid number of input parameters %d\n", size);
+                       return -EINVAL;
+               }

-                       default:
-                               dev_info(adev->dev, "Invalid SCLK_VDDC_TABLE index: %ld\n", input[i]);
-                               dev_info(adev->dev, "Supported indices: [0:min,1:max]\n");
-                               return -EINVAL;
-                       }
+               smu_v14_0_2_get_od_setting_limits(smu,
+                                                 PP_OD_FEATURE_GFXCLK_FMAX,
+                                                 &minimum,
+                                                 &maximum);
+               if (input[0] < minimum ||
+                   input[0] > maximum) {
+                       dev_info(adev->dev, "GfxclkFoffset must be within [%d, %u]!\n",
+                                minimum, maximum);
+                       return -EINVAL;
                }

+               od_table->OverDriveTable.GfxclkFoffset = input[0];
+               od_table->OverDriveTable.FeatureCtrlMask |= 1U <<
+PP_OD_FEATURE_GFXCLK_BIT;
                break;

        case PP_OD_EDIT_MCLK_VDDC_TABLE:
--
2.48.1





[Index of Archives]     [Linux USB Devel]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]

  Powered by Linux