]>
git.proxmox.com Git - mirror_edk2.git/blob - DynamicTablesPkg/Library/Common/DynamicPlatRepoLib/TokenMapper.c
4 Copyright (c) 2021, Arm Limited. All rights reserved.<BR>
6 SPDX-License-Identifier: BSD-2-Clause-Patent
9 - Cm or CM - Configuration Manager
13 #include <Library/BaseMemoryLib.h>
14 #include <Library/DebugLib.h>
15 #include <Library/MemoryAllocationLib.h>
16 #include <Protocol/ConfigurationManagerProtocol.h>
18 #include "TokenMapper.h"
20 /** Add a CmObjDesc to the TokenMapper.
22 @param [in] TokenMapper The TokenMapper instance.
23 @param [in] Token CmObj token.
24 @param [in] ObjectId CmObj ObjectId.
25 @param [in] Size CmObj Size.
26 @param [in] Data CmObj Data.
27 This memory is referenced, not copied.
29 @retval EFI_SUCCESS The function completed successfully.
30 @retval EFI_BUFFER_TOO_SMALL Buffer too small.
31 @retval EFI_INVALID_PARAMETER A parameter is invalid.
35 TokenMapperAddObject (
36 IN TOKEN_MAPPER
*TokenMapper
,
37 IN CM_OBJECT_TOKEN Token
,
38 IN CM_OBJECT_ID ObjectId
,
43 TOKEN_MAP_DESCRIPTOR
*TokenMapDesc
;
44 CM_OBJ_DESCRIPTOR
*CmObjDesc
;
46 if ((TokenMapper
== NULL
) ||
47 (TokenMapper
->TokenDescArray
== NULL
) ||
52 return EFI_INVALID_PARAMETER
;
55 if (TokenMapper
->ItemCount
>= TokenMapper
->MaxTokenDescCount
) {
57 return EFI_BUFFER_TOO_SMALL
;
60 TokenMapDesc
= &TokenMapper
->TokenDescArray
[TokenMapper
->ItemCount
++];
61 TokenMapDesc
->Token
= Token
;
62 CmObjDesc
= &TokenMapDesc
->CmObjDesc
;
63 CmObjDesc
->ObjectId
= ObjectId
;
64 CmObjDesc
->Size
= Size
;
66 // Point inside the finalized array.
67 CmObjDesc
->Data
= Data
;
69 // Only EArmObjCmRef CmObj can be added as arrays (more than 1 elements).
70 if ((GET_CM_NAMESPACE_ID (ObjectId
) == EObjNameSpaceArm
) &&
71 (GET_CM_OBJECT_ID (ObjectId
) == EArmObjCmRef
))
73 CmObjDesc
->Count
= Size
/ sizeof (CM_ARM_OBJ_REF
);
81 /** Get a CmObjDesc from a ObjectId/Token couple.
83 The Token parameter is not optional. An existing token must be provided.
85 @param [in] TokenMapper The TokenMapper instance.
86 @param [in] Token Token of the CmObj to search.
87 @param [in] ObjectId Object Id of the CmObj to search.
88 @param [out] CmObjDesc CM_OBJ_DESCRIPTOR containing the CmObj searched.
90 @retval EFI_SUCCESS The function completed successfully.
91 @retval EFI_INVALID_PARAMETER A parameter is invalid.
92 @retval EFI_NOT_FOUND Not found.
96 TokenMapperGetObject (
97 IN TOKEN_MAPPER
*TokenMapper
,
98 IN CM_OBJECT_TOKEN Token
,
99 IN CM_OBJECT_ID ObjectId
,
100 OUT CM_OBJ_DESCRIPTOR
*CmObjDesc
105 TOKEN_MAP_DESCRIPTOR
*TokenMapDesc
;
108 if ((TokenMapper
!= NULL
) && (TokenMapper
->MaxTokenDescCount
== 0)) {
112 if ((Token
== CM_NULL_TOKEN
) ||
113 (CmObjDesc
== NULL
) ||
114 (TokenMapper
== NULL
) ||
115 (TokenMapper
->TokenDescArray
== NULL
))
118 return EFI_INVALID_PARAMETER
;
121 TokenMapDesc
= TokenMapper
->TokenDescArray
;
122 MaxCount
= TokenMapper
->MaxTokenDescCount
;
123 for (Index
= 0; Index
< MaxCount
; Index
++) {
124 if ((TokenMapDesc
->CmObjDesc
.ObjectId
== ObjectId
) &&
125 (TokenMapDesc
->Token
== Token
))
129 &TokenMapDesc
->CmObjDesc
,
130 sizeof (CM_OBJ_DESCRIPTOR
)
141 "INFO: Requested CmObj of type 0x%x with token 0x%x"
142 " not found in the dynamic repository\n.",
146 return EFI_NOT_FOUND
;
149 /** Initialise a TokenMapper.
151 @param [in] TokenMapper The TokenMapper to initialise.
152 @param [in] DescriptorCount Number of entries to allocate.
154 @retval EFI_SUCCESS The function completed successfully.
155 @retval EFI_ALREADY_STARTED Instance already initialised.
156 @retval EFI_INVALID_PARAMETER A parameter is invalid.
160 TokenMapperInitialise (
161 IN TOKEN_MAPPER
*TokenMapper
,
162 IN UINTN DescriptorCount
165 if (TokenMapper
== NULL
) {
167 return EFI_INVALID_PARAMETER
;
171 if (DescriptorCount
== 0) {
175 if (TokenMapper
->TokenDescArray
!= NULL
) {
176 DEBUG ((DEBUG_ERROR
, "ERROR: Token mapper already initialised\n."));
178 return EFI_ALREADY_STARTED
;
181 TokenMapper
->TokenDescArray
=
182 AllocateZeroPool (sizeof (TOKEN_MAP_DESCRIPTOR
) * DescriptorCount
);
183 if (TokenMapper
->TokenDescArray
== NULL
) {
185 return EFI_OUT_OF_RESOURCES
;
188 TokenMapper
->MaxTokenDescCount
= DescriptorCount
;
189 TokenMapper
->ItemCount
= 0;
194 /** Shutdown a TokenMapper.
196 @param [in] TokenMapper The TokenMapper to shutdown.
198 @retval EFI_SUCCESS The function completed successfully.
199 @retval EFI_INVALID_PARAMETER A parameter is invalid.
203 TokenMapperShutdown (
204 IN TOKEN_MAPPER
*TokenMapper
208 if ((TokenMapper
!= NULL
) && (TokenMapper
->MaxTokenDescCount
== 0)) {
212 if ((TokenMapper
== NULL
) ||
213 (TokenMapper
->TokenDescArray
== NULL
))
216 return EFI_INVALID_PARAMETER
;
219 FreePool (TokenMapper
->TokenDescArray
);
220 TokenMapper
->TokenDescArray
= NULL
;
221 TokenMapper
->MaxTokenDescCount
= 0;