Skip to content

Commit 5fe5b6f

Browse files
pierregondoismergify[bot]
authored andcommitted
DynamicTablesPkg: DynamicPlatRepo: Add TokenMapper
The DynamicPlatRepo library allows to handle dynamically created CmObj. The dynamic platform repository can be in the following states: 1 - Non-initialised 2 - Transient: Possibility to add CmObj to the platform, but not to query them. 3 - Finalised: Possibility to query CmObj, but not to add new. A token is allocated to each CmObj added to the dynamic platform repository (except for reference tokens CmObj). This allows to retrieve dynamic CmObjs among all CmObj (static CmObj for instance). This patch add the TokenMapper files, allowing to retrieve a CmObj from a token/CmObjId couple. Signed-off-by: Pierre Gondois <Pierre.Gondois@arm.com> Reviewed-by: Sami Mujawar <sami.mujawar@arm.com>
1 parent 740e3bb commit 5fe5b6f

File tree

2 files changed

+347
-0
lines changed

2 files changed

+347
-0
lines changed
Lines changed: 224 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,224 @@
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+
}
Lines changed: 123 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,123 @@
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+
#ifndef TOKEN_MAPPER_H_
14+
#define TOKEN_MAPPER_H_
15+
16+
#pragma pack(1)
17+
18+
/** Token mapping descriptor.
19+
20+
Bind a token and a CmObj together.
21+
*/
22+
typedef struct TokenMapDescriptor {
23+
/// Object Token.
24+
CM_OBJECT_TOKEN Token;
25+
26+
/// CmObjectDescriptor CM_OBJ_DESCRIPTOR.Data is a reference copy
27+
/// and not allocated. It points to the individual objects in the
28+
/// Dynamic Plat Repo ArmNameSpaceObjectArray.
29+
CM_OBJ_DESCRIPTOR CmObjDesc;
30+
} TOKEN_MAP_DESCRIPTOR;
31+
32+
/** Token mapper.
33+
34+
Contain all the Token/CmObj couple mapping.
35+
**/
36+
typedef struct TokenMapper {
37+
/// Maximum number of TOKEN_MAP_DESCRIPTOR entries in TokenDescArray.
38+
UINTN MaxTokenDescCount;
39+
40+
/// Next TOKEN_MAP_DESCRIPTOR entry to use in TokenDescArray.
41+
UINTN ItemCount;
42+
43+
/// Array of TOKEN_MAP_DESCRIPTOR.
44+
TOKEN_MAP_DESCRIPTOR *TokenDescArray;
45+
} TOKEN_MAPPER;
46+
47+
#pragma pack()
48+
49+
/** Add a CmObjDesc to the TokenMapper.
50+
51+
@param [in] TokenMapper The TokenMapper instance.
52+
@param [in] Token CmObj token.
53+
@param [in] ObjectId CmObj ObjectId.
54+
@param [in] Size CmObj Size.
55+
@param [in] Data CmObj Data.
56+
This memory is referenced, not copied.
57+
58+
@retval EFI_SUCCESS The function completed successfully.
59+
@retval EFI_BUFFER_TOO_SMALL Buffer too small.
60+
@retval EFI_INVALID_PARAMETER A parameter is invalid.
61+
**/
62+
EFI_STATUS
63+
EFIAPI
64+
TokenMapperAddObject (
65+
IN TOKEN_MAPPER *TokenMapper,
66+
IN CM_OBJECT_TOKEN Token,
67+
IN CM_OBJECT_ID ObjectId,
68+
IN UINT32 Size,
69+
IN VOID *Data
70+
);
71+
72+
/** Get a CmObjDesc from a ObjectId/Token couple.
73+
74+
The Token parameter is not optional. An existing token must be provided.
75+
76+
@param [in] TokenMapper The TokenMapper instance.
77+
@param [in] Token Token of the CmObj to search.
78+
@param [in] ObjectId Object Id of the CmObj to search.
79+
@param [out] CmObjDesc CM_OBJ_DESCRIPTOR containing the CmObj searched.
80+
81+
@retval EFI_SUCCESS The function completed successfully.
82+
@retval EFI_INVALID_PARAMETER A parameter is invalid.
83+
@retval EFI_NOT_FOUND Not found.
84+
**/
85+
EFI_STATUS
86+
EFIAPI
87+
TokenMapperGetObject (
88+
IN TOKEN_MAPPER *TokenMapper,
89+
IN CM_OBJECT_TOKEN Token,
90+
IN CM_OBJECT_ID ObjectId,
91+
OUT CM_OBJ_DESCRIPTOR *CmObjDesc
92+
);
93+
94+
/** Initialise a TokenMapper.
95+
96+
@param [in] TokenMapper The TokenMapper to initialise.
97+
@param [in] DescriptorCount Number of entries to allocate.
98+
99+
@retval EFI_SUCCESS The function completed successfully.
100+
@retval EFI_ALREADY_STARTED Instance already initialised.
101+
@retval EFI_INVALID_PARAMETER A parameter is invalid.
102+
**/
103+
EFI_STATUS
104+
EFIAPI
105+
TokenMapperInitialise (
106+
IN TOKEN_MAPPER *TokenMapper,
107+
IN UINTN DescriptorCount
108+
);
109+
110+
/** Shutdown a TokenMapper.
111+
112+
@param [in] TokenMapper The TokenMapper to shutdown.
113+
114+
@retval EFI_SUCCESS The function completed successfully.
115+
@retval EFI_INVALID_PARAMETER A parameter is invalid.
116+
**/
117+
EFI_STATUS
118+
EFIAPI
119+
TokenMapperShutdown (
120+
IN TOKEN_MAPPER *TokenMapper
121+
);
122+
123+
#endif // TOKEN_MAPPER_H_

0 commit comments

Comments
 (0)