[PATCH] drm/amdgpu: register pm sysfs for sriov
Alex Deucher
alexdeucher at gmail.com
Thu Jun 6 02:27:50 UTC 2019
On Wed, Jun 5, 2019 at 9:54 AM Yintian Tao <yttao at amd.com> wrote:
>
> we need register pm sysfs for virt in order
> to support dpm level modification because
> smu ip block will not be added under SRIOV
>
> Signed-off-by: Yintian Tao <yttao at amd.com>
> Change-Id: Ib0e13934c0c33da00f9d2add6be25a373c6fb957
> ---
> drivers/gpu/drm/amd/amdgpu/amdgpu_device.c | 6 +++
> drivers/gpu/drm/amd/amdgpu/amdgpu_pm.c | 61 ++++++++++++++++++++++++++++--
> drivers/gpu/drm/amd/amdgpu/amdgpu_pm.h | 2 +
> 3 files changed, 65 insertions(+), 4 deletions(-)
>
> diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c
> index d00fd5d..9b9d387 100644
> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c
> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c
> @@ -2695,6 +2695,9 @@ int amdgpu_device_init(struct amdgpu_device *adev,
>
> amdgpu_fbdev_init(adev);
>
> + if (amdgpu_sriov_vf(adev) && amdgim_is_hwperf(adev))
> + amdgpu_virt_pm_sysfs_init(adev);
> +
> r = amdgpu_pm_sysfs_init(adev);
> if (r)
> DRM_ERROR("registering pm debugfs failed (%d).\n", r);
> @@ -2816,6 +2819,9 @@ void amdgpu_device_fini(struct amdgpu_device *adev)
> iounmap(adev->rmmio);
> adev->rmmio = NULL;
> amdgpu_device_doorbell_fini(adev);
> + if (amdgpu_sriov_vf(adev) && amdgim_is_hwperf(adev))
> + amdgpu_virt_pm_sysfs_fini(adev);
> +
> amdgpu_debugfs_regs_cleanup(adev);
> device_remove_file(adev->dev, &dev_attr_pcie_replay_count);
> amdgpu_ucode_sysfs_fini(adev);
> diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_pm.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_pm.c
> index a73e190..b6f16d45 100644
> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_pm.c
> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_pm.c
> @@ -269,8 +269,11 @@ static ssize_t amdgpu_get_dpm_forced_performance_level(struct device *dev,
> struct amdgpu_device *adev = ddev->dev_private;
> enum amd_dpm_forced_level level = 0xff;
>
> - if ((adev->flags & AMD_IS_PX) &&
> - (ddev->switch_power_state != DRM_SWITCH_POWER_ON))
> + if (amdgpu_sriov_vf(adev))
> + return 0;
> +
> + if ((adev->flags & AMD_IS_PX) &&
> + (ddev->switch_power_state != DRM_SWITCH_POWER_ON))
> return snprintf(buf, PAGE_SIZE, "off\n");
>
> if (is_support_sw_smu(adev))
> @@ -308,9 +311,11 @@ static ssize_t amdgpu_set_dpm_forced_performance_level(struct device *dev,
> (ddev->switch_power_state != DRM_SWITCH_POWER_ON))
> return -EINVAL;
>
> - if (is_support_sw_smu(adev))
> + if (!amdgpu_sriov_vf(adev) && is_support_sw_smu(adev))
> current_level = smu_get_performance_level(&adev->smu);
> - else if (adev->powerplay.pp_funcs->get_performance_level)
> + else if (!amdgpu_sriov_vf(adev) &&
> + adev->powerplay.pp_funcs &&
> + adev->powerplay.pp_funcs->get_performance_level)
> current_level = amdgpu_dpm_get_performance_level(adev);
Wrap the entire existing block in if (!amdgpu_sriov_vf(adev) rather
than adding the check to each case.
>
> if (strncmp("low", buf, strlen("low")) == 0) {
> @@ -907,6 +912,10 @@ static ssize_t amdgpu_get_pp_dpm_mclk(struct device *dev,
> struct drm_device *ddev = dev_get_drvdata(dev);
> struct amdgpu_device *adev = ddev->dev_private;
>
> + if (amdgpu_sriov_vf(adev) && amdgim_is_hwperf(adev) &&
> + adev->virt.ops->get_pp_clk)
> + return adev->virt.ops->get_pp_clk(adev,PP_MCLK,buf);
> +
> if (is_support_sw_smu(adev))
> return smu_print_clk_levels(&adev->smu, PP_MCLK, buf);
> else if (adev->powerplay.pp_funcs->print_clock_levels)
> @@ -925,6 +934,9 @@ static ssize_t amdgpu_set_pp_dpm_mclk(struct device *dev,
> int ret;
> uint32_t mask = 0;
>
> + if (amdgpu_sriov_vf(adev))
> + return 0;
> +
> ret = amdgpu_read_mask(buf, count, &mask);
> if (ret)
> return ret;
> @@ -965,6 +977,9 @@ static ssize_t amdgpu_set_pp_dpm_socclk(struct device *dev,
> int ret;
> uint32_t mask = 0;
>
> + if (amdgpu_sriov_vf(adev))
> + return 0;
> +
> ret = amdgpu_read_mask(buf, count, &mask);
> if (ret)
> return ret;
> @@ -2698,6 +2713,44 @@ void amdgpu_pm_print_power_states(struct amdgpu_device *adev)
>
> }
>
> +int amdgpu_virt_pm_sysfs_init(struct amdgpu_device *adev)
Please rename this to amdgpu_pm_virt_sysfs_init to match the rest of
the naming conventions in the file.
> +{
> + int ret = 0;
> +
> + if (!(amdgpu_sriov_vf(adev) && amdgim_is_hwperf(adev)))
> + return ret;
> +
> + ret = device_create_file(adev->dev, &dev_attr_pp_dpm_sclk);
> + if (ret) {
> + DRM_ERROR("failed to create device file pp_dpm_sclk\n");
> + return ret;
> + }
> +
> + ret = device_create_file(adev->dev, &dev_attr_pp_dpm_mclk);
> + if (ret) {
> + DRM_ERROR("failed to create device file pp_dpm_mclk\n");
> + return ret;
> + }
> +
> + ret = device_create_file(adev->dev, &dev_attr_power_dpm_force_performance_level);
> + if (ret) {
> + DRM_ERROR("failed to create device file for dpm state\n");
> + return ret;
> + }
> +
> + return ret;
> +}
> +
> +void amdgpu_virt_pm_sysfs_fini(struct amdgpu_device *adev)
Same comment here. amdgpu_pm_virt_sysfs_fini.
With the above comments fixed, the patch is:
Reviewed-by: Alex Deucher <alexander.deucher at amd.com>
> +{
> + if (!(amdgpu_sriov_vf(adev) && amdgim_is_hwperf(adev)))
> + return;
> +
> + device_remove_file(adev->dev, &dev_attr_power_dpm_force_performance_level);
> + device_remove_file(adev->dev, &dev_attr_pp_dpm_sclk);
> + device_remove_file(adev->dev, &dev_attr_pp_dpm_mclk);
> +}
> +
> int amdgpu_pm_sysfs_init(struct amdgpu_device *adev)
> {
> struct pp_hwmgr *hwmgr = adev->powerplay.pp_handle;
> diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_pm.h b/drivers/gpu/drm/amd/amdgpu/amdgpu_pm.h
> index f21a771..6bb7bfa 100644
> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_pm.h
> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_pm.h
> @@ -32,7 +32,9 @@ struct cg_flag_name
>
> void amdgpu_pm_acpi_event_handler(struct amdgpu_device *adev);
> int amdgpu_pm_sysfs_init(struct amdgpu_device *adev);
> +int amdgpu_virt_pm_sysfs_init(struct amdgpu_device *adev);
> void amdgpu_pm_sysfs_fini(struct amdgpu_device *adev);
> +void amdgpu_virt_pm_sysfs_fini(struct amdgpu_device *adev);
> void amdgpu_pm_print_power_states(struct amdgpu_device *adev);
> void amdgpu_pm_compute_clocks(struct amdgpu_device *adev);
> void amdgpu_dpm_thermal_work_handler(struct work_struct *work);
> --
> 2.7.4
>
> _______________________________________________
> amd-gfx mailing list
> amd-gfx at lists.freedesktop.org
> https://lists.freedesktop.org/mailman/listinfo/amd-gfx
More information about the amd-gfx
mailing list