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>
		
			
				
	
	
		
			366 lines
		
	
	
		
			11 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			366 lines
		
	
	
		
			11 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
| /** @file
 | |
|   AML Tree Iterator.
 | |
| 
 | |
|   Copyright (c) 2019 - 2020, Arm Limited. All rights reserved.<BR>
 | |
| 
 | |
|   SPDX-License-Identifier: BSD-2-Clause-Patent
 | |
| **/
 | |
| 
 | |
| #include <AmlNodeDefines.h>
 | |
| #include <Tree/AmlTreeIterator.h>
 | |
| 
 | |
| #include <AmlCoreInterface.h>
 | |
| #include <Tree/AmlTreeTraversal.h>
 | |
| 
 | |
| /** Iterator to traverse the tree.
 | |
| 
 | |
|   This is an internal structure.
 | |
| */
 | |
| typedef struct AmlTreeInternalIterator {
 | |
|   /// External iterator structure, containing the external APIs.
 | |
|   /// Must be the first field.
 | |
|   AML_TREE_ITERATOR         Iterator;
 | |
| 
 | |
|   // Note: The following members of this structure are opaque to the users
 | |
|   //       of the Tree iterator APIs.
 | |
| 
 | |
|   /// Pointer to the node on which the iterator has been initialized.
 | |
|   CONST  AML_NODE_HEADER    *InitialNode;
 | |
| 
 | |
|   /// Pointer to the current node.
 | |
|   CONST  AML_NODE_HEADER    *CurrentNode;
 | |
| 
 | |
|   /// Iteration mode.
 | |
|   /// Allow to choose how to traverse the tree/choose which node is next.
 | |
|   EAML_ITERATOR_MODE        Mode;
 | |
| } AML_TREE_ITERATOR_INTERNAL;
 | |
| 
 | |
| /** Get the current node of an iterator.
 | |
| 
 | |
|   @param  [in]  Iterator  Pointer to an iterator.
 | |
|   @param  [out] OutNode   Pointer holding the current node.
 | |
| 
 | |
|   @retval EFI_SUCCESS             The function completed successfully.
 | |
|   @retval EFI_INVALID_PARAMETER   Invalid parameter.
 | |
| **/
 | |
| STATIC
 | |
| EFI_STATUS
 | |
| EFIAPI
 | |
| AmlIteratorGetNode (
 | |
|   IN  AML_TREE_ITERATOR  *Iterator,
 | |
|   OUT AML_NODE_HEADER    **OutNode
 | |
|   )
 | |
| {
 | |
|   AML_TREE_ITERATOR_INTERNAL  *InternalIterator;
 | |
| 
 | |
|   InternalIterator = (AML_TREE_ITERATOR_INTERNAL *)Iterator;
 | |
| 
 | |
|   // CurrentNode can be NULL, but InitialNode cannot.
 | |
|   if ((OutNode == NULL)                                       ||
 | |
|       (InternalIterator == NULL)                              ||
 | |
|       (InternalIterator->Mode <= EAmlIteratorUnknown)         ||
 | |
|       (InternalIterator->Mode >= EAmlIteratorModeMax)         ||
 | |
|       !IS_AML_NODE_VALID (InternalIterator->InitialNode)      ||
 | |
|       ((InternalIterator->CurrentNode != NULL)                &&
 | |
|        !IS_AML_NODE_VALID (InternalIterator->CurrentNode)))
 | |
|   {
 | |
|     ASSERT (0);
 | |
|     return EFI_INVALID_PARAMETER;
 | |
|   }
 | |
| 
 | |
|   *OutNode = (AML_NODE_HEADER *)InternalIterator->CurrentNode;
 | |
| 
 | |
|   return EFI_SUCCESS;
 | |
| }
 | |
| 
 | |
| /** Move the current node of the iterator to the next node,
 | |
|     according to the iteration mode selected.
 | |
| 
 | |
|   If NextNode is not NULL, return the next node.
 | |
| 
 | |
|   @param  [in]  Iterator    Pointer to an iterator.
 | |
|   @param  [out] NextNode    If not NULL, updated to the next node.
 | |
| 
 | |
|   @retval EFI_SUCCESS             The function completed successfully.
 | |
|   @retval EFI_INVALID_PARAMETER   Invalid parameter.
 | |
| **/
 | |
| STATIC
 | |
