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
= PeiServicesInstallPpi (&mPpiPCD
);
81 ASSERT_EFI_ERROR (Status
);
93 GetPcdDatabase()->Init
.SystemSkuId
= (SKU_ID
) SkuId
;
106 return *((UINT8
*) GetWorker (TokenNumber
, sizeof (UINT8
)));
117 return ReadUnaligned16 (GetWorker (TokenNumber
, sizeof (UINT16
)));
128 return ReadUnaligned32 (GetWorker (TokenNumber
, sizeof (UINT32
)));
139 return ReadUnaligned64 (GetWorker (TokenNumber
, sizeof (UINT64
)));
150 return GetWorker (TokenNumber
, 0);
161 return *((BOOLEAN
*) GetWorker (TokenNumber
, sizeof (BOOLEAN
)));
173 // TokenNumber Zero is reserved as PCD_INVALID_TOKEN_NUMBER.
174 // We have to decrement TokenNumber by 1 to make it usable
175 // as the array index.
179 ASSERT (TokenNumber
< PEI_LOCAL_TOKEN_NUMBER
);
181 return GetPcdDatabase()->Init
.SizeTable
[TokenNumber
];
189 IN CONST EFI_GUID
*Guid
,
190 IN UINTN ExTokenNumber
193 return *((UINT8
*) ExGetWorker (Guid
, ExTokenNumber
, sizeof (UINT8
)));
201 IN CONST EFI_GUID
*Guid
,
202 IN UINTN ExTokenNumber
205 return ReadUnaligned16 (ExGetWorker (Guid
, ExTokenNumber
, sizeof (UINT16
)));
213 IN CONST EFI_GUID
*Guid
,
214 IN UINTN ExTokenNumber
217 return ReadUnaligned32 (ExGetWorker (Guid
, ExTokenNumber
, sizeof (UINT32
)));
225 IN CONST EFI_GUID
*Guid
,
226 IN UINTN ExTokenNumber
229 return ReadUnaligned64 (ExGetWorker (Guid
, ExTokenNumber
, sizeof (UINT64
)));
237 IN CONST EFI_GUID
*Guid
,
238 IN UINTN ExTokenNumber
241 return ExGetWorker (Guid
, ExTokenNumber
, 0);
249 IN CONST EFI_GUID
*Guid
,
250 IN UINTN ExTokenNumber
253 return *((BOOLEAN
*) ExGetWorker (Guid
, ExTokenNumber
, sizeof (BOOLEAN
)));
261 IN CONST EFI_GUID
*Guid
,
262 IN UINTN ExTokenNumber
265 return PeiPcdGetSize (GetExPcdTokenNumber (Guid
, ExTokenNumber
));
273 IN UINTN TokenNumber
,
277 return SetWorker (TokenNumber
, &Value
, sizeof (Value
), FALSE
);
285 IN UINTN TokenNumber
,
289 return SetWorker (TokenNumber
, &Value
, sizeof (Value
), FALSE
);
297 IN UINTN TokenNumber
,
301 return SetWorker (TokenNumber
, &Value
, sizeof (Value
), FALSE
);
309 IN UINTN TokenNumber
,
313 return SetWorker (TokenNumber
, &Value
, sizeof (Value
), FALSE
);
320 IN UINTN TokenNumber
,
321 IN UINTN SizeOfBuffer
,
325 return SetWorker (TokenNumber
, Buffer
, SizeOfBuffer
, TRUE
);
333 IN UINTN TokenNumber
,
337 return SetWorker (TokenNumber
, &Value
, sizeof (Value
), FALSE
);
345 IN CONST EFI_GUID
*Guid
,
346 IN UINTN ExTokenNumber
,
364 IN CONST EFI_GUID
*Guid
,
365 IN UINTN ExTokenNumber
,
383 IN CONST EFI_GUID
*Guid
,
384 IN UINTN ExTokenNumber
,
402 IN CONST EFI_GUID
*Guid
,
403 IN UINTN ExTokenNumber
,
421 IN CONST EFI_GUID
*Guid
,
422 IN UINTN ExTokenNumber
,
423 IN UINTN SizeOfBuffer
,
441 IN CONST EFI_GUID
*Guid
,
442 IN UINTN ExTokenNumber
,
460 PeiRegisterCallBackOnSet (
461 IN UINTN ExTokenNumber
,
462 IN CONST EFI_GUID
*Guid
, OPTIONAL
463 IN PCD_PPI_CALLBACK CallBackFunction
466 ASSERT (CallBackFunction
!= NULL
);
468 return PeiRegisterCallBackWorker (ExTokenNumber
, Guid
, CallBackFunction
, TRUE
);
475 PcdUnRegisterCallBackOnSet (
476 IN UINTN ExTokenNumber
,
477 IN CONST EFI_GUID
*Guid
, OPTIONAL
478 IN PCD_PPI_CALLBACK CallBackFunction
481 ASSERT (CallBackFunction
!= NULL
);
483 return PeiRegisterCallBackWorker (ExTokenNumber
, Guid
, CallBackFunction
, FALSE
);
491 IN CONST EFI_GUID
*Guid
, OPTIONAL
492 IN OUT UINTN
*TokenNumber
496 PEI_PCD_DATABASE
*PeiPcdDb
;
498 DYNAMICEX_MAPPING
*ExMapTable
;
505 if (*TokenNumber
>= PEI_NEX_TOKEN_NUMBER
) {
506 *TokenNumber
= PCD_INVALID_TOKEN_NUMBER
;
511 if (PEI_EXMAP_TABLE_EMPTY
) {
512 *TokenNumber
= PCD_INVALID_TOKEN_NUMBER
;
513 return EFI_NOT_FOUND
;
517 // Assume PCD Database AutoGen tool is sorting the ExMap based on the following order
521 PeiPcdDb
= GetPcdDatabase ();
523 MatchGuid
= ScanGuid (PeiPcdDb
->Init
.GuidTable
, sizeof(PeiPcdDb
->Init
.GuidTable
), Guid
);
525 if (MatchGuid
== NULL
) {
526 *TokenNumber
= (UINTN
) PCD_INVALID_TOKEN_NUMBER
;
527 return EFI_NOT_FOUND
;
530 GuidTableIdx
= MatchGuid
- PeiPcdDb
->Init
.GuidTable
;
532 ExMapTable
= PeiPcdDb
->Init
.ExMapTable
;
535 for (i
= 0; i
< PEI_EXMAPPING_TABLE_SIZE
; i
++) {
536 if (ExMapTable
[i
].ExGuidIndex
== GuidTableIdx
) {
543 if (*TokenNumber
== PCD_INVALID_TOKEN_NUMBER
) {
544 *TokenNumber
= ExMapTable
[i
].ExTokenNumber
;
548 for ( ; ExMapTable
[i
].ExGuidIndex
== GuidTableIdx
; i
++) {
549 if (ExMapTable
[i
].ExTokenNumber
== *TokenNumber
) {
551 if (ExMapTable
[i
].ExGuidIndex
== GuidTableIdx
) {
552 *TokenNumber
= ExMapTable
[i
].ExTokenNumber
;
555 *TokenNumber
= (UINTN
) PCD_INVALID_TOKEN_NUMBER
;
561 return EFI_NOT_FOUND
;
571 PeiPcdGetNextTokenSpaceGuid (
572 IN OUT CONST EFI_GUID
**Guid
577 PEI_PCD_DATABASE
*PeiPcdDb
;
578 DYNAMICEX_MAPPING
*ExMapTable
;
583 if (PEI_EXMAP_TABLE_EMPTY
) {
587 // return the first Token Space Guid.
589 *Guid
= &PeiPcdDb
->Init
.GuidTable
[ExMapTable
[0].ExGuidIndex
];
595 // Assume PCD Database AutoGen tool is sorting the ExMap based on the following order
599 PeiPcdDb
= GetPcdDatabase ();
601 MatchGuid
= ScanGuid (PeiPcdDb
->Init
.GuidTable
, sizeof(PeiPcdDb
->Init
.GuidTable
), *Guid
);
603 if (MatchGuid
== NULL
) {
604 return EFI_NOT_FOUND
;
607 GuidTableIdx
= MatchGuid
- PeiPcdDb
->Init
.GuidTable
;
609 ExMapTable
= PeiPcdDb
->Init
.ExMapTable
;
612 for (i
= 0; i
< PEI_EXMAPPING_TABLE_SIZE
; i
++) {
613 if (ExMapTable
[i
].ExGuidIndex
== GuidTableIdx
) {
620 for ( ; i
< PEI_EXMAPPING_TABLE_SIZE
; i
++ ) {
621 if (ExMapTable
[i
].ExGuidIndex
!= GuidTableIdx
) {
622 *Guid
= &PeiPcdDb
->Init
.GuidTable
[ExMapTable
[i
].ExGuidIndex
];
628 return EFI_NOT_FOUND
;