Skip to contentSkip to conversation

x86 RAS changes for v3.13

GIT PULL Ingo Molnar 1 participant 1 message Nov 11, 2013

Subsystems (12)
x86 ACPI Framebuffer layer EFI +8 more subsystems
lore
Share & tools
lore
#0 lore raw

Linus,

Please pull the latest x86-mce-for-linus git tree from:

git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip.git x86-mce-for-linus

# HEAD: 9ebddac7ea2a1f4b4ce3335a78312a58dfaadb4d ACPI, x86: Fix extended error log driver to depend on CONFIG_X86_LOCAL_APIC

The biggest change adds support for Intel 'CPER' (UEFI Common Platform Error Record) error logging, which builds upon an enhanced error logging mechanism available on Xeon processors.

Full description is here:

http://www.intel.com/content/www/us/en/architecture-and-technology/enhanced-mca-logging-xeon-paper.html

This change provides a module (and support code) to check for an extended error log and prints extra details about the error on the console.

out-of-topic modifications in x86-mce-for-linus:
--------------------------------------------------
arch/ia64/kernel/setup.c # dd6dad4: DMI: Parse memory device (type 17
drivers/acpi/Kconfig # 9ebddac: ACPI, x86: Fix extended error log
# 7ea6c6c: Move cper.c from drivers/acpi/ape # 4b3db70: ACPI, x86: Extended error log dri

  drivers/acpi/Makefile              # 4b3db70: ACPI, x86: Extended error log dri
  drivers/acpi/acpi_extlog.c         # 4b3db70: ACPI, x86: Extended error log dri
  drivers/acpi/apei/Kconfig          # 7ea6c6c: Move cper.c from drivers/acpi/ape
  drivers/acpi/apei/Makefile         # 7ea6c6c: Move cper.c from drivers/acpi/ape
  drivers/acpi/apei/apei-internal.h  # 88f074f: ACPI, CPER: Update cper info
  drivers/acpi/apei/cper.c           # 7ea6c6c: Move cper.c from drivers/acpi/ape
                                   # f6edea7: ACPI, APEI, CPER: Cleanup CPER me
                                   # fbeef85: ACPI, APEI, CPER: Enhance memory 
                                   # 147de14: ACPI, APEI, CPER: Add UEFI 2.4 su
                                   # 88f074f: ACPI, CPER: Update cper info
                                   # 833ba4b: ACPI, APEI, CPER: Fix status chec
  drivers/acpi/apei/ghes.c           # 147de14: ACPI, APEI, CPER: Add UEFI 2.4 su
                                   # 88f074f: ACPI, CPER: Update cper info
  drivers/acpi/bus.c                 # 4b3db70: ACPI, x86: Extended error log dri
  drivers/edac/amd64_edac.c          # 10ef6b0: bitops: Introduce a more generic 
  drivers/edac/amd64_edac.h          # 10ef6b0: bitops: Introduce a more generic 
  drivers/edac/ghes_edac.c           # 5650769: EDAC, GHES: Update ghes error rec
                                   # 147de14: ACPI, APEI, CPER: Add UEFI 2.4 su
  drivers/edac/sb_edac.c             # 10ef6b0: bitops: Introduce a more generic 
  drivers/firmware/dmi_scan.c        # 0841c04: dmi: Avoid unaligned memory acces
                                   # dd6dad4: DMI: Parse memory device (type 17
  drivers/firmware/efi/Kconfig       # 7ea6c6c: Move cper.c from drivers/acpi/ape
  drivers/firmware/efi/Makefile      # 7ea6c6c: Move cper.c from drivers/acpi/ape
  drivers/firmware/efi/cper.c        # 7ea6c6c: Move cper.c from drivers/acpi/ape
  drivers/video/sis/init.c           # 10ef6b0: bitops: Introduce a more generic 
  include/acpi/actbl1.h              # 88f074f: ACPI, CPER: Update cper info
  include/acpi/ghes.h                # 88f074f: ACPI, CPER: Update cper info
  include/linux/acpi.h               # 4b3db70: ACPI, x86: Extended error log dri
  include/linux/bitops.h             # 10ef6b0: bitops: Introduce a more generic 
  include/linux/cper.h               # 147de14: ACPI, APEI, CPER: Add UEFI 2.4 su

