/** @file
  DSDT table parser

  Copyright (c) 2016 - 2022, ARM Limited. All rights reserved.
  SPDX-License-Identifier: BSD-2-Clause-Patent

  @par Reference(s):
    - ACPI 6.2 Specification - Errata A, September 2017
**/

#include <IndustryStandard/Acpi.h>
#include <Library/UefiLib.h>
#include "AcpiParser.h"
#include "AcpiTableParser.h"

/**
  This function parses the ACPI DSDT table.
  When trace is enabled this function parses the DSDT table and
  traces the ACPI table fields.
  For the DSDT table only the ACPI header fields are parsed and
  traced.

  @param [in] Trace              If TRUE, trace the ACPI fields.
  @param [in] Ptr                Pointer to the start of the buffer.
  @param [in] AcpiTableLength    Length of the ACPI table.
  @param [in] AcpiTableRevision  Revision of the ACPI table.
**/
VOID
EFIAPI
ParseAcpiDsdt (
  IN BOOLEAN  Trace,
  IN UINT8    *Ptr,
  IN UINT32   AcpiTableLength,
  IN UINT8    AcpiTableRevision
  )
{
  if (!Trace) {
    return;
  }

  DumpAcpiHeader (Ptr);

  // As per 19.6.29 in the version 6.4 of the ACPI spec, a revision less than 2
  // restricts integers to 32 bit width. This may not be intended, raise a
  // warning
 #if defined (MDE_CPU_AARCH64)
  if (AcpiTableRevision < 2) {
    IncrementWarningCount ();
    Print (
      L"WARNING: DSDT Table Revision less than 2. Integer width restricted to "
      L"32 bits. Table Revision = %d.\n",
      AcpiTableRevision
      );
    return;
  }

 #endif
}
