| /** @file | |
| AML Resource Data. | |
| Copyright (c) 2019 - 2020, Arm Limited. All rights reserved.<BR> | |
| SPDX-License-Identifier: BSD-2-Clause-Patent | |
| @par Glossary: | |
| - Rd or RD - Resource Data | |
| - Rds or RDS - Resource Data Small | |
| - Rdl or RDL - Resource Data Large | |
| **/ | |
| #ifndef AML_RESOURCE_DATA_H_ | |
| #define AML_RESOURCE_DATA_H_ | |
| /* This header file does not include internal Node definition, | |
| i.e. AML_ROOT_NODE, AML_OBJECT_NODE, etc. The node definitions | |
| must be included by the caller file. The function prototypes must | |
| only expose AML_NODE_HANDLE, AML_ROOT_NODE_HANDLE, etc. node | |
| definitions. | |
| This allows to keep the functions defined here both internal and | |
| potentially external. If necessary, any function of this file can | |
| be exposed externally. | |
| The Api folder is internal to the AmlLib, but should only use these | |
| functions. They provide a "safe" way to interact with the AmlLib. | |
| */ | |
| #include <AmlInclude.h> | |
| #include <IndustryStandard/Acpi.h> | |
| /** | |
| @defgroup ResourceDataLibrary Resource data library | |
| @ingroup AMLLib | |
| @{ | |
| Resource data are defined in the ACPI 6.3 specification, | |
| s6.4 "Resource Data Types for ACPI". They can be created in ASL via the | |
| ResourceTemplate () statement, cf s19.3.3 "ASL Resource Templates". | |
| Resource data can be of the small or large type. The difference between | |
| small and large resource data elements is their encoding. | |
| Resource data are stored in the variable list of arguments of object | |
| nodes. | |
| @} | |
| */ | |
| /** Resource Descriptor header for Small/Large Resource Data Object. | |
| This is the first byte of a Small/Large Resource Data element. | |
| Can be a ACPI_SMALL_RESOURCE_HEADER or ACPI_LARGE_RESOURCE_HEADER. | |
| @ingroup ResourceDataStructures | |
| */ | |
| typedef UINT8 AML_RD_HEADER; | |
| /** Mask for the small resource data size. | |
| @ingroup ResourceDataStructures | |
| */ | |
| #define AML_RD_SMALL_SIZE_MASK (0x7U) | |
| /** Mask for the small resource data ID. | |
| @ingroup ResourceDataStructures | |
| */ | |
| #define AML_RD_SMALL_ID_MASK (0xFU << 3) | |
| /** Mask for the large resource data ID. | |
| @ingroup ResourceDataStructures | |
| */ | |
| #define AML_RD_LARGE_ID_MASK (0x7FU) | |
| /** | |
| @defgroup ResourceDataApis Resource data APIs | |
| @ingroup ResourceDataLibrary | |
| @{ | |
| Resource data APIs allow to manipulate/decode resource data elements. | |
| @} | |
| */ | |
| /** Check whether a resource data is of the large type. | |
| @ingroup ResourceDataApis | |
| @param [in] Header Pointer to the first byte of a resource data. | |
| @retval TRUE If the resource data is of the large type. | |
| @retval FALSE Otherwise. | |
| **/ | |
| #define AML_RD_IS_LARGE(Header) \ | |
| (((ACPI_SMALL_RESOURCE_HEADER*)Header)->Bits.Type == \ | |
| ACPI_LARGE_ITEM_FLAG) | |
| /** Build a small resource data descriptor Id. | |
| The small/large bit is included in the descriptor Id, | |
| but the size bits are not included. | |
| @ingroup ResourceDataApis | |
| @param [in] Id Descriptor Id. | |
| @return A descriptor Id. | |
| **/ | |
| #define AML_RD_BUILD_SMALL_DESC_ID(Id) ((AML_RD_HEADER)((Id & 0xF) << 3)) | |
| /** Build a large resource data descriptor Id. | |
| The small/large bit is included in the descriptor Id. | |
| @ingroup ResourceDataApis | |
| @param [in] Id Id of the descriptor. | |
| @return A descriptor Id. | |
| **/ | |
| #define AML_RD_BUILD_LARGE_DESC_ID(Id) ((AML_RD_HEADER)((BIT7) | Id)) | |
| /** Check whether the resource data has the input descriptor Id. | |
| The small/large bit is included in the descriptor Id, | |
| but the size bits are not included for small resource data elements. | |
| @ingroup ResourceDataApis | |
| @param [in] Header Pointer to the first byte of a resource data | |
| element. | |
| @param [in] DescriptorId The descriptor to check against. | |
| @retval TRUE The resource data has the descriptor Id. | |
| @retval FALSE Otherwise. | |
| **/ | |
| BOOLEAN | |
| EFIAPI | |
| AmlRdCompareDescId ( | |
| IN CONST AML_RD_HEADER *Header, | |
| IN AML_RD_HEADER DescriptorId | |
| ); | |
| /** Get the descriptor Id of the resource data. | |
| The small/large bit is included in the descriptor Id, | |
| but the size bits are not included for small resource data elements. | |
| @ingroup ResourceDataApis | |
| @param [in] Header Pointer to the first byte of a resource data. | |
| @return A descriptor Id. | |
| **/ | |
| AML_RD_HEADER | |
| EFIAPI | |
| AmlRdGetDescId ( | |
| IN CONST AML_RD_HEADER *Header | |
| ); | |
| /** Get the size of a resource data element. | |
| If the resource data element is of the large type, the Header | |
| is expected to be at least 3 bytes long. | |
| @ingroup ResourceDataApis | |
| @param [in] Header Pointer to the first byte of a resource data. | |
| @return The size of the resource data element. | |
| **/ | |
| UINT32 | |
| EFIAPI | |
| AmlRdGetSize ( | |
| IN CONST AML_RD_HEADER *Header | |
| ); | |
| /** Set the Checksum of an EndTag resource data. | |
| ACPI 6.4, s6.4.2.9 "End Tag": | |
| "This checksum is generated such that adding it to the sum of all the data | |
| bytes will produce a zero sum." | |
| "If the checksum field is zero, the resource data is treated as if the | |
| checksum operation succeeded. Configuration proceeds normally." | |
| @param [in] Header Pointer to the first byte of a resource data. | |
| @param [in] CheckSum Checksum value to set. | |
| @retval EFI_SUCCESS The function completed successfully. | |
| @retval EFI_INVALID_PARAMETER Invalid parameter. | |
| **/ | |
| EFI_STATUS | |
| EFIAPI | |
| AmlRdSetEndTagChecksum ( | |
| IN CONST AML_RD_HEADER *Header, | |
| IN UINT8 CheckSum | |
| ); | |
| #endif // AML_RESOURCE_DATA_H_ |