# 88f074f: ACPI, CPER: Update cper info
include/linux/dmi.h # dd6dad4: DMI: Parse memory device (type 17
include/linux/edac.h # 5650769: EDAC, GHES: Update ghes error rec

Thanks,

Ingo

------------------>
Chen, Gong (9):
ACPI, APEI, CPER: Fix status check during error printing ACPI, CPER: Update cper info
bitops: Introduce a more generic BITMASK macro ACPI, x86: Extended error log driver for x86 platform
DMI: Parse memory device (type 17) in SMBIOS ACPI, APEI, CPER: Add UEFI 2.4 support for memory error ACPI, APEI, CPER: Enhance memory reporting capability ACPI, APEI, CPER: Cleanup CPER memory error output format EDAC, GHES: Update ghes error record info

Tony Luck (3):
Move cper.c from drivers/acpi/apei to drivers/firmware/efi
dmi: Avoid unaligned memory access in save_mem_devices()
ACPI, x86: Fix extended error log driver to depend on CONFIG_X86_LOCAL_APIC

 arch/ia64/kernel/setup.c                   |   1 +
 arch/x86/include/asm/mce.h                 |   1 +
 arch/x86/kernel/cpu/mcheck/mce-apei.c      |   3 +-
 arch/x86/kernel/setup.c                    |   1 +
 drivers/acpi/Kconfig                       |  21 ++
 drivers/acpi/Makefile                      |   2 +
 drivers/acpi/acpi_extlog.c                 | 327 +++++++++++++++++++++++++++++
 drivers/acpi/apei/Kconfig                  |   2 +
 drivers/acpi/apei/Makefile                 |   2 +-
 drivers/acpi/apei/apei-internal.h          |  12 +-
 drivers/acpi/apei/ghes.c                   |  58 ++---
 drivers/acpi/bus.c                         |   3 +-
 drivers/edac/amd64_edac.c                  |  46 ++--
 drivers/edac/amd64_edac.h                  |   8 -
 drivers/edac/ghes_edac.c                   |  16 +-
 drivers/edac/sb_edac.c                     |   2 +-
 drivers/firmware/dmi_scan.c                |  61 ++++++
 drivers/firmware/efi/Kconfig               |   3 +
 drivers/firmware/efi/Makefile              |   1 +
 drivers/{acpi/apei => firmware/efi}/cper.c | 132 ++++++------
 drivers/video/sis/init.c                   |   5 +-
 include/acpi/actbl1.h                      |  14 +-
 include/acpi/ghes.h                        |   2 +-
 include/linux/acpi.h                       |   1 +
 include/linux/bitops.h                     |   8 +
 include/linux/cper.h                       |  13 +-
 include/linux/dmi.h                        |   5 +
 include/linux/edac.h                       |   2 +-
 28 files changed, 602 insertions(+), 150 deletions(-)
 create mode 100644 drivers/acpi/acpi_extlog.c
 rename drivers/{acpi/apei => firmware/efi}/cper.c (76%)
arch/ia64/kernel/setup.c +1 -0
index 4fc2e95..d86669b 100644
@@ -1063,6 +1063,7 @@ check_bugs (void)
 static int __init run_dmi_scan(void)
 {
 	dmi_scan_machine();
+	dmi_memdev_walk();
 	dmi_set_dump_stack_arch_desc();
 	return 0;
 }
arch/x86/include/asm/mce.h +1 -0
index cbe6b9e..c696a86 100644
@@ -16,6 +16,7 @@
 #define MCG_EXT_CNT_SHIFT	16
 #define MCG_EXT_CNT(c)		(((c) & MCG_EXT_CNT_MASK) >> MCG_EXT_CNT_SHIFT)
 #define MCG_SER_P		(1ULL<<24)   /* MCA recovery/new status bits */
