This function allows to add a node as the last node of a parent node
in an AML tree. For instance,
ASL code corresponding to NewNode:
  Name (_UID, 0)
ASL code corresponding to ParentNode:
  Device (PCI0) {
    Name(_HID, EISAID("PNP0A08"))
  }
"AmlAttachNode (ParentNode, NewNode)" will result in:
ASL code:
  Device (PCI0) {
    Name(_HID, EISAID("PNP0A08"))
    Name (_UID, 0)
  }
To: Sami Mujawar <sami.mujawar@arm.com>
To: Alexei Fedorov <Alexei.Fedorov@arm.com>
Signed-off-by: Pierre Gondois <Pierre.Gondois@arm.com>
Reviewed-by: Sami Mujawar <sami.mujawar@arm.com>
		
	
		
			
				
	
	
		
			517 lines
		
	
	
		
			18 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			517 lines
		
	
	
		
			18 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
/** @file
 | 
						|
  AML Api.
 | 
						|
 | 
						|
  Copyright (c) 2020 - 2021, Arm Limited. All rights reserved.<BR>
 | 
						|
 | 
						|
  SPDX-License-Identifier: BSD-2-Clause-Patent
 | 
						|
**/
 | 
						|
 | 
						|
/* Even though this file has access to the internal Node definition,
 | 
						|
   i.e. AML_ROOT_NODE, AML_OBJECT_NODE, etc. Only the external node
 | 
						|
   handle types should be used, i.e. AML_NODE_HANDLE, AML_ROOT_NODE_HANDLE,
 | 
						|
   etc.
 | 
						|
   Indeed, the functions in the "Api" folder should be implemented only
 | 
						|
   using the "safe" functions available in the "Include" folder. This
 | 
						|
   makes the functions available in the "Api" folder easy to export.
 | 
						|
*/
 | 
						|
#include <AmlNodeDefines.h>
 | 
						|
 | 
						|
#include <AmlCoreInterface.h>
 | 
						|
#include <AmlInclude.h>
 | 
						|
#include <Api/AmlApiHelper.h>
 | 
						|
#include <String/AmlString.h>
 | 
						|
 | 
						|
/** Update the name of a DeviceOp object node.
 | 
						|
 | 
						|
  @param  [in] DeviceOpNode   Object node representing a Device.
 | 
						|
                              Must have an OpCode=AML_NAME_OP, SubOpCode=0.
 | 
						|
                              OpCode/SubOpCode.
 | 
						|
                              DeviceOp object nodes are defined in ASL
 | 
						|
                              using the "Device ()" function.
 | 
						|
  @param  [in] NewNameString  The new Device's name.
 | 
						|
                              Must be a NULL-terminated ASL NameString
 | 
						|
                              e.g.: "DEV0", "DV15.DEV0", etc.
 | 
						|
                              The input string is copied.
 | 
						|
 | 
						|
  @retval EFI_SUCCESS             The function completed successfully.
 | 
						|
  @retval EFI_INVALID_PARAMETER   Invalid parameter.
 | 
						|
**/
 | 
						|
EFI_STATUS
 | 
						|
EFIAPI
 | 
						|
