@@ -115,6 +115,11 @@ struct rapl_defaults {
115
115
};
116
116
static struct rapl_defaults * rapl_defaults ;
117
117
118
+ static struct rapl_defaults * get_defaults (struct rapl_package * rp )
119
+ {
120
+ return rp -> priv -> defaults ;
121
+ }
122
+
118
123
/* Sideband MBI registers */
119
124
#define IOSF_CPU_POWER_BUDGET_CTL_BYT (0x2)
120
125
#define IOSF_CPU_POWER_BUDGET_CTL_TNG (0xdf)
@@ -227,14 +232,15 @@ static int find_nr_power_limit(struct rapl_domain *rd)
227
232
static int set_domain_enable (struct powercap_zone * power_zone , bool mode )
228
233
{
229
234
struct rapl_domain * rd = power_zone_to_rapl_domain (power_zone );
235
+ struct rapl_defaults * defaults = get_defaults (rd -> rp );
230
236
231
237
if (rd -> state & DOMAIN_STATE_BIOS_LOCKED )
232
238
return - EACCES ;
233
239
234
240
cpus_read_lock ();
235
241
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 );
238
244
cpus_read_unlock ();
239
245
240
246
return 0 ;
@@ -551,6 +557,7 @@ static void rapl_init_domains(struct rapl_package *rp)
551
557
enum rapl_domain_type i ;
552
558
enum rapl_domain_reg_id j ;
553
559
struct rapl_domain * rd = rp -> domains ;
560
+ struct rapl_defaults * defaults = get_defaults (rp );
554
561
555
562
for (i = 0 ; i < RAPL_DOMAIN_MAX ; i ++ ) {
556
563
unsigned int mask = rp -> domain_map & (1 << i );
@@ -592,14 +599,14 @@ static void rapl_init_domains(struct rapl_package *rp)
592
599
switch (i ) {
593
600
case RAPL_DOMAIN_DRAM :
594
601
rd -> domain_energy_unit =
595
- rapl_defaults -> dram_domain_energy_unit ;
602
+ defaults -> dram_domain_energy_unit ;
596
603
if (rd -> domain_energy_unit )
597
604
pr_info ("DRAM domain energy unit %dpj\n" ,
598
605
rd -> domain_energy_unit );
599
606
break ;
600
607
case RAPL_DOMAIN_PLATFORM :
601
608
rd -> domain_energy_unit =
602
- rapl_defaults -> psys_domain_energy_unit ;
609
+ defaults -> psys_domain_energy_unit ;
603
610
if (rd -> domain_energy_unit )
604
611
pr_info ("Platform domain energy unit %dpj\n" ,
605
612
rd -> domain_energy_unit );
@@ -616,6 +623,7 @@ static u64 rapl_unit_xlate(struct rapl_domain *rd, enum unit_type type,
616
623
{
617
624
u64 units = 1 ;
618
625
struct rapl_package * rp = rd -> rp ;
626
+ struct rapl_defaults * defaults = get_defaults (rp );
619
627
u64 scale = 1 ;
620
628
621
629
switch (type ) {
@@ -631,7 +639,7 @@ static u64 rapl_unit_xlate(struct rapl_domain *rd, enum unit_type type,
631
639
units = rp -> energy_unit ;
632
640
break ;
633
641
case TIME_UNIT :
634
- return rapl_defaults -> compute_time_window (rp , value , to_raw );
642
+ return defaults -> compute_time_window (rp , value , to_raw );
635
643
case ARBITRARY_UNIT :
636
644
default :
637
645
return value ;
@@ -702,10 +710,18 @@ static struct rapl_primitive_info rpi[] = {
702
710
{NULL , 0 , 0 , 0 },
703
711
};
704
712
713
+ static int rapl_config (struct rapl_package * rp )
714
+ {
715
+ rp -> priv -> defaults = (void * )rapl_defaults ;
716
+ return 0 ;
717
+ }
718
+
705
719
static enum rapl_primitives
706
720
prim_fixups (struct rapl_domain * rd , enum rapl_primitives prim )
707
721
{
708
- if (!rapl_defaults -> spr_psys_bits )
722
+ struct rapl_defaults * defaults = get_defaults (rd -> rp );
723
+
724
+ if (!defaults -> spr_psys_bits )
709
725
return prim ;
710
726
711
727
if (rd -> id != RAPL_DOMAIN_PLATFORM )
@@ -960,24 +976,25 @@ static void set_floor_freq_default(struct rapl_domain *rd, bool mode)
960
976
static void set_floor_freq_atom (struct rapl_domain * rd , bool enable )
961
977
{
962
978
static u32 power_ctrl_orig_val ;
979
+ struct rapl_defaults * defaults = get_defaults (rd -> rp );
963
980
u32 mdata ;
964
981
965
- if (!rapl_defaults -> floor_freq_reg_addr ) {
982
+ if (!defaults -> floor_freq_reg_addr ) {
966
983
pr_err ("Invalid floor frequency config register\n" );
967
984
return ;
968
985
}
969
986
970
987
if (!power_ctrl_orig_val )
971
988
iosf_mbi_read (BT_MBI_UNIT_PMC , MBI_CR_READ ,
972
- rapl_defaults -> floor_freq_reg_addr ,
989
+ defaults -> floor_freq_reg_addr ,
973
990
& power_ctrl_orig_val );
974
991
mdata = power_ctrl_orig_val ;
975
992
if (enable ) {
976
993
mdata &= ~(0x7f << 8 );
977
994
mdata |= 1 << 8 ;
978
995
}
979
996
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 );
981
998
}
982
999
983
1000
static 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)
1385
1402
{
1386
1403
int id = topology_logical_die_id (cpu );
1387
1404
struct rapl_package * rp ;
1405
+ struct rapl_defaults * defaults ;
1388
1406
int ret ;
1389
1407
1390
- if (!rapl_defaults )
1391
- return ERR_PTR (- ENODEV );
1392
-
1393
1408
rp = kzalloc (sizeof (struct rapl_package ), GFP_KERNEL );
1394
1409
if (!rp )
1395
1410
return ERR_PTR (- ENOMEM );
@@ -1399,6 +1414,10 @@ struct rapl_package *rapl_add_package(int cpu, struct rapl_if_priv *priv)
1399
1414
rp -> lead_cpu = cpu ;
1400
1415
rp -> priv = priv ;
1401
1416
1417
+ ret = rapl_config (rp );
1418
+ if (ret )
1419
+ goto err_free_package ;
1420
+
1402
1421
if (topology_max_die_per_package () > 1 )
1403
1422
snprintf (rp -> name , PACKAGE_DOMAIN_NAME_LENGTH ,
1404
1423
"package-%d-die-%d" ,
@@ -1407,8 +1426,9 @@ struct rapl_package *rapl_add_package(int cpu, struct rapl_if_priv *priv)
1407
1426
snprintf (rp -> name , PACKAGE_DOMAIN_NAME_LENGTH , "package-%d" ,
1408
1427
topology_physical_package_id (cpu ));
1409
1428
1429
+ defaults = get_defaults (rp );
1410
1430
/* 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 )) {
1412
1432
ret = - ENODEV ;
1413
1433
goto err_free_package ;
1414
1434
}
0 commit comments