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 PeiRegisterCallBackOnSet
,
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 PeiRegisterCallBackOnSet (
458 IN PCD_TOKEN_NUMBER ExTokenNumber
,
459 IN CONST EFI_GUID
*Guid
, OPTIONAL
460 IN PCD_PPI_CALLBACK CallBackFunction
463 ASSERT (CallBackFunction
!= NULL
);
465 return PeiRegisterCallBackWorker (ExTokenNumber
, Guid
, CallBackFunction
, TRUE
);
472 PcdUnRegisterCallBackOnSet (
473 IN PCD_TOKEN_NUMBER ExTokenNumber
,
474 IN CONST EFI_GUID
*Guid
, OPTIONAL
475 IN PCD_PPI_CALLBACK CallBackFunction
478 ASSERT (CallBackFunction
!= NULL
);
480 return PeiRegisterCallBackWorker (ExTokenNumber
, Guid
, CallBackFunction
, FALSE
);
488 IN CONST EFI_GUID
*Guid
, OPTIONAL
489 IN OUT PCD_TOKEN_NUMBER
*TokenNumber
493 PEI_PCD_DATABASE
*PeiPcdDb
;
495 DYNAMICEX_MAPPING
*ExMapTable
;
502 if (*TokenNumber
>= PEI_NEX_TOKEN_NUMBER
) {
508 if (PEI_EXMAP_TABLE_EMPTY
) {
509 *TokenNumber
= (UINTN
) PCD_INVALID_TOKEN_NUMBER
;
510 return EFI_NOT_FOUND
;
514 // Assume PCD Database AutoGen tool is sorting the ExMap based on the following order
518 PeiPcdDb
= GetPcdDatabase ();
520 MatchGuid
= ScanGuid (PeiPcdDb
->Init
.GuidTable
, sizeof(PeiPcdDb
->Init
.GuidTable
), Guid
);
522 if (MatchGuid
== NULL
) {
523 *TokenNumber
= (UINTN
) PCD_INVALID_TOKEN_NUMBER
;
524 return EFI_NOT_FOUND
;
527 GuidTableIdx
= MatchGuid
- PeiPcdDb
->Init
.GuidTable
;
529 ExMapTable
= PeiPcdDb
->Init
.ExMapTable
;
532 for (i
= 0; i
< PEI_EXMAPPING_TABLE_SIZE
; i
++) {
533 if (ExMapTable
[i
].ExGuidIndex
== GuidTableIdx
) {
540 if (*TokenNumber
== PCD_INVALID_TOKEN_NUMBER
) {
541 *TokenNumber
= ExMapTable
[i
].ExTokenNumber
;
545 for ( ; ExMapTable
[i
].ExGuidIndex
== GuidTableIdx
; i
++) {
546 if (ExMapTable
[i
].ExTokenNumber
== *TokenNumber
) {
548 if (ExMapTable
[i
].ExGuidIndex
== GuidTableIdx
) {
549 *TokenNumber
= ExMapTable
[i
].ExTokenNumber
;
552 *TokenNumber
= (UINTN
) PCD_INVALID_TOKEN_NUMBER
;
558 return EFI_NOT_FOUND
;
568 PeiPcdGetNextTokenSpaceGuid (
569 IN CONST EFI_GUID
*Guid
574 PEI_PCD_DATABASE
*PeiPcdDb
;
575 DYNAMICEX_MAPPING
*ExMapTable
;
579 if (PEI_EXMAP_TABLE_EMPTY
) {
584 // Assume PCD Database AutoGen tool is sorting the ExMap based on the following order
588 PeiPcdDb
= GetPcdDatabase ();
590 MatchGuid
= ScanGuid (PeiPcdDb
->Init
.GuidTable
, sizeof(PeiPcdDb
->Init
.GuidTable
), Guid
);
592 if (MatchGuid
== NULL
) {
596 GuidTableIdx
= MatchGuid
- PeiPcdDb
->Init
.GuidTable
;
598 ExMapTable
= PeiPcdDb
->Init
.ExMapTable
;
601 for (i
= 0; i
< PEI_EXMAPPING_TABLE_SIZE
; i
++) {
602 if (ExMapTable
[i
].ExGuidIndex
== GuidTableIdx
) {
609 for ( ; i
< PEI_EXMAPPING_TABLE_SIZE
; i
++ ) {
610 if (ExMapTable
[i
].ExGuidIndex
!= GuidTableIdx
) {
611 if (i
< PEI_EXMAPPING_TABLE_SIZE
) {
612 return &PeiPcdDb
->Init
.GuidTable
[ExMapTable
[i
].ExGuidIndex
];