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
)));
172 ASSERT (TokenNumber
< PEI_LOCAL_TOKEN_NUMBER
);
174 return GetPcdDatabase()->Init
.SizeTable
[TokenNumber
];
182 IN CONST EFI_GUID
*Guid
,
183 IN UINTN ExTokenNumber
186 return *((UINT8
*) ExGetWorker (Guid
, ExTokenNumber
, sizeof (UINT8
)));
194 IN CONST EFI_GUID
*Guid
,
195 IN UINTN ExTokenNumber
198 return ReadUnaligned16 (ExGetWorker (Guid
, ExTokenNumber
, sizeof (UINT16
)));
206 IN CONST EFI_GUID
*Guid
,
207 IN UINTN ExTokenNumber
210 return ReadUnaligned32 (ExGetWorker (Guid
, ExTokenNumber
, sizeof (UINT32
)));
218 IN CONST EFI_GUID
*Guid
,
219 IN UINTN ExTokenNumber
222 return ReadUnaligned64 (ExGetWorker (Guid
, ExTokenNumber
, sizeof (UINT64
)));
230 IN CONST EFI_GUID
*Guid
,
231 IN UINTN ExTokenNumber
234 return ExGetWorker (Guid
, ExTokenNumber
, 0);
242 IN CONST EFI_GUID
*Guid
,
243 IN UINTN ExTokenNumber
246 return *((BOOLEAN
*) ExGetWorker (Guid
, ExTokenNumber
, sizeof (BOOLEAN
)));
254 IN CONST EFI_GUID
*Guid
,
255 IN UINTN ExTokenNumber
258 return PeiPcdGetSize (GetExPcdTokenNumber (Guid
, ExTokenNumber
));
266 IN UINTN TokenNumber
,
270 return SetWorker (TokenNumber
, &Value
, sizeof (Value
), FALSE
);
278 IN UINTN TokenNumber
,
282 return SetWorker (TokenNumber
, &Value
, sizeof (Value
), FALSE
);
290 IN UINTN TokenNumber
,
294 return SetWorker (TokenNumber
, &Value
, sizeof (Value
), FALSE
);
302 IN UINTN TokenNumber
,
306 return SetWorker (TokenNumber
, &Value
, sizeof (Value
), FALSE
);
313 IN UINTN TokenNumber
,
314 IN UINTN SizeOfBuffer
,
318 return SetWorker (TokenNumber
, Buffer
, SizeOfBuffer
, TRUE
);
326 IN UINTN TokenNumber
,
330 return SetWorker (TokenNumber
, &Value
, sizeof (Value
), FALSE
);
338 IN CONST EFI_GUID
*Guid
,
339 IN UINTN ExTokenNumber
,
357 IN CONST EFI_GUID
*Guid
,
358 IN UINTN ExTokenNumber
,
376 IN CONST EFI_GUID
*Guid
,
377 IN UINTN ExTokenNumber
,
395 IN CONST EFI_GUID
*Guid
,
396 IN UINTN ExTokenNumber
,
414 IN CONST EFI_GUID
*Guid
,
415 IN UINTN ExTokenNumber
,
416 IN UINTN SizeOfBuffer
,
434 IN CONST EFI_GUID
*Guid
,
435 IN UINTN ExTokenNumber
,
453 PeiRegisterCallBackOnSet (
454 IN UINTN ExTokenNumber
,
455 IN CONST EFI_GUID
*Guid
, OPTIONAL
456 IN PCD_PPI_CALLBACK CallBackFunction
459 ASSERT (CallBackFunction
!= NULL
);
461 return PeiRegisterCallBackWorker (ExTokenNumber
, Guid
, CallBackFunction
, TRUE
);
468 PcdUnRegisterCallBackOnSet (
469 IN UINTN ExTokenNumber
,
470 IN CONST EFI_GUID
*Guid
, OPTIONAL
471 IN PCD_PPI_CALLBACK CallBackFunction
474 ASSERT (CallBackFunction
!= NULL
);
476 return PeiRegisterCallBackWorker (ExTokenNumber
, Guid
, CallBackFunction
, FALSE
);
484 IN CONST EFI_GUID
*Guid
, OPTIONAL
485 IN OUT UINTN
*TokenNumber
489 PEI_PCD_DATABASE
*PeiPcdDb
;
491 DYNAMICEX_MAPPING
*ExMapTable
;
498 if (*TokenNumber
>= PEI_NEX_TOKEN_NUMBER
) {
499 *TokenNumber
= PCD_INVALID_TOKEN_NUMBER
;
504 if (PEI_EXMAP_TABLE_EMPTY
) {
505 *TokenNumber
= PCD_INVALID_TOKEN_NUMBER
;
506 return EFI_NOT_FOUND
;
510 // Assume PCD Database AutoGen tool is sorting the ExMap based on the following order
514 PeiPcdDb
= GetPcdDatabase ();
516 MatchGuid
= ScanGuid (PeiPcdDb
->Init
.GuidTable
, sizeof(PeiPcdDb
->Init
.GuidTable
), Guid
);
518 if (MatchGuid
== NULL
) {
519 *TokenNumber
= (UINTN
) PCD_INVALID_TOKEN_NUMBER
;
520 return EFI_NOT_FOUND
;
523 GuidTableIdx
= MatchGuid
- PeiPcdDb
->Init
.GuidTable
;
525 ExMapTable
= PeiPcdDb
->Init
.ExMapTable
;
528 for (i
= 0; i
< PEI_EXMAPPING_TABLE_SIZE
; i
++) {
529 if (ExMapTable
[i
].ExGuidIndex
== GuidTableIdx
) {
536 if (*TokenNumber
== PCD_INVALID_TOKEN_NUMBER
) {
537 *TokenNumber
= ExMapTable
[i
].ExTokenNumber
;
541 for ( ; ExMapTable
[i
].ExGuidIndex
== GuidTableIdx
; i
++) {
542 if (ExMapTable
[i
].ExTokenNumber
== *TokenNumber
) {
544 if (ExMapTable
[i
].ExGuidIndex
== GuidTableIdx
) {
545 *TokenNumber
= ExMapTable
[i
].ExTokenNumber
;
548 *TokenNumber
= (UINTN
) PCD_INVALID_TOKEN_NUMBER
;
554 return EFI_NOT_FOUND
;
564 PeiPcdGetNextTokenSpaceGuid (
565 IN CONST EFI_GUID
*Guid
570 PEI_PCD_DATABASE
*PeiPcdDb
;
571 DYNAMICEX_MAPPING
*ExMapTable
;
575 if (PEI_EXMAP_TABLE_EMPTY
) {
580 // Assume PCD Database AutoGen tool is sorting the ExMap based on the following order
584 PeiPcdDb
= GetPcdDatabase ();
586 MatchGuid
= ScanGuid (PeiPcdDb
->Init
.GuidTable
, sizeof(PeiPcdDb
->Init
.GuidTable
), Guid
);
588 if (MatchGuid
== NULL
) {
592 GuidTableIdx
= MatchGuid
- PeiPcdDb
->Init
.GuidTable
;
594 ExMapTable
= PeiPcdDb
->Init
.ExMapTable
;
597 for (i
= 0; i
< PEI_EXMAPPING_TABLE_SIZE
; i
++) {
598 if (ExMapTable
[i
].ExGuidIndex
== GuidTableIdx
) {
605 for ( ; i
< PEI_EXMAPPING_TABLE_SIZE
; i
++ ) {
606 if (ExMapTable
[i
].ExGuidIndex
!= GuidTableIdx
) {
607 if (i
< PEI_EXMAPPING_TABLE_SIZE
) {
608 return &PeiPcdDb
->Init
.GuidTable
[ExMapTable
[i
].ExGuidIndex
];