AmlDeviceOpUpdateName (
 | 
						|
  IN  AML_OBJECT_NODE_HANDLE  DeviceOpNode,
 | 
						|
  IN  CHAR8                   *NewNameString
 | 
						|
  )
 | 
						|
{
 | 
						|
  EFI_STATUS  Status;
 | 
						|
 | 
						|
  AML_DATA_NODE_HANDLE  DeviceNameDataNode;
 | 
						|
  CHAR8                 *NewAmlNameString;
 | 
						|
  UINT32                NewAmlNameStringSize;
 | 
						|
 | 
						|
  // Check the input node is an object node.
 | 
						|
  if ((DeviceOpNode == NULL)                                              ||
 | 
						|
      (AmlGetNodeType ((AML_NODE_HANDLE)DeviceOpNode) != EAmlNodeObject)  ||
 | 
						|
      (!AmlNodeHasOpCode (DeviceOpNode, AML_EXT_OP, AML_EXT_DEVICE_OP))   ||
 | 
						|
      (NewNameString == NULL))
 | 
						|
  {
 | 
						|
    ASSERT (0);
 | 
						|
    return EFI_INVALID_PARAMETER;
 | 
						|
  }
 | 
						|
 | 
						|
  // Get the Device's name, being a data node
 | 
						|
  // which is the 1st fixed argument (i.e. index 0).
 | 
						|
  DeviceNameDataNode = (AML_DATA_NODE_HANDLE)AmlGetFixedArgument (
 | 
						|
                                               DeviceOpNode,
 | 
						|
                                               EAmlParseIndexTerm0
 | 
						|
                                               );
 | 
						|
  if ((DeviceNameDataNode == NULL)                                            ||
 | 
						|
      (AmlGetNodeType ((AML_NODE_HANDLE)DeviceNameDataNode) != EAmlNodeData)  ||
 | 
						|
      (!AmlNodeHasDataType (DeviceNameDataNode, EAmlNodeDataTypeNameString)))
 | 
						|
  {
 | 
						|
    ASSERT (0);
 | 
						|
    return EFI_INVALID_PARAMETER;
 | 
						|
  }
 | 
						|
 | 
						|
  Status = ConvertAslNameToAmlName (NewNameString, &NewAmlNameString);
 | 
						|
  if (EFI_ERROR (Status)) {
 | 
						|
    ASSERT (0);
 | 
						|
    return Status;
 | 
						|
  }
 | 
						|
 | 
						|
  Status = AmlGetNameStringSize (NewAmlNameString, &NewAmlNameStringSize);
 | 
						|
  if (EFI_ERROR (Status)) {
 | 
						|
    ASSERT (0);
 | 
						|
    goto exit_handler;
 | 
						|
  }
 | 
						|
 | 
						|
  // Update the Device's name node.
 | 
						|
  Status = AmlUpdateDataNode (
 | 
						|
             DeviceNameDataNode,
 | 
						|
             EAmlNodeDataTypeNameString,
 | 
						|
             (UINT8 *)NewAmlNameString,
 | 
						|
             NewAmlNameStringSize
 | 
						|
             );
 | 
						|
  ASSERT_EFI_ERROR (Status);
 | 
						|
 | 
						|
exit_handler:
 | 
						|
  FreePool (NewAmlNameString);
 | 
						|
  return Status;
 | 
						|
}
 | 
						|
 | 
						|
/** Update an integer value defined by a NameOp object node.
 | 
						|
 | 
						|
  For compatibility reasons, the NameOpNode must initially
 | 
						|
  contain an integer.
 | 
						|
 | 
						|
  @param  [in] NameOpNode   NameOp object node.
 | 
						|
                            Must have an OpCode=AML_NAME_OP, SubOpCode=0.
 | 
						|
                            NameOp object nodes are defined in ASL
 | 
						|
                            using the "Name ()" function.
 | 
						|
  @param  [in] NewInt       New Integer value to assign.
 | 
						|
                            Must be a UINT64.
 | 
						|
 | 
						|
  @retval EFI_SUCCESS             The function completed successfully.
 | 
						|
  @retval EFI_INVALID_PARAMETER   Invalid parameter.
 | 
						|
**/
 | 
						|
EFI_STATUS
 | 
						|
EFIAPI
 | 
						|
