@@ -654,7 +654,7 @@ static u64 rapl_unit_xlate(struct rapl_domain *rd, enum unit_type type,
654
654
}
655
655
656
656
/* in the order of enum rapl_primitives */
657
- static struct rapl_primitive_info rpi [] = {
657
+ static struct rapl_primitive_info rpi_default [] = {
658
658
/* name, mask, shift, msr index, unit divisor */
659
659
PRIMITIVE_INFO_INIT (ENERGY_COUNTER , ENERGY_STATUS_MASK , 0 ,
660
660
RAPL_DOMAIN_REG_STATUS , ENERGY_UNIT , 0 ),
@@ -710,9 +710,20 @@ static struct rapl_primitive_info rpi[] = {
710
710
{NULL , 0 , 0 , 0 },
711
711
};
712
712
713
+ static struct rapl_primitive_info * get_rpi (struct rapl_package * rp , int prim )
714
+ {
715
+ struct rapl_primitive_info * rpi = rp -> priv -> rpi ;
716
+
717
+ if (prim < 0 || prim > NR_RAPL_PRIMITIVES || !rpi )
718
+ return NULL ;
719
+
720
+ return & rpi [prim ];
721
+ }
722
+
713
723
static int rapl_config (struct rapl_package * rp )
714
724
{
715
725
rp -> priv -> defaults = (void * )rapl_defaults ;
726
+ rp -> priv -> rpi = (void * )rpi_default ;
716
727
return 0 ;
717
728
}
718
729
@@ -763,41 +774,41 @@ static int rapl_read_data_raw(struct rapl_domain *rd,
763
774
{
764
775
u64 value ;
765
776
enum rapl_primitives prim_fixed = prim_fixups (rd , prim );
766
- struct rapl_primitive_info * rp = & rpi [ prim_fixed ] ;
777
+ struct rapl_primitive_info * rpi = get_rpi ( rd -> rp , prim_fixed ) ;
767
778
struct reg_action ra ;
768
779
int cpu ;
769
780
770
- if (!rp -> name || rp -> flag & RAPL_PRIMITIVE_DUMMY )
781
+ if (!rpi || ! rpi -> name || rpi -> flag & RAPL_PRIMITIVE_DUMMY )
771
782
return - EINVAL ;
772
783
773
- ra .reg = rd -> regs [rp -> id ];
784
+ ra .reg = rd -> regs [rpi -> id ];
774
785
if (!ra .reg )
775
786
return - EINVAL ;
776
787
777
788
cpu = rd -> rp -> lead_cpu ;
778
789
779
790
/* domain with 2 limits has different bit */
780
791
if (prim == FW_LOCK && rd -> rp -> priv -> limits [rd -> id ] == 2 ) {
781
- rp -> mask = POWER_HIGH_LOCK ;
782
- rp -> shift = 63 ;
792
+ rpi -> mask = POWER_HIGH_LOCK ;
793
+ rpi -> shift = 63 ;
783
794
}
784
795
/* non-hardware data are collected by the polling thread */
785
- if (rp -> flag & RAPL_PRIMITIVE_DERIVED ) {
796
+ if (rpi -> flag & RAPL_PRIMITIVE_DERIVED ) {
786
797
* data = rd -> rdd .primitives [prim ];
787
798
return 0 ;
788
799
}
789
800
790
- ra .mask = rp -> mask ;
801
+ ra .mask = rpi -> mask ;
791
802
792
803
if (rd -> rp -> priv -> read_raw (cpu , & ra )) {
793
804
pr_debug ("failed to read reg 0x%llx on cpu %d\n" , ra .reg , cpu );
794
805
return - EIO ;
795
806
}
796
807
797
- value = ra .value >> rp -> shift ;
808
+ value = ra .value >> rpi -> shift ;
798
809
799
810
if (xlate )
800
- * data = rapl_unit_xlate (rd , rp -> unit , value , 0 );
811
+ * data = rapl_unit_xlate (rd , rpi -> unit , value , 0 );
801
812
else
802
813
* data = value ;
803
814
@@ -810,21 +821,24 @@ static int rapl_write_data_raw(struct rapl_domain *rd,
810
821
unsigned long long value )
811
822
{
812
823
enum rapl_primitives prim_fixed = prim_fixups (rd , prim );
813
- struct rapl_primitive_info * rp = & rpi [ prim_fixed ] ;
824
+ struct rapl_primitive_info * rpi = get_rpi ( rd -> rp , prim_fixed ) ;
814
825
int cpu ;
815
826
u64 bits ;
816
827
struct reg_action ra ;
817
828
int ret ;
818
829
830
+ if (!rpi || !rpi -> name || rpi -> flag & RAPL_PRIMITIVE_DUMMY )
831
+ return - EINVAL ;
832
+
819
833
cpu = rd -> rp -> lead_cpu ;
820
- bits = rapl_unit_xlate (rd , rp -> unit , value , 1 );
821
- bits <<= rp -> shift ;
822
- bits &= rp -> mask ;
834
+ bits = rapl_unit_xlate (rd , rpi -> unit , value , 1 );
835
+ bits <<= rpi -> shift ;
836
+ bits &= rpi -> mask ;
823
837
824
838
memset (& ra , 0 , sizeof (ra ));
825
839
826
- ra .reg = rd -> regs [rp -> id ];
827
- ra .mask = rp -> mask ;
840
+ ra .reg = rd -> regs [rpi -> id ];
841
+ ra .mask = rpi -> mask ;
828
842
ra .value = bits ;
829
843
830
844
ret = rd -> rp -> priv -> write_raw (cpu , & ra );
@@ -1176,8 +1190,10 @@ static void rapl_update_domain_data(struct rapl_package *rp)
1176
1190
rp -> domains [dmn ].name );
1177
1191
/* exclude non-raw primitives */
1178
1192
for (prim = 0 ; prim < NR_RAW_PRIMITIVES ; prim ++ ) {
1193
+ struct rapl_primitive_info * rpi = get_rpi (rp , prim );
1194
+
1179
1195
if (!rapl_read_data_raw (& rp -> domains [dmn ], prim ,
1180
- rpi [ prim ]. unit , & val ))
1196
+ rpi -> unit , & val ))
1181
1197
rp -> domains [dmn ].rdd .primitives [prim ] = val ;
1182
1198
}
1183
1199
}
0 commit comments