14
14
15
15
#define INVALID_APIC_ID 0xFFFFFFFF
16
16
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 ;
18
19
19
20
/**
20
21
Get the Application Processors state.
@@ -223,12 +224,6 @@ CollectProcessorCount (
223
224
IN CPU_MP_DATA * CpuMpData
224
225
)
225
226
{
226
- PROCESSOR_RESOURCE_DATA * ProcessorResourceData ;
227
- CPU_INFO_IN_HOB * CpuInfoInHob ;
228
- UINTN Index ;
229
-
230
- ProcessorResourceData = NULL ;
231
-
232
227
//
233
228
// Set the default loop mode for APs.
234
229
//
@@ -240,16 +235,11 @@ CollectProcessorCount (
240
235
// as the first broadcast method to wake up all APs, and all of APs will read NODE0
241
236
// Core0 Mailbox0 in an infinit loop.
242
237
//
243
- ProcessorResourceData = GetProcessorResourceDataFromGuidedHob ();
238
+ mProcessorResourceData = GetProcessorResourceDataFromGuidedHob ();
244
239
245
- if (ProcessorResourceData != NULL ) {
240
+ if (mProcessorResourceData != NULL ) {
246
241
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 ;
253
243
}
254
244
255
245
//
@@ -380,15 +370,15 @@ ApWakeupFunction (
380
370
//
381
371
InterlockedIncrement ((UINT32 * )& CpuMpData -> FinishedCount );
382
372
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 );
391
380
381
+ while (TRUE) {
392
382
//
393
383
// Enable IPI interrupt and global interrupt
394
384
//
@@ -699,34 +689,34 @@ WakeUpAP (
699
689
DEBUG ((DEBUG_INFO , "%a: func 0x%llx, ExchangeInfo 0x%llx\n" , __func__ , ApWakeupFunction , (UINTN )ExchangeInfo ));
700
690
if (CpuMpData -> ApLoopMode == ApInHltLoop ) {
701
691
for (Index = 0 ; Index < CpuMpData -> CpuCount ; Index ++ ) {
702
- if (Index != CpuMpData -> BspNumber ) {
692
+ if (mProcessorResourceData -> ApicId [ Index ] != CpuMpData -> BspNumber ) {
703
693
IoCsrWrite64 (
704
694
LOONGARCH_IOCSR_MBUF_SEND ,
705
695
(IOCSR_MBUF_SEND_BLOCKING |
706
696
(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 ) |
708
698
((UINTN )(ExchangeInfo ) & IOCSR_MBUF_SEND_H32_MASK ))
709
699
);
710
700
IoCsrWrite64 (
711
701
LOONGARCH_IOCSR_MBUF_SEND ,
712
702
(IOCSR_MBUF_SEND_BLOCKING |
713
703
(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 ) |
715
705
((UINTN )ExchangeInfo ) << IOCSR_MBUF_SEND_BUF_SHIFT )
716
706
);
717
707
718
708
IoCsrWrite64 (
719
709
LOONGARCH_IOCSR_MBUF_SEND ,
720
710
(IOCSR_MBUF_SEND_BLOCKING |
721
711
(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 ) |
723
713
((UINTN )(ApWakeupFunction ) & IOCSR_MBUF_SEND_H32_MASK ))
724
714
);
725
715
IoCsrWrite64 (
726
716
LOONGARCH_IOCSR_MBUF_SEND ,
727
717
(IOCSR_MBUF_SEND_BLOCKING |
728
718
(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 ) |
730
720
((UINTN )ApWakeupFunction ) << IOCSR_MBUF_SEND_BUF_SHIFT )
731
721
);
732
722
@@ -736,7 +726,7 @@ WakeUpAP (
736
726
IoCsrWrite64 (
737
727
LOONGARCH_IOCSR_IPI_SEND ,
738
728
(IOCSR_MBUF_SEND_BLOCKING |
739
- (CpuInfoInHob [Index ]. ApicId << IOCSR_MBUF_SEND_CPU_SHIFT ) |
729
+ (mProcessorResourceData -> ApicId [Index ] << IOCSR_MBUF_SEND_CPU_SHIFT ) |
740
730
0x2 // Bit 2
741
731
)
742
732
);
@@ -1360,7 +1350,7 @@ MpInitLibInitialize (
1360
1350
//
1361
1351
// Set BSP basic information
1362
1352
//
1363
- InitializeApData (CpuMpData , 0 , 0 );
1353
+ InitializeApData (CpuMpData , CpuMpData -> BspNumber , 0 );
1364
1354
1365
1355
//
1366
1356
// Set up APs wakeup signal buffer and initialization APs ApicId status.
0 commit comments