aboutsummaryrefslogtreecommitdiffstats
path: root/meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.14.71/3167-drm-amdgpu-add-custom-power-policy-support-in-sysfs.patch
diff options
context:
space:
mode:
Diffstat (limited to 'meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.14.71/3167-drm-amdgpu-add-custom-power-policy-support-in-sysfs.patch')
-rw-r--r--meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.14.71/3167-drm-amdgpu-add-custom-power-policy-support-in-sysfs.patch194
1 files changed, 194 insertions, 0 deletions
diff --git a/meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.14.71/3167-drm-amdgpu-add-custom-power-policy-support-in-sysfs.patch b/meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.14.71/3167-drm-amdgpu-add-custom-power-policy-support-in-sysfs.patch
new file mode 100644
index 00000000..838ee4f1
--- /dev/null
+++ b/meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.14.71/3167-drm-amdgpu-add-custom-power-policy-support-in-sysfs.patch
@@ -0,0 +1,194 @@
+From d36df134e05d2efea3ba874644ace9c950e4589a Mon Sep 17 00:00:00 2001
+From: Rex Zhu <Rex.Zhu@amd.com>
+Date: Wed, 10 Jan 2018 18:42:36 +0800
+Subject: [PATCH 3167/4131] drm/amdgpu: add custom power policy support in
+ sysfs
+
+when cat pp_power_profile_mode on Vega10
+NUM MODE_NAME BUSY_SET_POINT FPS USE_RLC_BUSY MIN_ACTIVE_LEVEL
+ 0 3D_FULL_SCREEN : 70 60 1 3
+ 1 POWER_SAVING : 90 60 0 0
+ 2 VIDEO*: 70 60 0 0
+ 3 VR : 70 90 0 0
+ 4 COMPUTER : 30 60 0 6
+ 5 CUSTOM : 0 0 0 0
+
+the result show all the profile mode we can support and custom mode.
+user can echo the num(0-4) to pp_power_profile_mode to select the profile
+mode or can echo "5 value value value value" to enter CUSTOM mode.
+the four parameter is set_point/FPS/USER_RLC_BUSY/MIN_ACTIVE_LEVEL.
+
+Change-Id: I54d634ddf2e27473e1da3f02f15a3ccf43e54745
+Reviewed-by: Alex Deucher <alexander.deucher@amd.com>
+Signed-off-by: Rex Zhu <Rex.Zhu@amd.com>
+---
+ drivers/gpu/drm/amd/amdgpu/amdgpu_dpm.h | 8 +++
+ drivers/gpu/drm/amd/amdgpu/amdgpu_pm.c | 81 +++++++++++++++++++++++++-
+ drivers/gpu/drm/amd/include/kgd_pp_interface.h | 12 +++-
+ 3 files changed, 99 insertions(+), 2 deletions(-)
+
+diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_dpm.h b/drivers/gpu/drm/amd/amdgpu/amdgpu_dpm.h
+index 0a5febd..0937902 100644
+--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_dpm.h
++++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_dpm.h
+@@ -366,6 +366,14 @@ enum amdgpu_pcie_gen {
+ (adev)->powerplay.pp_handle, virtual_addr_low, \
+ virtual_addr_hi, mc_addr_low, mc_addr_hi, size)
+
++#define amdgpu_dpm_get_power_profile_mode(adev, buf) \
++ ((adev)->powerplay.pp_funcs->get_power_profile_mode(\
++ (adev)->powerplay.pp_handle, buf))
++
++#define amdgpu_dpm_set_power_profile_mode(adev, parameter, size) \
++ ((adev)->powerplay.pp_funcs->set_power_profile_mode(\
++ (adev)->powerplay.pp_handle, parameter, size))
++
+ struct amdgpu_dpm {
+ struct amdgpu_ps *ps;
+ /* number of valid power states */
+diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_pm.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_pm.c
+index 11f100e..45e9119 100644
+--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_pm.c
++++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_pm.c
+@@ -582,6 +582,73 @@ static ssize_t amdgpu_set_pp_mclk_od(struct device *dev,
+ return count;
+ }
+
++static ssize_t amdgpu_get_pp_power_profile_mode(struct device *dev,
++ struct device_attribute *attr,
++ char *buf)
++{
++ struct drm_device *ddev = dev_get_drvdata(dev);
++ struct amdgpu_device *adev = ddev->dev_private;
++
++ if (adev->powerplay.pp_funcs->get_power_profile_mode)
++ return amdgpu_dpm_get_power_profile_mode(adev, buf);
++
++ return snprintf(buf, PAGE_SIZE, "\n");
++}
++
++
++static ssize_t amdgpu_set_pp_power_profile_mode(struct device *dev,
++ struct device_attribute *attr,
++ const char *buf,
++ size_t count)
++{
++ int ret = 0xff;
++ struct drm_device *ddev = dev_get_drvdata(dev);
++ struct amdgpu_device *adev = ddev->dev_private;
++ uint32_t parameter_size = 0;
++ long parameter[64];
++ char *sub_str, buf_cpy[128];
++ char *tmp_str;
++ uint32_t i = 0;
++ char tmp[2];
++ long int profile_mode = 0;
++ const char delimiter[3] = {' ', '\n', '\0'};
++
++ tmp[0] = *(buf);
++ tmp[1] = '\0';
++ ret = kstrtol(tmp, 0, &profile_mode);
++ if (ret)
++ goto fail;
++
++ if (profile_mode == PP_SMC_POWER_PROFILE_CUSTOM) {
++ if (count < 2 || count > 127)
++ return -EINVAL;
++ while (isspace(*++buf))
++ i++;
++ memcpy(buf_cpy, buf, count-i);
++ tmp_str = buf_cpy;
++ while (tmp_str[0]) {
++ sub_str = strsep(&tmp_str, delimiter);
++ ret = kstrtol(sub_str, 0, &parameter[parameter_size]);
++ if (ret) {
++ count = -EINVAL;
++ goto fail;
++ }
++ pr_info("value is %ld \n", parameter[parameter_size]);
++ parameter_size++;
++ while (isspace(*tmp_str))
++ tmp_str++;
++ }
++ }
++ parameter[parameter_size] = profile_mode;
++ if (adev->powerplay.pp_funcs->set_power_profile_mode)
++ ret = amdgpu_dpm_set_power_profile_mode(adev, parameter, parameter_size);
++
++ if (!ret)
++ return count;
++fail:
++ return -EINVAL;
++}
++
+ static ssize_t amdgpu_get_pp_power_profile(struct device *dev,
+ char *buf, struct amd_pp_profile *query)
+ {
+@@ -770,7 +837,9 @@ static DEVICE_ATTR(pp_gfx_power_profile, S_IRUGO | S_IWUSR,
+ static DEVICE_ATTR(pp_compute_power_profile, S_IRUGO | S_IWUSR,
+ amdgpu_get_pp_compute_power_profile,
+ amdgpu_set_pp_compute_power_profile);
+-
++static DEVICE_ATTR(pp_power_profile_mode, S_IRUGO | S_IWUSR,
++ amdgpu_get_pp_power_profile_mode,
++ amdgpu_set_pp_power_profile_mode);
+ static ssize_t amdgpu_hwmon_show_temp(struct device *dev,
+ struct device_attribute *attr,
+ char *buf)
+@@ -1402,6 +1471,14 @@ int amdgpu_pm_sysfs_init(struct amdgpu_device *adev)
+ return ret;
+ }
+
++ ret = device_create_file(adev->dev,
++ &dev_attr_pp_power_profile_mode);
++ if (ret) {
++ DRM_ERROR("failed to create device file "
++ "pp_power_profile_mode\n");
++ return ret;
++ }
++
+ ret = amdgpu_debugfs_pm_init(adev);
+ if (ret) {
+ DRM_ERROR("Failed to register debugfs file for dpm!\n");
+@@ -1437,6 +1514,8 @@ void amdgpu_pm_sysfs_fini(struct amdgpu_device *adev)
+ &dev_attr_pp_gfx_power_profile);
+ device_remove_file(adev->dev,
+ &dev_attr_pp_compute_power_profile);
++ device_remove_file(adev->dev,
++ &dev_attr_pp_power_profile_mode);
+ }
+
+ void amdgpu_pm_compute_clocks(struct amdgpu_device *adev)
+diff --git a/drivers/gpu/drm/amd/include/kgd_pp_interface.h b/drivers/gpu/drm/amd/include/kgd_pp_interface.h
+index 0f89d2a8..1746180 100644
+--- a/drivers/gpu/drm/amd/include/kgd_pp_interface.h
++++ b/drivers/gpu/drm/amd/include/kgd_pp_interface.h
+@@ -140,7 +140,15 @@ struct amd_pp_init {
+ uint32_t feature_mask;
+ };
+
+-
++enum PP_SMC_POWER_PROFILE {
++ PP_SMC_POWER_PROFILE_FULLSCREEN3D = 0x0,
++ PP_SMC_POWER_PROFILE_POWERSAVING = 0x1,
++ PP_SMC_POWER_PROFILE_VIDEO = 0x2,
++ PP_SMC_POWER_PROFILE_VR = 0x3,
++ PP_SMC_POWER_PROFILE_COMPUTE = 0x4,
++ PP_SMC_POWER_PROFILE_CUSTOM = 0x5,
++ PP_SMC_POWER_PROFILE_AUTO = 0x6,
++};
+
+ enum {
+ PP_GROUP_UNKNOWN = 0,
+@@ -289,6 +297,8 @@ struct amd_pm_funcs {
+ struct pp_display_clock_request *clock);
+ int (*get_display_mode_validation_clocks)(void *handle,
+ struct amd_pp_simple_clock_info *clocks);
++ int (*get_power_profile_mode)(void *handle, char *buf);
++ int (*set_power_profile_mode)(void *handle, long *input, uint32_t size);
+ };
+
+ #endif
+--
+2.7.4
+