+#define MCG_ELOG_P		(1ULL<<26)   /* Extended error log supported */
 
 /* MCG_STATUS register defines */
 #define MCG_STATUS_RIPV  (1ULL<<0)   /* restart ip valid */
arch/x86/kernel/cpu/mcheck/mce-apei.c +1 -2
index cd8b166..de8b60a 100644
@@ -42,8 +42,7 @@ void apei_mce_report_mem_error(int corrected, struct cper_sec_mem_err *mem_err)
 	struct mce m;
 
 	/* Only corrected MC is reported */
-	if (!corrected || !(mem_err->validation_bits &
-				CPER_MEM_VALID_PHYSICAL_ADDRESS))
+	if (!corrected || !(mem_err->validation_bits & CPER_MEM_VALID_PA))
 		return;
 
 	mce_setup(&m);
arch/x86/kernel/setup.c +1 -0
index f0de629..918d489 100644
@@ -993,6 +993,7 @@ void __init setup_arch(char **cmdline_p)
 		efi_init();
 
 	dmi_scan_machine();
+	dmi_memdev_walk();
 	dmi_set_dump_stack_arch_desc();
 
 	/*
drivers/acpi/Kconfig +21 -0
index 6efe2ac..e11faae 100644
@@ -372,4 +372,25 @@ config ACPI_BGRT
 
 source "drivers/acpi/apei/Kconfig"
 
+config ACPI_EXTLOG
+	tristate "Extended Error Log support"
+	depends on X86_MCE && X86_LOCAL_APIC
+	select EFI
+	select UEFI_CPER
+	default n
+	help
+	  Certain usages such as Predictive Failure Analysis (PFA) require
+	  more information about the error than what can be described in
+	  processor machine check banks. Most server processors log
+	  additional information about the error in processor uncore
+	  registers. Since the addresses and layout of these registers vary
+	  widely from one processor to another, system software cannot
+	  readily make use of them. To complicate matters further, some of
+	  the additional error information cannot be constructed without
+	  detailed knowledge about platform topology.
+
+	  Enhanced MCA Logging allows firmware to provide additional error
+	  information to system software, synchronous with MCE or CMCI. This
+	  driver adds support for that functionality.
+
 endif	# ACPI
drivers/acpi/Makefile +2 -0
index cdaf68b..bce34af 100644
@@ -82,3 +82,5 @@ processor-$(CONFIG_CPU_FREQ)	+= processor_perflib.o
 obj-$(CONFIG_ACPI_PROCESSOR_AGGREGATOR) += acpi_pad.o
 
 obj-$(CONFIG_ACPI_APEI)		+= apei/
+
+obj-$(CONFIG_ACPI_EXTLOG)	+= acpi_extlog.o
drivers/acpi/acpi_extlog.c new file +327 -0

327 lines not on this page · raw message

drivers/acpi/apei/Kconfig +2 -0
index f0c1ce9..786294b 100644
@@ -2,6 +2,8 @@ config ACPI_APEI
 	bool "ACPI Platform Error Interface (APEI)"
 	select MISC_FILESYSTEMS
 	select PSTORE
+	select EFI
+	select UEFI_CPER
 	depends on X86
 	help
 	  APEI allows to report errors (for example from the chipset)
drivers/acpi/apei/Makefile +1 -1
index d1d1bc0..5d575a9 100644
@@ -3,4 +3,4 @@ obj-$(CONFIG_ACPI_APEI_GHES)	+= ghes.o
 obj-$(CONFIG_ACPI_APEI_EINJ)	+= einj.o
 obj-$(CONFIG_ACPI_APEI_ERST_DEBUG) += erst-dbg.o
 
-apei-y := apei-base.o hest.o cper.o erst.o
+apei-y := apei-base.o hest.o erst.o
drivers/acpi/apei/apei-internal.h +6 -6
index f220d64..21ba34a 100644
@@ -122,11 +122,11 @@ struct dentry;
 struct dentry *apei_get_debugfs_dir(void);
 
 #define apei_estatus_for_each_section(estatus, section)			\
-	for (section = (struct acpi_hest_generic_data *)(estatus + 1);	\
+	for (section = (struct acpi_generic_data *)(estatus + 1);	\
 	     (void *)section - (void *)estatus < estatus->data_length;	\
 	     section = (void *)(section+1) + section->error_data_length)
 
-static inline u32 apei_estatus_len(struct acpi_hest_generic_status *estatus)
+static inline u32 cper_estatus_len(struct acpi_generic_status *estatus)
 {
 	if (estatus->raw_data_length)
 		return estatus->raw_data_offset + \
@@ -135,10 +135,10 @@ static inline u32 apei_estatus_len(struct acpi_hest_generic_status *estatus)
 		return sizeof(*estatus) + estatus->data_length;
 }
 
-void apei_estatus_print(const char *pfx,
-			const struct acpi_hest_generic_status *estatus);
-int apei_estatus_check_header(const struct acpi_hest_generic_status *estatus);
-int apei_estatus_check(const struct acpi_hest_generic_status *estatus);
+void cper_estatus_print(const char *pfx,
+			const struct acpi_generic_status *estatus);
+int cper_estatus_check_header(const struct acpi_generic_status *estatus);
+int cper_estatus_check(const struct acpi_generic_status *estatus);
 
 int apei_osc_setup(void);
 #endif
drivers/acpi/apei/ghes.c +29 -29

206 lines not on this page · raw message

drivers/acpi/bus.c +2 -1
index b587ec8..e1bd9a1 100644
@@ -174,7 +174,7 @@ static void acpi_print_osc_error(acpi_handle handle,
 	printk("\n");
 }
 
-static acpi_status acpi_str_to_uuid(char *str, u8 *uuid)
+acpi_status acpi_str_to_uuid(char *str, u8 *uuid)
 {
 	int i;
 	static int opc_map_to_uuid[16] = {6, 4, 2, 0, 11, 9, 16, 14, 19, 21,
@@ -195,6 +195,7 @@ static acpi_status acpi_str_to_uuid(char *str, u8 *uuid)
 	}
 	return AE_OK;
 }
+EXPORT_SYMBOL_GPL(acpi_str_to_uuid);
 
 acpi_status acpi_run_osc(acpi_handle handle, struct acpi_osc_context *context)
 {
drivers/edac/amd64_edac.c +24 -22

129 lines not on this page · raw message

drivers/edac/amd64_edac.h +0 -8
index d2443cf..6dc1fcc 100644
@@ -160,14 +160,6 @@
 #define OFF false
 
 /*
- * Create a contiguous bitmask starting at bit position @lo and ending at
- * position @hi. For example
- *
- * GENMASK(21, 39) gives us the 64bit vector 0x000000ffffe00000.
- */
-#define GENMASK(lo, hi)			(((1ULL << ((hi) - (lo) + 1)) - 1) << (lo))
-
-/*
  * PCI-defined configuration space registers
  */
 #define PCI_DEVICE_ID_AMD_15H_M30H_NB_F1 0x141b
