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 ASSERT (TokenNumber
< PEI_LOCAL_TOKEN_NUMBER
);
187 Size
= (PeiPcdDb
->Init
.LocalTokenNumberTable
[TokenNumber
] & PCD_DATUM_TYPE_ALL_SET
) >> PCD_DATUM_TYPE_SHIFT
;
191 // For pointer type, we need to scan the SIZE_TABLE to get the current size.
193 return GetPtrTypeSize (TokenNumber
, &MaxSize
, PeiPcdDb
);
205 IN CONST EFI_GUID
*Guid
,
206 IN UINTN ExTokenNumber
209 return *((UINT8
*) ExGetWorker (Guid
, ExTokenNumber
, sizeof (UINT8
)));
217 IN CONST EFI_GUID
*Guid
,
218 IN UINTN ExTokenNumber
221 return ReadUnaligned16 (ExGetWorker (Guid
, ExTokenNumber
, sizeof (UINT16
)));
229 IN CONST EFI_GUID
*Guid
,
230 IN UINTN ExTokenNumber
233 return ReadUnaligned32 (ExGetWorker (Guid
, ExTokenNumber
, sizeof (UINT32
)));
241 IN CONST EFI_GUID
*Guid
,
242 IN UINTN ExTokenNumber
245 return ReadUnaligned64 (ExGetWorker (Guid
, ExTokenNumber
, sizeof (UINT64
)));
253 IN CONST EFI_GUID
*Guid
,
254 IN UINTN ExTokenNumber
257 return ExGetWorker (Guid
, ExTokenNumber
, 0);
265 IN CONST EFI_GUID
*Guid
,
266 IN UINTN ExTokenNumber
269 return *((BOOLEAN
*) ExGetWorker (Guid
, ExTokenNumber
, sizeof (BOOLEAN
)));
277 IN CONST EFI_GUID
*Guid
,
278 IN UINTN ExTokenNumber
281 return PeiPcdGetSize (GetExPcdTokenNumber (Guid
, ExTokenNumber
));
289 IN UINTN TokenNumber
,
293 return SetValueWorker (TokenNumber
, &Value
, sizeof (Value
));
301 IN UINTN TokenNumber
,
305 return SetValueWorker (TokenNumber
, &Value
, sizeof (Value
));
313 IN UINTN TokenNumber
,
317 return SetValueWorker (TokenNumber
, &Value
, sizeof (Value
));
325 IN UINTN TokenNumber
,
329 return SetValueWorker (TokenNumber
, &Value
, sizeof (Value
));
336 IN UINTN TokenNumber
,
337 IN OUT UINTN
*SizeOfBuffer
,
341 return SetWorker (TokenNumber
, Buffer
, SizeOfBuffer
, TRUE
);
349 IN UINTN TokenNumber
,
353 return SetValueWorker (TokenNumber
, &Value
, sizeof (Value
));
361 IN CONST EFI_GUID
*Guid
,
362 IN UINTN ExTokenNumber
,
366 return ExSetValueWorker (ExTokenNumber
, Guid
, &Value
, sizeof (Value
));
374 IN CONST EFI_GUID
*Guid
,
375 IN UINTN ExTokenNumber
,
379 return ExSetValueWorker (ExTokenNumber
, Guid
, &Value
, sizeof (Value
));
387 IN CONST EFI_GUID
*Guid
,
388 IN UINTN ExTokenNumber
,
392 return ExSetValueWorker (ExTokenNumber
, Guid
, &Value
, sizeof (Value
));
400 IN CONST EFI_GUID
*Guid
,
401 IN UINTN ExTokenNumber
,
405 return ExSetValueWorker (ExTokenNumber
, Guid
, &Value
, sizeof (Value
));
413 IN CONST EFI_GUID
*Guid
,
414 IN UINTN ExTokenNumber
,
415 IN UINTN
*SizeOfBuffer
,
419 return ExSetWorker (ExTokenNumber
, Guid
, Value
, SizeOfBuffer
, TRUE
);
427 IN CONST EFI_GUID
*Guid
,
428 IN UINTN ExTokenNumber
,
432 return ExSetValueWorker (ExTokenNumber
, Guid
, &Value
, sizeof (Value
));
440 PeiRegisterCallBackOnSet (
441 IN UINTN ExTokenNumber
,
442 IN CONST EFI_GUID
*Guid
, OPTIONAL
443 IN PCD_PPI_CALLBACK CallBackFunction
446 ASSERT (CallBackFunction
!= NULL
);
448 return PeiRegisterCallBackWorker (ExTokenNumber
, Guid
, CallBackFunction
, TRUE
);
455 PcdUnRegisterCallBackOnSet (
456 IN UINTN ExTokenNumber
,
457 IN CONST EFI_GUID
*Guid
, OPTIONAL
458 IN PCD_PPI_CALLBACK CallBackFunction
461 ASSERT (CallBackFunction
!= NULL
);
463 return PeiRegisterCallBackWorker (ExTokenNumber
, Guid
, CallBackFunction
, FALSE
);
471 IN CONST EFI_GUID
*Guid
, OPTIONAL
472 IN OUT UINTN
*TokenNumber
476 PEI_PCD_DATABASE
*PeiPcdDb
;
478 DYNAMICEX_MAPPING
*ExMapTable
;
485 if (*TokenNumber
>= PEI_NEX_TOKEN_NUMBER
) {
486 *TokenNumber
= PCD_INVALID_TOKEN_NUMBER
;
491 if (PEI_EXMAP_TABLE_EMPTY
) {
492 *TokenNumber
= PCD_INVALID_TOKEN_NUMBER
;
493 return EFI_NOT_FOUND
;
497 // Assume PCD Database AutoGen tool is sorting the ExMap based on the following order
501 PeiPcdDb
= GetPcdDatabase ();
503 MatchGuid
= ScanGuid (PeiPcdDb
->Init
.GuidTable
, sizeof(PeiPcdDb
->Init
.GuidTable
), Guid
);
505 if (MatchGuid
== NULL
) {
506 *TokenNumber
= (UINTN
) PCD_INVALID_TOKEN_NUMBER
;
507 return EFI_NOT_FOUND
;
510 GuidTableIdx
= MatchGuid
- PeiPcdDb
->Init
.GuidTable
;
512 ExMapTable
= PeiPcdDb
->Init
.ExMapTable
;
515 for (i
= 0; i
< PEI_EXMAPPING_TABLE_SIZE
; i
++) {
516 if (ExMapTable
[i
].ExGuidIndex
== GuidTableIdx
) {
523 if (*TokenNumber
== PCD_INVALID_TOKEN_NUMBER
) {
524 *TokenNumber
= ExMapTable
[i
].ExTokenNumber
;
528 for ( ; ExMapTable
[i
].ExGuidIndex
== GuidTableIdx
; i
++) {
529 if (ExMapTable
[i
].ExTokenNumber
== *TokenNumber
) {
531 if (ExMapTable
[i
].ExGuidIndex
== GuidTableIdx
) {
532 *TokenNumber
= ExMapTable
[i
].ExTokenNumber
;
535 *TokenNumber
= (UINTN
) PCD_INVALID_TOKEN_NUMBER
;
541 return EFI_NOT_FOUND
;
553 PeiPcdGetNextTokenSpace (
554 IN OUT CONST EFI_GUID
**Guid
559 PEI_PCD_DATABASE
*PeiPcdDb
;
560 DYNAMICEX_MAPPING
*ExMapTable
;
564 ASSERT (Guid
!= NULL
);
566 if (PEI_EXMAP_TABLE_EMPTY
) {
568 return EFI_NOT_FOUND
;
575 // Assume PCD Database AutoGen tool is sorting the ExMap based on the following order
579 PeiPcdDb
= GetPcdDatabase ();
581 ExMapTable
= PeiPcdDb
->Init
.ExMapTable
;
585 // return the first Token Space Guid.
587 *Guid
= &PeiPcdDb
->Init
.GuidTable
[ExMapTable
[0].ExGuidIndex
];
591 MatchGuid
= ScanGuid (PeiPcdDb
->Init
.GuidTable
, sizeof(PeiPcdDb
->Init
.GuidTable
), *Guid
);
593 if (MatchGuid
== NULL
) {
594 return EFI_NOT_FOUND
;
597 GuidTableIdx
= MatchGuid
- PeiPcdDb
->Init
.GuidTable
;
600 for (i
= 0; i
< PEI_EXMAPPING_TABLE_SIZE
; i
++) {
601 if (ExMapTable
[i
].ExGuidIndex
== GuidTableIdx
) {
609 for ( ; i
< PEI_EXMAPPING_TABLE_SIZE
; i
++ ) {
610 if (ExMapTable
[i
].ExGuidIndex
!= GuidTableIdx
) {
611 *Guid
= &PeiPcdDb
->Init
.GuidTable
[ExMapTable
[i
].ExGuidIndex
];
619 return EFI_NOT_FOUND
;