AmlNameOpUpdateInteger (
 | 
						|
  IN  AML_OBJECT_NODE_HANDLE  NameOpNode,
 | 
						|
  IN  UINT64                  NewInt
 | 
						|
  )
 | 
						|
{
 | 
						|
  EFI_STATUS              Status;
 | 
						|
  AML_OBJECT_NODE_HANDLE  IntegerOpNode;
 | 
						|
 | 
						|
  if ((NameOpNode == NULL)                                             ||
 | 
						|
      (AmlGetNodeType ((AML_NODE_HANDLE)NameOpNode) != EAmlNodeObject) ||
 | 
						|
      (!AmlNodeHasOpCode (NameOpNode, AML_NAME_OP, 0)))
 | 
						|
  {
 | 
						|
    ASSERT (0);
 | 
						|
    return EFI_INVALID_PARAMETER;
 | 
						|
  }
 | 
						|
 | 
						|
  // Get the Integer object node defined by the "Name ()" function:
 | 
						|
  // it must have an Integer OpCode (Byte/Word/DWord/QWord).
 | 
						|
  // It is the 2nd fixed argument (i.e. index 1) of the NameOp node.
 | 
						|
  // This can also be a ZeroOp or OneOp node.
 | 
						|
  IntegerOpNode = (AML_OBJECT_NODE_HANDLE)AmlGetFixedArgument (
 | 
						|
                                            NameOpNode,
 | 
						|
                                            EAmlParseIndexTerm1
 | 
						|
                                            );
 | 
						|
  if ((IntegerOpNode == NULL)  ||
 | 
						|
      (AmlGetNodeType ((AML_NODE_HANDLE)IntegerOpNode) != EAmlNodeObject))
 | 
						|
  {
 | 
						|
    ASSERT (0);
 | 
						|
    return EFI_INVALID_PARAMETER;
 | 
						|
  }
 | 
						|
 | 
						|
  // Update the Integer value.
 | 
						|
  Status = AmlUpdateInteger (IntegerOpNode, NewInt);
 | 
						|
  ASSERT_EFI_ERROR (Status);
 | 
						|
 | 
						|
  return Status;
 | 
						|
}
 | 
						|
 | 
						|
/** Update a string value defined by a NameOp object node.
 | 
						|
 | 
						|
  The NameOpNode must initially contain a string.
 | 
						|
  The EISAID ASL macro converts a string to an integer. This, it is
 | 
						|
  not accepted.
 | 
						|
 | 
						|
  @param  [in] NameOpNode   NameOp object node.
 | 
						|
                            Must have an OpCode=AML_NAME_OP, SubOpCode=0.
 | 
						|
                            NameOp object nodes are defined in ASL
 | 
						|
                            using the "Name ()" function.
 | 
						|
  @param  [in] NewName      New NULL terminated string to assign to
 | 
						|
                            the NameOpNode.
 | 
						|
                            The input string is copied.
 | 
						|
 | 
						|
  @retval EFI_SUCCESS             The function completed successfully.
 | 
						|
  @retval EFI_INVALID_PARAMETER   Invalid parameter.
 | 
						|
**/
 | 
						|
EFI_STATUS
 | 
						|
EFIAPI
 | 
						|
AmlNameOpUpdateString (
 | 
						|
  IN        AML_OBJECT_NODE_HANDLE  NameOpNode,
 | 
						|
  IN  CONST CHAR8                   *NewName
 | 
						|
  )
 | 
						|
{
 | 
						|
  EFI_STATUS              Status;
 | 
						|
  AML_OBJECT_NODE_HANDLE  StringOpNode;
 | 
						|
  AML_DATA_NODE_HANDLE    StringDataNode;
 | 
						|
 | 
						|
  if ((NameOpNode == NULL)                                             ||
 | 
						|
      (AmlGetNodeType ((AML_NODE_HANDLE)NameOpNode) != EAmlNodeObject) ||
 | 
						|
      (!AmlNodeHasOpCode (NameOpNode, AML_NAME_OP, 0)))
 | 
						|
  {
 | 
						|
    ASSERT (0);
 | 
						|
    return EFI_INVALID_PARAMETER;
 | 
						|
  }
 | 
						|
 | 
						|
  // Get the String object node defined by the "Name ()" function:
 | 
						|
  // it must have a string OpCode.
 | 
						|
  // It is the 2nd fixed argument (i.e. index 1) of the NameOp node.
 | 
						|
  StringOpNode = (AML_OBJECT_NODE_HANDLE)AmlGetFixedArgument (
 | 
						|
                                           NameOpNode,
 | 
						|
                                           EAmlParseIndexTerm1
 | 
						|
                                           );
 | 
						|
  if ((StringOpNode == NULL)  ||
 | 
						|
      (AmlGetNodeType ((AML_NODE_HANDLE)StringOpNode) != EAmlNodeObject))
 | 
						|
  {
 | 
						|
    ASSERT (0);
 | 
						|
    return EFI_INVALID_PARAMETER;
 | 
						|
  }
 | 
						|
 | 
						|
  // Get the string data node.
 | 
						|
  // It is the 1st fixed argument (i.e. index 0) of the StringOpNode node.
 | 
						|
  StringDataNode = (AML_DATA_NODE_HANDLE)AmlGetFixedArgument (
 | 
						|
                                           StringOpNode,
 | 
						|
                                           EAmlParseIndexTerm0
 | 
						|
                                           );
 | 
						|
  if ((StringDataNode == NULL)  ||
 | 
						|
      (AmlGetNodeType ((AML_NODE_HANDLE)StringDataNode) != EAmlNodeData))
 | 
						|
  {
 | 
						|
    ASSERT (0);
 | 
						|
    return EFI_INVALID_PARAMETER;
 | 
						|
  }
 | 
						|
 | 
						|
  // Update the string value.
 | 
						|
  Status = AmlUpdateDataNode (
 | 
						|
             StringDataNode,
 | 
						|
             EAmlNodeDataTypeString,
 | 
						|
             (UINT8 *)NewName,
 | 
						|
             (UINT32)AsciiStrLen (NewName) + 1
 | 
						|
             );
 | 
						|
  ASSERT_EFI_ERROR (Status);
 | 
						|
 | 
						|
  return Status;
 | 
						|
}
 | 
						|
 | 
						|