drivers/edac/ghes_edac.c +13 -3
index bb53467..d5a98a4 100644
@@ -297,15 +297,14 @@ void ghes_edac_report_mem_error(struct ghes *ghes, int sev,
 	}
 
 	/* Error address */
-	if (mem_err->validation_bits & CPER_MEM_VALID_PHYSICAL_ADDRESS) {
+	if (mem_err->validation_bits & CPER_MEM_VALID_PA) {
 		e->page_frame_number = mem_err->physical_addr >> PAGE_SHIFT;
 		e->offset_in_page = mem_err->physical_addr & ~PAGE_MASK;
 	}
 
 	/* Error grain */
-	if (mem_err->validation_bits & CPER_MEM_VALID_PHYSICAL_ADDRESS_MASK) {
+	if (mem_err->validation_bits & CPER_MEM_VALID_PA_MASK)
 		e->grain = ~(mem_err->physical_addr_mask & ~PAGE_MASK);
-	}
 
 	/* Memory error location, mapped on e->location */
 	p = e->location;
@@ -315,6 +314,8 @@ void ghes_edac_report_mem_error(struct ghes *ghes, int sev,
 		p += sprintf(p, "card:%d ", mem_err->card);
 	if (mem_err->validation_bits & CPER_MEM_VALID_MODULE)
 		p += sprintf(p, "module:%d ", mem_err->module);
+	if (mem_err->validation_bits & CPER_MEM_VALID_RANK_NUMBER)
+		p += sprintf(p, "rank:%d ", mem_err->rank);
 	if (mem_err->validation_bits & CPER_MEM_VALID_BANK)
 		p += sprintf(p, "bank:%d ", mem_err->bank);
 	if (mem_err->validation_bits & CPER_MEM_VALID_ROW)
@@ -323,6 +324,15 @@ void ghes_edac_report_mem_error(struct ghes *ghes, int sev,
 		p += sprintf(p, "col:%d ", mem_err->column);
 	if (mem_err->validation_bits & CPER_MEM_VALID_BIT_POSITION)
 		p += sprintf(p, "bit_pos:%d ", mem_err->bit_pos);
+	if (mem_err->validation_bits & CPER_MEM_VALID_MODULE_HANDLE) {
+		const char *bank = NULL, *device = NULL;
+		dmi_memdev_name(mem_err->mem_dev_handle, &bank, &device);
+		if (bank != NULL && device != NULL)
+			p += sprintf(p, "DIMM location:%s %s ", bank, device);
+		else
+			p += sprintf(p, "DIMM DMI handle: 0x%.4x ",
+				     mem_err->mem_dev_handle);
+	}
 	if (p > e->location)
 		*(p - 1) = '\0';
 
drivers/edac/sb_edac.c +1 -1
index e04462b..88f60c5 100644
@@ -50,7 +50,7 @@ static int probed;
  * Get a bit field at register value <v>, from bit <lo> to bit <hi>
  */
 #define GET_BITFIELD(v, lo, hi)	\
-	(((v) & ((1ULL << ((hi) - (lo) + 1)) - 1) << (lo)) >> (lo))
+	(((v) & GENMASK_ULL(hi, lo)) >> (lo))
 
 /*
  * sbridge Memory Controller Registers
drivers/firmware/dmi_scan.c +61 -0

82 lines not on this page · raw message

drivers/firmware/efi/Kconfig +3 -0
index b0fc7c7..3150aa4 100644
@@ -36,4 +36,7 @@ config EFI_VARS_PSTORE_DEFAULT_DISABLE
 	  backend for pstore by default. This setting can be overridden
 	  using the efivars module's pstore_disable parameter.
 
+config UEFI_CPER
+	def_bool n
+
 endmenu
drivers/firmware/efi/Makefile +1 -0
index 99245ab..9ba156d 100644
@@ -4,3 +4,4 @@
 obj-y					+= efi.o vars.o
 obj-$(CONFIG_EFI_VARS)			+= efivars.o
 obj-$(CONFIG_EFI_VARS_PSTORE)		+= efi-pstore.o
+obj-$(CONFIG_UEFI_CPER)			+= cper.o
drivers/firmware/efi/cper.c renamed from drivers/acpi/apei/cper.c +70 -62

294 lines not on this page · raw message

drivers/video/sis/init.c +2 -3
index f082ae5..4f26bc2 100644
@@ -3320,9 +3320,8 @@ SiSSetMode(struct SiS_Private *SiS_Pr, unsigned short ModeNo)
 }
 
 #ifndef GETBITSTR
-#define BITMASK(h,l)    	(((unsigned)(1U << ((h)-(l)+1))-1)<<(l))
-#define GENMASK(mask)   	BITMASK(1?mask,0?mask)
-#define GETBITS(var,mask)   	(((var) & GENMASK(mask)) >> (0?mask))
+#define GENBITSMASK(mask)   	GENMASK(1?mask,0?mask)
+#define GETBITS(var,mask)   	(((var) & GENBITSMASK(mask)) >> (0?mask))
 #define GETBITSTR(val,from,to)  ((GETBITS(val,from)) << (0?to))
 #endif
 
include/acpi/actbl1.h +7 -7
index 0bd750e..556c83ee 100644
@@ -596,7 +596,7 @@ struct acpi_hest_generic {
 
 /* Generic Error Status block */
 
-struct acpi_hest_generic_status {
+struct acpi_generic_status {
 	u32 block_status;
 	u32 raw_data_offset;
 	u32 raw_data_length;
@@ -606,15 +606,15 @@ struct acpi_hest_generic_status {
 
 /* Values for block_status flags above */
 
-#define ACPI_HEST_UNCORRECTABLE             (1)
-#define ACPI_HEST_CORRECTABLE               (1<<1)
-#define ACPI_HEST_MULTIPLE_UNCORRECTABLE    (1<<2)
-#define ACPI_HEST_MULTIPLE_CORRECTABLE      (1<<3)
-#define ACPI_HEST_ERROR_ENTRY_COUNT         (0xFF<<4)	/* 8 bits, error count */
+#define ACPI_GEN_ERR_UC			BIT(0)
+#define ACPI_GEN_ERR_CE			BIT(1)
+#define ACPI_GEN_ERR_MULTI_UC		BIT(2)
+#define ACPI_GEN_ERR_MULTI_CE		BIT(3)
+#define ACPI_GEN_ERR_COUNT_SHIFT	(0xFF<<4) /* 8 bits, error count */
 
 /* Generic Error Data entry */
 
-struct acpi_hest_generic_data {
+struct acpi_generic_data {
 	u8 section_type[16];
 	u32 error_severity;
 	u16 revision;
include/acpi/ghes.h +1 -1
index 720446c..dfd60d0 100644
@@ -14,7 +14,7 @@
 
 struct ghes {
 	struct acpi_hest_generic *generic;
-	struct acpi_hest_generic_status *estatus;
+	struct acpi_generic_status *estatus;
 	u64 buffer_paddr;
 	unsigned long flags;
 	union {
include/linux/acpi.h +1 -0
index a5db4ae..c30bac8 100644
@@ -311,6 +311,7 @@ struct acpi_osc_context {
 #define OSC_INVALID_REVISION_ERROR	8
 #define OSC_CAPABILITIES_MASK_ERROR	16
 
+acpi_status acpi_str_to_uuid(char *str, u8 *uuid);
 acpi_status acpi_run_osc(acpi_handle handle, struct acpi_osc_context *context);
 
 /* platform-wide _OSC bits */
include/linux/bitops.h +8 -0
index a3b6b82..bd0c459 100644
@@ -10,6 +10,14 @@
 #define BITS_TO_LONGS(nr)	DIV_ROUND_UP(nr, BITS_PER_BYTE * sizeof(long))
 #endif
 
+/*
+ * Create a contiguous bitmask starting at bit position @l and ending at
+ * position @h. For example
+ * GENMASK_ULL(39, 21) gives us the 64bit vector 0x000000ffffe00000.
+ */
+#define GENMASK(h, l)		(((U32_C(1) << ((h) - (l) + 1)) - 1) << (l))
+#define GENMASK_ULL(h, l)	(((U64_C(1) << ((h) - (l) + 1)) - 1) << (l))
+
 extern unsigned int __sw_hweight8(unsigned int w);
 extern unsigned int __sw_hweight16(unsigned int w);
 extern unsigned int __sw_hweight32(unsigned int w);
include/linux/cper.h +10 -3
index c230494..2fc0ec3 100644
@@ -218,8 +218,8 @@ enum {
 #define CPER_PROC_VALID_IP			0x1000
 
 #define CPER_MEM_VALID_ERROR_STATUS		0x0001
-#define CPER_MEM_VALID_PHYSICAL_ADDRESS		0x0002
-#define CPER_MEM_VALID_PHYSICAL_ADDRESS_MASK	0x0004
+#define CPER_MEM_VALID_PA			0x0002
+#define CPER_MEM_VALID_PA_MASK			0x0004
 #define CPER_MEM_VALID_NODE			0x0008
 #define CPER_MEM_VALID_CARD			0x0010
 #define CPER_MEM_VALID_MODULE			0x0020
@@ -232,6 +232,9 @@ enum {
 #define CPER_MEM_VALID_RESPONDER_ID		0x1000
 #define CPER_MEM_VALID_TARGET_ID		0x2000
 #define CPER_MEM_VALID_ERROR_TYPE		0x4000
+#define CPER_MEM_VALID_RANK_NUMBER		0x8000
+#define CPER_MEM_VALID_CARD_HANDLE		0x10000
+#define CPER_MEM_VALID_MODULE_HANDLE		0x20000
 
 #define CPER_PCIE_VALID_PORT_TYPE		0x0001
 #define CPER_PCIE_VALID_VERSION			0x0002
@@ -347,6 +350,10 @@ struct cper_sec_mem_err {
 	__u64	responder_id;
 	__u64	target_id;
 	__u8	error_type;
+	__u8	reserved;
+	__u16	rank;
+	__u16	mem_array_handle;	/* card handle in UEFI 2.4 */
+	__u16	mem_dev_handle;		/* module handle in UEFI 2.4 */
 };
 
 struct cper_sec_pcie {
@@ -389,6 +396,6 @@ struct cper_sec_pcie {
 
 u64 cper_next_record_id(void);
 void cper_print_bits(const char *prefix, unsigned int bits,
-		     const char *strs[], unsigned int strs_size);
+		     const char * const strs[], unsigned int strs_size);
 
 #endif
include/linux/dmi.h +5 -0
index b6eb7a0..f820f0a 100644
@@ -99,6 +99,7 @@ extern const char * dmi_get_system_info(int field);
 extern const struct dmi_device * dmi_find_device(int type, const char *name,
 	const struct dmi_device *from);
 extern void dmi_scan_machine(void);
+extern void dmi_memdev_walk(void);
 extern void dmi_set_dump_stack_arch_desc(void);
 extern bool dmi_get_date(int field, int *yearp, int *monthp, int *dayp);
 extern int dmi_name_in_vendors(const char *str);
@@ -107,6 +108,7 @@ extern int dmi_available;
 extern int dmi_walk(void (*decode)(const struct dmi_header *, void *),
 	void *private_data);
 extern bool dmi_match(enum dmi_field f, const char *str);
+extern void dmi_memdev_name(u16 handle, const char **bank, const char **device);
 
 #else
 
@@ -115,6 +117,7 @@ static inline const char * dmi_get_system_info(int field) { return NULL; }
 static inline const struct dmi_device * dmi_find_device(int type, const char *name,
 	const struct dmi_device *from) { return NULL; }
 static inline void dmi_scan_machine(void) { return; }
+static inline void dmi_memdev_walk(void) { }
 static inline void dmi_set_dump_stack_arch_desc(void) { }
 static inline bool dmi_get_date(int field, int *yearp, int *monthp, int *dayp)
 {
@@ -133,6 +136,8 @@ static inline int dmi_walk(void (*decode)(const struct dmi_header *, void *),
 	void *private_data) { return -1; }
 static inline bool dmi_match(enum dmi_field f, const char *str)
 	{ return false; }
+static inline void dmi_memdev_name(u16 handle, const char **bank,
+		const char **device) { }
 static inline const struct dmi_system_id *
 	dmi_first_match(const struct dmi_system_id *list) { return NULL; }
 
include/linux/edac.h +1 -1
index 5c6d7fb..dbdffe8 100644
@@ -51,7 +51,7 @@ static inline void opstate_init(void)
 #define EDAC_MC_LABEL_LEN	31
 
 /* Maximum size of the location string */
-#define LOCATION_SIZE 80
+#define LOCATION_SIZE 256
 
 /* Defines the maximum number of labels that can be reported */
 #define EDAC_MAX_LABELS		8