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