Skip to content

Commit a179333

Browse files
committed
UefiCpuPkg: Fix a bug about MP init on LoongArch
If the AP wakes up out of order for the 1st time, and the data in the HOB is also out of order, then there will be a issue: if the big number core wakes up before the small number core, the bit number core will modify the APIC number in the CpuMpData, whichi will cause the small number core can not be wake up. Using the APIC number from the HOB to wake up the APs can fix it. Signed-off-by: Chao Li <lichao@loongson.cn> Cc: Ray Ni <ray.ni@intel.com> Cc: Jiaxin Wu <jiaxin.wu@intel.com> Cc: Zhiguang Liu <zhiguang.liu@intel.com> Cc: Dun Tan <dun.tan@intel.com> Cc: Rahul Kumar <rahul1.kumar@intel.com> Cc: Gerd Hoffmann <kraxel@redhat.com> Cc: Star Zeng <star.zeng@intel.com> Cc: Dongyan Qian <qiandongyan@loongson.cn> Cc: Xiangdong Meng <mengxiangdong@loongson.cn>
1 parent 2e85d12 commit a179333

File tree

1 file changed

+20
-30
lines changed
  • UefiCpuPkg/Library/MpInitLib/LoongArch64

1 file changed

+20
-30
lines changed

UefiCpuPkg/Library/MpInitLib/LoongArch64/MpLib.c

Lines changed: 20 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,8 @@
1414

1515
#define INVALID_APIC_ID 0xFFFFFFFF
1616

17-
EFI_GUID mCpuInitMpLibHobGuid = CPU_INIT_MP_LIB_HOB_GUID;
17+
EFI_GUID mCpuInitMpLibHobGuid = CPU_INIT_MP_LIB_HOB_GUID;
18+
PROCESSOR_RESOURCE_DATA *mProcessorResourceData = NULL;
1819

