@@ -1261,26 +1261,33 @@ static int smu_sw_init(struct amdgpu_ip_block *ip_block)
12611261 smu -> watermarks_bitmap = 0 ;
12621262 smu -> power_profile_mode = PP_SMC_POWER_PROFILE_BOOTUP_DEFAULT ;
12631263 smu -> default_power_profile_mode = PP_SMC_POWER_PROFILE_BOOTUP_DEFAULT ;
1264+ smu -> user_dpm_profile .user_workload_mask = 0 ;
12641265
12651266 atomic_set (& smu -> smu_power .power_gate .vcn_gated , 1 );
12661267 atomic_set (& smu -> smu_power .power_gate .jpeg_gated , 1 );
12671268 atomic_set (& smu -> smu_power .power_gate .vpe_gated , 1 );
12681269 atomic_set (& smu -> smu_power .power_gate .umsch_mm_gated , 1 );
12691270
1270- smu -> workload_prority [PP_SMC_POWER_PROFILE_BOOTUP_DEFAULT ] = 0 ;
1271- smu -> workload_prority [PP_SMC_POWER_PROFILE_FULLSCREEN3D ] = 1 ;
1272- smu -> workload_prority [PP_SMC_POWER_PROFILE_POWERSAVING ] = 2 ;
1273- smu -> workload_prority [PP_SMC_POWER_PROFILE_VIDEO ] = 3 ;
1274- smu -> workload_prority [PP_SMC_POWER_PROFILE_VR ] = 4 ;
1275- smu -> workload_prority [PP_SMC_POWER_PROFILE_COMPUTE ] = 5 ;
1276- smu -> workload_prority [PP_SMC_POWER_PROFILE_CUSTOM ] = 6 ;
1271+ smu -> workload_priority [PP_SMC_POWER_PROFILE_BOOTUP_DEFAULT ] = 0 ;
1272+ smu -> workload_priority [PP_SMC_POWER_PROFILE_FULLSCREEN3D ] = 1 ;
1273+ smu -> workload_priority [PP_SMC_POWER_PROFILE_POWERSAVING ] = 2 ;
1274+ smu -> workload_priority [PP_SMC_POWER_PROFILE_VIDEO ] = 3 ;
1275+ smu -> workload_priority [PP_SMC_POWER_PROFILE_VR ] = 4 ;
1276+ smu -> workload_priority [PP_SMC_POWER_PROFILE_COMPUTE ] = 5 ;
1277+ smu -> workload_priority [PP_SMC_POWER_PROFILE_CUSTOM ] = 6 ;
12771278
12781279 if (smu -> is_apu ||
1279- !smu_is_workload_profile_available (smu , PP_SMC_POWER_PROFILE_FULLSCREEN3D ))
1280- smu -> workload_mask = 1 << smu -> workload_prority [PP_SMC_POWER_PROFILE_BOOTUP_DEFAULT ];
1281- else
1282- smu -> workload_mask = 1 << smu -> workload_prority [PP_SMC_POWER_PROFILE_FULLSCREEN3D ];
1280+ !smu_is_workload_profile_available (smu , PP_SMC_POWER_PROFILE_FULLSCREEN3D )) {
1281+ smu -> driver_workload_mask =
1282+ 1 << smu -> workload_priority [PP_SMC_POWER_PROFILE_BOOTUP_DEFAULT ];
1283+ } else {
1284+ smu -> driver_workload_mask =
1285+ 1 << smu -> workload_priority [PP_SMC_POWER_PROFILE_FULLSCREEN3D ];
1286+ smu -> default_power_profile_mode = PP_SMC_POWER_PROFILE_FULLSCREEN3D ;
1287+ }
12831288
1289+ smu -> workload_mask = smu -> driver_workload_mask |
1290+ smu -> user_dpm_profile .user_workload_mask ;
12841291 smu -> workload_setting [0 ] = PP_SMC_POWER_PROFILE_BOOTUP_DEFAULT ;
12851292 smu -> workload_setting [1 ] = PP_SMC_POWER_PROFILE_FULLSCREEN3D ;
12861293 smu -> workload_setting [2 ] = PP_SMC_POWER_PROFILE_POWERSAVING ;
@@ -2355,17 +2362,20 @@ static int smu_switch_power_profile(void *handle,
23552362 return - EINVAL ;
23562363
23572364 if (!en ) {
2358- smu -> workload_mask &= ~(1 << smu -> workload_prority [type ]);
2365+ smu -> driver_workload_mask &= ~(1 << smu -> workload_priority [type ]);
23592366 index = fls (smu -> workload_mask );
23602367 index = index > 0 && index <= WORKLOAD_POLICY_MAX ? index - 1 : 0 ;
23612368 workload [0 ] = smu -> workload_setting [index ];
23622369 } else {
2363- smu -> workload_mask |= (1 << smu -> workload_prority [type ]);
2370+ smu -> driver_workload_mask |= (1 << smu -> workload_priority [type ]);
23642371 index = fls (smu -> workload_mask );
23652372 index = index <= WORKLOAD_POLICY_MAX ? index - 1 : 0 ;
23662373 workload [0 ] = smu -> workload_setting [index ];
23672374 }
23682375
2376+ smu -> workload_mask = smu -> driver_workload_mask |
2377+ smu -> user_dpm_profile .user_workload_mask ;
2378+
23692379 if (smu_dpm_ctx -> dpm_level != AMD_DPM_FORCED_LEVEL_MANUAL &&
23702380 smu_dpm_ctx -> dpm_level != AMD_DPM_FORCED_LEVEL_PERF_DETERMINISM )
23712381 smu_bump_power_profile_mode (smu , workload , 0 );
@@ -3056,12 +3066,23 @@ static int smu_set_power_profile_mode(void *handle,
30563066 uint32_t param_size )
30573067{
30583068 struct smu_context * smu = handle ;
3069+ int ret ;
30593070
30603071 if (!smu -> pm_enabled || !smu -> adev -> pm .dpm_enabled ||
30613072 !smu -> ppt_funcs -> set_power_profile_mode )
30623073 return - EOPNOTSUPP ;
30633074
3064- return smu_bump_power_profile_mode (smu , param , param_size );
3075+ if (smu -> user_dpm_profile .user_workload_mask &
3076+ (1 << smu -> workload_priority [param [param_size ]]))
3077+ return 0 ;
3078+
3079+ smu -> user_dpm_profile .user_workload_mask =
3080+ (1 << smu -> workload_priority [param [param_size ]]);
3081+ smu -> workload_mask = smu -> user_dpm_profile .user_workload_mask |
3082+ smu -> driver_workload_mask ;
3083+ ret = smu_bump_power_profile_mode (smu , param , param_size );
3084+
3085+ return ret ;
30653086}
30663087
30673088static int smu_get_fan_control_mode (void * handle , u32 * fan_mode )
0 commit comments