On Thu, Oct 24, 2024 at 11:18 PM <boyuan.zhang@xxxxxxx> wrote: > > From: Boyuan Zhang <boyuan.zhang@xxxxxxx> > > Add an instance parameter to set_powergating_by_smu() function, and > re-write all amd_pm functions accordingly. Then use the instance to > call smu_dpm_set_vcn_enable(). > > v2: remove duplicated functions. > > remove for-loop in smu_dpm_set_power_gate(), and temporarily move it to > to amdgpu_dpm_set_powergating_by_smu(), in order to keep the exact same > logic as before, until further separation in next patch. > > v3: add instance number in error message. > > Signed-off-by: Boyuan Zhang <boyuan.zhang@xxxxxxx> > Acked-by: Christian König <christian.koenig@xxxxxxx> Reviewed-by: Alex Deucher <alexander.deucher@xxxxxxx> > --- > drivers/gpu/drm/amd/include/kgd_pp_interface.h | 4 +++- > drivers/gpu/drm/amd/pm/amdgpu_dpm.c | 10 ++++++++-- > drivers/gpu/drm/amd/pm/legacy-dpm/kv_dpm.c | 4 +++- > drivers/gpu/drm/amd/pm/powerplay/amd_powerplay.c | 4 +++- > drivers/gpu/drm/amd/pm/swsmu/amdgpu_smu.c | 14 ++++++-------- > 5 files changed, 23 insertions(+), 13 deletions(-) > > diff --git a/drivers/gpu/drm/amd/include/kgd_pp_interface.h b/drivers/gpu/drm/amd/include/kgd_pp_interface.h > index 2fa71f68205e..f24bc61df9a7 100644 > --- a/drivers/gpu/drm/amd/include/kgd_pp_interface.h > +++ b/drivers/gpu/drm/amd/include/kgd_pp_interface.h > @@ -405,7 +405,9 @@ struct amd_pm_funcs { > int (*load_firmware)(void *handle); > int (*wait_for_fw_loading_complete)(void *handle); > int (*set_powergating_by_smu)(void *handle, > - uint32_t block_type, bool gate); > + uint32_t block_type, > + 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 (*get_power_limit)(void *handle, uint32_t *limit, > diff --git a/drivers/gpu/drm/amd/pm/amdgpu_dpm.c b/drivers/gpu/drm/amd/pm/amdgpu_dpm.c > index 9dc82f4d7c93..bcedbeec082f 100644 > --- a/drivers/gpu/drm/amd/pm/amdgpu_dpm.c > +++ b/drivers/gpu/drm/amd/pm/amdgpu_dpm.c > @@ -88,7 +88,6 @@ int amdgpu_dpm_set_powergating_by_smu(struct amdgpu_device *adev, uint32_t block > case AMD_IP_BLOCK_TYPE_UVD: > case AMD_IP_BLOCK_TYPE_VCE: > case AMD_IP_BLOCK_TYPE_GFX: > - case AMD_IP_BLOCK_TYPE_VCN: > case AMD_IP_BLOCK_TYPE_SDMA: > case AMD_IP_BLOCK_TYPE_JPEG: > case AMD_IP_BLOCK_TYPE_GMC: > @@ -96,7 +95,14 @@ int amdgpu_dpm_set_powergating_by_smu(struct amdgpu_device *adev, uint32_t block > case AMD_IP_BLOCK_TYPE_VPE: > if (pp_funcs && pp_funcs->set_powergating_by_smu) > ret = (pp_funcs->set_powergating_by_smu( > - (adev)->powerplay.pp_handle, block_type, gate)); > + (adev)->powerplay.pp_handle, block_type, gate, 0)); > + break; > + case AMD_IP_BLOCK_TYPE_VCN: > + if (pp_funcs && pp_funcs->set_powergating_by_smu) { > + for (int i = 0; i < adev->vcn.num_vcn_inst; i++) > + ret = (pp_funcs->set_powergating_by_smu( > + (adev)->powerplay.pp_handle, block_type, gate, i)); > + } > break; > default: > break; > diff --git a/drivers/gpu/drm/amd/pm/legacy-dpm/kv_dpm.c b/drivers/gpu/drm/amd/pm/legacy-dpm/kv_dpm.c > index 8908646ad620..f0f81ecd9ad6 100644 > --- a/drivers/gpu/drm/amd/pm/legacy-dpm/kv_dpm.c > +++ b/drivers/gpu/drm/amd/pm/legacy-dpm/kv_dpm.c > @@ -3276,7 +3276,9 @@ static int kv_dpm_read_sensor(void *handle, int idx, > } > > static int kv_set_powergating_by_smu(void *handle, > - uint32_t block_type, bool gate) > + uint32_t block_type, > + bool gate, > + int inst) > { > switch (block_type) { > case AMD_IP_BLOCK_TYPE_UVD: > diff --git a/drivers/gpu/drm/amd/pm/powerplay/amd_powerplay.c b/drivers/gpu/drm/amd/pm/powerplay/amd_powerplay.c > index 26624a716fc6..90500b419d60 100644 > --- a/drivers/gpu/drm/amd/pm/powerplay/amd_powerplay.c > +++ b/drivers/gpu/drm/amd/pm/powerplay/amd_powerplay.c > @@ -1227,7 +1227,9 @@ static void pp_dpm_powergate_sdma(void *handle, bool gate) > } > > static int pp_set_powergating_by_smu(void *handle, > - uint32_t block_type, bool gate) > + uint32_t block_type, > + bool gate, > + int inst) > { > int ret = 0; > > diff --git a/drivers/gpu/drm/amd/pm/swsmu/amdgpu_smu.c b/drivers/gpu/drm/amd/pm/swsmu/amdgpu_smu.c > index bb7980f48674..c5ef8806dbb3 100644 > --- a/drivers/gpu/drm/amd/pm/swsmu/amdgpu_smu.c > +++ b/drivers/gpu/drm/amd/pm/swsmu/amdgpu_smu.c > @@ -354,10 +354,10 @@ static int smu_set_mall_enable(struct smu_context *smu) > */ > static int smu_dpm_set_power_gate(void *handle, > uint32_t block_type, > - bool gate) > + bool gate, > + int inst) > { > struct smu_context *smu = handle; > - struct amdgpu_device *adev = smu->adev; > int ret = 0; > > if (!smu->pm_enabled || !smu->adev->pm.dpm_enabled) { > @@ -374,12 +374,10 @@ static int smu_dpm_set_power_gate(void *handle, > */ > case AMD_IP_BLOCK_TYPE_UVD: > case AMD_IP_BLOCK_TYPE_VCN: > - for (int i = 0; i < adev->vcn.num_vcn_inst; i++) { > - ret = smu_dpm_set_vcn_enable(smu, !gate, i); > - if (ret) > - dev_err(smu->adev->dev, "Failed to power %s VCN instance %d!\n", > - gate ? "gate" : "ungate", i); > - } > + ret = smu_dpm_set_vcn_enable(smu, !gate, inst); > + if (ret) > + dev_err(smu->adev->dev, "Failed to power %s VCN instance %d!\n", > + gate ? "gate" : "ungate", inst); > break; > case AMD_IP_BLOCK_TYPE_GFX: > ret = smu_gfx_off_control(smu, gate); > -- > 2.34.1 >