2 Private functions used by PCD DXE driver.s
4 Copyright (c) 2006, Intel Corporation
5 All rights reserved. This program and the accompanying materials
6 are licensed and made available under the terms and conditions of the BSD License
7 which accompanies this distribution. The full text of the license may be found at
8 http://opensource.org/licenses/bsd-license.php
10 THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
11 WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
14 Module Name: Service.c
17 #include "../Common/PcdCommon.h"
20 static PCD_DATABASE
*PrivatePcdDxeDatabase
;
21 static LIST_ENTRY mPcdDatabaseListHead
= INITIALIZE_LIST_HEAD_VARIABLE(mPcdDatabaseListHead
);
24 GetPcdDatabaseListHead (
28 return &mPcdDatabaseListHead
;
32 GetPcdDxeDataBaseInstance (
36 return PrivatePcdDxeDatabase
;
40 SetPcdDxeDataBaseInstance (
41 PCD_DATABASE
*PcdDatabase
44 return PrivatePcdDxeDatabase
= PcdDatabase
;
49 DxeGetPcdEntryWorker (
51 IN CONST GUID
*Guid
, OPTIONAL
52 IN PCD_DATA_TYPE Type
,
56 PCD_DATABASE
*Database
;
57 Database
= GetPcdDxeDataBaseInstance ();
59 GetPcdEntryWorker ( &Database
->Info
,
73 DxeSetPcdEntryWorker (
75 IN CONST GUID
*Guid
, OPTIONAL
76 IN PCD_DATA_TYPE Type
,
80 PCD_DATABASE
*Database
;
84 Database
= GetPcdDxeDataBaseInstance ();
87 ASSERT (Data
!= NULL
);
89 PcdIndex
= FindPcdIndex (TokenNumber
, Guid
, &Database
->Info
, NULL
);
91 ASSERT (PcdIndex
!= NULL
);
93 ASSERT (PcdIndex
->StateByte
.DataType
== Type
);
96 // Invoke the callback function.
99 Status
= SetPcdData (PcdIndex
, &Database
->Info
, Data
);
109 DxeGetPcdEntrySizeWorker (
110 IN UINTN TokenNumber
,
111 IN CONST GUID
*Guid OPTIONAL
114 PCD_DATABASE
*Database
;
115 Database
= GetPcdDxeDataBaseInstance ();
117 return GetPcdEntrySizeWorker (&Database
->Info
,
126 InsertToGuidSpaceListI (
127 IN LIST_ENTRY
*GuidSpaceListHead
,
128 IN CONST EFI_GUID
*Guid
131 PCD_GUID_SPACE
*GuidSpaceEntry
;
133 GuidSpaceEntry
= AllocatePool (sizeof (PCD_GUID_SPACE
));
134 ASSERT (GuidSpaceEntry
!= NULL
);
136 GuidSpaceEntry
->GuidSpace
= Guid
;
137 InitializeListHead (&GuidSpaceEntry
->TokenSpaceHead
);
139 InsertTailList (GuidSpaceListHead
, &GuidSpaceEntry
->ListNode
);
141 return &GuidSpaceEntry
->TokenSpaceHead
;
147 InsertToTokenSpaceListI (
148 IN LIST_ENTRY
*TokenSpaceListHead
,
152 PCD_TOKEN_SPACE
*TokenSpaceEntry
;
154 TokenSpaceEntry
= AllocatePool (sizeof (PCD_TOKEN_SPACE
));
155 ASSERT (TokenSpaceEntry
!= NULL
);
157 TokenSpaceEntry
->TokeNumber
= TokenNumber
;
158 InitializeListHead (&TokenSpaceEntry
->CallbackListHead
);
160 InsertTailList (TokenSpaceListHead
, &TokenSpaceEntry
->ListNode
);
162 return &TokenSpaceEntry
->CallbackListHead
;
168 InsertToCallbackListI (
169 IN LIST_ENTRY
*CallbackListHead
,
170 IN PCD_PROTOCOL_CALLBACK CallBackFunction
173 PCD_CALLBACK_ENTRY
*CallbackEntry
;
175 CallbackEntry
= AllocatePool (sizeof (PCD_CALLBACK_ENTRY
));
176 ASSERT (CallbackEntry
!= NULL
);
177 CallbackEntry
->CallbackFunction
= CallBackFunction
;
178 InsertTailList (CallbackListHead
, &CallbackEntry
->ListNode
);
187 InsertToCallbackList (
188 IN UINTN TokenNumber
,
189 IN CONST EFI_GUID
*Guid
,
190 IN PCD_PROTOCOL_CALLBACK CallBackFunction
193 LIST_ENTRY
*GuidListNode
;
194 LIST_ENTRY
*GuidListHead
;
195 LIST_ENTRY
*TokenListNode
;
196 LIST_ENTRY
*TokenListHead
;
197 LIST_ENTRY
*CallbackListHead
;
198 PCD_GUID_SPACE
*GuidSpaceEntry
;
199 PCD_TOKEN_SPACE
*TokenSpaceEntry
;
202 GuidListHead
= GetPcdDatabaseListHead ();
204 GuidListNode
= GetFirstNode (GuidListHead
);
205 while (!IsNull (GuidListNode
, GuidListHead
)) {
206 GuidSpaceEntry
= PCD_GUID_SPACE_FROM_LISTNODE(GuidListNode
);
208 if (CompareGuid (GuidSpaceEntry
->GuidSpace
, Guid
)) {
209 TokenListHead
= &GuidSpaceEntry
->TokenSpaceHead
;
210 TokenListNode
= GetFirstNode (TokenListHead
);
211 while (!IsNull (TokenListNode
, TokenListHead
)) {
212 TokenSpaceEntry
= PCD_TOKEN_SPACE_FROM_LISTNODE(TokenListNode
);
213 if (TokenSpaceEntry
->TokeNumber
== TokenNumber
) {
214 InsertToCallbackListI (&TokenSpaceEntry
->CallbackListHead
, CallBackFunction
);
219 // No TokenNumber match input found in this GuidSpace
221 CallbackListHead
= InsertToTokenSpaceListI (TokenListHead
, TokenNumber
);
222 InsertToCallbackListI (CallbackListHead
, CallBackFunction
);
225 GuidListNode
= GetNextNode (GuidListHead
, GuidListNode
);
229 // No GuidSpace match the input Guid, so build the GuidSpace, TokenNumberSpace and Callback
231 TokenListHead
= InsertToGuidSpaceListI (GuidListHead
, Guid
);
232 CallbackListHead
= InsertToTokenSpaceListI (TokenListHead
, TokenNumber
);
233 InsertToCallbackListI (CallbackListHead
, CallBackFunction
);
240 RemoveFromCallbackListI (
241 IN LIST_ENTRY
*CallbackListHead
,
242 IN PCD_PROTOCOL_CALLBACK CallBackFunction
245 LIST_ENTRY
*ListNode
;
246 PCD_CALLBACK_ENTRY
*CallbackEntry
;
248 ListNode
= GetFirstNode (CallbackListHead
);
250 while (!IsNull(CallbackListHead
, ListNode
)) {
251 CallbackEntry
= PCD_CALLBACK_ENTRY_FROM_LISTNODE(ListNode
);
253 if (CallbackEntry
->CallbackFunction
== CallBackFunction
) {
254 RemoveEntryList (ListNode
);
255 FreePool (CallbackEntry
);
258 ListNode
= GetNextNode (CallbackListHead
, ListNode
);
261 return EFI_NOT_FOUND
;
267 RemoveFromCallbackList (
268 IN UINTN TokenNumber
,
270 IN PCD_PROTOCOL_CALLBACK CallBackFunction
273 LIST_ENTRY
*GuidListNode
;
274 LIST_ENTRY
*GuidListHead
;
275 LIST_ENTRY
*TokenListNode
;
276 LIST_ENTRY
*TokenListHead
;
277 PCD_GUID_SPACE
*GuidSpaceEntry
;
278 PCD_TOKEN_SPACE
*TokenSpaceEntry
;
281 GuidListHead
= GetPcdDatabaseListHead ();
283 GuidListNode
= GetFirstNode (GuidListHead
);
284 while (!IsNull (GuidListNode
, GuidListHead
)) {
286 GuidSpaceEntry
= PCD_GUID_SPACE_FROM_LISTNODE(GuidListNode
);
287 if (CompareGuid (GuidSpaceEntry
->GuidSpace
, Guid
)) {
289 TokenListHead
= &GuidSpaceEntry
->TokenSpaceHead
;
290 TokenListNode
= GetFirstNode (TokenListHead
);
291 while (!IsNull (TokenListNode
, TokenListHead
)) {
293 TokenSpaceEntry
= PCD_TOKEN_SPACE_FROM_LISTNODE(TokenListNode
);
294 if (TokenSpaceEntry
->TokeNumber
== TokenNumber
) {
295 return RemoveFromCallbackListI (&TokenSpaceEntry
->CallbackListHead
, CallBackFunction
);
300 // No TokenNumber match input found in this GuidSpace
302 return EFI_NOT_FOUND
;
305 GuidListNode
= GetNextNode (GuidListHead
, GuidListNode
);
309 return EFI_NOT_FOUND
;
316 DxeRegisterCallBackWorker (
317 IN UINTN TokenNumber
,
318 IN CONST GUID
*Guid
, OPTIONAL
319 IN PCD_PROTOCOL_CALLBACK CallBackFunction
,
323 PCD_DATABASE
*Database
;
326 Database
= GetPcdDxeDataBaseInstance ();
328 PcdIndex
= FindPcdIndex (TokenNumber
, Guid
, &Database
->Info
, NULL
);
330 if (PcdIndex
== NULL
) {
331 return EFI_NOT_FOUND
;
335 InsertToCallbackList (TokenNumber
, Guid
, CallBackFunction
);
338 return RemoveFromCallbackList (TokenNumber
, Guid
, CallBackFunction
);
350 PCD_DATABASE
* Database
;
352 Database
= GetPcdDxeDataBaseInstance ();
354 return Database
->Info
.SkuId
= Id
;
361 DxeGetNextTokenWorker (
362 IN OUT UINTN
*TokenNumber
,
363 IN CONST GUID
*Guid OPTIONAL
366 PCD_DATABASE
* Database
;
368 Database
= GetPcdDxeDataBaseInstance ();
370 return GetNextTokenWorker (&Database
->Info
,
383 PCD_DATABASE
*PeiDatabase
;
384 PCD_DATABASE
*DxeDatabase
;
385 EFI_HOB_GUID_TYPE
*GuidHob
;
387 GuidHob
= GetFirstGuidHob (&gPcdDataBaseHobGuid
);
388 ASSERT (GuidHob
!= NULL
);
390 PeiDatabase
= (PCD_DATABASE
*) GET_GUID_HOB_DATA (GuidHob
);
392 DxeDatabase
= AllocateCopyPool (PeiDatabase
->Info
.DatabaseLen
, PeiDatabase
);
394 ASSERT (DxeDatabase
!= NULL
);
396 SetPcdDxeDataBaseInstance (DxeDatabase
);
405 IN EFI_GUID
*VariableGuid
,
406 IN UINT16
*VariableName
,
407 OUT VOID
** VariableData
,
408 OUT UINTN
*VariableSize
415 Status
= EfiGetVariable (
416 (UINT16
*)VariableName
,
422 ASSERT (Status
== EFI_BUFFER_TOO_SMALL
);
424 Buffer
= AllocatePool (Size
);
426 ASSERT (Buffer
!= NULL
);
428 Status
= EfiGetVariable (
444 IN EFI_GUID
*VariableGuid
,
445 IN UINT16
*VariableName
,
457 Status
= EfiGetVariable (
458 (UINT16
*)VariableName
,
465 ASSERT (Status
== EFI_BUFFER_TOO_SMALL
);
467 Buffer
= AllocatePool (Size
);
469 ASSERT (Buffer
!= NULL
);
471 Status
= EfiGetVariable (
480 CopyMem ((UINT8
*)Buffer
+ Offset
, Data
, DataSize
);
482 return EfiSetVariable (