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 if (!FeaturePcdGet(PcdPeiPcdDatabaseGetSizeEnabled
)) {
178 return EFI_UNSUPPORTED
;
181 PeiPcdDb
= GetPcdDatabase ();
183 // TokenNumber Zero is reserved as PCD_INVALID_TOKEN_NUMBER.
184 // We have to decrement TokenNumber by 1 to make it usable
185 // as the array index.
189 // EBC compiler is very choosy. It may report warning about comparison
190 // between UINTN and 0 . So we add 1 in each size of the
192 ASSERT (TokenNumber
+ 1 < PEI_LOCAL_TOKEN_NUMBER
+ 1);
194 Size
= (PeiPcdDb
->Init
.LocalTokenNumberTable
[TokenNumber
] & PCD_DATUM_TYPE_ALL_SET
) >> PCD_DATUM_TYPE_SHIFT
;
198 // For pointer type, we need to scan the SIZE_TABLE to get the current size.
200 return GetPtrTypeSize (TokenNumber
, &MaxSize
, PeiPcdDb
);
212 IN CONST EFI_GUID
*Guid
,
213 IN UINTN ExTokenNumber
216 return *((UINT8
*) ExGetWorker (Guid
, ExTokenNumber
, sizeof (UINT8
)));
224 IN CONST EFI_GUID
*Guid
,
225 IN UINTN ExTokenNumber
228 return ReadUnaligned16 (ExGetWorker (Guid
, ExTokenNumber
, sizeof (UINT16
)));
236 IN CONST EFI_GUID
*Guid
,
237 IN UINTN ExTokenNumber
240 return ReadUnaligned32 (ExGetWorker (Guid
, ExTokenNumber
, sizeof (UINT32
)));
248 IN CONST EFI_GUID
*Guid
,
249 IN UINTN ExTokenNumber
252 return ReadUnaligned64 (ExGetWorker (Guid
, ExTokenNumber
, sizeof (UINT64
)));
260 IN CONST EFI_GUID
*Guid
,
261 IN UINTN ExTokenNumber
264 return ExGetWorker (Guid
, ExTokenNumber
, 0);
272 IN CONST EFI_GUID
*Guid
,
273 IN UINTN ExTokenNumber
276 return *((BOOLEAN
*) ExGetWorker (Guid
, ExTokenNumber
, sizeof (BOOLEAN
)));
284 IN CONST EFI_GUID
*Guid
,
285 IN UINTN ExTokenNumber
288 if ((!FeaturePcdGet (PcdPeiPcdDatabaseGetSizeEnabled
)) || !FeaturePcdGet (PcdPeiPcdDatabaseExEnabled
)) {
289 return EFI_UNSUPPORTED
;
292 return PeiPcdGetSize (GetExPcdTokenNumber (Guid
, ExTokenNumber
));
300 IN UINTN TokenNumber
,
304 return SetValueWorker (TokenNumber
, &Value
, sizeof (Value
));
312 IN UINTN TokenNumber
,
316 return SetValueWorker (TokenNumber
, &Value
, sizeof (Value
));
324 IN UINTN TokenNumber
,
328 return SetValueWorker (TokenNumber
, &Value
, sizeof (Value
));
336 IN UINTN TokenNumber
,
340 return SetValueWorker (TokenNumber
, &Value
, sizeof (Value
));
347 IN UINTN TokenNumber
,
348 IN OUT UINTN
*SizeOfBuffer
,
352 return SetWorker (TokenNumber
, Buffer
, SizeOfBuffer
, TRUE
);
360 IN UINTN TokenNumber
,
364 return SetValueWorker (TokenNumber
, &Value
, sizeof (Value
));
372 IN CONST EFI_GUID
*Guid
,
373 IN UINTN ExTokenNumber
,
377 return ExSetValueWorker (ExTokenNumber
, Guid
, &Value
, sizeof (Value
));
385 IN CONST EFI_GUID
*Guid
,
386 IN UINTN ExTokenNumber
,
390 return ExSetValueWorker (ExTokenNumber
, Guid
, &Value
, sizeof (Value
));
398 IN CONST EFI_GUID
*Guid
,
399 IN UINTN ExTokenNumber
,
403 return ExSetValueWorker (ExTokenNumber
, Guid
, &Value
, sizeof (Value
));
411 IN CONST EFI_GUID
*Guid
,
412 IN UINTN ExTokenNumber
,
416 return ExSetValueWorker (ExTokenNumber
, Guid
, &Value
, sizeof (Value
));
424 IN CONST EFI_GUID
*Guid
,
425 IN UINTN ExTokenNumber
,
426 IN UINTN
*SizeOfBuffer
,
430 return ExSetWorker (ExTokenNumber
, Guid
, Value
, SizeOfBuffer
, TRUE
);
438 IN CONST EFI_GUID
*Guid
,
439 IN UINTN ExTokenNumber
,
443 return ExSetValueWorker (ExTokenNumber
, Guid
, &Value
, sizeof (Value
));
451 PeiRegisterCallBackOnSet (
452 IN CONST EFI_GUID
*Guid
, OPTIONAL
453 IN UINTN ExTokenNumber
,
454 IN PCD_PPI_CALLBACK CallBackFunction
457 if (!FeaturePcdGet(PcdPeiPcdDatabaseCallbackOnSetEnabled
)) {
458 return EFI_UNSUPPORTED
;
461 ASSERT (CallBackFunction
!= NULL
);
463 return PeiRegisterCallBackWorker (ExTokenNumber
, Guid
, CallBackFunction
, TRUE
);
470 PcdUnRegisterCallBackOnSet (
471 IN CONST EFI_GUID
*Guid
, OPTIONAL
472 IN UINTN ExTokenNumber
,
473 IN PCD_PPI_CALLBACK CallBackFunction
476 if (!FeaturePcdGet(PcdPeiPcdDatabaseCallbackOnSetEnabled
)) {
477 return EFI_UNSUPPORTED
;
480 ASSERT (CallBackFunction
!= NULL
);
482 return PeiRegisterCallBackWorker (ExTokenNumber
, Guid
, CallBackFunction
, FALSE
);
490 IN CONST EFI_GUID
*Guid
, OPTIONAL
491 IN OUT UINTN
*TokenNumber
495 PEI_PCD_DATABASE
*PeiPcdDb
;
497 DYNAMICEX_MAPPING
*ExMapTable
;
501 if (!FeaturePcdGet (PcdPeiPcdDatabaseTraverseEnabled
)) {
502 return EFI_UNSUPPORTED
;
506 if (*TokenNumber
> PEI_NEX_TOKEN_NUMBER
) {
507 return EFI_NOT_FOUND
;
510 if (*TokenNumber
> PEI_NEX_TOKEN_NUMBER
) {
511 *TokenNumber
= PCD_INVALID_TOKEN_NUMBER
;
515 if (PEI_EXMAP_TABLE_EMPTY
) {
516 *TokenNumber
= PCD_INVALID_TOKEN_NUMBER
;
521 // Assume PCD Database AutoGen tool is sorting the ExMap based on the following order
525 PeiPcdDb
= GetPcdDatabase ();
527 MatchGuid
= ScanGuid (PeiPcdDb
->Init
.GuidTable
, sizeof(PeiPcdDb
->Init
.GuidTable
), Guid
);
529 if (MatchGuid
== NULL
) {
530 *TokenNumber
= PCD_INVALID_TOKEN_NUMBER
;
531 return EFI_NOT_FOUND
;
534 GuidTableIdx
= MatchGuid
- PeiPcdDb
->Init
.GuidTable
;
536 ExMapTable
= PeiPcdDb
->Init
.ExMapTable
;
540 // Locate the GUID in ExMapTable first.
542 for (i
= 0; i
< PEI_EXMAPPING_TABLE_SIZE
; i
++) {
543 if (ExMapTable
[i
].ExGuidIndex
== GuidTableIdx
) {
550 if (*TokenNumber
== PCD_INVALID_TOKEN_NUMBER
) {
551 *TokenNumber
= ExMapTable
[i
].ExTokenNumber
;
555 for ( ; i
< PEI_EXMAPPING_TABLE_SIZE
; i
++) {
556 if (ExMapTable
[i
].ExTokenNumber
== *TokenNumber
) {
558 if (i
== PEI_EXMAPPING_TABLE_SIZE
) {
560 // Exceed the length of ExMap Table
562 *TokenNumber
= PCD_INVALID_TOKEN_NUMBER
;
565 if (ExMapTable
[i
].ExGuidIndex
== GuidTableIdx
) {
566 *TokenNumber
= ExMapTable
[i
].ExTokenNumber
;
569 *TokenNumber
= PCD_INVALID_TOKEN_NUMBER
;
574 return EFI_NOT_FOUND
;
578 return EFI_NOT_FOUND
;
585 PeiPcdGetNextTokenSpace (
586 IN OUT CONST EFI_GUID
**Guid
591 PEI_PCD_DATABASE
*PeiPcdDb
;
592 DYNAMICEX_MAPPING
*ExMapTable
;
596 if (!FeaturePcdGet (PcdPeiPcdDatabaseTraverseEnabled
)) {
597 return EFI_UNSUPPORTED
;
600 ASSERT (Guid
!= NULL
);
602 if (PEI_EXMAP_TABLE_EMPTY
) {
604 return EFI_NOT_FOUND
;
611 // Assume PCD Database AutoGen tool is sorting the ExMap based on the following order
615 PeiPcdDb
= GetPcdDatabase ();
617 ExMapTable
= PeiPcdDb
->Init
.ExMapTable
;
621 // return the first Token Space Guid.
623 *Guid
= &PeiPcdDb
->Init
.GuidTable
[ExMapTable
[0].ExGuidIndex
];
627 MatchGuid
= ScanGuid (PeiPcdDb
->Init
.GuidTable
, sizeof(PeiPcdDb
->Init
.GuidTable
), *Guid
);
629 if (MatchGuid
== NULL
) {
630 return EFI_NOT_FOUND
;
633 GuidTableIdx
= MatchGuid
- PeiPcdDb
->Init
.GuidTable
;
636 for (i
= 0; i
< PEI_EXMAPPING_TABLE_SIZE
; i
++) {
637 if (ExMapTable
[i
].ExGuidIndex
== GuidTableIdx
) {
645 for ( ; i
< PEI_EXMAPPING_TABLE_SIZE
; i
++ ) {
646 if (ExMapTable
[i
].ExGuidIndex
!= GuidTableIdx
) {
647 *Guid
= &PeiPcdDb
->Init
.GuidTable
[ExMapTable
[i
].ExGuidIndex
];
655 return EFI_NOT_FOUND
;