Skip to content

Commit 9ca766f

Browse files
npigginmpe
authored andcommitted
powerpc/64s/pseries: machine check convert to use common event code
The common machine_check_event data structures and queues are mostly platform independent, with powernv decoding SRR1/DSISR/etc., into machine_check_event objects. This patch converts pseries to use this infrastructure by decoding fwnmi/rtas data into machine_check_event objects. This allows queueing to be used by a subsequent change to delay the virtual mode handling of machine checks that occur in kernel space where it is unsafe to switch immediately to virtual mode, similarly to powernv. Signed-off-by: Nicholas Piggin <[email protected]> [mpe: Fix implicit fallthrough warnings in mce_handle_error()] Signed-off-by: Michael Ellerman <[email protected]> Link: https://lore.kernel.org/r/[email protected]
1 parent 7290f3b commit 9ca766f

File tree

3 files changed

+233
-267
lines changed

3 files changed

+233
-267
lines changed

arch/powerpc/include/asm/mce.h

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,10 @@ enum MCE_Disposition {
3030
enum MCE_Initiator {
3131
MCE_INITIATOR_UNKNOWN = 0,
3232
MCE_INITIATOR_CPU = 1,
33+
MCE_INITIATOR_PCI = 2,
34+
MCE_INITIATOR_ISA = 3,
35+
MCE_INITIATOR_MEMORY= 4,
36+
MCE_INITIATOR_POWERMGM = 5,
3337
};
3438

3539
enum MCE_ErrorType {
@@ -41,6 +45,8 @@ enum MCE_ErrorType {
4145
MCE_ERROR_TYPE_USER = 5,
4246
MCE_ERROR_TYPE_RA = 6,
4347
MCE_ERROR_TYPE_LINK = 7,
48+
MCE_ERROR_TYPE_DCACHE = 8,
49+
MCE_ERROR_TYPE_ICACHE = 9,
4450
};
4551

4652
enum MCE_ErrorClass {

arch/powerpc/kernel/mce.c

Lines changed: 33 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -325,7 +325,7 @@ static void machine_check_process_queued_event(struct irq_work *work)
325325
void machine_check_print_event_info(struct machine_check_event *evt,
326326
bool user_mode, bool in_guest)
327327
{
328-
const char *level, *sevstr, *subtype, *err_type;
328+
const char *level, *sevstr, *subtype, *err_type, *initiator;
329329
uint64_t ea = 0, pa = 0;
330330
int n = 0;
331331
char dar_str[50];
@@ -410,6 +410,28 @@ void machine_check_print_event_info(struct machine_check_event *evt,
410410
break;
411411
}
412412

413+
switch(evt->initiator) {
414+
case MCE_INITIATOR_CPU:
415+
initiator = "CPU";
416+
break;
417+
case MCE_INITIATOR_PCI:
418+
initiator = "PCI";
419+
break;
420+
case MCE_INITIATOR_ISA:
421+
initiator = "ISA";
422+
break;
423+
case MCE_INITIATOR_MEMORY:
424+
initiator = "Memory";
425+
break;
426+
case MCE_INITIATOR_POWERMGM:
427+
initiator = "Power Management";
428+
break;
429+
case MCE_INITIATOR_UNKNOWN:
430+
default:
431+
initiator = "Unknown";
432+
break;
433+
}
434+
413435
switch (evt->error_type) {
414436
case MCE_ERROR_TYPE_UE:
415437
err_type = "UE";
@@ -476,6 +498,14 @@ void machine_check_print_event_info(struct machine_check_event *evt,
476498
if (evt->u.link_error.effective_address_provided)
477499
ea = evt->u.link_error.effective_address;
478500
break;
501+
case MCE_ERROR_TYPE_DCACHE:
502+
err_type = "D-Cache";
503+
subtype = "Unknown";
504+
break;
505+
case MCE_ERROR_TYPE_ICACHE:
506+
err_type = "I-Cache";
507+
subtype = "Unknown";
508+
break;
479509
default:
480510
case MCE_ERROR_TYPE_UNKNOWN:
481511
err_type = "Unknown";
@@ -508,6 +538,8 @@ void machine_check_print_event_info(struct machine_check_event *evt,
508538
level, evt->cpu, evt->srr0, (void *)evt->srr0, pa_str);
509539
}
510540

541+
printk("%sMCE: CPU%d: Initiator %s\n", level, evt->cpu, initiator);
542+
511543
subtype = evt->error_class < ARRAY_SIZE(mc_error_class) ?
512544
mc_error_class[evt->error_class] : "Unknown";
513545
printk("%sMCE: CPU%d: %s\n", level, evt->cpu, subtype);

0 commit comments

Comments
 (0)