diff options
Diffstat (limited to 'common/recipes-kernel/linux/files/0049-drm-amd-powerplay-implement-functions-of-amd_powerpl.patch')
-rw-r--r-- | common/recipes-kernel/linux/files/0049-drm-amd-powerplay-implement-functions-of-amd_powerpl.patch | 273 |
1 files changed, 273 insertions, 0 deletions
diff --git a/common/recipes-kernel/linux/files/0049-drm-amd-powerplay-implement-functions-of-amd_powerpl.patch b/common/recipes-kernel/linux/files/0049-drm-amd-powerplay-implement-functions-of-amd_powerpl.patch new file mode 100644 index 00000000..9cd50e81 --- /dev/null +++ b/common/recipes-kernel/linux/files/0049-drm-amd-powerplay-implement-functions-of-amd_powerpl.patch @@ -0,0 +1,273 @@ +From 67e2f17bd49366a1695ac77aebc2594825533848 Mon Sep 17 00:00:00 2001 +From: Rex Zhu <Rex.Zhu@amd.com> +Date: Fri, 28 Aug 2015 12:56:43 +0800 +Subject: [PATCH 0049/1110] drm/amd/powerplay: implement functions of + amd_powerplay_func + +This is the common interface for interacting with the powerplay +module. + +v2: squash in fixes + +Signed-off-by: Rex Zhu <Rex.Zhu@amd.com> +Acked-by: Jammy Zhou <Jammy.Zhou@amd.com> +Reviewed-by: Alex Deucher <alexander.deucher@amd.com> +--- + drivers/gpu/drm/amd/powerplay/amd_powerplay.c | 191 ++++++++++++++++++++++++-- + 1 file changed, 183 insertions(+), 8 deletions(-) + +diff --git a/drivers/gpu/drm/amd/powerplay/amd_powerplay.c b/drivers/gpu/drm/amd/powerplay/amd_powerplay.c +index 1964a2a..66ccfc0 100644 +--- a/drivers/gpu/drm/amd/powerplay/amd_powerplay.c ++++ b/drivers/gpu/drm/amd/powerplay/amd_powerplay.c +@@ -27,6 +27,8 @@ + #include "amd_shared.h" + #include "amd_powerplay.h" + #include "pp_instance.h" ++#include "power_state.h" ++#include "eventmanager.h" + + static int pp_early_init(void *handle) + { +@@ -177,11 +179,31 @@ static int pp_set_powergating_state(void *handle, + + static int pp_suspend(void *handle) + { ++ struct pp_instance *pp_handle; ++ struct pp_eventmgr *eventmgr; ++ struct pem_event_data event_data = { {0} }; ++ ++ if (handle == NULL) ++ return -EINVAL; ++ ++ pp_handle = (struct pp_instance *)handle; ++ eventmgr = pp_handle->eventmgr; ++ pem_handle_event(eventmgr, AMD_PP_EVENT_SUSPEND, &event_data); + return 0; + } + + static int pp_resume(void *handle) + { ++ struct pp_instance *pp_handle; ++ struct pp_eventmgr *eventmgr; ++ struct pem_event_data event_data = { {0} }; ++ ++ if (handle == NULL) ++ return -EINVAL; ++ ++ pp_handle = (struct pp_instance *)handle; ++ eventmgr = pp_handle->eventmgr; ++ pem_handle_event(eventmgr, AMD_PP_EVENT_RESUME, &event_data); + return 0; + } + +@@ -215,45 +237,198 @@ static int pp_dpm_fw_loading_complete(void *handle) + static int pp_dpm_force_performance_level(void *handle, + enum amd_dpm_forced_level level) + { ++ struct pp_instance *pp_handle; ++ struct pp_hwmgr *hwmgr; ++ ++ if (handle == NULL) ++ return -EINVAL; ++ ++ pp_handle = (struct pp_instance *)handle; ++ ++ hwmgr = pp_handle->hwmgr; ++ ++ if (hwmgr == NULL || hwmgr->hwmgr_func == NULL || ++ hwmgr->hwmgr_func->force_dpm_level == NULL) ++ return -EINVAL; ++ ++ hwmgr->hwmgr_func->force_dpm_level(hwmgr, level); ++ + return 0; + } ++ + static enum amd_dpm_forced_level pp_dpm_get_performance_level( + void *handle) + { +- return 0; ++ struct pp_hwmgr *hwmgr; ++ ++ if (handle == NULL) ++ return -EINVAL; ++ ++ hwmgr = ((struct pp_instance *)handle)->hwmgr; ++ ++ if (hwmgr == NULL) ++ return -EINVAL; ++ ++ return (((struct pp_instance *)handle)->hwmgr->dpm_level); + } ++ + static int pp_dpm_get_sclk(void *handle, bool low) + { +- return 0; ++ struct pp_hwmgr *hwmgr; ++ ++ if (handle == NULL) ++ return -EINVAL; ++ ++ hwmgr = ((struct pp_instance *)handle)->hwmgr; ++ ++ if (hwmgr == NULL || hwmgr->hwmgr_func == NULL || ++ hwmgr->hwmgr_func->get_sclk == NULL) ++ return -EINVAL; ++ ++ return hwmgr->hwmgr_func->get_sclk(hwmgr, low); + } ++ + static int pp_dpm_get_mclk(void *handle, bool low) + { +- return 0; ++ struct pp_hwmgr *hwmgr; ++ ++ if (handle == NULL) ++ return -EINVAL; ++ ++ hwmgr = ((struct pp_instance *)handle)->hwmgr; ++ ++ if (hwmgr == NULL || hwmgr->hwmgr_func == NULL || ++ hwmgr->hwmgr_func->get_mclk == NULL) ++ return -EINVAL; ++ ++ return hwmgr->hwmgr_func->get_mclk(hwmgr, low); + } ++ + static int pp_dpm_powergate_vce(void *handle, bool gate) + { +- return 0; ++ struct pp_hwmgr *hwmgr; ++ ++ if (handle == NULL) ++ return -EINVAL; ++ ++ hwmgr = ((struct pp_instance *)handle)->hwmgr; ++ ++ if (hwmgr == NULL || hwmgr->hwmgr_func == NULL || ++ hwmgr->hwmgr_func->powergate_vce == NULL) ++ return -EINVAL; ++ ++ return hwmgr->hwmgr_func->powergate_vce(hwmgr, gate); + } ++ + static int pp_dpm_powergate_uvd(void *handle, bool gate) + { +- return 0; ++ struct pp_hwmgr *hwmgr; ++ ++ if (handle == NULL) ++ return -EINVAL; ++ ++ hwmgr = ((struct pp_instance *)handle)->hwmgr; ++ ++ if (hwmgr == NULL || hwmgr->hwmgr_func == NULL || ++ hwmgr->hwmgr_func->powergate_uvd == NULL) ++ return -EINVAL; ++ ++ return hwmgr->hwmgr_func->powergate_uvd(hwmgr, gate); ++} ++ ++static enum PP_StateUILabel power_state_convert(enum amd_pm_state_type state) ++{ ++ switch (state) { ++ case POWER_STATE_TYPE_BATTERY: ++ return PP_StateUILabel_Battery; ++ case POWER_STATE_TYPE_BALANCED: ++ return PP_StateUILabel_Balanced; ++ case POWER_STATE_TYPE_PERFORMANCE: ++ return PP_StateUILabel_Performance; ++ default: ++ return PP_StateUILabel_None; ++ } + } + + int pp_dpm_dispatch_tasks(void *handle, enum amd_pp_event event_id, void *input, void *output) + { +- return 0; ++ int ret = 0; ++ struct pp_instance *pp_handle; ++ struct pem_event_data data = { {0} }; ++ ++ pp_handle = (struct pp_instance *)handle; ++ ++ if (pp_handle == NULL) ++ return -EINVAL; ++ ++ switch (event_id) { ++ case AMD_PP_EVENT_DISPLAY_CONFIG_CHANGE: ++ ret = pem_handle_event(pp_handle->eventmgr, event_id, &data); ++ break; ++ case AMD_PP_EVENT_ENABLE_USER_STATE: ++ { ++ enum amd_pm_state_type ps; ++ ++ if (input == NULL) ++ return -EINVAL; ++ ps = *(unsigned long *)input; ++ ++ data.requested_ui_label = power_state_convert(ps); ++ ret = pem_handle_event(pp_handle->eventmgr, event_id, &data); ++ } ++ break; ++ default: ++ break; ++ } ++ return ret; + } ++ + enum amd_pm_state_type pp_dpm_get_current_power_state(void *handle) + { +- return 0; ++ struct pp_hwmgr *hwmgr; ++ struct pp_power_state *state; ++ ++ if (handle == NULL) ++ return -EINVAL; ++ ++ hwmgr = ((struct pp_instance *)handle)->hwmgr; ++ ++ if (hwmgr == NULL || hwmgr->current_ps == NULL) ++ return -EINVAL; ++ ++ state = hwmgr->current_ps; ++ ++ switch (state->classification.ui_label) { ++ case PP_StateUILabel_Battery: ++ return POWER_STATE_TYPE_BATTERY; ++ case PP_StateUILabel_Balanced: ++ return POWER_STATE_TYPE_BALANCED; ++ case PP_StateUILabel_Performance: ++ return POWER_STATE_TYPE_PERFORMANCE; ++ default: ++ return POWER_STATE_TYPE_DEFAULT; ++ } + } ++ + static void + pp_debugfs_print_current_performance_level(void *handle, + struct seq_file *m) + { +- return; ++ struct pp_hwmgr *hwmgr; ++ ++ if (handle == NULL) ++ return; ++ ++ hwmgr = ((struct pp_instance *)handle)->hwmgr; ++ ++ if (hwmgr == NULL || hwmgr->hwmgr_func == NULL || ++ hwmgr->hwmgr_func->print_current_perforce_level == NULL) ++ return; ++ ++ hwmgr->hwmgr_func->print_current_perforce_level(hwmgr, m); + } + ++ + const struct amd_powerplay_funcs pp_dpm_funcs = { + .get_temperature = NULL, + .load_firmware = pp_dpm_load_fw, +-- +2.7.4 + |