@@ -176,53 +176,27 @@ void mce_unregister_decode_chain(struct notifier_block *nb)
176
176
}
177
177
EXPORT_SYMBOL_GPL (mce_unregister_decode_chain );
178
178
179
- static inline u32 ctl_reg (int bank )
179
+ u32 mca_msr_reg (int bank , enum mca_msr reg )
180
180
{
181
- return MSR_IA32_MCx_CTL (bank );
182
- }
183
-
184
- static inline u32 status_reg (int bank )
185
- {
186
- return MSR_IA32_MCx_STATUS (bank );
187
- }
188
-
189
- static inline u32 addr_reg (int bank )
190
- {
191
- return MSR_IA32_MCx_ADDR (bank );
192
- }
193
-
194
- static inline u32 misc_reg (int bank )
195
- {
196
- return MSR_IA32_MCx_MISC (bank );
197
- }
198
-
199
- static inline u32 smca_ctl_reg (int bank )
200
- {
201
- return MSR_AMD64_SMCA_MCx_CTL (bank );
202
- }
203
-
204
- static inline u32 smca_status_reg (int bank )
205
- {
206
- return MSR_AMD64_SMCA_MCx_STATUS (bank );
207
- }
181
+ if (mce_flags .smca ) {
182
+ switch (reg ) {
183
+ case MCA_CTL : return MSR_AMD64_SMCA_MCx_CTL (bank );
184
+ case MCA_ADDR : return MSR_AMD64_SMCA_MCx_ADDR (bank );
185
+ case MCA_MISC : return MSR_AMD64_SMCA_MCx_MISC (bank );
186
+ case MCA_STATUS : return MSR_AMD64_SMCA_MCx_STATUS (bank );
187
+ }
188
+ }
208
189
209
- static inline u32 smca_addr_reg (int bank )
210
- {
211
- return MSR_AMD64_SMCA_MCx_ADDR (bank );
212
- }
190
+ switch (reg ) {
191
+ case MCA_CTL : return MSR_IA32_MCx_CTL (bank );
192
+ case MCA_ADDR : return MSR_IA32_MCx_ADDR (bank );
193
+ case MCA_MISC : return MSR_IA32_MCx_MISC (bank );
194
+ case MCA_STATUS : return MSR_IA32_MCx_STATUS (bank );
195
+ }
213
196
214
- static inline u32 smca_misc_reg (int bank )
215
- {
216
- return MSR_AMD64_SMCA_MCx_MISC (bank );
197
+ return 0 ;
217
198
}
218
199
219
- struct mca_msr_regs msr_ops = {
220
- .ctl = ctl_reg ,
221
- .status = status_reg ,
222
- .addr = addr_reg ,
223
- .misc = misc_reg
224
- };
225
-
226
200
static void __print_mce (struct mce * m )
227
201
{
228
202
pr_emerg (HW_ERR "CPU %d: Machine Check%s: %Lx Bank %d: %016Lx\n" ,
@@ -362,11 +336,11 @@ static int msr_to_offset(u32 msr)
362
336
363
337
if (msr == mca_cfg .rip_msr )
364
338
return offsetof(struct mce , ip );
365
- if (msr == msr_ops . status (bank ))
339
+ if (msr == mca_msr_reg (bank , MCA_STATUS ))
366
340
return offsetof(struct mce , status );
367
- if (msr == msr_ops . addr (bank ))
341
+ if (msr == mca_msr_reg (bank , MCA_ADDR ))
368
342
return offsetof(struct mce , addr );
369
- if (msr == msr_ops . misc (bank ))
343
+ if (msr == mca_msr_reg (bank , MCA_MISC ))
370
344
return offsetof(struct mce , misc );
371
345
if (msr == MSR_IA32_MCG_STATUS )
372
346
return offsetof(struct mce , mcgstatus );
@@ -685,10 +659,10 @@ static struct notifier_block mce_default_nb = {
685
659
static void mce_read_aux (struct mce * m , int i )
686
660
{
687
661
if (m -> status & MCI_STATUS_MISCV )
688
- m -> misc = mce_rdmsrl (msr_ops . misc ( i ));
662
+ m -> misc = mce_rdmsrl (mca_msr_reg ( i , MCA_MISC ));
689
663
690
664
if (m -> status & MCI_STATUS_ADDRV ) {
691
- m -> addr = mce_rdmsrl (msr_ops . addr ( i ));
665
+ m -> addr = mce_rdmsrl (mca_msr_reg ( i , MCA_ADDR ));
692
666
693
667
/*
694
668
* Mask the reported address by the reported granularity.
@@ -758,7 +732,7 @@ bool machine_check_poll(enum mcp_flags flags, mce_banks_t *b)
758
732
m .bank = i ;
759
733
760
734
barrier ();
761
- m .status = mce_rdmsrl (msr_ops . status ( i ));
735
+ m .status = mce_rdmsrl (mca_msr_reg ( i , MCA_STATUS ));
762
736
763
737
/* If this entry is not valid, ignore it */
764
738
if (!(m .status & MCI_STATUS_VAL ))
@@ -826,7 +800,7 @@ bool machine_check_poll(enum mcp_flags flags, mce_banks_t *b)
826
800
/*
827
801
* Clear state for this bank.
828
802
*/
829
- mce_wrmsrl (msr_ops . status ( i ), 0 );
803
+ mce_wrmsrl (mca_msr_reg ( i , MCA_STATUS ), 0 );
830
804
}
831
805
832
806
/*
@@ -851,7 +825,7 @@ static int mce_no_way_out(struct mce *m, char **msg, unsigned long *validp,
851
825
int i ;
852
826
853
827
for (i = 0 ; i < this_cpu_read (mce_num_banks ); i ++ ) {
854
- m -> status = mce_rdmsrl (msr_ops . status ( i ));
828
+ m -> status = mce_rdmsrl (mca_msr_reg ( i , MCA_STATUS ));
855
829
if (!(m -> status & MCI_STATUS_VAL ))
856
830
continue ;
857
831
@@ -1144,7 +1118,7 @@ static void mce_clear_state(unsigned long *toclear)
1144
1118
1145
1119
for (i = 0 ; i < this_cpu_read (mce_num_banks ); i ++ ) {
1146
1120
if (test_bit (i , toclear ))
1147
- mce_wrmsrl (msr_ops . status ( i ), 0 );
1121
+ mce_wrmsrl (mca_msr_reg ( i , MCA_STATUS ), 0 );
1148
1122
}
1149
1123
}
1150
1124
@@ -1203,7 +1177,7 @@ static void __mc_scan_banks(struct mce *m, struct pt_regs *regs, struct mce *fin
1203
1177
m -> addr = 0 ;
1204
1178
m -> bank = i ;
1205
1179
1206
- m -> status = mce_rdmsrl (msr_ops . status ( i ));
1180
+ m -> status = mce_rdmsrl (mca_msr_reg ( i , MCA_STATUS ));
1207
1181
if (!(m -> status & MCI_STATUS_VAL ))
1208
1182
continue ;
1209
1183
@@ -1708,8 +1682,8 @@ static void __mcheck_cpu_init_clear_banks(void)
1708
1682
1709
1683
if (!b -> init )
1710
1684
continue ;
1711
- wrmsrl (msr_ops . ctl ( i ), b -> ctl );
1712
- wrmsrl (msr_ops . status ( i ), 0 );
1685
+ wrmsrl (mca_msr_reg ( i , MCA_CTL ), b -> ctl );
1686
+ wrmsrl (mca_msr_reg ( i , MCA_STATUS ), 0 );
1713
1687
}
1714
1688
}
1715
1689
@@ -1735,7 +1709,7 @@ static void __mcheck_cpu_check_banks(void)
1735
1709
if (!b -> init )
1736
1710
continue ;
1737
1711
1738
- rdmsrl (msr_ops . ctl ( i ), msrval );
1712
+ rdmsrl (mca_msr_reg ( i , MCA_CTL ), msrval );
1739
1713
b -> init = !!msrval ;
1740
1714
}
1741
1715
}
@@ -1894,13 +1868,6 @@ static void __mcheck_cpu_init_early(struct cpuinfo_x86 *c)
1894
1868
mce_flags .succor = !!cpu_has (c , X86_FEATURE_SUCCOR );
1895
1869
mce_flags .smca = !!cpu_has (c , X86_FEATURE_SMCA );
1896
1870
mce_flags .amd_threshold = 1 ;
1897
-
1898
- if (mce_flags .smca ) {
1899
- msr_ops .ctl = smca_ctl_reg ;
1900
- msr_ops .status = smca_status_reg ;
1901
- msr_ops .addr = smca_addr_reg ;
1902
- msr_ops .misc = smca_misc_reg ;
1903
- }
1904
1871
}
1905
1872
}
1906
1873
@@ -2254,7 +2221,7 @@ static void mce_disable_error_reporting(void)
2254
2221
struct mce_bank * b = & mce_banks [i ];
2255
2222
2256
2223
if (b -> init )
2257
- wrmsrl (msr_ops . ctl ( i ), 0 );
2224
+ wrmsrl (mca_msr_reg ( i , MCA_CTL ), 0 );
2258
2225
}
2259
2226
return ;
2260
2227
}
@@ -2606,7 +2573,7 @@ static void mce_reenable_cpu(void)
2606
2573
struct mce_bank * b = & mce_banks [i ];
2607
2574
2608
2575
if (b -> init )
2609
- wrmsrl (msr_ops . ctl ( i ), b -> ctl );
2576
+ wrmsrl (mca_msr_reg ( i , MCA_CTL ), b -> ctl );
2610
2577
}
2611
2578
}
2612
2579
0 commit comments