In an effort to clean the documentation of the above package, remove duplicated words. Cc: Sami Mujawar <Sami.Mujawar@arm.com> Cc: Alexei Fedorov <Alexei.Fedorov@arm.com> Signed-off-by: Pierre Gondois <pierre.gondois@arm.com> Reviewed-by: Sami Mujawar <sami.mujawar@arm.com>
		
			
				
	
	
		
			193 lines
		
	
	
		
			5.8 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			193 lines
		
	
	
		
			5.8 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
| /** @file
 | |
|   Flattened Device Tree parser library for KvmTool.
 | |
| 
 | |
|   Copyright (c) 2021, ARM Limited. All rights reserved.<BR>
 | |
|   SPDX-License-Identifier: BSD-2-Clause-Patent
 | |
| **/
 | |
| 
 | |
| #include "FdtHwInfoParser.h"
 | |
| #include "BootArch/ArmBootArchParser.h"
 | |
| #include "GenericTimer/ArmGenericTimerParser.h"
 | |
| #include "Gic/ArmGicDispatcher.h"
 | |
| #include "Pci/ArmPciConfigSpaceParser.h"
 | |
| #include "Serial/ArmSerialPortParser.h"
 | |
| 
 | |
| /** Ordered table of parsers/dispatchers.
 | |
| 
 | |
|   A parser parses a Device Tree to populate a specific CmObj type. None,
 | |
|   one or many CmObj can be created by the parser.
 | |
|   The created CmObj are then handed to the parser's caller through the
 | |
|   HW_INFO_ADD_OBJECT interface.
 | |
|   This can also be a dispatcher. I.e. a function that not parsing a
 | |
|   Device Tree but calling other parsers.
 | |
| */
 | |
| STATIC CONST FDT_HW_INFO_PARSER_FUNC  HwInfoParserTable[] = {
 | |
|   ArmBootArchInfoParser,
 | |
|   ArmGenericTimerInfoParser,
 | |
|   ArmGicDispatcher,
 | |
|   ArmPciConfigInfoParser,
 | |
|   SerialPortDispatcher
 | |
| };
 | |
| 
 | |
| /** Main dispatcher: sequentially call the parsers/dispatchers
 | |
|     of the HwInfoParserTable.
 | |
| 
 | |
|   A parser parses a Device Tree to populate a specific CmObj type. None,
 | |
|   one or many CmObj can be created by the parser.
 | |
|   The created CmObj are then handed to the parser's caller through the
 | |
|   HW_INFO_ADD_OBJECT interface.
 | |
|   This can also be a dispatcher. I.e. a function that not parsing a
 | |
|   Device Tree but calling other parsers.
 | |
| 
 | |
|   @param [in]  FdtParserHandle A handle to the parser instance.
 | |
|   @param [in]  FdtBranch       When searching for DT node name, restrict
 | |
|                                the search to this Device Tree branch.
 | |
| 
 | |
|   @retval EFI_SUCCESS             The function completed successfully.
 | |
|   @retval EFI_ABORTED             An error occurred.
 | |
|   @retval EFI_INVALID_PARAMETER   Invalid parameter.
 | |
|   @retval EFI_NOT_FOUND           Not found.
 | |
|   @retval EFI_UNSUPPORTED         Unsupported.
 | |
| **/
 | |
| STATIC
 | |
| EFI_STATUS
 | |
| EFIAPI
 | |
| MainDispatcher (
 | |
|   IN  CONST FDT_HW_INFO_PARSER_HANDLE  FdtParserHandle,
 | |
|   IN        INT32                      FdtBranch
 | |
|   )
 | |
| {
 | |
|   EFI_STATUS  Status;
 | |
|   UINT32      Index;
 | |
| 
 | |
|   if (fdt_check_header (FdtParserHandle->Fdt) < 0) {
 | |
|     ASSERT (0);
 | |
|     return EFI_INVALID_PARAMETER;
 | |
|   }
 | |
| 
 | |
|   for (Index = 0; Index < ARRAY_SIZE (HwInfoParserTable); Index++) {
 | |
|     Status = HwInfoParserTable[Index](
 | |
|                                       FdtParserHandle,
 | |
|                                       FdtBranch
 | |
|                                       );
 | |
|     if (EFI_ERROR (Status)  &&
 | |
|         (Status != EFI_NOT_FOUND))
 | |
|     {
 | |
|       // If EFI_NOT_FOUND, the parser didn't find information in the DT.
 | |
|       // Don't trigger an error.
 | |
|       ASSERT (0);
 | |
|       return Status;
 | |
|     }
 | |
|   } // for
 | |
| 
 | |
|   return EFI_SUCCESS;
 | |
| }
 | |
| 
 | |
