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 F2788D802EC for ; Wed, 8 Nov 2023 22:10:12 +0000 (UTC) DKIM-Signature: a=rsa-sha256; bh=loTte6sof3AokLiyS5ZE5MPk+BWnEbNLVqTm+frDMlE=; 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=1699481411; v=1; b=k1Xd0eI3MU5CFw7dgcKpwUlNU5r4F3YWN7mWli/zLO7o4uLhg8ik5KHosGfD2M4ADcpy2SaO GwuNyo86Kdp/0HdZGGMU/nHJSu27xK62bUVRSUrR0u5791l00ONL5L5jXhGpdRefpFn4etYrYEk eOzICrwxOoHlW90pr9+lNNJM= X-Received: by 127.0.0.2 with SMTP id Lu9FYY7687511xZ9cbB3ZaHy; Wed, 08 Nov 2023 14:10:11 -0800 X-Received: from mgamail.intel.com (mgamail.intel.com [134.134.136.65]) by mx.groups.io with SMTP id smtpd.web11.105732.1699481410702707407 for ; Wed, 08 Nov 2023 14:10:11 -0800 X-IronPort-AV: E=McAfee;i="6600,9927,10888"; a="393777847" X-IronPort-AV: E=Sophos;i="6.03,287,1694761200"; d="scan'208";a="393777847" X-Received: from fmsmga002.fm.intel.com ([10.253.24.26]) by orsmga103.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 08 Nov 2023 14:10:10 -0800 X-ExtLoop1: 1 X-IronPort-AV: E=McAfee;i="6600,9927,10888"; a="880362063" X-IronPort-AV: E=Sophos;i="6.03,287,1694761200"; d="scan'208";a="880362063" X-Received: from orsmsx603.amr.corp.intel.com ([10.22.229.16]) by fmsmga002.fm.intel.com with ESMTP/TLS/AES256-GCM-SHA384; 08 Nov 2023 14:10:09 -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 14:10:09 -0800 X-Received: from ORSEDG601.ED.cps.intel.com (10.7.248.6) 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 via Frontend Transport; Wed, 8 Nov 2023 14:10:09 -0800 X-Received: from NAM12-MW2-obe.outbound.protection.outlook.com (104.47.66.40) by edgegateway.intel.com (134.134.137.102) 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 14:10:09 -0800 ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=SnineM9JNMsUkU+uaCiWgY+JTNVpNK5wObYr9WH/rWAD7Yi9vbbX/TX3wML6grZN5vEhgcvHCoffEGtWLkaaPhnSn545YW24+TyytExeL7YHtrl7fpGzHKbfsno92svjg4NogefevK8Mr5h95Um2IqEiaWTgx/Q26uTS9rbsBL3JDIVhVyYVwVXpuzGzjULYLNz4H6R1LbcaJP+gBrmr/H7Rq4s7qV+BUD09h00nL6fdQhRut2yGhPec+jjZ8C/p36yG2m+RU/wiFDno0qATCDn8Jd5Bglb6a8pD+EUOWJiA9eE0HBiSGIze2yd/N32OVywCqh006ZWFrU/zsaPxhg== 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=J9gu9BxxiTqvgPAf8p0JJkz/6W6PCmmEgTDzbQjvpAY=; b=J/XpVOACJFcmAVf3RHxz91fGKhcCVr27zcBWhTcKawlH+wLUmGhQK1a58pih9foDbQxfI6jR9LSJgoqOkapdrGt1voWoVSCm4zIuCb572Jjd8jskkwYAUJWfbhYqPsiLBg/H+tJ+u+R4k1dJlIA9kZJ4j0S4vvvQEmYpMy10cIjKDkbYSM3UYhaH5gGt8btKbhnwTjC6qBXMSsiazIURRKDa4PqjkTp63yr1ETPR5N525BBsa1PBcXMcE9d4wnJqAPJ371TI6Yxa75qNQxITPmlKSmCPXQQK83Dw+y3uLvz7/nm8OmSF151czSIStTHPePWicFjI8ldRaNV5I7RfLQ== 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 BN9PR11MB5483.namprd11.prod.outlook.com (2603:10b6:408:104::10) by SA3PR11MB7653.namprd11.prod.outlook.com (2603:10b6:806:306::14) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.6954.21; Wed, 8 Nov 2023 22:10:06 +0000 X-Received: from BN9PR11MB5483.namprd11.prod.outlook.com ([fe80::83d:af7b:9ba0:64d2]) by BN9PR11MB5483.namprd11.prod.outlook.com ([fe80::83d:af7b:9ba0:64d2%4]) with mapi id 15.20.6954.028; Wed, 8 Nov 2023 22:10:06 +0000 From: "Chiu, Chasel" To: "Soundara Pandian, Arun SuraX" , "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+EbejqN9iMK0qSm7S0BwyLRrBw9+Sw Date: Wed, 8 Nov 2023 22:10:06 +0000 Message-ID: References: <20231108045258.13690-1-arun.surax.soundara.pandian@intel.com> In-Reply-To: <20231108045258.13690-1-arun.surax.soundara.pandian@intel.com> Accept-Language: en-US X-MS-Has-Attach: X-MS-TNEF-Correlator: x-ms-publictraffictype: Email x-ms-traffictypediagnostic: BN9PR11MB5483:EE_|SA3PR11MB7653:EE_ x-ms-office365-filtering-correlation-id: d6b204cf-6a3d-4870-5aa6-08dbe0a77707 x-ms-exchange-senderadcheck: 1 x-ms-exchange-antispam-relay: 0 x-microsoft-antispam-message-info: Z8BJB42ldObQZJ+fwYrOv/vYphmt9GxYvV+c5Wq8ZFRC/ZQqwNw0Lp/TPv1IrdMfPmv0UveQwQPH5kXzvHpcNe3yj/b0+qW/eduIPhinxycA2vCvgScC60ExOi6RCmY7QRxENtA0K5w5o17jvqBqeJQiyQ6TtN8bYyo3uz8so3f2ThzsgcjEdUZ8+4OaM4E5ET494gOVzJqJbt6/MV7XsAqtjAVD72cZQ6d/CmZ3Fy0pKxPfH//lPZE0PpRyQR+WoqBO7zl4wfcJ1tJSkH2g9WZORxcIeWBcTw6UwOmmv5GZv4+rTQzl4/cOdBpfBdMPdSG/aRy8rKsjMgRm+ZxTMv4VrM3S4CzALhycHtVxZsegOEl/LtY6AkYLJzZHr2asgRWuS3AhrM1j8Xrbpw+CyiyT95XSmecjKCrPDG5L1h80zRL1M7V9OBG6o4I8F1iBC7cFaS5rKAosnPuoJoo1fwuSwnNWBz7EpgNggTuATaZoxOJ3wVQbZNmdecCJkg1A4om3ev8O4i5pZCIJIrVxh2me0qGQZamUJASePAw7ZJvunJvicxLrXEsCOth/xDTutK4s8mTA1Dp0lRaKZYyPh9CGv/aIUM0gVzM3PwmrAZBt3qtH5OaMFolqpqD98Nq4aC2rkyaBRAi9GbhU+q2IsA== x-ms-exchange-antispam-messagedata-chunkcount: 1 x-ms-exchange-antispam-messagedata-0: =?us-ascii?Q?0aw/cADW0COK9KnHCdhhvGMnIOUb+6lnlTqymC5oGeTEpYOz8/GmlDe6M3ME?= =?us-ascii?Q?igOqkhO/4oz0W+efO/eLZP3Gz4EqE4e49LYV/TYUCuUlqnWzCmBm0CA7AitH?= =?us-ascii?Q?TTonTtL6lDhCBQmpK2p0ThCOqv7+CEXlgkxbxwdDC2tQ2e/T6txIAZTC3hn+?= =?us-ascii?Q?jOTV/vOgD2rTkdWQt/o287lxpB9SYsNMGLD+3wpKwFQzL/krJXTcwpzgXmtF?= =?us-ascii?Q?qyu3oHvE+0ksvUtY6lDY8/mdpwpB852of29gO14gQSCWK8eKG8yBfUKLqQkd?= =?us-ascii?Q?l4V7Ybbw6DR6v9zz7sH7KwQuxWKnVk1RwLWq/SB5wS9KqoKSq5Mspn8e8/AM?= =?us-ascii?Q?CgD6PPZ7J/Ti8n4AfvBciUPps96t+gyRDlCD9GnaSZ1Kb1+H9ygp0qpEVpy+?= =?us-ascii?Q?J4CxJHvAKVTikqFvdh0PnqxCxL/HyMn6c6vBQ7BYZDhUV5vQtl/4pK15BA24?= =?us-ascii?Q?6ewYQl7TCGzfb09AOwPteSFJ6pEUfbkRh9+Mf9KKyXivrTkbmP0DPqp23vx9?= =?us-ascii?Q?yTNHyX2foAJJlpV29yZnsniVYV6ZEkiOPtH8uqN9y6GbzuDRZdvYNoRxn9P8?= =?us-ascii?Q?4SmWWi/3sEpP8c/how8MJc5b5gn+GfsI0p0vETblLepgN5oLcmlvgPhm66NO?= =?us-ascii?Q?sGoRZlIcIQ36DoAc8AwYAvus8Dtmpo5VYViP7q7IMYFNUjMWzHqTTJh9WC1M?= =?us-ascii?Q?QkMQNCgqaUt5Zx997CxTElZ/E3p+8qUSCi4tWRZ/voNzip8r70Bf4Lf6m4ad?= =?us-ascii?Q?IMQn2KpGN8BELUMuB9ikwRE+BOwoQH1WtWlIlGMYczErucLghRSoPhgHdEe3?= =?us-ascii?Q?krhXJnJHRuSYyOUZnEBhuO2A68WKXqiVWR93hFbs4JAI8V+etVhPhJFn7oeC?= =?us-ascii?Q?V0NAxclxTtlzdQIvkpzbbqw/KbyRIxwEbhRBC4Ang13WwD3TuyoXN+1V/BL2?= =?us-ascii?Q?R1haapecRwNZ+JNM7H+5TFa7Oj5/LVInrdYeuHtGT5Q4Y8OVnMXbhiKAQYtG?= =?us-ascii?Q?fOolJqkVsNrpNRB07X+0KLK3KB32+2o+bN034HUtI3ZAfyrC4X2LjTifwqhW?= =?us-ascii?Q?MBZbG5gbmKabdSuhSBfCbuIUOhEHNm4ALeiBWF5pTYnY7t/GqLlvjwag6k5i?= =?us-ascii?Q?7+bZWyFhaNV1WkuffQO+5R1Vllr70pkRNDHWhWAahrZBoviJhqP/ZzRGC6n0?= =?us-ascii?Q?/wVepS6OiChRmr8xRPwJM4xoxoOXYGrWpcmP2izvLDSu3wgraJ3O8xNUI+AP?= =?us-ascii?Q?P937mnp2apaMK9KraKCSlPMwsPMZ6f0zg/MNXG5kx4+d8Jh/Y/dlmj3U9dtX?= =?us-ascii?Q?OB5NXYNGaTqOB9D7eKa2J3czYj5YfSj4ak1xRzc+xL4V34XFbCxVPJsTjCXG?= =?us-ascii?Q?R41J+r8k3p6Ju57OZTNKzet59yjrKFn7zhmcJKFuofXMUBiTsQazA+ZiaHnt?= =?us-ascii?Q?6B+LE5xk0YR6FT/1TrMaVADrAFF2hCQf5nczGuGkuK2NajzwRiMbLYIxBK5b?= =?us-ascii?Q?yvkfFYVu6qrjNQOymLAV/n4uc+0bJaWXrtQHGD3xW18JE/ZJ2cK87Rk+sDqn?= =?us-ascii?Q?nNsCGxqNc+OJVPPhy6IWAtA0rh8a7oQDUVx4JmES?= MIME-Version: 1.0 X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-AuthSource: BN9PR11MB5483.namprd11.prod.outlook.com X-MS-Exchange-CrossTenant-Network-Message-Id: d6b204cf-6a3d-4870-5aa6-08dbe0a77707 X-MS-Exchange-CrossTenant-originalarrivaltime: 08 Nov 2023 22:10:06.3924 (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: 34gdI7/SbFHcMfDo4doK8SifVyLYtP1TRlwSVit8xe9yzNhAA4ur4sonxkkuNb+mBalPrh3582hFYghMJycclg== X-MS-Exchange-Transport-CrossTenantHeadersStamped: SA3PR11MB7653 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,chasel.chiu@intel.com List-Unsubscribe-Post: List-Unsubscribe=One-Click List-Unsubscribe: X-Gm-Message-State: nG9gXZKUKklsVdcgOsUvylqBx7686176AA= 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=k1Xd0eI3; spf=pass (spool.mail.gandi.net: domain of bounce@groups.io designates 66.175.222.108 as permitted sender) smtp.mailfrom=bounce@groups.io; dmarc=fail reason="SPF not aligned (relaxed), DKIM not aligned (relaxed)" header.from=intel.com (policy=none); arc=reject ("signature check failed: fail, {[1] = sig:microsoft.com:reject}") 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 > Sent: Tuesday, November 7, 2023 8:53 PM > To: devel@edk2.groups.io > Cc: Soundara Pandian, Arun SuraX ; > Chiu, Chasel ; Duggapu, Chinni B > ; Desimone, Nathaniel L > ; Ng, Ray Han Lim > ; Zeng, Star ; Kuo, Ted > ; S, Ashraf Ali ; Mohapatra, S= usovan > > Subject: [PATCH] IntelFsp2Pkg\Tools\ConfigEditor: Added new USF config > workstream support Config Edit utility addition/changes. >=20 > This patch is to enable config editor to have a new feature that can load= and view > the configuration data of compiled VFR or HFR in form of YAML. > This can help users to understand and track the configuration data 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 @@ 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: 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, 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 > + 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 item['type'] =3D=3D > 'numeric' or item['type'] =3D=3D "oneof"\ > + or item['type'] =3D=3D 'date' or item['type'] =3D=3D 'ti= me' or item['type'] =3D=3D > 'orderedlist' or item['type'] =3D=3D 'label':# or item['type'] =3D=3D 'go= to'or item['type'] =3D=3D > 'checkbox': > + > + if 'help' in item.keys(): > + create_tool_tip(widget, 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 = @@ 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, 0x1, = 0x23, 0xa9, > 0x9f }}' > + help: '0x0003 # will show the specific string instead of token here= , pls ignore > this issue' > + title: '0x0002 # will show the specific string instead of token her= e, pls ignore > this issue' > + > + - form: > + formid: 2 > + title: '0x0005 # will show the specific string instead of token= here, pls > ignore this issue' > + - text: > + help: '0x0006 # will show the specific string instead of to= ken here, pls > ignore this issue' > + prompt: '0x0007 # will show the specific string instead of = token here, pls > ignore this issue' > + text: '0x0008 # will show the specific string instead of to= ken 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 of = token here, pls > ignore this issue' > + help: '0x0009 # will show the specific string instead of to= ken here, pls > ignore this issue' > + opcodeflags: 0x0 # optional input > + minsize: 2 > + maxsize: 19 > + - subtitle: > + prompt: '0x0004 # will show the specific string instead 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 of = token here, pls > ignore this issue' > + help: '0x0011 # will show the specific string instead of to= ken here, pls > ignore this issue' > + formid: 0x3 > + question: 0x6001 # Optional Input > + - form: > + formid: 3 > + title: '0x0012 # will show the specific string instead of token= here, pls > ignore this issue' > + - label: > + number: 0x1500 # Number > + - label: > + number: 0x15ff # Number > + - subtitle: > + prompt: '0x0004 # will show the specific string instead of = token here, pls > ignore this issue' > + flags: 0 # Optional Input > + - subtitle: > + prompt: '0x0013 # will show the specific string instead 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 of = token here, pls > ignore this issue' > + help: '0x0004 # will show the specific string instead of to= ken here, pls > ignore this issue' > + config: 4 # QuestionConfig > + - refreshguid: > + guid: '{0xf5e655d9, 0x2a6, 0x46f2, { 0x9e, 0x76, 0xb8, = 0xbe, 0x8e, > 0x60, 0xab, 0x22 }}' > + - subtitle: > + prompt: '0x0014 # will show the specific string instead 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 token= here, pls ignore > this issue' > + - text: > + condition: 'grayoutif TRUE' > + help: '0x0009 # will show the specific string instead of to= ken here, pls > ignore this issue' > + prompt: '0x000a # will show the specific string instead of = token here, pls > ignore this issue' > + text: '0x000b # will show the specific string instead of to= ken here, pls > ignore this issue' > + - text: > + condition: 'grayoutif TRUE' > + help: '0x0006 # will show the specific string instead of to= ken here, pls > ignore this issue' > + prompt: '0x0007 # will show the specific string instead of = token here, pls > ignore this issue' > + text: '0x000f # will show the specific string instead of to= ken here, pls > ignore this issue' > + - text: > + condition: 'grayoutif TRUE' > + help: '0x000c # will show the specific string instead of to= ken here, pls > ignore this issue' > + prompt: '0x000d # will show the specific string instead of = token here, pls > ignore this issue' > + text: '0x000e # will show the specific string instead of to= ken here, pls > ignore this issue' > + - subtitle: > + condition: 'grayoutif TRUE' > + prompt: '0x0004 # will show the specific string instead of = token here, pls > ignore this issue' > + flags: 0 # Optional Input > + - text: > + condition: 'grayoutif TRUE' > + help: '0x001e # will show the specific string instead of to= ken here, pls > ignore this issue' > + prompt: '0x001d # will show the specific string instead 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 to c= hange the > desired configuration values. >=20 > +This option loads the YAML file for a VFR config data into the ConfigEdi= tor 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 (#110930): https://edk2.groups.io/g/devel/message/110930 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-