From 1e1d490ff885206dfb30dbd7a3dfeffa818afdb6 Mon Sep 17 00:00:00 2001 From: Felix Held Date: Wed, 14 Jul 2021 00:05:39 +0200 Subject: [PATCH] soc/amd: factor out check_mca to common code Change-Id: I139d1fe41bad5213da8890c2867f275b6847e3e1 Signed-off-by: Felix Held Reviewed-on: https://review.coreboot.org/c/coreboot/+/56281 Reviewed-by: Martin Roth Tested-by: build bot (Jenkins) --- src/soc/amd/cezanne/Kconfig | 1 + src/soc/amd/cezanne/mca.c | 12 +---------- src/soc/amd/common/block/cpu/Kconfig | 20 +++++++++++++++++++ src/soc/amd/common/block/cpu/mca/Makefile.inc | 1 + src/soc/amd/common/block/cpu/mca/mca_common.c | 12 +++++++++++ .../amd/common/block/include/amdblocks/mca.h | 1 + src/soc/amd/picasso/Kconfig | 1 + src/soc/amd/picasso/mca.c | 11 +--------- src/soc/amd/stoneyridge/Kconfig | 1 + src/soc/amd/stoneyridge/mca.c | 8 +------- 10 files changed, 40 insertions(+), 28 deletions(-) create mode 100644 src/soc/amd/common/block/cpu/mca/Makefile.inc create mode 100644 src/soc/amd/common/block/cpu/mca/mca_common.c diff --git a/src/soc/amd/cezanne/Kconfig b/src/soc/amd/cezanne/Kconfig index 8f93512ea3..71cca6a11b 100644 --- a/src/soc/amd/cezanne/Kconfig +++ b/src/soc/amd/cezanne/Kconfig @@ -50,6 +50,7 @@ config SOC_SPECIFIC_OPTIONS select SOC_AMD_COMMON_BLOCK_IOMMU select SOC_AMD_COMMON_BLOCK_LPC select SOC_AMD_COMMON_BLOCK_LPC_SPI_DMA + select SOC_AMD_COMMON_BLOCK_MCAX select SOC_AMD_COMMON_BLOCK_NONCAR select SOC_AMD_COMMON_BLOCK_PCI select SOC_AMD_COMMON_BLOCK_PCI_MMCONF diff --git a/src/soc/amd/cezanne/mca.c b/src/soc/amd/cezanne/mca.c index a8d97029f1..68fae29204 100644 --- a/src/soc/amd/cezanne/mca.c +++ b/src/soc/amd/cezanne/mca.c @@ -1,18 +1,8 @@ /* SPDX-License-Identifier: GPL-2.0-only */ #include -#include -static void mca_check_all_banks(void) +void mca_check_all_banks(void) { /* TODO: Implement MCAX register checking and BERT table generation. */ } - -/* Check the Machine Check Architecture Extension registers */ -void check_mca(void) -{ - mca_check_all_banks(); - /* mca_clear_status uses the MCA registers and not the MCAX ones. Since they are - aliases, we can use either set of registers. */ - mca_clear_status(); -} diff --git a/src/soc/amd/common/block/cpu/Kconfig b/src/soc/amd/common/block/cpu/Kconfig index 1437326f9d..79e011fadd 100644 --- a/src/soc/amd/common/block/cpu/Kconfig +++ b/src/soc/amd/common/block/cpu/Kconfig @@ -26,6 +26,26 @@ config MEMLAYOUT_LD_FILE endif # SOC_AMD_COMMON_BLOCK_NONCAR +config SOC_AMD_COMMON_BLOCK_MCA_COMMON + bool + help + Add common machine check architecture support. Do not select this + in the SoC's Kconfig; select either SOC_AMD_COMMON_BLOCK_MCA or + SOC_AMD_COMMON_BLOCK_MCAX which will select this one. + +config SOC_AMD_COMMON_BLOCK_MCA + bool + select SOC_AMD_COMMON_BLOCK_MCA_COMMON + help + Add IA32 machine check architecture (MCA) support for pre-Zen CPUs. + +config SOC_AMD_COMMON_BLOCK_MCAX + bool + select SOC_AMD_COMMON_BLOCK_MCA_COMMON + help + Add extended machine check architecture (MCAX) support for AMD family + 17h, 19h and possibly newer CPUs. + config SOC_AMD_COMMON_BLOCK_SMM bool help diff --git a/src/soc/amd/common/block/cpu/mca/Makefile.inc b/src/soc/amd/common/block/cpu/mca/Makefile.inc new file mode 100644 index 0000000000..0aa47e161c --- /dev/null +++ b/src/soc/amd/common/block/cpu/mca/Makefile.inc @@ -0,0 +1 @@ +ramstage-$(CONFIG_SOC_AMD_COMMON_BLOCK_MCA_COMMON) += mca_common.c diff --git a/src/soc/amd/common/block/cpu/mca/mca_common.c b/src/soc/amd/common/block/cpu/mca/mca_common.c new file mode 100644 index 0000000000..0a375089f2 --- /dev/null +++ b/src/soc/amd/common/block/cpu/mca/mca_common.c @@ -0,0 +1,12 @@ +/* SPDX-License-Identifier: GPL-2.0-only */ + +#include +#include + +void check_mca(void) +{ + mca_check_all_banks(); + /* mca_clear_status uses the MCA registers which can be used in both the MCA and MCAX + case */ + mca_clear_status(); +} diff --git a/src/soc/amd/common/block/include/amdblocks/mca.h b/src/soc/amd/common/block/include/amdblocks/mca.h index 9ea29e8ccc..16b016b4cb 100644 --- a/src/soc/amd/common/block/include/amdblocks/mca.h +++ b/src/soc/amd/common/block/include/amdblocks/mca.h @@ -4,5 +4,6 @@ #define AMD_BLOCK_MCA_H void check_mca(void); +void mca_check_all_banks(void); #endif /* AMD_BLOCK_MCA_H */ diff --git a/src/soc/amd/picasso/Kconfig b/src/soc/amd/picasso/Kconfig index 42c3bfc029..88bff50179 100644 --- a/src/soc/amd/picasso/Kconfig +++ b/src/soc/amd/picasso/Kconfig @@ -41,6 +41,7 @@ config CPU_SPECIFIC_OPTIONS select SOC_AMD_COMMON_BLOCK_I2C select SOC_AMD_COMMON_BLOCK_IOMMU select SOC_AMD_COMMON_BLOCK_LPC + select SOC_AMD_COMMON_BLOCK_MCAX select SOC_AMD_COMMON_BLOCK_NONCAR select SOC_AMD_COMMON_BLOCK_PCI select SOC_AMD_COMMON_BLOCK_PCIE_GPP_DRIVER diff --git a/src/soc/amd/picasso/mca.c b/src/soc/amd/picasso/mca.c index 24a921a7a6..97f5d0b819 100644 --- a/src/soc/amd/picasso/mca.c +++ b/src/soc/amd/picasso/mca.c @@ -192,7 +192,7 @@ static void mca_print_error(unsigned int bank) printk(BIOS_WARNING, " MC%u_CTL_MASK = %08x_%08x\n", bank, msr.hi, msr.lo); } -static void mca_check_all_banks(void) +void mca_check_all_banks(void) { struct mca_bank_status mci; const unsigned int num_banks = mca_get_bank_count(); @@ -214,12 +214,3 @@ static void mca_check_all_banks(void) } } } - -/* Check the Machine Check Architecture Extension registers */ -void check_mca(void) -{ - mca_check_all_banks(); - /* mca_clear_status uses the MCA registers and not the MCAX ones. Since they are - aliases, we can use either set of registers. */ - mca_clear_status(); -} diff --git a/src/soc/amd/stoneyridge/Kconfig b/src/soc/amd/stoneyridge/Kconfig index 821d1ee216..e799ea0b42 100644 --- a/src/soc/amd/stoneyridge/Kconfig +++ b/src/soc/amd/stoneyridge/Kconfig @@ -33,6 +33,7 @@ config CPU_SPECIFIC_OPTIONS select SOC_AMD_COMMON_BLOCK_I2C select SOC_AMD_COMMON_BLOCK_IOMMU select SOC_AMD_COMMON_BLOCK_LPC + select SOC_AMD_COMMON_BLOCK_MCA select SOC_AMD_COMMON_BLOCK_PCI select SOC_AMD_COMMON_BLOCK_PI select SOC_AMD_COMMON_BLOCK_PM diff --git a/src/soc/amd/stoneyridge/mca.c b/src/soc/amd/stoneyridge/mca.c index b3e6682074..cf3f3acc2d 100644 --- a/src/soc/amd/stoneyridge/mca.c +++ b/src/soc/amd/stoneyridge/mca.c @@ -179,7 +179,7 @@ static void mca_print_error(unsigned int bank) printk(BIOS_WARNING, " MC%u_CTL_MASK = %08x_%08x\n", bank, msr.hi, msr.lo); } -static void mca_check_all_banks(void) +void mca_check_all_banks(void) { struct mca_bank_status mci; const unsigned int num_banks = mca_get_bank_count(); @@ -201,9 +201,3 @@ static void mca_check_all_banks(void) } } } - -void check_mca(void) -{ - mca_check_all_banks(); - mca_clear_status(); -}