]> git.proxmox.com Git - mirror_edk2.git/blob - DynamicTablesPkg/Library/Common/DynamicPlatRepoLib/TokenMapper.c
DynamicTablesPkg: DynamicPlatRepo: Add TokenMapper
[mirror_edk2.git] / DynamicTablesPkg / Library / Common / DynamicPlatRepoLib / TokenMapper.c
1 /** @file
2 Token Mapper
3
4 Copyright (c) 2021, Arm Limited. All rights reserved.<BR>
5
6 SPDX-License-Identifier: BSD-2-Clause-Patent
7
8 @par Glossary:
9 - Cm or CM - Configuration Manager
10 - Obj or OBJ - Object
11 **/
12
13 #include <Library/BaseMemoryLib.h>
14 #include <Library/DebugLib.h>
15 #include <Library/MemoryAllocationLib.h>
16 #include <Protocol/ConfigurationManagerProtocol.h>
17
18 #include "TokenMapper.h"
19
20 /** Add a CmObjDesc to the TokenMapper.
21
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.
28
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.
32 **/
33 EFI_STATUS
34 EFIAPI
35 TokenMapperAddObject (
36 IN TOKEN_MAPPER *TokenMapper,
37 IN CM_OBJECT_TOKEN Token,
38 IN CM_OBJECT_ID ObjectId,
39 IN UINT32 Size,
40 IN VOID *Data
41 )
42 {
43 TOKEN_MAP_DESCRIPTOR *TokenMapDesc;
44 CM_OBJ_DESCRIPTOR *CmObjDesc;
45
46 if ((TokenMapper == NULL) ||
47 (TokenMapper->TokenDescArray == NULL) ||
48 (Size == 0) ||
49 (Data == NULL))
50 {
51 ASSERT (0);
52 return EFI_INVALID_PARAMETER;
53 }
54
55 if (TokenMapper->ItemCount >= TokenMapper->MaxTokenDescCount) {
56 ASSERT (0);
57 return EFI_BUFFER_TOO_SMALL;
58 }
59
60 TokenMapDesc = &TokenMapper->TokenDescArray[TokenMapper->ItemCount++];
61 TokenMapDesc->Token = Token;
62 CmObjDesc = &TokenMapDesc->CmObjDesc;
63 CmObjDesc->ObjectId = ObjectId;
64 CmObjDesc->Size = Size;
65
66 // Point inside the finalized array.
67 CmObjDesc->Data = Data;
68
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))
72 {
73 CmObjDesc->Count = Size / sizeof (CM_ARM_OBJ_REF);
74 } else {
75 CmObjDesc->Count = 1;
76 }
77
78 return EFI_SUCCESS;
79 }
80
81 /** Get a CmObjDesc from a ObjectId/Token couple.
82
83 The Token parameter is not optional. An existing token must be provided.
84
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.
89
90 @retval EFI_SUCCESS The function completed successfully.
91 @retval EFI_INVALID_PARAMETER A parameter is invalid.
92 @retval EFI_NOT_FOUND Not found.
93 **/
94 EFI_STATUS
95 EFIAPI
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
101 )
102 {
103 UINTN Index;
104 UINTN MaxCount;
105 TOKEN_MAP_DESCRIPTOR *TokenMapDesc;
106
107 // Nothing to do.
108 if ((TokenMapper != NULL) && (TokenMapper->MaxTokenDescCount == 0)) {
109 goto exit_handler;
110 }
111
112 if ((Token == CM_NULL_TOKEN) ||
113 (CmObjDesc == NULL) ||
114 (TokenMapper == NULL) ||
115 (TokenMapper->TokenDescArray == NULL))
116 {
117 ASSERT (0);
118 return EFI_INVALID_PARAMETER;
119 }
120
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))
126 {
127 CopyMem (
128 CmObjDesc,
129 &TokenMapDesc->CmObjDesc,
130 sizeof (CM_OBJ_DESCRIPTOR)
131 );
132 return EFI_SUCCESS;
133 }
134
135 TokenMapDesc++;
136 } // for
137
138 exit_handler:
139 DEBUG ((
140 DEBUG_INFO,
141 "INFO: Requested CmObj of type 0x%x with token 0x%x"
142 " not found in the dynamic repository\n.",
143 ObjectId,
144 Token
145 ));
146 return EFI_NOT_FOUND;
147 }
148
149 /** Initialise a TokenMapper.
150
151 @param [in] TokenMapper The TokenMapper to initialise.
152 @param [in] DescriptorCount Number of entries to allocate.
153
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.
157 **/
158 EFI_STATUS
159 EFIAPI
160 TokenMapperInitialise (
161 IN TOKEN_MAPPER *TokenMapper,
162 IN UINTN DescriptorCount
163 )
164 {
165 if (TokenMapper == NULL) {
166 ASSERT (0);
167 return EFI_INVALID_PARAMETER;
168 }
169
170 // Nothing to do.
171 if (DescriptorCount == 0) {
172 return EFI_SUCCESS;
173 }
174
175 if (TokenMapper->TokenDescArray != NULL) {
176 DEBUG ((DEBUG_ERROR, "ERROR: Token mapper already initialised\n."));
177 ASSERT (0);
178 return EFI_ALREADY_STARTED;
179 }
180
181 TokenMapper->TokenDescArray =
182 AllocateZeroPool (sizeof (TOKEN_MAP_DESCRIPTOR) * DescriptorCount);
183 if (TokenMapper->TokenDescArray == NULL) {
184 ASSERT (0);
185 return EFI_OUT_OF_RESOURCES;
186 }
187
188 TokenMapper->MaxTokenDescCount = DescriptorCount;
189 TokenMapper->ItemCount = 0;
190
191 return EFI_SUCCESS;
192 }
193
194 /** Shutdown a TokenMapper.
195
196 @param [in] TokenMapper The TokenMapper to shutdown.
197
198 @retval EFI_SUCCESS The function completed successfully.
199 @retval EFI_INVALID_PARAMETER A parameter is invalid.
200 **/
201 EFI_STATUS
202 EFIAPI
203 TokenMapperShutdown (
204 IN TOKEN_MAPPER *TokenMapper
205 )
206 {
207 // Nothing to do.
208 if ((TokenMapper != NULL) && (TokenMapper->MaxTokenDescCount == 0)) {
209 return EFI_SUCCESS;
210 }
211
212 if ((TokenMapper == NULL) ||
213 (TokenMapper->TokenDescArray == NULL))
214 {
215 ASSERT (0);
216 return EFI_INVALID_PARAMETER;
217 }
218
219 FreePool (TokenMapper->TokenDescArray);
220 TokenMapper->TokenDescArray = NULL;
221 TokenMapper->MaxTokenDescCount = 0;
222
223 return EFI_SUCCESS;
224 }