| /** Initialise the HwInfoParser.
 | |
| 
 | |
|   The HwInfoParser shall use the information provided by the HwDataSource
 | |
|   to initialise the internal state of the parser or to index the data. This
 | |
|   internal state shall be linked to the ParserHandle using an implementation
 | |
|   defined mechanism.
 | |
| 
 | |
|   @param [in]   HwDataSource    Pointer to the blob containing the hardware
 | |
|                                 information. It can be a pointer to a Device
 | |
|                                 Tree, an XML file, etc. or any other data
 | |
|                                 structure defined by the HwInfoParser.
 | |
|   @param [in]   Context         A pointer to the caller's context.
 | |
|   @param [in]   HwInfoAdd       Function pointer called by the parser when
 | |
|                                 adding information.
 | |
|   @param [out]  ParserHandle    A handle to the parser instance.
 | |
| 
 | |
|   @retval EFI_SUCCESS             The function completed successfully.
 | |
|   @retval EFI_INVALID_PARAMETER   Invalid parameter.
 | |
| **/
 | |
| EFI_STATUS
 | |
| EFIAPI
 | |
| HwInfoParserInit (
 | |
|   IN    VOID                   *HwDataSource,
 | |
|   IN    VOID                   *Context,
 | |
|   IN    HW_INFO_ADD_OBJECT     HwInfoAdd,
 | |
|   OUT   HW_INFO_PARSER_HANDLE  *ParserHandle
 | |
|   )
 | |
| {
 | |
|   FDT_HW_INFO_PARSER  *FdtParserHandle;
 | |
| 
 | |
|   if ((ParserHandle == NULL)  ||
 | |
|       (HwInfoAdd == NULL)     ||
 | |
|       (HwDataSource == NULL)  ||
 | |
|       (fdt_check_header (HwDataSource) < 0))
 | |
|   {
 | |
|     ASSERT (0);
 | |
|     return EFI_INVALID_PARAMETER;
 | |
|   }
 | |
| 
 | |
|   FdtParserHandle = AllocateZeroPool (sizeof (FDT_HW_INFO_PARSER));
 | |
|   if (FdtParserHandle == NULL) {
 | |
|     *ParserHandle = NULL;
 | |
|     return EFI_OUT_OF_RESOURCES;
 | |
|   }
 | |
| 
 | |
|   // The HwDataSource is a pointer to the FDT data.
 | |
|   FdtParserHandle->Fdt       = HwDataSource;
 | |
|   FdtParserHandle->Context   = Context;
 | |
|   FdtParserHandle->HwInfoAdd = HwInfoAdd;
 | |
| 
 | |
|   *ParserHandle = (HW_INFO_PARSER_HANDLE)FdtParserHandle;
 | |
|   return EFI_SUCCESS;
 | |
| }
 | |
| 
 | |
| /** Parse the data provided by the HwDataSource.
 | |
| 
 | |
|   @param [in]  ParserHandle    A handle to the parser instance.
 | |
| 
 | |
|   @retval EFI_SUCCESS             The function completed successfully.
 | |
|   @retval EFI_INVALID_PARAMETER   Invalid parameter.
 | |
|   @retval EFI_OUT_OF_RESOURCES    An allocation has failed.
 | |
| **/
 | |
| EFI_STATUS
 | |
| EFIAPI
 | |
| HwInfoParse (
 | |
|   IN  HW_INFO_PARSER_HANDLE  ParserHandle
 | |
|   )
 | |
| {
 | |
|   EFI_STATUS  Status;
 | |
| 
 | |
|   if (ParserHandle == NULL) {
 | |
|     ASSERT (0);
 | |
|     return EFI_INVALID_PARAMETER;
 | |
|   }
 | |
| 
 | |
|   // Call all the parsers from the root node (-1).
 | |
|   Status = MainDispatcher (
 | |
|              (FDT_HW_INFO_PARSER_HANDLE)ParserHandle,
 | |
|              -1
 | |
|              );
 | |
|   ASSERT_EFI_ERROR (Status);
 | |
|   return Status;
 | |
| }
 | |
| 
 | |
| /** Cleanup any internal state and resources that were allocated
 | |
|     by the HwInfoParser.
 | |
| 
 | |
|   @param [in]  ParserHandle    A handle to the parser instance.
 | |
| 
 | |
|   @retval EFI_SUCCESS             The function completed successfully.
 | |
|   @retval EFI_INVALID_PARAMETER   Invalid parameter.
 | |
| **/
 | |
| EFI_STATUS
 | |
| EFIAPI
 | |
| HwInfoParserShutdown (
 | |
|   IN  HW_INFO_PARSER_HANDLE  ParserHandle
 | |
|   )
 | |
| {
 | |
|   if (ParserHandle == NULL) {
 | |
|     ASSERT (0);
 | |
|     return EFI_INVALID_PARAMETER;
 | |
|   }
 | |
| 
 | |
|   FreePool (ParserHandle);
 | |
| 
 | |
|   return EFI_SUCCESS;
 | |
| }
 |