From: Laszlo Ersek <lersek@redhat.com>
To: Liming Gao <liming.gao@intel.com>, edk2-devel@lists.01.org
Subject: Re: [RFC 0/3] Structure PCD value assignment in DEC/DSC
Date: Tue, 11 Apr 2017 17:24:03 +0200 [thread overview]
Message-ID: <e41edc85-ceef-2669-4d66-34aabc1263d8@redhat.com> (raw)
In-Reply-To: <1491923803-12124-1-git-send-email-liming.gao@intel.com>
On 04/11/17 17:16, Liming Gao wrote:
> Requirment: Map VOID* PCD to C structure
> 1. When PCD is configured as DynamicHii, it will be map to one EFI variable. If PCD is VOID*, it can map to the
> whole EFI variable. Most EFI variable data are defined as C structure.
> 2. Some PCDs are designed as C style structure, such as gEfiMdeModulePkgTokenSpaceGuid.PcdPciSerialParameters.
>
> Current limitation:
> 1. VOID* PCD Value must be byte array. Its value is hard to be specified.
> 2. If single PCD is defined to map one field in structure, its offset and width will be required when this PCD
> is configured as DynamicHii or DynamicVpd. If the structure is big, it will require lots of PCDs to map its
> each field. If the structure has the bit field, its bit field can't match PCD.
>
> Proposal:
> Enhance EDKII Build system to support VOID* PCD be mapped to C structure in DEC or DSC. PCD value can be specified
> by structure field as C language style in DEC and DSC. Then, its value will be converted to byte array and assigned
> to VOID* PCD. This is a pure build enhancement, and no change in PCD driver.
> 1. New syntax in DEC and DSC defines PCD with C structure.
> a. PCD Data type will be C structure name.
> b. C structure header file and the dependent packages are required to be listed.
> c. Example in DEC [PcdsFixedAtBuild] section:
> gStructuredPcdPkgTokenSpaceGuid.PcdTest|{0xFF}|TEST|0x00010080 {
> <HeaderFile>
> Guid/Test.h
> <Packages>
> MdePkg/MdePkg.dec
> MdeModulePkg/MdeModulePkg.dec
> }
> 2. Set the value to the structure fields like normal PCD in DEC/DSC/FDF.
> a. If the field value is not specified, its default value will be zero.
> b. Example in DEC/DSC [PcdsFixedAtBuild] section:
> gStructuredPcdPkgTokenSpaceGuid.PcdTest.Bool|TRUE
> gStructuredPcdPkgTokenSpaceGuid.PcdTest.Array[1].Foo|"ABC"
> gStructuredPcdPkgTokenSpaceGuid.PcdTest.C|0xFEDC
> gStructuredPcdPkgTokenSpaceGuid.PcdTest.D|2222
> 3. Pre AutoGen phase, Build tool will prepare the value for structure PCD.
> a. Generate C file (name as pcdc file) and its Makefile to include PCD value initialization.
> i. Parse PCD field values in DEC/DSC/FDF to generate pcdc file.
> ii. Developer provides their pcdc files to customize PCD value in one module INF.
> b. Compile C file to the executable tool like BaseTools C tools.
> c. Run the executable file to output the byte array PCD value.
> d. Build tool gets the byte array PCD value and generate AutoGen code, continue to normal edk2 build process.
> 4. Pcdc file will include the different functions to initialize the different PCD value on the different SKU
> a. BaseTools CommonLib adds the generic APIs to parse Args, Get/Set PCD value.
> b. Pcdc file is compiled and run by Build tool, user doesn't need aware it.
> 5. Report
> a. Error report will point to the specified value in DEC or DSC when the value can't be assigned to structure field.
> b. Build Report will print Structure PCD value with byte array and field value both.
> 6. C Structure requirement
> a. Structure field data type can't be VOID* or UINTN. its size must be same at the crossing ARCHs.
> b. Structure field can be bits, union, nest structure, structure array, enum, pack, unpack.
> c. Structure field value can be MACRO, Enum or constant value.
My only request at this point is to please file two BZs:
- one for the feature itself (apparently the requirement exists already),
- another one for the DEC spec, to document the feature.
Thank you,
Laszlo
>
> Patch:
> This patches add TestPkg to show StructurePcd Value Assignment usage in DEC and DSC.
>
> Python StructuredPcdValueGenerator.py is added to show structure PCD usage. Its logic will be
> integrated into BaseTools later. This script bases on Package dec and Package dsc
> to convert structure PCD value to byte array. It depends on BaseTools C source CommonLib.
> Before run this script, BaseTools are required to be compiled first. This script will
> generate $(WORKSPACE)\Build\PcdValueInit\PcdValueInit.c with the structure PCD field value,
> and generate $(WORKSPACE)\Build\PcdValueInit\Makefile to compile it to the executable file.
> It also generates $(WORKSPACE)\Build\PcdValueInit\Input.txt to include the initial PCD value
> from its declartion in dec file. Last, run the generated executable file with Input.txt, and
> output the final PCD value in $(WORKSPACE)\Build\PcdValueInit\Output.txt.
>
> In Windows:
> 1. enter into edk2
> 2. type edksetup.bat --nt32
> 3. nmake -f BaseTools\Makefile
> 4. C:\Python27\python.exe TestPkg\StructuredPcdValueGenerator.py -p TestPkg\TestPkg.dec -d TestPkg\TestPkg.dsc
>
> In Linux:
> 1. enter into edk2
> 2. . edksetup.sh BaseTools
> 3. cd BaseTools
> 4. make
> 5. cd edk2
> 6. python TestPkg/StructuredPcdValueGenerator.py -p TestPkg/TestPkg.dec -d TestPkg/TestPkg.dsc
>
> After run StructuredPcdValueGenerator.py, Structure PCD value will output as byte array.
>
> Liming Gao (3):
> BaseTools: Update Makefile to work at absolute path
> BaseTools: Add PcdValueCommon logic into CommonLib
> TestPkg: Show Structure PCD value assignment
>
> BaseTools/Source/C/Common/GNUmakefile | 3 +-
> BaseTools/Source/C/Common/Makefile | 3 +-
> BaseTools/Source/C/Common/PcdValueCommon.c | 601 ++++++++++++++++++++++++
> BaseTools/Source/C/Common/PcdValueCommon.h | 78 ++++
> BaseTools/Source/C/Makefiles/app.makefile | 2 +-
> BaseTools/Source/C/Makefiles/lib.makefile | 2 +
> BaseTools/Source/C/Makefiles/ms.app | 4 +-
> TestPkg/Include/Guid/Test.h | 31 ++
> TestPkg/StructuredPcdValueGenerator.py | 702 +++++++++++++++++++++++++++++
> TestPkg/TestPkg.dec | 44 ++
> TestPkg/TestPkg.dsc | 69 +++
> 11 files changed, 1534 insertions(+), 5 deletions(-)
> create mode 100644 BaseTools/Source/C/Common/PcdValueCommon.c
> create mode 100644 BaseTools/Source/C/Common/PcdValueCommon.h
> create mode 100644 TestPkg/Include/Guid/Test.h
> create mode 100644 TestPkg/StructuredPcdValueGenerator.py
> create mode 100644 TestPkg/TestPkg.dec
> create mode 100644 TestPkg/TestPkg.dsc
>
next prev parent reply other threads:[~2017-04-11 15:24 UTC|newest]
Thread overview: 7+ messages / expand[flat|nested] mbox.gz Atom feed top
2017-04-11 15:16 [RFC 0/3] Structure PCD value assignment in DEC/DSC Liming Gao
2017-04-11 15:16 ` [RFC 1/3] BaseTools: Update Makefile to work at absolute path Liming Gao
2017-04-11 15:16 ` [RFC 2/3] BaseTools: Add PcdValueCommon logic into CommonLib Liming Gao
2017-04-11 15:16 ` [RFC 3/3] TestPkg: Show Structure PCD value assignment Liming Gao
2017-04-11 15:24 ` Laszlo Ersek [this message]
2017-04-11 16:46 ` [RFC 0/3] Structure PCD value assignment in DEC/DSC Kinney, Michael D
2017-05-05 6:00 ` Tim Lewis
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-list from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=e41edc85-ceef-2669-4d66-34aabc1263d8@redhat.com \
--to=devel@edk2.groups.io \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox