> -----Original Message----- > From: amd-gfx <amd-gfx-bounces@xxxxxxxxxxxxxxxxxxxxx> On Behalf Of > Chengming Gui > Sent: 2019年4月22日 16:03 > To: amd-gfx@xxxxxxxxxxxxxxxxxxxxx > Cc: Gui, Jack <Jack.Gui@xxxxxxx> > Subject: [PATCH] drm/amd/powerplay: add set/get_power_profile_mode > for Raven > > Signed-off-by: Chengming Gui <Jack.Gui@xxxxxxx> > --- > drivers/gpu/drm/amd/powerplay/hwmgr/smu10_hwmgr.c | 92 > +++++++++++++++++++++++ > drivers/gpu/drm/amd/powerplay/inc/rv_ppsmc.h | 1 - > drivers/gpu/drm/amd/powerplay/inc/smu10.h | 14 ++-- > 3 files changed, 100 insertions(+), 7 deletions(-) > > diff --git a/drivers/gpu/drm/amd/powerplay/hwmgr/smu10_hwmgr.c > b/drivers/gpu/drm/amd/powerplay/hwmgr/smu10_hwmgr.c > index f32e3d0..ee25ba1 100644 > --- a/drivers/gpu/drm/amd/powerplay/hwmgr/smu10_hwmgr.c > +++ b/drivers/gpu/drm/amd/powerplay/hwmgr/smu10_hwmgr.c > @@ -35,6 +35,7 @@ > #include "smu10_hwmgr.h" > #include "power_state.h" > #include "soc15_common.h" > +#include "smu10.h" > > #define SMU10_MAX_DEEPSLEEP_DIVIDER_ID 5 > #define SMU10_MINIMUM_ENGINE_CLOCK 800 /* 8Mhz, the low > boundary of engine clock allowed on this chip */ > @@ -1200,6 +1201,95 @@ static void smu10_powergate_vcn(struct > pp_hwmgr *hwmgr, bool bgate) > } > } > > +static int conv_power_profile_to_pplib_workload(int power_profile) { > + int pplib_workload = 0; > + > + switch (power_profile) { > + case PP_SMC_POWER_PROFILE_BOOTUP_DEFAULT: > + pplib_workload = WORKLOAD_DEFAULT_BIT; > + break; > + case PP_SMC_POWER_PROFILE_FULLSCREEN3D: > + pplib_workload = WORKLOAD_PPLIB_FULL_SCREEN_3D_BIT; > + break; > + case PP_SMC_POWER_PROFILE_POWERSAVING: > + pplib_workload = WORKLOAD_PPLIB_POWER_SAVING_BIT; > + break; > + case PP_SMC_POWER_PROFILE_VIDEO: > + pplib_workload = WORKLOAD_PPLIB_VIDEO_BIT; > + break; > + case PP_SMC_POWER_PROFILE_VR: > + pplib_workload = WORKLOAD_PPLIB_VR_BIT; > + break; > + case PP_SMC_POWER_PROFILE_COMPUTE: > + pplib_workload = WORKLOAD_PPLIB_COMPUTE_BIT; > + break; > + } > + > + return pplib_workload; > +} > + > +static int smu10_get_power_profile_mode(struct pp_hwmgr *hwmgr, char > +*buf) { > + uint32_t i, size = 0; > + static const uint8_t > + profile_mode_setting[6][4] = {{70, 60, 0, 0,}, > + {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] = { > + "BOOTUP_DEFAULT", > + "3D_FULL_SCREEN", > + "POWER_SAVING", > + "VIDEO", > + "VR", > + "COMPUTE"}; > + 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_COMPUTE; 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]); > + > + return size; > +} > + > +static int smu10_set_power_profile_mode(struct pp_hwmgr *hwmgr, long > +*input, uint32_t size) { > + int workload_type = 0; > + > + hwmgr->power_profile_mode = input[size]; > + > + if (hwmgr->power_profile_mode > > PP_SMC_POWER_PROFILE_COMPUTE) { > + pr_err("Invalid power profile mode %d\n", hwmgr- > >power_profile_mode); > + return -EINVAL; > + } [Quan, Evan] check invalid input before changing hwmgr->power_profile_mode. With that fixed, reviewed-by: Evan Quan <evan.quan@xxxxxxx> > + > + /* conv PP_SMC_POWER_PROFILE* to WORKLOAD_PPLIB_*_BIT */ > + workload_type = > + conv_power_profile_to_pplib_workload(hwmgr- > >power_profile_mode); > + smum_send_msg_to_smc_with_parameter(hwmgr, > PPSMC_MSG_ActiveProcessNotify, > + 1 << workload_type); > + > + return 0; > +} > + > + > static const struct pp_hwmgr_func smu10_hwmgr_funcs = { > .backend_init = smu10_hwmgr_backend_init, > .backend_fini = smu10_hwmgr_backend_fini, @@ -1241,6 +1331,8 > @@ static const struct pp_hwmgr_func smu10_hwmgr_funcs = { > .powergate_sdma = smu10_powergate_sdma, > .set_hard_min_dcefclk_by_freq = > smu10_set_hard_min_dcefclk_by_freq, > .set_hard_min_fclk_by_freq = smu10_set_hard_min_fclk_by_freq, > + .get_power_profile_mode = smu10_get_power_profile_mode, > + .set_power_profile_mode = smu10_set_power_profile_mode, > }; > > int smu10_init_function_pointers(struct pp_hwmgr *hwmgr) diff --git > a/drivers/gpu/drm/amd/powerplay/inc/rv_ppsmc.h > b/drivers/gpu/drm/amd/powerplay/inc/rv_ppsmc.h > index a2991fa..90879e4 100644 > --- a/drivers/gpu/drm/amd/powerplay/inc/rv_ppsmc.h > +++ b/drivers/gpu/drm/amd/powerplay/inc/rv_ppsmc.h > @@ -85,7 +85,6 @@ > #define PPSMC_MSG_SetRccPfcPmeRestoreRegister 0x36 > #define PPSMC_Message_Count 0x37 > > - > typedef uint16_t PPSMC_Result; > typedef int PPSMC_Msg; > > diff --git a/drivers/gpu/drm/amd/powerplay/inc/smu10.h > b/drivers/gpu/drm/amd/powerplay/inc/smu10.h > index 9e837a5..b965205 100644 > --- a/drivers/gpu/drm/amd/powerplay/inc/smu10.h > +++ b/drivers/gpu/drm/amd/powerplay/inc/smu10.h > @@ -136,12 +136,14 @@ > #define FEATURE_CORE_CSTATES_MASK (1 << > FEATURE_CORE_CSTATES_BIT) > > /* Workload bits */ > -#define WORKLOAD_PPLIB_FULL_SCREEN_3D_BIT 0 > -#define WORKLOAD_PPLIB_VIDEO_BIT 2 > -#define WORKLOAD_PPLIB_VR_BIT 3 > -#define WORKLOAD_PPLIB_COMPUTE_BIT 4 > -#define WORKLOAD_PPLIB_CUSTOM_BIT 5 > -#define WORKLOAD_PPLIB_COUNT 6 > +#define WORKLOAD_DEFAULT_BIT 0 > +#define WORKLOAD_PPLIB_FULL_SCREEN_3D_BIT 1 > +#define WORKLOAD_PPLIB_POWER_SAVING_BIT 2 > +#define WORKLOAD_PPLIB_VIDEO_BIT 3 > +#define WORKLOAD_PPLIB_VR_BIT 4 > +#define WORKLOAD_PPLIB_COMPUTE_BIT 5 > +#define WORKLOAD_PPLIB_CUSTOM_BIT 6 > +#define WORKLOAD_PPLIB_COUNT 7 > > typedef struct { > /* MP1_EXT_SCRATCH0 */ > -- > 2.7.4 > > _______________________________________________ > amd-gfx mailing list > amd-gfx@xxxxxxxxxxxxxxxxxxxxx > https://lists.freedesktop.org/mailman/listinfo/amd-gfx _______________________________________________ amd-gfx mailing list amd-gfx@xxxxxxxxxxxxxxxxxxxxx https://lists.freedesktop.org/mailman/listinfo/amd-gfx