/** @file Copyright (c) 2017 - 2019, ARM Limited. All rights reserved. SPDX-License-Identifier: BSD-2-Clause-Patent @par Glossary: - Cm or CM - Configuration Manager - Obj or OBJ - Object **/ #ifndef CONFIGURATION_MANAGER_HELPER_H_ #define CONFIGURATION_MANAGER_HELPER_H_ /** The GET_OBJECT_LIST macro expands to a function that is used to retrieve an object or an object list from the Configuration Manager using the Configuration Manager Protocol interface. The macro expands to a function which has the following prototype: STATIC EFI_STATUS EFIAPI Get ( IN CONST EDKII_CONFIGURATION_MANAGER_PROTOCOL * CONST CfgMgrProtocol, IN CONST CM_OBJECT_TOKEN Token OPTIONAL, OUT Type ** List, OUT UINT32 * Count OPTIONAL ); Generated function parameters: @param [in] CfgMgrProtocol Pointer to the Configuration Manager protocol interface. @param [in] Token Reference token for the Object. @param [out] List Pointer to the Object list. @param [out] Count Count of the objects returned in the list. Macro Parameters: @param [in] CmObjectNameSpace The Object Namespace @param [in] CmObjectId Object Id. @param [in] Type Structure used to describe the Object. @retval EFI_SUCCESS Success. @retval EFI_INVALID_PARAMETER A parameter is invalid. @retval EFI_NOT_FOUND The required object information is not found. @retval EFI_BAD_BUFFER_SIZE The size returned by the Configuration Manager is less than the Object size for the requested object. **/ #define GET_OBJECT_LIST(CmObjectNameSpace, CmObjectId, Type) \ STATIC \ EFI_STATUS \ EFIAPI \ Get##CmObjectId ( \ IN CONST EDKII_CONFIGURATION_MANAGER_PROTOCOL * CONST CfgMgrProtocol, \ IN CONST CM_OBJECT_TOKEN Token OPTIONAL, \ OUT Type ** List, \ OUT UINT32 * CONST Count OPTIONAL \ ) \ { \ EFI_STATUS Status; \ CM_OBJ_DESCRIPTOR CmObjectDesc; \ UINT32 ObjCount = 0; \ if (List == NULL) { \ Status = EFI_INVALID_PARAMETER; \ DEBUG (( \ DEBUG_ERROR, \ "ERROR: Get" #CmObjectId ": Invalid out parameter for" \ " object list. Status = %r\n", \ Status \ )); \ goto error_handler; \ } \ Status = CfgMgrProtocol->GetObject ( \ CfgMgrProtocol, \ CREATE_CM_OBJECT_ID ( \ CmObjectNameSpace, \ CmObjectId \ ), \ Token, \ &CmObjectDesc \ ); \ if (EFI_ERROR (Status)) { \ DEBUG (( \ DEBUG_INFO, \ "INFO: Get" #CmObjectId ": Platform does not implement " \ #CmObjectId ". Status = %r\n", \ Status \ )); \ *List = NULL; \ goto error_handler; \ } \ if (CmObjectDesc.ObjectId != \ CREATE_CM_OBJECT_ID (CmObjectNameSpace, CmObjectId)) { \ DEBUG (( \ DEBUG_ERROR, \ "ERROR: Get" #CmObjectId ": " #CmObjectId \ ": Invalid ObjectId = 0x%x\n, expected Id = 0x%x\n", \ CmObjectDesc.ObjectId, \ CREATE_CM_OBJECT_ID (CmObjectNameSpace, CmObjectId) \ )); \ ASSERT (FALSE); \ Status = EFI_INVALID_PARAMETER; \ goto error_handler; \ } \ if (CmObjectDesc.Size < (sizeof (Type) * CmObjectDesc.Count)) { \ DEBUG (( \ DEBUG_ERROR, \ "ERROR: Get" #CmObjectId ": " #CmObjectId \ ": Buffer too small, size = 0x%x\n", \ CmObjectDesc.Size \ )); \ ASSERT (FALSE); \ Status = EFI_BAD_BUFFER_SIZE; \ goto error_handler; \ } \ ObjCount = CmObjectDesc.Count; \ *List = (Type*)CmObjectDesc.Data; \ error_handler: \ if (Count != NULL) { \ *Count = ObjCount; \ } \ return Status; \ } #endif // CONFIGURATION_MANAGER_HELPER_H_