From b096d625d53cfc5bf2dbc38310427efa7521001d Mon Sep 17 00:00:00 2001 From: Patrick Rudolph Date: Fri, 14 Jul 2023 17:18:18 +0200 Subject: soc/intel/xeon_sp: Introduce soc_cpu_is_enabled Add a function to check if the CPU placed at the specified socket was found usable during QPI init. This is useful for multi-socket platforms were a CPU is missing or has been disabled due to an error. Change-Id: I135968fcc905928b9bc6511e3ddbd7d12bad0096 Signed-off-by: Patrick Rudolph Reviewed-on: https://review.coreboot.org/c/coreboot/+/76556 Tested-by: build bot (Jenkins) Reviewed-by: Arthur Heymans --- src/soc/intel/xeon_sp/include/soc/util.h | 1 + src/soc/intel/xeon_sp/spr/soc_acpi.c | 2 +- src/soc/intel/xeon_sp/util.c | 12 ++++++++++++ 3 files changed, 14 insertions(+), 1 deletion(-) (limited to 'src/soc/intel/xeon_sp') diff --git a/src/soc/intel/xeon_sp/include/soc/util.h b/src/soc/intel/xeon_sp/include/soc/util.h index a828ffce96..8e80c64d14 100644 --- a/src/soc/intel/xeon_sp/include/soc/util.h +++ b/src/soc/intel/xeon_sp/include/soc/util.h @@ -13,6 +13,7 @@ msr_t read_msr_ppin(void); int get_platform_thread_count(void); const IIO_UDS *get_iio_uds(void); unsigned int soc_get_num_cpus(void); +bool soc_cpu_is_enabled(const size_t idx); void set_bios_init_completion(void); uint8_t soc_get_iio_ioapicid(int socket, int stack); diff --git a/src/soc/intel/xeon_sp/spr/soc_acpi.c b/src/soc/intel/xeon_sp/spr/soc_acpi.c index 5340b7bd74..2e77de28f3 100644 --- a/src/soc/intel/xeon_sp/spr/soc_acpi.c +++ b/src/soc/intel/xeon_sp/spr/soc_acpi.c @@ -394,7 +394,7 @@ void uncore_inject_dsdt(const struct device *device) const STACK_RES *ri = &hob->PlatformData.IIO_resource[socket].StackRes[stack]; - stack_enabled = hob->PlatformData.IIO_resource[socket].Valid && + stack_enabled = soc_cpu_is_enabled(socket) && ri->Personality < TYPE_RESERVED; printk(BIOS_DEBUG, "%s processing socket: %d, stack: %d, type: %d\n", diff --git a/src/soc/intel/xeon_sp/util.c b/src/soc/intel/xeon_sp/util.c index e0bf9bc5a4..be30923ac7 100644 --- a/src/soc/intel/xeon_sp/util.c +++ b/src/soc/intel/xeon_sp/util.c @@ -118,6 +118,18 @@ void get_iiostack_info(struct iiostack_resource *info) } } +/* + * Returns true if the CPU in the specified socket was found + * during QPI init, false otherwise. + */ +bool soc_cpu_is_enabled(const size_t idx) +{ + const IIO_UDS *hob = get_iio_uds(); + assert(idx < CONFIG_MAX_SOCKET); + + return hob->PlatformData.IIO_resource[idx].Valid; +} + unsigned int soc_get_num_cpus(void) { /* The FSP IIO UDS HOB has field numCpus, it is actually socket count */ -- cgit v1.2.3