soc/amd: factor out check_mca to common code

Change-Id: I139d1fe41bad5213da8890c2867f275b6847e3e1
Signed-off-by: Felix Held <felix-coreboot@felixheld.de>
Reviewed-on: https://review.coreboot.org/c/coreboot/+/56281
Reviewed-by: Martin Roth <martinroth@google.com>
Tested-by: build bot (Jenkins) <no-reply@coreboot.org>
This commit is contained in:
Felix Held 2021-07-14 00:05:39 +02:00
parent dc970fc039
commit 1e1d490ff8
10 changed files with 40 additions and 28 deletions

View File

@ -50,6 +50,7 @@ config SOC_SPECIFIC_OPTIONS
select SOC_AMD_COMMON_BLOCK_IOMMU select SOC_AMD_COMMON_BLOCK_IOMMU
select SOC_AMD_COMMON_BLOCK_LPC select SOC_AMD_COMMON_BLOCK_LPC
select SOC_AMD_COMMON_BLOCK_LPC_SPI_DMA 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_NONCAR
select SOC_AMD_COMMON_BLOCK_PCI select SOC_AMD_COMMON_BLOCK_PCI
select SOC_AMD_COMMON_BLOCK_PCI_MMCONF select SOC_AMD_COMMON_BLOCK_PCI_MMCONF

View File

@ -1,18 +1,8 @@
/* SPDX-License-Identifier: GPL-2.0-only */ /* SPDX-License-Identifier: GPL-2.0-only */
#include <amdblocks/mca.h> #include <amdblocks/mca.h>
#include <cpu/x86/msr.h>
static void mca_check_all_banks(void) void mca_check_all_banks(void)
{ {
/* TODO: Implement MCAX register checking and BERT table generation. */ /* 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();
}

View File

@ -26,6 +26,26 @@ config MEMLAYOUT_LD_FILE
endif # SOC_AMD_COMMON_BLOCK_NONCAR 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 config SOC_AMD_COMMON_BLOCK_SMM
bool bool
help help

View File

@ -0,0 +1 @@
ramstage-$(CONFIG_SOC_AMD_COMMON_BLOCK_MCA_COMMON) += mca_common.c

View File

@ -0,0 +1,12 @@
/* SPDX-License-Identifier: GPL-2.0-only */
#include <amdblocks/mca.h>
#include <cpu/x86/msr.h>
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();
}

View File

@ -4,5 +4,6 @@
#define AMD_BLOCK_MCA_H #define AMD_BLOCK_MCA_H
void check_mca(void); void check_mca(void);
void mca_check_all_banks(void);
#endif /* AMD_BLOCK_MCA_H */ #endif /* AMD_BLOCK_MCA_H */

View File

@ -41,6 +41,7 @@ config CPU_SPECIFIC_OPTIONS
select SOC_AMD_COMMON_BLOCK_I2C select SOC_AMD_COMMON_BLOCK_I2C
select SOC_AMD_COMMON_BLOCK_IOMMU select SOC_AMD_COMMON_BLOCK_IOMMU
select SOC_AMD_COMMON_BLOCK_LPC select SOC_AMD_COMMON_BLOCK_LPC
select SOC_AMD_COMMON_BLOCK_MCAX
select SOC_AMD_COMMON_BLOCK_NONCAR select SOC_AMD_COMMON_BLOCK_NONCAR
select SOC_AMD_COMMON_BLOCK_PCI select SOC_AMD_COMMON_BLOCK_PCI
select SOC_AMD_COMMON_BLOCK_PCIE_GPP_DRIVER select SOC_AMD_COMMON_BLOCK_PCIE_GPP_DRIVER

View File

@ -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); 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; struct mca_bank_status mci;
const unsigned int num_banks = mca_get_bank_count(); 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();
}

View File

@ -33,6 +33,7 @@ config CPU_SPECIFIC_OPTIONS
select SOC_AMD_COMMON_BLOCK_I2C select SOC_AMD_COMMON_BLOCK_I2C
select SOC_AMD_COMMON_BLOCK_IOMMU select SOC_AMD_COMMON_BLOCK_IOMMU
select SOC_AMD_COMMON_BLOCK_LPC select SOC_AMD_COMMON_BLOCK_LPC
select SOC_AMD_COMMON_BLOCK_MCA
select SOC_AMD_COMMON_BLOCK_PCI select SOC_AMD_COMMON_BLOCK_PCI
select SOC_AMD_COMMON_BLOCK_PI select SOC_AMD_COMMON_BLOCK_PI
select SOC_AMD_COMMON_BLOCK_PM select SOC_AMD_COMMON_BLOCK_PM

View File

@ -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); 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; struct mca_bank_status mci;
const unsigned int num_banks = mca_get_bank_count(); 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();
}