aboutsummaryrefslogtreecommitdiffstats
path: root/meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.19.8/2091-drm-amdgpu-register-pm-sysfs-for-sriov.patch
diff options
context:
space:
mode:
Diffstat (limited to 'meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.19.8/2091-drm-amdgpu-register-pm-sysfs-for-sriov.patch')
-rw-r--r--meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.19.8/2091-drm-amdgpu-register-pm-sysfs-for-sriov.patch169
1 files changed, 169 insertions, 0 deletions
diff --git a/meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.19.8/2091-drm-amdgpu-register-pm-sysfs-for-sriov.patch b/meta-amd-bsp/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/meta-amd-bsp/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
+