On Jan 31, 2013, at 12:05 PM, "David F." <[email protected]> wrote:

> Thanks Mike.  That leads me to the next point of confusion.  Is the purpose 
> of the Platform Configuration Database (PCD) to share variables across 
> drivers, applications, and/or whatever is launching an app or driver; or is 
> it just a method the build system offers for you to define variables in a 
> configuration file instead of a .h header file?
> 


There were a couple of requirements for the edk2 that ended up turning into 
PCD. 
1) Config knobs for a driver need to be configurable by the platform so that 
they could be setup options (Hii), or constants, or SKU defined, programmed in 
the factory (VPD), etc. 
2) We needed a mechanism to support patching config values into a binary, and a 
runtime mechanism to configure a binary module. 

Both Mike and I hated code bases with large numbers of #ifdefs to turn stuff on 
and off because in our experience code will rot out in some of the #ifdef paths 
and make the entire thing very hard to maintain. 
It was also the vision that chip vendors would provide a package(s) of code to 
the platform vendor. If a chip vendor had a large number of config knobs for 
validation or just end customer configuration we wanted the person building the 
platform to be able to set the config knobs to what made sense to that 
platform. We also wanted to minimize the changes that the platform vendor would 
have to make to the chip vendors code, so syncing up with future code drops 
would be easier. 

I'm sorry that the terminology for PCD can get confusing and I think its partly 
my fault. Here is my 10,000 foot view cheat sheet for how to use/conceptualize 
PCD:
1) .DEC file - is the definition of the PCD entry. You get the pick the legal 
forms, and default values for a PCD. When in doubt make it as flexible as 
possible [PcdsFixedAtBuild, PcdsPatchableInModule, PcdsDynamic, PcdsDynamicEx].
2) .INF file - The PCD settings in the INF represent how the module was coded. 
When in doubt use the generic form [Pcd] with PcdGet32() , and [FeaturePcd] 
with FeaturePcdGet().
3) .DSC file - Within the constraints of how the PCD was defined and used in 
modules you get to pick the form of the PCD for this specific build and set 
values.
4) Ex - The Ex versions of the APIs include the GUID. These are only needed for 
binaries or modules not built together. Each build will generate a unique token 
space that the code uses, and this is to save space. 

There are some other advantages to PCDs over h files. Since in any given build 
a library is only built one time you can use FixedAtBuild PCD values to have 
different settings on a per module basis for the library. So for example you 
can pick a single driver to have very verbose DEBUG macro output while the 
reset of the system is less verbose. 

Thanks,

Andrew Fish

PS. Our dislike of lots of #ifdefs is why we ended up with FeaturePcdGet(). 
This lets you have an #ifdefs like construct where both sides always compile so 
code never rots out. As long as you compiler does a good job dead stripping you 
don't pay a size penalty in the binary. 
------------------------------------------------------------------------------
Everyone hates slow websites. So do we.
Make your web apps faster with AppDynamics
Download AppDynamics Lite for free today:
http://p.sf.net/sfu/appdyn_d2d_jan
_______________________________________________
edk2-devel mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/edk2-devel

Reply via email to