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>
		
			
				
	
	
		
			220 lines
		
	
	
		
			6.8 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			220 lines
		
	
	
		
			6.8 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
| /** @file
 | |
|   AML Iterator.
 | |
| 
 | |
|   Copyright (c) 2019 - 2020, Arm Limited. All rights reserved.<BR>
 | |
| 
 | |
|   SPDX-License-Identifier: BSD-2-Clause-Patent
 | |
| **/
 | |
| 
 | |
| #ifndef AML_ITERATOR_H_
 | |
| #define AML_ITERATOR_H_
 | |
| 
 | |
| /* This header file does not include internal Node definition,
 | |
|    i.e. AML_ROOT_NODE, AML_OBJECT_NODE, etc. The node definitions
 | |
|    must be included by the caller file. The function prototypes must
 | |
|    only expose AML_NODE_HANDLE, AML_ROOT_NODE_HANDLE, etc. node
 | |
|    definitions.
 | |
|    This allows to keep the functions defined here both internal and
 | |
|    potentially external. If necessary, any function of this file can
 | |
|    be exposed externally.
 | |
|    The Api folder is internal to the AmlLib, but should only use these
 | |
|    functions. They provide a "safe" way to interact with the AmlLib.
 | |
| */
 | |
| 
 | |
| /**
 | |
|   @defgroup IteratorLibrary Iterator library
 | |
|   @ingroup NavigationApis
 | |
|   @{
 | |
|     The iterator library allow to navigate in the AML tree using an iterator.
 | |
|     It is possible to initialize/delete an iterator.
 | |
| 
 | |
|     This iterator can progress in the tree by different orders:
 | |
|      - Linear progression: Iterate following the AML bytestream order
 | |
|                            (depth first).
 | |
|      - Branch progression: Iterate following the AML bytestream order
 | |
|                            (depth first), but stop iterating at the
 | |
|                            end of the branch.
 | |
| 
 | |
|     An iterator has the following features:
 | |
|      - GetNode:       Get the current node pointed by the iterator.
 | |
|      - GetNext:       Move the current node of the iterator to the next
 | |
|                       node, according to the iteration mode selected.
 | |
|      - GetPrevious:   Move the current node of the iterator to the previous
 | |
|                       node, according to the iteration mode selected.
 | |
|   @}
 | |
| */
 | |
| 
 | |
| /**
 | |
|   @defgroup IteratorApis Iterator APIs
 | |
|   @ingroup IteratorLibrary
 | |
|   @{
 | |
|     Iterator APIs defines the action that can be done on an iterator:
 | |
|      - Initialization;
 | |
|      - Deletion;
 | |
|      - Getting the node currently pointed by the iterator;
 | |
|      - Moving to the next node;
 | |
|      - Moving to the previous node.
 | |
|   @}
 | |
| */
 | |
| 
 | |
| /**
 | |
|   @defgroup IteratorStructures Iterator structures
 | |
|   @ingroup IteratorLibrary
 | |
|   @{
 | |
|     Iterator structures define the enum/define values and structures related
 | |
|     to iterators.
 | |
|   @}
 | |
| */
 | |
| 
 | |
| /** Iterator mode.
 | |
| 
 | |
|   Modes to choose how the iterator is progressing in the tree.
 | |
|   A
 | |
|   \-B    <- Iterator initialized with this node.
 | |
|   | \-C
 | |
|   | | \-D
 | |
|   | \-E
 | |
|   |   \-F
 | |
|   |   \-G
 | |
|   \-H
 | |
|     \-I
 | |
| 
 | |
|   @ingroup IteratorStructures
 | |
| */
 | |
