/** @file AML Resource Data. Copyright (c) 2019 - 2020, Arm Limited. All rights reserved.
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 **/ #include /** 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. @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 ) { if (Header == NULL) { ASSERT (0); return FALSE; } if (AML_RD_IS_LARGE (Header)) { return ((*Header ^ DescriptorId) == 0); } else { return (((*Header & AML_RD_SMALL_ID_MASK) ^ DescriptorId) == 0); } } /** 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. @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 ) { if (Header == NULL) { ASSERT (0); return FALSE; } if (AML_RD_IS_LARGE (Header)) { return *Header; } // Header is a small resource data element. return *Header & AML_RD_SMALL_ID_MASK; } /** 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. @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 ) { if (Header == NULL) { ASSERT (0); return FALSE; } if (AML_RD_IS_LARGE (Header)) { return ((ACPI_LARGE_RESOURCE_HEADER *)Header)->Length + sizeof (ACPI_LARGE_RESOURCE_HEADER); } // Header is a small resource data element. return ((ACPI_SMALL_RESOURCE_HEADER *)Header)->Bits.Length + sizeof (ACPI_SMALL_RESOURCE_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 ) { if ((Header == NULL) || !AmlRdCompareDescId ( Header, AML_RD_BUILD_SMALL_DESC_ID (ACPI_SMALL_END_TAG_DESCRIPTOR_NAME) )) { ASSERT (0); return EFI_INVALID_PARAMETER; } ((EFI_ACPI_END_TAG_DESCRIPTOR *)Header)->Checksum = CheckSum; return EFI_SUCCESS; }