]> git.proxmox.com Git - mirror_edk2.git/commitdiff
OvmfPkg/AcpiPlatformDxe: Dynamically add Local APIC entries in MADT
authorjljusten <jljusten@6f19259b-4bc3-4df7-8a09-765794883524>
Wed, 30 May 2012 23:15:59 +0000 (23:15 +0000)
committerjljusten <jljusten@6f19259b-4bc3-4df7-8a09-765794883524>
Wed, 30 May 2012 23:15:59 +0000 (23:15 +0000)
Update MADT processing for QEMU to add additional Local APIC
entries to the MADT.

The MADT is still built with a single Local APIC entry.
If the AcpiPlatformDxe driver determines that more processors
are available, then additional Local APIC entries are added
to the MADT at runtime.

Contributed-under: TianoCore Contribution Agreement 1.0
Signed-off-by: Jordan Justen <jordan.l.justen@intel.com>
Reviewed-by: Laszlo Ersek <lersek@redhat.com>
git-svn-id: https://edk2.svn.sourceforge.net/svnroot/edk2/trunk/edk2@13387 6f19259b-4bc3-4df7-8a09-765794883524

OvmfPkg/AcpiPlatformDxe/AcpiPlatformDxe.inf
OvmfPkg/AcpiPlatformDxe/Qemu.c

index 57cdf3e28dac3585596135e69d9c631150189154..681567a762fdaccc37f5df06c5997fd5a707958f 100644 (file)
@@ -46,6 +46,7 @@
   UefiDriverEntryPoint\r
   HobLib\r
   QemuFwCfgLib\r
+  MemoryAllocationLib\r
 \r
 [Protocols]\r
   gEfiAcpiTableProtocolGuid                     # PROTOCOL ALWAYS_CONSUMED\r
index f4e3269a8af5b0d5ac844a369099d6fa5f2aaf09..e483856dca95d4e4f2cda79e5757295fafb7bea4 100644 (file)
@@ -13,6 +13,8 @@
 **/ \r
 \r
 #include "AcpiPlatform.h"\r
+#include <Library/BaseMemoryLib.h>\r
+#include <Library/MemoryAllocationLib.h>\r
 #include <Library/QemuFwCfgLib.h>\r
 \r
 \r
@@ -29,6 +31,73 @@ QemuDetected (
 }\r
 \r
 \r
+STATIC\r
+EFI_STATUS\r
+EFIAPI\r
+QemuInstallAcpiMadtTable (\r
+  IN   EFI_ACPI_TABLE_PROTOCOL       *AcpiProtocol,\r
+  IN   VOID                          *AcpiTableBuffer,\r
+  IN   UINTN                         AcpiTableBufferSize,\r
+  OUT  UINTN                         *TableKey\r
+  )\r
+{\r
+  EFI_STATUS                                   Status;\r
+  UINTN                                        Count;\r
+  UINTN                                        Loop;\r
+  EFI_ACPI_DESCRIPTION_HEADER                  *Hdr;\r
+  UINTN                                        NewBufferSize;\r
+  EFI_ACPI_1_0_PROCESSOR_LOCAL_APIC_STRUCTURE  *LocalApic;\r
+\r
+  QemuFwCfgSelectItem (QemuFwCfgItemSmpCpuCount);\r
+  Count = (UINTN) QemuFwCfgRead16 ();\r
+  ASSERT (Count >= 1);\r
+\r
+  if (Count == 1) {\r
+    //\r
+    // The pre-built MADT table covers the single CPU case\r
+    //\r
+    return InstallAcpiTable (\r
+             AcpiProtocol,\r
+             AcpiTableBuffer,\r
+             AcpiTableBufferSize,\r
+             TableKey\r
+             );\r
+  }\r
+\r
+  //\r
+  // We need to add additional Local APIC entries to the MADT\r
+  //\r
+  NewBufferSize = AcpiTableBufferSize + ((Count - 1) * sizeof (*LocalApic));\r
+  Hdr = (EFI_ACPI_DESCRIPTION_HEADER*) AllocatePool (NewBufferSize);\r
+  ASSERT (Hdr != NULL);\r
+\r
+  CopyMem (Hdr, AcpiTableBuffer, AcpiTableBufferSize);\r
+\r
+  LocalApic = (EFI_ACPI_1_0_PROCESSOR_LOCAL_APIC_STRUCTURE*)\r
+                (((UINT8*) Hdr) + AcpiTableBufferSize);\r
+\r
+  //\r
+  // Add Local APIC entries for the APs to the MADT\r
+  //\r
+  for (Loop = 1; Loop < Count; Loop++) {\r
+    LocalApic->Type = EFI_ACPI_1_0_PROCESSOR_LOCAL_APIC;\r
+    LocalApic->Length = sizeof (*LocalApic);\r
+    LocalApic->AcpiProcessorId = Loop;\r
+    LocalApic->ApicId = Loop;\r
+    LocalApic->Flags = 1;\r
+    LocalApic++;\r
+  }\r
+\r
+  Hdr->Length = NewBufferSize;\r
+\r
+  Status = InstallAcpiTable (AcpiProtocol, Hdr, NewBufferSize, TableKey);\r
+\r
+  FreePool (Hdr);\r
+\r
+  return Status;\r
+}\r
+\r
+\r
 EFI_STATUS\r
 EFIAPI\r
 QemuInstallAcpiTable (\r
@@ -38,7 +107,19 @@ QemuInstallAcpiTable (
   OUT  UINTN                         *TableKey\r
   )\r
 {\r
-  return InstallAcpiTable(\r
+  EFI_ACPI_DESCRIPTION_HEADER        *Hdr;\r
+  EFI_ACPI_TABLE_INSTALL_ACPI_TABLE  TableInstallFunction;\r
+\r
+  Hdr = (EFI_ACPI_DESCRIPTION_HEADER*) AcpiTableBuffer;\r
+  switch (Hdr->Signature) {\r
+  case EFI_ACPI_1_0_APIC_SIGNATURE:\r
+    TableInstallFunction = QemuInstallAcpiMadtTable;\r
+    break;\r
+  default:\r
+    TableInstallFunction = InstallAcpiTable;\r
+  }\r
+\r
+  return TableInstallFunction (\r
            AcpiProtocol,\r
            AcpiTableBuffer,\r
            AcpiTableBufferSize,\r