aboutsummaryrefslogtreecommitdiffstats
path: root/meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.14.71/3168-drm-amd-pp-Add-custom-power-profile-mode-support-on-.patch
diff options
context:
space:
mode:
Diffstat (limited to 'meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.14.71/3168-drm-amd-pp-Add-custom-power-profile-mode-support-on-.patch')
-rw-r--r--meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.14.71/3168-drm-amd-pp-Add-custom-power-profile-mode-support-on-.patch224
1 files changed, 224 insertions, 0 deletions
diff --git a/meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.14.71/3168-drm-amd-pp-Add-custom-power-profile-mode-support-on-.patch b/meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.14.71/3168-drm-amd-pp-Add-custom-power-profile-mode-support-on-.patch
new file mode 100644
index 00000000..ceb26f80
--- /dev/null
+++ b/meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.14.71/3168-drm-amd-pp-Add-custom-power-profile-mode-support-on-.patch
@@ -0,0 +1,224 @@
+From 1d945c8fd61417f055d2494fdbc2eaadafd468a7 Mon Sep 17 00:00:00 2001
+From: Rex Zhu <Rex.Zhu@amd.com>
+Date: Wed, 10 Jan 2018 18:48:06 +0800
+Subject: [PATCH 3168/4131] drm/amd/pp: Add custom power profile mode support
+ on Vega10
+
+v2: delete uncessary blank line.
+ Add static const modifiers to an array
+
+Change-Id: Ib37b73baba0275e3c7ef9fcfe66ca76279c2804b
+Reviewed-by: Alex Deucher <alexander.deucher@amd.com>
+Signed-off-by: Rex Zhu <Rex.Zhu@amd.com>
+---
+ drivers/gpu/drm/amd/powerplay/amd_powerplay.c | 38 ++++++++++
+ drivers/gpu/drm/amd/powerplay/hwmgr/vega10_hwmgr.c | 81 ++++++++++++++++++++++
+ drivers/gpu/drm/amd/powerplay/hwmgr/vega10_hwmgr.h | 1 +
+ drivers/gpu/drm/amd/powerplay/inc/hwmgr.h | 3 +
+ 4 files changed, 123 insertions(+)
+
+diff --git a/drivers/gpu/drm/amd/powerplay/amd_powerplay.c b/drivers/gpu/drm/amd/powerplay/amd_powerplay.c
+index eb5de2ef..4131180 100644
+--- a/drivers/gpu/drm/amd/powerplay/amd_powerplay.c
++++ b/drivers/gpu/drm/amd/powerplay/amd_powerplay.c
+@@ -1081,6 +1081,42 @@ static int pp_dpm_get_power_profile_state(void *handle,
+ return 0;
+ }
+
++static int pp_get_power_profile_mode(void *handle, char *buf)
++{
++ struct pp_hwmgr *hwmgr;
++ struct pp_instance *pp_handle = (struct pp_instance *)handle;
++
++ if (!buf || pp_check(pp_handle))
++ return -EINVAL;
++
++ hwmgr = pp_handle->hwmgr;
++
++ if (hwmgr->hwmgr_func->get_power_profile_mode == NULL) {
++ pr_info("%s was not implemented.\n", __func__);
++ return snprintf(buf, PAGE_SIZE, "\n");
++ }
++
++ return hwmgr->hwmgr_func->get_power_profile_mode(hwmgr, buf);
++}
++
++static int pp_set_power_profile_mode(void *handle, long *input, uint32_t size)
++{
++ struct pp_hwmgr *hwmgr;
++ struct pp_instance *pp_handle = (struct pp_instance *)handle;
++
++ if (pp_check(pp_handle))
++ return -EINVAL;
++
++ hwmgr = pp_handle->hwmgr;
++
++ if (hwmgr->hwmgr_func->set_power_profile_mode == NULL) {
++ pr_info("%s was not implemented.\n", __func__);
++ return -EINVAL;
++ }
++
++ return hwmgr->hwmgr_func->set_power_profile_mode(hwmgr, input, size);
++}
++
+ static int pp_dpm_set_power_profile_state(void *handle,
+ struct amd_pp_profile *request)
+ {
+@@ -1465,6 +1501,8 @@ const struct amd_pm_funcs pp_dpm_funcs = {
+ .switch_power_profile = pp_dpm_switch_power_profile,
+ .set_clockgating_by_smu = pp_set_clockgating_by_smu,
+ .notify_smu_memory_info = pp_dpm_notify_smu_memory_info,
++ .get_power_profile_mode = pp_get_power_profile_mode,
++ .set_power_profile_mode = pp_set_power_profile_mode,
+ /* export to DC */
+ .get_sclk = pp_dpm_get_sclk,
+ .get_mclk = pp_dpm_get_mclk,
+diff --git a/drivers/gpu/drm/amd/powerplay/hwmgr/vega10_hwmgr.c b/drivers/gpu/drm/amd/powerplay/hwmgr/vega10_hwmgr.c
+index d1671e2..62e7f91 100644
+--- a/drivers/gpu/drm/amd/powerplay/hwmgr/vega10_hwmgr.c
++++ b/drivers/gpu/drm/amd/powerplay/hwmgr/vega10_hwmgr.c
+@@ -760,6 +760,8 @@ static int vega10_hwmgr_backend_init(struct pp_hwmgr *hwmgr)
+
+ hwmgr->backend = data;
+
++ hwmgr->power_profile_mode = PP_SMC_POWER_PROFILE_VIDEO;
++
+ vega10_set_default_registry_data(hwmgr);
+
+ data->disable_dpm_mask = 0xff;
+@@ -3966,6 +3968,7 @@ static int vega10_read_sensor(struct pp_hwmgr *hwmgr, int idx,
+ ret = -EINVAL;
+ break;
+ }
++
+ return ret;
+ }
+
+@@ -5024,6 +5027,82 @@ static int vega10_register_thermal_interrupt(struct pp_hwmgr *hwmgr,
+ return 0;
+ }
+
++static int vega10_get_power_profile_mode(struct pp_hwmgr *hwmgr, char *buf)
++{
++ struct vega10_hwmgr *data = (struct vega10_hwmgr *)(hwmgr->backend);
++ uint32_t i, size = 0;
++ static const uint8_t profile_mode_setting[5][4] = {{70, 60, 1, 3,},
++ {90, 60, 0, 0,},
++ {70, 60, 0, 0,},
++ {70, 90, 0, 0,},
++ {30, 60, 0, 6,},
++ };
++ static const char *profile_name[6] = {"3D_FULL_SCREEN",
++ "POWER_SAVING",
++ "VIDEO",
++ "VR",
++ "COMPUTER",
++ "CUSTOM"};
++ static const char *title[6] = {"NUM",
++ "MODE_NAME",
++ "BUSY_SET_POINT",
++ "FPS",
++ "USE_RLC_BUSY",
++ "MIN_ACTIVE_LEVEL"};
++
++ if (!buf)
++ return -EINVAL;
++
++ size += sprintf(buf + size, "%s %16s %s %s %s %s\n",title[0],
++ title[1], title[2], title[3], title[4], title[5]);
++
++ for (i = 0; i < PP_SMC_POWER_PROFILE_CUSTOM; i++)
++ size += sprintf(buf + size, "%3d %14s%s: %14d %3d %10d %14d\n",
++ i, profile_name[i], (i == hwmgr->power_profile_mode) ? "*" : " ",
++ profile_mode_setting[i][0], profile_mode_setting[i][1],
++ profile_mode_setting[i][2], profile_mode_setting[i][3]);
++ size += sprintf(buf + size, "%3d %14s%s: %14d %3d %10d %14d\n", i,
++ profile_name[i], (i == hwmgr->power_profile_mode) ? "*" : " ",
++ data->custom_profile_mode[0], data->custom_profile_mode[1],
++ data->custom_profile_mode[2], data->custom_profile_mode[3]);
++ return size;
++}
++
++static int vega10_set_power_profile_mode(struct pp_hwmgr *hwmgr, long *input, uint32_t size)
++{
++ struct vega10_hwmgr *data = (struct vega10_hwmgr *)(hwmgr->backend);
++ uint8_t busy_set_point;
++ uint8_t FPS;
++ uint8_t use_rlc_busy;
++ uint8_t min_active_level;
++
++ if (input[size] == PP_SMC_POWER_PROFILE_AUTO)
++ return 0; /* TO DO auto wattman feature not enabled */
++
++ hwmgr->power_profile_mode = input[size];
++
++ smum_send_msg_to_smc_with_parameter(hwmgr, PPSMC_MSG_SetWorkloadMask,
++ 1<<hwmgr->power_profile_mode);
++
++ if (hwmgr->power_profile_mode == PP_SMC_POWER_PROFILE_CUSTOM) {
++ if (size == 0 || size > 4)
++ return -EINVAL;
++
++ data->custom_profile_mode[0] = busy_set_point = input[0];
++ data->custom_profile_mode[1] = FPS = input[1];
++ data->custom_profile_mode[2] = use_rlc_busy = input[2];
++ data->custom_profile_mode[3] = min_active_level = input[3];
++ smum_send_msg_to_smc_with_parameter(hwmgr,
++ PPSMC_MSG_SetCustomGfxDpmParameters,
++ busy_set_point | FPS<<8 |
++ use_rlc_busy << 16 | min_active_level<<24);
++ pr_info("size is %d value is %x \n", size, busy_set_point | FPS<<8 |
++ use_rlc_busy << 16 | min_active_level<<24);
++ }
++
++ return 0;
++}
++
+ static const struct pp_hwmgr_func vega10_hwmgr_funcs = {
+ .backend_init = vega10_hwmgr_backend_init,
+ .backend_fini = vega10_hwmgr_backend_fini,
+@@ -5081,6 +5160,8 @@ static const struct pp_hwmgr_func vega10_hwmgr_funcs = {
+ .get_thermal_temperature_range = vega10_get_thermal_temperature_range,
+ .register_internal_thermal_interrupt = vega10_register_thermal_interrupt,
+ .start_thermal_controller = vega10_start_thermal_controller,
++ .get_power_profile_mode = vega10_get_power_profile_mode,
++ .set_power_profile_mode = vega10_set_power_profile_mode,
+ };
+
+ int vega10_hwmgr_init(struct pp_hwmgr *hwmgr)
+diff --git a/drivers/gpu/drm/amd/powerplay/hwmgr/vega10_hwmgr.h b/drivers/gpu/drm/amd/powerplay/hwmgr/vega10_hwmgr.h
+index e8507ff..689fe9f 100644
+--- a/drivers/gpu/drm/amd/powerplay/hwmgr/vega10_hwmgr.h
++++ b/drivers/gpu/drm/amd/powerplay/hwmgr/vega10_hwmgr.h
+@@ -389,6 +389,7 @@ struct vega10_hwmgr {
+ uint32_t config_telemetry;
+ uint32_t acg_loop_state;
+ uint32_t mem_channels;
++ uint8_t custom_profile_mode[4];
+ };
+
+ #define VEGA10_DPM2_NEAR_TDP_DEC 10
+diff --git a/drivers/gpu/drm/amd/powerplay/inc/hwmgr.h b/drivers/gpu/drm/amd/powerplay/inc/hwmgr.h
+index f37f211..800d773 100644
+--- a/drivers/gpu/drm/amd/powerplay/inc/hwmgr.h
++++ b/drivers/gpu/drm/amd/powerplay/inc/hwmgr.h
+@@ -342,6 +342,8 @@ struct pp_hwmgr_func {
+ uint32_t size);
+ int (*get_thermal_temperature_range)(struct pp_hwmgr *hwmgr,
+ struct PP_TemperatureRange *range);
++ int (*get_power_profile_mode)(struct pp_hwmgr *hwmgr, char *buf);
++ int (*set_power_profile_mode)(struct pp_hwmgr *hwmgr, long *input, uint32_t size);
+ };
+
+ struct pp_table_func {
+@@ -750,6 +752,7 @@ struct pp_hwmgr {
+ struct amd_pp_profile default_compute_power_profile;
+ enum amd_pp_profile_type current_power_profile;
+ bool en_umd_pstate;
++ uint32_t power_profile_mode;
+ };
+
+ struct cgs_irq_src_funcs {
+--
+2.7.4
+