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.
21 PCD_PROTOCOL mPcdInstance
= {
54 DxeRegisterCallBackOnSet
,
55 DxeUnRegisterCallBackOnSet
,
61 // Static global to reduce the code size
63 static EFI_HANDLE NewHandle
= NULL
;
68 IN EFI_HANDLE ImageHandle
,
69 IN EFI_SYSTEM_TABLE
*SystemTable
75 // Make sure the Pcd Protocol is not already installed in the system
78 ASSERT_PROTOCOL_ALREADY_INSTALLED (NULL
, &gPcdProtocolGuid
);
80 BuildPcdDxeDataBase ();
83 // BugBug Check if PcdDatabase is already installed.
86 Status
= gBS
->InstallProtocolInterface (
93 ASSERT_EFI_ERROR (Status
);
106 mPcdDatabase
->PeiDb
.Init
.SystemSkuId
= SkuId
;
116 IN PCD_TOKEN_NUMBER TokenNumber
119 ASSERT (sizeof (UINT8
) == DxePcdGetSize (TokenNumber
));
121 return *((UINT8
*) GetWorker (TokenNumber
));
129 IN PCD_TOKEN_NUMBER TokenNumber
132 ASSERT (sizeof (UINT16
) == DxePcdGetSize (TokenNumber
));
134 return ReadUnaligned16 (GetWorker (TokenNumber
));
142 IN PCD_TOKEN_NUMBER TokenNumber
145 ASSERT (sizeof (UINT32
) == DxePcdGetSize (TokenNumber
));
147 return ReadUnaligned32 (GetWorker (TokenNumber
));
155 IN PCD_TOKEN_NUMBER TokenNumber
158 ASSERT (sizeof (UINT64
) == DxePcdGetSize (TokenNumber
));
160 return ReadUnaligned64(GetWorker (TokenNumber
));
168 IN PCD_TOKEN_NUMBER TokenNumber
171 return GetWorker (TokenNumber
);
179 IN PCD_TOKEN_NUMBER TokenNumber
182 ASSERT (sizeof (BOOLEAN
) == DxePcdGetSize (TokenNumber
));
184 return *((BOOLEAN
*) GetWorker (TokenNumber
));
192 IN PCD_TOKEN_NUMBER TokenNumber
197 SizeTable
= (TokenNumber
< PEI_LOCAL_TOKEN_NUMBER
) ? mPcdDatabase
->PeiDb
.Init
.SizeTable
:
198 mPcdDatabase
->DxeDb
.Init
.SizeTable
;
201 TokenNumber
= (TokenNumber
< PEI_LOCAL_TOKEN_NUMBER
) ? TokenNumber
: (TokenNumber
- PEI_LOCAL_TOKEN_NUMBER
);
203 return SizeTable
[TokenNumber
];
211 IN CONST EFI_GUID
*Guid
,
212 IN PCD_TOKEN_NUMBER ExTokenNumber
215 return *((UINT8
*) ExGetWorker (Guid
, ExTokenNumber
, sizeof(UINT8
)));
223 IN CONST EFI_GUID
*Guid
,
224 IN PCD_TOKEN_NUMBER ExTokenNumber
227 return *((UINT16
*) ExGetWorker (Guid
, ExTokenNumber
, sizeof(UINT16
)));
235 IN CONST EFI_GUID
*Guid
,
236 IN PCD_TOKEN_NUMBER ExTokenNumber
239 return *((UINT32
*) ExGetWorker (Guid
, ExTokenNumber
, sizeof(UINT32
)));
247 IN CONST EFI_GUID
*Guid
,
248 IN PCD_TOKEN_NUMBER ExTokenNumber
252 // BugBug: Must be changed to ReadUnaligned64
254 return *((UINT64
*) ExGetWorker (Guid
, ExTokenNumber
, sizeof(UINT64
)));
262 IN CONST EFI_GUID
*Guid
,
263 IN PCD_TOKEN_NUMBER ExTokenNumber
266 return ExGetWorker (Guid
, ExTokenNumber
, 0);
274 IN CONST EFI_GUID
*Guid
,
275 IN PCD_TOKEN_NUMBER ExTokenNumber
278 return *((BOOLEAN
*) ExGetWorker (Guid
, ExTokenNumber
, sizeof(BOOLEAN
)));
286 IN CONST EFI_GUID
*Guid
,
287 IN PCD_TOKEN_NUMBER ExTokenNumber
290 EX_PCD_ENTRY_ATTRIBUTE Attr
;
292 GetExPcdTokenAttributes (Guid
, ExTokenNumber
, &Attr
);
302 IN PCD_TOKEN_NUMBER TokenNumber
,
306 return SetWorker (TokenNumber
, &Value
, sizeof (Value
), FALSE
);
314 IN PCD_TOKEN_NUMBER TokenNumber
,
318 return SetWorker (TokenNumber
, &Value
, sizeof (Value
), FALSE
);
326 IN PCD_TOKEN_NUMBER TokenNumber
,
330 return SetWorker (TokenNumber
, &Value
, sizeof (Value
), FALSE
);
338 IN PCD_TOKEN_NUMBER TokenNumber
,
342 return SetWorker (TokenNumber
, &Value
, sizeof (Value
), FALSE
);
350 IN PCD_TOKEN_NUMBER TokenNumber
,
351 IN UINTN SizeOfBuffer
,
355 return SetWorker (TokenNumber
, Buffer
, SizeOfBuffer
, TRUE
);
363 IN PCD_TOKEN_NUMBER TokenNumber
,
367 return SetWorker (TokenNumber
, &Value
, sizeof (Value
), FALSE
);
375 IN CONST EFI_GUID
*Guid
,
376 IN PCD_TOKEN_NUMBER ExTokenNumber
,
394 IN CONST EFI_GUID
*Guid
,
395 IN PCD_TOKEN_NUMBER ExTokenNumber
,
413 IN CONST EFI_GUID
*Guid
,
414 IN PCD_TOKEN_NUMBER ExTokenNumber
,
432 IN CONST EFI_GUID
*Guid
,
433 IN PCD_TOKEN_NUMBER ExTokenNumber
,
451 IN CONST EFI_GUID
*Guid
,
452 IN PCD_TOKEN_NUMBER ExTokenNumber
,
453 IN UINTN SizeOfBuffer
,
471 IN CONST EFI_GUID
*Guid
,
472 IN PCD_TOKEN_NUMBER ExTokenNumber
,
490 DxeRegisterCallBackOnSet (
491 IN PCD_TOKEN_NUMBER TokenNumber
,
492 IN CONST EFI_GUID
*Guid
, OPTIONAL
493 IN PCD_PROTOCOL_CALLBACK CallBackFunction
496 ASSERT (CallBackFunction
!= NULL
);
498 return DxeRegisterCallBackWorker (TokenNumber
, Guid
, CallBackFunction
);
505 DxeUnRegisterCallBackOnSet (
506 IN PCD_TOKEN_NUMBER TokenNumber
,
507 IN CONST EFI_GUID
*Guid
, OPTIONAL
508 IN PCD_PROTOCOL_CALLBACK CallBackFunction
511 ASSERT (CallBackFunction
!= NULL
);
513 return DxeRegisterCallBackWorker (TokenNumber
, Guid
, CallBackFunction
);
521 IN CONST EFI_GUID
*Guid
, OPTIONAL
522 IN OUT PCD_TOKEN_NUMBER
*TokenNumber
525 PCD_TOKEN_NUMBER ExTokenNumber
;
528 // Scan the local token space
532 if (*TokenNumber
== PCD_INVALID_TOKEN_NUMBER
) {
535 if (*TokenNumber
>= PEI_NEX_TOKEN_NUMBER
&&
536 *TokenNumber
< PEI_LOCAL_TOKEN_NUMBER
) {
538 // The first Non-Ex type Token Number for DXE PCD
539 // database is PEI_LOCAL_TOKEN_NUMBER
541 *TokenNumber
= PEI_LOCAL_TOKEN_NUMBER
;
543 } else if (*TokenNumber
>= DXE_NEX_TOKEN_NUMBER
+ PEI_LOCAL_TOKEN_NUMBER
) {
544 *TokenNumber
= PCD_INVALID_TOKEN_NUMBER
;
550 if (PEI_EXMAP_TABLE_EMPTY
&& PEI_EXMAP_TABLE_EMPTY
) {
551 *TokenNumber
= (UINTN
) PCD_INVALID_TOKEN_NUMBER
;
552 return EFI_NOT_FOUND
;
555 ExTokenNumber
= *TokenNumber
;
556 if (!PEI_EXMAP_TABLE_EMPTY
) {
557 ExTokenNumber
= ExGetNextTokeNumber (
560 mPcdDatabase
->PeiDb
.Init
.GuidTable
,
561 sizeof(mPcdDatabase
->PeiDb
.Init
.GuidTable
),
562 mPcdDatabase
->PeiDb
.Init
.ExMapTable
,
563 sizeof(mPcdDatabase
->PeiDb
.Init
.ExMapTable
)
567 if (!DXE_EXMAP_TABLE_EMPTY
) {
568 ExTokenNumber
= ExGetNextTokeNumber (
571 mPcdDatabase
->PeiDb
.Init
.GuidTable
,
572 sizeof(mPcdDatabase
->PeiDb
.Init
.GuidTable
),
573 mPcdDatabase
->PeiDb
.Init
.ExMapTable
,
574 sizeof(mPcdDatabase
->PeiDb
.Init
.ExMapTable
)
578 *TokenNumber
= ExTokenNumber
;