]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
drm/amd: Stop overloading power limit with limit type
authorMario Limonciello <mario.limonciello@amd.com>
Thu, 9 Oct 2025 20:59:04 +0000 (15:59 -0500)
committerAlex Deucher <alexander.deucher@amd.com>
Mon, 13 Oct 2025 18:14:35 +0000 (14:14 -0400)
When passed around internally the upper 8 bits of power limit include
the limit type. This is non-obvious without digging into the nuances
of each function. Instead pass the limit type as an argument to all
applicable layers.

Reviewed-by: Lijo Lazar <lijo.lazar@amd.com>
Signed-off-by: Mario Limonciello <mario.limonciello@amd.com>
Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
drivers/gpu/drm/amd/include/kgd_pp_interface.h
drivers/gpu/drm/amd/pm/amdgpu_dpm.c
drivers/gpu/drm/amd/pm/amdgpu_pm.c
drivers/gpu/drm/amd/pm/inc/amdgpu_dpm.h
drivers/gpu/drm/amd/pm/powerplay/amd_powerplay.c
drivers/gpu/drm/amd/pm/swsmu/amdgpu_smu.c
drivers/gpu/drm/amd/pm/swsmu/smu11/vangogh_ppt.c

index 2b0cdb2a2775df69c320dddb46a624e78e6f416b..87814c2b526e738cb2ae8c51543bf946cc040d9e 100644 (file)
@@ -454,7 +454,7 @@ struct amd_pm_funcs {
                                bool gate,
                                int inst);
        int (*set_clockgating_by_smu)(void *handle, uint32_t msg_id);
-       int (*set_power_limit)(void *handle, uint32_t n);
+       int (*set_power_limit)(void *handle, uint32_t limit_type, uint32_t n);
        int (*get_power_limit)(void *handle, uint32_t *limit,
                        enum pp_power_limit_level pp_limit_level,
                        enum pp_power_type power_type);
