On Wed, Jan 10, 2018 at 1:01 PM, Rex Zhu <Rex.Zhu at amd.com> wrote: > Change-Id: I0a554cb6a7a56db63a8fc5af60d5c63f65e021d1 > Signed-off-by: Rex Zhu <Rex.Zhu at amd.com> > --- > drivers/gpu/drm/amd/powerplay/amd_powerplay.c | 39 +++++++++++ > drivers/gpu/drm/amd/powerplay/hwmgr/vega10_hwmgr.c | 78 ++++++++++++++++++++++ > drivers/gpu/drm/amd/powerplay/hwmgr/vega10_hwmgr.h | 1 + > drivers/gpu/drm/amd/powerplay/inc/hwmgr.h | 3 + > 4 files changed, 121 insertions(+) > > diff --git a/drivers/gpu/drm/amd/powerplay/amd_powerplay.c b/drivers/gpu/drm/amd/powerplay/amd_powerplay.c > index 8859b67..3493292 100644 > --- a/drivers/gpu/drm/amd/powerplay/amd_powerplay.c > +++ b/drivers/gpu/drm/amd/powerplay/amd_powerplay.c > @@ -1081,6 +1081,43 @@ 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; > + > + Unnecessary blank line. > + 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) > { > @@ -1464,6 +1501,8 @@ static int pp_get_display_mode_validation_clocks(void *handle, > .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 23b7239..e8b6c3d 100644 > --- a/drivers/gpu/drm/amd/powerplay/hwmgr/vega10_hwmgr.c > +++ b/drivers/gpu/drm/amd/powerplay/hwmgr/vega10_hwmgr.c > @@ -757,6 +757,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; > @@ -3950,6 +3952,7 @@ static int vega10_read_sensor(struct pp_hwmgr *hwmgr, int idx, > ret = -EINVAL; > break; > } > + > return ret; > } > > @@ -5008,6 +5011,79 @@ 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; > + uint8_t profile_mode_setting[5][4] = {{70, 60, 1, 3,}, static const, otherwise the compiler has to copy the table to stack on every call. > + {90, 60, 0, 0,}, > + {70, 60, 0, 0,}, > + {70, 90, 0, 0,}, > + {30, 60, 0, 6,}, > + }; > + char *profile_name[6] = {"3D_FULL_SCREEN", static const char * const profile_name[6] = ... Gražvydas