3 Copyright (c) 2006, Intel Corporation
4 All rights reserved. This program and the accompanying materials
5 are licensed and made available under the terms and conditions of the BSD License
6 which accompanies this distribution. The full text of the license may be found at
7 http://opensource.org/licenses/bsd-license.php
9 THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
10 WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
20 PCD_PPI mPcdPpiInstance
= {
53 PcdRegisterCallBackOnSet
,
54 PcdUnRegisterCallBackOnSet
,
60 STATIC EFI_PEI_PPI_DESCRIPTOR mPpiPCD
= {
61 (EFI_PEI_PPI_DESCRIPTOR_PPI
| EFI_PEI_PPI_DESCRIPTOR_TERMINATE_LIST
),
71 IN EFI_FFS_FILE_HEADER
*FfsHeader
,
72 IN EFI_PEI_SERVICES
**PeiServices
79 Status
= PeiCoreInstallPpi (&mPpiPCD
);
81 ASSERT_EFI_ERROR (Status
);
93 GetPcdDatabase()->Init
.SystemSkuId
= SkuId
;
103 IN PCD_TOKEN_NUMBER TokenNumber
106 return *((UINT8
*) GetWorker (TokenNumber
, sizeof (UINT8
)));
114 IN PCD_TOKEN_NUMBER TokenNumber
117 return ReadUnaligned16 (GetWorker (TokenNumber
, sizeof (UINT16
)));
125 IN PCD_TOKEN_NUMBER TokenNumber
128 return ReadUnaligned32 (GetWorker (TokenNumber
, sizeof (UINT32
)));
136 IN PCD_TOKEN_NUMBER TokenNumber
139 return ReadUnaligned64 (GetWorker (TokenNumber
, sizeof (UINT64
)));
147 IN PCD_TOKEN_NUMBER TokenNumber
150 return GetWorker (TokenNumber
, 0);
158 IN PCD_TOKEN_NUMBER TokenNumber
161 return *((BOOLEAN
*) GetWorker (TokenNumber
, sizeof (BOOLEAN
)));
169 IN PCD_TOKEN_NUMBER TokenNumber
172 ASSERT (TokenNumber
< PEI_LOCAL_TOKEN_NUMBER
);
174 return GetPcdDatabase()->Init
.SizeTable
[TokenNumber
];
182 IN CONST EFI_GUID
*Guid
,
183 IN PCD_TOKEN_NUMBER ExTokenNumber
186 return *((UINT8
*) ExGetWorker (Guid
, ExTokenNumber
, sizeof (UINT8
)));
194 IN CONST EFI_GUID
*Guid
,
195 IN PCD_TOKEN_NUMBER ExTokenNumber
198 return ReadUnaligned16 (ExGetWorker (Guid
, ExTokenNumber
, sizeof (UINT16
)));
206 IN CONST EFI_GUID
*Guid
,
207 IN PCD_TOKEN_NUMBER ExTokenNumber
210 return ReadUnaligned32 (ExGetWorker (Guid
, ExTokenNumber
, sizeof (UINT32
)));
218 IN CONST EFI_GUID
*Guid
,
219 IN PCD_TOKEN_NUMBER ExTokenNumber
222 return ReadUnaligned64 (ExGetWorker (Guid
, ExTokenNumber
, sizeof (UINT64
)));
230 IN CONST EFI_GUID
*Guid
,
231 IN PCD_TOKEN_NUMBER ExTokenNumber
234 return ExGetWorker (Guid
, ExTokenNumber
, 0);
242 IN CONST EFI_GUID
*Guid
,
243 IN PCD_TOKEN_NUMBER ExTokenNumber
246 return *((BOOLEAN
*) ExGetWorker (Guid
, ExTokenNumber
, sizeof (BOOLEAN
)));
254 IN CONST EFI_GUID
*Guid
,
255 IN PCD_TOKEN_NUMBER ExTokenNumber
258 EX_PCD_ENTRY_ATTRIBUTE Attr
;
260 GetExPcdTokenAttributes (Guid
, ExTokenNumber
, &Attr
);
270 IN PCD_TOKEN_NUMBER TokenNumber
,
274 return SetWorker (TokenNumber
, &Value
, sizeof (Value
), FALSE
);
282 IN PCD_TOKEN_NUMBER TokenNumber
,
286 return SetWorker (TokenNumber
, &Value
, sizeof (Value
), FALSE
);
294 IN PCD_TOKEN_NUMBER TokenNumber
,
298 return SetWorker (TokenNumber
, &Value
, sizeof (Value
), FALSE
);
306 IN PCD_TOKEN_NUMBER TokenNumber
,
310 return SetWorker (TokenNumber
, &Value
, sizeof (Value
), FALSE
);
317 IN PCD_TOKEN_NUMBER TokenNumber
,
318 IN UINTN SizeOfBuffer
,
322 return SetWorker (TokenNumber
, Buffer
, SizeOfBuffer
, TRUE
);
330 IN PCD_TOKEN_NUMBER TokenNumber
,
334 return SetWorker (TokenNumber
, &Value
, sizeof (Value
), FALSE
);
342 IN CONST EFI_GUID
*Guid
,
343 IN PCD_TOKEN_NUMBER ExTokenNumber
,
361 IN CONST EFI_GUID
*Guid
,
362 IN PCD_TOKEN_NUMBER ExTokenNumber
,
380 IN CONST EFI_GUID
*Guid
,
381 IN PCD_TOKEN_NUMBER ExTokenNumber
,
399 IN CONST EFI_GUID
*Guid
,
400 IN PCD_TOKEN_NUMBER ExTokenNumber
,
418 IN CONST EFI_GUID
*Guid
,
419 IN PCD_TOKEN_NUMBER ExTokenNumber
,
420 IN UINTN SizeOfBuffer
,
438 IN CONST EFI_GUID
*Guid
,
439 IN PCD_TOKEN_NUMBER ExTokenNumber
,
457 PcdRegisterCallBackOnSet (
458 IN PCD_TOKEN_NUMBER ExTokenNumber
,
459 IN CONST EFI_GUID
*Guid
, OPTIONAL
460 IN PCD_PPI_CALLBACK CallBackFunction
463 return PeiRegisterCallBackWorker (ExTokenNumber
, Guid
, CallBackFunction
, TRUE
);
470 PcdUnRegisterCallBackOnSet (
471 IN PCD_TOKEN_NUMBER ExTokenNumber
,
472 IN CONST EFI_GUID
*Guid
, OPTIONAL
473 IN PCD_PPI_CALLBACK CallBackFunction
476 return PeiRegisterCallBackWorker (ExTokenNumber
, Guid
, CallBackFunction
, FALSE
);
484 IN CONST EFI_GUID
*Guid
, OPTIONAL
485 IN OUT PCD_TOKEN_NUMBER
*TokenNumber
489 PEI_PCD_DATABASE
*PeiPcdDb
;
491 DYNAMICEX_MAPPING
*ExMapTable
;
498 if (*TokenNumber
>= PEI_NEX_TOKEN_NUMBER
) {
504 if (PEI_EXMAP_TABLE_EMPTY
) {
505 *TokenNumber
= (UINTN
) PCD_INVALID_TOKEN_NUMBER
;
506 return EFI_NOT_FOUND
;
510 // Assume PCD Database AutoGen tool is sorting the ExMap based on the following order
514 PeiPcdDb
= GetPcdDatabase ();
516 MatchGuid
= ScanGuid (PeiPcdDb
->Init
.GuidTable
, sizeof(PeiPcdDb
->Init
.GuidTable
), Guid
);
518 if (MatchGuid
== NULL
) {
519 *TokenNumber
= (UINTN
) PCD_INVALID_TOKEN_NUMBER
;
520 return EFI_NOT_FOUND
;
523 GuidTableIdx
= MatchGuid
- PeiPcdDb
->Init
.GuidTable
;
525 ExMapTable
= PeiPcdDb
->Init
.ExMapTable
;
528 for (i
= 0; i
< PEI_EXMAPPING_TABLE_SIZE
; i
++) {
529 if (ExMapTable
[i
].ExGuidIndex
== GuidTableIdx
) {
536 if (*TokenNumber
== PCD_INVALID_TOKEN_NUMBER
) {
537 *TokenNumber
= ExMapTable
[i
].ExTokenNumber
;
541 for ( ; ExMapTable
[i
].ExGuidIndex
== GuidTableIdx
; i
++) {
542 if (ExMapTable
[i
].ExTokenNumber
== *TokenNumber
) {
544 if (ExMapTable
[i
].ExGuidIndex
== GuidTableIdx
) {
545 *TokenNumber
= ExMapTable
[i
].ExTokenNumber
;
548 *TokenNumber
= (UINTN
) PCD_INVALID_TOKEN_NUMBER
;
554 return EFI_NOT_FOUND
;
564 PeiPcdGetNextTokenSpaceGuid (
565 IN CONST EFI_GUID
*Guid
570 PEI_PCD_DATABASE
*PeiPcdDb
;
571 DYNAMICEX_MAPPING
*ExMapTable
;
575 if (PEI_EXMAP_TABLE_EMPTY
) {
580 // Assume PCD Database AutoGen tool is sorting the ExMap based on the following order
584 PeiPcdDb
= GetPcdDatabase ();
586 MatchGuid
= ScanGuid (PeiPcdDb
->Init
.GuidTable
, sizeof(PeiPcdDb
->Init
.GuidTable
), Guid
);
588 if (MatchGuid
== NULL
) {
592 GuidTableIdx
= MatchGuid
- PeiPcdDb
->Init
.GuidTable
;
594 ExMapTable
= PeiPcdDb
->Init
.ExMapTable
;
597 for (i
= 0; i
< PEI_EXMAPPING_TABLE_SIZE
; i
++) {
598 if (ExMapTable
[i
].ExGuidIndex
== GuidTableIdx
) {
605 for ( ; i
< PEI_EXMAPPING_TABLE_SIZE
; i
++ ) {
606 if (ExMapTable
[i
].ExGuidIndex
!= GuidTableIdx
) {
607 if (i
< PEI_EXMAPPING_TABLE_SIZE
) {
608 return &PeiPcdDb
->Init
.GuidTable
[ExMapTable
[i
].ExGuidIndex
];