]> Gentwo Git Trees - linux/.git/commitdiff
drm/amd/pm: adjust the visibility of pp_table sysfs node
authorYang Wang <kevinyang.wang@amd.com>
Thu, 30 Oct 2025 01:06:22 +0000 (09:06 +0800)
committerAlex Deucher <alexander.deucher@amd.com>
Mon, 24 Nov 2025 17:36:12 +0000 (12:36 -0500)
v1:
- make pp_table invisible on VF mode (only valid on BM)
- make pp_table invisible on Mi* chips (Not supported)
- make pp_table invisible if scpm feature is enabled.

v2:
move pp_table invisible code logic into amdgpu_dpm_get_pp_table() function.

v3:
add table buffer pointer check both on powerplay & swsmu.

Signed-off-by: Yang Wang <kevinyang.wang@amd.com>
Reviewed-by: Lijo Lazar <lijo.lazar@amd.com>
Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
drivers/gpu/drm/amd/pm/amdgpu_dpm.c
drivers/gpu/drm/amd/pm/amdgpu_pm.c
drivers/gpu/drm/amd/pm/powerplay/amd_powerplay.c
drivers/gpu/drm/amd/pm/swsmu/amdgpu_smu.c

index c6f55d3522cd6423341eb02daeed4b4b1044921d..79b174e5326da62da6980bb2dcdf8f20d2e1a643 100644 (file)
@@ -1187,8 +1187,11 @@ int amdgpu_dpm_get_pp_table(struct amdgpu_device *adev, char **table)
        const struct amd_pm_funcs *pp_funcs = adev->powerplay.pp_funcs;
        int ret = 0;
 
-       if (!pp_funcs->get_pp_table)
-               return 0;
+       if (!table)
+               return -EINVAL;
+
+       if (amdgpu_sriov_vf(adev) || !pp_funcs->get_pp_table || adev->scpm_enabled)
+               return -EOPNOTSUPP;
 
        mutex_lock(&adev->pm.mutex);
        ret = pp_funcs->get_pp_table(adev->powerplay.pp_handle,
@@ -1715,7 +1718,10 @@ int amdgpu_dpm_set_pp_table(struct amdgpu_device *adev,
        const struct amd_pm_funcs *pp_funcs = adev->powerplay.pp_funcs;
        int ret = 0;
 
-       if (!pp_funcs->set_pp_table)
+       if (!buf || !size)
+               return -EINVAL;
+
+       if (amdgpu_sriov_vf(adev) || !pp_funcs->set_pp_table || adev->scpm_enabled)
                return -EOPNOTSUPP;
 
        mutex_lock(&adev->pm.mutex);
index 84ad3ee17907968829fe7e7e1f825f19de9bf34f..65296a819e6a12637263c1ed2d6f3f27de94a72d 100644 (file)
@@ -2506,7 +2506,7 @@ static struct amdgpu_device_attr amdgpu_device_attrs[] = {
        AMDGPU_DEVICE_ATTR_RO(pp_num_states,                            ATTR_FLAG_BASIC|ATTR_FLAG_ONEVF),
        AMDGPU_DEVICE_ATTR_RO(pp_cur_state,                             ATTR_FLAG_BASIC|ATTR_FLAG_ONEVF),
        AMDGPU_DEVICE_ATTR_RW(pp_force_state,                           ATTR_FLAG_BASIC|ATTR_FLAG_ONEVF),
-       AMDGPU_DEVICE_ATTR_RW(pp_table,                                 ATTR_FLAG_BASIC|ATTR_FLAG_ONEVF),
+       AMDGPU_DEVICE_ATTR_RW(pp_table,                                 ATTR_FLAG_BASIC),
        AMDGPU_DEVICE_ATTR_RW(pp_dpm_sclk,                              ATTR_FLAG_BASIC|ATTR_FLAG_ONEVF,
                              .attr_update = pp_dpm_clk_default_attr_update),
        AMDGPU_DEVICE_ATTR_RW(pp_dpm_mclk,                              ATTR_FLAG_BASIC|ATTR_FLAG_ONEVF,
@@ -2638,6 +2638,15 @@ static int default_attr_update(struct amdgpu_device *adev, struct amdgpu_device_
                if (amdgpu_dpm_get_apu_thermal_limit(adev, &limit) ==
                    -EOPNOTSUPP)
                        *states = ATTR_STATE_UNSUPPORTED;
+       } else if (DEVICE_ATTR_IS(pp_table)) {
+               int ret;
+               char *tmp = NULL;
+
+               ret = amdgpu_dpm_get_pp_table(adev, &tmp);
+               if (ret == -EOPNOTSUPP || !tmp)
+                       *states = ATTR_STATE_UNSUPPORTED;
+               else
+                       *states = ATTR_STATE_SUPPORTED;
        }
 
        switch (gc_ver) {
index 76a5353d7f4a193b66f567410529534e4abf7a1e..3aaf3dd71868ca02b04b2d72fbcdeb3e0005a696 100644 (file)
@@ -631,9 +631,12 @@ static int pp_dpm_get_pp_table(void *handle, char **table)
 {
        struct pp_hwmgr *hwmgr = handle;
 
-       if (!hwmgr || !hwmgr->pm_en || !hwmgr->soft_pp_table)
+       if (!hwmgr || !hwmgr->pm_en || !table)
                return -EINVAL;
 
+       if (!hwmgr->soft_pp_table)
+               return -EOPNOTSUPP;
+
        *table = (char *)hwmgr->soft_pp_table;
        return hwmgr->soft_pp_table_size;
 }
index 4b5706be34e4e03d44c202cfddcb1be9624e5d40..f51fa265230b3736e0a9a07ddcafa5ea1fd5f3c0 100644 (file)
@@ -634,7 +634,7 @@ static int smu_sys_get_pp_table(void *handle,
                return -EOPNOTSUPP;
 
        if (!smu_table->power_play_table && !smu_table->hardcode_pptable)
-               return -EINVAL;
+               return -EOPNOTSUPP;
 
        if (smu_table->hardcode_pptable)
                *table = smu_table->hardcode_pptable;