REF: https://bugzilla.tianocore.org/show_bug.cgi?id=3737 Apply uncrustify changes to .c/.h files in the DynamicTablesPkg package Cc: Andrew Fish <afish@apple.com> Cc: Leif Lindholm <leif@nuviainc.com> Cc: Michael D Kinney <michael.d.kinney@intel.com> Signed-off-by: Michael Kubacki <michael.kubacki@microsoft.com> Reviewed-by: Sami Mujawar <sami.mujawar@arm.com>
		
			
				
	
	
		
			189 lines
		
	
	
		
			6.9 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			189 lines
		
	
	
		
			6.9 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
/** @file
 | 
						|
  AML Method Parser.
 | 
						|
 | 
						|
  Copyright (c) 2019 - 2020, Arm Limited. All rights reserved.<BR>
 | 
						|
 | 
						|
  SPDX-License-Identifier: BSD-2-Clause-Patent
 | 
						|
**/
 | 
						|
 | 
						|
#ifndef AML_METHOD_PARSER_H_
 | 
						|
#define AML_METHOD_PARSER_H_
 | 
						|
 | 
						|
#include <AmlNodeDefines.h>
 | 
						|
#include <Stream/AmlStream.h>
 | 
						|
 | 
						|
/** AML namespace reference node.
 | 
						|
 | 
						|
  Namespace reference nodes allow to associate an AML absolute pathname
 | 
						|
  to the tree node defining this object in the namespace.
 | 
						|
 | 
						|
  Namespace reference nodes are stored in a separate list. They are not part of
 | 
						|
  the tree.
 | 
						|
*/
 | 
						|
typedef struct AmlNameSpaceRefNode {
 | 
						|
  /// Double linked list.
 | 
						|
  /// This must be the first field in this structure.
 | 
						|
  LIST_ENTRY               Link;
 | 
						|
 | 
						|
  /// Node part of the AML namespace. It must have the AML_IN_NAMESPACE
 | 
						|
  /// attribute.
 | 
						|
  CONST AML_OBJECT_NODE    *NodeRef;
 | 
						|
 | 
						|
  /// Raw AML absolute pathname of the NodeRef.
 | 
						|
  /// This is a raw AML NameString (cf AmlNameSpace.c: A concatenated list
 | 
						|
  /// of 4 chars long names. The dual/multi NameString prefix have been
 | 
						|
  /// stripped.).
 | 
						|
  CONST CHAR8              *RawAbsolutePath;
 | 
						|
 | 
						|
  /// Size of the raw AML absolute pathname buffer.
 | 
						|
  UINT32                   RawAbsolutePathSize;
 | 
						|
} AML_NAMESPACE_REF_NODE;
 | 
						|
 | 
						|
/** Delete a list of namespace reference nodes.
 | 
						|
 | 
						|
  @param  [in]  NameSpaceRefList    List of namespace reference nodes.
 | 
						|
 | 
						|
  @retval EFI_SUCCESS             The function completed successfully.
 | 
						|
  @retval EFI_INVALID_PARAMETER   Invalid parameter.
 | 
						|
**/
 | 
						|
EFI_STATUS
 | 
						|
EFIAPI
 | 
						|
AmlDeleteNameSpaceRefList (
 | 
						|
  IN  LIST_ENTRY  *NameSpaceRefList
 | 
						|
  );
 | 
						|
 | 
						|
#if !defined (MDEPKG_NDEBUG)
 | 
						|
 | 
						|
/** Print the list of raw absolute paths of the NameSpace reference list.
 | 
						|
 | 
						|
  @param  [in]    NameSpaceRefList    List of NameSpace reference nodes.
 | 
						|
**/
 | 
						|
VOID
 | 
						|
EFIAPI
 | 
						|
AmlDbgPrintNameSpaceRefList (
 | 
						|
  IN  CONST LIST_ENTRY  *NameSpaceRefList
 | 
						|
  );
 | 
						|
 | 
						|
#endif // MDEPKG_NDEBUG
 | 
						|
 | 
						|
/** Check whether a pathname is a method invocation.
 | 
						|
 | 
						|
  If there is a matching method definition, returns the corresponding
 | 
						|
  NameSpaceRef node.
 | 
						|
 | 
						|
  To do so, the NameSpaceRefList is keeping track of every namespace node
 | 
						|
  and its raw AML absolute path.
 | 
						|
  To check whether a pathname is a method invocation, a corresponding raw
 | 
						|
  absolute pathname is built. This raw absolute pathname is then compared
 | 
						|
  to the list of available pathnames. If a pathname defining a method
 | 
						|
  matches the scope of the input pathname, return.
 | 
						|
 | 
						|
  @param  [in]  ParentNode          Parent node. Node to which the node to be
 | 
						|
                                    created will be attached.
 | 
						|
  @param  [in]  FStream             Forward stream pointing to the NameString
 | 
						|
                                    to find.
 | 
						|
  @param  [in]  NameSpaceRefList    List of NameSpaceRef nodes.
 | 
						|
  @param  [out] OutNameSpaceRefNode If the NameString pointed by FStream is
 | 
						|
                                    a method invocation, OutNameSpaceRefNode
 | 
						|
                                    contains the NameSpaceRef corresponding
 | 
						|
                                    to the method definition.
 | 
						|
                                    NULL otherwise.
 | 
						|
 | 
						|
  @retval EFI_SUCCESS             The function completed successfully.
 | 
						|
  @retval EFI_INVALID_PARAMETER   Invalid parameter.
 | 
						|
**/
 | 
						|
