summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAamir Bohra <aamir.bohra@intel.com>2021-02-19 16:35:09 +0530
committerFurquan Shaikh <furquan@google.com>2021-02-23 03:39:54 +0000
commit01ae4a7706f95bfe77fd629516d3b9436ae9629d (patch)
tree4d2ef787993a99a2f448ae87ff990ae5fbec4e79
parentd192590e29167a34a55439308686957feee07b71 (diff)
intel/fsp2_0: Fix the mp_get_processor_info
FSP expects mp_get_processor_info to give processor specfic apic ID, core(zero-indexed), package(zero-indexed) and thread(zero-indexed) info. This function is run from BSP for all logical processor, With current implementation the location information returned is incorrect per logical processor. Also the processor id returned does not correspond to the processor index, rather is returned only for the BSP. BUG=b:179113790 Change-Id: Ief8677e4830a765af61a0df9621ecaa372730fca Signed-off-by: Aamir Bohra <aamir.bohra@intel.com> Reviewed-on: https://review.coreboot.org/c/coreboot/+/50880 Reviewed-by: EricR Lai <ericr_lai@compal.corp-partner.google.com> Reviewed-by: Furquan Shaikh <furquan@google.com> Reviewed-by: Tim Wawrzynczak <twawrzynczak@chromium.org> Tested-by: build bot (Jenkins) <no-reply@coreboot.org>
-rw-r--r--src/drivers/intel/fsp2_0/ppi/mp_service_ppi.c21
1 files changed, 13 insertions, 8 deletions
diff --git a/src/drivers/intel/fsp2_0/ppi/mp_service_ppi.c b/src/drivers/intel/fsp2_0/ppi/mp_service_ppi.c
index 87056a5b7c..29a02b108c 100644
--- a/src/drivers/intel/fsp2_0/ppi/mp_service_ppi.c
+++ b/src/drivers/intel/fsp2_0/ppi/mp_service_ppi.c
@@ -1,6 +1,7 @@
/* SPDX-License-Identifier: GPL-2.0-only */
#include <console/console.h>
+#include <cpu/cpu.h>
#include <cpu/x86/mp.h>
#include <cpu/x86/lapic.h>
#include <cpu/intel/microcode.h>
@@ -10,7 +11,6 @@
#include <intelblocks/mp_init.h>
#define BSP_CPU_SLOT 0
-#define SINGLE_CHIP_PACKAGE 0
efi_return_status_t mp_get_number_of_processors(efi_uintn_t *number_of_processors,
efi_uintn_t *number_of_enabled_processors)
@@ -28,7 +28,8 @@ efi_return_status_t mp_get_number_of_processors(efi_uintn_t *number_of_processor
efi_return_status_t mp_get_processor_info(efi_uintn_t processor_number,
efi_processor_information *processor_info_buffer)
{
- unsigned int num_virt_cores, num_phys_cores;
+ int apicid;
+ uint8_t package, core, thread;
if (cpu_index() < 0)
return FSP_DEVICE_ERROR;
@@ -39,7 +40,12 @@ efi_return_status_t mp_get_processor_info(efi_uintn_t processor_number,
if (processor_number >= get_cpu_count())
return FSP_NOT_FOUND;
- processor_info_buffer->ProcessorId = lapicid();
+ apicid = cpu_get_apic_id(processor_number);
+
+ if (apicid < 0)
+ return FSP_DEVICE_ERROR;
+
+ processor_info_buffer->ProcessorId = apicid;
processor_info_buffer->StatusFlag = PROCESSOR_HEALTH_STATUS_BIT
| PROCESSOR_ENABLED_BIT;
@@ -48,12 +54,11 @@ efi_return_status_t mp_get_processor_info(efi_uintn_t processor_number,
processor_info_buffer->StatusFlag |= PROCESSOR_AS_BSP_BIT;
/* Fill EFI_CPU_PHYSICAL_LOCATION structure information */
- cpu_read_topology(&num_phys_cores, &num_virt_cores);
+ get_cpu_topology_from_apicid(apicid, &package, &core, &thread);
- /* FSP will add one to the value in this Package field */
- processor_info_buffer->Location.Package = SINGLE_CHIP_PACKAGE;
- processor_info_buffer->Location.Core = num_phys_cores;
- processor_info_buffer->Location.Thread = num_virt_cores;
+ processor_info_buffer->Location.Package = package;
+ processor_info_buffer->Location.Core = core;
+ processor_info_buffer->Location.Thread = thread;
return FSP_SUCCESS;
}