From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mail02.groups.io (mail02.groups.io [66.175.222.108]) by spool.mail.gandi.net (Postfix) with ESMTPS id 2F5A2740032 for ; Thu, 9 Nov 2023 04:06:08 +0000 (UTC) DKIM-Signature: a=rsa-sha256; bh=QGdfezeZpcW/hXkWEL8vCX7jC42JAzLJzgMFaLkEjhI=; c=relaxed/simple; d=groups.io; h=ARC-Seal:ARC-Message-Signature:ARC-Authentication-Results:From:To:CC:Subject:Thread-Topic:Thread-Index:Date:Message-ID:References:In-Reply-To:Accept-Language:MIME-Version:Precedence:List-Subscribe:List-Help:Sender:List-Id:Mailing-List:Delivered-To:Reply-To:List-Unsubscribe-Post:List-Unsubscribe:Content-Language:Content-Type:Content-Transfer-Encoding; s=20140610; t=1699502766; v=1; b=TQtdEKoDAIZpx9zJsaNcdUkAbwMiFcvXWzl0nm9qjsdaGR3fK5340C81SX1JaEiUFqBj2uQk oLMog8lhK2s8TOQ90GRjxZF3bp9/YcvT/TbmGvSTGjyJFWe9cYOykb8AHeDygMctsGkbGLzLOME GcPStdc6c0mGGi8QlLRneVqg= X-Received: by 127.0.0.2 with SMTP id 5YuwYY7687511xne5DFPHIzU; Wed, 08 Nov 2023 20:06:06 -0800 X-Received: from mgamail.intel.com (mgamail.intel.com [198.175.65.9]) by mx.groups.io with SMTP id smtpd.web11.114613.1699502764802980354 for ; Wed, 08 Nov 2023 20:06:06 -0800 X-IronPort-AV: E=McAfee;i="6600,9927,10888"; a="8560719" X-IronPort-AV: E=Sophos;i="6.03,288,1694761200"; d="scan'208";a="8560719" X-Received: from orsmga006.jf.intel.com ([10.7.209.51]) by orvoesa101.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 08 Nov 2023 20:06:05 -0800 X-ExtLoop1: 1 X-IronPort-AV: E=McAfee;i="6600,9927,10888"; a="739727597" X-IronPort-AV: E=Sophos;i="6.03,288,1694761200"; d="scan'208";a="739727597" X-Received: from orsmsx603.amr.corp.intel.com ([10.22.229.16]) by orsmga006.jf.intel.com with ESMTP/TLS/AES256-GCM-SHA384; 08 Nov 2023 20:06:03 -0800 X-Received: from orsmsx610.amr.corp.intel.com (10.22.229.23) by ORSMSX603.amr.corp.intel.com (10.22.229.16) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256) id 15.1.2507.34; Wed, 8 Nov 2023 20:06:03 -0800 X-Received: from orsmsx602.amr.corp.intel.com (10.22.229.15) by ORSMSX610.amr.corp.intel.com (10.22.229.23) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256) id 15.1.2507.34; Wed, 8 Nov 2023 20:06:02 -0800 X-Received: from orsedg603.ED.cps.intel.com (10.7.248.4) by orsmsx602.amr.corp.intel.com (10.22.229.15) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256) id 15.1.2507.34 via Frontend Transport; Wed, 8 Nov 2023 20:06:02 -0800 X-Received: from NAM11-BN8-obe.outbound.protection.outlook.com (104.47.58.169) by edgegateway.intel.com (134.134.137.100) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.1.2507.34; Wed, 8 Nov 2023 20:06:02 -0800 ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=kEnE3GSMfnROCpoh0B1H6bxSYLawbUaC5znHC7sxzfQO15XwMc4D/EQN5TetZsTL6lyxSrG2wqYcoQmEpwgrb0/GNDyUp5ELAZrP1r6R3c10KzRh2+Z+dzz/Rk+7tu68kZY0Vk3umTcUzncPOQoVFFj+ZqzT6mxZFw9wA8NOkrw4hzRB6khSfq5jB47pBZzd8rcDcieX7K2anVtEdUO+MdhOSDTr4XohccSkUJIxSdr2DzdJCw8j6XbLW/VJmK3dasyQF/tRLrNAyKUzQsvnss+cGmtfdWRpDIPUtixGjcOW3Z0SrKJXFZIpbwKRcE5i0pzbWSwNdjttKA46r0U17w== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector9901; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-AntiSpam-MessageData-ChunkCount:X-MS-Exchange-AntiSpam-MessageData-0:X-MS-Exchange-AntiSpam-MessageData-1; bh=PMnjFKPZDkkHlMRItFGZVwXE+5SGZpc69wZYzmD3A0A=; b=fLPVr3zk5vyEnk6siHErjwRn28zx6VNBo8/WeY9/GkS1EsORTycKSaHG8p8A5WmS3oqCT25Jus58hKlG5FxPhvQtj5DbxZ5TWXs0u1ySgViIs0eDSgJj2jllig7DPox4qgB25m2e7bzrQ8GzPIGKvXvwL/Vj+RgQ3R86lE2ZiCmV0N2GQyROI5jSSP2M6Nn+ZGtOclzdkJZlU3sRz4jSpo4ijd+d5rvpCRo0wxL51DeC1vIkAhkbZQOG10LuMLqhsyd7/2PduggS6GmnGyLUUiaMC7vFMz0TLt3hPJytASYsaEin3I0pqh3MDzXQ6jpRhW34MCb30xryzbuotGGajA== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass smtp.mailfrom=intel.com; dmarc=pass action=none header.from=intel.com; dkim=pass header.d=intel.com; arc=none X-Received: from BN9PR11MB5292.namprd11.prod.outlook.com (2603:10b6:408:119::12) by PH7PR11MB6474.namprd11.prod.outlook.com (2603:10b6:510:1f2::19) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.6954.28; Thu, 9 Nov 2023 04:05:59 +0000 X-Received: from BN9PR11MB5292.namprd11.prod.outlook.com ([fe80::a648:bda2:c11b:b840]) by BN9PR11MB5292.namprd11.prod.outlook.com ([fe80::a648:bda2:c11b:b840%4]) with mapi id 15.20.6977.018; Thu, 9 Nov 2023 04:05:59 +0000 From: "Arun Sura" To: "Chiu, Chasel" , "devel@edk2.groups.io" CC: "Duggapu, Chinni B" , "Desimone, Nathaniel L" , "Ng, Ray Han Lim" , "Zeng, Star" , "Kuo, Ted" , "S, Ashraf Ali" , "Mohapatra, Susovan" Subject: Re: [edk2-devel] [PATCH] IntelFsp2Pkg\Tools\ConfigEditor: Added new USF config workstream support Config Edit utility addition/changes. Thread-Topic: [PATCH] IntelFsp2Pkg\Tools\ConfigEditor: Added new USF config workstream support Config Edit utility addition/changes. Thread-Index: AQHaEf+EuQSOWO7qa0u04XGgdBIfDbBw/KkAgABirKA= Date: Thu, 9 Nov 2023 04:05:58 +0000 Message-ID: References: <20231108045258.13690-1-arun.surax.soundara.pandian@intel.com> In-Reply-To: Accept-Language: en-US X-MS-Has-Attach: X-MS-TNEF-Correlator: x-ms-publictraffictype: Email x-ms-traffictypediagnostic: BN9PR11MB5292:EE_|PH7PR11MB6474:EE_ x-ms-office365-filtering-correlation-id: 6d7e661a-fd1f-499e-ee48-08dbe0d92dc0 x-ms-exchange-senderadcheck: 1 x-ms-exchange-antispam-relay: 0 x-microsoft-antispam-message-info: S98cWSwuQTSMWqfFDzWaWsnHBX/2/r0+2HIOCdroJMYH4HUkJ/ZdbwSpHlUHpkPc6mgR7R/BWtxSHoAqA7iRtnArRFCr7QY7jzmIFMhjKpEAUYAg4Ma4j6vU8EI8LN6F04VFXCmgt8zWCbi0m69X4SUVX8zdLrA9HxhKp7oIbrsvFgaE0fn3ftP/0GMtqPqhBkpx6tBMRJ6e5Lc5oMYAZ0NkI8P0hSHqDTESOlcwSFU4EsKWCVoaPTWQzVqW4zjS0jkYpVDKGlyDxCk2yvsyDnn7DoSZbkqclBY2VHbqmlZWQQnqZQUNSr004SqZKfMcRPAlJMWmcegZrVKis2CZIhlQL4myb+VT4AP0UJK0ltwxqlZ8JcHZVecjjmyKH0ClHivEfSpkWS+1v34r75DrTvn7d+fdM/50lhVMxXuLWoa2pl4Qoh3VEckn/jFYh0JReoa2KgjZPzSqEQrrAtmpnZucwQTfDWA41PqFME8tdrxLnQ8gBd7qF1OcmJGzicAmZLbL98Ef4gfOvwktbemexVHT04D4o9oxnScOqvRU0uUYB7WONW6Dd/nFBooqdSPIf2iecMsdVoYwAHhuqWGej9CitdJqlXI6EIaUA0K1+jcJGuL6hF7jxmw0vucO4rWvNyUSqjE5SBuEmrehxqOz6w== x-ms-exchange-antispam-messagedata-chunkcount: 1 x-ms-exchange-antispam-messagedata-0: =?us-ascii?Q?4M92y1H1WJO/HzRQ41ZqWlV5pQGXqvrZ/W0EclZdBodi4r/pQbz0bYflWNX/?= =?us-ascii?Q?rAyZlv8NF3WMlWyXqDYNt9GKJXCT23IsjZBeFPmYajf2IXxWqok+lz5+WbcP?= =?us-ascii?Q?w6vKruFB3YwbTWzjLlL5byUEXvUXwX9780PPZAWHcGBwAlCp1ZZ2e4np/BiU?= =?us-ascii?Q?e/dKjSkJljycSaUu6emOLlCTiANZnQyvAaI9NduN90vyl/iu+vvabvv68asy?= =?us-ascii?Q?uTz0x0lT/xCNhRcVNHeJvqEoz+vFUu5G7e0jgTXl/Bk2qIRLkCzqm8jqXgQk?= =?us-ascii?Q?SQthK2JoxleoihPtjDgfmL0XgTN/FPNuNE1mJPOuoy3KC6b/Te3NAop3TFXU?= =?us-ascii?Q?Mlv7C4JvyEYt5Z18IG5Jfuqx5nQsslYK3A2/PsKQzJ/lMJDzRDEWp2cGqG1M?= =?us-ascii?Q?GBvJnXd3soupozEj16UhHkhT7Cqoy0VXOUF4+/wfLCph9kmWeNd1jwrt4xb0?= =?us-ascii?Q?vZyJ2fmWoV/6XHQCrjGKE05w6wxvEa82Mxw33hlH7peGr+/i7bEkAembQrTD?= =?us-ascii?Q?xx4q733wfuAuPG4NqA4LVU6Vxni9dd/Iv3NTs3dDgFUsrVKDFOm1t1UNDYg6?= =?us-ascii?Q?0txSM58Qb+ZEwWPlhAk4hnu9WzMfrgYB3iUrHQO93ZIvQrIBxQXBx5iqMRIl?= =?us-ascii?Q?V+eHE8nPIn0+HF6pHcMltqW+E4vNTVXUfCbEY3TQg1kfQEr7Vc0IMKEHVSQw?= =?us-ascii?Q?K6xeZzCWZ1f7Dh1756qoQQPF+h1gzebaSLH+jOY3Y94QKNvN/MgJOu1o1BEB?= =?us-ascii?Q?AA3d7UZLnB1b7o9L0NC1QgLlpC0IyY+YuD01XC7R+6Tq4rrGQgdmWkRNvki5?= =?us-ascii?Q?+bB+B6SaQUxqYM1y40wzzScJFpZPwU1yL5G+1phrnntlpZB8IQ+asNAHmvO7?= =?us-ascii?Q?Y2EacfLYmyVFm63fUggXQJvCewqNxbcQUs5zG/wgURMSrga8T7UGFJaeIOC5?= =?us-ascii?Q?xCSLNAFBUGQDXZfUlF7hrYqYnP/LO43jpJHJNn2K2mjnJ+qYx5npuN1FBcPG?= =?us-ascii?Q?fMYBGOwIuqPYTVJm/OCrTnXP1Bh5e4a3+As4ENj42xhV/XtjLxzru4i1oeim?= =?us-ascii?Q?GScjJp/K8swbMVh2XGvSnITgYW2BHGAqcv0SBmAPdNxOQc5BrZQ0HALNwksj?= =?us-ascii?Q?3X1NDG52SGCy82jtwYp2GBJ0f14Tnx7OK16nkZ2VhbLKsvZFJOFzp/5mKYI9?= =?us-ascii?Q?MddxDbFtPGQ9dNv2bDiW5gMKmpAaUD1aHh7zpHXfpBlTh1YCV4D7Z7wrMnu+?= =?us-ascii?Q?Lw/vRflwxlU96MaaXYgX9EUlJUWd5szrdQMUtZ6aemd70aSGNhQrnI+p41tj?= =?us-ascii?Q?SphM62PZR2XxE00+cnJ4nj3PfNGuww3ZfETU/82AJOJbvQsY8i40isUOrGR4?= =?us-ascii?Q?pYZp9+UcqFFW+LKnV33ApgdUw2TxzRDZzGxnwIium0Q5klnBsgH+JXcg7Gfg?= =?us-ascii?Q?R7uZ2PpqdSTo/WQsATf0Awpsa3ZT+uM58VSnqECwiDwWldP7fe3LV+5FJkqw?= =?us-ascii?Q?izSuOadX7wQKjL7hYcWeACufnwBHye3mqxBwazvES+NKVzvQ2QB/x8cIxbQU?= =?us-ascii?Q?GqRNTF2LfAmhiV6wW/DBpygjcKbkeaSToR5RkTEu23RLXAE0VIayxEbQIgOf?= =?us-ascii?Q?EPekW4c3dDvMXieQPk1sWsE=3D?= MIME-Version: 1.0 X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-AuthSource: BN9PR11MB5292.namprd11.prod.outlook.com X-MS-Exchange-CrossTenant-Network-Message-Id: 6d7e661a-fd1f-499e-ee48-08dbe0d92dc0 X-MS-Exchange-CrossTenant-originalarrivaltime: 09 Nov 2023 04:05:58.2928 (UTC) X-MS-Exchange-CrossTenant-fromentityheader: Hosted X-MS-Exchange-CrossTenant-id: 46c98d88-e344-4ed4-8496-4ed7712e255d X-MS-Exchange-CrossTenant-mailboxtype: HOSTED X-MS-Exchange-CrossTenant-userprincipalname: 5xiM+mtx7DG3EqN+lXjzfUg4GNmE8nlvZNl3OyZ8SXG6netjZwqZ6y/S/mNne1bj/TgVrHZgO/MUdMlOhSDoXujW5rV49cafuSNxT5XfJfQmDkqzVF/TGAG+SKCHjtjL X-MS-Exchange-Transport-CrossTenantHeadersStamped: PH7PR11MB6474 X-OriginatorOrg: intel.com Precedence: Bulk List-Subscribe: List-Help: Sender: devel@edk2.groups.io List-Id: Mailing-List: list devel@edk2.groups.io; contact devel+owner@edk2.groups.io Reply-To: devel@edk2.groups.io,arun.surax.soundara.pandian@intel.com List-Unsubscribe-Post: List-Unsubscribe=One-Click List-Unsubscribe: X-Gm-Message-State: xRO5h1QUBDTGKTKt3dhvl3ASx7686176AA= Content-Language: en-US Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: quoted-printable X-GND-Status: LEGIT Authentication-Results: spool.mail.gandi.net; dkim=pass header.d=groups.io header.s=20140610 header.b=TQtdEKoD; dmarc=fail reason="SPF not aligned (relaxed), DKIM not aligned (relaxed)" header.from=intel.com (policy=none); spf=pass (spool.mail.gandi.net: domain of bounce@groups.io designates 66.175.222.108 as permitted sender) smtp.mailfrom=bounce@groups.io; arc=reject ("signature check failed: fail, {[1] = sig:microsoft.com:reject}") Hi Chasel, Sure, will work on the feedbacks.=20 Thanks Arun Sura S -----Original Message----- From: Chiu, Chasel =20 Sent: Thursday, November 9, 2023 3:40 AM To: Soundara Pandian, Arun SuraX ; d= evel@edk2.groups.io Cc: Duggapu, Chinni B ; Desimone, Nathaniel L <= nathaniel.l.desimone@intel.com>; Ng, Ray Han Lim = ; Zeng, Star ; Kuo, Ted ; S, Ashraf= Ali ; Mohapatra, Susovan Subject: RE: [PATCH] IntelFsp2Pkg\Tools\ConfigEditor: Added new USF config = workstream support Config Edit utility addition/changes. Hi Arun, I gave it a try and with test_vfr_yaml.yml there are just some label, numbe= rs, string_index and empty blocks which look to me not very helpful for use= rs to understand and track the configuration data. Do we need to include certain string table file so the string_index can be = more readable to users? Some small feedbacks on coding style: 1. please run BaseTools/Scripts/PatchCheck.py to capture and resolve format= issues. 2. please send V2 (or V3...) patch when you updated something so it will be= easier to know this is same patch/fix but different versions (example: git= format-patch -v2 -1) Thanks, Chasel > -----Original Message----- > From: Soundara Pandian, Arun SuraX=20 > > Sent: Tuesday, November 7, 2023 8:53 PM > To: devel@edk2.groups.io > Cc: Soundara Pandian, Arun SuraX=20 > ; > Chiu, Chasel ; Duggapu, Chinni B=20 > ; Desimone, Nathaniel L=20 > ; Ng, Ray Han Lim=20 > ; Zeng, Star ; Kuo, Ted=20 > ; S, Ashraf Ali ;=20 > Mohapatra, Susovan > Subject: [PATCH] IntelFsp2Pkg\Tools\ConfigEditor: Added new USF config=20 > workstream support Config Edit utility addition/changes. >=20 > This patch is to enable config editor to have a new feature that can=20 > load and view the configuration data of compiled VFR or HFR in form of YA= ML. > This can help users to understand and track the configuration data=20 > when modifications are made. >=20 > Running Configuration Editor: > python ConfigEditor.py >=20 > Cc: Chasel Chiu > Cc: Duggapu Chinni B > Cc: Nate DeSimone > Cc: Ray Han Lim Ng > Cc: Star Zeng > Cc: Ted Kuo > Cc: Ashraf Ali S > Cc: Susovan Mohapatra > Signed-off-by: Arun Sura > --- > IntelFsp2Pkg/Tools/ConfigEditor/ConfigEditor.py | 226 > +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ > +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ > +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++------ > ----------------------------- > IntelFsp2Pkg/Tools/ConfigEditor/GenYamlCfg.py | 197 > +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ > +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ > +++++++++++++++++++++++++++++++++++++++++++++++-------------------- > IntelFsp2Pkg/Tools/Tests/test_vfr_yaml.yml | 110 > +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ > +++++++++++++++++++++++++++++++++++++++++++++ > IntelFsp2Pkg/Tools/UserManuals/ConfigEditorUserManual.md | 2 ++ > 4 files changed, 480 insertions(+), 55 deletions(-) >=20 > diff --git a/IntelFsp2Pkg/Tools/ConfigEditor/ConfigEditor.py > b/IntelFsp2Pkg/Tools/ConfigEditor/ConfigEditor.py > index 5271504282..35c418a9a9 100644 > --- a/IntelFsp2Pkg/Tools/ConfigEditor/ConfigEditor.py > +++ b/IntelFsp2Pkg/Tools/ConfigEditor/ConfigEditor.py > @@ -1015,6 +1015,10 @@ class application(tkinter.Frame): > "Unsupported file '%s' !" % path) > return >=20 > + # VFR Format Page modification > + def page_construct(self): > + self.left.bind("<>", > + self.on_config_page_select_change) > + > def search_bar(self): > # get data from text box > self.search_text =3D self.edit.get() @@ -1165,7 +1169,8 @@=20 > class > application(tkinter.Frame): > page_id =3D next(iter(page)) > # Put CFG items into related page list > self.page_list[page_id] =3D self.cfg_data_obj.get_cfg_list(p= age_id) > - self.page_list[page_id].sort(key=3Dlambda x: x['order']) > + if self.mode =3D=3D 'fsp': > + self.page_list[page_id].sort(key=3Dlambda x:=20 > + x['order']) > page_name =3D self.cfg_data_obj.get_page_title(page_id) > child =3D self.left.insert( > parent, 'end', > @@ -1199,17 +1204,23 @@ class application(tkinter.Frame): > for item in self.get_current_config_data(): > disp_list.append(item) > row =3D 0 > - disp_list.sort(key=3Dlambda x: x['order']) > - for item in disp_list: > - self.add_config_item(item, row) > - row +=3D 2 > - if self.invalid_values: > - string =3D 'The following contails invalid options/values \n= \n' > - for i in self.invalid_values: > - string +=3D i + ": " + str(self.invalid_values[i]) + "\n= " > - reply =3D messagebox.showwarning('Warning!', string) > - if reply =3D=3D 'ok': > - self.invalid_values.clear() > + if self.mode =3D=3D 'fsp': > + disp_list.sort(key=3Dlambda x: x['order']) > + for item in disp_list: > + self.add_config_item(item, row) > + row +=3D 2 > + if self.invalid_values: > + string =3D 'The following contails invalid options/value= s \n\n' > + for i in self.invalid_values: > + string +=3D i + ": " + str(self.invalid_values[i]) += "\n" > + reply =3D messagebox.showwarning('Warning!', string) > + if reply =3D=3D 'ok': > + self.invalid_values.clear() > + elif self.mode =3D=3D 'vfr': > + for item in disp_list: > + self.add_vfr_config_item(item, row) > + row +=3D 2 > + >=20 > fsp_version =3D '' >=20 > @@ -1219,16 +1230,19 @@ class application(tkinter.Frame): > with open(file_name, "rb") as pkl_file: > gen_cfg_data.__dict__ =3D marshal.load(pkl_file) > gen_cfg_data.prepare_marshal(False) > - elif file_name.endswith('.yaml'): > + elif file_name.endswith('.yaml') or file_name.endswith('.yml'): > if gen_cfg_data.load_yaml(file_name) !=3D 0: > raise Exception(gen_cfg_data.get_last_error()) > else: > raise Exception('Unsupported file "%s" !' % file_name) > + > + self.mode =3D gen_cfg_data.yaml_type > # checking fsp version > - if gen_cfg_data.detect_fsp(): > - self.fsp_version =3D '2.X' > - else: > - self.fsp_version =3D '1.X' > + if gen_cfg_data.yaml_type =3D=3D 'fsp': > + if gen_cfg_data.detect_fsp(): > + self.fsp_version =3D '2.X' > + else: > + self.fsp_version =3D '1.X' >=20 > return gen_cfg_data >=20 > @@ -1252,7 +1266,7 @@ class application(tkinter.Frame): > elif ftype =3D=3D 'bin': > question =3D 'All configuration will be reloaded from BI= N file, \ > continue ?' > - elif ftype =3D=3D 'yaml': > + elif ftype =3D=3D 'yaml' or ftype =3D=3D 'yml': > question =3D '' > elif ftype =3D=3D 'bsf': > question =3D '' > @@ -1263,13 +1277,13 @@ class application(tkinter.Frame): > if reply =3D=3D 'no': > return None >=20 > - if ftype =3D=3D 'yaml': > - if self.mode =3D=3D 'FSP': > + if ftype =3D=3D 'yaml' or ftype =3D=3D 'yml': > + if self.mode =3D=3D 'fsp': > file_type =3D 'YAML' > file_ext =3D 'yaml' > else: > file_type =3D 'YAML or PKL' > - file_ext =3D 'pkl *.yaml' > + file_ext =3D 'pkl *.yaml *.yml' > else: > file_type =3D ftype.upper() > file_ext =3D ftype > @@ -1364,20 +1378,22 @@ class application(tkinter.Frame): > self.left.delete(*self.left.get_children()) >=20 > self.cfg_data_obj =3D self.load_config_data(path) > - > - self.update_last_dir(path) > - self.org_cfg_data_bin =3D self.cfg_data_obj.generate_binary_arra= y() > self.build_config_page_tree(self.cfg_data_obj.get_cfg_page()['ro= ot'], > '') >=20 > - msg_string =3D 'Click YES if it is FULL FSP '\ > - + self.fsp_version + ' Binary' > - reply =3D messagebox.askquestion('Form', msg_string) > - if reply =3D=3D 'yes': > - self.load_from_bin() > + self.update_last_dir(path) > + if self.cfg_data_obj.yaml_type =3D=3D 'fsp': > + self.org_cfg_data_bin =3D > + self.cfg_data_obj.generate_binary_array() >=20 > - for menu in self.menu_string: > - self.file_menu.entryconfig(menu, state=3D"normal") > + > + msg_string =3D 'Click YES if it is FULL FSP '\ > + + self.fsp_version + ' Binary' > + reply =3D messagebox.askquestion('Form', msg_string) > + if reply =3D=3D 'yes': > + self.load_from_bin() > + > + for menu in self.menu_string: > + self.file_menu.entryconfig(menu, state=3D"normal") >=20 > return 0 >=20 > @@ -1405,8 +1421,9 @@ class application(tkinter.Frame): > return >=20 > self.update_config_data_on_page() > - new_data =3D self.cfg_data_obj.generate_binary_array() > - self.cfg_data_obj.generate_delta_file_from_bin(path, > + if self.mode =3D=3D "fsp": > + new_data =3D self.cfg_data_obj.generate_binary_array() > + self.cfg_data_obj.generate_delta_file_from_bin(path, > self.org_cfg_data= _bin, > new_data,=20 > full) >=20 > @@ -1526,6 +1543,13 @@ class application(tkinter.Frame): > new_value =3D bytes_to_bracket_str(widget.get()) > self.set_config_item_value(item, new_value) >=20 > + #YAML VFR Part Start > + def update_vfr_config_data_from_widget(self, widget, args): > + > + item =3D self.get_config_data_item_from_widget(widget) > + > + #YAML VFR Part End > + > def evaluate_condition(self, item): > try: > result =3D self.cfg_data_obj.evaluate_condition(item) > @@ -1535,6 +1559,132 @@ class application(tkinter.Frame): > result =3D 1 > return result >=20 > + #YAML VFR Part Start > + def add_vfr_config_item(self, item, row): > + parent =3D self.right_grid > + widget =3D None > + if item['type'] =3D=3D 'string': > + value =3D '' > + name =3D tkinter.Label(parent, text=3Ditem['prompt'].split("= #")[0] +" > "+item['type'], anchor=3D"w") > + txt_val =3D tkinter.StringVar() > + widget =3D tkinter.Entry(parent, textvariable=3Dtxt_val) > + txt_val.set(value) > + > + elif item['type'] =3D=3D 'text': > + value =3D '' > + name =3D tkinter.Label(parent, text=3Ditem['prompt'].split("= #")[0] +" > "+item['type'], anchor=3D"w") > + txt_val =3D tkinter.StringVar() > + widget =3D tkinter.Entry(parent, textvariable=3Dtxt_val) > + txt_val.set(value) > + elif item['type'] =3D=3D 'label': > + value =3D '' > + name =3D tkinter.Label(parent, text=3Ditem['number'].split("= #")[0] +" > "+item['type'], anchor=3D"w") > + txt_val =3D tkinter.StringVar() > + widget =3D tkinter.Entry(parent, textvariable=3Dtxt_val) > + txt_val.set(value) > + > + elif item['type'] =3D=3D 'checkbox': > + name =3D tkinter.Label(parent, text=3Ditem['prompt'].split("= #")[0] +" > "+item['type'], anchor=3D"w") > + widget =3D tkinter.Checkbutton(parent, text=3D=20 > + item['prompt'].split("#")[0], variable=3D 1) > + > + elif item['type'] =3D=3D 'subtitle': > + value =3D '' > + name =3D tkinter.Label(parent, text=3Ditem['prompt'].split("= #")[0] +" > "+item['type'], anchor=3D"w") > + txt_val =3D tkinter.StringVar() > + widget =3D tkinter.Entry(parent, textvariable=3Dtxt_val) > + txt_val.set(value) > + > + elif item['type'] =3D=3D 'oneof': > + OPTIONS =3D [] > + name =3D tkinter.Label(parent, text=3Ditem['prompt'].split("= #")[0] +" > "+item['type'], anchor=3D"w") > + for key in item: > + if key.startswith("option"): > + if type(item[key]) =3D=3D type([]): > + for option_data in item[key]: > + OPTIONS.append(option_data['text']) > + else: > + OPTIONS.append(item[key]["text"]) > + txt_val =3D tkinter.StringVar() > + txt_val.set(OPTIONS[0]) # set default value > + widget =3D tkinter.OptionMenu(parent, txt_val, *OPTIONS) > + txt_val.set(OPTIONS[0]) > + > + elif item['type'] =3D=3D 'numeric': > + value =3D 0 > + for key in item.keys(): > + if key =3D=3D "value": > + value =3D item['value'] > + elif key =3D=3D 'default': > + for dict_key in item['default']: > + if dict_key =3D=3D "value": > + value =3D item['default']['value'] > + else: > + continue > + name =3D tkinter.Label(parent, text=3Ditem['prompt'].split("= #")[0] +" > "+item['type'], anchor=3D"w") > + txt_val =3D tkinter.StringVar() > + widget =3D tkinter.Entry(parent, textvariable=3Dtxt_val) > + txt_val.set(value) > + > + elif item['type'] =3D=3D 'orderedlist': > + OPTIONS =3D [] > + name =3D tkinter.Label(parent, text=3Ditem['prompt'].split("= #")[0] +" > "+item['type'], anchor=3D"w") > + for key in item: > + if key.startswith("option"): > + if type(item[key]) =3D=3D type([]): > + for option_data in item[key]: > + OPTIONS.append(option_data['text']) > + else: > + OPTIONS.append(item[key]["text"]) > + txt_val =3D tkinter.StringVar() > + txt_val.set(OPTIONS[0]) # default value > + widget =3D tkinter.OptionMenu(parent, txt_val, *OPTIONS) > + txt_val.set(OPTIONS[0]) > + > + elif item['type'] =3D=3D 'date': > + value =3D '' > + for key in item.keys(): > + if key =3D=3D "value": > + value =3D item['value'] > + elif key =3D=3D 'default': > + for dict_key in item['default']: > + if dict_key =3D=3D "value": > + value =3D item['default']['value'] > + else: > + continue > + name =3D tkinter.Label(parent, text=3Ditem['prompt'].split("= #")[0] +" > "+item['type'], anchor=3D"w") > + txt_val =3D tkinter.StringVar() > + widget =3D tkinter.Entry(parent, textvariable=3Dtxt_val) > + txt_val.set(value) > + elif item['type'] =3D=3D 'time': > + value =3D '' > + for key in item.keys(): > + if key =3D=3D "value": > + value =3D item['value'] > + elif key =3D=3D 'default': > + for dict_key in item['default']: > + if dict_key =3D=3D "value": > + value =3D item['default']['value'] > + else: > + continue > + name =3D tkinter.Label(parent, text=3Ditem['prompt'].split("= #")[0] +" > "+item['type'], anchor=3D"w") > + txt_val =3D tkinter.StringVar() > + widget =3D tkinter.Entry(parent, textvariable=3Dtxt_val) > + txt_val.set(value) > + > + > + if widget: > + if item['type'] =3D=3D 'string' or item['type'] =3D=3D 'text= ' or=20 > + item['type'] =3D=3D > 'numeric' or item['type'] =3D=3D "oneof"\ > + or item['type'] =3D=3D 'date' or item['type'] =3D=3D 'ti= me'=20 > + or item['type'] =3D=3D > 'orderedlist' or item['type'] =3D=3D 'label':# or item['type'] =3D=3D 'go= to'or=20 > item['type'] =3D=3D > 'checkbox': > + > + if 'help' in item.keys(): > + create_tool_tip(widget,=20 > + item['help'].split("#")[0]) > + > + name.grid(row=3Drow, column=3D0, padx=3D5, pady=3D5, sticky= =3D"nsew") > + widget.grid(row=3Drow + 1, rowspan=3D1, column=3D0, > + padx=3D5, pady=3D5, sticky=3D"nsew") > + > + #YAML VFR Part End > + > def add_config_item(self, item, row): > parent =3D self.right_grid >=20 > @@ -1611,9 +1761,15 @@ class application(tkinter.Frame): > padx=3D10, pady=3D5, sticky=3D"nsew") >=20 > def update_config_data_on_page(self): > - self.walk_widgets_in_layout(self.right_grid, > - self.update_config_data_from_widget) >=20 > + if self.mode =3D=3D "fsp": > + self.walk_widgets_in_layout(self.right_grid, > + self.update_config_data_from_widget) > + elif self.mode =3D=3D "vfr": > + self.walk_widgets_in_layout(self.right_grid, > + self.update_vfr_config_data_from_wid= get) > + else: > + print("WARNING: Invalid config file!!") >=20 > if __name__ =3D=3D '__main__': > root =3D tkinter.Tk() > diff --git a/IntelFsp2Pkg/Tools/ConfigEditor/GenYamlCfg.py > b/IntelFsp2Pkg/Tools/ConfigEditor/GenYamlCfg.py > index 90d7a11184..095e425f6d 100644 > --- a/IntelFsp2Pkg/Tools/ConfigEditor/GenYamlCfg.py > +++ b/IntelFsp2Pkg/Tools/ConfigEditor/GenYamlCfg.py > @@ -226,6 +226,7 @@ class CFG_YAML(): > TEMPLATE =3D 'template' > CONFIGS =3D 'configs' > VARIABLE =3D 'variable' > + FORMSET =3D 'formset' >=20 > def __init__(self): > self.log_line =3D False > @@ -235,6 +236,7 @@ class CFG_YAML(): > self.var_dict =3D None > self.def_dict =3D {} > self.yaml_path =3D '' > + self.yaml_type =3D 'fsp' > self.lines =3D [] > self.full_lines =3D [] > self.index =3D 0 > @@ -418,6 +420,7 @@ class CFG_YAML(): > last_indent =3D None > key =3D '' > temp_chk =3D {} > + temp_data =3D [] >=20 > while True: > line =3D self.get_line() > @@ -425,6 +428,9 @@ class CFG_YAML(): > break >=20 > curr_line =3D line.strip() > + if curr_line =3D=3D "## DO NOT REMOVE -- YAML Mode": > + self.yaml_type =3D "vfr" > + > if curr_line =3D=3D '' or curr_line[0] =3D=3D '#': > continue >=20 > @@ -482,9 +488,14 @@ class CFG_YAML(): > return curr >=20 > marker1 =3D curr_line[0] > - marker2 =3D curr_line[-1] > start =3D 1 if marker1 =3D=3D '-' else 0 > pos =3D curr_line.find(': ') > + if marker1 =3D=3D '-': > + marker2 =3D curr_line[curr_line.find(":")] > + pos =3D -1 > + else: > + marker2 =3D curr_line[-1] > + > if pos > 0: > child =3D None > key =3D curr_line[start:pos].strip() @@ -516,15 +527,31= =20 > @@ class > CFG_YAML(): > # special virtual nodes, rename to ensure unique key > key =3D '$ACTION_%04X' % self.index > self.index +=3D 1 > - if key in curr: > - if key not in temp_chk: > - # check for duplicated keys at same level > - temp_chk[key] =3D 1 > - else: > - raise Exception("Duplicated item '%s:%s' found != " > - % (parent_name, key)) >=20 > - curr[key] =3D child > + if self.yaml_type =3D=3D'fsp': > + if key in curr: > + if key not in temp_chk: > + # check for duplicated keys at same level > + temp_chk[key] =3D 1 > + else: > + raise Exception("Duplicated item '%s:%s' fou= nd !" > + % (parent_name, key)) > + > + curr[key] =3D child > + if self.yaml_type =3D=3D 'vfr': > + if key in curr.keys(): > + if type(curr[key]) =3D=3D type([]): > + temp_data =3D curr[key] > + else: > + temp_data.append(curr[key]) > + > + temp_data.append(child) > + if level < 4: > + curr[key] =3D temp_data > + temp_data =3D [] > + else: > + if level < 4: > + curr[key] =3D child > if self.var_dict is None and key =3D=3D CFG_YAML.VARIABL= E: > self.var_dict =3D child > if self.tmp_tree is None and key =3D=3D CFG_YAML.TEMPLAT= E: > @@ -537,6 +564,8 @@ class CFG_YAML(): > if self.tmp_tree and key =3D=3D CFG_YAML.CONFIGS: > # apply template for the main configs > self.allow_template =3D True > + if self.tmp_tree and key =3D=3D CFG_YAML.FORMSET: > + self.allow_template =3D True > else: > child =3D None > # - !include cfg_opt.yaml @@ -550,8 +579,30 @@ class CFG= _YAML(): > self.yaml_path =3D os.path.dirname(opt_file) > self.load_file(opt_file) > yaml_tree =3D self.parse() > - self.tmp_tree =3D yaml_tree[CFG_YAML.TEMPLATE] > - self.cfg_tree =3D yaml_tree[CFG_YAML.CONFIGS] > + for key in yaml_tree.keys(): > + if key.lower() =3D=3D "configs": > + self.yaml_type =3D 'fsp' > + self.tmp_tree =3D yaml_tree[CFG_YAML.TEMPLATE] > + self.cfg_tree =3D yaml_tree[CFG_YAML.CONFIGS] > + break > + else: > + self.cfg_tree =3D yaml_tree > + break > + > + if self.yaml_type =3D=3D 'vfr': > + formset_found =3D True > + for key in yaml_tree.keys(): > + if key =3D=3D CFG_YAML.FORMSET: > + self.cfg_tree =3D yaml_tree[CFG_YAML.FORMSET] > + formset_found =3D False > + break > + > + if formset_found =3D=3D True: > + self.cfg_tree =3D yaml_tree > + elif self.yaml_type =3D=3D 'fsp': > + self.tmp_tree =3D yaml_tree[CFG_YAML.TEMPLATE] > + self.cfg_tree =3D yaml_tree[CFG_YAML.CONFIGS] > + > return self.cfg_tree >=20 > def expand_yaml(self, opt_file): > @@ -594,9 +645,14 @@ class CGenYamlCfg: > self._cfg_list =3D [] > self._cfg_page =3D {'root': {'title': '', 'child': []}} > self._cur_page =3D '' > + self._main_page =3D '' > self._var_dict =3D {} > self._def_dict =3D {} > self._yaml_path =3D '' > + self.yaml_type =3D '' > + #Added to overcome duplicate formid > + self.form_page_map =3D {} > + self.formset_level =3D 0 >=20 > @staticmethod > def deep_convert_dict(layer): > @@ -760,13 +816,22 @@ class CGenYamlCfg: > return error >=20 > def get_cfg_list(self, page_id=3DNone): > + cfgs =3D [] > if page_id is None: > # return full list > return self._cfg_list > else: > - # build a new list for items under a page ID > - cfgs =3D [i for i in self._cfg_list if i['cname'] and > - (i['page'] =3D=3D page_id)] > + if self.yaml_type =3D=3D 'fsp': > + # build a new list for items under a page ID > + cfgs =3D [i for i in self._cfg_list if i['cname'] and > + (i['page'] =3D=3D page_id)] > + #VFR YAML Support Start > + elif self.yaml_type =3D=3D'vfr': > + for cfg in self._cfg_list: > + for i in cfg: > + if (i['page'] =3D=3D page_id): > + cfgs.append(i) > + #VFR YAML Support End > return cfgs >=20 > def get_cfg_page(self): > @@ -1002,6 +1067,9 @@ option format '%s' !" % option) > def _locate_cfg_item(root, path, level=3D0): > if len(path) =3D=3D level: > return root > + if type(root) =3D=3D type([]): > + for temp_root in root: > + return _locate_cfg_item(temp_root, path, level) > next_root =3D root.get(path[level], None) > if next_root is None: > if allow_exp: > @@ -1158,7 +1226,7 @@ option format '%s' !" % option) >=20 > self.set_cur_page(item.get('page', '')) >=20 > - if name[0] =3D=3D '$': > + if name !=3D '' and name[0] =3D=3D '$': > # skip all virtual node > return 0 >=20 > @@ -1188,7 +1256,7 @@ option format '%s' !" % option) > # define is length in bytes > length =3D length * 8 >=20 > - if not name.isidentifier(): > + if name !=3D '' and not name.isidentifier(): > raise Exception("Invalid config name '%s' for '%s' !" % > (name, '.'.join(path))) >=20 > @@ -1288,6 +1356,90 @@ option format '%s' !" % option) > raise SystemExit("Error: Bits length not aligned for %s = !" % > str(path)) >=20 > +#EDK2 VFR YAML Support start > + > + def build_formset_list(self, form_name=3D'', top=3DNone, parent_form= =3D'',path =3D[]): > + > + if self.formset_level =3D=3D 1: > + self._cfg_page['root']['title'] =3D 'Platform' > + self._cfg_page['root']['child'].append({form_name: {'title':= form_name, > + 'child': []}}) > + self._main_page =3D form_name > + > + if top is None: > + top =3D self._cfg_tree > + form_name =3D "Formset" > + self._cfg_page['root']['title'] =3D 'Formset' > + > + is_leaf =3D True > + > + if form_name =3D=3D "form" or form_name =3D=3D "formid": > + self._cur_page =3D top["title"].split('#')[0] > + self.form_page_map[top['formid'].split('#')[0]] =3D self._cu= r_page > + for driver in self._cfg_page['root']['child']: > + if list(driver.keys())[0] =3D=3D self._main_page: > + > + driver[self._main_page]['child'].append({self._cur_page: {'title': > + self._cur_page, 'child': []}}) > + > + if form_name =3D=3D "formmap": > + self._cur_page =3D top["formid"].split('#')[0] > + self.form_page_map[top['FormId'].split('#')[0]] =3D self._cu= r_page > + self._cfg_page['root']['child'].append({self._cur_page: {'ti= tle': > self._cur_page, > + 'child': []}}) > + > + > + form_data =3D {} > + temp_data =3D [] > + > + for key in top: > + if key =3D=3D 'include': > + form_data['type'] =3D key > + form_data["page"] =3D self._cur_page > + continue > + if type(top[key]) is list and self.formset_level <=3D 3: > + self.formset_level +=3D 1 > + path.append(key) > + for data in top[key]: > + self.build_formset_list(key, data, key, path) > + path.pop() > + self.formset_level -=3D 1 > + elif type(top[key]) is OrderedDict and (self.formset_level <= =3D 3): > + if parent_form !=3D '': > + self.formset_level +=3D 1 > + path.append(key) > + self.build_formset_list(key, top[key], form_name, pa= th) > + path.pop() > + self.formset_level -=3D 1 > + else: > + self.formset_level +=3D 1 > + path.append(key) > + self.build_formset_list(key, top[key], key, path) > + path.pop() > + self.formset_level -=3D 1 > + > + else: > + form_data["page"] =3D self._cur_page > + form_data[key] =3D top[key] > + form_data['path'] =3D ".".join(path) > + if form_name !=3D 'form' or form_name !=3D "formid": > + form_data["type"] =3D form_name > + else: > + form_data["type"] =3D " " > + count =3D 0 > + if self._cfg_list !=3D []: > + for cfg_name in self._cfg_list: > + for list_data in cfg_name: > + if key =3D=3D list_data['type']: > + count +=3D1 > + if count > 1: > + temp_data =3D cfg_name > + > + if len(temp_data) !=3D 0 or len(form_data)!=3D0: > + temp_data.append(form_data) > + self._cfg_list.append(temp_data) > + return > + > +#EDK2 VFR YAML Support End > + > def get_field_value(self, top=3DNone): > def _get_field_value(name, cfgs, level): > if 'indx' in cfgs: > @@ -2196,10 +2348,14 @@ xbe\x8f\x64\x12\x05\x8d\x0a\xa8' > self.initialize() > self._cfg_tree =3D cfg_yaml.load_yaml(cfg_file) > self._def_dict =3D cfg_yaml.def_dict > + self.yaml_type =3D cfg_yaml.yaml_type > self._yaml_path =3D os.path.dirname(cfg_file) > - self.build_cfg_list() > - self.build_var_dict() > - self.update_def_value() > + if self.yaml_type =3D=3D 'vfr': > + self.build_formset_list() > + elif self.yaml_type =3D=3D 'fsp': > + self.build_cfg_list() > + self.build_var_dict() > + self.update_def_value() > return 0 >=20 >=20 > @@ -2338,7 +2494,8 @@ def main(): > if dlt_file: > gen_cfg_data.override_default_value(dlt_file) >=20 > - gen_cfg_data.detect_fsp() > + if gen_cfg_data.yaml_type =3D=3D 'fsp': > + gen_cfg_data.detect_fsp() >=20 > if command =3D=3D "GENBIN": > if len(file_list) =3D=3D 3: > diff --git a/IntelFsp2Pkg/Tools/Tests/test_vfr_yaml.yml > b/IntelFsp2Pkg/Tools/Tests/test_vfr_yaml.yml > new file mode 100644 > index 0000000000..8345b3cf16 > --- /dev/null > +++ b/IntelFsp2Pkg/Tools/Tests/test_vfr_yaml.yml > @@ -0,0 +1,110 @@ > +## DO NOT REMOVE -- YAML Mode > + > +BluetoothConnectionManager: > + include: > + - BluetoothConnectionManagerHii.h > + - BluetoothConnectionManagerVfr.h > + > + formset: > + guid: '{0x4f4ef7f0, 0xaa29, 0x4ce9, { 0xba, 0x41, 0x64, 0x3e,=20 > + 0x1, 0x23, 0xa9, > 0x9f }}' > + help: '0x0003 # will show the specific string instead of token=20 > + here, pls ignore > this issue' > + title: '0x0002 # will show the specific string instead of token=20 > + here, pls ignore > this issue' > + > + - form: > + formid: 2 > + title: '0x0005 # will show the specific string instead of=20 > + token here, pls > ignore this issue' > + - text: > + help: '0x0006 # will show the specific string instead of=20 > + token here, pls > ignore this issue' > + prompt: '0x0007 # will show the specific string instead=20 > + of token here, pls > ignore this issue' > + text: '0x0008 # will show the specific string instead of=20 > + token here, pls > ignore this issue' > + - string: > + questionid: 24578 > + varstoreid: 0 # Optional Input > + varname: 65535 # Question VarName > + varoffset: 65535 # Question VarOffset > + questionflags: 4 # Optional Input > + prompt: '0x000a # will show the specific string instead=20 > + of token here, pls > ignore this issue' > + help: '0x0009 # will show the specific string instead of=20 > + token here, pls > ignore this issue' > + opcodeflags: 0x0 # optional input > + minsize: 2 > + maxsize: 19 > + - subtitle: > + prompt: '0x0004 # will show the specific string instead=20 > + of token here, pls > ignore this issue' > + flags: 0 # Optional Input > + - goto: > + questionid: 24577 > + varstoreid: 0 # Optional Input > + varname: 65535 # Question VarName > + varoffset: 65535 # Question VarOffset > + questionflags: 4 # Optional Input > + prompt: '0x0010 # will show the specific string instead=20 > + of token here, pls > ignore this issue' > + help: '0x0011 # will show the specific string instead of=20 > + token here, pls > ignore this issue' > + formid: 0x3 > + question: 0x6001 # Optional Input > + - form: > + formid: 3 > + title: '0x0012 # will show the specific string instead of=20 > + token here, pls > ignore this issue' > + - label: > + number: 0x1500 # Number > + - label: > + number: 0x15ff # Number > + - subtitle: > + prompt: '0x0004 # will show the specific string instead=20 > + of token here, pls > ignore this issue' > + flags: 0 # Optional Input > + - subtitle: > + prompt: '0x0013 # will show the specific string instead=20 > + of token here, pls > ignore this issue' > + flags: 0 # Optional Input > + - label: > + number: 0x1200 # Number > + - label: > + number: 0x12ff # Number > + - action: > + questionid: 24579 > + varstoreid: 0 # Optional Input > + varname: 65535 # Question VarName > + varoffset: 65535 # Question VarOffset > + questionflags: 4 # Optional Input > + prompt: '0x0004 # will show the specific string instead=20 > + of token here, pls > ignore this issue' > + help: '0x0004 # will show the specific string instead of=20 > + token here, pls > ignore this issue' > + config: 4 # QuestionConfig > + - refreshguid: > + guid: '{0xf5e655d9, 0x2a6, 0x46f2, { 0x9e, 0x76,=20 > + 0xb8, 0xbe, 0x8e, > 0x60, 0xab, 0x22 }}' > + - subtitle: > + prompt: '0x0014 # will show the specific string instead=20 > + of token here, pls > ignore this issue' > + flags: 0 # Optional Input > + - label: > + number: 0x1300 # Number > + - label: > + number: 0x13ff # Number > + - form: > + formid: 4 > + title: '0x001c # will show the specific string instead of=20 > + token here, pls ignore > this issue' > + - text: > + condition: 'grayoutif TRUE' > + help: '0x0009 # will show the specific string instead of=20 > + token here, pls > ignore this issue' > + prompt: '0x000a # will show the specific string instead=20 > + of token here, pls > ignore this issue' > + text: '0x000b # will show the specific string instead of=20 > + token here, pls > ignore this issue' > + - text: > + condition: 'grayoutif TRUE' > + help: '0x0006 # will show the specific string instead of=20 > + token here, pls > ignore this issue' > + prompt: '0x0007 # will show the specific string instead=20 > + of token here, pls > ignore this issue' > + text: '0x000f # will show the specific string instead of=20 > + token here, pls > ignore this issue' > + - text: > + condition: 'grayoutif TRUE' > + help: '0x000c # will show the specific string instead of=20 > + token here, pls > ignore this issue' > + prompt: '0x000d # will show the specific string instead=20 > + of token here, pls > ignore this issue' > + text: '0x000e # will show the specific string instead of=20 > + token here, pls > ignore this issue' > + - subtitle: > + condition: 'grayoutif TRUE' > + prompt: '0x0004 # will show the specific string instead=20 > + of token here, pls > ignore this issue' > + flags: 0 # Optional Input > + - text: > + condition: 'grayoutif TRUE' > + help: '0x001e # will show the specific string instead of=20 > + token here, pls > ignore this issue' > + prompt: '0x001d # will show the specific string instead=20 > + of token here, pls > ignore this issue' > + - label: > + condition: 'grayoutif TRUE' > + number: 0x1400 # Number > + - label: > + condition: 'grayoutif TRUE' > + number: 0x14ff # Number > diff --git a/IntelFsp2Pkg/Tools/UserManuals/ConfigEditorUserManual.md > b/IntelFsp2Pkg/Tools/UserManuals/ConfigEditorUserManual.md > index da21df2432..721b2fdaf9 100644 > --- a/IntelFsp2Pkg/Tools/UserManuals/ConfigEditorUserManual.md > +++ b/IntelFsp2Pkg/Tools/UserManuals/ConfigEditorUserManual.md > @@ -12,6 +12,8 @@ It supports the following options: > ## 1. Open Config YAML file > This option loads the YAML file for a FSP UPD into the ConfigEditor=20 > to change the desired configuration values. >=20 > +This option loads the YAML file for a VFR config data into the=20 > +ConfigEditor to > view the desired form values. > + > #####Example: > ``` > ![Example ConfigEditor > 1](https://slimbootloader.github.io/_images/CfgEditOpen.png) > -- > 2.30.2.windows.1 -=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D- Groups.io Links: You receive all messages sent to this group. View/Reply Online (#110947): https://edk2.groups.io/g/devel/message/110947 Mute This Topic: https://groups.io/mt/102458734/7686176 Group Owner: devel+owner@edk2.groups.io Unsubscribe: https://edk2.groups.io/g/devel/unsub [rebecca@openfw.io] -=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D-