/** Get the first Resource Data element contained in a named object.
 | 
						|
 | 
						|
  In the following ASL code, the function will return the Resource Data
 | 
						|
  node corresponding to the "QWordMemory ()" ASL macro.
 | 
						|
  Name (_CRS, ResourceTemplate() {
 | 
						|
      QWordMemory (...) {...},
 | 
						|
      Interrupt (...) {...}
 | 
						|
    }
 | 
						|
  )
 | 
						|
 | 
						|
  Note:
 | 
						|
  "_CRS" names defined as methods are not handled by this function.
 | 
						|
  They must be defined as names, using the "Name ()" statement.
 | 
						|
 | 
						|
  @param  [in] NameOpNode   NameOp object node defining a named object.
 | 
						|
                            Must have an OpCode=AML_NAME_OP, SubOpCode=0.
 | 
						|
                            NameOp object nodes are defined in ASL
 | 
						|
                            using the "Name ()" function.
 | 
						|
  @param  [out] OutRdNode   Pointer to the first Resource Data element of
 | 
						|
                            the named object. A Resource Data element
 | 
						|
                            is stored in a data node.
 | 
						|
 | 
						|
  @retval EFI_SUCCESS             The function completed successfully.
 | 
						|
  @retval EFI_INVALID_PARAMETER   Invalid parameter.
 | 
						|
**/
 | 
						|
EFI_STATUS
 | 
						|
EFIAPI
 | 
						|
AmlNameOpGetFirstRdNode (
 | 
						|
  IN  AML_OBJECT_NODE_HANDLE  NameOpNode,
 | 
						|
  OUT AML_DATA_NODE_HANDLE    *OutRdNode
 | 
						|
  )
 | 
						|
{
 | 
						|
  AML_OBJECT_NODE_HANDLE  BufferOpNode;
 | 
						|
  AML_DATA_NODE_HANDLE    FirstRdNode;
 | 
						|
 | 
						|
  if ((NameOpNode == NULL)                                              ||
 | 
						|
      (AmlGetNodeType ((AML_NODE_HANDLE)NameOpNode) != EAmlNodeObject)  ||
 | 
						|
      (!AmlNodeHasOpCode (NameOpNode, AML_NAME_OP, 0))                  ||
 | 
						|
      (OutRdNode == NULL))
 | 
						|
  {
 | 
						|
    ASSERT (0);
 | 
						|
    return EFI_INVALID_PARAMETER;
 | 
						|
  }
 | 
						|
 | 
						|
  *OutRdNode = NULL;
 | 
						|
 | 
						|
  // Get the value of the variable which is represented as a BufferOp object
 | 
						|
  // node which is the 2nd fixed argument (i.e. index 1).
 | 
						|
  BufferOpNode = (AML_OBJECT_NODE_HANDLE)AmlGetFixedArgument (
 | 
						|
                                           NameOpNode,
 | 
						|
                                           EAmlParseIndexTerm1
 | 
						|
                                           );
 | 
						|
  if ((BufferOpNode == NULL)                                             ||
 | 
						|
      (AmlGetNodeType ((AML_NODE_HANDLE)BufferOpNode) != EAmlNodeObject) ||
 | 
						|
      (!AmlNodeHasOpCode (BufferOpNode, AML_BUFFER_OP, 0)))
 | 
						|
  {
 | 
						|
    ASSERT (0);
 | 
						|
    return EFI_INVALID_PARAMETER;
 | 
						|
  }
 | 
						|
 | 
						|
  // Get the first Resource data node in the variable list of
 | 
						|
  // argument of the BufferOp node.
 | 
						|
  FirstRdNode = (AML_DATA_NODE_HANDLE)AmlGetNextVariableArgument (
 | 
						|
                                        (AML_NODE_HANDLE)BufferOpNode,
 | 
						|
                                        NULL
 | 
						|
                                        );
 | 
						|
  if ((FirstRdNode == NULL)                                            ||
 | 
						|
      (AmlGetNodeType ((AML_NODE_HANDLE)FirstRdNode) != EAmlNodeData)  ||
 | 
						|
      (!AmlNodeHasDataType (FirstRdNode, EAmlNodeDataTypeResourceData)))
 | 
						|
  {
 | 
						|
    ASSERT (0);
 | 
						|
    return EFI_INVALID_PARAMETER;
 | 
						|
  }
 | 
						|
 | 
						|
  *OutRdNode = FirstRdNode;
 | 
						|
  return EFI_SUCCESS;
 | 
						|
}
 | 
						|
 | 
						|
