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