Initial import.

git-svn-id: https://edk2.svn.sourceforge.net/svnroot/edk2/trunk/edk2@3 6f19259b-4bc3-4df7-8a09-765794883524
This commit is contained in:
bbahnsen
2006-04-21 22:54:32 +00:00
commit 878ddf1fc3
2651 changed files with 624620 additions and 0 deletions

View File

@@ -0,0 +1,486 @@
/** @file
PCD PEIM
Copyright (c) 2006, Intel Corporation
All rights reserved. This program and the accompanying materials
are licensed and made available under the terms and conditions of the BSD License
which accompanies this distribution. The full text of the license may be found at
http://opensource.org/licenses/bsd-license.php
THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
Module Name: Pcd.c
**/
#include "../Common/PcdCommon.h"
#include "Service.h"
PCD_PPI mPcdPpiInstance = {
PeiPcdSetSku,
PeiPcdGet8,
PeiPcdGet16,
PeiPcdGet32,
PeiPcdGet64,
PeiPcdGetPtr,
PeiPcdGetBool,
PeiPcdGetSize,
PeiPcdGet8Ex,
PeiPcdGet16Ex,
PeiPcdGet32Ex,
PeiPcdGet64Ex,
PeiPcdGetPtrEx,
PeiPcdGetBoolEx,
PeiPcdGetSizeEx,
PeiPcdSet8,
PeiPcdSet16,
PeiPcdSet32,
PeiPcdSet64,
PeiPcdSetPtr,
PeiPcdSetBool,
PeiPcdSet8Ex,
PeiPcdSet16Ex,
PeiPcdSet32Ex,
PeiPcdSet64Ex,
PeiPcdSetPtrEx,
PeiPcdSetBoolEx,
PcdRegisterCallBackOnSet,
PcdUnRegisterCallBackOnSet,
PeiPcdGetNextToken
};
STATIC EFI_PEI_PPI_DESCRIPTOR mPpiPCD = {
(EFI_PEI_PPI_DESCRIPTOR_PPI | EFI_PEI_PPI_DESCRIPTOR_TERMINATE_LIST),
&gPcdPpiGuid,
&mPcdPpiInstance
};
EFI_STATUS
EFIAPI
PcdPeimInit (
IN EFI_FFS_FILE_HEADER *FfsHeader,
IN EFI_PEI_SERVICES **PeiServices
)
{
EFI_STATUS Status;
UINT8 *PcdImage;
PcdImage = (UINT8 *) LocatePcdImage ();
BuildPcdDatabase (PcdImage);
Status = PeiCoreInstallPpi (&mPpiPCD);
ASSERT_EFI_ERROR (Status);
return EFI_SUCCESS;
}
EFI_STATUS
EFIAPI
PeiPcdSetSku (
IN UINTN SkuId
)
{
PCD_DATABASE *Database;
EFI_HOB_GUID_TYPE *GuidHob;
GuidHob = GetFirstGuidHob (&gPcdDataBaseHobGuid);
ASSERT (GuidHob != NULL);
Database = (PCD_DATABASE *) GET_GUID_HOB_DATA (GuidHob);
Database->Info.SkuId = SkuId;
return SkuId;
}
UINT8
EFIAPI
PeiPcdGet8 (
IN UINTN TokenNumber
)
{
return PeiPcdGet8Ex (NULL, TokenNumber);
}
UINT16
EFIAPI
PeiPcdGet16 (
IN UINTN TokenNumber
)
{
return PeiPcdGet16Ex (NULL, TokenNumber);
}
UINT32
EFIAPI
PeiPcdGet32 (
IN UINTN TokenNumber
)
{
return PeiPcdGet32Ex (NULL, TokenNumber);
}
UINT64
EFIAPI
PeiPcdGet64 (
IN UINTN TokenNumber
)
{
return PeiPcdGet64Ex (NULL, TokenNumber);
}
VOID *
EFIAPI
PeiPcdGetPtr (
IN UINTN TokenNumber
)
{
return PeiPcdGetPtrEx (NULL, TokenNumber);
}
BOOLEAN
EFIAPI
PeiPcdGetBool (
IN UINTN TokenNumber
)
{
return PeiPcdGetBoolEx (NULL, TokenNumber);
}
UINTN
EFIAPI
PeiPcdGetSize (
IN UINTN TokenNumber
)
{
return PeiPcdGetSizeEx (NULL, TokenNumber);
}
UINT8
EFIAPI
PeiPcdGet8Ex (
IN CONST EFI_GUID *Guid,
IN UINTN TokenNumber
)
{
UINT8 Data;
PeiGetPcdEntryWorker (TokenNumber, Guid, PcdByte8, &Data);
return Data;
}
UINT16
EFIAPI
PeiPcdGet16Ex (
IN CONST EFI_GUID *Guid,
IN UINTN TokenNumber
)
{
UINT16 Data;
PeiGetPcdEntryWorker (TokenNumber, Guid, PcdByte16, &Data);
return Data;
}
UINT32
EFIAPI
PeiPcdGet32Ex (
IN CONST EFI_GUID *Guid,
IN UINTN TokenNumber
)
{
UINT32 Data;
PeiGetPcdEntryWorker (TokenNumber, Guid, PcdByte32, &Data);
return Data;
}
UINT64
EFIAPI
PeiPcdGet64Ex (
IN CONST EFI_GUID *Guid,
IN UINTN TokenNumber
)
{
UINT64 Data;
PeiGetPcdEntryWorker (TokenNumber, Guid, PcdByte64, &Data);
return Data;
}
VOID *
EFIAPI
PeiPcdGetPtrEx (
IN CONST EFI_GUID *Guid,
IN UINTN TokenNumber
)
{
VOID *Data;
PeiGetPcdEntryWorker (TokenNumber, Guid, PcdPointer, &Data);
return Data;
}
BOOLEAN
EFIAPI
PeiPcdGetBoolEx (
IN CONST EFI_GUID *Guid,
IN UINTN TokenNumber
)
{
BOOLEAN Data;
PeiGetPcdEntryWorker (TokenNumber, Guid, PcdBoolean, &Data);
return Data;
}
UINTN
EFIAPI
PeiPcdGetSizeEx (
IN CONST EFI_GUID *Guid,
IN UINTN TokenNumber
)
{
return PeiGetPcdEntrySizeWorker (TokenNumber, Guid);
}
EFI_STATUS
EFIAPI
PeiPcdSet8 (
IN UINTN TokenNumber,
IN UINT8 Value
)
{
return PeiPcdSet8Ex (NULL, TokenNumber, Value);
}
EFI_STATUS
EFIAPI
PeiPcdSet16 (
IN UINTN TokenNumber,
IN UINT16 Value
)
{
return PeiPcdSet16Ex (NULL, TokenNumber, Value);
}
EFI_STATUS
EFIAPI
PeiPcdSet32 (
IN UINTN TokenNumber,
IN UINT32 Value
)
{
return PeiPcdSet32Ex (NULL, TokenNumber, Value);
}
EFI_STATUS
EFIAPI
PeiPcdSet64 (
IN UINTN TokenNumber,
IN UINT64 Value
)
{
return PeiPcdSet64Ex (NULL, TokenNumber, Value);
}
EFI_STATUS
EFIAPI
PeiPcdSetPtr (
IN UINTN TokenNumber,
IN CONST VOID *Value
)
{
return PeiPcdSetPtrEx (NULL, TokenNumber, Value);
}
EFI_STATUS
EFIAPI
PeiPcdSetBool (
IN UINTN TokenNumber,
IN BOOLEAN Value
)
{
return PeiPcdSetBoolEx (NULL, TokenNumber, Value);
}
EFI_STATUS
EFIAPI
PeiPcdSet8Ex (
IN CONST EFI_GUID *Guid,
IN UINTN TokenNumber,
IN UINT8 Value
)
{
return PeiSetPcdEntryWorker (TokenNumber, Guid, PcdByte8, &Value);
}
EFI_STATUS
EFIAPI
PeiPcdSet16Ex (
IN CONST EFI_GUID *Guid,
IN UINTN TokenNumber,
IN UINT16 Value
)
{
return PeiSetPcdEntryWorker (TokenNumber, Guid, PcdByte16, &Value);
}
EFI_STATUS
EFIAPI
PeiPcdSet32Ex (
IN CONST EFI_GUID *Guid,
IN UINTN TokenNumber,
IN UINT32 Value
)
{
return PeiSetPcdEntryWorker (TokenNumber, Guid, PcdByte32, &Value);
}
EFI_STATUS
EFIAPI
PeiPcdSet64Ex (
IN CONST EFI_GUID *Guid,
IN UINTN TokenNumber,
IN UINT64 Value
)
{
return PeiSetPcdEntryWorker (TokenNumber, Guid, PcdByte64, &Value);
}
EFI_STATUS
EFIAPI
PeiPcdSetPtrEx (
IN CONST EFI_GUID *Guid,
IN UINTN TokenNumber,
IN CONST VOID *Value
)
{
return PeiSetPcdEntryWorker (TokenNumber, Guid, PcdPointer, (VOID *)Value);
}
EFI_STATUS
EFIAPI
PeiPcdSetBoolEx (
IN CONST EFI_GUID *Guid,
IN UINTN TokenNumber,
IN BOOLEAN Value
)
{
return PeiSetPcdEntryWorker (TokenNumber, Guid, PcdBoolean, &Value);
}
EFI_STATUS
EFIAPI
PcdRegisterCallBackOnSet (
IN UINTN TokenNumber,
IN CONST EFI_GUID *Guid, OPTIONAL
IN PCD_PPI_CALLBACK CallBackFunction
)
{
return PeiRegisterCallBackWorker (TokenNumber, Guid, CallBackFunction, TRUE);
}
EFI_STATUS
EFIAPI
PcdUnRegisterCallBackOnSet (
IN UINTN TokenNumber,
IN CONST EFI_GUID *Guid, OPTIONAL
IN PCD_PPI_CALLBACK CallBackFunction
)
{
return PeiRegisterCallBackWorker (TokenNumber, Guid, CallBackFunction, FALSE);
}
EFI_STATUS
EFIAPI
PeiPcdGetNextToken (
IN CONST EFI_GUID *Guid, OPTIONAL
IN OUT UINTN *TokenNumber
)
{
return PeiGetNextTokenWorker (TokenNumber, Guid);
}

