1 /** @file
2   ACPI Sdt Protocol Driver
3 
4   Copyright (c) 2010 - 2015, 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 #ifndef _ACPI_SDT_H_
16 #define _ACPI_SDT_H_
17 
18 //
19 // Privacy data structure
20 //
21 
22 //
23 // ACPI Notify Linked List Signature.
24 //
25 #define EFI_ACPI_NOTIFY_LIST_SIGNATURE SIGNATURE_32 ('E', 'A', 'N', 'L')
26 
27 //
28 // ACPI Notify List Entry definition.
29 //
30 //  Signature must be set to EFI_ACPI_NOTIFY_LIST_SIGNATURE
31 //  Link is the linked list data.
32 //  Notification is the callback function.
33 //
34 typedef struct {
35   UINT32                   Signature;
36   LIST_ENTRY               Link;
37   EFI_ACPI_NOTIFICATION_FN Notification;
38 } EFI_ACPI_NOTIFY_LIST;
39 
40 //
41 // Containment record for ACPI Notify linked list.
42 //
43 #define EFI_ACPI_NOTIFY_LIST_FROM_LINK(_link)  CR (_link, EFI_ACPI_NOTIFY_LIST, Link, EFI_ACPI_NOTIFY_LIST_SIGNATURE)
44 
45 typedef struct _AML_BYTE_ENCODING AML_BYTE_ENCODING;
46 typedef struct _EFI_AML_NODE_LIST EFI_AML_NODE_LIST;
47 
48 //
49 // AML Node Linked List Signature.
50 //
51 #define EFI_AML_NODE_LIST_SIGNATURE SIGNATURE_32 ('E', 'A', 'M', 'L')
52 
53 //
54 // AML Node Linked List Entry definition.
55 //
56 //  Signature must be set to EFI_AML_NODE_LIST_SIGNATURE
57 //  Link is the linked list data.
58 //  Name is the ACPI node name.
59 //         This is listed for PATH finding.
60 //  Buffer is the ACPI node buffer pointer, the first/second bytes are opcode.
61 //         This buffer should not be freed.
62 //  Size is the total size of this ACPI node buffer.
63 //  Children is the children linked list of this node.
64 //
65 #define AML_NAME_SEG_SIZE  4
66 
67 struct _EFI_AML_NODE_LIST {
68   UINT32                  Signature;
69   UINT8                   Name[AML_NAME_SEG_SIZE];
70   UINT8                   *Buffer;
71   UINTN                   Size;
72   LIST_ENTRY              Link;
73   LIST_ENTRY              Children;
74   EFI_AML_NODE_LIST       *Parent;
75   AML_BYTE_ENCODING       *AmlByteEncoding;
76 };
77 
78 //
79 // Containment record for AML Node linked list.
80 //
81 #define EFI_AML_NODE_LIST_FROM_LINK(_link)  CR (_link, EFI_AML_NODE_LIST, Link, EFI_AML_NODE_LIST_SIGNATURE)
82 
83 //
84 // AML Handle Signature.
85 //
86 #define EFI_AML_HANDLE_SIGNATURE SIGNATURE_32 ('E', 'A', 'H', 'S')
87 #define EFI_AML_ROOT_HANDLE_SIGNATURE SIGNATURE_32 ('E', 'A', 'R', 'H')
88 
89 //
90 // AML Handle Entry definition.
91 //
92 //  Signature must be set to EFI_AML_HANDLE_SIGNATURE or EFI_AML_ROOT_HANDLE_SIGNATURE
93 //  Buffer is the ACPI node buffer pointer, the first/second bytes are opcode.
94 //         This buffer should not be freed.
95 //  Size is the total size of this ACPI node buffer.
96 //
97 typedef struct {
98   UINT32                  Signature;
99   UINT8                   *Buffer;
100   UINTN                   Size;
101   AML_BYTE_ENCODING       *AmlByteEncoding;
102   BOOLEAN                 Modified;
103 } EFI_AML_HANDLE;
104 
105 typedef UINT32 AML_OP_PARSE_INDEX;
106 
107 #define AML_OP_PARSE_INDEX_GET_OPCODE     0
108 #define AML_OP_PARSE_INDEX_GET_TERM1      1
109 #define AML_OP_PARSE_INDEX_GET_TERM2      2
110 #define AML_OP_PARSE_INDEX_GET_TERM3      3
111 #define AML_OP_PARSE_INDEX_GET_TERM4      4
112 #define AML_OP_PARSE_INDEX_GET_TERM5      5
113 #define AML_OP_PARSE_INDEX_GET_TERM6      6
114 #define AML_OP_PARSE_INDEX_GET_SIZE       (AML_OP_PARSE_INDEX)-1
115 
116 typedef UINT32 AML_OP_PARSE_FORMAT;
117 #define AML_NONE         0
118 #define AML_OPCODE       1
119 #define AML_UINT8        2
120 #define AML_UINT16       3
121 #define AML_UINT32       4
122 #define AML_UINT64       5
123 #define AML_NAME         6
124 #define AML_STRING       7
125 #define AML_OBJECT       8
126 
127 typedef UINT32 AML_OP_ATTRIBUTE;
128 #define AML_HAS_PKG_LENGTH       0x1     // It is ACPI attribute - if OpCode has PkgLength
129 #define AML_IS_NAME_CHAR         0x2     // It is ACPI attribute - if this is NameChar
130 #define AML_HAS_CHILD_OBJ        0x4     // it is ACPI attribute - if OpCode has Child Object.
131 #define AML_IN_NAMESPACE         0x10000 // It is UEFI SDT attribute - if OpCode will be in NameSpace
132                                          // NOTE; Not all OBJECT will be in NameSpace
133                                          // For example, BankField | CreateBitField | CreateByteField | CreateDWordField |
134                                          //   CreateField | CreateQWordField | CreateWordField | Field | IndexField.
135 
136 struct _AML_BYTE_ENCODING {
137   UINT8                      OpCode;
138   UINT8                      SubOpCode;
139   AML_OP_PARSE_INDEX         MaxIndex;
140   AML_OP_PARSE_FORMAT        Format[6];
141   AML_OP_ATTRIBUTE           Attribute;
142 };
143 
144 //
145 // AcpiSdt protocol declaration
146 //
147 
148 /**
149   Returns a requested ACPI table.
150 
151   The GetAcpiTable() function returns a pointer to a buffer containing the ACPI table associated
152   with the Index that was input. The following structures are not considered elements in the list of
153   ACPI tables:
154   - Root System Description Pointer (RSD_PTR)
155   - Root System Description Table (RSDT)
156   - Extended System Description Table (XSDT)
157   Version is updated with a bit map containing all the versions of ACPI of which the table is a
158   member. For tables installed via the EFI_ACPI_TABLE_PROTOCOL.InstallAcpiTable() interface,
159   the function returns the value of EFI_ACPI_STD_PROTOCOL.AcpiVersion.
160 
161   @param[in]    Index       The zero-based index of the table to retrieve.
162   @param[out]   Table       Pointer for returning the table buffer.
163   @param[out]   Version     On return, updated with the ACPI versions to which this table belongs. Type
164                             EFI_ACPI_TABLE_VERSION is defined in "Related Definitions" in the
165                             EFI_ACPI_SDT_PROTOCOL.
166   @param[out]   TableKey    On return, points to the table key for the specified ACPI system definition table.
167                             This is identical to the table key used in the EFI_ACPI_TABLE_PROTOCOL.
168                             The TableKey can be passed to EFI_ACPI_TABLE_PROTOCOL.UninstallAcpiTable()
169                             to uninstall the table.
170 
171   @retval EFI_SUCCESS       The function completed successfully.
172   @retval EFI_NOT_FOUND     The requested index is too large and a table was not found.
173 **/
174 EFI_STATUS
175 EFIAPI
176 GetAcpiTable2 (
177   IN  UINTN                               Index,
178   OUT EFI_ACPI_SDT_HEADER                 **Table,
179   OUT EFI_ACPI_TABLE_VERSION              *Version,
180   OUT UINTN                               *TableKey
181   );
182 
183 /**
184   Register or unregister a callback when an ACPI table is installed.
185 
186   This function registers or unregisters a function which will be called whenever a new ACPI table is
187   installed.
188 
189   @param[in]    Register        If TRUE, then the specified function will be registered. If FALSE, then the specified
190                                 function will be unregistered.
191   @param[in]    Notification    Points to the callback function to be registered or unregistered.
192 
193   @retval EFI_SUCCESS           Callback successfully registered or unregistered.
194   @retval EFI_INVALID_PARAMETER Notification is NULL
195   @retval EFI_INVALID_PARAMETER Register is FALSE and Notification does not match a known registration function.
196 **/
197 EFI_STATUS
198 EFIAPI
199 RegisterNotify (
200   IN BOOLEAN                    Register,
201   IN EFI_ACPI_NOTIFICATION_FN   Notification
202   );
203 
204 /**
205   Create a handle for the first ACPI opcode in an ACPI system description table.
206 
207   @param[in]    TableKey    The table key for the ACPI table, as returned by GetTable().
208   @param[out]   Handle      On return, points to the newly created ACPI handle.
209 
210   @retval EFI_SUCCESS       Handle created successfully.
211   @retval EFI_NOT_FOUND     TableKey does not refer to a valid ACPI table.
212 **/
213 EFI_STATUS
214 EFIAPI
215 OpenSdt (
216   IN    UINTN           TableKey,
217   OUT   EFI_ACPI_HANDLE *Handle
218   );
219 
220 /**
221   Create a handle from an ACPI opcode
222 
223   @param[in]  Buffer                 Points to the ACPI opcode.
224   @param[out] Handle                 Upon return, holds the handle.
225 
226   @retval   EFI_SUCCESS             Success
227   @retval   EFI_INVALID_PARAMETER   Buffer is NULL or Handle is NULL or Buffer points to an
228                                     invalid opcode.
229 
230 **/
231 EFI_STATUS
232 EFIAPI
233 Open (
234   IN    VOID            *Buffer,
235   OUT   EFI_ACPI_HANDLE *Handle
236   );
237 
238 /**
239   Close an ACPI handle.
240 
241   @param[in] Handle Returns the handle.
242 
243   @retval EFI_SUCCESS           Success
244   @retval EFI_INVALID_PARAMETER Handle is NULL or does not refer to a valid ACPI object.
245 **/
246 EFI_STATUS
247 EFIAPI
248 Close (
249   IN EFI_ACPI_HANDLE Handle
250   );
251 
252 /**
253   Retrieve information about an ACPI object.
254 
255   @param[in]    Handle      ACPI object handle.
256   @param[in]    Index       Index of the data to retrieve from the object. In general, indexes read from left-to-right
257                             in the ACPI encoding, with index 0 always being the ACPI opcode.
258   @param[out]   DataType    Points to the returned data type or EFI_ACPI_DATA_TYPE_NONE if no data exists
259                             for the specified index.
260   @param[out]   Data        Upon return, points to the pointer to the data.
261   @param[out]   DataSize    Upon return, points to the size of Data.
262 
263   @retval       EFI_SUCCESS           Success.
264   @retval       EFI_INVALID_PARAMETER Handle is NULL or does not refer to a valid ACPI object.
265 **/
266 EFI_STATUS
267 EFIAPI
268 GetOption (
269   IN        EFI_ACPI_HANDLE     Handle,
270   IN        UINTN               Index,
271   OUT       EFI_ACPI_DATA_TYPE  *DataType,
272   OUT CONST VOID                **Data,
273   OUT       UINTN               *DataSize
274   );
275 
276 /**
277   Change information about an ACPI object.
278 
279   @param[in]  Handle    ACPI object handle.
280   @param[in]  Index     Index of the data to retrieve from the object. In general, indexes read from left-to-right
281                         in the ACPI encoding, with index 0 always being the ACPI opcode.
282   @param[in]  Data      Points to the data.
283   @param[in]  DataSize  The size of the Data.
284 
285   @retval EFI_SUCCESS           Success
286   @retval EFI_INVALID_PARAMETER Handle is NULL or does not refer to a valid ACPI object.
287   @retval EFI_BAD_BUFFER_SIZE   Data cannot be accommodated in the space occupied by
288                                 the option.
289 
290 **/
291 EFI_STATUS
292 EFIAPI
293 SetOption (
294   IN        EFI_ACPI_HANDLE Handle,
295   IN        UINTN           Index,
296   IN CONST  VOID            *Data,
297   IN        UINTN           DataSize
298   );
299 
300 /**
301   Return the child ACPI objects.
302 
303   @param[in]        ParentHandle    Parent handle.
304   @param[in, out]   Handle          On entry, points to the previously returned handle or NULL to start with the first
305                                     handle. On return, points to the next returned ACPI handle or NULL if there are no
306                                     child objects.
307 
308   @retval EFI_SUCCESS               Success
309   @retval EFI_INVALID_PARAMETER     ParentHandle is NULL or does not refer to a valid ACPI object.
310 **/
311 EFI_STATUS
312 EFIAPI
313 GetChild (
314   IN EFI_ACPI_HANDLE        ParentHandle,
315   IN OUT EFI_ACPI_HANDLE    *Handle
316   );
317 
318 /**
319   Returns the handle of the ACPI object representing the specified ACPI path
320 
321   @param[in]    HandleIn    Points to the handle of the object representing the starting point for the path search.
322   @param[in]    AcpiPath    Points to the ACPI path, which conforms to the ACPI encoded path format.
323   @param[out]   HandleOut   On return, points to the ACPI object which represents AcpiPath, relative to
324                             HandleIn.
325 
326   @retval EFI_SUCCESS           Success
327   @retval EFI_INVALID_PARAMETER HandleIn is NULL or does not refer to a valid ACPI object.
328 **/
329 EFI_STATUS
330 EFIAPI
331 FindPath (
332   IN    EFI_ACPI_HANDLE HandleIn,
333   IN    VOID            *AcpiPath,
334   OUT   EFI_ACPI_HANDLE *HandleOut
335   );
336 
337 //
338 // ACPI SDT function
339 //
340 
341 /**
342   Create a handle from an ACPI opcode
343 
344   @param[in]  Buffer                 Points to the ACPI opcode.
345   @param[in]  BufferSize             Max buffer size.
346   @param[out] Handle                 Upon return, holds the handle.
347 
348   @retval   EFI_SUCCESS             Success
349   @retval   EFI_INVALID_PARAMETER   Buffer is NULL or Handle is NULL or Buffer points to an
350                                     invalid opcode.
351 
352 **/
353 EFI_STATUS
354 SdtOpenEx (
355   IN    VOID            *Buffer,
356   IN    UINTN           BufferSize,
357   OUT   EFI_ACPI_HANDLE *Handle
358   );
359 
360 //
361 // AML support function
362 //
363 
364 /**
365   Get AML NameString size.
366 
367   @param[in]    Buffer     AML NameString.
368   @param[out]   BufferSize AML NameString size
369 
370   @retval       EFI_SUCCESS           Success.
371   @retval       EFI_INVALID_PARAMETER Buffer does not refer to a valid AML NameString.
372 **/
373 EFI_STATUS
374 AmlGetNameStringSize (
375   IN  UINT8              *Buffer,
376   OUT UINTN              *BufferSize
377   );
378 
379 /**
380   This function retuns package length from the buffer.
381 
382   @param[in]  Buffer    AML buffer
383   @param[out] PkgLength The total length of package.
384 
385   @return The byte data count to present the package length.
386 **/
387 UINTN
388 AmlGetPkgLength (
389   IN UINT8              *Buffer,
390   OUT UINTN             *PkgLength
391   );
392 
393 /**
394   This function returns AcpiDataType according to AmlType.
395 
396   @param[in]  AmlType        AML Type.
397 
398   @return AcpiDataType
399 **/
400 EFI_ACPI_DATA_TYPE
401 AmlTypeToAcpiType (
402   IN AML_OP_PARSE_FORMAT  AmlType
403   );
404 
405 /**
406   This function returns AmlByteEncoding according to OpCode Byte.
407 
408   @param[in]  OpByteBuffer        OpCode byte buffer.
409 
410   @return AmlByteEncoding
411 **/
412 AML_BYTE_ENCODING *
413 AmlSearchByOpByte (
414   IN UINT8                *OpByteBuffer
415   );
416 
417 /**
418   Return object size.
419 
420   @param[in]    AmlByteEncoding      AML Byte Encoding.
421   @param[in]    Buffer               AML object buffer.
422   @param[in]    MaxBufferSize        AML object buffer MAX size. The parser can not parse any data exceed this region.
423 
424   @return       Size of the object.
425 **/
426 UINTN
427 AmlGetObjectSize (
428   IN AML_BYTE_ENCODING   *AmlByteEncoding,
429   IN UINT8               *Buffer,
430   IN UINTN               MaxBufferSize
431   );
432 
433 /**
434   Return object name.
435 
436   @param[in]    AmlHandle            AML handle.
437 
438   @return       Name of the object.
439 **/
440 CHAR8 *
441 AmlGetObjectName (
442   IN EFI_AML_HANDLE      *AmlHandle
443   );
444 
445 /**
446   Retrieve information according to AmlHandle
447 
448   @param[in]    AmlHandle            AML handle.
449   @param[in]    Index                Index of the data to retrieve from the object. In general, indexes read from left-to-right
450                                      in the ACPI encoding, with index 0 always being the ACPI opcode.
451   @param[out]   DataType             Points to the returned data type or EFI_ACPI_DATA_TYPE_NONE if no data exists
452                                      for the specified index.
453   @param[out]   Data                 Upon return, points to the pointer to the data.
454   @param[out]   DataSize             Upon return, points to the size of Data.
455 
456   @retval       EFI_SUCCESS           Success.
457   @retval       EFI_INVALID_PARAMETER AmlHandle does not refer to a valid ACPI object.
458 **/
459 EFI_STATUS
460 AmlParseOptionHandleCommon (
461   IN EFI_AML_HANDLE      *AmlHandle,
462   IN AML_OP_PARSE_INDEX  Index,
463   OUT EFI_ACPI_DATA_TYPE *DataType,
464   OUT VOID               **Data,
465   OUT UINTN              *DataSize
466   );
467 
468 /**
469   Return offset of last option.
470 
471   @param[in]    AmlHandle            AML Handle.
472   @param[out]   Buffer               Upon return, points to the offset after last option.
473 
474   @retval       EFI_SUCCESS           Success.
475   @retval       EFI_INVALID_PARAMETER AmlHandle does not refer to a valid ACPI object.
476 **/
477 EFI_STATUS
478 AmlGetOffsetAfterLastOption (
479   IN EFI_AML_HANDLE         *AmlHandle,
480   OUT UINT8                 **Buffer
481   );
482 
483 /**
484   Return the child ACPI objects from Root Handle.
485 
486   @param[in]        AmlParentHandle Parent handle. It is Root Handle.
487   @param[in]        AmlHandle       The previously returned handle or NULL to start with the first handle.
488   @param[out]       Buffer          On return, points to the next returned ACPI handle or NULL if there are no
489                                     child objects.
490 
491   @retval EFI_SUCCESS               Success
492   @retval EFI_INVALID_PARAMETER     ParentHandle is NULL or does not refer to a valid ACPI object.
493 **/
494 EFI_STATUS
495 AmlGetChildFromRoot (
496   IN EFI_AML_HANDLE         *AmlParentHandle,
497   IN EFI_AML_HANDLE         *AmlHandle,
498   OUT VOID                  **Buffer
499   );
500 
501 /**
502   Return the child ACPI objects from Non-Root Handle.
503 
504   @param[in]        AmlParentHandle Parent handle. It is Non-Root Handle.
505   @param[in]        AmlHandle       The previously returned handle or NULL to start with the first handle.
506   @param[out]       Buffer          On return, points to the next returned ACPI handle or NULL if there are no
507                                     child objects.
508 
509   @retval EFI_SUCCESS               Success
510   @retval EFI_INVALID_PARAMETER     ParentHandle is NULL or does not refer to a valid ACPI object.
511 **/
512 EFI_STATUS
513 AmlGetChildFromNonRoot (
514   IN EFI_AML_HANDLE         *AmlParentHandle,
515   IN EFI_AML_HANDLE         *AmlHandle,
516   OUT VOID                  **Buffer
517   );
518 
519 /**
520   Return AML name according to ASL name.
521   The caller need free the AmlName returned.
522 
523   @param[in]    AslPath     ASL name.
524 
525   @return AmlName
526 **/
527 UINT8 *
528 AmlNameFromAslName (
529   IN UINT8 *AslPath
530   );
531 
532 /**
533   Returns the handle of the ACPI object representing the specified ACPI AML path
534 
535   @param[in]    AmlHandle   Points to the handle of the object representing the starting point for the path search.
536   @param[in]    AmlPath     Points to the ACPI AML path.
537   @param[out]   Buffer      On return, points to the ACPI object which represents AcpiPath, relative to
538                             HandleIn.
539   @param[in]    FromRoot    TRUE means to find AML path from \ (Root) Node.
540                             FALSE means to find AML path from this Node (The HandleIn).
541 
542   @retval EFI_SUCCESS           Success
543   @retval EFI_INVALID_PARAMETER HandleIn does not refer to a valid ACPI object.
544 **/
545 EFI_STATUS
546 AmlFindPath (
547   IN    EFI_AML_HANDLE  *AmlHandle,
548   IN    UINT8           *AmlPath,
549   OUT   VOID            **Buffer,
550   IN    BOOLEAN         FromRoot
551   );
552 
553 /**
554   Print AML NameString.
555 
556   @param[in] Buffer AML NameString.
557 **/
558 VOID
559 AmlPrintNameString (
560   IN UINT8              *Buffer
561   );
562 
563 /**
564   Print AML NameSeg.
565 
566   @param[in] Buffer AML NameSeg.
567 **/
568 VOID
569 AmlPrintNameSeg (
570   IN UINT8              *Buffer
571   );
572 
573 /**
574   Check if it is AML Root name
575 
576   @param[in]    Buffer AML path.
577 
578   @retval       TRUE  AML path is root.
579   @retval       FALSE AML path is not root.
580 **/
581 BOOLEAN
582 AmlIsRootPath (
583   IN UINT8              *Buffer
584   );
585 
586 #endif
587