index 518d07afc7df2e181ace853bb09151d900ebf0aa..5d08dc3b7110feab1c7099adcb1aba8313394cf2 100644 (file)
@@ -1616,6 +1616,7 @@ int amdgpu_dpm_get_power_limit(struct amdgpu_device *adev,
 }
 
 int amdgpu_dpm_set_power_limit(struct amdgpu_device *adev,
+                              uint32_t limit_type,
                               uint32_t limit)
 {
        const struct amd_pm_funcs *pp_funcs = adev->powerplay.pp_funcs;
@@ -1626,7 +1627,7 @@ int amdgpu_dpm_set_power_limit(struct amdgpu_device *adev,
 
        mutex_lock(&adev->pm.mutex);
        ret = pp_funcs->set_power_limit(adev->powerplay.pp_handle,
-                                       limit);
+                                       limit_type, limit);
        mutex_unlock(&adev->pm.mutex);
 
        return ret;
index b5fbb0fd1dc090b3498adef756c6887f656bf971..6bdf185c6b60476d13cd5efefcbff55ea50dc350 100644 (file)
@@ -3390,13 +3390,12 @@ static ssize_t amdgpu_hwmon_set_power_cap(struct device *dev,
                return err;
 
        value = value / 1000000; /* convert to Watt */
-       value |= limit_type << 24;
 
        err = amdgpu_pm_get_access(adev);
        if (err < 0)
                return err;
 
-       err = amdgpu_dpm_set_power_limit(adev, value);
+       err = amdgpu_dpm_set_power_limit(adev, limit_type, value);
 
        amdgpu_pm_put_access(adev);
 
index 65c1d98af26c3b19eeb7c7444ab7b090ba55f6a1..3bce74f8bb0af899454ea0942498888df0b0be00 100644 (file)
@@ -553,7 +553,7 @@ int amdgpu_dpm_get_power_limit(struct amdgpu_device *adev,
                               enum pp_power_limit_level pp_limit_level,
                               enum pp_power_type power_type);
 int amdgpu_dpm_set_power_limit(struct amdgpu_device *adev,
-                              uint32_t limit);
+                              uint32_t limit_type, uint32_t limit);
 int amdgpu_dpm_is_cclk_dpm_supported(struct amdgpu_device *adev);
 int amdgpu_dpm_debugfs_print_current_performance_level(struct amdgpu_device *adev,
                                                       struct seq_file *m);
index fb595a70bbd1173dcff614cf5fcf97982a9af01e..76a5353d7f4a193b66f567410529534e4abf7a1e 100644 (file)
@@ -952,7 +952,7 @@ static int pp_dpm_switch_power_profile(void *handle,
        return 0;
 }
 
-static int pp_set_power_limit(void *handle, uint32_t limit)
+static int pp_set_power_limit(void *handle, uint32_t limit_type, uint32_t limit)
 {
        struct pp_hwmgr *hwmgr = handle;
        uint32_t max_power_limit;
index fb8086859857f575bf4210f7ae37ef4e7f1964fc..1c5f37cd5b7535fcf27281a9c57dbef3bbd054a8 100644 (file)
@@ -68,7 +68,7 @@ static int smu_handle_task(struct smu_context *smu,
 static int smu_reset(struct smu_context *smu);
 static int smu_set_fan_speed_pwm(void *handle, u32 speed);
 static int smu_set_fan_control_mode(void *handle, u32 value);
-static int smu_set_power_limit(void *handle, uint32_t limit);
+static int smu_set_power_limit(void *handle, uint32_t limit_type, uint32_t limit);
 static int smu_set_fan_speed_rpm(void *handle, uint32_t speed);
 static int smu_set_gfx_cgpg(struct smu_context *smu, bool enabled);
 static int smu_set_mp1_state(void *handle, enum pp_mp1_state mp1_state);
@@ -510,7 +510,7 @@ static void smu_restore_dpm_user_profile(struct smu_context *smu)
 
        /* set the user dpm power limit */
        if (smu->user_dpm_profile.power_limit) {
-               ret = smu_set_power_limit(smu, smu->user_dpm_profile.power_limit);
+               ret = smu_set_power_limit(smu, SMU_DEFAULT_PPT_LIMIT, smu->current_power_limit);
                if (ret)
                        dev_err(smu->adev->dev, "Failed to set power limit value\n");
        }
@@ -2258,7 +2258,7 @@ static int smu_resume(struct amdgpu_ip_block *ip_block)
        adev->pm.dpm_enabled = true;
 
        if (smu->current_power_limit) {
-               ret = smu_set_power_limit(smu, smu->current_power_limit);
+               ret = smu_set_power_limit(smu, SMU_DEFAULT_PPT_LIMIT, smu->current_power_limit);
                if (ret && ret != -EOPNOTSUPP)
                        return ret;
        }
@@ -2958,16 +2958,14 @@ int smu_get_power_limit(void *handle,
        return ret;
 }
 
-static int smu_set_power_limit(void *handle, uint32_t limit)
+static int smu_set_power_limit(void *handle, uint32_t limit_type, uint32_t limit)
 {
        struct smu_context *smu = handle;
-       uint32_t limit_type = limit >> 24;
        int ret = 0;
 
        if (!smu->pm_enabled || !smu->adev->pm.dpm_enabled)
                return -EOPNOTSUPP;
 
-       limit &= (1<<24)-1;
        if (limit_type != SMU_DEFAULT_PPT_LIMIT)
                if (smu->ppt_funcs->set_power_limit)
                        return smu->ppt_funcs->set_power_limit(smu, limit_type, limit);
index 9fadfa820f5da56121641c835f14131681d4f767..1dcbf250f486c0b112b4540aba10a37ae8fe9ab3 100644 (file)
@@ -2397,7 +2397,6 @@ static int vangogh_set_power_limit(struct smu_context *smu,
                smu->current_power_limit = ppt_limit;
                break;
        case SMU_FAST_PPT_LIMIT:
-               ppt_limit &= ~(SMU_FAST_PPT_LIMIT << 24);
                if (ppt_limit > power_context->max_fast_ppt_limit) {
                        dev_err(smu->adev->dev,
                                "New power limit (%d) is over the max allowed %d\n",