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
,
56 PeiPcdGetNextTokenSpace
61 STATIC EFI_PEI_PPI_DESCRIPTOR mPpiPCD
= {
62 (EFI_PEI_PPI_DESCRIPTOR_PPI
| EFI_PEI_PPI_DESCRIPTOR_TERMINATE_LIST
),
72 IN EFI_FFS_FILE_HEADER
*FfsHeader
,
73 IN EFI_PEI_SERVICES
**PeiServices
80 Status
= PeiServicesInstallPpi (&mPpiPCD
);
82 ASSERT_EFI_ERROR (Status
);
94 GetPcdDatabase()->Init
.SystemSkuId
= (SKU_ID
) SkuId
;
107 return *((UINT8
*) GetWorker (TokenNumber
, sizeof (UINT8
)));
118 return ReadUnaligned16 (GetWorker (TokenNumber
, sizeof (UINT16
)));
129 return ReadUnaligned32 (GetWorker (TokenNumber
, sizeof (UINT32
)));
140 return ReadUnaligned64 (GetWorker (TokenNumber
, sizeof (UINT64
)));
151 return GetWorker (TokenNumber
, 0);
162 return *((BOOLEAN
*) GetWorker (TokenNumber
, sizeof (BOOLEAN
)));
174 // TokenNumber Zero is reserved as PCD_INVALID_TOKEN_NUMBER.
175 // We have to decrement TokenNumber by 1 to make it usable
176 // as the array index.
180 ASSERT (TokenNumber
< PEI_LOCAL_TOKEN_NUMBER
);
182 return GetPcdDatabase()->Init
.SizeTable
[TokenNumber
];
190 IN CONST EFI_GUID
*Guid
,
191 IN UINTN ExTokenNumber
194 return *((UINT8
*) ExGetWorker (Guid
, ExTokenNumber
, sizeof (UINT8
)));
202 IN CONST EFI_GUID
*Guid
,
203 IN UINTN ExTokenNumber
206 return ReadUnaligned16 (ExGetWorker (Guid
, ExTokenNumber
, sizeof (UINT16
)));
214 IN CONST EFI_GUID
*Guid
,
215 IN UINTN ExTokenNumber
218 return ReadUnaligned32 (ExGetWorker (Guid
, ExTokenNumber
, sizeof (UINT32
)));
226 IN CONST EFI_GUID
*Guid
,
227 IN UINTN ExTokenNumber
230 return ReadUnaligned64 (ExGetWorker (Guid
, ExTokenNumber
, sizeof (UINT64
)));
238 IN CONST EFI_GUID
*Guid
,
239 IN UINTN ExTokenNumber
242 return ExGetWorker (Guid
, ExTokenNumber
, 0);
250 IN CONST EFI_GUID
*Guid
,
251 IN UINTN ExTokenNumber
254 return *((BOOLEAN
*) ExGetWorker (Guid
, ExTokenNumber
, sizeof (BOOLEAN
)));
262 IN CONST EFI_GUID
*Guid
,
263 IN UINTN ExTokenNumber
266 return PeiPcdGetSize (GetExPcdTokenNumber (Guid
, ExTokenNumber
));
274 IN UINTN TokenNumber
,
278 return SetWorker (TokenNumber
, &Value
, sizeof (Value
), FALSE
);
286 IN UINTN TokenNumber
,
290 return SetWorker (TokenNumber
, &Value
, sizeof (Value
), FALSE
);
298 IN UINTN TokenNumber
,
302 return SetWorker (TokenNumber
, &Value
, sizeof (Value
), FALSE
);
310 IN UINTN TokenNumber
,
314 return SetWorker (TokenNumber
, &Value
, sizeof (Value
), FALSE
);
321 IN UINTN TokenNumber
,
322 IN UINTN SizeOfBuffer
,
326 return SetWorker (TokenNumber
, Buffer
, SizeOfBuffer
, TRUE
);
334 IN UINTN TokenNumber
,
338 return SetWorker (TokenNumber
, &Value
, sizeof (Value
), FALSE
);
346 IN CONST EFI_GUID
*Guid
,
347 IN UINTN ExTokenNumber
,
365 IN CONST EFI_GUID
*Guid
,
366 IN UINTN ExTokenNumber
,
384 IN CONST EFI_GUID
*Guid
,
385 IN UINTN ExTokenNumber
,
403 IN CONST EFI_GUID
*Guid
,
404 IN UINTN ExTokenNumber
,
422 IN CONST EFI_GUID
*Guid
,
423 IN UINTN ExTokenNumber
,
424 IN UINTN SizeOfBuffer
,
442 IN CONST EFI_GUID
*Guid
,
443 IN UINTN ExTokenNumber
,
461 PeiRegisterCallBackOnSet (
462 IN UINTN ExTokenNumber
,
463 IN CONST EFI_GUID
*Guid
, OPTIONAL
464 IN PCD_PPI_CALLBACK CallBackFunction
467 ASSERT (CallBackFunction
!= NULL
);
469 return PeiRegisterCallBackWorker (ExTokenNumber
, Guid
, CallBackFunction
, TRUE
);
476 PcdUnRegisterCallBackOnSet (
477 IN UINTN ExTokenNumber
,
478 IN CONST EFI_GUID
*Guid
, OPTIONAL
479 IN PCD_PPI_CALLBACK CallBackFunction
482 ASSERT (CallBackFunction
!= NULL
);
484 return PeiRegisterCallBackWorker (ExTokenNumber
, Guid
, CallBackFunction
, FALSE
);
492 IN CONST EFI_GUID
*Guid
, OPTIONAL
493 IN OUT UINTN
*TokenNumber
497 PEI_PCD_DATABASE
*PeiPcdDb
;
499 DYNAMICEX_MAPPING
*ExMapTable
;
506 if (*TokenNumber
>= PEI_NEX_TOKEN_NUMBER
) {
507 *TokenNumber
= PCD_INVALID_TOKEN_NUMBER
;
512 if (PEI_EXMAP_TABLE_EMPTY
) {
513 *TokenNumber
= PCD_INVALID_TOKEN_NUMBER
;
514 return EFI_NOT_FOUND
;
518 // Assume PCD Database AutoGen tool is sorting the ExMap based on the following order
522 PeiPcdDb
= GetPcdDatabase ();
524 MatchGuid
= ScanGuid (PeiPcdDb
->Init
.GuidTable
, sizeof(PeiPcdDb
->Init
.GuidTable
), Guid
);
526 if (MatchGuid
== NULL
) {
527 *TokenNumber
= (UINTN
) PCD_INVALID_TOKEN_NUMBER
;
528 return EFI_NOT_FOUND
;
531 GuidTableIdx
= MatchGuid
- PeiPcdDb
->Init
.GuidTable
;
533 ExMapTable
= PeiPcdDb
->Init
.ExMapTable
;
536 for (i
= 0; i
< PEI_EXMAPPING_TABLE_SIZE
; i
++) {
537 if (ExMapTable
[i
].ExGuidIndex
== GuidTableIdx
) {
544 if (*TokenNumber
== PCD_INVALID_TOKEN_NUMBER
) {
545 *TokenNumber
= ExMapTable
[i
].ExTokenNumber
;
549 for ( ; ExMapTable
[i
].ExGuidIndex
== GuidTableIdx
; i
++) {
550 if (ExMapTable
[i
].ExTokenNumber
== *TokenNumber
) {
552 if (ExMapTable
[i
].ExGuidIndex
== GuidTableIdx
) {
553 *TokenNumber
= ExMapTable
[i
].ExTokenNumber
;
556 *TokenNumber
= (UINTN
) PCD_INVALID_TOKEN_NUMBER
;
562 return EFI_NOT_FOUND
;
572 PeiPcdGetNextTokenSpace (
573 IN OUT CONST EFI_GUID
**Guid
578 PEI_PCD_DATABASE
*PeiPcdDb
;
579 DYNAMICEX_MAPPING
*ExMapTable
;
583 ASSERT (Guid
!= NULL
);
585 if (PEI_EXMAP_TABLE_EMPTY
) {
587 return EFI_NOT_FOUND
;
594 // Assume PCD Database AutoGen tool is sorting the ExMap based on the following order
598 PeiPcdDb
= GetPcdDatabase ();
600 ExMapTable
= PeiPcdDb
->Init
.ExMapTable
;
604 // return the first Token Space Guid.
606 *Guid
= &PeiPcdDb
->Init
.GuidTable
[ExMapTable
[0].ExGuidIndex
];
610 MatchGuid
= ScanGuid (PeiPcdDb
->Init
.GuidTable
, sizeof(PeiPcdDb
->Init
.GuidTable
), *Guid
);
612 if (MatchGuid
== NULL
) {
613 return EFI_NOT_FOUND
;
616 GuidTableIdx
= MatchGuid
- PeiPcdDb
->Init
.GuidTable
;
619 for (i
= 0; i
< PEI_EXMAPPING_TABLE_SIZE
; i
++) {
620 if (ExMapTable
[i
].ExGuidIndex
== GuidTableIdx
) {
628 for ( ; i
< PEI_EXMAPPING_TABLE_SIZE
; i
++ ) {
629 if (ExMapTable
[i
].ExGuidIndex
!= GuidTableIdx
) {
630 *Guid
= &PeiPcdDb
->Init
.GuidTable
[ExMapTable
[i
].ExGuidIndex
];
638 return EFI_NOT_FOUND
;