| EFI_STATUS
 | |
| EFIAPI
 | |
| AmlIteratorGetNextLinear (
 | |
|   IN  AML_TREE_ITERATOR  *Iterator,
 | |
|   OUT AML_NODE_HEADER    **NextNode
 | |
|   )
 | |
| {
 | |
|   AML_TREE_ITERATOR_INTERNAL  *InternalIterator;
 | |
| 
 | |
|   InternalIterator = (AML_TREE_ITERATOR_INTERNAL *)Iterator;
 | |
| 
 | |
|   // CurrentNode can be NULL, but InitialNode cannot.
 | |
|   if ((InternalIterator == NULL)                              ||
 | |
|       (InternalIterator->Mode != EAmlIteratorLinear)          ||
 | |
|       !IS_AML_NODE_VALID (InternalIterator->InitialNode)      ||
 | |
|       !IS_AML_NODE_VALID (InternalIterator->CurrentNode))
 | |
|   {
 | |
|     ASSERT (0);
 | |
|     return EFI_INVALID_PARAMETER;
 | |
|   }
 | |
| 
 | |
|   // Get the next node according to the iteration mode.
 | |
|   InternalIterator->CurrentNode = AmlGetNextNode (
 | |
|                                     InternalIterator->CurrentNode
 | |
|                                     );
 | |
| 
 | |
|   if (NextNode != NULL) {
 | |
|     *NextNode = (AML_NODE_HEADER *)InternalIterator->CurrentNode;
 | |
|   }
 | |
| 
 | |
|   return EFI_SUCCESS;
 | |
| }
 | |
| 
 | |
| /** Move the current node of the iterator to the previous node,
 | |
|     according to the iteration mode selected.
 | |
| 
 | |
|   If PrevNode is not NULL, return the previous node.
 | |
| 
 | |
|   @param  [in]  Iterator    Pointer to an iterator.
 | |
|   @param  [out] PrevNode    If not NULL, updated to the previous node.
 | |
| 
 | |
|   @retval EFI_SUCCESS             The function completed successfully.
 | |
|   @retval EFI_INVALID_PARAMETER   Invalid parameter.
 | |
| **/
 | |
| STATIC
 | |
| EFI_STATUS
 | |
| EFIAPI
 | |
| AmlIteratorGetPreviousLinear (
 | |
|   IN  AML_TREE_ITERATOR  *Iterator,
 | |
|   OUT AML_NODE_HEADER    **PrevNode
 | |
|   )
 | |
| {
 | |
|   AML_TREE_ITERATOR_INTERNAL  *InternalIterator;
 | |
| 
 | |
|   InternalIterator = (AML_TREE_ITERATOR_INTERNAL *)Iterator;
 | |
| 
 | |
|   // CurrentNode can be NULL, but InitialNode cannot.
 | |
|   if ((InternalIterator == NULL)                              ||
 | |
|       (InternalIterator->Mode != EAmlIteratorLinear)          ||
 | |
|       !IS_AML_NODE_VALID (InternalIterator->InitialNode)      ||
 | |
|       !IS_AML_NODE_VALID (InternalIterator->CurrentNode))
 | |
|   {
 | |
|     ASSERT (0);
 | |
|     return EFI_INVALID_PARAMETER;
 | |
|   }
 | |
| 
 | |
|   // Get the previous node according to the iteration mode.
 | |
|   InternalIterator->CurrentNode = AmlGetPreviousNode (
 | |
|                                     InternalIterator->CurrentNode
 | |
|                                     );
 | |
|   if (PrevNode != NULL) {
 | |
|     *PrevNode = (AML_NODE_HEADER *)InternalIterator->CurrentNode;
 | |
|   }
 | |
| 
 | |
|   return EFI_SUCCESS;
 | |
| }
 | |
| 
 | |
| /** Move the current node of the iterator to the next node,
 | |
|     according to the iteration mode selected.
 | |
| 
 | |
|   If NextNode is not NULL, return the next node.
 | |
| 
 | |
|   @param  [in]  Iterator    Pointer to an iterator.
 | |
|   @param  [out] NextNode    If not NULL, updated to the next node.
 | |
| 
 | |
|   @retval EFI_SUCCESS             The function completed successfully.
 | |
|   @retval EFI_INVALID_PARAMETER   Invalid parameter.
 | |
| **/
 | |
