@@ -1259,26 +1259,33 @@ static int smu_sw_init(void *handle)
12591259 smu -> watermarks_bitmap = 0 ;
12601260 smu -> power_profile_mode = PP_SMC_POWER_PROFILE_BOOTUP_DEFAULT ;
12611261 smu -> default_power_profile_mode = PP_SMC_POWER_PROFILE_BOOTUP_DEFAULT ;
1262+ smu -> user_dpm_profile .user_workload_mask = 0 ;
12621263
12631264 atomic_set (& smu -> smu_power .power_gate .vcn_gated , 1 );
12641265 atomic_set (& smu -> smu_power .power_gate .jpeg_gated , 1 );
12651266 atomic_set (& smu -> smu_power .power_gate .vpe_gated , 1 );
12661267 atomic_set (& smu -> smu_power .power_gate .umsch_mm_gated , 1 );
12671268
1268- smu -> workload_prority [PP_SMC_POWER_PROFILE_BOOTUP_DEFAULT ] = 0 ;
1269- smu -> workload_prority [PP_SMC_POWER_PROFILE_FULLSCREEN3D ] = 1 ;
1270- smu -> workload_prority [PP_SMC_POWER_PROFILE_POWERSAVING ] = 2 ;
1271- smu -> workload_prority [PP_SMC_POWER_PROFILE_VIDEO ] = 3 ;
1272- smu -> workload_prority [PP_SMC_POWER_PROFILE_VR ] = 4 ;
1273- smu -> workload_prority [PP_SMC_POWER_PROFILE_COMPUTE ] = 5 ;
1274- smu -> workload_prority [PP_SMC_POWER_PROFILE_CUSTOM ] = 6 ;
1269+ smu -> workload_priority [PP_SMC_POWER_PROFILE_BOOTUP_DEFAULT ] = 0 ;
1270+ smu -> workload_priority [PP_SMC_POWER_PROFILE_FULLSCREEN3D ] = 1 ;
1271+ smu -> workload_priority [PP_SMC_POWER_PROFILE_POWERSAVING ] = 2 ;
1272+ smu -> workload_priority [PP_SMC_POWER_PROFILE_VIDEO ] = 3 ;
1273+ smu -> workload_priority [PP_SMC_POWER_PROFILE_VR ] = 4 ;
1274+ smu -> workload_priority [PP_SMC_POWER_PROFILE_COMPUTE ] = 5 ;
1275+ smu -> workload_priority [PP_SMC_POWER_PROFILE_CUSTOM ] = 6 ;
12751276
12761277 if (smu -> is_apu ||
1277- !smu_is_workload_profile_available (smu , PP_SMC_POWER_PROFILE_FULLSCREEN3D ))
1278- smu -> workload_mask = 1 << smu -> workload_prority [PP_SMC_POWER_PROFILE_BOOTUP_DEFAULT ];
1279- else
1280- smu -> workload_mask = 1 << smu -> workload_prority [PP_SMC_POWER_PROFILE_FULLSCREEN3D ];
1278+ !smu_is_workload_profile_available (smu , PP_SMC_POWER_PROFILE_FULLSCREEN3D )) {
1279+ smu -> driver_workload_mask =
1280+ 1 << smu -> workload_priority [PP_SMC_POWER_PROFILE_BOOTUP_DEFAULT ];
1281+ } else {
1282+ smu -> driver_workload_mask =
1283+ 1 << smu -> workload_priority [PP_SMC_POWER_PROFILE_FULLSCREEN3D ];
1284+ smu -> default_power_profile_mode = PP_SMC_POWER_PROFILE_FULLSCREEN3D ;
1285+ }
12811286
1287+ smu -> workload_mask = smu -> driver_workload_mask |
1288+ smu -> user_dpm_profile .user_workload_mask ;
12821289 smu -> workload_setting [0 ] = PP_SMC_POWER_PROFILE_BOOTUP_DEFAULT ;
12831290 smu -> workload_setting [1 ] = PP_SMC_POWER_PROFILE_FULLSCREEN3D ;
12841291 smu -> workload_setting [2 ] = PP_SMC_POWER_PROFILE_POWERSAVING ;
@@ -2348,17 +2355,20 @@ static int smu_switch_power_profile(void *handle,
23482355 return - EINVAL ;
23492356
23502357 if (!en ) {
2351- smu -> workload_mask &= ~(1 << smu -> workload_prority [type ]);
2358+ smu -> driver_workload_mask &= ~(1 << smu -> workload_priority [type ]);
23522359 index = fls (smu -> workload_mask );
23532360 index = index > 0 && index <= WORKLOAD_POLICY_MAX ? index - 1 : 0 ;
23542361 workload [0 ] = smu -> workload_setting [index ];
23552362 } else {
2356- smu -> workload_mask |= (1 << smu -> workload_prority [type ]);
2363+ smu -> driver_workload_mask |= (1 << smu -> workload_priority [type ]);
23572364 index = fls (smu -> workload_mask );
23582365 index = index <= WORKLOAD_POLICY_MAX ? index - 1 : 0 ;
23592366 workload [0 ] = smu -> workload_setting [index ];
23602367 }
23612368
2369+ smu -> workload_mask = smu -> driver_workload_mask |
2370+ smu -> user_dpm_profile .user_workload_mask ;
2371+
23622372 if (smu_dpm_ctx -> dpm_level != AMD_DPM_FORCED_LEVEL_MANUAL &&
23632373 smu_dpm_ctx -> dpm_level != AMD_DPM_FORCED_LEVEL_PERF_DETERMINISM )
23642374 smu_bump_power_profile_mode (smu , workload , 0 );
@@ -3049,12 +3059,23 @@ static int smu_set_power_profile_mode(void *handle,
30493059 uint32_t param_size )
30503060{
30513061 struct smu_context * smu = handle ;
3062+ int ret ;
30523063
30533064 if (!smu -> pm_enabled || !smu -> adev -> pm .dpm_enabled ||
30543065 !smu -> ppt_funcs -> set_power_profile_mode )
30553066 return - EOPNOTSUPP ;
30563067
3057- return smu_bump_power_profile_mode (smu , param , param_size );
3068+ if (smu -> user_dpm_profile .user_workload_mask &
3069+ (1 << smu -> workload_priority [param [param_size ]]))
3070+ return 0 ;
3071+
3072+ smu -> user_dpm_profile .user_workload_mask =
3073+ (1 << smu -> workload_priority [param [param_size ]]);
3074+ smu -> workload_mask = smu -> user_dpm_profile .user_workload_mask |
3075+ smu -> driver_workload_mask ;
3076+ ret = smu_bump_power_profile_mode (smu , param , param_size );
3077+
3078+ return ret ;
30583079}
30593080
30603081static int smu_get_fan_control_mode (void * handle , u32 * fan_mode )
0 commit comments