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
)));
173 PEI_PCD_DATABASE
*PeiPcdDb
;
177 PeiPcdDb
= GetPcdDatabase ();
179 // TokenNumber Zero is reserved as PCD_INVALID_TOKEN_NUMBER.
180 // We have to decrement TokenNumber by 1 to make it usable
181 // as the array index.
185 // EBC compiler is very choosy. It may report warning about comparison
186 // between UINTN and 0 . So we add 1 in each size of the
188 ASSERT (TokenNumber
+ 1 < PEI_LOCAL_TOKEN_NUMBER
+ 1);
190 Size
= (PeiPcdDb
->Init
.LocalTokenNumberTable
[TokenNumber
] & PCD_DATUM_TYPE_ALL_SET
) >> PCD_DATUM_TYPE_SHIFT
;
194 // For pointer type, we need to scan the SIZE_TABLE to get the current size.
196 return GetPtrTypeSize (TokenNumber
, &MaxSize
, PeiPcdDb
);
208 IN CONST EFI_GUID
*Guid
,
209 IN UINTN ExTokenNumber
212 return *((UINT8
*) ExGetWorker (Guid
, ExTokenNumber
, sizeof (UINT8
)));
220 IN CONST EFI_GUID
*Guid
,
221 IN UINTN ExTokenNumber
224 return ReadUnaligned16 (ExGetWorker (Guid
, ExTokenNumber
, sizeof (UINT16
)));
232 IN CONST EFI_GUID
*Guid
,
233 IN UINTN ExTokenNumber
236 return ReadUnaligned32 (ExGetWorker (Guid
, ExTokenNumber
, sizeof (UINT32
)));
244 IN CONST EFI_GUID
*Guid
,
245 IN UINTN ExTokenNumber
248 return ReadUnaligned64 (ExGetWorker (Guid
, ExTokenNumber
, sizeof (UINT64
)));
256 IN CONST EFI_GUID
*Guid
,
257 IN UINTN ExTokenNumber
260 return ExGetWorker (Guid
, ExTokenNumber
, 0);
268 IN CONST EFI_GUID
*Guid
,
269 IN UINTN ExTokenNumber
272 return *((BOOLEAN
*) ExGetWorker (Guid
, ExTokenNumber
, sizeof (BOOLEAN
)));
280 IN CONST EFI_GUID
*Guid
,
281 IN UINTN ExTokenNumber
284 return PeiPcdGetSize (GetExPcdTokenNumber (Guid
, ExTokenNumber
));
292 IN UINTN TokenNumber
,
296 return SetValueWorker (TokenNumber
, &Value
, sizeof (Value
));
304 IN UINTN TokenNumber
,
308 return SetValueWorker (TokenNumber
, &Value
, sizeof (Value
));
316 IN UINTN TokenNumber
,
320 return SetValueWorker (TokenNumber
, &Value
, sizeof (Value
));
328 IN UINTN TokenNumber
,
332 return SetValueWorker (TokenNumber
, &Value
, sizeof (Value
));
339 IN UINTN TokenNumber
,
340 IN OUT UINTN
*SizeOfBuffer
,
344 return SetWorker (TokenNumber
, Buffer
, SizeOfBuffer
, TRUE
);
352 IN UINTN TokenNumber
,
356 return SetValueWorker (TokenNumber
, &Value
, sizeof (Value
));
364 IN CONST EFI_GUID
*Guid
,
365 IN UINTN ExTokenNumber
,
369 return ExSetValueWorker (ExTokenNumber
, Guid
, &Value
, sizeof (Value
));
377 IN CONST EFI_GUID
*Guid
,
378 IN UINTN ExTokenNumber
,
382 return ExSetValueWorker (ExTokenNumber
, Guid
, &Value
, sizeof (Value
));
390 IN CONST EFI_GUID
*Guid
,
391 IN UINTN ExTokenNumber
,
395 return ExSetValueWorker (ExTokenNumber
, Guid
, &Value
, sizeof (Value
));
403 IN CONST EFI_GUID
*Guid
,
404 IN UINTN ExTokenNumber
,
408 return ExSetValueWorker (ExTokenNumber
, Guid
, &Value
, sizeof (Value
));
416 IN CONST EFI_GUID
*Guid
,
417 IN UINTN ExTokenNumber
,
418 IN UINTN
*SizeOfBuffer
,
422 return ExSetWorker (ExTokenNumber
, Guid
, Value
, SizeOfBuffer
, TRUE
);
430 IN CONST EFI_GUID
*Guid
,
431 IN UINTN ExTokenNumber
,
435 return ExSetValueWorker (ExTokenNumber
, Guid
, &Value
, sizeof (Value
));
443 PeiRegisterCallBackOnSet (
444 IN UINTN ExTokenNumber
,
445 IN CONST EFI_GUID
*Guid
, OPTIONAL
446 IN PCD_PPI_CALLBACK CallBackFunction
449 ASSERT (CallBackFunction
!= NULL
);
451 return PeiRegisterCallBackWorker (ExTokenNumber
, Guid
, CallBackFunction
, TRUE
);
458 PcdUnRegisterCallBackOnSet (
459 IN UINTN ExTokenNumber
,
460 IN CONST EFI_GUID
*Guid
, OPTIONAL
461 IN PCD_PPI_CALLBACK CallBackFunction
464 ASSERT (CallBackFunction
!= NULL
);
466 return PeiRegisterCallBackWorker (ExTokenNumber
, Guid
, CallBackFunction
, FALSE
);
474 IN CONST EFI_GUID
*Guid
, OPTIONAL
475 IN OUT UINTN
*TokenNumber
479 PEI_PCD_DATABASE
*PeiPcdDb
;
481 DYNAMICEX_MAPPING
*ExMapTable
;
485 if (!FeaturePcdGet (PcdPeiPcdDatabaseTraverseEnabled
)) {
486 return EFI_UNSUPPORTED
;
490 if (*TokenNumber
> PEI_NEX_TOKEN_NUMBER
) {
491 return EFI_NOT_FOUND
;
494 if (*TokenNumber
> PEI_NEX_TOKEN_NUMBER
) {
495 *TokenNumber
= PCD_INVALID_TOKEN_NUMBER
;
499 if (PEI_EXMAP_TABLE_EMPTY
) {
500 *TokenNumber
= PCD_INVALID_TOKEN_NUMBER
;
505 // Assume PCD Database AutoGen tool is sorting the ExMap based on the following order
509 PeiPcdDb
= GetPcdDatabase ();
511 MatchGuid
= ScanGuid (PeiPcdDb
->Init
.GuidTable
, sizeof(PeiPcdDb
->Init
.GuidTable
), Guid
);
513 if (MatchGuid
== NULL
) {
514 *TokenNumber
= PCD_INVALID_TOKEN_NUMBER
;
515 return EFI_NOT_FOUND
;
518 GuidTableIdx
= MatchGuid
- PeiPcdDb
->Init
.GuidTable
;
520 ExMapTable
= PeiPcdDb
->Init
.ExMapTable
;
524 // Locate the GUID in ExMapTable first.
526 for (i
= 0; i
< PEI_EXMAPPING_TABLE_SIZE
; i
++) {
527 if (ExMapTable
[i
].ExGuidIndex
== GuidTableIdx
) {
534 if (*TokenNumber
== PCD_INVALID_TOKEN_NUMBER
) {
535 *TokenNumber
= ExMapTable
[i
].ExTokenNumber
;
539 for ( ; i
< PEI_EXMAPPING_TABLE_SIZE
; i
++) {
540 if (ExMapTable
[i
].ExTokenNumber
== *TokenNumber
) {
542 if (i
== PEI_EXMAPPING_TABLE_SIZE
) {
544 // Exceed the length of ExMap Table
546 *TokenNumber
= PCD_INVALID_TOKEN_NUMBER
;
549 if (ExMapTable
[i
].ExGuidIndex
== GuidTableIdx
) {
550 *TokenNumber
= ExMapTable
[i
].ExTokenNumber
;
553 *TokenNumber
= PCD_INVALID_TOKEN_NUMBER
;
558 return EFI_NOT_FOUND
;
562 return EFI_NOT_FOUND
;
569 PeiPcdGetNextTokenSpace (
570 IN OUT CONST EFI_GUID
**Guid
575 PEI_PCD_DATABASE
*PeiPcdDb
;
576 DYNAMICEX_MAPPING
*ExMapTable
;
580 if (!FeaturePcdGet (PcdPeiPcdDatabaseTraverseEnabled
)) {
581 return EFI_UNSUPPORTED
;
584 ASSERT (Guid
!= NULL
);
586 if (PEI_EXMAP_TABLE_EMPTY
) {
588 return EFI_NOT_FOUND
;
595 // Assume PCD Database AutoGen tool is sorting the ExMap based on the following order
599 PeiPcdDb
= GetPcdDatabase ();
601 ExMapTable
= PeiPcdDb
->Init
.ExMapTable
;
605 // return the first Token Space Guid.
607 *Guid
= &PeiPcdDb
->Init
.GuidTable
[ExMapTable
[0].ExGuidIndex
];
611 MatchGuid
= ScanGuid (PeiPcdDb
->Init
.GuidTable
, sizeof(PeiPcdDb
->Init
.GuidTable
), *Guid
);
613 if (MatchGuid
== NULL
) {
614 return EFI_NOT_FOUND
;
617 GuidTableIdx
= MatchGuid
- PeiPcdDb
->Init
.GuidTable
;
620 for (i
= 0; i
< PEI_EXMAPPING_TABLE_SIZE
; i
++) {
621 if (ExMapTable
[i
].ExGuidIndex
== GuidTableIdx
) {
629 for ( ; i
< PEI_EXMAPPING_TABLE_SIZE
; i
++ ) {
630 if (ExMapTable
[i
].ExGuidIndex
!= GuidTableIdx
) {
631 *Guid
= &PeiPcdDb
->Init
.GuidTable
[ExMapTable
[i
].ExGuidIndex
];
639 return EFI_NOT_FOUND
;