View File

@@ -0,0 +1,812 @@
/** @file
Private functions used by PCD PEIM.
Copyright (c) 2006, Intel Corporation
All rights reserved. This program and the accompanying materials
are licensed and made available under the terms and conditions of the BSD License
which accompanies this distribution. The full text of the license may be found at
http://opensource.org/licenses/bsd-license.php
THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
Module Name: Service.c
**/
#include "../Common/PcdCommon.h"
#include "Service.h"
/**
This function expand the StateByte
@param[out] StateByte The output StateByte information.
@param[in] Byte The StateByte.
@retval VOID
--*/
VOID
PcdImageExpandStateByte (
OUT PCD_STATEBYTE *StateByte,
IN UINT8 Byte
)
{
switch (Byte & PCD_STATEBYTE_DATUMTYPE) {
case PCD_BYTE8:
StateByte->DataType = PcdByte8;
break;
case PCD_BYTE16:
StateByte->DataType = PcdByte16;
break;
case PCD_BYTE32:
StateByte->DataType = PcdByte32;
break;
case PCD_BYTE64:
StateByte->DataType = PcdByte64;
break;
case PCD_POINTER:
StateByte->DataType = PcdPointer;
break;
case PCD_BOOLEAN:
StateByte->DataType = PcdBoolean;
break;
default:
ASSERT (FALSE);
}
StateByte->ExtendedGuidPresent = (BOOLEAN) ((Byte & PCD_STATEBYTE_EXTENDEDGUIDPRESENT) != 0);
StateByte->HiiEnable = (BOOLEAN) ((Byte & PCD_STATEBYTE_HIIENABLE) != 0);
StateByte->SkuDataArrayEnable = (BOOLEAN) ((Byte & PCD_STATEBYTE_SKUDATAARRAYENABLE) != 0);
StateByte->SkuEnable = (BOOLEAN) ((Byte & PCD_STATEBYTE_SKUENABLE) != 0);
StateByte->VpdEnable = (BOOLEAN) ((Byte & PCD_STATEBYTE_VPDENABLE) != 0);
}
/**
This function locates the <PCD_IMAGE> on the flash and
return a pointer to the Section Data on flash.
@param[in] VOID
@retval VOID
--*/
UINT8 *
LocatePcdImage (
VOID
)
{
EFI_STATUS Status;
EFI_FIRMWARE_VOLUME_HEADER *FvHdr;
EFI_FFS_FILE_HEADER *FfsHdr;
VOID *SectionData;
Status = PeiCoreFfsFindNextVolume (0, &FvHdr);
ASSERT_EFI_ERROR (Status);
do {
FfsHdr = NULL;
Status = PeiCoreFfsFindNextFile (EFI_FV_FILETYPE_FREEFORM, FvHdr, &FfsHdr);
if (Status == EFI_SUCCESS) {
if (CompareGuid (&gPcdImageFileGuid, &FfsHdr->Name)) {
Status = PeiCoreFfsFindSectionData (EFI_SECTION_RAW, FfsHdr, &SectionData);
ASSERT_EFI_ERROR (Status);
return (UINT8 *)SectionData;
}
}
} while (Status == EFI_SUCCESS);
ASSERT (FALSE);
return NULL;
}
/**
The function retrieves the PCD data value according to
TokenNumber and Guid space given.
@param[in] TokenNumber The token number.
@param[in] Guid The Guid space.
@param[in] Type The storage type.
@param[out] Data The output data.
@retval EFI_SUCESS If data value is found according to SKU_ID.
@retval EFI_NOT_FOUND If not such a value is found.
--*/
VOID
PeiGetPcdEntryWorker (
IN UINTN TokenNumber,
IN CONST EFI_GUID *Guid, OPTIONAL
IN PCD_DATA_TYPE Type,
OUT VOID *Data
)
{
PCD_DATABASE *Database;
EFI_HOB_GUID_TYPE *GuidHob;
ASSERT (Data != NULL);
GuidHob = GetFirstGuidHob (&gPcdDataBaseHobGuid);
ASSERT (GuidHob != NULL);
Database = GET_GUID_HOB_DATA (GuidHob);
GetPcdEntryWorker ( &Database->Info,
TokenNumber,
Guid,
Type,
Data
);
return;
}
/**
The function set the PCD data value according to
TokenNumber and Guid space given.
@param[in] Database The PCD Database Instance.
@param[in] TokenNumber The token number.
@param[in] Guid The Guid space.
@param[in] Type The storage type.
@param[in] Data The output data.
@retval EFI_SUCESS If data value is found according to SKU_ID.
@retval EFI_NOT_FOUND If not such a value is found.
--*/
EFI_STATUS
SetPcdEntryWorker (
IN CONST PCD_DATABASE *Database,
IN UINTN TokenNumber,
IN CONST EFI_GUID *Guid, OPTIONAL
IN PCD_DATA_TYPE Type,
IN VOID *Data
)
{
PCD_INDEX *PcdIndex;
EFI_STATUS Status;
PCD_PPI_CALLBACK *CallbackTable;
UINTN Idx;
ASSERT (Data != NULL);
//
// Find the PCD entry in list in memory first
//
PcdIndex = FindPcdIndex (TokenNumber, Guid, &Database->Info, &Idx);
ASSERT (PcdIndex != NULL);
ASSERT (PcdIndex->StateByte.DataType == Type);
//
// Invoke the callback function.
//
CallbackTable = (PCD_PPI_CALLBACK *)
GetAbsoluteAddress (Idx * Database->Info.MaxCallbackNum * sizeof(PCD_PPI_CALLBACK),
Database->Info.CallbackTableOffset,
&Database->Info
);
for (Idx = 0; Idx < Database->Info.MaxCallbackNum; Idx++) {
if (CallbackTable[Idx] != NULL) {
CallbackTable[Idx] (Guid,
PcdIndex->TokenNumber,
Data,
PcdIndex->DatumSize
);
}
}
Status = SetPcdData (PcdIndex, &Database->Info, Data);
return Status;
}
/**
(reviewed) The function set the PCD data value according to
TokenNumber and Guid space given.
@param[in] TokenNumber The token number.
@param[in] Guid The Guid space.
@param[in] Type The storage type.
@param[in] Data The output data.
@retval EFI_SUCESS If data value is found according to SKU_ID.
@retval EFI_NOT_FOUND If not such a value is found.
--*/
EFI_STATUS
PeiSetPcdEntryWorker (
IN UINTN TokenNumber,
IN CONST EFI_GUID *Guid, OPTIONAL
IN PCD_DATA_TYPE Type,
IN VOID *Data
)
{
PCD_DATABASE *Database;
EFI_HOB_GUID_TYPE *GuidHob;
ASSERT (Data != NULL);
GuidHob = GetFirstGuidHob (&gPcdDataBaseHobGuid);
ASSERT (GuidHob != NULL);
Database = GET_GUID_HOB_DATA (GuidHob);
SetPcdEntryWorker (Database,
TokenNumber,
Guid,
Type,
Data
);
return EFI_SUCCESS;
}
UINTN
PeiGetPcdEntrySizeWorker (
IN UINTN TokenNumber,
IN CONST EFI_GUID *Guid OPTIONAL
)
{
PCD_DATABASE *Database;
EFI_HOB_GUID_TYPE *GuidHob;
GuidHob = GetFirstGuidHob (&gPcdDataBaseHobGuid);
ASSERT (GuidHob != NULL);
Database = GET_GUID_HOB_DATA (GuidHob);
return GetPcdEntrySizeWorker (&Database->Info,
TokenNumber,
Guid
);
}
/**
The function registers the CallBackOnSet fucntion
according to TokenNumber and EFI_GUID space.
@param[in] TokenNumber The token number.
@param[in] Guid The GUID space.
@param[in] CallBackFunction The Callback function to be registered.
@retval EFI_SUCCESS If the Callback function is registered.
@retval EFI_NOT_FOUND If the PCD Entry is not found according to Token Number and GUID space.
--*/
EFI_STATUS
PeiRegisterCallBackWorker (
IN UINTN TokenNumber,
IN CONST EFI_GUID *Guid, OPTIONAL
IN PCD_PPI_CALLBACK CallBackFunction,
IN BOOLEAN Register
)
{
PCD_DATABASE *Database;
EFI_HOB_GUID_TYPE *GuidHob;
PCD_INDEX *PcdIndex;
UINTN Idx;
PCD_PPI_CALLBACK *CallbackTable;
PCD_PPI_CALLBACK Compare;
PCD_PPI_CALLBACK Assign;
GuidHob = GetFirstGuidHob (&gPcdDataBaseHobGuid);
ASSERT (GuidHob != NULL);
Database = GET_GUID_HOB_DATA (GuidHob);
PcdIndex = FindPcdIndex (TokenNumber, Guid, &Database->Info, NULL);
ASSERT (PcdIndex != NULL);
if (PcdIndex->StateByte.VpdEnable) {
return EFI_INVALID_PARAMETER;
}
Idx = ((UINTN) PcdIndex - Database->Info.CallbackTableOffset) / sizeof(PCD_INDEX);
CallbackTable = (PCD_PPI_CALLBACK *) GetAbsoluteAddress (
sizeof (PCD_PPI_CALLBACK) * Idx * Database->Info.MaxCallbackNum,
Database->Info.CallbackTableOffset,
&Database->Info
);
Compare = Register? NULL: CallBackFunction;
Assign = Register? CallBackFunction: NULL;
for (Idx = 0; Idx < Database->Info.MaxCallbackNum; Idx++) {
if (CallbackTable[Idx] == Compare) {
CallbackTable[Idx] = Assign;
return EFI_SUCCESS;
}
}
return Register? EFI_OUT_OF_RESOURCES : EFI_NOT_FOUND;
}
EFI_STATUS
PeiGetNextTokenWorker (
IN OUT UINTN *TokenNumber,
IN CONST EFI_GUID *Guid OPTIONAL
)
{
PCD_DATABASE *Database;
EFI_HOB_GUID_TYPE *GuidHob;
GuidHob = GetFirstGuidHob (&gPcdDataBaseHobGuid);
ASSERT (GuidHob != NULL);
Database = GET_GUID_HOB_DATA (GuidHob);
return GetNextTokenWorker (&Database->Info,
TokenNumber,
Guid
);
}
VOID
GetPcdImageInfo (
IN CONST UINT8 *PcdImageOnFlash,
OUT PCD_IMAGE_RECORD *ImageInfo
)
{
PCD_FFS_ENCODING *PcdFfsHdr;
PcdFfsHdr = (PCD_FFS_ENCODING *) PcdImageOnFlash;
ZeroMem (ImageInfo, sizeof (*ImageInfo));
ImageInfo->ImageStart = PcdImageOnFlash;
CopyMem (&ImageInfo->EntryCount, PcdFfsHdr->EntryCount, 3);
CopyMem (&ImageInfo->GlobalDatumLength, PcdFfsHdr->GlobalDatumLength, 1);
ASSERT (ImageInfo->GlobalDatumLength <= 3);
CopyMem (&ImageInfo->GlobalOffsetLength, PcdFfsHdr->GlobalOffsetLength, 1);
ASSERT (ImageInfo->GlobalOffsetLength <= 3);
CopyMem (&ImageInfo->GlobalTokenLength, PcdFfsHdr->GlobalTokenLength, 1);
ASSERT (ImageInfo->GlobalTokenLength <= 4);
CopyMem (&ImageInfo->GlobalGuidTabIdxLength, PcdFfsHdr->GuidLength, 1);
ASSERT (ImageInfo->GlobalGuidTabIdxLength <= 2);
CopyMem (&ImageInfo->GlobalStrTabIdxLength, PcdFfsHdr->GlobalStrTabIdxLength, 1);
ASSERT (ImageInfo->GlobalStrTabIdxLength <= 2);
CopyMem (&ImageInfo->ImageLength, PcdFfsHdr->ImageLength, 3);
CopyMem (&ImageInfo->IndexLength, PcdFfsHdr->PcdIndexLength, 3);
CopyMem (&ImageInfo->WholeDataDefaultLength, PcdFfsHdr->WholeDataBufferLength, 3);
CopyMem (&ImageInfo->DataDefaultLength, PcdFfsHdr->DataBufferLength, 3);
CopyMem (&ImageInfo->GuidTableLength, PcdFfsHdr->GuidTableLength, 3);
ImageInfo->StringTableLength = ImageInfo->ImageLength
- sizeof (PCD_FFS_ENCODING)
- ImageInfo->DataDefaultLength
- ImageInfo->IndexLength
- ImageInfo->GuidTableLength;
ImageInfo->DataDefaultStart = PcdImageOnFlash + sizeof (PCD_FFS_ENCODING);
ImageInfo->IndexStart = ImageInfo->DataDefaultStart + ImageInfo->DataDefaultLength;
ImageInfo->GuidTableStart = (CONST EFI_GUID *)(ImageInfo->IndexStart + ImageInfo->IndexLength);
ImageInfo->StringTableStart = (CONST UINT16 *) ((UINT8 *) ImageInfo->GuidTableStart + ImageInfo->GuidTableLength);
return;
}
/**
The function builds the PCD database based on the
PCD_IMAGE on the flash.
The layout of the PCD_DATABASE is as follows:
---------------------------
| PCD_DATABASE_HEADER |
---------------------------
| GUID_TABLE | Aligned on GUID (128 bits)
---------------------------
| PCD_CALL_BACK_TABLE | Aligned on Pointer (32 bits or 64 bits)
---------------------------
| PCD_INDEX_TABLE | Aligned on PCD_INDEX (see PCD_INDEX's declaration)
---------------------------
| IMAGE_STRING_TABLE | Aligned on 16 Bits
---------------------------
| IMAGE_PCD_INDEX | Unaligned
---------------------------
| Data Defaults | Unaligned
---------------------------
| Data Buffer |
| for entries without |
| defaults |
---------------------------
@param[in] PcdImageOnFlash The PCD image on flash.
@retval VOID
--*/
UINTN
GetPcdDatabaseLen (
IN CONST UINT8 *PcdImageOnFlash,
OUT PCD_DATABASE_HEADER *Info,
OUT PCD_IMAGE_RECORD *ImageInfo
)
{
UINTN DatabaseLen;
UINTN DatabaseHeaderLength;
UINTN PcdIndexLength;
UINTN CallbackBufferLength;
GetPcdImageInfo (PcdImageOnFlash, ImageInfo);
Info->MaxCallbackNum = FixedPcdGet32(PcdMaxPcdCallBackNumber) ;
DatabaseHeaderLength = sizeof (PCD_DATABASE) - sizeof(UINT8);
PcdIndexLength = sizeof (PCD_INDEX) * ImageInfo->EntryCount;
CallbackBufferLength = sizeof (PCD_PPI_CALLBACK) * Info->MaxCallbackNum * ImageInfo->EntryCount;
Info->EntryCount = ImageInfo->EntryCount;
Info->GuidTableOffset = DatabaseHeaderLength;
Info->CallbackTableOffset = Info->GuidTableOffset + ImageInfo->GuidTableLength;
Info->PcdIndexOffset = Info->PcdIndexOffset + PcdIndexLength;
Info->ImageIndexOffset = Info->CallbackTableOffset + CallbackBufferLength;
Info->DataBufferOffset = Info->ImageIndexOffset + ImageInfo->DataDefaultLength;
Info->HiiGuidOffsetLength = ImageInfo->GlobalGuidTabIdxLength;
Info->HiiVariableOffsetLength = ImageInfo->GlobalStrTabIdxLength;
Info->ExtendedOffsetLength = ImageInfo->GlobalOffsetLength;
Info->SkuId = 0;
DatabaseLen = DatabaseHeaderLength
+ ImageInfo->GuidTableLength
+ PcdIndexLength
+ CallbackBufferLength
+ ImageInfo->IndexLength
+ ImageInfo->WholeDataDefaultLength;
Info->DatabaseLen = DatabaseLen;
return DatabaseLen;
}
/**
The function constructs a single PCD_INDEX according a index in
<PCD_IMAGE>.
@param[in] ImageIndex The starting address of a PCD index defined in PCD spec 0.51.
@param[in] Index The output PCD_INDEX.
@param[in] ImageInfo The attributes of the PCD_IMAGE as this binary stream is highly
optimized for size.
@retval UINTN The length of the current PCD index.
**/
UINTN
BuildPcdIndex (
IN CONST UINT8 *ImageIndex,
OUT PCD_INDEX *Index,
IN CONST PCD_IMAGE_RECORD *ImageInfo
)
{
UINTN SkuCount;
CONST UINT8 *ImageIndexBackUp;
ImageIndexBackUp = ImageIndex;
//
// Token Number
//
CopyMem (&Index->TokenNumber,
ImageIndex,
ImageInfo->GlobalTokenLength
);
ImageIndex += ImageInfo->GlobalTokenLength;
//
// State Byte
//
PcdImageExpandStateByte (&Index->StateByte,
*ImageIndex
);
ImageIndex += 1;
//
// Dataum Size
//
CopyMem (&Index->DatumSize,
ImageIndex,
ImageInfo->GlobalDatumLength
);
ImageIndex += ImageInfo->GlobalDatumLength;
//
// SKU_DATA
//
if (Index->StateByte.SkuEnable) {
Index->SkuCount = *ImageIndex;
SkuCount = *ImageIndex;
ImageIndex++;
Index->SkuIdArray = (UINT32) ImageIndex - (UINT32) ImageInfo->IndexStart;
ImageIndex += Index->SkuCount;
} else {
//
// There is always a default SKU_ID of zero even
// if SKU is not enabled for this PCD entry.
//
//
SkuCount = 1;
}
//
// Extended Offset
//
CopyMem (&Index->ExtendedDataOffset,
ImageIndex,
ImageInfo->GlobalOffsetLength
);
ImageIndex += ImageInfo->GlobalOffsetLength * SkuCount;
//
// DynamicEX Guid Offset
//
if (Index->StateByte.ExtendedGuidPresent) {
CopyMem (&Index->DynamicExGuid,
ImageIndex,
ImageInfo->GlobalGuidTabIdxLength
);
ImageIndex += ImageInfo->GlobalGuidTabIdxLength;
}
//
// HII_DATA
//
if (Index->StateByte.HiiEnable) {
Index->HiiData = (UINT32) ImageIndex - (UINT32) ImageInfo->IndexStart;
ImageIndex += ((ImageInfo->GlobalStrTabIdxLength + ImageInfo->GlobalGuidTabIdxLength) * SkuCount);
}
return (UINTN) (ImageIndex - ImageIndexBackUp);
}
/**
The function builds the PCD database based on the
PCD_IMAGE on the flash.
@param[in] Database The database instance.
@param[in] ImageIndex The starting address of a PCD index defined in PCD spec 0.51.
@param[in] ImageInfo The attributes of the PCD_IMAGE as this binary stream is highly
optimized for size.
@retval VOID
**/
VOID
BuildPcdDatabaseIndex (
PCD_DATABASE *Database,
UINT8 *ImageIndex,
PCD_IMAGE_RECORD *ImageInfo
)
{
UINTN Idx;
UINTN Len;
PCD_INDEX *IndexTable;
IndexTable = (PCD_INDEX *) GetAbsoluteAddress (0, Database->Info.PcdIndexOffset, Database);
for (Idx = 0; Idx < Database->Info.EntryCount; Idx++) {
Len = BuildPcdIndex (ImageIndex, &IndexTable[Idx], ImageInfo);
ImageIndex += Len;
}
return;
}
/**
The function builds the PCD database based on the
PCD_IMAGE on the flash.
@param[in] PcdImageOnFlash The PCD image on flash.
@retval VOID
--*/
VOID
BuildPcdDatabase (
UINT8 *PcdImageOnFlash
)
{
PCD_DATABASE *Database;
UINTN Len;
PCD_IMAGE_RECORD ImageInfo;
UINT8 *ImageIndex;
PCD_DATABASE_HEADER DatabaseHeader;
Len = GetPcdDatabaseLen(PcdImageOnFlash, &DatabaseHeader, &ImageInfo);
Database = BuildGuidHob (&gPcdDataBaseHobGuid, Len);
ASSERT (Database != NULL);
ZeroMem (Database, Len);
//
// Update Database header
//
CopyMem (&Database->Info, &DatabaseHeader, sizeof (DatabaseHeader));
//
// I need this to get the GuidTableOffset as we don't
// know if Database field of PCD_DATABASE starts from an aligned
// address. The compilor may add padding after PCD_DATABASE_HEADER field.
//
Database->Info.GuidTableOffset = ((UINTN) &Database->GuidTable) - (UINTN)Database;
//
// Copy Guid Table from Flash
//
CopyMem ((UINT8 *) Database + Database->Info.GuidTableOffset,
ImageInfo.GuidTableStart,
ImageInfo.GuidTableLength
);
//
// Copy ImageIndex from Flash
//
CopyMem ((UINT8 *) Database + Database->Info.ImageIndexOffset,
ImageInfo.IndexStart,
ImageInfo.IndexLength
);
//
// Copy Default Value
//
CopyMem ((UINT8 *) Database + Database->Info.DataBufferOffset,
ImageInfo.DataDefaultStart,
ImageInfo.DataDefaultLength
);
//
// Copy String Table
//
CopyMem ((UINT8 *) Database + Database->Info.StringTableOffset,
ImageInfo.StringTableStart,
ImageInfo.StringTableLength
);
ImageIndex = GetAbsoluteAddress (0, Database->Info.ImageIndexOffset, Database);
BuildPcdDatabaseIndex (Database, ImageIndex, &ImageInfo);
return;
}
/**
The function is provided by PCD PEIM and PCD DXE driver to
do the work of reading a HII variable from variable service.
@param[in] VariableGuid The Variable GUID.
@param[in] VariableName The Variable Name.
@param[out] VariableData The output data.
@param[out] VariableSize The size of the variable.
@retval EFI_SUCCESS Operation successful.
@retval EFI_SUCCESS Variablel not found.
--*/
EFI_STATUS
GetHiiVariable (
IN EFI_GUID *VariableGuid,
IN UINT16 *VariableName,
OUT VOID **VariableData,
OUT UINTN *VariableSize
)
{
UINTN Size;
EFI_STATUS Status;
VOID *Buffer;
EFI_PEI_READ_ONLY_VARIABLE_PPI *VariablePpi;
Status = PeiCoreLocatePpi (&gEfiPeiReadOnlyVariablePpiGuid, 0, NULL, &VariablePpi);
ASSERT_EFI_ERROR (Status);
Size = 0;
Status = VariablePpi->PeiGetVariable (
GetPeiServicesTablePointer (),
VariableName,
VariableGuid,
NULL,
&Size,
NULL
);
ASSERT (Status == EFI_BUFFER_TOO_SMALL);
Status = PeiCoreAllocatePool (Size, &Buffer);
ASSERT_EFI_ERROR (Status);
// declare a local for STP.
//
Status = VariablePpi->PeiGetVariable (
GetPeiServicesTablePointer (),
(UINT16 *) VariableName,
VariableGuid,
NULL,
&Size,
Buffer
);
ASSERT_EFI_ERROR (Status);
*VariableSize = Size;
*VariableData = Buffer;
return EFI_SUCCESS;
}
/**
The function is provided by PCD PEIM and PCD DXE driver to
do the work of reading a HII variable from variable service.
@param[in] VariableGuid The Variable GUID.
@param[in] VariableName The Variable Name.
@param[in] Data The input data.
@param[out] VariableSize The size of the variable.
@param[in] Offset The offset of the variable data that a PCD entry will starts from.
@retval EFI_SUCCESS Operation successful.
@retval EFI_SUCCESS Variablel not found.
--*/
EFI_STATUS
SetHiiVariable (
IN EFI_GUID *VariableGuid,
IN UINT16 *VariableName,
IN CONST VOID *Data,
IN UINTN VariableSize,
IN UINTN Offset
)
{
ASSERT (FALSE);
return EFI_INVALID_PARAMETER;
}

