]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
drm/amd/pm: power up or down vcn by instance
authorBoyuan Zhang <boyuan.zhang@amd.com>
Sun, 29 Sep 2024 19:17:29 +0000 (15:17 -0400)
committerAlex Deucher <alexander.deucher@amd.com>
Tue, 10 Dec 2024 15:26:47 +0000 (10:26 -0500)
For smu ip with multiple vcn instances (smu 11/13/14), remove all the
for loop in dpm_set_vcn_enable() functions. And use the instance
argument to power up/down vcn for the given instance only, instead
of powering up/down for all vcn instances.

v2: remove all duplicated functions in v1.

remove for-loop from each ip, and temporarily move to dpm_set_vcn_enable,
in order to keep the exact same logic as before, until further separation
in the next patch.

Signed-off-by: Boyuan Zhang <boyuan.zhang@amd.com>
Acked-by: Christian König <christian.koenig@amd.com>
Reviewed-by: Alex Deucher <alexander.deucher@amd.com>
Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
drivers/gpu/drm/amd/pm/swsmu/amdgpu_smu.c
drivers/gpu/drm/amd/pm/swsmu/smu11/sienna_cichlid_ppt.c
drivers/gpu/drm/amd/pm/swsmu/smu13/smu_v13_0.c
drivers/gpu/drm/amd/pm/swsmu/smu14/smu_v14_0.c

index 6d22c7783898b06e4cd9b1be35f13ad38415a33a..76dda38ae57ff6bf503b3c9ab5f2f236caf11982 100644 (file)
@@ -242,6 +242,7 @@ static int smu_dpm_set_vcn_enable(struct smu_context *smu,
 {
        struct smu_power_context *smu_power = &smu->smu_power;
        struct smu_power_gate *power_gate = &smu_power->power_gate;
+       struct amdgpu_device *adev = smu->adev;
        int ret = 0;
 
        /*
@@ -256,9 +257,11 @@ static int smu_dpm_set_vcn_enable(struct smu_context *smu,
        if (atomic_read(&power_gate->vcn_gated) ^ enable)
                return 0;
 
-       ret = smu->ppt_funcs->dpm_set_vcn_enable(smu, enable, 0xff);
-       if (!ret)
-               atomic_set(&power_gate->vcn_gated, !enable);
+       for (int i = 0; i < adev->vcn.num_vcn_inst; i++) {
+               ret = smu->ppt_funcs->dpm_set_vcn_enable(smu, enable, i);
+               if (ret)
+                       return ret;
+       }
 
        return ret;
 }
index 286777ada1dfc4cded7a729d66cf643d6463a086..19a25fdc2f5b426008cbe067875afd0223361e2f 100644 (file)
@@ -1157,19 +1157,15 @@ static int sienna_cichlid_dpm_set_vcn_enable(struct smu_context *smu,
                                              int inst)
 {
        struct amdgpu_device *adev = smu->adev;
-       int i, ret = 0;
+       int ret = 0;
 
-       for (i = 0; i < adev->vcn.num_vcn_inst; i++) {
-               if (adev->vcn.harvest_config & (1 << i))
-                       continue;
-               /* vcn dpm on is a prerequisite for vcn power gate messages */
-               if (smu_cmn_feature_is_enabled(smu, SMU_FEATURE_MM_DPM_PG_BIT)) {
-                       ret = smu_cmn_send_smc_msg_with_param(smu, enable ?
-                                                             SMU_MSG_PowerUpVcn : SMU_MSG_PowerDownVcn,
-                                                             0x10000 * i, NULL);
-                       if (ret)
-                               return ret;
-               }
+       if (adev->vcn.harvest_config & (1 << inst))
+               return ret;
+       /* vcn dpm on is a prerequisite for vcn power gate messages */
+       if (smu_cmn_feature_is_enabled(smu, SMU_FEATURE_MM_DPM_PG_BIT)) {
+               ret = smu_cmn_send_smc_msg_with_param(smu, enable ?
+                                                     SMU_MSG_PowerUpVcn : SMU_MSG_PowerDownVcn,
+                                                     0x10000 * inst, NULL);
        }
 
        return ret;
index 2bfea740daceedb550474dae9478cfda28102d44..bb506d15d787f3f8e62807b292c74f6e176c1f91 100644 (file)
@@ -2108,18 +2108,14 @@ int smu_v13_0_set_vcn_enable(struct smu_context *smu,
                              int inst)
 {
        struct amdgpu_device *adev = smu->adev;
-       int i, ret = 0;
+       int ret = 0;
 
-       for (i = 0; i < adev->vcn.num_vcn_inst; i++) {
-               if (adev->vcn.harvest_config & (1 << i))
-                       continue;
+       if (adev->vcn.harvest_config & (1 << inst))
+               return ret;
 
-               ret = smu_cmn_send_smc_msg_with_param(smu, enable ?
-                                                     SMU_MSG_PowerUpVcn : SMU_MSG_PowerDownVcn,
-                                                     i << 16U, NULL);
-               if (ret)
-                       return ret;
-       }
+       ret = smu_cmn_send_smc_msg_with_param(smu, enable ?
+                                             SMU_MSG_PowerUpVcn : SMU_MSG_PowerDownVcn,
+                                             inst << 16U, NULL);
 
        return ret;
 }
index a87040cb2f2e52ff830c4f60d24dcde078961b90..4d083f7f772e68efce29ed9ba6e4a219940ca2e0 100644 (file)
@@ -1511,29 +1511,24 @@ int smu_v14_0_set_vcn_enable(struct smu_context *smu,
                              int inst)
 {
        struct amdgpu_device *adev = smu->adev;
-       int i, ret = 0;
+       int ret = 0;
 
-       for (i = 0; i < adev->vcn.num_vcn_inst; i++) {
-               if (adev->vcn.harvest_config & (1 << i))
-                       continue;
+       if (adev->vcn.harvest_config & (1 << inst))
+               return ret;
 
-               if (smu->is_apu) {
-                       if (i == 0)
-                               ret = smu_cmn_send_smc_msg_with_param(smu, enable ?
-                                                                     SMU_MSG_PowerUpVcn0 : SMU_MSG_PowerDownVcn0,
-                                                                     i << 16U, NULL);
-                       else if (i == 1)
-                               ret = smu_cmn_send_smc_msg_with_param(smu, enable ?
-                                                                     SMU_MSG_PowerUpVcn1 : SMU_MSG_PowerDownVcn1,
-                                                                     i << 16U, NULL);
-               } else {
+       if (smu->is_apu) {
+               if (inst == 0)
                        ret = smu_cmn_send_smc_msg_with_param(smu, enable ?
-                                                             SMU_MSG_PowerUpVcn : SMU_MSG_PowerDownVcn,
-                                                             i << 16U, NULL);
-               }
-
-               if (ret)
-                       return ret;
+                                                             SMU_MSG_PowerUpVcn0 : SMU_MSG_PowerDownVcn0,
+                                                             inst << 16U, NULL);
+               else if (inst == 1)
+                       ret = smu_cmn_send_smc_msg_with_param(smu, enable ?
+                                                             SMU_MSG_PowerUpVcn1 : SMU_MSG_PowerDownVcn1,
+                                                             inst << 16U, NULL);
+       } else {
+               ret = smu_cmn_send_smc_msg_with_param(smu, enable ?
+                                                     SMU_MSG_PowerUpVcn : SMU_MSG_PowerDownVcn,
+                                                     inst << 16U, NULL);
        }
 
        return ret;