@@ -532,6 +532,12 @@ static const struct powercap_zone_constraint_ops constraint_ops = {
532
532
.get_name = get_constraint_name ,
533
533
};
534
534
535
+ /* Return the id used for read_raw/write_raw callback */
536
+ static int get_rid (struct rapl_package * rp )
537
+ {
538
+ return rp -> lead_cpu >= 0 ? rp -> lead_cpu : rp -> id ;
539
+ }
540
+
535
541
/* called after domain detection and package level data are set */
536
542
static void rapl_init_domains (struct rapl_package * rp )
537
543
{
@@ -550,10 +556,12 @@ static void rapl_init_domains(struct rapl_package *rp)
550
556
551
557
if (i == RAPL_DOMAIN_PLATFORM && rp -> id > 0 ) {
552
558
snprintf (rd -> name , RAPL_DOMAIN_NAME_LENGTH , "psys-%d" ,
553
- topology_physical_package_id (rp -> lead_cpu ));
554
- } else
559
+ rp -> lead_cpu >= 0 ? topology_physical_package_id (rp -> lead_cpu ) :
560
+ rp -> id );
561
+ } else {
555
562
snprintf (rd -> name , RAPL_DOMAIN_NAME_LENGTH , "%s" ,
556
563
rapl_domain_names [i ]);
564
+ }
557
565
558
566
rd -> id = i ;
559
567
@@ -725,7 +733,6 @@ static int rapl_read_data_raw(struct rapl_domain *rd,
725
733
enum rapl_primitives prim_fixed = prim_fixups (rd , prim );
726
734
struct rapl_primitive_info * rpi = get_rpi (rd -> rp , prim_fixed );
727
735
struct reg_action ra ;
728
- int cpu ;
729
736
730
737
if (!rpi || !rpi -> name || rpi -> flag & RAPL_PRIMITIVE_DUMMY )
731
738
return - EINVAL ;
@@ -734,8 +741,6 @@ static int rapl_read_data_raw(struct rapl_domain *rd,
734
741
if (!ra .reg )
735
742
return - EINVAL ;
736
743
737
- cpu = rd -> rp -> lead_cpu ;
738
-
739
744
/* non-hardware data are collected by the polling thread */
740
745
if (rpi -> flag & RAPL_PRIMITIVE_DERIVED ) {
741
746
* data = rd -> rdd .primitives [prim ];
@@ -744,8 +749,8 @@ static int rapl_read_data_raw(struct rapl_domain *rd,
744
749
745
750
ra .mask = rpi -> mask ;
746
751
747
- if (rd -> rp -> priv -> read_raw (cpu , & ra )) {
748
- pr_debug ("failed to read reg 0x%llx on cpu %d \n" , ra .reg , cpu );
752
+ if (rd -> rp -> priv -> read_raw (get_rid ( rd -> rp ) , & ra )) {
753
+ pr_debug ("failed to read reg 0x%llx for %s:%s \n" , ra .reg , rd -> rp -> name , rd -> name );
749
754
return - EIO ;
750
755
}
751
756
@@ -766,15 +771,13 @@ static int rapl_write_data_raw(struct rapl_domain *rd,
766
771
{
767
772
enum rapl_primitives prim_fixed = prim_fixups (rd , prim );
768
773
struct rapl_primitive_info * rpi = get_rpi (rd -> rp , prim_fixed );
769
- int cpu ;
770
774
u64 bits ;
771
775
struct reg_action ra ;
772
776
int ret ;
773
777
774
778
if (!rpi || !rpi -> name || rpi -> flag & RAPL_PRIMITIVE_DUMMY )
775
779
return - EINVAL ;
776
780
777
- cpu = rd -> rp -> lead_cpu ;
778
781
bits = rapl_unit_xlate (rd , rpi -> unit , value , 1 );
779
782
bits <<= rpi -> shift ;
780
783
bits &= rpi -> mask ;
@@ -785,7 +788,7 @@ static int rapl_write_data_raw(struct rapl_domain *rd,
785
788
ra .mask = rpi -> mask ;
786
789
ra .value = bits ;
787
790
788
- ret = rd -> rp -> priv -> write_raw (cpu , & ra );
791
+ ret = rd -> rp -> priv -> write_raw (get_rid ( rd -> rp ) , & ra );
789
792
790
793
return ret ;
791
794
}
@@ -835,9 +838,9 @@ static int rapl_check_unit_core(struct rapl_domain *rd)
835
838
836
839
ra .reg = rd -> regs [RAPL_DOMAIN_REG_UNIT ];
837
840
ra .mask = ~0 ;
838
- if (rd -> rp -> priv -> read_raw (rd -> rp -> lead_cpu , & ra )) {
839
- pr_err ("Failed to read power unit REG 0x%llx on CPU %d , exit.\n" ,
840
- ra .reg , rd -> rp -> lead_cpu );
841
+ if (rd -> rp -> priv -> read_raw (get_rid ( rd -> rp ) , & ra )) {
842
+ pr_err ("Failed to read power unit REG 0x%llx on %s:%s , exit.\n" ,
843
+ ra .reg , rd -> rp -> name , rd -> name );
841
844
return - ENODEV ;
842
845
}
843
846
@@ -863,9 +866,9 @@ static int rapl_check_unit_atom(struct rapl_domain *rd)
863
866
864
867
ra .reg = rd -> regs [RAPL_DOMAIN_REG_UNIT ];
865
868
ra .mask = ~0 ;
866
- if (rd -> rp -> priv -> read_raw (rd -> rp -> lead_cpu , & ra )) {
867
- pr_err ("Failed to read power unit REG 0x%llx on CPU %d , exit.\n" ,
868
- ra .reg , rd -> rp -> lead_cpu );
869
+ if (rd -> rp -> priv -> read_raw (get_rid ( rd -> rp ) , & ra )) {
870
+ pr_err ("Failed to read power unit REG 0x%llx on %s:%s , exit.\n" ,
871
+ ra .reg , rd -> rp -> name , rd -> name );
869
872
return - ENODEV ;
870
873
}
871
874
@@ -911,6 +914,9 @@ static void power_limit_irq_save_cpu(void *info)
911
914
912
915
static void package_power_limit_irq_save (struct rapl_package * rp )
913
916
{
917
+ if (rp -> lead_cpu < 0 )
918
+ return ;
919
+
914
920
if (!boot_cpu_has (X86_FEATURE_PTS ) || !boot_cpu_has (X86_FEATURE_PLN ))
915
921
return ;
916
922
@@ -925,6 +931,9 @@ static void package_power_limit_irq_restore(struct rapl_package *rp)
925
931
{
926
932
u32 l , h ;
927
933
934
+ if (rp -> lead_cpu < 0 )
935
+ return ;
936
+
928
937
if (!boot_cpu_has (X86_FEATURE_PTS ) || !boot_cpu_has (X86_FEATURE_PLN ))
929
938
return ;
930
939
@@ -1263,7 +1272,7 @@ static int rapl_check_domain(int domain, struct rapl_package *rp)
1263
1272
*/
1264
1273
1265
1274
ra .mask = ENERGY_STATUS_MASK ;
1266
- if (rp -> priv -> read_raw (rp -> lead_cpu , & ra ) || !ra .value )
1275
+ if (rp -> priv -> read_raw (get_rid ( rp ) , & ra ) || !ra .value )
1267
1276
return - ENODEV ;
1268
1277
1269
1278
return 0 ;
@@ -1401,13 +1410,18 @@ void rapl_remove_package(struct rapl_package *rp)
1401
1410
EXPORT_SYMBOL_GPL (rapl_remove_package );
1402
1411
1403
1412
/* caller to ensure CPU hotplug lock is held */
1404
- struct rapl_package * rapl_find_package_domain (int cpu , struct rapl_if_priv * priv )
1413
+ struct rapl_package * rapl_find_package_domain (int id , struct rapl_if_priv * priv , bool id_is_cpu )
1405
1414
{
1406
- int id = topology_logical_die_id (cpu );
1407
1415
struct rapl_package * rp ;
1416
+ int uid ;
1417
+
1418
+ if (id_is_cpu )
1419
+ uid = topology_logical_die_id (id );
1420
+ else
1421
+ uid = id ;
1408
1422
1409
1423
list_for_each_entry (rp , & rapl_packages , plist ) {
1410
- if (rp -> id == id
1424
+ if (rp -> id == uid
1411
1425
&& rp -> priv -> control_type == priv -> control_type )
1412
1426
return rp ;
1413
1427
}
@@ -1417,33 +1431,35 @@ struct rapl_package *rapl_find_package_domain(int cpu, struct rapl_if_priv *priv
1417
1431
EXPORT_SYMBOL_GPL (rapl_find_package_domain );
1418
1432
1419
1433
/* called from CPU hotplug notifier, hotplug lock held */
1420
- struct rapl_package * rapl_add_package (int cpu , struct rapl_if_priv * priv )
1434
+ struct rapl_package * rapl_add_package (int id , struct rapl_if_priv * priv , bool id_is_cpu )
1421
1435
{
1422
- int id = topology_logical_die_id (cpu );
1423
1436
struct rapl_package * rp ;
1424
1437
int ret ;
1425
1438
1426
1439
rp = kzalloc (sizeof (struct rapl_package ), GFP_KERNEL );
1427
1440
if (!rp )
1428
1441
return ERR_PTR (- ENOMEM );
1429
1442
1430
- /* add the new package to the list */
1431
- rp -> id = id ;
1432
- rp -> lead_cpu = cpu ;
1433
- rp -> priv = priv ;
1443
+ if (id_is_cpu ) {
1444
+ rp -> id = topology_logical_die_id (id );
1445
+ rp -> lead_cpu = id ;
1446
+ if (topology_max_die_per_package () > 1 )
1447
+ snprintf (rp -> name , PACKAGE_DOMAIN_NAME_LENGTH , "package-%d-die-%d" ,
1448
+ topology_physical_package_id (id ), topology_die_id (id ));
1449
+ else
1450
+ snprintf (rp -> name , PACKAGE_DOMAIN_NAME_LENGTH , "package-%d" ,
1451
+ topology_physical_package_id (id ));
1452
+ } else {
1453
+ rp -> id = id ;
1454
+ rp -> lead_cpu = -1 ;
1455
+ snprintf (rp -> name , PACKAGE_DOMAIN_NAME_LENGTH , "package-%d" , id );
1456
+ }
1434
1457
1458
+ rp -> priv = priv ;
1435
1459
ret = rapl_config (rp );
1436
1460
if (ret )
1437
1461
goto err_free_package ;
1438
1462
1439
- if (topology_max_die_per_package () > 1 )
1440
- snprintf (rp -> name , PACKAGE_DOMAIN_NAME_LENGTH ,
1441
- "package-%d-die-%d" ,
1442
- topology_physical_package_id (cpu ), topology_die_id (cpu ));
1443
- else
1444
- snprintf (rp -> name , PACKAGE_DOMAIN_NAME_LENGTH , "package-%d" ,
1445
- topology_physical_package_id (cpu ));
1446
-
1447
1463
/* check if the package contains valid domains */
1448
1464
if (rapl_detect_domains (rp )) {
1449
1465
ret = - ENODEV ;
0 commit comments