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 return *((UINT8
*) GetWorker (TokenNumber
, sizeof (UINT8
)));
127 IN PCD_TOKEN_NUMBER TokenNumber
130 return ReadUnaligned16 (GetWorker (TokenNumber
, sizeof (UINT16
)));
138 IN PCD_TOKEN_NUMBER TokenNumber
141 return ReadUnaligned32 (GetWorker (TokenNumber
, sizeof (UINT32
)));
149 IN PCD_TOKEN_NUMBER TokenNumber
152 return ReadUnaligned64(GetWorker (TokenNumber
, sizeof (UINT64
)));
160 IN PCD_TOKEN_NUMBER TokenNumber
163 return GetWorker (TokenNumber
, 0);
171 IN PCD_TOKEN_NUMBER TokenNumber
174 return *((BOOLEAN
*) GetWorker (TokenNumber
, sizeof (BOOLEAN
)));
182 IN PCD_TOKEN_NUMBER TokenNumber
187 SizeTable
= (TokenNumber
< PEI_LOCAL_TOKEN_NUMBER
) ? mPcdDatabase
->PeiDb
.Init
.SizeTable
:
188 mPcdDatabase
->DxeDb
.Init
.SizeTable
;
191 TokenNumber
= (TokenNumber
< PEI_LOCAL_TOKEN_NUMBER
) ? TokenNumber
: (TokenNumber
- PEI_LOCAL_TOKEN_NUMBER
);
193 return SizeTable
[TokenNumber
];
201 IN CONST EFI_GUID
*Guid
,
202 IN PCD_TOKEN_NUMBER ExTokenNumber
205 return *((UINT8
*) ExGetWorker (Guid
, ExTokenNumber
, sizeof(UINT8
)));
213 IN CONST EFI_GUID
*Guid
,
214 IN PCD_TOKEN_NUMBER ExTokenNumber
217 return ReadUnaligned16 (ExGetWorker (Guid
, ExTokenNumber
, sizeof(UINT16
)));
225 IN CONST EFI_GUID
*Guid
,
226 IN PCD_TOKEN_NUMBER ExTokenNumber
229 return ReadUnaligned32 (ExGetWorker (Guid
, ExTokenNumber
, sizeof(UINT32
)));
237 IN CONST EFI_GUID
*Guid
,
238 IN PCD_TOKEN_NUMBER ExTokenNumber
241 return ReadUnaligned64 (ExGetWorker (Guid
, ExTokenNumber
, sizeof(UINT64
)));
249 IN CONST EFI_GUID
*Guid
,
250 IN PCD_TOKEN_NUMBER ExTokenNumber
253 return ExGetWorker (Guid
, ExTokenNumber
, 0);
261 IN CONST EFI_GUID
*Guid
,
262 IN PCD_TOKEN_NUMBER ExTokenNumber
265 return *((BOOLEAN
*) ExGetWorker (Guid
, ExTokenNumber
, sizeof(BOOLEAN
)));
273 IN CONST EFI_GUID
*Guid
,
274 IN PCD_TOKEN_NUMBER ExTokenNumber
277 return DxePcdGetSize(GetExPcdTokenNumber (Guid
, ExTokenNumber
));
285 IN PCD_TOKEN_NUMBER TokenNumber
,
289 return SetWorker (TokenNumber
, &Value
, sizeof (Value
), FALSE
);
297 IN PCD_TOKEN_NUMBER TokenNumber
,
301 return SetWorker (TokenNumber
, &Value
, sizeof (Value
), FALSE
);
309 IN PCD_TOKEN_NUMBER TokenNumber
,
313 return SetWorker (TokenNumber
, &Value
, sizeof (Value
), FALSE
);
321 IN PCD_TOKEN_NUMBER TokenNumber
,
325 return SetWorker (TokenNumber
, &Value
, sizeof (Value
), FALSE
);
333 IN PCD_TOKEN_NUMBER TokenNumber
,
334 IN UINTN SizeOfBuffer
,
338 return SetWorker (TokenNumber
, Buffer
, SizeOfBuffer
, TRUE
);
346 IN PCD_TOKEN_NUMBER TokenNumber
,
350 return SetWorker (TokenNumber
, &Value
, sizeof (Value
), FALSE
);
358 IN CONST EFI_GUID
*Guid
,
359 IN PCD_TOKEN_NUMBER ExTokenNumber
,
377 IN CONST EFI_GUID
*Guid
,
378 IN PCD_TOKEN_NUMBER ExTokenNumber
,
396 IN CONST EFI_GUID
*Guid
,
397 IN PCD_TOKEN_NUMBER ExTokenNumber
,
415 IN CONST EFI_GUID
*Guid
,
416 IN PCD_TOKEN_NUMBER ExTokenNumber
,
434 IN CONST EFI_GUID
*Guid
,
435 IN PCD_TOKEN_NUMBER ExTokenNumber
,
436 IN UINTN SizeOfBuffer
,
454 IN CONST EFI_GUID
*Guid
,
455 IN PCD_TOKEN_NUMBER ExTokenNumber
,
473 DxeRegisterCallBackOnSet (
474 IN PCD_TOKEN_NUMBER TokenNumber
,
475 IN CONST EFI_GUID
*Guid
, OPTIONAL
476 IN PCD_PROTOCOL_CALLBACK CallBackFunction
479 ASSERT (CallBackFunction
!= NULL
);
481 return DxeRegisterCallBackWorker (TokenNumber
, Guid
, CallBackFunction
);
488 DxeUnRegisterCallBackOnSet (
489 IN PCD_TOKEN_NUMBER TokenNumber
,
490 IN CONST EFI_GUID
*Guid
, OPTIONAL
491 IN PCD_PROTOCOL_CALLBACK CallBackFunction
494 ASSERT (CallBackFunction
!= NULL
);
496 return DxeRegisterCallBackWorker (TokenNumber
, Guid
, CallBackFunction
);
504 IN CONST EFI_GUID
*Guid
, OPTIONAL
505 IN OUT PCD_TOKEN_NUMBER
*TokenNumber
508 PCD_TOKEN_NUMBER ExTokenNumber
;
511 // Scan the local token space
515 if (*TokenNumber
== PCD_INVALID_TOKEN_NUMBER
) {
518 if (*TokenNumber
>= PEI_NEX_TOKEN_NUMBER
&&
519 *TokenNumber
< PEI_LOCAL_TOKEN_NUMBER
) {
521 // The first Non-Ex type Token Number for DXE PCD
522 // database is PEI_LOCAL_TOKEN_NUMBER
524 *TokenNumber
= PEI_LOCAL_TOKEN_NUMBER
;
526 } else if (*TokenNumber
>= DXE_NEX_TOKEN_NUMBER
+ PEI_LOCAL_TOKEN_NUMBER
) {
527 *TokenNumber
= PCD_INVALID_TOKEN_NUMBER
;
533 if (PEI_EXMAP_TABLE_EMPTY
&& PEI_EXMAP_TABLE_EMPTY
) {
534 *TokenNumber
= (UINTN
) PCD_INVALID_TOKEN_NUMBER
;
535 return EFI_NOT_FOUND
;
538 ExTokenNumber
= *TokenNumber
;
539 if (!PEI_EXMAP_TABLE_EMPTY
) {
540 ExTokenNumber
= ExGetNextTokeNumber (
543 mPcdDatabase
->PeiDb
.Init
.GuidTable
,
544 sizeof(mPcdDatabase
->PeiDb
.Init
.GuidTable
),
545 mPcdDatabase
->PeiDb
.Init
.ExMapTable
,
546 sizeof(mPcdDatabase
->PeiDb
.Init
.ExMapTable
)
550 if (!DXE_EXMAP_TABLE_EMPTY
) {
551 ExTokenNumber
= ExGetNextTokeNumber (
554 mPcdDatabase
->PeiDb
.Init
.GuidTable
,
555 sizeof(mPcdDatabase
->PeiDb
.Init
.GuidTable
),
556 mPcdDatabase
->PeiDb
.Init
.ExMapTable
,
557 sizeof(mPcdDatabase
->PeiDb
.Init
.ExMapTable
)
561 *TokenNumber
= ExTokenNumber
;