[edk2-devel] [edk2-platforms: PATCH V8] Platform/Intel: Correct CPU APIC IDs

Ni, Ray ray.ni at intel.com
Thu Aug 19 13:23:12 UTC 2021


> +      CpuIdMapPtr->AcpiProcessorId = (ProcessorInfoBuffer.Location.Package << mNumOfBitShift) +
> (UINT32)ProcessorInfoBuffer.ProcessorId;

1. I don't understand this assignment. Since you will re-assign this later, why not remove this assignment?


> +
> +  //make sure 1st entry is BSP
> +  if (mX2ApicEnabled) {
> +    BspApicId = (UINT32)AsmReadMsr64 (0x802);
> +  } else {
> +    BspApicId = (*(volatile UINT32 *)(UINTN)0xFEE00020) >> 24;
> +  }
> +  DEBUG ((DEBUG_INFO, "BspApicId - 0x%x\n", BspApicId));

2. you can use GetApicId() API from LocalApicLib library in UefiCpuPkg.


> -    if(mCpuApicIdOrderTable[0].ApicId != BspApicId) {
> -      //check to see if 1st entry is BSP, if not swap it
> -      Index = ApicId2SwProcApicId(BspApicId);
> +    CopyMem (&TempVal, &TempCpuApicIdOrderTable[Index], sizeof (EFI_CPU_ID_ORDER_MAP));
> +    CopyMem (&TempCpuApicIdOrderTable[Index], &TempCpuApicIdOrderTable[0], sizeof (EFI_CPU_ID_ORDER_MAP));
> +    CopyMem (&TempCpuApicIdOrderTable[0], &TempVal, sizeof (EFI_CPU_ID_ORDER_MAP));
> +    TempCpuApicIdOrderTable[0].Flags = 1;

3. Why is " TempCpuApicIdOrderTable[0].Flags = 1;" needed? 

> +  for (CurrProcessor = 1; CurrProcessor < mNumberOfCpus; CurrProcessor++) {
> +    for (Index = CurrProcessor+1; Index < mNumberOfCpus; Index++) {
> +      if (TempCpuApicIdOrderTable[CurrProcessor].AcpiProcessorId > TempCpuApicIdOrderTable[Index].AcpiProcessorId) {
> +        CopyMem (&TempVal, &TempCpuApicIdOrderTable[CurrProcessor], sizeof (EFI_CPU_ID_ORDER_MAP));
> +        CopyMem (&TempCpuApicIdOrderTable[CurrProcessor], &TempCpuApicIdOrderTable[Index], sizeof
> (EFI_CPU_ID_ORDER_MAP));
> +        CopyMem (&TempCpuApicIdOrderTable[Index], &TempVal, sizeof (EFI_CPU_ID_ORDER_MAP));
>        }
> +    }
> +  }

4. Can you use PerformQuickSort() API from SortLib in MdeModulePkg?



> +
> +  //
> +  // 5. Re-assigen AcpiProcessorId for AcpiProcessorUId uses purpose.
> +  //
> +  for (Socket = 0; Socket < MAX_SOCKET; Socket++) {
> +    for (CurrProcessor = 0, Index = 0; CurrProcessor < mNumberOfCpus; CurrProcessor++) {
> +      if (mCpuApicIdOrderTable[CurrProcessor].Flags && (mCpuApicIdOrderTable[CurrProcessor].SocketNum == Socket)) {
> +        mCpuApicIdOrderTable[CurrProcessor].AcpiProcessorId = (ProcessorInfoBuffer.Location.Package << mNumOfBitShift) +
> Index;
> +        Index++;

5. I think you need a AcpiProcessorId[MAX_SOCKET] array to remember the "AcpiProcessorId" for each socket/package.
For example:
AcpiProcessorId[MAX_SOCKET];
ZeroMem (AcpiProcessorId);
for (Socket = 0; ...) {
  for (CurrProcessor = 0; ...) {
    if (...Flags == 1 && ...SocketNum == Socket) {
      mCpuApicIdOrderTable[CurrProcessor].AcpiProcessorId = (ProcessorInfoBuffer.Location.Package << mNumOfBitShift) + AcpiProcessorId[Socket];
      AcpiProcessorId[Socket]++;




-=-=-=-=-=-=-=-=-=-=-=-
Groups.io Links: You receive all messages sent to this group.
View/Reply Online (#79572): https://edk2.groups.io/g/devel/message/79572
Mute This Topic: https://groups.io/mt/84921613/1813853
Group Owner: devel+owner at edk2.groups.io
Unsubscribe: https://edk2.groups.io/g/devel/unsub [edk2-devel-archive at redhat.com]
-=-=-=-=-=-=-=-=-=-=-=-






More information about the edk2-devel-archive mailing list