| /** @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_ |