@@ -115,6 +115,11 @@ struct rapl_defaults {
115115};
116116static struct rapl_defaults * rapl_defaults ;
117117
118+ static struct rapl_defaults * get_defaults (struct rapl_package * rp )
119+ {
120+ return rp -> priv -> defaults ;
121+ }
122+
118123/* Sideband MBI registers */
119124#define IOSF_CPU_POWER_BUDGET_CTL_BYT (0x2)
120125#define IOSF_CPU_POWER_BUDGET_CTL_TNG (0xdf)
@@ -227,14 +232,15 @@ static int find_nr_power_limit(struct rapl_domain *rd)
227232static int set_domain_enable (struct powercap_zone * power_zone , bool mode )
228233{
229234 struct rapl_domain * rd = power_zone_to_rapl_domain (power_zone );
235+ struct rapl_defaults * defaults = get_defaults (rd -> rp );
230236
231237 if (rd -> state & DOMAIN_STATE_BIOS_LOCKED )
232238 return - EACCES ;
233239
234240 cpus_read_lock ();
235241 rapl_write_data_raw (rd , PL1_ENABLE , mode );
236- if (rapl_defaults -> set_floor_freq )
237- rapl_defaults -> set_floor_freq (rd , mode );
242+ if (defaults -> set_floor_freq )
243+ defaults -> set_floor_freq (rd , mode );
238244 cpus_read_unlock ();
239245
240246 return 0 ;
@@ -551,6 +557,7 @@ static void rapl_init_domains(struct rapl_package *rp)
551557 enum rapl_domain_type i ;
552558 enum rapl_domain_reg_id j ;
553559 struct rapl_domain * rd = rp -> domains ;
560+ struct rapl_defaults * defaults = get_defaults (rp );
554561
555562 for (i = 0 ; i < RAPL_DOMAIN_MAX ; i ++ ) {
556563 unsigned int mask = rp -> domain_map & (1 << i );
@@ -592,14 +599,14 @@ static void rapl_init_domains(struct rapl_package *rp)
592599 switch (i ) {
593600 case RAPL_DOMAIN_DRAM :
594601 rd -> domain_energy_unit =
595- rapl_defaults -> dram_domain_energy_unit ;
602+ defaults -> dram_domain_energy_unit ;
596603 if (rd -> domain_energy_unit )
597604 pr_info ("DRAM domain energy unit %dpj\n" ,
598605 rd -> domain_energy_unit );
599606 break ;
600607 case RAPL_DOMAIN_PLATFORM :
601608 rd -> domain_energy_unit =
602- rapl_defaults -> psys_domain_energy_unit ;
609+ defaults -> psys_domain_energy_unit ;
603610 if (rd -> domain_energy_unit )
604611 pr_info ("Platform domain energy unit %dpj\n" ,
605612 rd -> domain_energy_unit );
@@ -616,6 +623,7 @@ static u64 rapl_unit_xlate(struct rapl_domain *rd, enum unit_type type,
616623{
617624 u64 units = 1 ;
618625 struct rapl_package * rp = rd -> rp ;
626+ struct rapl_defaults * defaults = get_defaults (rp );
619627 u64 scale = 1 ;
620628
621629 switch (type ) {
@@ -631,7 +639,7 @@ static u64 rapl_unit_xlate(struct rapl_domain *rd, enum unit_type type,
631639 units = rp -> energy_unit ;
632640 break ;
633641 case TIME_UNIT :
634- return rapl_defaults -> compute_time_window (rp , value , to_raw );
642+ return defaults -> compute_time_window (rp , value , to_raw );
635643 case ARBITRARY_UNIT :
636644 default :
637645 return value ;
@@ -702,10 +710,18 @@ static struct rapl_primitive_info rpi[] = {
702710 {NULL , 0 , 0 , 0 },
703711};
704712
713+ static int rapl_config (struct rapl_package * rp )
714+ {
715+ rp -> priv -> defaults = (void * )rapl_defaults ;
716+ return 0 ;
717+ }
718+
705719static enum rapl_primitives
706720prim_fixups (struct rapl_domain * rd , enum rapl_primitives prim )
707721{
708- if (!rapl_defaults -> spr_psys_bits )
722+ struct rapl_defaults * defaults = get_defaults (rd -> rp );
723+
724+ if (!defaults -> spr_psys_bits )
709725 return prim ;
710726
711727 if (rd -> id != RAPL_DOMAIN_PLATFORM )
@@ -960,24 +976,25 @@ static void set_floor_freq_default(struct rapl_domain *rd, bool mode)
960976static void set_floor_freq_atom (struct rapl_domain * rd , bool enable )
961977{
962978 static u32 power_ctrl_orig_val ;
979+ struct rapl_defaults * defaults = get_defaults (rd -> rp );
963980 u32 mdata ;
964981
965- if (!rapl_defaults -> floor_freq_reg_addr ) {
982+ if (!defaults -> floor_freq_reg_addr ) {
966983 pr_err ("Invalid floor frequency config register\n" );
967984 return ;
968985 }
969986
970987 if (!power_ctrl_orig_val )
971988 iosf_mbi_read (BT_MBI_UNIT_PMC , MBI_CR_READ ,
972- rapl_defaults -> floor_freq_reg_addr ,
989+ defaults -> floor_freq_reg_addr ,
973990 & power_ctrl_orig_val );
974991 mdata = power_ctrl_orig_val ;
975992 if (enable ) {
976993 mdata &= ~(0x7f << 8 );
977994 mdata |= 1 << 8 ;
978995 }
979996 iosf_mbi_write (BT_MBI_UNIT_PMC , MBI_CR_WRITE ,
980- rapl_defaults -> floor_freq_reg_addr , mdata );
997+ defaults -> floor_freq_reg_addr , mdata );
981998}
982999
9831000static u64 rapl_compute_time_window_core (struct rapl_package * rp , u64 value ,
@@ -1385,11 +1402,9 @@ struct rapl_package *rapl_add_package(int cpu, struct rapl_if_priv *priv)
13851402{
13861403 int id = topology_logical_die_id (cpu );
13871404 struct rapl_package * rp ;
1405+ struct rapl_defaults * defaults ;
13881406 int ret ;
13891407
1390- if (!rapl_defaults )
1391- return ERR_PTR (- ENODEV );
1392-
13931408 rp = kzalloc (sizeof (struct rapl_package ), GFP_KERNEL );
13941409 if (!rp )
13951410 return ERR_PTR (- ENOMEM );
@@ -1399,6 +1414,10 @@ struct rapl_package *rapl_add_package(int cpu, struct rapl_if_priv *priv)
13991414 rp -> lead_cpu = cpu ;
14001415 rp -> priv = priv ;
14011416
1417+ ret = rapl_config (rp );
1418+ if (ret )
1419+ goto err_free_package ;
1420+
14021421 if (topology_max_die_per_package () > 1 )
14031422 snprintf (rp -> name , PACKAGE_DOMAIN_NAME_LENGTH ,
14041423 "package-%d-die-%d" ,
@@ -1407,8 +1426,9 @@ struct rapl_package *rapl_add_package(int cpu, struct rapl_if_priv *priv)
14071426 snprintf (rp -> name , PACKAGE_DOMAIN_NAME_LENGTH , "package-%d" ,
14081427 topology_physical_package_id (cpu ));
14091428
1429+ defaults = get_defaults (rp );
14101430 /* check if the package contains valid domains */
1411- if (rapl_detect_domains (rp , cpu ) || rapl_defaults -> check_unit (rp , cpu )) {
1431+ if (rapl_detect_domains (rp , cpu ) || defaults -> check_unit (rp , cpu )) {
14121432 ret = - ENODEV ;
14131433 goto err_free_package ;
14141434 }
0 commit comments