diff options
Diffstat (limited to 'common/recipes-kernel/linux/linux-yocto-4.19.8/2091-drm-amdgpu-register-pm-sysfs-for-sriov.patch')
-rw-r--r-- | common/recipes-kernel/linux/linux-yocto-4.19.8/2091-drm-amdgpu-register-pm-sysfs-for-sriov.patch | 169 |
1 files changed, 169 insertions, 0 deletions
diff --git a/common/recipes-kernel/linux/linux-yocto-4.19.8/2091-drm-amdgpu-register-pm-sysfs-for-sriov.patch b/common/recipes-kernel/linux/linux-yocto-4.19.8/2091-drm-amdgpu-register-pm-sysfs-for-sriov.patch new file mode 100644 index 00000000..c468589b --- /dev/null +++ b/common/recipes-kernel/linux/linux-yocto-4.19.8/2091-drm-amdgpu-register-pm-sysfs-for-sriov.patch @@ -0,0 +1,169 @@ +From 9afac599fef2cb427413b4bf5c9ed733edf3122f Mon Sep 17 00:00:00 2001 +From: Yintian Tao <yttao@amd.com> +Date: Wed, 5 Jun 2019 20:40:08 +0800 +Subject: [PATCH 2091/2940] drm/amdgpu: register pm sysfs for sriov + +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@amd.com> +Reviewed-by: Alex Deucher <alexander.deucher@amd.com> +--- + drivers/gpu/drm/amd/amdgpu/amdgpu_device.c | 6 ++ + drivers/gpu/drm/amd/amdgpu/amdgpu_pm.c | 65 ++++++++++++++++++++-- + drivers/gpu/drm/amd/amdgpu/amdgpu_pm.h | 2 + + 3 files changed, 67 insertions(+), 6 deletions(-) + +diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c +index 7b6d600ffc2c..f91247952fc9 100644 +--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c ++++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c +@@ -2740,6 +2740,9 @@ int amdgpu_device_init(struct amdgpu_device *adev, + + amdgpu_fbdev_init(adev); + ++ if (amdgpu_sriov_vf(adev) && amdgim_is_hwperf(adev)) ++ amdgpu_pm_virt_sysfs_init(adev); ++ + r = amdgpu_pm_sysfs_init(adev); + if (r) + DRM_ERROR("registering pm debugfs failed (%d).\n", r); +@@ -2861,6 +2864,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_pm_virt_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 d8828a37e43a..3d02eef4a1c8 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,10 +311,12 @@ 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)) +- current_level = smu_get_performance_level(&adev->smu); +- else if (adev->powerplay.pp_funcs->get_performance_level) +- current_level = amdgpu_dpm_get_performance_level(adev); ++ if (!amdgpu_sriov_vf(adev)) { ++ if (is_support_sw_smu(adev)) ++ current_level = smu_get_performance_level(&adev->smu); ++ else if (adev->powerplay.pp_funcs->get_performance_level) ++ current_level = amdgpu_dpm_get_performance_level(adev); ++ } + + if (strncmp("low", buf, strlen("low")) == 0) { + level = AMD_DPM_FORCED_LEVEL_LOW; +@@ -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_pm_virt_sysfs_init(struct amdgpu_device *adev) ++{ ++ 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_pm_virt_sysfs_fini(struct amdgpu_device *adev) ++{ ++ 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_load_smu_firmware(struct amdgpu_device *adev, uint32_t *smu_version) + { + int r = -EINVAL; +diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_pm.h b/drivers/gpu/drm/amd/amdgpu/amdgpu_pm.h +index 7ff0e7621fff..ef31448ee8d8 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_pm_virt_sysfs_init(struct amdgpu_device *adev); + void amdgpu_pm_sysfs_fini(struct amdgpu_device *adev); ++void amdgpu_pm_virt_sysfs_fini(struct amdgpu_device *adev); + void amdgpu_pm_print_power_states(struct amdgpu_device *adev); + int amdgpu_pm_load_smu_firmware(struct amdgpu_device *adev, uint32_t *smu_version); + void amdgpu_pm_compute_clocks(struct amdgpu_device *adev); +-- +2.17.1 + |