/** Get the Resource Data element following the CurrRdNode Resource Data.
 | 
						|
 | 
						|
  In the following ASL code, if CurrRdNode corresponds to the first
 | 
						|
  "QWordMemory ()" ASL macro, the function will return the Resource Data
 | 
						|
  node corresponding to the "Interrupt ()" ASL macro.
 | 
						|
  Name (_CRS, ResourceTemplate() {
 | 
						|
      QwordMemory (...) {...},
 | 
						|
      Interrupt (...) {...}
 | 
						|
    }
 | 
						|
  )
 | 
						|
 | 
						|
  Note:
 | 
						|
  "_CRS" names defined as methods are not handled by this function.
 | 
						|
  They must be defined as names, using the "Name ()" statement.
 | 
						|
 | 
						|
  @param  [in]  CurrRdNode   Pointer to the current Resource Data element of
 | 
						|
                             the named object.
 | 
						|
  @param  [out] OutRdNode    Pointer to the Resource Data element following
 | 
						|
                             the CurrRdNode.
 | 
						|
                             Contain a NULL pointer if CurrRdNode is the
 | 
						|
                             last Resource Data element in the list.
 | 
						|
                             The "End Tag" is not considered as a resource
 | 
						|
                             data element and is not returned.
 | 
						|
 | 
						|
  @retval EFI_SUCCESS             The function completed successfully.
 | 
						|
  @retval EFI_INVALID_PARAMETER   Invalid parameter.
 | 
						|
**/
 | 
						|
EFI_STATUS
 | 
						|
EFIAPI
 | 
						|