| STATIC
 | |
| EFI_STATUS
 | |
| EFIAPI
 | |
| AmlIteratorGetNextBranch (
 | |
|   IN  AML_TREE_ITERATOR  *Iterator,
 | |
|   OUT AML_NODE_HEADER    **NextNode
 | |
|   )
 | |
| {
 | |
|   AML_TREE_ITERATOR_INTERNAL  *InternalIterator;
 | |
|   AML_NODE_HEADER             *Node;
 | |
| 
 | |
|   InternalIterator = (AML_TREE_ITERATOR_INTERNAL *)Iterator;
 | |
| 
 | |
|   // CurrentNode can be NULL, but InitialNode cannot.
 | |
|   if ((InternalIterator == NULL)                              ||
 | |
|       (InternalIterator->Mode != EAmlIteratorBranch)          ||
 | |
|       !IS_AML_NODE_VALID (InternalIterator->InitialNode)      ||
 | |
|       !IS_AML_NODE_VALID (InternalIterator->CurrentNode))
 | |
|   {
 | |
|     ASSERT (0);
 | |
|     return EFI_INVALID_PARAMETER;
 | |
|   }
 | |
| 
 | |
|   Node = AmlGetNextNode (InternalIterator->CurrentNode);
 | |
|   // Check whether NextNode is a sibling of InitialNode.
 | |
|   if (AmlGetParent (Node) ==
 | |
|       AmlGetParent ((AML_NODE_HEADER *)InternalIterator->InitialNode))
 | |
|   {
 | |
|     Node = NULL;
 | |
|   }
 | |
| 
 | |
|   InternalIterator->CurrentNode = Node;
 | |
| 
 | |
|   if (NextNode != NULL) {
 | |
|     *NextNode = Node;
 | |
|   }
 | |
| 
 | |
|   return EFI_SUCCESS;
 | |
| }
 | |
| 
 | |
| /** Move the current node of the iterator to the previous node,
 | |
|     according to the iteration mode selected.
 | |
| 
 | |
|   If PrevNode is not NULL, return the previous node.
 | |
| 
 | |
|   @param  [in]  Iterator    Pointer to an iterator.
 | |
|   @param  [out] PrevNode    If not NULL, updated to the previous node.
 | |
| 
 | |
|   @retval EFI_SUCCESS             The function completed successfully.
 | |
|   @retval EFI_INVALID_PARAMETER   Invalid parameter.
 | |
| **/
 | |
| STATIC
 | |
| EFI_STATUS
 | |
| EFIAPI
 | |
| AmlIteratorGetPreviousBranch (
 | |
|   IN  AML_TREE_ITERATOR  *Iterator,
 | |
|   OUT AML_NODE_HEADER    **PrevNode
 | |
|   )
 | |
| {
 | |
|   AML_TREE_ITERATOR_INTERNAL  *InternalIterator;
 | |
|   AML_NODE_HEADER             *Node;
 | |
| 
 | |
|   InternalIterator = (AML_TREE_ITERATOR_INTERNAL *)Iterator;
 | |
| 
 | |
|   // CurrentNode can be NULL, but InitialNode cannot.
 | |
|   if ((InternalIterator == NULL)                              ||
 | |
|       (InternalIterator->Mode != EAmlIteratorBranch)          ||
 | |
|       !IS_AML_NODE_VALID (InternalIterator->InitialNode)      ||
 | |
|       !IS_AML_NODE_VALID (InternalIterator->CurrentNode))
 | |
|   {
 | |
|     ASSERT (0);
 | |
|     return EFI_INVALID_PARAMETER;
 | |
|   }
 | |
| 
 | |
|   Node = AmlGetPreviousNode (InternalIterator->CurrentNode);
 | |
|   // Check whether PreviousNode is a sibling of InitialNode.
 | |
|   if (AmlGetParent (Node) ==
 | |
|       AmlGetParent ((AML_NODE_HEADER *)InternalIterator->InitialNode))
 | |
|   {
 | |
|     Node = NULL;
 | |
|   }
 | |
| 
 | |
|   InternalIterator->CurrentNode = Node;
 | |
| 
 | |
|   if (PrevNode != NULL) {
 | |
|     *PrevNode = Node;
 | |
|   }
 | |
| 
 | |
|   return EFI_SUCCESS;
 | |
| }
 | |
