Pcd.inf revision 639710791a0c3735890194f88dfbf33070f5d4e1
1## @file
2# PCD PEIM produces PCD database to manage all dynamic PCD in PEI phase and install Pcd Ppi service.
3#
4# There are two PCD PPIs as follows:
5#   1) PCD_PPI 
6#      It is EDKII implementation which support Dynamic/DynamicEx Pcds.
7#   2) EFI_PEI_PCD_PPI
8#      It is defined by PI specification 1.2, Vol 3 which only support dynamicEx 
9#      type Pcd.
10# For dynamicEx type PCD, it is compatible between PCD_PPI and EFI_PEI_PCD_PPI.
11#
12# ////////////////////////////////////////////////////////////////////////////////
13# //                                                                            //
14# //                      Introduction of PCD database                          //
15# //                                                                            //
16# ////////////////////////////////////////////////////////////////////////////////
17#
18# 1, Introduction
19#    PCD database hold all dynamic type PCD information. The structure of PEI PCD 
20#    database is generated by build tools according to dynamic PCD usage for 
21#    specified platform.
22#    
23# 2, Dynamic Type PCD
24#    Dynamic type PCD is used for the configuration/setting which value is determined
25#    dynamic. In contrast, the value of static type PCD (FeatureFlag, FixedPcd, 
26#    PatchablePcd) is fixed in final generated FD image in build time. 
27#        
28#    2.1 The "dynamic" determination means one of below cases:
29#      a) The PCD setting value is produced by someone driver and consumed by 
30#         other driver in execution time.
31#      b) The PCD setting value is set/get by user from FrontPage.
32#      c) The PCD setting value is produced by platform OEM vendor in specified area.
33#    
34#    2.2 According to module distribution way, dynamic PCD could be classfied as:
35#      a) Dynamic:
36#         If module is released in source code and will be built with platform 
37#         DSC, the dynamic PCD used by this module can be accessed as:
38#                 PcdGetxx(PcdSampleDynamicPcd); 
39#         In building platform, build tools will translate PcdSampleDynamicPcd to
40#         pair of {Token Space Guid: Token Number} for this PCD. 
41#      b) DynamicEx:
42#         If module is release as binary and will not pariticpate platform building,
43#         the dynamic PCD used by this module need be accessed as:
44#               PcdGetxxEx(gEfiMyTokenspaceGuid, PcdSampleDynamicPcd)
45#         Developer need explicity gives {Token Space Guid:Token Number} as parameter
46#         in writting source code.
47#         
48#    2.3 According to PCD value's storage method, dynamic PCD could be classfied as:
49#      a) Default Storage: 
50#         - The PCD value is stored in PCD database maintained by PCD driver in boot 
51#           time memory.
52#         - This type is used for communication between PEIM/DXE driver, DXE/DXE 
53#           driver. But all set/get value will be losted after boot-time memory 
54#           is turn off.
55#         - [PcdsDynamicDefault] is used as section name for this type PCD in 
56#           platform DSC file. [PcdsDynamicExDefault] is used for dynamicEx type PCD.
57#         
58#      b) Variable Storage: 
59#         - The PCD value is stored in variable area. 
60#         - As default storage type, this type PCD could be used for PEI/DXE driver
61#           communication. But beside it, this type PCD could alsp be used to store 
62#           the value associate with a HII setting via variable interface.
63#         - In PEI phase, the PCD value could only be got but can not be set due 
64#           to variable area is readonly.
65#         - [PcdsDynamicHii] is used as section name for this type PCD in platform 
66#           DSC file. [PcdsDynamicExHii] is for dynamicEx type PCD.
67#           
68#      c) OEM specificed storage area:
69#         - The PCD value is stored in OEM specified area which base address is 
70#           specified by a FixedAtBuild PCD setting - PcdVpdBaseAddress.
71#         - The area is read only for PEI and DXE phase.
72#         - [PcdsDynamicVpd] is used as section name for this type PCD in platform 
73#           DSC file. [PcdsDynamicExVpd] is for dynamicex type PCD.
74#      
75#    2.4 When and how to use dynamic PCD
76#      Module developer do not care the used PCD is dynamic or static when writting
77#      source code/INF. Dynamic PCD and dynamic type is pointed by platform integrator 
78#      in platform DSC file. Please ref section 2.3 to get matching between dynamic
79#      PCD type and section name in DSC file.
80#    
81# 3, PCD database:
82#    Although dynamic PCD could be in different storage type as above description, 
83#    but the basic information and default value for all dynamic PCD is hold
84#    by PCD database maintained by PEI/DXE driver.
85#    
86#    As the whole EFI BIOS boot path is divided into PEI/DXE phase, the PCD database
87#    also is divided into Pei/Dxe database maintaied by PcdPeim/PcdDxe driver separatly.
88#    To make PcdPeim's driver image smaller, PEI PCD database only hold all dynamic
89#    PCD information used in PEI phase or use in both PEI/DXE phase. And DXE PCD
90#    database contains all PCDs used in PEI/DXE phase in memory.
91#    
92#    Build tool will generate PCD database into some C structure and variable for 
93#    PEI/DXE PCD driver according to dynamic PCD section in platform DSC file. 
94#    
95#    3.1 PcdPeim and PcdDxe
96#      PEI PCD database is maintained by PcdPeim driver run from flash. PcdPeim driver
97#      build guid hob in temporary memory and copy auto-generated C structure 
98#      to temporary memory for PEI PCD database. 
99#      DXE PCD database is maintained by PcdDxe driver.At entry point of PcdDxe driver,
100#      a new PCD database is allocated in boot-time memory which including all
101#      PEI PCD and DXE PCD entry.
102#      
103#      Pcd driver should run as early as possible before any other driver access
104#      dynamic PCD's value. PEI/DXE "Apriori File" mechanism make it possible by
105#      making PcdPeim/PcdDxe as first dispatching driver in PEI/DXE phase.
106#      
107#    3.2 Token space Guid/Token number, Platform token, Local token number
108#           Dynamic PCD
109#          +-----------+               +---------+
110#          |TokenSpace |               |Platform |
111#          |   Guid    |  build tool   | Token   |
112#          |    +      +-------------->| Number  |
113#          |  Token    |               +---------+`._
114#          |  Number   |                             `.
115#          +-----------+                               `.  +------+
116#                                                        `-|Local |
117#                                                          |Token |
118#                               DynamicEx PCD            ,-|Number|
119#                               +-----------+         ,-'  +------+
120#                               |TokenSpace |      ,-'
121#                               |   Guid    |  _,-'
122#                               |    +      +.'
123#                               |  Token    |
124#                               |  Number   |
125#                               +-----------+
126#    
127#    
128#      3.2.1 Pair of Token space guid + Token number
129#        Any type PCD is identified by pair of "TokenSpaceGuid + TokeNumber". But it
130#        is not easy maintained by PCD driver, and hashed token number will make 
131#        searching slowly. 
132#
133#      3.2.2 Platform Token Number
134#        "Platform token number" concept is introduced for mapping to a pair of 
135#        "TokenSpaceGuid + TokenNumber". The platform token number is generated by 
136#        build tool in autogen.h and all of them are continual in a platform scope 
137#        started from 1.(0 meaning invalid internal token number)
138#        With auto-generated "platform token number", PcdGet(PcdSampleDynamicPcd)
139#        in source code is translated to LibPcdGet(_PCD_TOKEN_PcdSampleDynamicPcd) 
140#        in autogen.h.
141#        Notes: The mapping between pair of "tokenspace guid + token number" and
142#        "internal token number" need build tool establish, so "platform token number"
143#        mechanism is not suitable for binary module which use DynamicEx type PCD.
144#        To access a dynamicEx type PCD, pair of "token space guid/token number" all need
145#        to be specificed for PcdSet/PcdGet accessing macro.
146#      
147#        Platform Token Number is started from 1, and inceased continuous. From whole 
148#        platform scope, there are two zones: PEI Zone and DXE Zone
149#                  |                      Platform Token Number
150#        ----------|----------------------------------------------------------------
151#        PEI Zone: |            1                 ~  PEI_LOCAL_TOKEN_NUMBER
152#        DXE Zone: | (PEI_LOCAL_TOKEN_NUMBER + 1) ~ (PEI_LOCAL_TOKEN_NUMBER + DXE_LOCAL_TOKEN_NUMBER)
153#        
154#      3.2.3 Local Token Number
155#        To fast searching a PCD entry in PCD database, PCD driver translate 
156#        platform token number to local token number via a mapping table.
157#        For binary DynamicEx type PCD, there is a another mapping table to translate
158#        "token space guid + token number" to local token number directly.
159#        Local token number is identifier for all internal interface in PCD PEI/DXE
160#        driver.
161#        
162#        A local token number is a 32-bit value in following meaning:
163#         32 ------------- 28 ---------- 24 -------- 0
164#          | PCD type mask  | Datum Type  |  Offset  |
165#          +-----------------------------------------+
166#        where:
167#          PCd type mask: indicate Pcd type from following macro:
168#                         PCD_TYPE_DATA
169#                         PCD_TYPE_HII
170#                         PCD_TYPE_VPD
171#                         PCD_TYPE_SKU_ENABLED
172#                         PCD_TYPE_STRING
173#          Datum Type   : indicate PCD vaue type from following macro:
174#                         PCD_DATUM_TYPE_POINTER
175#                         PCD_DATUM_TYPE_UINT8
176#                         PCD_DATUM_TYPE_UINT16
177#                         PCD_DATUM_TYPE_UINT32
178#                         PCD_DATUM_TYPE_UINT64
179#          Offset      : indicate the related offset of PCD value in PCD database array.
180#       Based on local token number, PCD driver could fast determine PCD type, value
181#       type and get PCD entry from PCD database.
182#       
183#    3.3 PCD Database C structure.
184#      PCD Database C structure is generated by build tools in PCD driver's autogen.h/
185#      autogen.c file. In generated C structure, following information is stored:
186#      - ExMapTable: This table is used translate a binary dynamicex type PCD's 
187#                    "tokenguid + token" to local token number.
188#      - LocalTokenNumberTable:
189#                    This table stores all local token number in array, use "Internal
190#                    token number" as array index to get PCD entry's offset fastly.
191#      - SizeTable:  This table stores the size information for all PCD entry.
192#      - GuidTable:  This table stores guid value for DynamicEx's token space,
193#                    HII type PCD's variable.
194#      - SkuIdTable: TBD
195#      - SystemSkuId: TBD
196#      - PCD value structure:  
197#                    Every PCD has a value record in PCD database. For different
198#                    datum type PCD has different record structure which will be 
199#                    introduced in 3.3.1
200#      
201#      In a PCD database structure, there are two major area: Init and UnInit. 
202#      Init area is use stored above PCD internal structure such as ExMapTable, 
203#      LocalTokenNumberTable etc and the (default) value of PCD which has default 
204#      value specified in platform DSC file.
205#      Unint area is used stored the value of PCD which has no default value in
206#      platform DSC file, the value of NULL, 0 specified in platform DSC file can
207#      be seemed as "no default value".
208#      
209#      3.3.1 Simple Sample PCD Database C Structure
210#        A general sample of PCD database structue is as follows:
211#        typedef struct _PCD_DATABASE {
212#          typedef struct _PCD_DATABASE_INIT {
213#            //===== Following is PCD database internal maintain structures
214#            DYNAMICEX_MAPPING ExMapTable[PEI_EXMAPPING_TABLE_SIZE];
215#            UINT32            LocalTokenNumberTable[PEI_LOCAL_TOKEN_NUMBER_TABLE_SIZE];
216#            GUID              GuidTable[PEI_GUID_TABLE_SIZE];
217#            SIZE_INFO         SizeTable[PEI_SIZE_TABLE_SIZE];
218#            UINT8             SkuIdTable[PEI_SKUID_TABLE_SIZE];
219#            SKU_ID            SystemSkuId;
220#            
221#            //===== Following is value structure for PCD with default value
222#            ....
223#            ....
224#            ....
225#          } Init;
226#          typedef struct _PCD_DATABSE_UNINIT {
227#            //==== Following is value structure for PCD without default value
228#            ....
229#            ....
230#          } UnInit;
231#        }
232#      
233#      3.3.2 PCD value structure in PCD database C structure
234#        The value's structure is generated by build tool in PCD database C structure.
235#        The PCDs in different datum type has different value structure.
236#        
237#        3.3.2.1 UINT8/UINT16/UINT32/UINT64 datum type PCD
238#          The C structure for these datum type PCD is just a UINT8/UINT16/UINT32/UINT64
239#          data member in PCD database, For example:
240#          UINT16  PcdHardwareErrorRecordLevel_d3705011_bc19_4af7_be16_f68030378c15_VariableDefault_0;
241#          Above structure is generated by build tool, the member name is "PcdCName_Guidvalue"
242#          Member type is UINT16 according to PcdHardwareErrorRecordLevel declaration
243#          in DEC file.
244#          
245#        3.3.2.2 VOID* datum type PCD
246#          The value of VOID* datum type PCD is a UINT8/UINT16 array in PCD database.
247#          
248#          3.3.2.2.1 VOID* - string type
249#            If the default value for VOID* datum type PCD like L"xxx", the PCD is 
250#            used for unicode string, and C structure of this datum type PCD is 
251#            UINT16 string array in PCD database, for example:
252#            UINT16 StringTable[29];
253#            The number of 29 in above sample is max size of a unicode string.
254#            
255#            If the default value for VOID* datum type PCD like "xxx", the PCD is
256#            used for ascii string, and C structure of this datum type PCD is 
257#            UINT8 string array in PCD database, for example:
258#            UINT8 StringTable[20];
259#            The number of 20 in above sample is max size of a ascii string.
260#            
261#          3.3.2.2.2 VOID* - byte array
262#            If the default value of VOID* datum type PCD like {'0x29', '0x01', '0xf2'}
263#            the PCD is used for byte array. The generated structrue is same as 
264#            above ascii string table,
265#            UINT8 StringTable[13];
266#            The number of 13 in above sample is max size of byte array.
267#       
268#      3.3.3 Some utility structures in PCD Database
269#        3.3.3.1 GuidTable
270#          GuidTable array is used to store all related GUID value in PCD database:
271#            - Variable GUID for HII type PCD
272#            - Token space GUID for dynamicex type PCD 
273#    
274#  Copyright (c) 2006 - 2011, Intel Corporation. All rights reserved.<BR>
275#
276#  This program and the accompanying materials
277#  are licensed and made available under the terms and conditions of the BSD License
278#  which accompanies this distribution. The full text of the license may be found at
279#  http://opensource.org/licenses/bsd-license.php
280#  THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
281#  WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
282#
283#
284##
285
286[Defines]
287  INF_VERSION                    = 0x00010005
288  BASE_NAME                      = PcdPeim
289  FILE_GUID                      = 9B3ADA4F-AE56-4c24-8DEA-F03B7558AE50
290  MODULE_TYPE                    = PEIM
291  VERSION_STRING                 = 1.0
292  PCD_IS_DRIVER                  = PEI_PCD_DRIVER
293  ENTRY_POINT                    = PcdPeimInit
294
295#
296# The following information is for reference only and not required by the build tools.
297#
298#  VALID_ARCHITECTURES           = IA32 X64 IPF EBC (EBC is for build only)
299#
300
301[Sources]
302  Service.c
303  Service.h
304  Pcd.c
305
306[Packages]
307  MdePkg/MdePkg.dec
308  MdeModulePkg/MdeModulePkg.dec
309
310[LibraryClasses]
311  BaseMemoryLib
312  PcdLib
313  PeiServicesLib
314  HobLib
315  BaseLib
316  PeimEntryPoint
317  DebugLib
318
319[Guids]
320  gPcdDataBaseHobGuid                           ## PRODUCES  ## Hob
321  gPcdDataBaseHobGuid                           ## CONSUMES  ## Hob
322
323[Ppis]
324  gEfiPeiReadOnlyVariable2PpiGuid               ## CONSUMES
325  gPcdPpiGuid                                   ## PRODUCES
326  gEfiPeiPcdPpiGuid                             ## PRODUCES
327  
328[FeaturePcd]
329  gEfiMdeModulePkgTokenSpaceGuid.PcdPeiFullPcdDatabaseEnable
330
331[Pcd]
332  gEfiMdeModulePkgTokenSpaceGuid.PcdVpdBaseAddress
333  gEfiMdeModulePkgTokenSpaceGuid.PcdMaxPeiPcdCallBackNumberPerPcdEntry || gEfiMdeModulePkgTokenSpaceGuid.PcdPeiFullPcdDatabaseEnable
334
335[Depex]
336  TRUE
337
338