View File

@@ -0,0 +1,371 @@
/** @file
Private functions used by PCD PEIM.
Copyright (c) 2006, Intel Corporation
All rights reserved. This program and the accompanying materials
are licensed and made available under the terms and conditions of the BSD License
which accompanies this distribution. The full text of the license may be found at
http://opensource.org/licenses/bsd-license.php
THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
Module Name: Service.h
**/
#ifndef _SERVICE_H
#define _SERVICE_H
//
// Offset of StateByte
//
#define PCD_STATEBYTE_HIIENABLE 0x01
#define PCD_STATEBYTE_SKUENABLE 0x02
#define PCD_STATEBYTE_VPDENABLE 0x04
#define PCD_STATEBYTE_SKUDATAARRAYENABLE 0x08
#define PCD_STATEBYTE_DATUMTYPE 0x70
#define PCD_STATEBYTE_EXTENDEDGUIDPRESENT 0x80
#define PCD_DATUMTYPE_OFFSET 4
//
// The definitions for interpreting DatumType
//
#define PCD_BYTE8 (0x00 << PCD_DATUMTYPE_OFFSET)
#define PCD_BYTE16 (0x01 << PCD_DATUMTYPE_OFFSET)
#define PCD_BYTE32 (0x02 << PCD_DATUMTYPE_OFFSET)
#define PCD_BYTE64 (0x03 << PCD_DATUMTYPE_OFFSET)
#define PCD_POINTER (0x04 << PCD_DATUMTYPE_OFFSET)
#define PCD_BOOLEAN (0x05 << PCD_DATUMTYPE_OFFSET)
extern GUID gEfiPcdImageHobGuid;
/* Internal Function definitions */
VOID
PeiGetPcdEntryWorker (
IN UINTN Token,
IN CONST GUID *Guid, OPTIONAL
IN PCD_DATA_TYPE Type,
OUT VOID *Data
);
EFI_STATUS
PeiSetPcdEntryWorker (
IN UINTN Token,
IN CONST GUID *Guid, OPTIONAL
IN PCD_DATA_TYPE Type,
IN VOID *Data
);
UINTN
PeiGetPcdEntrySizeWorker (
IN UINTN Token,
IN CONST GUID *Guid OPTIONAL
);
EFI_STATUS
PeiRegisterCallBackWorker (
IN UINTN TokenNumber,
IN CONST GUID *Guid, OPTIONAL
IN PCD_PPI_CALLBACK CallBackFunction,
IN BOOLEAN Register
);
EFI_STATUS
PeiSetSku (
UINTN Id
);
EFI_STATUS
PeiGetNextTokenWorker (
IN OUT UINTN *Token,
IN CONST GUID *Guid OPTIONAL
);
UINT8 *
LocatePcdImage (
VOID
);
VOID
BuildPcdDatabase (
UINT8 *PcdImageOnFlash
)
;
extern EFI_GUID gPcdImageFileGuid;
//
// PPI Interface Implementation Declaration.
//
EFI_STATUS
EFIAPI
PeiPcdSetSku (
IN UINTN SkuId
)
;
UINT8
EFIAPI
PeiPcdGet8 (
IN UINTN TokenNumber
)
;
UINT16
EFIAPI
PeiPcdGet16 (
IN UINTN TokenNumber
)
;
UINT32
EFIAPI
PeiPcdGet32 (
IN UINTN TokenNumber
)
;
UINT64
EFIAPI
PeiPcdGet64 (
IN UINTN TokenNumber
)
;
VOID *
EFIAPI
PeiPcdGetPtr (
IN UINTN TokenNumber
)
;
BOOLEAN
EFIAPI
PeiPcdGetBool (
IN UINTN TokenNumber
)
;
UINTN
EFIAPI
PeiPcdGetSize (
IN UINTN TokenNumber
)
;
UINT8
EFIAPI
PeiPcdGet8Ex (
IN CONST EFI_GUID *Guid,
IN UINTN TokenNumber
)
;
UINT16
EFIAPI
PeiPcdGet16Ex (
IN CONST EFI_GUID *Guid,
IN UINTN TokenNumber
)
;
UINT32
EFIAPI
PeiPcdGet32Ex (
IN CONST EFI_GUID *Guid,
IN UINTN TokenNumber
)
;
UINT64
EFIAPI
PeiPcdGet64Ex (
IN CONST EFI_GUID *Guid,
IN UINTN TokenNumber
)
;
VOID *
EFIAPI
PeiPcdGetPtrEx (
IN CONST EFI_GUID *Guid,
IN UINTN TokenNumber
)
;
BOOLEAN
EFIAPI
PeiPcdGetBoolEx (
IN CONST EFI_GUID *Guid,
IN UINTN TokenNumber
)
;
UINTN
EFIAPI
PeiPcdGetSizeEx (
IN CONST EFI_GUID *Guid,
IN UINTN TokenNumber
)
;
EFI_STATUS
EFIAPI
PeiPcdSet8 (
IN UINTN TokenNumber,
IN UINT8 Value
)
;
EFI_STATUS
EFIAPI
PeiPcdSet16 (
IN UINTN TokenNumber,
IN UINT16 Value
)
;
EFI_STATUS
EFIAPI
PeiPcdSet32 (
IN UINTN TokenNumber,
IN UINT32 Value
)
;
EFI_STATUS
EFIAPI
PeiPcdSet64 (
IN UINTN TokenNumber,
IN UINT64 Value
)
;
EFI_STATUS
EFIAPI
PeiPcdSetPtr (
IN UINTN TokenNumber,
IN CONST VOID *Value
)
;
EFI_STATUS
EFIAPI
PeiPcdSetBool (
IN UINTN TokenNumber,
IN BOOLEAN Value
)
;
EFI_STATUS
EFIAPI
PeiPcdSet8Ex (
IN CONST EFI_GUID *Guid,
IN UINTN TokenNumber,
IN UINT8 Value
)
;
EFI_STATUS
EFIAPI
PeiPcdSet16Ex (
IN CONST EFI_GUID *Guid,
IN UINTN TokenNumber,
IN UINT16 Value
)
;
EFI_STATUS
EFIAPI
PeiPcdSet32Ex (
IN CONST EFI_GUID *Guid,
IN UINTN TokenNumber,
IN UINT32 Value
)
;
EFI_STATUS
EFIAPI
PeiPcdSet64Ex (
IN CONST EFI_GUID *Guid,
IN UINTN TokenNumber,
IN UINT64 Value
)
;
EFI_STATUS
EFIAPI
PeiPcdSetPtrEx (
IN CONST EFI_GUID *Guid,
IN UINTN TokenNumber,
IN CONST VOID *Value
)
;
EFI_STATUS
EFIAPI
PeiPcdSetBoolEx (
IN CONST EFI_GUID *Guid,
IN UINTN TokenNumber,
IN BOOLEAN Value
)
;
EFI_STATUS
EFIAPI
PcdRegisterCallBackOnSet (
IN UINTN TokenNumber,
IN CONST EFI_GUID *Guid, OPTIONAL
IN PCD_PPI_CALLBACK CallBackFunction
)
;
EFI_STATUS
EFIAPI
PcdUnRegisterCallBackOnSet (
IN UINTN TokenNumber,
IN CONST EFI_GUID *Guid, OPTIONAL
IN PCD_PPI_CALLBACK CallBackFunction
)
;
EFI_STATUS
EFIAPI
PeiPcdGetNextToken (
IN CONST EFI_GUID *Guid, OPTIONAL
IN OUT UINTN *TokenNumber
)
;
#endif