DynamicTablesPkg: Configuration Manager Helper

This patch defines a helper macro 'GET_OBJECT_LIST()' that
expands to a function that uses the configuration manager
protocol to retrieve configuration manager object(s).

Contributed-under: TianoCore Contribution Agreement 1.1
Signed-off-by: Sami Mujawar <sami.mujawar@arm.com>
Reviewed-by: Alexei Fedorov <alexei.fedorov@arm.com>
This commit is contained in:
Sami Mujawar 2018-12-15 12:01:12 +00:00
parent 6b085d3cb3
commit c642023894
1 changed files with 132 additions and 0 deletions

View File

@ -0,0 +1,132 @@
/** @file
Copyright (c) 2017 - 2019, ARM Limited. All rights reserved.
This program and the accompanying materials
are licensed and made available under the terms and conditions of the BSD License
which accompanies this distribution. The full text of the license may be found at
http://opensource.org/licenses/bsd-license.php
THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
@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_