[RFC PATCH 4/7] powerpc/book3s: Print additional MCE errors introduced in power9.

Mahesh J Salgaonkar mahesh at linux.vnet.ibm.com
Tue Feb 21 12:52:32 AEDT 2017


From: Mahesh Salgaonkar <mahesh at linux.vnet.ibm.com>

Print out details about new MCE errors from Power9.

Signed-off-by: Mahesh Salgaonkar <mahesh at linux.vnet.ibm.com>
---
 arch/powerpc/kernel/mce.c |   68 +++++++++++++++++++++++++++++++++++++++++++++
 1 file changed, 68 insertions(+)

diff --git a/arch/powerpc/kernel/mce.c b/arch/powerpc/kernel/mce.c
index 36da14a3..da12992 100644
--- a/arch/powerpc/kernel/mce.c
+++ b/arch/powerpc/kernel/mce.c
@@ -264,6 +264,29 @@ void machine_check_print_event_info(struct OpalMachineCheckEvent *evt)
 		"Indeterminate",
 		"Parity",
 		"Multihit",
+		"Tlbiel programming error",
+	};
+	static const char *mc_nest_types[] = {
+		"Ifetch due to foreign link time out",
+		"Instruction tablewalk due to foreign link time out",
+		"Foreign Link Time out for load",
+		"Foreign Link Time out for tablewalk",
+	};
+	static const char *mc_cresp_types[] = {
+		"Real Address error for an ifetch",
+		"Real Address error for an ifetch tablewalk",
+		"Bad real address for a load",
+		"Bad address for load/store tablewalk",
+	};
+	static const char *mc_fspace_types[] = {
+		"Instruction Fetch to foreign address space",
+		"I-side tablewalk host real addr in the foreign address range",
+		"Host real addess to foreign space",
+		"Load/store real address went to a foreign address",
+	};
+	static const char *mc_async_types[] = {
+		"Real address error (CRESP) from store",
+		"Foreign link time out (nest abort) due to a store instruction",
 	};
 
 	/* Print things out */
@@ -341,6 +364,43 @@ void machine_check_print_event_info(struct OpalMachineCheckEvent *evt)
 			printk("%s    Effective address: %016llx\n",
 			       level, evt->u.tlb_error.effective_address);
 		break;
+	case MCE_ERROR_TYPE_NEST:
+		subtype = evt->u.nest_error.nest_error_type <
+			ARRAY_SIZE(mc_nest_types) ?
+			mc_nest_types[evt->u.nest_error.nest_error_type]
+			: "Unknown";
+		printk("%s  Error type: NEST ABORT [%s]\n", level, subtype);
+		if (evt->u.nest_error.effective_address_provided)
+			printk("%s    Effective address: %016llx\n",
+			       level, evt->u.nest_error.effective_address);
+		break;
+	case MCE_ERROR_TYPE_CRESP:
+		subtype = evt->u.cresp_error.cresp_error_type <
+			ARRAY_SIZE(mc_cresp_types) ?
+			mc_cresp_types[evt->u.cresp_error.cresp_error_type]
+			: "Unknown";
+		printk("%s  Error type: CRESP [%s]\n", level, subtype);
+		if (evt->u.cresp_error.effective_address_provided)
+			printk("%s    Effective address: %016llx\n",
+			       level, evt->u.cresp_error.effective_address);
+		break;
+	case MCE_ERROR_TYPE_FSPACE:
+		subtype = evt->u.fspace_error.fspace_error_type <
+			ARRAY_SIZE(mc_fspace_types) ?
+			mc_fspace_types[evt->u.fspace_error.fspace_error_type]
+			: "Unknown";
+		printk("%s  Error type: FOREIGN SPACE [%s]\n", level, subtype);
+		if (evt->u.fspace_error.effective_address_provided)
+			printk("%s    Effective address: %016llx\n",
+			       level, evt->u.fspace_error.effective_address);
+		break;
+	case MCE_ERROR_TYPE_ASYNC:
+		subtype = evt->u.async_error.async_error_type <
+			ARRAY_SIZE(mc_async_types) ?
+			mc_async_types[evt->u.async_error.async_error_type]
+			: "Unknown";
+		printk("%s  Error type: ASYNC MC [%s]\n", level, subtype);
+		break;
 	default:
 	case MCE_ERROR_TYPE_UNKNOWN:
 		printk("%s  Error type: Unknown\n", level);
@@ -367,6 +427,14 @@ uint64_t get_mce_fault_addr(struct OpalMachineCheckEvent *evt)
 		if (evt->u.tlb_error.effective_address_provided)
 			return evt->u.tlb_error.effective_address;
 		break;
+	case MCE_ERROR_TYPE_NEST:
+		if (evt->u.nest_error.effective_address_provided)
+			return evt->u.nest_error.effective_address;
+		break;
+	case MCE_ERROR_TYPE_CRESP:
+		if (evt->u.cresp_error.effective_address_provided)
+			return evt->u.cresp_error.effective_address;
+		break;
 	default:
 	case MCE_ERROR_TYPE_UNKNOWN:
 		break;



More information about the Linuxppc-dev mailing list