AmlNameOpGetNextRdNode (
 | 
						|
  IN  AML_DATA_NODE_HANDLE  CurrRdNode,
 | 
						|
  OUT AML_DATA_NODE_HANDLE  *OutRdNode
 | 
						|
  )
 | 
						|
{
 | 
						|
  AML_OBJECT_NODE_HANDLE  NameOpNode;
 | 
						|
  AML_OBJECT_NODE_HANDLE  BufferOpNode;
 | 
						|
 | 
						|
  if ((CurrRdNode == NULL)                                              ||
 | 
						|
      (AmlGetNodeType ((AML_NODE_HANDLE)CurrRdNode) != EAmlNodeData)    ||
 | 
						|
      (!AmlNodeHasDataType (CurrRdNode, EAmlNodeDataTypeResourceData))  ||
 | 
						|
      (OutRdNode == NULL))
 | 
						|
  {
 | 
						|
    ASSERT (0);
 | 
						|
    return EFI_INVALID_PARAMETER;
 | 
						|
  }
 | 
						|
 | 
						|
  *OutRdNode = NULL;
 | 
						|
 | 
						|
  // The parent of the CurrRdNode must be a BufferOp node.
 | 
						|
  BufferOpNode = (AML_OBJECT_NODE_HANDLE)AmlGetParent (
 | 
						|
                                           (AML_NODE_HANDLE)CurrRdNode
 | 
						|
                                           );
 | 
						|
  if ((BufferOpNode == NULL)  ||
 | 
						|
      (!AmlNodeHasOpCode (BufferOpNode, AML_BUFFER_OP, 0)))
 | 
						|
  {
 | 
						|
    ASSERT (0);
 | 
						|
    return EFI_INVALID_PARAMETER;
 | 
						|
  }
 | 
						|
 | 
						|
  // The parent of the BufferOpNode must be a NameOp node.
 | 
						|
  NameOpNode = (AML_OBJECT_NODE_HANDLE)AmlGetParent (
 | 
						|
                                         (AML_NODE_HANDLE)BufferOpNode
 | 
						|
                                         );
 | 
						|
  if ((NameOpNode == NULL)  ||
 | 
						|
      (!AmlNodeHasOpCode (NameOpNode, AML_NAME_OP, 0)))
 | 
						|
  {
 | 
						|
    ASSERT (0);
 | 
						|
    return EFI_INVALID_PARAMETER;
 | 
						|
  }
 | 
						|
 | 
						|
  *OutRdNode = (AML_DATA_NODE_HANDLE)AmlGetNextVariableArgument (
 | 
						|
                                       (AML_NODE_HANDLE)BufferOpNode,
 | 
						|
                                       (AML_NODE_HANDLE)CurrRdNode
 | 
						|
                                       );
 | 
						|
 | 
						|
  // If the Resource Data is an End Tag, return NULL.
 | 
						|
  if (AmlNodeHasRdDataType (
 | 
						|
        *OutRdNode,
 | 
						|
        AML_RD_BUILD_SMALL_DESC_ID (ACPI_SMALL_END_TAG_DESCRIPTOR_NAME)
 | 
						|
        ))
 | 
						|
  {
 | 
						|
    *OutRdNode = NULL;
 | 
						|
  }
 | 
						|
 | 
						|
  return EFI_SUCCESS;
 | 
						|
}
 | 
						|
 | 
						|
/** Attach a node in an AML tree.
 | 
						|
 | 
						|
  The node will be added as the last statement of the ParentNode.
 | 
						|
  E.g.:
 | 
						|
  ASL code corresponding to NewNode:
 | 
						|
  Name (_UID, 0)
 | 
						|
 | 
						|
  ASL code corresponding to ParentNode:
 | 
						|
  Device (PCI0) {
 | 
						|
    Name(_HID, EISAID("PNP0A08"))
 | 
						|
  }
 | 
						|
 | 
						|
  "AmlAttachNode (ParentNode, NewNode)" will result in:
 | 
						|
  ASL code:
 | 
						|
  Device (PCI0) {
 | 
						|
    Name(_HID, EISAID("PNP0A08"))
 | 
						|
    Name (_UID, 0)
 | 
						|
  }
 | 
						|
 | 
						|
  @param  [in]  ParentNode  Pointer to the parent node.
 | 
						|
                            Must be a root or an object node.
 | 
						|
  @param  [in]  NewNode     Pointer to the node to add.
 | 
						|
 | 
						|
  @retval EFI_SUCCESS             The function completed successfully.
 | 
						|
  @retval EFI_INVALID_PARAMETER   Invalid parameter.
 | 
						|
**/
 | 
						|
EFI_STATUS
 | 
						|
EFIAPI
 | 
						|
AmlAttachNode (
 | 
						|
  IN  AML_NODE_HANDLE  ParentNode,
 | 
						|
  IN  AML_NODE_HANDLE  NewNode
 | 
						|
  )
 | 
						|
{
 | 
						|
  return AmlVarListAddTail (ParentNode, NewNode);
 | 
						|
}
 | 
						|
 | 
						|
// DEPRECATED APIS
 | 
						|
#ifndef DISABLE_NEW_DEPRECATED_INTERFACES
 | 
						|
 | 
						|
