]> git.proxmox.com Git - mirror_edk2.git/blame - OvmfPkg/Bhyve/AcpiPlatformDxe/AcpiPlatform.c
OvmfPkg: Apply uncrustify changes
[mirror_edk2.git] / OvmfPkg / Bhyve / AcpiPlatformDxe / AcpiPlatform.c
CommitLineData
656419f9 1/** @file\r
9fb629ed 2 bhyve ACPI Platform Driver\r
656419f9
RC
3\r
4 Copyright (c) 2020, Rebecca Cran <rebecca@bsdio.com>\r
5 Copyright (c) 2008 - 2012, Intel Corporation. All rights reserved.<BR>\r
9fb629ed 6\r
656419f9
RC
7 SPDX-License-Identifier: BSD-2-Clause-Patent\r
8\r
9**/\r
10\r
11#include "AcpiPlatform.h"\r
12\r
13EFI_STATUS\r
14EFIAPI\r
15InstallAcpiTable (\r
ac0a286f
MK
16 IN EFI_ACPI_TABLE_PROTOCOL *AcpiProtocol,\r
17 IN VOID *AcpiTableBuffer,\r
18 IN UINTN AcpiTableBufferSize,\r
19 OUT UINTN *TableKey\r
656419f9
RC
20 )\r
21{\r
22 return AcpiProtocol->InstallAcpiTable (\r
23 AcpiProtocol,\r
24 AcpiTableBuffer,\r
25 AcpiTableBufferSize,\r
26 TableKey\r
27 );\r
28}\r
29\r
656419f9
RC
30/**\r
31 Locate the first instance of a protocol. If the protocol requested is an\r
32 FV protocol, then it will return the first FV that contains the ACPI table\r
33 storage file.\r
34\r
35 @param Instance Return pointer to the first instance of the protocol\r
36\r
37 @return EFI_SUCCESS The function completed successfully.\r
38 @return EFI_NOT_FOUND The protocol could not be located.\r
39 @return EFI_OUT_OF_RESOURCES There are not enough resources to find the protocol.\r
40\r
41**/\r
42EFI_STATUS\r
43LocateFvInstanceWithTables (\r
ac0a286f 44 OUT EFI_FIRMWARE_VOLUME2_PROTOCOL **Instance\r
656419f9
RC
45 )\r
46{\r
ac0a286f
MK
47 EFI_STATUS Status;\r
48 EFI_HANDLE *HandleBuffer;\r
49 UINTN NumberOfHandles;\r
50 EFI_FV_FILETYPE FileType;\r
51 UINT32 FvStatus;\r
52 EFI_FV_FILE_ATTRIBUTES Attributes;\r
53 UINTN Size;\r
54 UINTN Index;\r
55 EFI_FIRMWARE_VOLUME2_PROTOCOL *FvInstance;\r
656419f9
RC
56\r
57 FvStatus = 0;\r
58\r
59 //\r
60 // Locate protocol.\r
61 //\r
62 Status = gBS->LocateHandleBuffer (\r
ac0a286f
MK
63 ByProtocol,\r
64 &gEfiFirmwareVolume2ProtocolGuid,\r
65 NULL,\r
66 &NumberOfHandles,\r
67 &HandleBuffer\r
68 );\r
656419f9
RC
69 if (EFI_ERROR (Status)) {\r
70 //\r
71 // Defined errors at this time are not found and out of resources.\r
72 //\r
73 return Status;\r
74 }\r
75\r
76 //\r
77 // Looking for FV with ACPI storage file\r
78 //\r
79 for (Index = 0; Index < NumberOfHandles; Index++) {\r
80 //\r
81 // Get the protocol on this handle\r
82 // This should not fail because of LocateHandleBuffer\r
83 //\r
84 Status = gBS->HandleProtocol (\r
ac0a286f
MK
85 HandleBuffer[Index],\r
86 &gEfiFirmwareVolume2ProtocolGuid,\r
87 (VOID **)&FvInstance\r
88 );\r
656419f9
RC
89 ASSERT_EFI_ERROR (Status);\r
90\r
91 //\r
92 // See if it has the ACPI storage file\r
93 //\r
94 Status = FvInstance->ReadFile (\r
95 FvInstance,\r
ac0a286f 96 (EFI_GUID *)PcdGetPtr (PcdAcpiTableStorageFile),\r
656419f9
RC
97 NULL,\r
98 &Size,\r
99 &FileType,\r
100 &Attributes,\r
101 &FvStatus\r
102 );\r
103\r
104 //\r
105 // If we found it, then we are done\r
106 //\r
107 if (Status == EFI_SUCCESS) {\r
108 *Instance = FvInstance;\r
109 break;\r
110 }\r
111 }\r
112\r
113 //\r
114 // Our exit status is determined by the success of the previous operations\r
115 // If the protocol was found, Instance already points to it.\r
116 //\r
117\r
118 //\r
119 // Free any allocated buffers\r
120 //\r
121 gBS->FreePool (HandleBuffer);\r
122\r
123 return Status;\r
124}\r
125\r
656419f9
RC
126/**\r
127 Find ACPI tables in an FV and install them.\r
128\r
129 This is now a fall-back path. Normally, we will search for tables provided\r
130 by the VMM first.\r
131\r
132 If that fails, we use this function to load the ACPI tables from an FV. The\r
4174c5c7 133 sources for the FV based tables is located under OvmfPkg/Bhyve/AcpiTables.\r
656419f9
RC
134\r
135 @param AcpiTable Protocol instance pointer\r
136\r
137**/\r
138EFI_STATUS\r
139EFIAPI\r
140InstallOvmfFvTables (\r
ac0a286f 141 IN EFI_ACPI_TABLE_PROTOCOL *AcpiTable\r
656419f9
RC
142 )\r
143{\r
ac0a286f
MK
144 EFI_STATUS Status;\r
145 EFI_FIRMWARE_VOLUME2_PROTOCOL *FwVol;\r
146 INTN Instance;\r
147 EFI_ACPI_COMMON_HEADER *CurrentTable;\r
148 UINTN TableHandle;\r
149 UINT32 FvStatus;\r
150 UINTN TableSize;\r
151 UINTN Size;\r
152 EFI_ACPI_TABLE_INSTALL_ACPI_TABLE TableInstallFunction;\r
656419f9
RC
153\r
154 Instance = 0;\r
155 CurrentTable = NULL;\r
156 TableHandle = 0;\r
157\r
158 TableInstallFunction = BhyveInstallAcpiTable;\r
159\r
160 //\r
161 // set FwVol (and use an ASSERT() below) to suppress incorrect\r
162 // compiler/analyzer warnings\r
163 //\r
164 FwVol = NULL;\r
165 //\r
166 // Locate the firmware volume protocol\r
167 //\r
168 Status = LocateFvInstanceWithTables (&FwVol);\r
169 if (EFI_ERROR (Status)) {\r
170 return EFI_ABORTED;\r
171 }\r
ac0a286f 172\r
656419f9
RC
173 ASSERT (FwVol != NULL);\r
174\r
175 //\r
176 // Read tables from the storage file.\r
177 //\r
178 while (Status == EFI_SUCCESS) {\r
656419f9
RC
179 Status = FwVol->ReadSection (\r
180 FwVol,\r
ac0a286f 181 (EFI_GUID *)PcdGetPtr (PcdAcpiTableStorageFile),\r
656419f9
RC
182 EFI_SECTION_RAW,\r
183 Instance,\r
ac0a286f 184 (VOID **)&CurrentTable,\r
656419f9
RC
185 &Size,\r
186 &FvStatus\r
187 );\r
188 if (!EFI_ERROR (Status)) {\r
189 //\r
190 // Add the table\r
191 //\r
192 TableHandle = 0;\r
193\r
ac0a286f 194 TableSize = ((EFI_ACPI_DESCRIPTION_HEADER *)CurrentTable)->Length;\r
656419f9
RC
195 ASSERT (Size >= TableSize);\r
196\r
197 //\r
198 // Install ACPI table\r
199 //\r
200 Status = TableInstallFunction (\r
201 AcpiTable,\r
202 CurrentTable,\r
203 TableSize,\r
204 &TableHandle\r
205 );\r
206\r
207 //\r
208 // Free memory allocated by ReadSection\r
209 //\r
210 gBS->FreePool (CurrentTable);\r
211\r
212 if (EFI_ERROR (Status)) {\r
213 return EFI_ABORTED;\r
214 }\r
215\r
216 //\r
217 // Increment the instance\r
218 //\r
219 Instance++;\r
220 CurrentTable = NULL;\r
221 }\r
222 }\r
223\r
224 return EFI_SUCCESS;\r
225}\r
226\r
227/**\r
228 Effective entrypoint of Acpi Platform driver.\r
229\r
230 @param ImageHandle\r
231 @param SystemTable\r
232\r
233 @return EFI_SUCCESS\r
234 @return EFI_LOAD_ERROR\r
235 @return EFI_OUT_OF_RESOURCES\r
236\r
237**/\r
238EFI_STATUS\r
239EFIAPI\r
240InstallAcpiTables (\r
ac0a286f 241 IN EFI_ACPI_TABLE_PROTOCOL *AcpiTable\r
656419f9
RC
242 )\r
243{\r
ac0a286f 244 EFI_STATUS Status;\r
656419f9
RC
245\r
246 Status = InstallOvmfFvTables (AcpiTable);\r
247\r
248 return Status;\r
249}\r