1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126
|
/** @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<CmObjectId> (
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_
|