@@ -170,8 +170,8 @@ show_cppc_data(cppc_get_perf_ctrs, cppc_perf_fb_ctrs, wraparound_time);
170
170
#define GET_BIT_WIDTH (reg ) ((reg)->access_width ? (8 << ((reg)->access_width - 1)) : (reg)->bit_width)
171
171
172
172
/* Shift and apply the mask for CPC reads/writes */
173
- #define MASK_VAL (reg , val ) ((val) >> (( reg)->bit_offset & \
174
- GENMASK(((reg)->bit_width), 0) ))
173
+ #define MASK_VAL (reg , val ) ((( val) >> (reg)->bit_offset) & \
174
+ GENMASK(((reg)->bit_width) - 1 , 0))
175
175
176
176
static ssize_t show_feedback_ctrs (struct kobject * kobj ,
177
177
struct kobj_attribute * attr , char * buf )
@@ -1002,14 +1002,14 @@ static int cpc_read(int cpu, struct cpc_register_resource *reg_res, u64 *val)
1002
1002
}
1003
1003
1004
1004
* val = 0 ;
1005
+ size = GET_BIT_WIDTH (reg );
1005
1006
1006
1007
if (reg -> space_id == ACPI_ADR_SPACE_SYSTEM_IO ) {
1007
- u32 width = GET_BIT_WIDTH (reg );
1008
1008
u32 val_u32 ;
1009
1009
acpi_status status ;
1010
1010
1011
1011
status = acpi_os_read_port ((acpi_io_address )reg -> address ,
1012
- & val_u32 , width );
1012
+ & val_u32 , size );
1013
1013
if (ACPI_FAILURE (status )) {
1014
1014
pr_debug ("Error: Failed to read SystemIO port %llx\n" ,
1015
1015
reg -> address );
@@ -1018,17 +1018,22 @@ static int cpc_read(int cpu, struct cpc_register_resource *reg_res, u64 *val)
1018
1018
1019
1019
* val = val_u32 ;
1020
1020
return 0 ;
1021
- } else if (reg -> space_id == ACPI_ADR_SPACE_PLATFORM_COMM && pcc_ss_id >= 0 )
1021
+ } else if (reg -> space_id == ACPI_ADR_SPACE_PLATFORM_COMM && pcc_ss_id >= 0 ) {
1022
+ /*
1023
+ * For registers in PCC space, the register size is determined
1024
+ * by the bit width field; the access size is used to indicate
1025
+ * the PCC subspace id.
1026
+ */
1027
+ size = reg -> bit_width ;
1022
1028
vaddr = GET_PCC_VADDR (reg -> address , pcc_ss_id );
1029
+ }
1023
1030
else if (reg -> space_id == ACPI_ADR_SPACE_SYSTEM_MEMORY )
1024
1031
vaddr = reg_res -> sys_mem_vaddr ;
1025
1032
else if (reg -> space_id == ACPI_ADR_SPACE_FIXED_HARDWARE )
1026
1033
return cpc_read_ffh (cpu , reg , val );
1027
1034
else
1028
1035
return acpi_os_read_memory ((acpi_physical_address )reg -> address ,
1029
- val , reg -> bit_width );
1030
-
1031
- size = GET_BIT_WIDTH (reg );
1036
+ val , size );
1032
1037
1033
1038
switch (size ) {
1034
1039
case 8 :
@@ -1044,8 +1049,13 @@ static int cpc_read(int cpu, struct cpc_register_resource *reg_res, u64 *val)
1044
1049
* val = readq_relaxed (vaddr );
1045
1050
break ;
1046
1051
default :
1047
- pr_debug ("Error: Cannot read %u bit width from PCC for ss: %d\n" ,
1048
- reg -> bit_width , pcc_ss_id );
1052
+ if (reg -> space_id == ACPI_ADR_SPACE_SYSTEM_MEMORY ) {
1053
+ pr_debug ("Error: Cannot read %u bit width from system memory: 0x%llx\n" ,
1054
+ size , reg -> address );
1055
+ } else if (reg -> space_id == ACPI_ADR_SPACE_PLATFORM_COMM ) {
1056
+ pr_debug ("Error: Cannot read %u bit width from PCC for ss: %d\n" ,
1057
+ size , pcc_ss_id );
1058
+ }
1049
1059
return - EFAULT ;
1050
1060
}
1051
1061
@@ -1063,30 +1073,36 @@ static int cpc_write(int cpu, struct cpc_register_resource *reg_res, u64 val)
1063
1073
int pcc_ss_id = per_cpu (cpu_pcc_subspace_idx , cpu );
1064
1074
struct cpc_reg * reg = & reg_res -> cpc_entry .reg ;
1065
1075
1076
+ size = GET_BIT_WIDTH (reg );
1077
+
1066
1078
if (reg -> space_id == ACPI_ADR_SPACE_SYSTEM_IO ) {
1067
- u32 width = GET_BIT_WIDTH (reg );
1068
1079
acpi_status status ;
1069
1080
1070
1081
status = acpi_os_write_port ((acpi_io_address )reg -> address ,
1071
- (u32 )val , width );
1082
+ (u32 )val , size );
1072
1083
if (ACPI_FAILURE (status )) {
1073
1084
pr_debug ("Error: Failed to write SystemIO port %llx\n" ,
1074
1085
reg -> address );
1075
1086
return - EFAULT ;
1076
1087
}
1077
1088
1078
1089
return 0 ;
1079
- } else if (reg -> space_id == ACPI_ADR_SPACE_PLATFORM_COMM && pcc_ss_id >= 0 )
1090
+ } else if (reg -> space_id == ACPI_ADR_SPACE_PLATFORM_COMM && pcc_ss_id >= 0 ) {
1091
+ /*
1092
+ * For registers in PCC space, the register size is determined
1093
+ * by the bit width field; the access size is used to indicate
1094
+ * the PCC subspace id.
1095
+ */
1096
+ size = reg -> bit_width ;
1080
1097
vaddr = GET_PCC_VADDR (reg -> address , pcc_ss_id );
1098
+ }
1081
1099
else if (reg -> space_id == ACPI_ADR_SPACE_SYSTEM_MEMORY )
1082
1100
vaddr = reg_res -> sys_mem_vaddr ;
1083
1101
else if (reg -> space_id == ACPI_ADR_SPACE_FIXED_HARDWARE )
1084
1102
return cpc_write_ffh (cpu , reg , val );
1085
1103
else
1086
1104
return acpi_os_write_memory ((acpi_physical_address )reg -> address ,
1087
- val , reg -> bit_width );
1088
-
1089
- size = GET_BIT_WIDTH (reg );
1105
+ val , size );
1090
1106
1091
1107
if (reg -> space_id == ACPI_ADR_SPACE_SYSTEM_MEMORY )
1092
1108
val = MASK_VAL (reg , val );
@@ -1105,8 +1121,13 @@ static int cpc_write(int cpu, struct cpc_register_resource *reg_res, u64 val)
1105
1121
writeq_relaxed (val , vaddr );
1106
1122
break ;
1107
1123
default :
1108
- pr_debug ("Error: Cannot write %u bit width to PCC for ss: %d\n" ,
1109
- reg -> bit_width , pcc_ss_id );
1124
+ if (reg -> space_id == ACPI_ADR_SPACE_SYSTEM_MEMORY ) {
1125
+ pr_debug ("Error: Cannot write %u bit width to system memory: 0x%llx\n" ,
1126
+ size , reg -> address );
1127
+ } else if (reg -> space_id == ACPI_ADR_SPACE_PLATFORM_COMM ) {
1128
+ pr_debug ("Error: Cannot write %u bit width to PCC for ss: %d\n" ,
1129
+ size , pcc_ss_id );
1130
+ }
1110
1131
ret_val = - EFAULT ;
1111
1132
break ;
1112
1133
}
0 commit comments