x86 RAS changes for v3.13
Subsystems (12)
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:
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
@@ -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
@@ -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
@@ -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
@@ -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
@@ -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
@@ -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
@@ -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
@@ -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
@@ -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
@@ -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
@@ -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
@@ -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
@@ -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
@@ -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
@@ -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
@@ -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
@@ -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
@@ -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
@@ -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
@@ -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
@@ -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
@@ -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
@@ -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