Check in the Pcd service Driver/PEIM according to the new way of generating PCD Database

LIMITATION:

1) ONLY dynamic type PCD is supported for now. DynamicEx is not supported.
2) HII enable and VPD is not tested.

git-svn-id: https://edk2.svn.sourceforge.net/svnroot/edk2/trunk/edk2@253 6f19259b-4bc3-4df7-8a09-765794883524
This commit is contained in:
qwang12
2006-05-24 08:16:20 +00:00
parent dbdaaec45c
commit 52e1905d39
8 changed files with 1648 additions and 1359 deletions

View File

@@ -18,27 +18,251 @@ Module Name: Service.h
#ifndef _SERVICE_H
#define _SERVICE_H
VOID
DxeGetPcdEntryWorker (
IN UINTN Token,
IN CONST EFI_GUID *Guid, OPTIONAL
IN PCD_DATA_TYPE Type,
OUT VOID *Data
);
#define USE_AUTOGEN
EFI_STATUS
DxeSetPcdEntryWorker (
IN UINTN Token,
IN CONST EFI_GUID *Guid, OPTIONAL
IN PCD_DATA_TYPE Type,
IN CONST VOID *Data
);
#ifndef USE_AUTOGEN
//
// The following definition will be generated by build tool
//
UINTN
DxeGetPcdEntrySizeWorker (
IN UINTN Token,
IN CONST EFI_GUID *Guid OPTIONAL
);
//
// Common definitions
//
#define PCD_TYPE_SHIFT 24
#define PCD_TYPE_DATA (0x00 << PCD_TYPE_SHIFT)
#define PCD_TYPE_HII (0x80 << PCD_TYPE_SHIFT)
#define PCD_TYPE_VPD (0x40 << PCD_TYPE_SHIFT)
#define PCD_TYPE_SKU_ENABLED (0x20 << PCD_TYPE_SHIFT)
#define PCD_DATABASE_OFFSET_MASK (~(PCD_TYPE_HII | PCD_TYPE_VPD | PCD_TYPE_SKU_ENABLED))
typedef struct {
UINT32 ExTokenNumber;
UINT32 LocalTokenNumber; // PCD Number of this particular platform build
UINT16 ExGuidIndex; // Index of GuidTable
} DYNAMICEX_MAPPING;
typedef struct {
UINT32 SkuDataStartOffset; //We have to use offsetof MACRO as we don't know padding done by compiler
UINT32 SkuIdTableOffset; //Offset from the PCD_DB
} SKU_HEAD;
typedef struct {
UINT16 GuidTableIndex; // Offset in Guid Table in units of GUID.
UINT16 StringIndex; // Offset in String Table in units of UINT16.
UINT16 Offset; // Offset in Variable
} VARIABLE_HEAD ;
typedef struct {
UINT32 Offset;
} VPD_HEAD;
typedef struct {
UINT32 LocalTokenNumber;
UINT16 TokenNumber;
UINT16 Size;
} SIZEINFO;
#define offsetof(s,m) (UINT32)&(((s *)0)->m)
//
// C Structure generate for PEI PCD Database
//
#define PEI_EXMAPPING_TABLE_SIZE 1
#define PEI_GUID_TABLE_SIZE 1
#define PEI_LOCAL_TOKEN_NUMBER 1
#define PEI_EXTOKEN_NUMBER 1
#define PEI_STRING_TABLE_SIZE 2
#define PEI_SKUID_TABLE_SIZE 3
#define PEI_SIZE_TABLE_SIZE 1
#define PEI_DATABASE_EMPTRY FALSE
#define PEI_DYNAMICEX_MAPPING_EMPTY FALSE
#define PEI_GUID_TABLE_EMPTY FALSE
#define PEI_STRINGTABLE_EMPTY FALSE
#define PEI_SIZETABLE_EMPTY FALSE
#define PEI_SKUID_TABLE_EMPTY FALSE
typedef struct {
DYNAMICEX_MAPPING ExMapTable[PEI_EXMAPPING_TABLE_SIZE];
EFI_GUID GuidTable[PEI_GUID_TABLE_SIZE];
UINT32 LocalTokenNumberTable[PEI_LOCAL_TOKEN_NUMBER];
UINT16 StringTable[PEI_STRING_TABLE_SIZE];
UINT16 SizeTable[PEI_LOCAL_TOKEN_NUMBER];
SKU_ID SkuIdTable[PEI_SKUID_TABLE_SIZE];
SKU_ID SystemSkuId;
} PEI_PCD_DATABASE_INIT;
typedef struct {
UINT8 Dummy;
} PEI_PCD_DATABASE_UNINIT;
//
// Following code should be generated for PCD DXE driver
//
#define DXE_EXMAPPING_TABLE_SIZE 1
#define DXE_GUID_TABLE_SIZE 1
#define DXE_TOKEN_NUMBER 1
#define DXE_EXTOKEN_NUMBER 1
#define DXE_STRING_TABLE_SIZE 2
#define DXE_SKUID_TABLE_SIZE 3
#define DXE_SIZE_TABLE_SIZE 1
#define DXE_DATABASE_EMPTRY FALSE
#define DXE_DYNAMICEX_MAPPING_EMPTY FALSE
#define DXE_GUID_TABLE_EMPTY FALSE
#define DXE_STRINGTABLE_EMPTY FALSE
#define DXE_SIZETABLE_EMPTY FALSE
#define DXE_SKUID_TABLE_EMPTY FALSE
typedef struct {
DYNAMICEX_MAPPING ExMapTable[DXE_EXMAPPING_TABLE_SIZE];
EFI_GUID GuidTable[DXE_GUID_TABLE_SIZE];
UINT32 LocalTokenNumberTable[DXE_TOKEN_NUMBER];
UINT16 StringTable[DXE_STRING_TABLE_SIZE];
UINT16 SizeTable[DXE_TOKEN_NUMBER];
SKU_ID SkuIdTable[DXE_SKUID_TABLE_SIZE];
} DXE_PCD_DATABASE_INIT;
typedef struct {
UINT8 Dummy;
} DXE_PCD_DATABASE_UNINIT;
#define DXE_PCD_DB_INIT_VALUE \
/* ExMapTable */ \
{ \
{ /* ExTokenNumber */ 0x00000001, /* LocalTokenNumberIndex */ 0, /* ExGuidIndex */ 0} \
}, \
\
/* GuidTable */ \
{ \
{ 0xBB25CF6F, 0xF1D4, 0x11D2, {0x9A, 0x0C, 0x00, 0x90, 0x27, 0x3F, 0xC1, 0xFD }} \
}, \
\
/* LocalTokenNumberTable */ \
{ \
0 \
}, \
\
/* StringTable */ \
{ \
L"\0" \
}, \
\
/* SizeTable */ \
{ \
4 \
}, \
\
/* SkuIdTable */ \
{ \
/*MaxSku*/ 2, /*SkuId*/ 100, /*SkuId*/200 \
},\
\
//
// End of Autogen Code
//
#endif
/*
typedef struct {
PEI_PCD_DATABASE_INIT Init;
PEI_PCD_DATABASE_UNINIT Uninit;
} PEI_PCD_DATABASE;
typedef struct {
DXE_PCD_DATABASE_INIT Init;
DXE_PCD_DATABASE_UNINIT Uninit;
} DXE_PCD_DATABASE;
typedef struct {
PEI_PCD_DATABASE PeiDb;
DXE_PCD_DATABASE DxeDb;
} PCD_DATABASE;
*/
//
// Internal Functions
//
EFI_STATUS
SetWorker (
UINTN TokenNumber,
VOID *Data,
UINTN Size,
BOOLEAN PtrType
)
;
EFI_STATUS
ExSetWorker (
IN UINT32 ExTokenNumber,
IN CONST EFI_GUID *Guid,
VOID *Data,
UINTN Size,
BOOLEAN PtrType
)
;
VOID *
GetWorker (
UINTN TokenNumber
)
;
VOID *
ExGetWorker (
IN CONST EFI_GUID *Guid,
IN UINTN ExTokenNumber,
IN UINTN GetSize
)
;
UINT32
GetSkuEnabledTokenNumber (
UINT32 LocalTokenNumber,
UINTN Size,
BOOLEAN IsPeiDb
)
;
EFI_STATUS
GetHiiVariable (
IN EFI_GUID *VariableGuid,
IN UINT16 *VariableName,
OUT VOID ** VariableData,
OUT UINTN *VariableSize
)
;
EFI_STATUS
DxeRegisterCallBackWorker (
@@ -48,11 +272,6 @@ DxeRegisterCallBackWorker (
IN BOOLEAN Reigster
);
EFI_STATUS
DxeSetSku (
UINTN Id
);
EFI_STATUS
DxeGetNextTokenWorker (
IN OUT UINTN *Token,
@@ -60,10 +279,26 @@ DxeGetNextTokenWorker (
);
VOID
InitPcdDxeDataBase (
BuildPcdDxeDataBase (
VOID
);
typedef struct {
UINTN TokenNumber;
UINTN Size;
UINT32 LocalTokenNumberAlias;
BOOLEAN IsPeiDb;
} EX_PCD_ENTRY_ATTRIBUTE;
VOID
GetExPcdTokenAttributes (
IN CONST EFI_GUID *Guid,
IN UINT32 ExTokenNumber,
OUT EX_PCD_ENTRY_ATTRIBUTE *ExAttr
)
;
//
// Protocol Interface function declaration.
//
@@ -339,61 +574,20 @@ DxePcdGetNextToken (
)
;
EFI_STATUS
SetWorkerByLocalTokenNumber (
UINT32 LocalTokenNumber,
VOID *Data,
UINTN Size,
BOOLEAN PtrType,
BOOLEAN IsPeiDb
)
;
/*
This DXE_PCD_DATABASE layout. The difference of DXE_PCD_DATABASE
and PEI_PCD_DATABASE is as follows:
extern EFI_GUID gPcdDataBaseHobGuid;
1) No PCD_CALL_BACK_TABLE; DXE_PCD_DATABASE maintain a LinkList for the
callback function registered.
extern PCD_DATABASE * gPcdDatabase;
---------------------------
| LIST_ENTRY GuidSpaceHead|
---------------------------
| PCD_DATABASE_HEADER |
---------------------------
| GUID_TABLE | Aligned on GUID (128 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 |
---------------------------
*/
typedef struct {
LIST_ENTRY ListNode;
LIST_ENTRY TokenSpaceHead;
CONST EFI_GUID *GuidSpace;
} PCD_GUID_SPACE;
typedef struct {
LIST_ENTRY ListNode;
LIST_ENTRY CallbackListHead;
UINTN TokeNumber;
} PCD_TOKEN_SPACE;
typedef struct {
LIST_ENTRY ListNode;
PCD_PROTOCOL_CALLBACK CallbackFunction;
} PCD_CALLBACK_ENTRY;
#define PCD_GUID_SPACE_FROM_LISTNODE(a) \
_CR(a, PCD_GUID_SPACE, ListNode)
#define PCD_TOKEN_SPACE_FROM_LISTNODE(a) \
_CR(a, PCD_TOKEN_SPACE, ListNode)
#define PCD_CALLBACK_ENTRY_FROM_LISTNODE(a) \
_CR(a, PCD_CALLBACK_ENTRY, ListNode)
extern DXE_PCD_DATABASE_INIT gDXEPcdDbInit;
#endif