EFI_STATUS
 | 
						|
EFIAPI
 | 
						|
AmlIsMethodInvocation (
 | 
						|
  IN  CONST AML_NODE_HEADER   *ParentNode,
 | 
						|
  IN  CONST AML_STREAM        *FStream,
 | 
						|
  IN  CONST LIST_ENTRY        *NameSpaceRefList,
 | 
						|
  OUT AML_NAMESPACE_REF_NODE  **OutNameSpaceRefNode
 | 
						|
  );
 | 
						|
 | 
						|
/** Create a namespace reference node and add it to the NameSpaceRefList.
 | 
						|
 | 
						|
  When a namespace node is encountered, the namespace it defines must be
 | 
						|
  associated to the node. This allow to keep track of the nature of each
 | 
						|
  name present in the AML namespace.
 | 
						|
 | 
						|
  In the end, this allows to recognize method invocations and parse the right
 | 
						|
  number of arguments after the method name.
 | 
						|
 | 
						|
  @param [in]       Node              Namespace node.
 | 
						|
  @param [in, out]  NameSpaceRefList  List of namespace reference nodes.
 | 
						|
 | 
						|
  @retval EFI_SUCCESS             The function completed successfully.
 | 
						|
  @retval EFI_INVALID_PARAMETER   Invalid parameter.
 | 
						|
**/
 | 
						|
EFI_STATUS
 | 
						|
EFIAPI
 | 
						|
AmlAddNameSpaceReference (
 | 
						|
  IN      CONST AML_OBJECT_NODE  *Node,
 | 
						|
  IN  OUT       LIST_ENTRY       *NameSpaceRefList
 | 
						|
  );
 | 
						|
 | 
						|
/** Create a method invocation node.
 | 
						|
 | 
						|
  The AML grammar does not attribute an OpCode/SubOpCode couple for
 | 
						|
  method invocations. This library is representing method invocations
 | 
						|
  as if they had one.
 | 
						|
 | 
						|
  The AML encoding for method invocations in the ACPI specification 6.3 is:
 | 
						|
    MethodInvocation := NameString TermArgList
 | 
						|
  In this library, it is:
 | 
						|
    MethodInvocation := MethodInvocationOp NameString ArgumentCount TermArgList
 | 
						|
    ArgumentCount    := ByteData
 | 
						|
 | 
						|
  When computing the size of a tree or serializing it, the additional data is
 | 
						|
  not taken into account (i.e. the MethodInvocationOp and the ArgumentCount).
 | 
						|
 | 
						|
  Method invocation nodes have the AML_METHOD_INVOVATION attribute.
 | 
						|
 | 
						|
  @param  [in]  NameSpaceRefNode          NameSpaceRef node pointing to the
 | 
						|
                                          the definition of the invoked
 | 
						|
                                          method.
 | 
						|
  @param  [in]  MethodInvocationName      Data node containing the method
 | 
						|
                                          invocation name.
 | 
						|
  @param  [out] MethodInvocationNodePtr   Created method invocation node.
 | 
						|
 | 
						|
  @retval EFI_SUCCESS             The function completed successfully.
 | 
						|
  @retval EFI_INVALID_PARAMETER   Invalid parameter.
 | 
						|
  @retval EFI_OUT_OF_RESOURCES    Could not allocate memory.
 | 
						|
**/
 | 
						|
EFI_STATUS
 | 
						|
EFIAPI
 | 
						|
AmlCreateMethodInvocationNode (
 | 
						|
  IN  CONST AML_NAMESPACE_REF_NODE  *NameSpaceRefNode,
 | 
						|
  IN        AML_DATA_NODE           *MethodInvocationName,
 | 
						|
  OUT       AML_OBJECT_NODE         **MethodInvocationNodePtr
 | 
						|
  );
 | 
						|
 | 
						|
/** Get the number of arguments of a method invocation node.
 | 
						|
 | 
						|
  This function also allow to identify whether a node is a method invocation
 | 
						|
  node. If the input node is not a method invocation node, just return.
 | 
						|
 | 
						|
  @param  [in]  MethodInvocationNode  Method invocation node.
 | 
						|
  @param  [out] IsMethodInvocation    Boolean stating whether the input
 | 
						|
                                      node is a method invocation.
 | 
						|
  @param  [out] ArgCount              Number of arguments of the method
 | 
						|
                                      invocation.
 | 
						|
                                      Set to 0 if MethodInvocationNode
 | 
						|
                                      is not a method invocation.
 | 
						|
 | 
						|
  @retval EFI_SUCCESS             The function completed successfully.
 | 
						|
  @retval EFI_BUFFER_TOO_SMALL    No space left in the buffer.
 | 
						|
  @retval EFI_INVALID_PARAMETER   Invalid parameter.
 | 
						|
  @retval EFI_OUT_OF_RESOURCES    Could not allocate memory.
 | 
						|
*/
 | 
						|
EFI_STATUS
 | 
						|
EFIAPI
 | 
						|
AmlGetMethodInvocationArgCount (
 | 
						|
  IN  CONST AML_OBJECT_NODE  *MethodInvocationNode,
 | 
						|
  OUT       BOOLEAN          *IsMethodInvocation,
 | 
						|
  OUT       UINT8            *ArgCount
 | 
						|
  );
 | 
						|
 | 
						|
#endif // AML_METHOD_PARSER_H_
 |