| typedef enum EAmlIteratorMode {
 | |
|   EAmlIteratorUnknown,        ///< Unknown/Invalid AML IteratorMode
 | |
|   EAmlIteratorLinear,         ///< Iterate following the AML bytestream order
 | |
|                               ///  (depth first).
 | |
|                               ///  The order followed by the iterator would be:
 | |
|                               ///  B, C, D, E, F, G, H, I, NULL.
 | |
|   EAmlIteratorBranch,         ///< Iterate through the node of a branch.
 | |
|                               ///  The iteration follows the AML bytestream
 | |
|                               ///  order but within the branch B.
 | |
|                               ///  The order followed by the iterator would be:
 | |
|                               ///  B, C, D, E, F, G, NULL.
 | |
|   EAmlIteratorModeMax         ///< Max enum.
 | |
| } EAML_ITERATOR_MODE;
 | |
| 
 | |
| /** Iterator.
 | |
| 
 | |
|   Allows to traverse the tree in different orders.
 | |
| 
 | |
|   @ingroup IteratorStructures
 | |
| */
 | |
| typedef struct AmlTreeIterator AML_TREE_ITERATOR;
 | |
| 
 | |
| /** Function pointer to a get the current node of the iterator.
 | |
| 
 | |
|   @ingroup IteratorApis
 | |
| 
 | |
|   @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.
 | |
| */
 | |
| typedef
 | |
| EFI_STATUS
 | |
| (EFIAPI *EDKII_AML_TREE_ITERATOR_GET_NODE)(
 | |
|   IN  AML_TREE_ITERATOR  *Iterator,
 | |
|   OUT AML_NODE_HANDLE    *OutNode
 | |
|   );
 | |
| 
 | |
| /** Function pointer to 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.
 | |
| 
 | |
|   @ingroup IteratorApis
 | |
| 
 | |
|   @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.
 | |
| */
 | |
| typedef
 | |
| EFI_STATUS
 | |
| (EFIAPI *EDKII_AML_TREE_ITERATOR_GET_NEXT)(
 | |
|   IN  AML_TREE_ITERATOR  *Iterator,
 | |
|   OUT AML_NODE_HANDLE    *NextNode
 | |
|   );
 | |
| 
 | |
| /** Function pointer to 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.
 | |
| 
 | |
|   @ingroup IteratorApis
 | |
| 
 | |
|   @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.
 | |
| */
 | |
| typedef
 | |
| EFI_STATUS
 | |
| (EFIAPI *EDKII_AML_TREE_ITERATOR_GET_PREVIOUS)(
 | |
|   IN  AML_TREE_ITERATOR  *Iterator,
 | |
|   OUT AML_NODE_HANDLE    *PrevNode
 | |
|   );
 | |
| 
 | |
| /**  Iterator structure to traverse the tree.
 | |
| 
 | |
|   @ingroup IteratorStructures
 | |
| */
 | |
| typedef struct AmlTreeIterator {
 | |
|   /// Get the current node of the iterator.
 | |
|   EDKII_AML_TREE_ITERATOR_GET_NODE        GetNode;
 | |
| 
 | |
|   /// Update the current node of the iterator with the next node.
 | |
|   EDKII_AML_TREE_ITERATOR_GET_NEXT        GetNext;
 | |
| 
 | |
|   /// Update the current node of the iterator with the previous node.
 | |
|   EDKII_AML_TREE_ITERATOR_GET_PREVIOUS    GetPrevious;
 | |
| } AML_TREE_ITERATOR;
 | |
| 
 | |
| /** Initialize an iterator.
 | |
| 
 | |
|   Note: The caller must call AmlDeleteIterator () to free the memory
 | |
|         allocated for the iterator.
 | |
| 
 | |
|   @ingroup IteratorApis
 | |
| 
 | |
|   @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_HANDLE     Node,
 | |
|   IN   EAML_ITERATOR_MODE  IteratorMode,
 | |
|   OUT  AML_TREE_ITERATOR   **IteratorPtr
 | |
|   );
 | |
| 
 | |
| /** Delete an iterator.
 | |
| 
 | |
|   Note: The caller must have first initialized the iterator with the
 | |
|         AmlInitializeIterator () function.
 | |
| 
 | |
|   @ingroup IteratorApis
 | |
| 
 | |
|   @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
 | |
|   );
 | |
| 
 | |
| #endif // AML_ITERATOR_H_
 |