1920
/**
2021
Get the Application Processors state.
@@ -223,12 +224,6 @@ CollectProcessorCount (
223224
IN CPU_MP_DATA *CpuMpData
224225
)
225226
{
226-
PROCESSOR_RESOURCE_DATA *ProcessorResourceData;
227-
CPU_INFO_IN_HOB *CpuInfoInHob;
228-
UINTN Index;
229-
230-
ProcessorResourceData = NULL;
231-
232227
//
233228
// Set the default loop mode for APs.
234229
//
@@ -240,16 +235,11 @@ CollectProcessorCount (
240235
// as the first broadcast method to wake up all APs, and all of APs will read NODE0
241236
// Core0 Mailbox0 in an infinit loop.
242237
//
243-
ProcessorResourceData = GetProcessorResourceDataFromGuidedHob ();
238+
mProcessorResourceData = GetProcessorResourceDataFromGuidedHob ();
244239

245-
if (ProcessorResourceData != NULL) {
240+
if (mProcessorResourceData != NULL) {
246241
CpuMpData->ApLoopMode = ApInHltLoop;
247-
CpuMpData->CpuCount = ProcessorResourceData->NumberOfProcessor;
248-
CpuInfoInHob = (CPU_INFO_IN_HOB *)(UINTN)(CpuMpData->CpuInfoInHob);
249-
250-
for (Index = 0; Index < CpuMpData->CpuCount; Index++) {
251-
CpuInfoInHob[Index].ApicId = ProcessorResourceData->ApicId[Index];
252-
}
242+
CpuMpData->CpuCount = mProcessorResourceData->NumberOfProcessor;
253243
}
254244

255245
//
@@ -380,15 +370,15 @@ ApWakeupFunction (
380370
//
381371
InterlockedIncrement ((UINT32 *)&CpuMpData->FinishedCount);
382372

383-
while (TRUE) {
384-
//
385-
// Clean per-core mail box registers.
386-
//
387-
IoCsrWrite64 (LOONGARCH_IOCSR_MBUF0, 0x0);
388-
IoCsrWrite64 (LOONGARCH_IOCSR_MBUF1, 0x0);
389-
IoCsrWrite64 (LOONGARCH_IOCSR_MBUF2, 0x0);
390-
IoCsrWrite64 (LOONGARCH_IOCSR_MBUF3, 0x0);
373+
//
374+
// Clean per-core mail box registers.
375+
//
376+
IoCsrWrite64 (LOONGARCH_IOCSR_MBUF0, 0x0);
377+
IoCsrWrite64 (LOONGARCH_IOCSR_MBUF1, 0x0);
378+
IoCsrWrite64 (LOONGARCH_IOCSR_MBUF2, 0x0);
379+
IoCsrWrite64 (LOONGARCH_IOCSR_MBUF3, 0x0);
391380

381+
while (TRUE) {
392382
//
393383
// Enable IPI interrupt and global interrupt
394384
//
@@ -699,34 +689,34 @@ WakeUpAP (
699689
DEBUG ((DEBUG_INFO, "%a: func 0x%llx, ExchangeInfo 0x%llx\n", __func__, ApWakeupFunction, (UINTN)ExchangeInfo));
700690
if (CpuMpData->ApLoopMode == ApInHltLoop) {
701691
for (Index = 0; Index < CpuMpData->CpuCount; Index++) {
702-
if (Index != CpuMpData->BspNumber) {
692+
if (mProcessorResourceData->ApicId[Index] != CpuMpData->BspNumber) {
703693
IoCsrWrite64 (
704694
LOONGARCH_IOCSR_MBUF_SEND,
705695
(IOCSR_MBUF_SEND_BLOCKING |
706696
(IOCSR_MBUF_SEND_BOX_HI (0x3) << IOCSR_MBUF_SEND_BOX_SHIFT) |
707-
(CpuInfoInHob[Index].ApicId << IOCSR_MBUF_SEND_CPU_SHIFT) |
697+
(mProcessorResourceData->ApicId[Index] << IOCSR_MBUF_SEND_CPU_SHIFT) |
708698
((UINTN)(ExchangeInfo) & IOCSR_MBUF_SEND_H32_MASK))
709699
);
710700
IoCsrWrite64 (
711701
LOONGARCH_IOCSR_MBUF_SEND,
712702
(IOCSR_MBUF_SEND_BLOCKING |
713703
(IOCSR_MBUF_SEND_BOX_LO (0x3) << IOCSR_MBUF_SEND_BOX_SHIFT) |
714-
(CpuInfoInHob[Index].ApicId << IOCSR_MBUF_SEND_CPU_SHIFT) |
704+
(mProcessorResourceData->ApicId[Index] << IOCSR_MBUF_SEND_CPU_SHIFT) |
715705
((UINTN)ExchangeInfo) << IOCSR_MBUF_SEND_BUF_SHIFT)
716706
);
717707

718708
IoCsrWrite64 (
719709
LOONGARCH_IOCSR_MBUF_SEND,
720710
(IOCSR_MBUF_SEND_BLOCKING |
721711
(IOCSR_MBUF_SEND_BOX_HI (0x0) << IOCSR_MBUF_SEND_BOX_SHIFT) |
722-
(CpuInfoInHob[Index].ApicId << IOCSR_MBUF_SEND_CPU_SHIFT) |
712+
(mProcessorResourceData->ApicId[Index] << IOCSR_MBUF_SEND_CPU_SHIFT) |
723713
((UINTN)(ApWakeupFunction) & IOCSR_MBUF_SEND_H32_MASK))
724714
);
725715
IoCsrWrite64 (
726716
LOONGARCH_IOCSR_MBUF_SEND,
727717
(IOCSR_MBUF_SEND_BLOCKING |
728718
(IOCSR_MBUF_SEND_BOX_LO (0x0) << IOCSR_MBUF_SEND_BOX_SHIFT) |
729-
(CpuInfoInHob[Index].ApicId << IOCSR_MBUF_SEND_CPU_SHIFT) |
719+
(mProcessorResourceData->ApicId[Index] << IOCSR_MBUF_SEND_CPU_SHIFT) |
730720
((UINTN)ApWakeupFunction) << IOCSR_MBUF_SEND_BUF_SHIFT)
731721
);
732722

@@ -736,7 +726,7 @@ WakeUpAP (
736726
IoCsrWrite64 (
737727
LOONGARCH_IOCSR_IPI_SEND,
738728
(IOCSR_MBUF_SEND_BLOCKING |
739-
(CpuInfoInHob[Index].ApicId << IOCSR_MBUF_SEND_CPU_SHIFT) |
729+
(mProcessorResourceData->ApicId[Index] << IOCSR_MBUF_SEND_CPU_SHIFT) |
740730
0x2 // Bit 2
741731
)
742732
);
@@ -1360,7 +1350,7 @@ MpInitLibInitialize (
13601350
//
13611351
// Set BSP basic information
13621352
//
1363-
InitializeApData (CpuMpData, 0, 0);
1353+
InitializeApData (CpuMpData, CpuMpData->BspNumber, 0);
13641354

13651355
//
13661356
// Set up APs wakeup signal buffer and initialization APs ApicId status.

0 commit comments

Comments
 (0)