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>
This commit is contained in:
parent
d192590e29
commit
01ae4a7706
|
@ -1,6 +1,7 @@
|
||||||
/* SPDX-License-Identifier: GPL-2.0-only */
|
/* SPDX-License-Identifier: GPL-2.0-only */
|
||||||
|
|
||||||
#include <console/console.h>
|
#include <console/console.h>
|
||||||
|
#include <cpu/cpu.h>
|
||||||
#include <cpu/x86/mp.h>
|
#include <cpu/x86/mp.h>
|
||||||
#include <cpu/x86/lapic.h>
|
#include <cpu/x86/lapic.h>
|
||||||
#include <cpu/intel/microcode.h>
|
#include <cpu/intel/microcode.h>
|
||||||
|
@ -10,7 +11,6 @@
|
||||||
#include <intelblocks/mp_init.h>
|
#include <intelblocks/mp_init.h>
|
||||||
|
|
||||||
#define BSP_CPU_SLOT 0
|
#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_return_status_t mp_get_number_of_processors(efi_uintn_t *number_of_processors,
|
||||||
efi_uintn_t *number_of_enabled_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_return_status_t mp_get_processor_info(efi_uintn_t processor_number,
|
||||||
efi_processor_information *processor_info_buffer)
|
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)
|
if (cpu_index() < 0)
|
||||||
return FSP_DEVICE_ERROR;
|
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())
|
if (processor_number >= get_cpu_count())
|
||||||
return FSP_NOT_FOUND;
|
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_info_buffer->StatusFlag = PROCESSOR_HEALTH_STATUS_BIT
|
||||||
| PROCESSOR_ENABLED_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;
|
processor_info_buffer->StatusFlag |= PROCESSOR_AS_BSP_BIT;
|
||||||
|
|
||||||
/* Fill EFI_CPU_PHYSICAL_LOCATION structure information */
|
/* 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 = package;
|
||||||
processor_info_buffer->Location.Package = SINGLE_CHIP_PACKAGE;
|
processor_info_buffer->Location.Core = core;
|
||||||
processor_info_buffer->Location.Core = num_phys_cores;
|
processor_info_buffer->Location.Thread = thread;
|
||||||
processor_info_buffer->Location.Thread = num_virt_cores;
|
|
||||||
|
|
||||||
return FSP_SUCCESS;
|
return FSP_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue