]> git.proxmox.com Git - mirror_edk2.git/blame - OvmfPkg/AcpiPlatformDxe/Qemu.c
OvmfPkg/AcpiPlatformDxe: Fix VS2010 build issue
[mirror_edk2.git] / OvmfPkg / AcpiPlatformDxe / Qemu.c
CommitLineData
522203de 1/** @file\r
2 OVMF ACPI QEMU support\r
3\r
4 Copyright (c) 2008 - 2012, Intel Corporation. All rights reserved.<BR>\r
5 This program and the accompanying materials\r
6 are licensed and made available under the terms and conditions of the BSD License\r
7 which accompanies this distribution. The full text of the license may be found at\r
8 http://opensource.org/licenses/bsd-license.php\r
9\r
10 THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
11 WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
12\r
13**/ \r
14\r
15#include "AcpiPlatform.h"\r
255b4184 16#include <Library/BaseMemoryLib.h>\r
17#include <Library/MemoryAllocationLib.h>\r
522203de 18#include <Library/QemuFwCfgLib.h>\r
19\r
20\r
21BOOLEAN\r
22QemuDetected (\r
23 VOID\r
24 )\r
25{\r
26 if (!QemuFwCfgIsAvailable ()) {\r
27 return FALSE;\r
28 }\r
29\r
30 return TRUE;\r
31}\r
32\r
33\r
255b4184 34STATIC\r
35EFI_STATUS\r
36EFIAPI\r
37QemuInstallAcpiMadtTable (\r
38 IN EFI_ACPI_TABLE_PROTOCOL *AcpiProtocol,\r
39 IN VOID *AcpiTableBuffer,\r
40 IN UINTN AcpiTableBufferSize,\r
41 OUT UINTN *TableKey\r
42 )\r
43{\r
44 EFI_STATUS Status;\r
45 UINTN Count;\r
46 UINTN Loop;\r
47 EFI_ACPI_DESCRIPTION_HEADER *Hdr;\r
48 UINTN NewBufferSize;\r
49 EFI_ACPI_1_0_PROCESSOR_LOCAL_APIC_STRUCTURE *LocalApic;\r
50\r
51 QemuFwCfgSelectItem (QemuFwCfgItemSmpCpuCount);\r
52 Count = (UINTN) QemuFwCfgRead16 ();\r
53 ASSERT (Count >= 1);\r
54\r
55 if (Count == 1) {\r
56 //\r
57 // The pre-built MADT table covers the single CPU case\r
58 //\r
59 return InstallAcpiTable (\r
60 AcpiProtocol,\r
61 AcpiTableBuffer,\r
62 AcpiTableBufferSize,\r
63 TableKey\r
64 );\r
65 }\r
66\r
67 //\r
68 // We need to add additional Local APIC entries to the MADT\r
69 //\r
70 NewBufferSize = AcpiTableBufferSize + ((Count - 1) * sizeof (*LocalApic));\r
71 Hdr = (EFI_ACPI_DESCRIPTION_HEADER*) AllocatePool (NewBufferSize);\r
72 ASSERT (Hdr != NULL);\r
73\r
74 CopyMem (Hdr, AcpiTableBuffer, AcpiTableBufferSize);\r
75\r
76 LocalApic = (EFI_ACPI_1_0_PROCESSOR_LOCAL_APIC_STRUCTURE*)\r
77 (((UINT8*) Hdr) + AcpiTableBufferSize);\r
78\r
79 //\r
80 // Add Local APIC entries for the APs to the MADT\r
81 //\r
82 for (Loop = 1; Loop < Count; Loop++) {\r
83 LocalApic->Type = EFI_ACPI_1_0_PROCESSOR_LOCAL_APIC;\r
84 LocalApic->Length = sizeof (*LocalApic);\r
75ccc2b2 85 LocalApic->AcpiProcessorId = (UINT8) Loop;\r
86 LocalApic->ApicId = (UINT8) Loop;\r
255b4184 87 LocalApic->Flags = 1;\r
88 LocalApic++;\r
89 }\r
90\r
75ccc2b2 91 Hdr->Length = (UINT32) NewBufferSize;\r
255b4184 92\r
93 Status = InstallAcpiTable (AcpiProtocol, Hdr, NewBufferSize, TableKey);\r
94\r
95 FreePool (Hdr);\r
96\r
97 return Status;\r
98}\r
99\r
100\r
522203de 101EFI_STATUS\r
102EFIAPI\r
103QemuInstallAcpiTable (\r
104 IN EFI_ACPI_TABLE_PROTOCOL *AcpiProtocol,\r
105 IN VOID *AcpiTableBuffer,\r
106 IN UINTN AcpiTableBufferSize,\r
107 OUT UINTN *TableKey\r
108 )\r
109{\r
255b4184 110 EFI_ACPI_DESCRIPTION_HEADER *Hdr;\r
111 EFI_ACPI_TABLE_INSTALL_ACPI_TABLE TableInstallFunction;\r
112\r
113 Hdr = (EFI_ACPI_DESCRIPTION_HEADER*) AcpiTableBuffer;\r
114 switch (Hdr->Signature) {\r
115 case EFI_ACPI_1_0_APIC_SIGNATURE:\r
116 TableInstallFunction = QemuInstallAcpiMadtTable;\r
117 break;\r
118 default:\r
119 TableInstallFunction = InstallAcpiTable;\r
120 }\r
121\r
122 return TableInstallFunction (\r
522203de 123 AcpiProtocol,\r
124 AcpiTableBuffer,\r
125 AcpiTableBufferSize,\r
126 TableKey\r
127 );\r
128}\r
129\r