| /** @file | |
| Configuration manager Object Descriptor Utility. | |
| Copyright (c) 2021, ARM Limited. All rights reserved.<BR> | |
| SPDX-License-Identifier: BSD-2-Clause-Patent | |
| **/ | |
| #include <FdtHwInfoParserInclude.h> | |
| #include <ConfigurationManagerObject.h> | |
| #include "CmObjectDescUtility.h" | |
| /** Create a CM_OBJ_DESCRIPTOR. | |
| @param [in] ObjectId CM_OBJECT_ID of the node. | |
| @param [in] Count Number of CmObj stored in the | |
| data field. | |
| @param [in] Data Pointer to one or more CmObj objects. | |
| The content of this Data buffer is copied. | |
| @param [in] Size Size of the Data buffer. | |
| @param [out] NewCmObjDesc The created CM_OBJ_DESCRIPTOR. | |
| @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 | |
| CreateCmObjDesc ( | |
| IN CM_OBJECT_ID ObjectId, | |
| IN UINT32 Count, | |
| IN VOID *Data, | |
| IN UINT32 Size, | |
| OUT CM_OBJ_DESCRIPTOR **NewCmObjDesc | |
| ) | |
| { | |
| CM_OBJ_DESCRIPTOR *CmObjDesc; | |
| VOID *DataBuffer; | |
| if ((Count == 0) || | |
| (Data == NULL) || | |
| (Size == 0) || | |
| (NewCmObjDesc == NULL)) | |
| { | |
| ASSERT (0); | |
| return EFI_INVALID_PARAMETER; | |
| } | |
| CmObjDesc = AllocateZeroPool (sizeof (CM_OBJ_DESCRIPTOR)); | |
| if (CmObjDesc == NULL) { | |
| ASSERT (0); | |
| return EFI_OUT_OF_RESOURCES; | |
| } | |
| DataBuffer = AllocateCopyPool (Size, Data); | |
| if (DataBuffer == NULL) { | |
| FreePool (CmObjDesc); | |
| ASSERT (0); | |
| return EFI_OUT_OF_RESOURCES; | |
| } | |
| CmObjDesc->ObjectId = ObjectId; | |
| CmObjDesc->Count = Count; | |
| CmObjDesc->Data = DataBuffer; | |
| CmObjDesc->Size = Size; | |
| *NewCmObjDesc = CmObjDesc; | |
| return EFI_SUCCESS; | |
| } | |
| /** Free resources allocated for the CM_OBJ_DESCRIPTOR. | |
| @param [in] CmObjDesc Pointer to the CM_OBJ_DESCRIPTOR. | |
| @retval EFI_SUCCESS The function completed successfully. | |
| @retval EFI_INVALID_PARAMETER Invalid parameter. | |
| **/ | |
| EFI_STATUS | |
| EFIAPI | |
| FreeCmObjDesc ( | |
| IN CM_OBJ_DESCRIPTOR *CmObjDesc | |
| ) | |
| { | |
| if (CmObjDesc == NULL) { | |
| ASSERT (0); | |
| return EFI_INVALID_PARAMETER; | |
| } | |
| if (CmObjDesc->Data != NULL) { | |
| FreePool (CmObjDesc->Data); | |
| } | |
| FreePool (CmObjDesc); | |
| return EFI_SUCCESS; | |
| } | |
| /** Add a single CmObj to the Configuration Manager. | |
| @param [in] FdtParserHandle A handle to the parser instance. | |
| @param [in] ObjectId CmObj ObjectId. | |
| @param [in] Data CmObj Data. | |
| @param [in] Size CmObj Size. | |
| @param [out] Token If provided and success, | |
| token generated for this CmObj. | |
| @retval EFI_SUCCESS The function completed successfully. | |
| @retval EFI_INVALID_PARAMETER Invalid parameter. | |
| **/ | |
| EFI_STATUS | |
| EFIAPI | |
| AddSingleCmObj ( | |
| IN CONST FDT_HW_INFO_PARSER_HANDLE FdtParserHandle, | |
| IN CM_OBJECT_ID ObjectId, | |
| IN VOID *Data, | |
| IN UINT32 Size, | |
| OUT CM_OBJECT_TOKEN *Token OPTIONAL | |
| ) | |
| { | |
| EFI_STATUS Status; | |
| CM_OBJ_DESCRIPTOR CmObjDesc; | |
| if ((FdtParserHandle == NULL) || | |
| (FdtParserHandle->HwInfoAdd == NULL) || | |
| (Data == NULL) || | |
| (Size == 0)) | |
| { | |
| ASSERT (0); | |
| return EFI_INVALID_PARAMETER; | |
| } | |
| CmObjDesc.ObjectId = ObjectId; | |
| CmObjDesc.Count = 1; | |
| CmObjDesc.Data = Data; | |
| CmObjDesc.Size = Size; | |
| // Add the CmObj. | |
| // Don't ask for a token. | |
| Status = FdtParserHandle->HwInfoAdd ( | |
| FdtParserHandle, | |
| FdtParserHandle->Context, | |
| &CmObjDesc, | |
| Token | |
| ); | |
| ASSERT_EFI_ERROR (Status); | |
| return Status; | |
| } | |
| /** Add multiple CmObj to the Configuration Manager. | |
| @param [in] FdtParserHandle A handle to the parser instance. | |
| @param [in] CmObjDesc CmObjDesc containing multiple CmObj | |
| to add. | |
| @param [in] TokenCount If provided, count of entries in the | |
| TokenTable. | |
| @param [out] TokenTable If provided and success, | |
| token generated for these CmObj. | |
| Address of an array of CM_OBJECT_TOKEN | |
| with the same number of elements as the | |
| CmObjDesc. | |
| @retval EFI_SUCCESS The function completed successfully. | |
| @retval EFI_INVALID_PARAMETER Invalid parameter. | |
| **/ | |
| EFI_STATUS | |
| EFIAPI | |
| AddMultipleCmObj ( | |
| IN CONST FDT_HW_INFO_PARSER_HANDLE FdtParserHandle, | |
| IN CONST CM_OBJ_DESCRIPTOR *CmObjDesc, | |
| IN UINT32 TokenCount, OPTIONAL | |
| OUT CM_OBJECT_TOKEN *TokenTable OPTIONAL | |
| ) | |
| { | |
| EFI_STATUS Status; | |
| UINT32 Index; | |
| UINT32 Count; | |
| UINT8 *Data; | |
| UINT32 Size; | |
| CM_OBJ_DESCRIPTOR SingleCmObjDesc; | |
| if ((FdtParserHandle == NULL) || | |
| (FdtParserHandle->HwInfoAdd == NULL) || | |
| (CmObjDesc == NULL) || | |
| (CmObjDesc->Count == 0) || | |
| (CmObjDesc->Data == NULL) || | |
| (CmObjDesc->Size == 0)) | |
| { | |
| ASSERT (0); | |
| return EFI_INVALID_PARAMETER; | |
| } | |
| Count = CmObjDesc->Count; | |
| Data = CmObjDesc->Data; | |
| Size = CmObjDesc->Size / Count; | |
| SingleCmObjDesc.ObjectId = CmObjDesc->ObjectId; | |
| SingleCmObjDesc.Count = 1; | |
| SingleCmObjDesc.Size = Size; | |
| for (Index = 0; Index < Count; Index++) { | |
| SingleCmObjDesc.Data = (VOID *)&Data[Index * Size]; | |
| // Add the CmObj. | |
| Status = FdtParserHandle->HwInfoAdd ( | |
| FdtParserHandle, | |
| FdtParserHandle->Context, | |
| &SingleCmObjDesc, | |
| (TokenTable != NULL) ? | |
| &TokenTable[Index] : | |
| NULL | |
| ); | |
| if (EFI_ERROR (Status)) { | |
| ASSERT (0); | |
| return Status; | |
| } | |
| } // for | |
| return Status; | |
| } | |
| /** Add multiple CmObj to the Configuration Manager. | |
| Get one token referencing a EArmObjCmRef CmObj itself referencing | |
| the input CmObj. In the table below, RefToken is returned. | |
| Token referencing an Array of tokens Array of CmObj | |
| array of EArmObjCmRef referencing each from the input: | |
| CmObj: CmObj from the input: | |
| RefToken ---> CmObjToken[0] ---> CmObj[0] | |
| CmObjToken[1] ---> CmObj[1] | |
| CmObjToken[2] ---> CmObj[2] | |
| @param [in] FdtParserHandle A handle to the parser instance. | |
| @param [in] CmObjDesc CmObjDesc containing multiple CmObj | |
| to add. | |
| @param [out] Token If success, token referencing an array | |
| of EArmObjCmRef CmObj, themselves | |
| referencing the input CmObjs. | |
| @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 | |
| AddMultipleCmObjWithCmObjRef ( | |
| IN CONST FDT_HW_INFO_PARSER_HANDLE FdtParserHandle, | |
| IN CM_OBJ_DESCRIPTOR *CmObjDesc, | |
| OUT CM_OBJECT_TOKEN *Token | |
| ) | |
| { | |
| EFI_STATUS Status; | |
| CM_OBJ_DESCRIPTOR CmObjRef; | |
| CM_OBJECT_TOKEN *TokenTable; | |
| INT32 TokenTableSize; | |
| if ((FdtParserHandle == NULL) || | |
| (FdtParserHandle->HwInfoAdd == NULL) || | |
| (CmObjDesc == NULL) || | |
| (CmObjDesc->Count == 0) || | |
| (CmObjDesc->Data == NULL) || | |
| (CmObjDesc->Size == 0) || | |
| (Token == NULL)) | |
| { | |
| ASSERT (0); | |
| return EFI_INVALID_PARAMETER; | |
| } | |
| // Allocate a buffer to store the tokens. | |
| TokenTableSize = CmObjDesc->Count * sizeof (CM_OBJECT_TOKEN); | |
| TokenTable = AllocateZeroPool (TokenTableSize); | |
| if (TokenTable == NULL) { | |
| ASSERT (0); | |
| return EFI_OUT_OF_RESOURCES; | |
| } | |
| // Add the input CmObjs. | |
| Status = AddMultipleCmObj ( | |
| FdtParserHandle, | |
| CmObjDesc, | |
| CmObjDesc->Count, | |
| TokenTable | |
| ); | |
| if (EFI_ERROR (Status)) { | |
| ASSERT (0); | |
| goto exit_handler; | |
| } | |
| CmObjRef.ObjectId = CREATE_CM_ARM_OBJECT_ID (EArmObjCmRef); | |
| CmObjRef.Data = TokenTable; | |
| CmObjRef.Count = CmObjDesc->Count; | |
| CmObjRef.Size = TokenTableSize; | |
| // Add the array of EArmObjCmRef CmObjs. | |
| Status = FdtParserHandle->HwInfoAdd ( | |
| FdtParserHandle, | |
| FdtParserHandle->Context, | |
| &CmObjRef, | |
| Token | |
| ); | |
| ASSERT_EFI_ERROR (Status); | |
| exit_handler: | |
| FreePool (TokenTable); | |
| return Status; | |
| } |