summaryrefslogtreecommitdiff
path: root/EdkModulePkg/Universal/PCD/Dxe/Service.c
diff options
context:
space:
mode:
authorqwang12 <qwang12@6f19259b-4bc3-4df7-8a09-765794883524>2006-05-29 01:48:32 +0000
committerqwang12 <qwang12@6f19259b-4bc3-4df7-8a09-765794883524>2006-05-29 01:48:32 +0000
commit4c114006de95489973d33a5415bb451bcd6cd62a (patch)
tree233fbe6da43a9351f328c2e88ffc93ae6b091b44 /EdkModulePkg/Universal/PCD/Dxe/Service.c
parenteebf7983a926007d2634708f76f7c972882ab9b6 (diff)
downloadedk2-platforms-4c114006de95489973d33a5415bb451bcd6cd62a.tar.xz
Add in GetNextToken and Register Callback Function funtionality for DXE Driver.
git-svn-id: https://edk2.svn.sourceforge.net/svnroot/edk2/trunk/edk2@309 6f19259b-4bc3-4df7-8a09-765794883524
Diffstat (limited to 'EdkModulePkg/Universal/PCD/Dxe/Service.c')
-rw-r--r--EdkModulePkg/Universal/PCD/Dxe/Service.c234
1 files changed, 192 insertions, 42 deletions
diff --git a/EdkModulePkg/Universal/PCD/Dxe/Service.c b/EdkModulePkg/Universal/PCD/Dxe/Service.c
index 52097ade7e..ebef59590f 100644
--- a/EdkModulePkg/Universal/PCD/Dxe/Service.c
+++ b/EdkModulePkg/Universal/PCD/Dxe/Service.c
@@ -22,13 +22,9 @@ Module Name: Service.c
// Compression Algorithm will take care of the size optimization.
//
-/*
-DXE_PCD_DATABASE_INIT gDXEPcdDbInit = {
- DXE_PCD_DB_INIT_VALUE
-};
-*/
+PCD_DATABASE * mPcdDatabase;
-PCD_DATABASE * gPcdDatabase;
+LIST_ENTRY mCallbackFnTable[PCD_TOTAL_TOKEN_NUMBER];
VOID *
GetWorkerByLocalTokenNumber (
@@ -54,9 +50,9 @@ GetWorkerByLocalTokenNumber (
LocalTokenNumber = GetSkuEnabledTokenNumber (LocalTokenNumber & ~PCD_TYPE_SKU_ENABLED, Size, IsPeiDb);
}
- PcdDb = IsPeiDb ? ((UINT8 *) &gPcdDatabase->PeiDb) : ((UINT8 *) &gPcdDatabase->DxeDb);
- StringTable = IsPeiDb ? gPcdDatabase->PeiDb.Init.StringTable :
- gPcdDatabase->DxeDb.Init.StringTable;
+ PcdDb = IsPeiDb ? ((UINT8 *) &mPcdDatabase->PeiDb) : ((UINT8 *) &mPcdDatabase->DxeDb);
+ StringTable = IsPeiDb ? mPcdDatabase->PeiDb.Init.StringTable :
+ mPcdDatabase->DxeDb.Init.StringTable;
Offset = LocalTokenNumber & PCD_DATABASE_OFFSET_MASK;
@@ -66,8 +62,8 @@ GetWorkerByLocalTokenNumber (
return (VOID *) (FixedPcdGet32(PcdVpdBaseAddress) + VpdHead->Offset);
case PCD_TYPE_HII:
- GuidTable = IsPeiDb ? gPcdDatabase->PeiDb.Init.GuidTable :
- gPcdDatabase->DxeDb.Init.GuidTable;
+ GuidTable = IsPeiDb ? mPcdDatabase->PeiDb.Init.GuidTable :
+ mPcdDatabase->DxeDb.Init.GuidTable;
VariableHead = (VARIABLE_HEAD *) (PcdDb + Offset);
@@ -112,11 +108,11 @@ GetWorker (
IsPeiDb = (TokenNumber <= PEI_LOCAL_TOKEN_NUMBER) ? TRUE : FALSE;
- LocalTokenNumberTable = IsPeiDb ? gPcdDatabase->PeiDb.Init.LocalTokenNumberTable :
- gPcdDatabase->DxeDb.Init.LocalTokenNumberTable;
+ LocalTokenNumberTable = IsPeiDb ? mPcdDatabase->PeiDb.Init.LocalTokenNumberTable :
+ mPcdDatabase->DxeDb.Init.LocalTokenNumberTable;
- SizeTable = IsPeiDb ? gPcdDatabase->PeiDb.Init.SizeTable:
- gPcdDatabase->DxeDb.Init.SizeTable;
+ SizeTable = IsPeiDb ? mPcdDatabase->PeiDb.Init.SizeTable:
+ mPcdDatabase->DxeDb.Init.SizeTable;
TokenNumber = IsPeiDb ? TokenNumber :
TokenNumber - PEI_LOCAL_TOKEN_NUMBER;
@@ -129,23 +125,150 @@ EFI_STATUS
DxeRegisterCallBackWorker (
IN UINTN TokenNumber,
IN CONST GUID *Guid, OPTIONAL
- IN PCD_PROTOCOL_CALLBACK CallBackFunction,
- IN BOOLEAN Register
+ IN PCD_PROTOCOL_CALLBACK CallBackFunction
)
{
+ CALLBACK_FN_ENTRY *FnTableEntry;
+ EX_PCD_ENTRY_ATTRIBUTE ExAttr;
+ LIST_ENTRY *ListHead;
+ LIST_ENTRY *ListNode;
+
+ if (Guid != NULL) {
+ GetExPcdTokenAttributes (Guid, TokenNumber, &ExAttr);
+ TokenNumber = ExAttr.LocalTokenNumberAlias;
+ }
+
+ ListHead = &mCallbackFnTable[TokenNumber];
+ ListNode = GetFirstNode (ListHead);
+
+ while (ListNode != ListHead) {
+ FnTableEntry = CR_FNENTRY_FROM_LISTNODE(ListNode, CALLBACK_FN_ENTRY, Node);
+
+ if (FnTableEntry->CallbackFn == CallBackFunction) {
+ //
+ // We only allow a Callback function to be register once
+ // for a TokenNumber. So just return EFI_SUCCESS
+ //
+ return EFI_SUCCESS;
+ }
+ ListNode = GetNextNode (ListHead, ListNode);
+ }
+
+ FnTableEntry = AllocatePool (sizeof(CALLBACK_FN_ENTRY));
+ ASSERT (FnTableEntry != NULL);
+
+ FnTableEntry->CallbackFn = CallBackFunction;
+ InsertTailList (ListHead, &FnTableEntry->Node);
return EFI_SUCCESS;
}
+
+
EFI_STATUS
-DxeGetNextTokenWorker (
- IN OUT UINTN *TokenNumber,
- IN CONST GUID *Guid OPTIONAL
+DxeUnRegisterCallBackWorker (
+ IN UINTN TokenNumber,
+ IN CONST GUID *Guid, OPTIONAL
+ IN PCD_PROTOCOL_CALLBACK CallBackFunction
+)
+{
+ CALLBACK_FN_ENTRY *FnTableEntry;
+ EX_PCD_ENTRY_ATTRIBUTE ExAttr;
+ LIST_ENTRY *ListHead;
+ LIST_ENTRY *ListNode;
+
+ if (Guid != NULL) {
+ GetExPcdTokenAttributes (Guid, TokenNumber, &ExAttr);
+ TokenNumber = ExAttr.LocalTokenNumberAlias;
+ }
+
+ ListHead = &mCallbackFnTable[TokenNumber];
+ ListNode = GetFirstNode (ListHead);
+
+ while (ListNode != ListHead) {
+ FnTableEntry = CR_FNENTRY_FROM_LISTNODE(ListNode, CALLBACK_FN_ENTRY, Node);
+
+ if (FnTableEntry->CallbackFn == CallBackFunction) {
+ //
+ // We only allow a Callback function to be register once
+ // for a TokenNumber. So we can safely remove the Node from
+ // the Link List and return EFI_SUCCESS.
+ //
+ RemoveEntryList (ListNode);
+ FreePool (FnTableEntry);
+
+ return EFI_SUCCESS;
+ }
+ ListNode = GetNextNode (ListHead, ListNode);
+ }
+
+ return EFI_INVALID_PARAMETER;
+}
+
+
+
+PCD_TOKEN_NUMBER
+ExGetNextTokeNumber (
+ IN CONST EFI_GUID *Guid,
+ IN PCD_TOKEN_NUMBER TokenNumber,
+ IN EFI_GUID *GuidTable,
+ IN UINTN SizeOfGuidTable,
+ IN DYNAMICEX_MAPPING *ExMapTable,
+ IN UINTN SizeOfExMapTable
)
{
- return EFI_SUCCESS;
+ EFI_GUID *MatchGuid;
+ UINTN Idx;
+ UINTN GuidTableIdx;
+ BOOLEAN Found;
+
+ MatchGuid = ScanGuid (GuidTable, SizeOfGuidTable, Guid);
+ if (MatchGuid == NULL) {
+ return PCD_INVALID_TOKEN_NUMBER;
+ }
+
+ Found = FALSE;
+ GuidTableIdx = MatchGuid - GuidTable;
+ for (Idx = 0; Idx < SizeOfExMapTable; Idx++) {
+ if (ExMapTable[Idx].ExGuidIndex == GuidTableIdx) {
+ Found = TRUE;
+ break;
+ }
+ }
+
+ if (Found) {
+ if (TokenNumber == PCD_INVALID_TOKEN_NUMBER) {
+ return ExMapTable[Idx].ExTokenNumber;
+ }
+
+ for ( ; Idx < SizeOfExMapTable; Idx++) {
+ if (ExMapTable[Idx].ExTokenNumber == TokenNumber) {
+ Idx++;
+ if (Idx == SizeOfExMapTable) {
+ //
+ // Exceed the length of ExMap Table
+ //
+ return PCD_INVALID_TOKEN_NUMBER;
+ } else if (ExMapTable[Idx].ExGuidIndex == GuidTableIdx) {
+ //
+ // Found the next match
+ //
+ return ExMapTable[Idx].ExTokenNumber;
+ } else {
+ //
+ // Guid has been changed. It is the next Token Space Guid.
+ // We should flag no more TokenNumber.
+ //
+ return PCD_INVALID_TOKEN_NUMBER;
+ }
+ }
+ }
+ }
+
+ return PCD_INVALID_TOKEN_NUMBER;
}
+
@@ -156,9 +279,10 @@ BuildPcdDxeDataBase (
{
PEI_PCD_DATABASE *PeiDatabase;
EFI_HOB_GUID_TYPE *GuidHob;
+ UINTN Idx;
- gPcdDatabase = AllocateZeroPool (sizeof(PCD_DATABASE));
- ASSERT (gPcdDatabase != NULL);
+ mPcdDatabase = AllocateZeroPool (sizeof(PCD_DATABASE));
+ ASSERT (mPcdDatabase != NULL);
GuidHob = GetFirstGuidHob (&gPcdDataBaseHobGuid);
ASSERT (GuidHob != NULL);
@@ -167,12 +291,20 @@ BuildPcdDxeDataBase (
//
// Copy PCD Entries refereneced in PEI phase to PCD DATABASE
//
- CopyMem (&gPcdDatabase->PeiDb, PeiDatabase, sizeof (PEI_PCD_DATABASE));
+ CopyMem (&mPcdDatabase->PeiDb, PeiDatabase, sizeof (PEI_PCD_DATABASE));
//
// Copy PCD Entries with default value to PCD DATABASE
//
- CopyMem (&gPcdDatabase->DxeDb.Init, &gDXEPcdDbInit, sizeof(DXE_PCD_DATABASE_INIT));
+ CopyMem (&mPcdDatabase->DxeDb.Init, &gDXEPcdDbInit, sizeof(DXE_PCD_DATABASE_INIT));
+
+
+ //
+ // Initialized the Callback Function Table
+ //
+ for (Idx = 0; Idx < PCD_TOTAL_TOKEN_NUMBER; Idx++) {
+ InitializeListHead (&mCallbackFnTable[Idx]);
+ }
return;
}
@@ -233,18 +365,18 @@ GetSkuEnabledTokenNumber (
ASSERT ((LocalTokenNumber & PCD_TYPE_SKU_ENABLED) == 0);
- PcdDb = IsPeiDb ? (UINT8 *) &gPcdDatabase->PeiDb : (UINT8 *) &gPcdDatabase->DxeDb;
+ PcdDb = IsPeiDb ? (UINT8 *) &mPcdDatabase->PeiDb : (UINT8 *) &mPcdDatabase->DxeDb;
SkuHead = (SKU_HEAD *) (PcdDb + (LocalTokenNumber & PCD_DATABASE_OFFSET_MASK));
Value = (UINT8 *) (PcdDb + SkuHead->SkuDataStartOffset);
- PhaseSkuIdTable = IsPeiDb ? gPcdDatabase->PeiDb.Init.SkuIdTable :
- gPcdDatabase->DxeDb.Init.SkuIdTable;
+ PhaseSkuIdTable = IsPeiDb ? mPcdDatabase->PeiDb.Init.SkuIdTable :
+ mPcdDatabase->DxeDb.Init.SkuIdTable;
SkuIdTable = &PhaseSkuIdTable[SkuHead->SkuIdTableOffset];
for (i = 0; i < SkuIdTable[0]; i++) {
- if (gPcdDatabase->PeiDb.Init.SystemSkuId == SkuIdTable[i + 1]) {
+ if (mPcdDatabase->PeiDb.Init.SystemSkuId == SkuIdTable[i + 1]) {
break;
}
}
@@ -286,6 +418,24 @@ InvokeCallbackOnSet (
UINTN Size
)
{
+ CALLBACK_FN_ENTRY *FnTableEntry;
+ LIST_ENTRY *ListHead;
+ LIST_ENTRY *ListNode;
+
+ ListHead = &mCallbackFnTable[TokenNumber];
+ ListNode = GetFirstNode (ListHead);
+
+ while (ListNode != ListHead) {
+ FnTableEntry = CR_FNENTRY_FROM_LISTNODE(ListNode, CALLBACK_FN_ENTRY, Node);
+
+ FnTableEntry->CallbackFn(Guid,
+ (Guid == NULL) ? TokenNumber : ExTokenNumber,
+ Data,
+ Size);
+
+ ListNode = GetNextNode (ListHead, ListNode);
+ }
+
return;
}
@@ -314,8 +464,8 @@ SetWorker (
IsPeiDb = (TokenNumber <= PEI_LOCAL_TOKEN_NUMBER) ? TRUE : FALSE;
- LocalTokenNumberTable = IsPeiDb ? gPcdDatabase->PeiDb.Init.LocalTokenNumberTable :
- gPcdDatabase->DxeDb.Init.LocalTokenNumberTable;
+ LocalTokenNumberTable = IsPeiDb ? mPcdDatabase->PeiDb.Init.LocalTokenNumberTable :
+ mPcdDatabase->DxeDb.Init.LocalTokenNumberTable;
TokenNumber = IsPeiDb ? TokenNumber
: TokenNumber - PEI_LOCAL_TOKEN_NUMBER;
@@ -406,10 +556,10 @@ SetWorkerByLocalTokenNumber (
Offset = LocalTokenNumber & PCD_DATABASE_OFFSET_MASK;
- PcdDb = IsPeiDb ? ((UINT8 *) &gPcdDatabase->PeiDb) : ((UINT8 *) &gPcdDatabase->DxeDb);
+ PcdDb = IsPeiDb ? ((UINT8 *) &mPcdDatabase->PeiDb) : ((UINT8 *) &mPcdDatabase->DxeDb);
- StringTable = IsPeiDb ? gPcdDatabase->PeiDb.Init.StringTable :
- gPcdDatabase->DxeDb.Init.StringTable;
+ StringTable = IsPeiDb ? mPcdDatabase->PeiDb.Init.StringTable :
+ mPcdDatabase->DxeDb.Init.StringTable;
InternalData = PcdDb + Offset;
@@ -426,8 +576,8 @@ SetWorkerByLocalTokenNumber (
//
// Bug Bug: Please implement this
//
- GuidTable = IsPeiDb ? gPcdDatabase->PeiDb.Init.GuidTable :
- gPcdDatabase->DxeDb.Init.GuidTable;
+ GuidTable = IsPeiDb ? mPcdDatabase->PeiDb.Init.GuidTable :
+ mPcdDatabase->DxeDb.Init.GuidTable;
VariableHead = (VARIABLE_HEAD *) (PcdDb + Offset);
@@ -542,9 +692,9 @@ GetExPcdTokenAttributes (
EFI_GUID *GuidTable;
UINT16 *SizeTable;
- ExMap = gPcdDatabase->PeiDb.Init.ExMapTable;
- GuidTable = gPcdDatabase->PeiDb.Init.GuidTable;
- SizeTable = gPcdDatabase->PeiDb.Init.SizeTable;
+ ExMap = mPcdDatabase->PeiDb.Init.ExMapTable;
+ GuidTable = mPcdDatabase->PeiDb.Init.GuidTable;
+ SizeTable = mPcdDatabase->PeiDb.Init.SizeTable;
for (i = 0; i < PEI_EXMAPPING_TABLE_SIZE; i++) {
if ((ExTokenNumber == ExMap[i].ExTokenNumber) &&
@@ -560,9 +710,9 @@ GetExPcdTokenAttributes (
}
}
- ExMap = gPcdDatabase->DxeDb.Init.ExMapTable;
- GuidTable = gPcdDatabase->DxeDb.Init.GuidTable;
- SizeTable = gPcdDatabase->DxeDb.Init.SizeTable;
+ ExMap = mPcdDatabase->DxeDb.Init.ExMapTable;
+ GuidTable = mPcdDatabase->DxeDb.Init.GuidTable;
+ SizeTable = mPcdDatabase->DxeDb.Init.SizeTable;
for (i = 0; i < DXE_EXMAPPING_TABLE_SIZE; i++) {
if ((ExTokenNumber == ExMap[i].ExTokenNumber) &&