DynamicTablesPkg: Add dynamic PPTT table generation support
[mirror_edk2.git] / DynamicTablesPkg / Include / AcpiTableGenerator.h
1 /** @file\r
2 \r
3   Copyright (c) 2017 - 2019, ARM Limited. All rights reserved.\r
4 \r
5   SPDX-License-Identifier: BSD-2-Clause-Patent\r
6 \r
7   @par Glossary:\r
8     - Cm or CM   - Configuration Manager\r
9     - Obj or OBJ - Object\r
10     - Std or STD - Standard\r
11 **/\r
12 \r
13 #ifndef ACPI_TABLE_GENERATOR_H_\r
14 #define ACPI_TABLE_GENERATOR_H_\r
15 \r
16 #include <IndustryStandard/Acpi.h>\r
17 \r
18 // Module specific include files.\r
19 #include <TableGenerator.h>\r
20 \r
21 #pragma pack(1)\r
22 \r
23 /**\r
24 The Dynamic Tables Framework provisions two classes of ACPI table\r
25 generators.\r
26  - Standard generators: The ACPI table generators implemented by the\r
27                         Dynamic Tables Framework.\r
28  - OEM generators:      The ACPI table generators customized by the OEM.\r
29 \r
30 The Dynamic Tables Framework implements the following ACPI table generators:\r
31   - RAW   : This is the simplest ACPI table generator. It simply installs\r
32             the ACPI table provided in the AcpiTableData member of the\r
33             CM_STD_OBJ_ACPI_TABLE_INFO. The ACPI table data is provided by\r
34             the Configuration Manager and is generated using an implementation\r
35             defined mechanism.\r
36   - DSDT  : The DSDT generator is a clone of the RAW generator. The difference\r
37             is in the way the ACPI Table Data is generated from an AML file.\r
38   - SSDT  : The SSDT generator is a clone of the RAW generator. The difference\r
39             is in the way the ACPI Table Data is generated from an AML file.\r
40   - FADT  : The FADT generator collates the required platform information from\r
41             the Configuration Manager and builds the FADT table.\r
42   - MADT  : The MADT generator collates the GIC information  from the\r
43             Configuration Manager and builds the MADT table.\r
44   - GTDT  : The GTDT generator collates the Timer information from the\r
45             Configuration Manager and builds the GTDT table.\r
46   - DBG2  : The DBG2 generator collates the debug serial port information from\r
47             the Configuration Manager and builds the DBG2 table.\r
48   - SPCR  : The SPCR generator collates the serial port information from the\r
49             Configuration Manager and builds the SPCR table.\r
50   - MCFG  : The MCFG generator collates the PCI configuration space information\r
51             from the Configuration Manager and builds the MCFG table.\r
52   - IORT  : The IORT generator collates the IO Topology information from the\r
53             Configuration Manager and builds the IORT table.\r
54   - PPTT  : The PPTT generator collates the processor topology information from\r
55             the Configuration Manager and builds the PPTT table.\r
56 */\r
57 \r
58 /** The ACPI_TABLE_GENERATOR_ID type describes ACPI table generator ID.\r
59 */\r
60 typedef TABLE_GENERATOR_ID ACPI_TABLE_GENERATOR_ID;\r
61 \r
62 /** The ESTD_ACPI_TABLE_ID enum describes the ACPI table IDs reserved for\r
63   the standard generators.\r
64 */\r
65 typedef enum StdAcpiTableId {\r
66   EStdAcpiTableIdReserved = 0x0000,             ///< Reserved\r
67   EStdAcpiTableIdRaw,                           ///< RAW Generator\r
68   EStdAcpiTableIdDsdt = EStdAcpiTableIdRaw,     ///< DSDT Generator\r
69   EStdAcpiTableIdSsdt = EStdAcpiTableIdRaw,     ///< SSDT Generator\r
70   EStdAcpiTableIdFadt,                          ///< FADT Generator\r
71   EStdAcpiTableIdMadt,                          ///< MADT Generator\r
72   EStdAcpiTableIdGtdt,                          ///< GTDT Generator\r
73   EStdAcpiTableIdDbg2,                          ///< DBG2 Generator\r
74   EStdAcpiTableIdSpcr,                          ///< SPCR Generator\r
75   EStdAcpiTableIdMcfg,                          ///< MCFG Generator\r
76   EStdAcpiTableIdIort,                          ///< IORT Generator\r
77   EStdAcpiTableIdPptt,                          ///< PPTT Generator\r
78   EStdAcpiTableIdMax\r
79 } ESTD_ACPI_TABLE_ID;\r
80 \r
81 /** This macro checks if the Table Generator ID is for an ACPI Table Generator.\r
82 \r
83   @param [in] TableGeneratorId  The table generator ID.\r
84 \r
85   @return TRUE if the table generator ID is for an ACPI Table\r
86         Generator.\r
87 **/\r
88 #define IS_GENERATOR_TYPE_ACPI(TableGeneratorId) \\r
89           (GET_TABLE_TYPE (TableGeneratorId) == ETableGeneratorTypeAcpi)\r
90 \r
91 /** This macro checks if the Table Generator ID is for a standard ACPI\r
92     Table Generator.\r
93 \r
94   @param [in] TableGeneratorId  The table generator ID.\r
95 \r
96   @return TRUE if the table generator ID is for a standard ACPI\r
97           Table Generator.\r
98 **/\r
99 #define IS_VALID_STD_ACPI_GENERATOR_ID(TableGeneratorId)           \\r
100           (                                                        \\r
101           IS_GENERATOR_NAMESPACE_STD (TableGeneratorId) &&         \\r
102           IS_GENERATOR_TYPE_ACPI (TableGeneratorId)     &&         \\r
103           ((GET_TABLE_ID (GeneratorId) >= EStdAcpiTableIdRaw) &&   \\r
104            (GET_TABLE_ID (GeneratorId) < EStdAcpiTableIdMax))      \\r
105           )\r
106 \r
107 /** This macro creates a standard ACPI Table Generator ID.\r
108 \r
109   @param [in] TableId  The table generator ID.\r
110 \r
111   @return a standard ACPI table generator ID.\r
112 **/\r
113 #define CREATE_STD_ACPI_TABLE_GEN_ID(TableId) \\r
114           CREATE_TABLE_GEN_ID (               \\r
115             ETableGeneratorTypeAcpi,          \\r
116             ETableGeneratorNameSpaceStd,      \\r
117             TableId                           \\r
118             )\r
119 \r
120 /** This macro creates an OEM ACPI Table Generator ID.\r
121 \r
122   @param [in] TableId  The table generator ID.\r
123 \r
124   @return an OEM ACPI table generator ID.\r
125 **/\r
126 #define CREATE_OEM_ACPI_TABLE_GEN_ID(TableId) \\r
127           CREATE_TABLE_GEN_ID (               \\r
128             ETableGeneratorTypeAcpi,          \\r
129             ETableGeneratorNameSpaceOem,      \\r
130             TableId                           \\r
131             )\r
132 \r
133 /** The Creator ID for the ACPI tables generated using\r
134   the standard ACPI table generators.\r
135 */\r
136 #define TABLE_GENERATOR_CREATOR_ID_ARM  SIGNATURE_32('A', 'R', 'M', 'H')\r
137 \r
138 /** A macro to initialise the common header part of EFI ACPI tables as\r
139     defined by the EFI_ACPI_DESCRIPTION_HEADER structure.\r
140 \r
141   @param [in] Signature The ACPI table signature.\r
142   @param [in] Type      The ACPI table structure.\r
143   @param [in] Revision  The ACPI table revision.\r
144 **/\r
145 #define ACPI_HEADER(Signature, Type, Revision) {              \\r
146           Signature,             /* UINT32  Signature */      \\r
147           sizeof (Type),         /* UINT32  Length */         \\r
148           Revision,              /* UINT8   Revision */       \\r
149           0,                     /* UINT8   Checksum */       \\r
150           { 0, 0, 0, 0, 0, 0 },  /* UINT8   OemId[6] */       \\r
151           0,                     /* UINT64  OemTableId */     \\r
152           0,                     /* UINT32  OemRevision */    \\r
153           0,                     /* UINT32  CreatorId */      \\r
154           0                      /* UINT32  CreatorRevision */\\r
155           }\r
156 \r
157 /** A macro to dump the common header part of EFI ACPI tables as\r
158     defined by the EFI_ACPI_DESCRIPTION_HEADER structure.\r
159 \r
160   @param [in] AcpiHeader The pointer to the ACPI table header.\r
161 **/\r
162 #define DUMP_ACPI_TABLE_HEADER(AcpiHeader)                        \\r
163           DEBUG ((                                                \\r
164             DEBUG_INFO,                                           \\r
165             "ACPI TABLE %c%c%c%c : Rev 0x%x : Length : 0x%x\n",   \\r
166             (AcpiHeader->Signature & 0xFF),                       \\r
167             ((AcpiHeader->Signature >> 8) & 0xFF),                \\r
168             ((AcpiHeader->Signature >> 16) & 0xFF),               \\r
169             ((AcpiHeader->Signature >> 24) & 0xFF),               \\r
170             AcpiHeader->Revision,                                 \\r
171             AcpiHeader->Length                                    \\r
172             ));\r
173 \r
174 /** Forward declarations.\r
175 */\r
176 typedef struct ConfigurationManagerProtocol EDKII_CONFIGURATION_MANAGER_PROTOCOL;\r
177 typedef struct CmAStdObjAcpiTableInfo       CM_STD_OBJ_ACPI_TABLE_INFO;\r
178 typedef struct AcpiTableGenerator           ACPI_TABLE_GENERATOR;\r
179 \r
180 /** This function pointer describes the interface to ACPI table build\r
181     functions provided by the ACPI table generator and called by the\r
182     Table Manager to build an ACPI table.\r
183 \r
184   @param [in]  This            Pointer to the ACPI table generator.\r
185   @param [in]  AcpiTableInfo   Pointer to the ACPI table information.\r
186   @param [in]  CfgMgrProtocol  Pointer to the Configuration Manager\r
187                                Protocol interface.\r
188   @param [out] Table           Pointer to the generated ACPI table.\r
189 \r
190   @return  EFI_SUCCESS If the table is generated successfully or other\r
191                         failure codes as returned by the generator.\r
192 **/\r
193 typedef EFI_STATUS (*ACPI_TABLE_GENERATOR_BUILD_TABLE) (\r
194   IN  CONST ACPI_TABLE_GENERATOR                   *       This,\r
195   IN  CONST CM_STD_OBJ_ACPI_TABLE_INFO             * CONST AcpiTableInfo,\r
196   IN  CONST EDKII_CONFIGURATION_MANAGER_PROTOCOL   * CONST CfgMgrProtocol,\r
197   OUT       EFI_ACPI_DESCRIPTION_HEADER           **       Table\r
198   );\r
199 \r
200 /** This function pointer describes the interface used by the\r
201     Table Manager to give the generator an opportunity to free\r
202     any resources allocated for building the ACPI table.\r
203 \r
204   @param [in]      This           Pointer to the ACPI table generator.\r
205   @param [in]      AcpiTableInfo  Pointer to the ACPI Table Info.\r
206   @param [in]      CfgMgrProtocol Pointer to the Configuration Manager\r
207                                   Protocol Interface.\r
208   @param [in, out] Table          Pointer to the ACPI Table.\r
209 \r
210   @return EFI_SUCCESS  If freed successfully or other failure codes\r
211                         as returned by the generator.\r
212 **/\r
213 typedef EFI_STATUS (*ACPI_TABLE_GENERATOR_FREE_TABLE) (\r
214   IN      CONST ACPI_TABLE_GENERATOR                   * CONST This,\r
215   IN      CONST CM_STD_OBJ_ACPI_TABLE_INFO             * CONST AcpiTableInfo,\r
216   IN      CONST EDKII_CONFIGURATION_MANAGER_PROTOCOL   * CONST CfgMgrProtocol,\r
217   IN OUT        EFI_ACPI_DESCRIPTION_HEADER           ** CONST Table\r
218   );\r
219 \r
220 /** This function pointer describes an extended interface to build\r
221     ACPI Tables. The ACPI table generator can generate multiple\r
222     ACPI Tables and return a pointer to the list of ACPI tables.\r
223     The FreeTableResourcesEx() must be called to free any resources\r
224     that may have been allocated using this interface.\r
225 \r
226   @param [in]  This            Pointer to the ACPI table generator.\r
227   @param [in]  AcpiTableInfo   Pointer to the ACPI table information.\r
228   @param [in]  CfgMgrProtocol  Pointer to the Configuration Manager\r
229                                Protocol interface.\r
230   @param [out] Table           Pointer to a list of generated ACPI table(s).\r
231   @param [out] TableCount      Number of generated ACPI table(s).\r
232 \r
233   @return  EFI_SUCCESS If the table is generated successfully or other\r
234                         failure codes as returned by the generator.\r
235 **/\r
236 typedef EFI_STATUS (*ACPI_TABLE_GENERATOR_BUILD_TABLEEX) (\r
237   IN  CONST ACPI_TABLE_GENERATOR                   *       This,\r
238   IN  CONST CM_STD_OBJ_ACPI_TABLE_INFO             * CONST AcpiTableInfo,\r
239   IN  CONST EDKII_CONFIGURATION_MANAGER_PROTOCOL   * CONST CfgMgrProtocol,\r
240   OUT       EFI_ACPI_DESCRIPTION_HEADER          ***       Table,\r
241   OUT       UINTN                                  * CONST TableCount\r
242   );\r
243 \r
244 /** This function pointer describes an extended interface used by the\r
245     Table Manager to give the generator an opportunity to free\r
246     any resources allocated for building the ACPI table. This interface\r
247     must be used in conjunction with the BuildAcpiTableEx interface.\r
248 \r
249   @param [in]      This           Pointer to the ACPI table generator.\r
250   @param [in]      AcpiTableInfo  Pointer to the ACPI Table Info.\r
251   @param [in]      CfgMgrProtocol Pointer to the Configuration Manager\r
252                                   Protocol Interface.\r
253   @param [in, out] Table          Pointer to the list of ACPI Table(s).\r
254   @param [in]      TableCount     Number of ACPI table(s).\r
255 \r
256   @return EFI_SUCCESS  If freed successfully or other failure codes\r
257                         as returned by the generator.\r
258 **/\r
259 typedef EFI_STATUS (*ACPI_TABLE_GENERATOR_FREE_TABLEEX) (\r
260   IN      CONST ACPI_TABLE_GENERATOR                   * CONST This,\r
261   IN      CONST CM_STD_OBJ_ACPI_TABLE_INFO             * CONST AcpiTableInfo,\r
262   IN      CONST EDKII_CONFIGURATION_MANAGER_PROTOCOL   * CONST CfgMgrProtocol,\r
263   IN OUT        EFI_ACPI_DESCRIPTION_HEADER          *** CONST Table,\r
264   IN      CONST UINTN                                          TableCount\r
265   );\r
266 \r
267 /** The ACPI_TABLE_GENERATOR structure provides an interface that the\r
268     Table Manager can use to invoke the functions to build ACPI tables.\r
269 \r
270     Note: Although the Generator is required to implement at least\r
271           one pair of interfaces (BuildAcpiTable & FreeTableResources or\r
272           BuildAcpiTableEx & FreeTableResourcesEx) for generating the ACPI\r
273           table(s), if both pair of interfaces are implemented the extended\r
274           version will take precedence.\r
275 **/\r
276 typedef struct AcpiTableGenerator {\r
277   /// The ACPI table generator ID.\r
278   ACPI_TABLE_GENERATOR_ID                GeneratorID;\r
279 \r
280   /// String describing the ACPI table generator.\r
281   CONST CHAR16                         * Description;\r
282 \r
283   /// The ACPI table signature.\r
284   UINT32                                 AcpiTableSignature;\r
285 \r
286   /// The ACPI table revision.\r
287   UINT32                                 AcpiTableRevision;\r
288 \r
289   /// The minimum supported ACPI table revision.\r
290   UINT32                                 MinAcpiTableRevision;\r
291 \r
292   /// The ACPI table creator ID.\r
293   UINT32                                 CreatorId;\r
294 \r
295   /// The ACPI table creator revision.\r
296   UINT32                                 CreatorRevision;\r
297 \r
298   /// ACPI table build function pointer.\r
299   ACPI_TABLE_GENERATOR_BUILD_TABLE       BuildAcpiTable;\r
300 \r
301   /** The function to free any resources\r
302       allocated for building the ACPI table.\r
303   */\r
304   ACPI_TABLE_GENERATOR_FREE_TABLE        FreeTableResources;\r
305 \r
306   /// ACPI table extended build function pointer.\r
307   ACPI_TABLE_GENERATOR_BUILD_TABLEEX     BuildAcpiTableEx;\r
308 \r
309   /** The function to free any resources\r
310       allocated for building the ACPI table\r
311       using the extended interface.\r
312   */\r
313   ACPI_TABLE_GENERATOR_FREE_TABLEEX      FreeTableResourcesEx;\r
314 } ACPI_TABLE_GENERATOR;\r
315 \r
316 /** Register ACPI table factory generator.\r
317 \r
318   The ACPI table factory maintains a list of the Standard and OEM ACPI\r
319   table generators.\r
320 \r
321   @param [in]  Generator       Pointer to the ACPI table generator.\r
322 \r
323   @retval EFI_SUCCESS           The Generator was registered\r
324                                 successfully.\r
325   @retval EFI_INVALID_PARAMETER The Generator ID is invalid or\r
326                                 the Generator pointer is NULL.\r
327   @retval EFI_ALREADY_STARTED   The Generator for the Table ID is\r
328                                 already registered.\r
329 **/\r
330 EFI_STATUS\r
331 EFIAPI\r
332 RegisterAcpiTableGenerator (\r
333   IN CONST ACPI_TABLE_GENERATOR                 * CONST Generator\r
334   );\r
335 \r
336 /** Deregister ACPI generator.\r
337 \r
338   This function is called by the ACPI table generator to deregister itself\r
339   from the ACPI table factory.\r
340 \r
341   @param [in]  Generator       Pointer to the ACPI table generator.\r
342 \r
343   @retval EFI_SUCCESS           Success.\r
344   @retval EFI_INVALID_PARAMETER The generator is invalid.\r
345   @retval EFI_NOT_FOUND         The requested generator is not found\r
346                                 in the list of registered generators.\r
347 **/\r
348 EFI_STATUS\r
349 EFIAPI\r
350 DeregisterAcpiTableGenerator (\r
351   IN CONST ACPI_TABLE_GENERATOR                 * CONST Generator\r
352   );\r
353 \r
354 #pragma pack()\r
355 \r
356 #endif // ACPI_TABLE_GENERATOR_H_\r
357 \r