/** @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
**/

#include <ResourceData/AmlResourceData.h>

/** 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;
}