/** DEPRECATED API
 | 
						|
 | 
						|
  Get the first Resource Data element contained in a "_CRS" object.
 | 
						|
 | 
						|
  In the following ASL code, the function will return the Resource Data
 | 
						|
  node corresponding to the "QWordMemory ()" ASL macro.
 | 
						|
  Name (_CRS, ResourceTemplate() {
 | 
						|
      QWordMemory (...) {...},
 | 
						|
      Interrupt (...) {...}
 | 
						|
    }
 | 
						|
  )
 | 
						|
 | 
						|
  Note:
 | 
						|
   - The "_CRS" object must be declared using ASL "Name (Declare Named Object)".
 | 
						|
   - "_CRS" declared using ASL "Method (Declare Control Method)" is not
 | 
						|
     supported.
 | 
						|
 | 
						|
  @ingroup UserApis
 | 
						|
 | 
						|
  @param  [in] NameOpCrsNode  NameOp object node defining a "_CRS" object.
 | 
						|
                              Must have an OpCode=AML_NAME_OP, SubOpCode=0.
 | 
						|
                              NameOp object nodes are defined in ASL
 | 
						|
                              using the "Name ()" function.
 | 
						|
  @param  [out] OutRdNode     Pointer to the first Resource Data element of
 | 
						|
                              the "_CRS" object. A Resource Data element
 | 
						|
                              is stored in a data node.
 | 
						|
 | 
						|
  @retval EFI_SUCCESS             The function completed successfully.
 | 
						|
  @retval EFI_INVALID_PARAMETER   Invalid parameter.
 | 
						|
**/
 | 
						|
EFI_STATUS
 | 
						|
EFIAPI
 | 
						|
AmlNameOpCrsGetFirstRdNode (
 | 
						|
  IN  AML_OBJECT_NODE_HANDLE  NameOpCrsNode,
 | 
						|
  OUT AML_DATA_NODE_HANDLE    *OutRdNode
 | 
						|
  )
 | 
						|
{
 | 
						|
  return AmlNameOpGetFirstRdNode (NameOpCrsNode, OutRdNode);
 | 
						|
}
 | 
						|
 | 
						|
/** DEPRECATED API
 | 
						|
 | 
						|
  Get the Resource Data element following the CurrRdNode Resource Data.
 | 
						|
 | 
						|
  In the following ASL code, if CurrRdNode corresponds to the first
 | 
						|
  "QWordMemory ()" ASL macro, the function will return the Resource Data
 | 
						|
  node corresponding to the "Interrupt ()" ASL macro.
 | 
						|
  Name (_CRS, ResourceTemplate() {
 | 
						|
      QwordMemory (...) {...},
 | 
						|
      Interrupt (...) {...}
 | 
						|
    }
 | 
						|
  )
 | 
						|
 | 
						|
  The CurrRdNode Resource Data node must be defined in an object named "_CRS"
 | 
						|
  and defined by a "Name ()" ASL function.
 | 
						|
 | 
						|
  @ingroup UserApis
 | 
						|
 | 
						|
  @param  [in]  CurrRdNode   Pointer to the current Resource Data element of
 | 
						|
                             the "_CRS" variable.
 | 
						|
  @param  [out] OutRdNode    Pointer to the Resource Data element following
 | 
						|
                             the CurrRdNode.
 | 
						|
                             Contain a NULL pointer if CurrRdNode is the
 | 
						|
                             last Resource Data element in the list.
 | 
						|
                             The "End Tag" is not considered as a resource
 | 
						|
                             data element and is not returned.
 | 
						|
 | 
						|
  @retval EFI_SUCCESS             The function completed successfully.
 | 
						|
  @retval EFI_INVALID_PARAMETER   Invalid parameter.
 | 
						|
**/
 | 
						|
EFI_STATUS
 | 
						|
EFIAPI
 | 
						|
AmlNameOpCrsGetNextRdNode (
 | 
						|
  IN  AML_DATA_NODE_HANDLE  CurrRdNode,
 | 
						|
  OUT AML_DATA_NODE_HANDLE  *OutRdNode
 | 
						|
  )
 | 
						|
{
 | 
						|
  return AmlNameOpGetNextRdNode (CurrRdNode, OutRdNode);
 | 
						|
}
 | 
						|
 | 
						|
#endif // DISABLE_NEW_DEPRECATED_INTERFACES
 |