From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from msmail.insydesw.com.tw (ms.insydesw.com [211.75.113.220]) (using TLSv1 with cipher AES128-SHA (128/128 bits)) (No client certificate requested) by ml01.01.org (Postfix) with ESMTPS id 543B521A134AE for ; Thu, 4 May 2017 23:00:50 -0700 (PDT) Received: from msmail.insydesw.com.tw ([fe80::74f7:f173:f4aa:9a05]) by msmail.insydesw.com.tw ([fe80::74f7:f173:f4aa:9a05%11]) with mapi id 14.01.0438.000; Fri, 5 May 2017 14:00:48 +0800 From: Tim Lewis To: "Gao, Liming" , "edk2-devel@lists.01.org" Thread-Topic: [edk2] [RFC 0/3] Structure PCD value assignment in DEC/DSC Thread-Index: AQHSstb3GPxOsJ+ddEykj3cx3iwrRqHlY/YQ Date: Fri, 5 May 2017 06:00:47 +0000 Message-ID: <7236196A5DF6C040855A6D96F556A53F57B23F@msmail.insydesw.com.tw> References: <1491923803-12124-1-git-send-email-liming.gao@intel.com> In-Reply-To: <1491923803-12124-1-git-send-email-liming.gao@intel.com> Accept-Language: en-US, zh-TW X-MS-Has-Attach: X-MS-TNEF-Correlator: x-originating-ip: [98.238.234.110] MIME-Version: 1.0 Subject: Re: [RFC 0/3] Structure PCD value assignment in DEC/DSC X-BeenThere: edk2-devel@lists.01.org X-Mailman-Version: 2.1.22 Precedence: list List-Id: EDK II Development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Fri, 05 May 2017 06:00:51 -0000 Content-Language: en-US Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: quoted-printable Mike -- Sorry for the delay. We have reviewed this RFC internally and we believe it= is a useful change.=20 Thanks, Tim -----Original Message----- From: edk2-devel [mailto:edk2-devel-bounces@lists.01.org] On Behalf Of Gao,= Liming Sent: Tuesday, April 11, 2017 8:17 AM To: edk2-devel@lists.01.org Subject: [edk2] [RFC 0/3] Structure PCD value assignment in DEC/DSC Requirment: Map VOID* PCD to C structure 1. When PCD is configured as Dynam= icHii, it will be map to one EFI variable. If PCD is VOID*, it can map to t= he whole EFI variable. Most EFI variable data are defined as C structure. 2. Some PCDs are designed as C style structure, such as gEfiMdeModulePkgTok= enSpaceGuid.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 w= idth will be required when this PCD is configured as DynamicHii or DynamicV= pd. If the structure is big, it will require lots of PCDs to map its each f= ield. 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 st= yle in DEC and DSC. Then, its value will be converted to byte array and ass= igned 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 { Guid/Test.h 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 va= lue 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 m= odule 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, co= ntinue to normal edk2 build process. 4. Pcdc file will include the different functions to initialize the differe= nt PCD value on the different SKU a. BaseTools CommonLib adds the generic APIs to parse Args, Get/Set PCD v= alue. b. Pcdc file is compiled and run by Build tool, user doesn't need aware i= t. 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 sa= me at the crossing ARCHs. b. Structure field can be bits, union, nest structure, structure array, e= num, pack, unpack. c. Structure field value can be MACRO, Enum or constant value. 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 Pa= ckage 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 s= cript will generate $(WORKSPACE)\Build\PcdValueInit\PcdValueInit.c with the= structure PCD field value, and generate $(WORKSPACE)\Build\PcdValueInit\Ma= kefile 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 $(WORKSPA= CE)\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 a= s 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 B= aseTools/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 -- 2.8.0.windows.1 _______________________________________________ edk2-devel mailing list edk2-devel@lists.01.org https://lists.01.org/mailman/listinfo/edk2-devel