Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

drm/amd/pm: add inst to smu_dpm_set_vcn_enable

First, add an instance parameter to smu_dpm_set_vcn_enable() function,
and calling dpm_set_vcn_enable() with this given instance.

Second, modify vcn_gated to be an array, to track the gating status
for each vcn instance separately.

With these 2 changes, smu_dpm_set_vcn_enable() will check and set the
gating status for the given vcn instance ONLY.

v2: remove duplicated functions.

remove for-loop in dpm_set_vcn_enable(), and temporarily move it to
to smu_dpm_set_power_gate(), in order to keep the exact same logic as
before, until further separation in next patch.

v3: add instance number in error message.

v4: declaring i at the top of the function.

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>

authored by

Boyuan Zhang and committed by
Alex Deucher
15df736a 8aaf1667

+47 -30
+46 -29
drivers/gpu/drm/amd/pm/swsmu/amdgpu_smu.c
··· 238 238 } 239 239 240 240 static int smu_dpm_set_vcn_enable(struct smu_context *smu, 241 - bool enable) 241 + bool enable, 242 + int inst) 242 243 { 243 244 struct smu_power_context *smu_power = &smu->smu_power; 244 245 struct smu_power_gate *power_gate = &smu_power->power_gate; 245 - struct amdgpu_device *adev = smu->adev; 246 246 int ret = 0; 247 247 248 248 /* ··· 254 254 if (!smu->ppt_funcs->dpm_set_vcn_enable) 255 255 return 0; 256 256 257 - if (atomic_read(&power_gate->vcn_gated) ^ enable) 257 + if (atomic_read(&power_gate->vcn_gated[inst]) ^ enable) 258 258 return 0; 259 259 260 - for (int i = 0; i < adev->vcn.num_vcn_inst; i++) { 261 - ret = smu->ppt_funcs->dpm_set_vcn_enable(smu, enable, i); 262 - if (ret) 263 - return ret; 264 - } 260 + ret = smu->ppt_funcs->dpm_set_vcn_enable(smu, enable, inst); 261 + if (!ret) 262 + atomic_set(&power_gate->vcn_gated[inst], !enable); 265 263 266 264 return ret; 267 265 } ··· 361 363 bool gate) 362 364 { 363 365 struct smu_context *smu = handle; 364 - int ret = 0; 366 + struct amdgpu_device *adev = smu->adev; 367 + int i, ret = 0; 365 368 366 369 if (!smu->pm_enabled || !smu->adev->pm.dpm_enabled) { 367 370 dev_WARN(smu->adev->dev, ··· 378 379 */ 379 380 case AMD_IP_BLOCK_TYPE_UVD: 380 381 case AMD_IP_BLOCK_TYPE_VCN: 381 - ret = smu_dpm_set_vcn_enable(smu, !gate); 382 - if (ret) 383 - dev_err(smu->adev->dev, "Failed to power %s VCN!\n", 384 - gate ? "gate" : "ungate"); 382 + for (i = 0; i < adev->vcn.num_vcn_inst; i++) { 383 + ret = smu_dpm_set_vcn_enable(smu, !gate, i); 384 + if (ret) 385 + dev_err(smu->adev->dev, "Failed to power %s VCN instance %d!\n", 386 + gate ? "gate" : "ungate", i); 387 + } 385 388 break; 386 389 case AMD_IP_BLOCK_TYPE_GFX: 387 390 ret = smu_gfx_off_control(smu, gate); ··· 786 785 struct amdgpu_device *adev = smu->adev; 787 786 struct smu_power_context *smu_power = &smu->smu_power; 788 787 struct smu_power_gate *power_gate = &smu_power->power_gate; 789 - int vcn_gate, jpeg_gate; 788 + int vcn_gate[AMDGPU_MAX_VCN_INSTANCES], jpeg_gate, i; 790 789 int ret = 0; 791 790 792 791 if (!smu->ppt_funcs->set_default_dpm_table) 793 792 return 0; 794 793 795 - if (adev->pg_flags & AMD_PG_SUPPORT_VCN) 796 - vcn_gate = atomic_read(&power_gate->vcn_gated); 794 + if (adev->pg_flags & AMD_PG_SUPPORT_VCN) { 795 + for (i = 0; i < adev->vcn.num_vcn_inst; i++) 796 + vcn_gate[i] = atomic_read(&power_gate->vcn_gated[i]); 797 + } 797 798 if (adev->pg_flags & AMD_PG_SUPPORT_JPEG) 798 799 jpeg_gate = atomic_read(&power_gate->jpeg_gated); 799 800 800 801 if (adev->pg_flags & AMD_PG_SUPPORT_VCN) { 801 - ret = smu_dpm_set_vcn_enable(smu, true); 802 - if (ret) 803 - return ret; 802 + for (i = 0; i < adev->vcn.num_vcn_inst; i++) { 803 + ret = smu_dpm_set_vcn_enable(smu, true, i); 804 + if (ret) 805 + return ret; 806 + } 804 807 } 805 808 806 809 if (adev->pg_flags & AMD_PG_SUPPORT_JPEG) { ··· 821 816 if (adev->pg_flags & AMD_PG_SUPPORT_JPEG) 822 817 smu_dpm_set_jpeg_enable(smu, !jpeg_gate); 823 818 err_out: 824 - if (adev->pg_flags & AMD_PG_SUPPORT_VCN) 825 - smu_dpm_set_vcn_enable(smu, !vcn_gate); 819 + if (adev->pg_flags & AMD_PG_SUPPORT_VCN) { 820 + for (i = 0; i < adev->vcn.num_vcn_inst; i++) 821 + smu_dpm_set_vcn_enable(smu, !vcn_gate[i], i); 822 + } 826 823 827 824 return ret; 828 825 } ··· 1278 1271 { 1279 1272 struct amdgpu_device *adev = ip_block->adev; 1280 1273 struct smu_context *smu = adev->powerplay.pp_handle; 1281 - int ret; 1274 + int i, ret; 1282 1275 1283 1276 smu->pool_size = adev->pm.smu_prv_buffer_size; 1284 1277 smu->smu_feature.feature_num = SMU_FEATURE_MAX; ··· 1290 1283 atomic64_set(&smu->throttle_int_counter, 0); 1291 1284 smu->watermarks_bitmap = 0; 1292 1285 1293 - atomic_set(&smu->smu_power.power_gate.vcn_gated, 1); 1286 + for (i = 0; i < adev->vcn.num_vcn_inst; i++) 1287 + atomic_set(&smu->smu_power.power_gate.vcn_gated[i], 1); 1294 1288 atomic_set(&smu->smu_power.power_gate.jpeg_gated, 1); 1295 1289 atomic_set(&smu->smu_power.power_gate.vpe_gated, 1); 1296 1290 atomic_set(&smu->smu_power.power_gate.umsch_mm_gated, 1); ··· 1821 1813 1822 1814 static int smu_hw_init(struct amdgpu_ip_block *ip_block) 1823 1815 { 1824 - int ret; 1816 + int i, ret; 1825 1817 struct amdgpu_device *adev = ip_block->adev; 1826 1818 struct smu_context *smu = adev->powerplay.pp_handle; 1827 1819 ··· 1847 1839 ret = smu_set_gfx_imu_enable(smu); 1848 1840 if (ret) 1849 1841 return ret; 1850 - smu_dpm_set_vcn_enable(smu, true); 1842 + for (i = 0; i < adev->vcn.num_vcn_inst; i++) 1843 + smu_dpm_set_vcn_enable(smu, true, i); 1851 1844 smu_dpm_set_jpeg_enable(smu, true); 1852 1845 smu_dpm_set_vpe_enable(smu, true); 1853 1846 smu_dpm_set_umsch_mm_enable(smu, true); ··· 2046 2037 { 2047 2038 struct amdgpu_device *adev = ip_block->adev; 2048 2039 struct smu_context *smu = adev->powerplay.pp_handle; 2049 - int ret; 2040 + int i, ret; 2050 2041 2051 2042 if (amdgpu_sriov_vf(adev) && !amdgpu_sriov_is_pp_one_vf(adev)) 2052 2043 return 0; 2053 2044 2054 - smu_dpm_set_vcn_enable(smu, false); 2045 + for (i = 0; i < adev->vcn.num_vcn_inst; i++) 2046 + smu_dpm_set_vcn_enable(smu, false, i); 2055 2047 smu_dpm_set_jpeg_enable(smu, false); 2056 2048 smu_dpm_set_vpe_enable(smu, false); 2057 2049 smu_dpm_set_umsch_mm_enable(smu, false); ··· 2992 2982 int *size_arg) 2993 2983 { 2994 2984 struct smu_context *smu = handle; 2985 + struct amdgpu_device *adev = smu->adev; 2995 2986 struct smu_umd_pstate_table *pstate_table = 2996 2987 &smu->pstate_table; 2997 - int ret = 0; 2988 + int i, ret = 0; 2998 2989 uint32_t *size, size_val; 2999 2990 3000 2991 if (!smu->pm_enabled || !smu->adev->pm.dpm_enabled) ··· 3041 3030 *size = 4; 3042 3031 break; 3043 3032 case AMDGPU_PP_SENSOR_VCN_POWER_STATE: 3044 - *(uint32_t *)data = atomic_read(&smu->smu_power.power_gate.vcn_gated) ? 0 : 1; 3033 + *(uint32_t *)data = 0; 3034 + for (i = 0; i < adev->vcn.num_vcn_inst; i++) { 3035 + if (!atomic_read(&smu->smu_power.power_gate.vcn_gated[i])) { 3036 + *(uint32_t *)data = 1; 3037 + break; 3038 + } 3039 + } 3045 3040 *size = 4; 3046 3041 break; 3047 3042 case AMDGPU_PP_SENSOR_MIN_FAN_RPM:
+1 -1
drivers/gpu/drm/amd/pm/swsmu/inc/amdgpu_smu.h
··· 399 399 struct smu_power_gate { 400 400 bool uvd_gated; 401 401 bool vce_gated; 402 - atomic_t vcn_gated; 402 + atomic_t vcn_gated[AMDGPU_MAX_VCN_INSTANCES]; 403 403 atomic_t jpeg_gated; 404 404 atomic_t vpe_gated; 405 405 atomic_t umsch_mm_gated;