| 
 | |
| /** Initialize an iterator.
 | |
| 
 | |
|   Note: The caller must call AmlDeleteIterator () to free the memory
 | |
|         allocated for the iterator.
 | |
| 
 | |
|   @param  [in]  Node          Pointer to the node.
 | |
|   @param  [in]  IteratorMode  Selected mode to traverse the tree.
 | |
|   @param  [out] IteratorPtr   Pointer holding the created iterator.
 | |
| 
 | |
|   @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
 | |
| AmlInitializeIterator (
 | |
|   IN   AML_NODE_HEADER     *Node,
 | |
|   IN   EAML_ITERATOR_MODE  IteratorMode,
 | |
|   OUT  AML_TREE_ITERATOR   **IteratorPtr
 | |
|   )
 | |
| {
 | |
|   AML_TREE_ITERATOR_INTERNAL  *InternalIterator;
 | |
| 
 | |
|   if (!IS_AML_NODE_VALID (Node)             ||
 | |
|       (IteratorMode <= EAmlIteratorUnknown) ||
 | |
|       (IteratorMode >= EAmlIteratorModeMax) ||
 | |
|       (IteratorPtr == NULL))
 | |
|   {
 | |
|     ASSERT (0);
 | |
|     return EFI_INVALID_PARAMETER;
 | |
|   }
 | |
| 
 | |
|   *IteratorPtr     = NULL;
 | |
|   InternalIterator = (AML_TREE_ITERATOR_INTERNAL *)AllocateZeroPool (
 | |
|                                                      sizeof (
 | |
|                                                              AML_TREE_ITERATOR_INTERNAL
 | |
|                                                              )
 | |
|                                                      );
 | |
|   if (InternalIterator == NULL) {
 | |
|     ASSERT (0);
 | |
|     return EFI_OUT_OF_RESOURCES;
 | |
|   }
 | |
| 
 | |
|   InternalIterator->InitialNode      = Node;
 | |
|   InternalIterator->CurrentNode      = Node;
 | |
|   InternalIterator->Mode             = IteratorMode;
 | |
|   InternalIterator->Iterator.GetNode = AmlIteratorGetNode;
 | |
| 
 | |
|   switch (InternalIterator->Mode) {
 | |
|     case EAmlIteratorLinear:
 | |
|     {
 | |
|       InternalIterator->Iterator.GetNext     = AmlIteratorGetNextLinear;
 | |
|       InternalIterator->Iterator.GetPrevious = AmlIteratorGetPreviousLinear;
 | |
|       break;
 | |
|     }
 | |
|     case EAmlIteratorBranch:
 | |
|     {
 | |
|       InternalIterator->Iterator.GetNext     = AmlIteratorGetNextBranch;
 | |
|       InternalIterator->Iterator.GetPrevious = AmlIteratorGetPreviousBranch;
 | |
|       break;
 | |
|     }
 | |
|     default:
 | |
|     {
 | |
|       ASSERT (0);
 | |
|       FreePool (InternalIterator);
 | |
|       return EFI_INVALID_PARAMETER;
 | |
|     }
 | |
|   } // switch
 | |
| 
 | |
|   *IteratorPtr = &InternalIterator->Iterator;
 | |
| 
 | |
|   return EFI_SUCCESS;
 | |
| }
 | |
| 
 | |
| /** Delete an iterator.
 | |
| 
 | |
|   Note: The caller must have first initialized the iterator with the
 | |
|         AmlInitializeIterator () function.
 | |
| 
 | |
|   @param  [in]  Iterator  Pointer to an iterator.
 | |
| 
 | |
|   @retval EFI_SUCCESS             The function completed successfully.
 | |
|   @retval EFI_INVALID_PARAMETER   Invalid parameter.
 | |
| **/
 | |
| EFI_STATUS
 | |
| EFIAPI
 | |
| AmlDeleteIterator (
 | |
|   IN  AML_TREE_ITERATOR  *Iterator
 | |
|   )
 | |
| {
 | |
|   if (Iterator == NULL) {
 | |
|     ASSERT (0);
 | |
|     return EFI_INVALID_PARAMETER;
 | |
|   }
 | |
| 
 | |
|   FreePool (Iterator);
 | |
| 
 | |
|   return EFI_SUCCESS;
 | |
| }
 |