]> git.proxmox.com Git - mirror_edk2.git/blame - ArmVirtPkg/XenAcpiPlatformDxe/XenAcpiPlatformDxe.c
ArmVirtPkg: Change use of EFI_D_* to DEBUG_*
[mirror_edk2.git] / ArmVirtPkg / XenAcpiPlatformDxe / XenAcpiPlatformDxe.c
CommitLineData
402dde68
SZ
1/** @file\r
2 Xen ARM ACPI Platform Driver using Xen ARM multiboot protocol\r
3\r
4 Copyright (C) 2016, Linaro Ltd. All rights reserved.\r
5\r
9792fb0e 6 SPDX-License-Identifier: BSD-2-Clause-Patent\r
402dde68
SZ
7\r
8**/\r
9\r
10#include <Library/BaseLib.h>\r
11#include <Library/DebugLib.h>\r
12#include <Library/UefiBootServicesTableLib.h>\r
13#include <Library/UefiDriverEntryPoint.h>\r
14\r
15#include <Protocol/AcpiTable.h>\r
16#include <Protocol/FdtClient.h>\r
17\r
18#include <IndustryStandard/Acpi.h>\r
19\r
20/**\r
21 Get the address of Xen ACPI Root System Description Pointer (RSDP)\r
22 structure.\r
23\r
24 @param RsdpStructurePtr Return pointer to RSDP structure\r
25\r
26 @return EFI_SUCCESS Find Xen RSDP structure successfully.\r
27 @return EFI_NOT_FOUND Don't find Xen RSDP structure.\r
28 @return EFI_ABORTED Find Xen RSDP structure, but it's not integrated.\r
29\r
30**/\r
31STATIC\r
32EFI_STATUS\r
33EFIAPI\r
34GetXenArmAcpiRsdp (\r
35 OUT EFI_ACPI_2_0_ROOT_SYSTEM_DESCRIPTION_POINTER **RsdpPtr\r
36 )\r
37{\r
38 EFI_ACPI_2_0_ROOT_SYSTEM_DESCRIPTION_POINTER *RsdpStructurePtr;\r
39 EFI_STATUS Status;\r
40 FDT_CLIENT_PROTOCOL *FdtClient;\r
41 CONST UINT64 *Reg;\r
cfc8d51c
AB
42 UINT32 RegSize;\r
43 UINTN AddressCells, SizeCells;\r
402dde68
SZ
44 UINT64 RegBase;\r
45 UINT8 Sum;\r
46\r
47 RsdpStructurePtr = NULL;\r
48 FdtClient = NULL;\r
49 //\r
50 // Get the RSDP structure address from DeviceTree\r
51 //\r
52 Status = gBS->LocateProtocol (&gFdtClientProtocolGuid, NULL,\r
53 (VOID **)&FdtClient);\r
54 ASSERT_EFI_ERROR (Status);\r
55\r
56 Status = FdtClient->FindCompatibleNodeReg (FdtClient, "xen,guest-acpi",\r
cfc8d51c
AB
57 (CONST VOID **)&Reg, &AddressCells, &SizeCells,\r
58 &RegSize);\r
402dde68 59 if (EFI_ERROR (Status)) {\r
c5b3a56e 60 DEBUG ((DEBUG_WARN, "%a: No 'xen,guest-acpi' compatible DT node found\n",\r
402dde68
SZ
61 __FUNCTION__));\r
62 return EFI_NOT_FOUND;\r
63 }\r
64\r
cfc8d51c
AB
65 ASSERT (AddressCells == 2);\r
66 ASSERT (SizeCells == 2);\r
402dde68
SZ
67 ASSERT (RegSize == 2 * sizeof (UINT64));\r
68\r
69 RegBase = SwapBytes64(Reg[0]);\r
6244c892
LE
70 RsdpStructurePtr =\r
71 (EFI_ACPI_2_0_ROOT_SYSTEM_DESCRIPTION_POINTER *)(UINTN)RegBase;\r
402dde68
SZ
72\r
73 if (RsdpStructurePtr && RsdpStructurePtr->Revision >= 2) {\r
74 Sum = CalculateSum8 ((CONST UINT8 *)RsdpStructurePtr,\r
75 sizeof (EFI_ACPI_2_0_ROOT_SYSTEM_DESCRIPTION_POINTER));\r
76 if (Sum != 0) {\r
77 return EFI_ABORTED;\r
78 }\r
79 }\r
80\r
81 *RsdpPtr = RsdpStructurePtr;\r
82 return EFI_SUCCESS;\r
83}\r
84\r
85/**\r
86 Get Xen Acpi tables from the RSDP structure. And installs Xen ACPI tables\r
87 into the RSDT/XSDT using InstallAcpiTable. Some signature of the installed\r
88 ACPI tables are: FACP, APIC, GTDT, DSDT.\r
89\r
90 @param AcpiProtocol Protocol instance pointer.\r
91\r
92 @return EFI_SUCCESS The table was successfully inserted.\r
93 @return EFI_INVALID_PARAMETER Either AcpiTableBuffer is NULL, TableHandle is\r
94 NULL, or AcpiTableBufferSize and the size\r
95 field embedded in the ACPI table pointed to\r
96 by AcpiTableBuffer are not in sync.\r
97 @return EFI_OUT_OF_RESOURCES Insufficient resources exist to complete the request.\r
98\r
99**/\r
100STATIC\r
101EFI_STATUS\r
102EFIAPI\r
103InstallXenArmTables (\r
104 IN EFI_ACPI_TABLE_PROTOCOL *AcpiProtocol\r
105 )\r
106{\r
107 EFI_STATUS Status;\r
108 UINTN TableHandle;\r
109 VOID *CurrentTableEntry;\r
110 UINTN CurrentTablePointer;\r
111 EFI_ACPI_DESCRIPTION_HEADER *CurrentTable;\r
112 UINTN Index;\r
113 UINTN NumberOfTableEntries;\r
114 EFI_ACPI_2_0_ROOT_SYSTEM_DESCRIPTION_POINTER *XenAcpiRsdpStructurePtr;\r
115 EFI_ACPI_DESCRIPTION_HEADER *Xsdt;\r
116 EFI_ACPI_2_0_FIXED_ACPI_DESCRIPTION_TABLE *FadtTable;\r
117 EFI_ACPI_DESCRIPTION_HEADER *DsdtTable;\r
118\r
119 XenAcpiRsdpStructurePtr = NULL;\r
120 FadtTable = NULL;\r
121 DsdtTable = NULL;\r
122 TableHandle = 0;\r
123 NumberOfTableEntries = 0;\r
124\r
125 //\r
126 // Try to find Xen ARM ACPI tables\r
127 //\r
128 Status = GetXenArmAcpiRsdp (&XenAcpiRsdpStructurePtr);\r
129 if (EFI_ERROR (Status)) {\r
c5b3a56e 130 DEBUG ((DEBUG_INFO, "%a: No RSDP table found\n", __FUNCTION__));\r
402dde68
SZ
131 return Status;\r
132 }\r
133\r
134 //\r
135 // If XSDT table is find, just install its tables.\r
136 //\r
137 if (XenAcpiRsdpStructurePtr->XsdtAddress) {\r
138 //\r
139 // Retrieve the addresses of XSDT and\r
140 // calculate the number of its table entries.\r
141 //\r
142 Xsdt = (EFI_ACPI_DESCRIPTION_HEADER *) (UINTN)\r
143 XenAcpiRsdpStructurePtr->XsdtAddress;\r
144 NumberOfTableEntries = (Xsdt->Length -\r
145 sizeof (EFI_ACPI_DESCRIPTION_HEADER)) /\r
146 sizeof (UINT64);\r
147 //\r
148 // Install ACPI tables found in XSDT.\r
149 //\r
150 for (Index = 0; Index < NumberOfTableEntries; Index++) {\r
151 //\r
152 // Get the table entry from XSDT\r
153 //\r
154 CurrentTableEntry = (VOID *) ((UINT8 *) Xsdt +\r
155 sizeof (EFI_ACPI_DESCRIPTION_HEADER) +\r
156 Index * sizeof (UINT64));\r
157 CurrentTablePointer = (UINTN) *(UINT64 *)CurrentTableEntry;\r
158 CurrentTable = (EFI_ACPI_DESCRIPTION_HEADER *) CurrentTablePointer;\r
159\r
160 //\r
161 // Install the XSDT tables\r
162 //\r
163 Status = AcpiProtocol->InstallAcpiTable (\r
164 AcpiProtocol,\r
165 CurrentTable,\r
166 CurrentTable->Length,\r
167 &TableHandle\r
168 );\r
169\r
170 if (EFI_ERROR (Status)) {\r
171 return Status;\r
172 }\r
173\r
174 //\r
175 // Get the FACS and DSDT table address from the table FADT\r
176 //\r
177 if (!AsciiStrnCmp ((CHAR8 *) &CurrentTable->Signature, "FACP", 4)) {\r
178 FadtTable = (EFI_ACPI_2_0_FIXED_ACPI_DESCRIPTION_TABLE *)\r
179 (UINTN) CurrentTablePointer;\r
180 DsdtTable = (EFI_ACPI_DESCRIPTION_HEADER *) (UINTN) FadtTable->Dsdt;\r
181 }\r
182 }\r
183 }\r
184\r
185 //\r
186 // Install DSDT table.\r
187 //\r
188 Status = AcpiProtocol->InstallAcpiTable (\r
189 AcpiProtocol,\r
190 DsdtTable,\r
191 DsdtTable->Length,\r
192 &TableHandle\r
193 );\r
194 if (EFI_ERROR (Status)) {\r
195 return Status;\r
196 }\r
197\r
198 return EFI_SUCCESS;\r
199}\r
200\r
201STATIC\r
202EFI_ACPI_TABLE_PROTOCOL *\r
203FindAcpiTableProtocol (\r
204 VOID\r
205 )\r
206{\r
207 EFI_STATUS Status;\r
208 EFI_ACPI_TABLE_PROTOCOL *AcpiTable;\r
209\r
210 AcpiTable = NULL;\r
211 Status = gBS->LocateProtocol (\r
212 &gEfiAcpiTableProtocolGuid,\r
213 NULL,\r
214 (VOID**)&AcpiTable\r
215 );\r
216 ASSERT_EFI_ERROR (Status);\r
217 return AcpiTable;\r
218}\r
219\r
220/**\r
221 Entrypoint of Xen ARM Acpi Platform driver.\r
222\r
223 @param ImageHandle\r
224 @param SystemTable\r
225\r
226 @return EFI_SUCCESS\r
227 @return EFI_LOAD_ERROR\r
228 @return EFI_OUT_OF_RESOURCES\r
229\r
230**/\r
231\r
232EFI_STATUS\r
233EFIAPI\r
234XenAcpiPlatformEntryPoint (\r
235 IN EFI_HANDLE ImageHandle,\r
236 IN EFI_SYSTEM_TABLE *SystemTable\r
237 )\r
238{\r
239 EFI_STATUS Status;\r
240\r
241 Status = InstallXenArmTables (FindAcpiTableProtocol ());\r
242 return Status;\r
243}\r