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>
diff --git a/src/soc/amd/cezanne/Kconfig b/src/soc/amd/cezanne/Kconfig
index 8f93512..71cca6a 100644
--- a/src/soc/amd/cezanne/Kconfig
+++ b/src/soc/amd/cezanne/Kconfig
@@ -50,6 +50,7 @@
 	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 a8d9702..68fae29 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 <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. */
 }
-
-/* 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 1437326..79e011f 100644
--- a/src/soc/amd/common/block/cpu/Kconfig
+++ b/src/soc/amd/common/block/cpu/Kconfig
@@ -26,6 +26,26 @@
 
 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 0000000..0aa47e1
--- /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 0000000..0a37508
--- /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 <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();
+}
diff --git a/src/soc/amd/common/block/include/amdblocks/mca.h b/src/soc/amd/common/block/include/amdblocks/mca.h
index 9ea29e8..16b016b 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 42c3bfc..88bff50 100644
--- a/src/soc/amd/picasso/Kconfig
+++ b/src/soc/amd/picasso/Kconfig
@@ -41,6 +41,7 @@
 	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 24a921a..97f5d0b 100644
--- a/src/soc/amd/picasso/mca.c
+++ b/src/soc/amd/picasso/mca.c
@@ -192,7 +192,7 @@
 	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 @@
 		}
 	}
 }
-
-/* 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 821d1ee..e799ea0 100644
--- a/src/soc/amd/stoneyridge/Kconfig
+++ b/src/soc/amd/stoneyridge/Kconfig
@@ -33,6 +33,7 @@
 	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 b3e6682..cf3f3ac 100644
--- a/src/soc/amd/stoneyridge/mca.c
+++ b/src/soc/amd/stoneyridge/mca.c
@@ -179,7 +179,7 @@
 	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 @@
 		}
 	}
 }
-
-void check_mca(void)
-{
-	mca_check_all_banks();
-	mca_clear_status();
-}