hc
2024-01-03 2f7c68cb55ecb7331f2381deb497c27155f32faf
kernel/arch/x86/kernel/cpu/mce/core.c
....@@ -176,52 +176,26 @@
176176 }
177177 EXPORT_SYMBOL_GPL(mce_unregister_decode_chain);
178178
179
-static inline u32 ctl_reg(int bank)
179
+u32 mca_msr_reg(int bank, enum mca_msr reg)
180180 {
181
- return MSR_IA32_MCx_CTL(bank);
182
-}
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
+ }
183189
184
-static inline u32 status_reg(int bank)
185
-{
186
- return MSR_IA32_MCx_STATUS(bank);
187
-}
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
+ }
188196
189
-static inline u32 addr_reg(int bank)
190
-{
191
- return MSR_IA32_MCx_ADDR(bank);
197
+ return 0;
192198 }
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
-}
208
-
209
-static inline u32 smca_addr_reg(int bank)
210
-{
211
- return MSR_AMD64_SMCA_MCx_ADDR(bank);
212
-}
213
-
214
-static inline u32 smca_misc_reg(int bank)
215
-{
216
- return MSR_AMD64_SMCA_MCx_MISC(bank);
217
-}
218
-
219
-struct mca_msr_regs msr_ops = {
220
- .ctl = ctl_reg,
221
- .status = status_reg,
222
- .addr = addr_reg,
223
- .misc = misc_reg
224
-};
225199
226200 static void __print_mce(struct mce *m)
227201 {
....@@ -371,11 +345,11 @@
371345
372346 if (msr == mca_cfg.rip_msr)
373347 return offsetof(struct mce, ip);
374
- if (msr == msr_ops.status(bank))
348
+ if (msr == mca_msr_reg(bank, MCA_STATUS))
375349 return offsetof(struct mce, status);
376
- if (msr == msr_ops.addr(bank))
350
+ if (msr == mca_msr_reg(bank, MCA_ADDR))
377351 return offsetof(struct mce, addr);
378
- if (msr == msr_ops.misc(bank))
352
+ if (msr == mca_msr_reg(bank, MCA_MISC))
379353 return offsetof(struct mce, misc);
380354 if (msr == MSR_IA32_MCG_STATUS)
381355 return offsetof(struct mce, mcgstatus);
....@@ -694,10 +668,10 @@
694668 static noinstr void mce_read_aux(struct mce *m, int i)
695669 {
696670 if (m->status & MCI_STATUS_MISCV)
697
- m->misc = mce_rdmsrl(msr_ops.misc(i));
671
+ m->misc = mce_rdmsrl(mca_msr_reg(i, MCA_MISC));
698672
699673 if (m->status & MCI_STATUS_ADDRV) {
700
- m->addr = mce_rdmsrl(msr_ops.addr(i));
674
+ m->addr = mce_rdmsrl(mca_msr_reg(i, MCA_ADDR));
701675
702676 /*
703677 * Mask the reported address by the reported granularity.
....@@ -767,7 +741,7 @@
767741 m.bank = i;
768742
769743 barrier();
770
- m.status = mce_rdmsrl(msr_ops.status(i));
744
+ m.status = mce_rdmsrl(mca_msr_reg(i, MCA_STATUS));
771745
772746 /* If this entry is not valid, ignore it */
773747 if (!(m.status & MCI_STATUS_VAL))
....@@ -835,7 +809,7 @@
835809 /*
836810 * Clear state for this bank.
837811 */
838
- mce_wrmsrl(msr_ops.status(i), 0);
812
+ mce_wrmsrl(mca_msr_reg(i, MCA_STATUS), 0);
839813 }
840814
841815 /*
....@@ -860,7 +834,7 @@
860834 int i;
861835
862836 for (i = 0; i < this_cpu_read(mce_num_banks); i++) {
863
- m->status = mce_rdmsrl(msr_ops.status(i));
837
+ m->status = mce_rdmsrl(mca_msr_reg(i, MCA_STATUS));
864838 if (!(m->status & MCI_STATUS_VAL))
865839 continue;
866840
....@@ -1149,7 +1123,7 @@
11491123
11501124 for (i = 0; i < this_cpu_read(mce_num_banks); i++) {
11511125 if (test_bit(i, toclear))
1152
- mce_wrmsrl(msr_ops.status(i), 0);
1126
+ mce_wrmsrl(mca_msr_reg(i, MCA_STATUS), 0);
11531127 }
11541128 }
11551129
....@@ -1208,7 +1182,7 @@
12081182 m->addr = 0;
12091183 m->bank = i;
12101184
1211
- m->status = mce_rdmsrl(msr_ops.status(i));
1185
+ m->status = mce_rdmsrl(mca_msr_reg(i, MCA_STATUS));
12121186 if (!(m->status & MCI_STATUS_VAL))
12131187 continue;
12141188
....@@ -1704,8 +1678,8 @@
17041678
17051679 if (!b->init)
17061680 continue;
1707
- wrmsrl(msr_ops.ctl(i), b->ctl);
1708
- wrmsrl(msr_ops.status(i), 0);
1681
+ wrmsrl(mca_msr_reg(i, MCA_CTL), b->ctl);
1682
+ wrmsrl(mca_msr_reg(i, MCA_STATUS), 0);
17091683 }
17101684 }
17111685
....@@ -1731,7 +1705,7 @@
17311705 if (!b->init)
17321706 continue;
17331707
1734
- rdmsrl(msr_ops.ctl(i), msrval);
1708
+ rdmsrl(mca_msr_reg(i, MCA_CTL), msrval);
17351709 b->init = !!msrval;
17361710 }
17371711 }
....@@ -1890,13 +1864,6 @@
18901864 mce_flags.succor = !!cpu_has(c, X86_FEATURE_SUCCOR);
18911865 mce_flags.smca = !!cpu_has(c, X86_FEATURE_SMCA);
18921866 mce_flags.amd_threshold = 1;
1893
-
1894
- if (mce_flags.smca) {
1895
- msr_ops.ctl = smca_ctl_reg;
1896
- msr_ops.status = smca_status_reg;
1897
- msr_ops.addr = smca_addr_reg;
1898
- msr_ops.misc = smca_misc_reg;
1899
- }
19001867 }
19011868 }
19021869
....@@ -2272,7 +2239,7 @@
22722239 struct mce_bank *b = &mce_banks[i];
22732240
22742241 if (b->init)
2275
- wrmsrl(msr_ops.ctl(i), 0);
2242
+ wrmsrl(mca_msr_reg(i, MCA_CTL), 0);
22762243 }
22772244 return;
22782245 }
....@@ -2342,6 +2309,7 @@
23422309 {
23432310 mce_timer_delete_all();
23442311 on_each_cpu(mce_cpu_restart, NULL, 1);
2312
+ mce_schedule_work();
23452313 }
23462314
23472315 /* Toggle features for corrected errors */
....@@ -2624,7 +2592,7 @@
26242592 struct mce_bank *b = &mce_banks[i];
26252593
26262594 if (b->init)
2627
- wrmsrl(msr_ops.ctl(i), b->ctl);
2595
+ wrmsrl(mca_msr_reg(i, MCA_CTL), b->ctl);
26282596 }
26292597 }
26302598