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 04269AC1894 for ; Mon, 16 Oct 2023 14:31:16 +0000 (UTC) DKIM-Signature: a=rsa-sha256; bh=1gPHm6s+Srp8HhmIlPv6WdmDOL7Sh/Nsr1MwxKlY5nw=; c=relaxed/simple; d=groups.io; h=From:To:Cc:Subject:Date:Message-Id:MIME-Version:Precedence:List-Subscribe:List-Help:Sender:List-Id:Mailing-List:Delivered-To:Reply-To:List-Unsubscribe-Post:List-Unsubscribe:Content-Transfer-Encoding; s=20140610; t=1697466675; v=1; b=dNsrHbydN/oGwYeH6QxGqvh0KlMl1bPQXBe9Ir+EXA8552dl6rRtp5H2YPzjPHCv2ekGtQo4 FQ061tuowhAlZQlu1kgfLQX9cLknbxp/lEqdz+BtqPjQkYtt4nmNPvAkVeEJkvoXL32uMBIIrnI Aug28Vj3YAk0xQ7IxSZcHjm4= X-Received: by 127.0.0.2 with SMTP id 05MLYY7687511xHaEbAsGd1E; Mon, 16 Oct 2023 07:31:15 -0700 X-Received: from mgamail.intel.com (mgamail.intel.com [192.198.163.7]) by mx.groups.io with SMTP id smtpd.web10.118808.1697457112453268647 for ; Mon, 16 Oct 2023 04:51:52 -0700 X-IronPort-AV: E=McAfee;i="6600,9927,10863"; a="7071618" X-IronPort-AV: E=Sophos;i="6.03,229,1694761200"; d="scan'208";a="7071618" X-Received: from orsmga001.jf.intel.com ([10.7.209.18]) by fmvoesa101.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 16 Oct 2023 04:51:52 -0700 X-ExtLoop1: 1 X-IronPort-AV: E=McAfee;i="6600,9927,10863"; a="790767898" X-IronPort-AV: E=Sophos;i="6.03,229,1694761200"; d="scan'208";a="790767898" X-Received: from basfe001.gar.corp.intel.com ([10.66.244.207]) by orsmga001-auth.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 16 Oct 2023 04:51:48 -0700 From: "Arun Sura" To: devel@edk2.groups.io Cc: Arun Sura , Chasel Chiu , Ray Han Lim Ng , Nate DeSimone , Ashraf Ali S Subject: [edk2-devel] [PATCH] IntelFsp2Pkg\Tools\ConfigEditor: Added support for VFR format YAML. Date: Mon, 16 Oct 2023 17:21:22 +0530 Message-Id: <20231016115122.9453-1-arun.surax.soundara.pandian@intel.com> MIME-Version: 1.0 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: pRvJUs0HhIyEbwWGTGpCM6ytx7686176AA= Content-Transfer-Encoding: 8bit X-GND-Status: LEGIT Authentication-Results: spool.mail.gandi.net; dkim=pass header.d=groups.io header.s=20140610 header.b=dNsrHbyd; 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 Signed-off-by: Arun Sura Cc: Chasel Chiu Cc: Ray Han Lim Ng Cc: Nate DeSimone Cc: Ashraf Ali S --- IntelFsp2Pkg/Tools/ConfigEditor/ConfigEditor.py | 226 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++----------------------------------- IntelFsp2Pkg/Tools/ConfigEditor/GenYamlCfg.py | 197 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++-------------------- 2 files changed, 368 insertions(+), 55 deletions(-) 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 + # 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 = self.edit.get() @@ -1165,7 +1169,8 @@ class application(tkinter.Frame): page_id = next(iter(page)) # Put CFG items into related page list self.page_list[page_id] = self.cfg_data_obj.get_cfg_list(page_id) - self.page_list[page_id].sort(key=lambda x: x['order']) + if self.mode == 'fsp': + self.page_list[page_id].sort(key=lambda x: x['order']) page_name = self.cfg_data_obj.get_page_title(page_id) child = 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 = 0 - disp_list.sort(key=lambda x: x['order']) - for item in disp_list: - self.add_config_item(item, row) - row += 2 - if self.invalid_values: - string = 'The following contails invalid options/values \n\n' - for i in self.invalid_values: - string += i + ": " + str(self.invalid_values[i]) + "\n" - reply = messagebox.showwarning('Warning!', string) - if reply == 'ok': - self.invalid_values.clear() + if self.mode == 'fsp': + disp_list.sort(key=lambda x: x['order']) + for item in disp_list: + self.add_config_item(item, row) + row += 2 + if self.invalid_values: + string = 'The following contails invalid options/values \n\n' + for i in self.invalid_values: + string += i + ": " + str(self.invalid_values[i]) + "\n" + reply = messagebox.showwarning('Warning!', string) + if reply == 'ok': + self.invalid_values.clear() + elif self.mode == 'vfr': + for item in disp_list: + self.add_vfr_config_item(item, row) + row += 2 + fsp_version = '' @@ -1219,16 +1230,19 @@ class application(tkinter.Frame): with open(file_name, "rb") as pkl_file: gen_cfg_data.__dict__ = 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) != 0: raise Exception(gen_cfg_data.get_last_error()) else: raise Exception('Unsupported file "%s" !' % file_name) + + self.mode = gen_cfg_data.yaml_type # checking fsp version - if gen_cfg_data.detect_fsp(): - self.fsp_version = '2.X' - else: - self.fsp_version = '1.X' + if gen_cfg_data.yaml_type == 'fsp': + if gen_cfg_data.detect_fsp(): + self.fsp_version = '2.X' + else: + self.fsp_version = '1.X' return gen_cfg_data @@ -1252,7 +1266,7 @@ class application(tkinter.Frame): elif ftype == 'bin': question = 'All configuration will be reloaded from BIN file, \ continue ?' - elif ftype == 'yaml': + elif ftype == 'yaml' or ftype == 'yml': question = '' elif ftype == 'bsf': question = '' @@ -1263,13 +1277,13 @@ class application(tkinter.Frame): if reply == 'no': return None - if ftype == 'yaml': - if self.mode == 'FSP': + if ftype == 'yaml' or ftype == 'yml': + if self.mode == 'fsp': file_type = 'YAML' file_ext = 'yaml' else: file_type = 'YAML or PKL' - file_ext = 'pkl *.yaml' + file_ext = 'pkl *.yaml *.yml' else: file_type = ftype.upper() file_ext = ftype @@ -1364,20 +1378,22 @@ class application(tkinter.Frame): self.left.delete(*self.left.get_children()) self.cfg_data_obj = self.load_config_data(path) - - self.update_last_dir(path) - self.org_cfg_data_bin = self.cfg_data_obj.generate_binary_array() self.build_config_page_tree(self.cfg_data_obj.get_cfg_page()['root'], '') - msg_string = 'Click YES if it is FULL FSP '\ - + self.fsp_version + ' Binary' - reply = messagebox.askquestion('Form', msg_string) - if reply == 'yes': - self.load_from_bin() + self.update_last_dir(path) + if self.cfg_data_obj.yaml_type == 'fsp': + self.org_cfg_data_bin = self.cfg_data_obj.generate_binary_array() - for menu in self.menu_string: - self.file_menu.entryconfig(menu, state="normal") + + msg_string = 'Click YES if it is FULL FSP '\ + + self.fsp_version + ' Binary' + reply = messagebox.askquestion('Form', msg_string) + if reply == 'yes': + self.load_from_bin() + + for menu in self.menu_string: + self.file_menu.entryconfig(menu, state="normal") return 0 @@ -1405,8 +1421,9 @@ class application(tkinter.Frame): return self.update_config_data_on_page() - new_data = self.cfg_data_obj.generate_binary_array() - self.cfg_data_obj.generate_delta_file_from_bin(path, + if self.mode == "fsp": + new_data = 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) @@ -1526,6 +1543,13 @@ class application(tkinter.Frame): new_value = bytes_to_bracket_str(widget.get()) self.set_config_item_value(item, new_value) + #YAML VFR Part Start + def update_vfr_config_data_from_widget(self, widget, args): + + item = self.get_config_data_item_from_widget(widget) + + #YAML VFR Part End + def evaluate_condition(self, item): try: result = self.cfg_data_obj.evaluate_condition(item) @@ -1535,6 +1559,132 @@ class application(tkinter.Frame): result = 1 return result + #YAML VFR Part Start + def add_vfr_config_item(self, item, row): + parent = self.right_grid + widget = None + if item['type'] == 'string': + value = '' + name = tkinter.Label(parent, text=item['prompt'].split("#")[0] +" "+item['type'], anchor="w") + txt_val = tkinter.StringVar() + widget = tkinter.Entry(parent, textvariable=txt_val) + txt_val.set(value) + + elif item['type'] == 'text': + value = '' + name = tkinter.Label(parent, text=item['prompt'].split("#")[0] +" "+item['type'], anchor="w") + txt_val = tkinter.StringVar() + widget = tkinter.Entry(parent, textvariable=txt_val) + txt_val.set(value) + elif item['type'] == 'label': + value = '' + name = tkinter.Label(parent, text=item['number'].split("#")[0] +" "+item['type'], anchor="w") + txt_val = tkinter.StringVar() + widget = tkinter.Entry(parent, textvariable=txt_val) + txt_val.set(value) + + elif item['type'] == 'checkbox': + name = tkinter.Label(parent, text=item['prompt'].split("#")[0] +" "+item['type'], anchor="w") + widget = tkinter.Checkbutton(parent, text= item['prompt'].split("#")[0], variable= 1) + + elif item['type'] == 'subtitle': + value = '' + name = tkinter.Label(parent, text=item['prompt'].split("#")[0] +" "+item['type'], anchor="w") + txt_val = tkinter.StringVar() + widget = tkinter.Entry(parent, textvariable=txt_val) + txt_val.set(value) + + elif item['type'] == 'oneof': + OPTIONS = [] + name = tkinter.Label(parent, text=item['prompt'].split("#")[0] +" "+item['type'], anchor="w") + for key in item: + if key.startswith("option"): + if type(item[key]) == type([]): + for option_data in item[key]: + OPTIONS.append(option_data['text']) + else: + OPTIONS.append(item[key]["text"]) + txt_val = tkinter.StringVar() + txt_val.set(OPTIONS[0]) # set default value + widget = tkinter.OptionMenu(parent, txt_val, *OPTIONS) + txt_val.set(OPTIONS[0]) + + elif item['type'] == 'numeric': + value = 0 + for key in item.keys(): + if key == "value": + value = item['value'] + elif key == 'default': + for dict_key in item['default']: + if dict_key == "value": + value = item['default']['value'] + else: + continue + name = tkinter.Label(parent, text=item['prompt'].split("#")[0] +" "+item['type'], anchor="w") + txt_val = tkinter.StringVar() + widget = tkinter.Entry(parent, textvariable=txt_val) + txt_val.set(value) + + elif item['type'] == 'orderedlist': + OPTIONS = [] + name = tkinter.Label(parent, text=item['prompt'].split("#")[0] +" "+item['type'], anchor="w") + for key in item: + if key.startswith("option"): + if type(item[key]) == type([]): + for option_data in item[key]: + OPTIONS.append(option_data['text']) + else: + OPTIONS.append(item[key]["text"]) + txt_val = tkinter.StringVar() + txt_val.set(OPTIONS[0]) # default value + widget = tkinter.OptionMenu(parent, txt_val, *OPTIONS) + txt_val.set(OPTIONS[0]) + + elif item['type'] == 'date': + value = '' + for key in item.keys(): + if key == "value": + value = item['value'] + elif key == 'default': + for dict_key in item['default']: + if dict_key == "value": + value = item['default']['value'] + else: + continue + name = tkinter.Label(parent, text=item['prompt'].split("#")[0] +" "+item['type'], anchor="w") + txt_val = tkinter.StringVar() + widget = tkinter.Entry(parent, textvariable=txt_val) + txt_val.set(value) + elif item['type'] == 'time': + value = '' + for key in item.keys(): + if key == "value": + value = item['value'] + elif key == 'default': + for dict_key in item['default']: + if dict_key == "value": + value = item['default']['value'] + else: + continue + name = tkinter.Label(parent, text=item['prompt'].split("#")[0] +" "+item['type'], anchor="w") + txt_val = tkinter.StringVar() + widget = tkinter.Entry(parent, textvariable=txt_val) + txt_val.set(value) + + + if widget: + if item['type'] == 'string' or item['type'] == 'text' or item['type'] == 'numeric' or item['type'] == "oneof"\ + or item['type'] == 'date' or item['type'] == 'time' or item['type'] == 'orderedlist' or item['type'] == 'label':# or item['type'] == 'goto'or item['type'] == 'checkbox': + + if 'help' in item.keys(): + create_tool_tip(widget, item['help'].split("#")[0]) + + name.grid(row=row, column=0, padx=5, pady=5, sticky="nsew") + widget.grid(row=row + 1, rowspan=1, column=0, + padx=5, pady=5, sticky="nsew") + + #YAML VFR Part End + def add_config_item(self, item, row): parent = self.right_grid @@ -1611,9 +1761,15 @@ class application(tkinter.Frame): padx=10, pady=5, sticky="nsew") def update_config_data_on_page(self): - self.walk_widgets_in_layout(self.right_grid, - self.update_config_data_from_widget) + if self.mode == "fsp": + self.walk_widgets_in_layout(self.right_grid, + self.update_config_data_from_widget) + elif self.mode == "vfr": + self.walk_widgets_in_layout(self.right_grid, + self.update_vfr_config_data_from_widget) + else: + print("WARNING: Invalid config file!!") if __name__ == '__main__': root = 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 = 'template' CONFIGS = 'configs' VARIABLE = 'variable' + FORMSET = 'formset' def __init__(self): self.log_line = False @@ -235,6 +236,7 @@ class CFG_YAML(): self.var_dict = None self.def_dict = {} self.yaml_path = '' + self.yaml_type = 'fsp' self.lines = [] self.full_lines = [] self.index = 0 @@ -418,6 +420,7 @@ class CFG_YAML(): last_indent = None key = '' temp_chk = {} + temp_data = [] while True: line = self.get_line() @@ -425,6 +428,9 @@ class CFG_YAML(): break curr_line = line.strip() + if curr_line == "## DO NOT REMOVE -- YAML Mode": + self.yaml_type = "vfr" + if curr_line == '' or curr_line[0] == '#': continue @@ -482,9 +488,14 @@ class CFG_YAML(): return curr marker1 = curr_line[0] - marker2 = curr_line[-1] start = 1 if marker1 == '-' else 0 pos = curr_line.find(': ') + if marker1 == '-': + marker2 = curr_line[curr_line.find(":")] + pos = -1 + else: + marker2 = curr_line[-1] + if pos > 0: child = None key = curr_line[start:pos].strip() @@ -516,15 +527,31 @@ class CFG_YAML(): # special virtual nodes, rename to ensure unique key key = '$ACTION_%04X' % self.index self.index += 1 - if key in curr: - if key not in temp_chk: - # check for duplicated keys at same level - temp_chk[key] = 1 - else: - raise Exception("Duplicated item '%s:%s' found !" - % (parent_name, key)) - curr[key] = child + if self.yaml_type =='fsp': + if key in curr: + if key not in temp_chk: + # check for duplicated keys at same level + temp_chk[key] = 1 + else: + raise Exception("Duplicated item '%s:%s' found !" + % (parent_name, key)) + + curr[key] = child + if self.yaml_type == 'vfr': + if key in curr.keys(): + if type(curr[key]) == type([]): + temp_data = curr[key] + else: + temp_data.append(curr[key]) + + temp_data.append(child) + if level < 4: + curr[key] = temp_data + temp_data = [] + else: + if level < 4: + curr[key] = child if self.var_dict is None and key == CFG_YAML.VARIABLE: self.var_dict = child if self.tmp_tree is None and key == CFG_YAML.TEMPLATE: @@ -537,6 +564,8 @@ class CFG_YAML(): if self.tmp_tree and key == CFG_YAML.CONFIGS: # apply template for the main configs self.allow_template = True + if self.tmp_tree and key == CFG_YAML.FORMSET: + self.allow_template = True else: child = None # - !include cfg_opt.yaml @@ -550,8 +579,30 @@ class CFG_YAML(): self.yaml_path = os.path.dirname(opt_file) self.load_file(opt_file) yaml_tree = self.parse() - self.tmp_tree = yaml_tree[CFG_YAML.TEMPLATE] - self.cfg_tree = yaml_tree[CFG_YAML.CONFIGS] + for key in yaml_tree.keys(): + if key.lower() == "configs": + self.yaml_type = 'fsp' + self.tmp_tree = yaml_tree[CFG_YAML.TEMPLATE] + self.cfg_tree = yaml_tree[CFG_YAML.CONFIGS] + break + else: + self.cfg_tree = yaml_tree + break + + if self.yaml_type == 'vfr': + formset_found = True + for key in yaml_tree.keys(): + if key == CFG_YAML.FORMSET: + self.cfg_tree = yaml_tree[CFG_YAML.FORMSET] + formset_found = False + break + + if formset_found == True: + self.cfg_tree = yaml_tree + elif self.yaml_type == 'fsp': + self.tmp_tree = yaml_tree[CFG_YAML.TEMPLATE] + self.cfg_tree = yaml_tree[CFG_YAML.CONFIGS] + return self.cfg_tree def expand_yaml(self, opt_file): @@ -594,9 +645,14 @@ class CGenYamlCfg: self._cfg_list = [] self._cfg_page = {'root': {'title': '', 'child': []}} self._cur_page = '' + self._main_page = '' self._var_dict = {} self._def_dict = {} self._yaml_path = '' + self.yaml_type = '' + #Added to overcome duplicate formid + self.form_page_map = {} + self.formset_level = 0 @staticmethod def deep_convert_dict(layer): @@ -760,13 +816,22 @@ class CGenYamlCfg: return error def get_cfg_list(self, page_id=None): + cfgs = [] if page_id is None: # return full list return self._cfg_list else: - # build a new list for items under a page ID - cfgs = [i for i in self._cfg_list if i['cname'] and - (i['page'] == page_id)] + if self.yaml_type == 'fsp': + # build a new list for items under a page ID + cfgs = [i for i in self._cfg_list if i['cname'] and + (i['page'] == page_id)] + #VFR YAML Support Start + elif self.yaml_type =='vfr': + for cfg in self._cfg_list: + for i in cfg: + if (i['page'] == page_id): + cfgs.append(i) + #VFR YAML Support End return cfgs def get_cfg_page(self): @@ -1002,6 +1067,9 @@ option format '%s' !" % option) def _locate_cfg_item(root, path, level=0): if len(path) == level: return root + if type(root) == type([]): + for temp_root in root: + return _locate_cfg_item(temp_root, path, level) next_root = root.get(path[level], None) if next_root is None: if allow_exp: @@ -1158,7 +1226,7 @@ option format '%s' !" % option) self.set_cur_page(item.get('page', '')) - if name[0] == '$': + if name != '' and name[0] == '$': # skip all virtual node return 0 @@ -1188,7 +1256,7 @@ option format '%s' !" % option) # define is length in bytes length = length * 8 - if not name.isidentifier(): + if name != '' and not name.isidentifier(): raise Exception("Invalid config name '%s' for '%s' !" % (name, '.'.join(path))) @@ -1288,6 +1356,90 @@ option format '%s' !" % option) raise SystemExit("Error: Bits length not aligned for %s !" % str(path)) +#EDK2 VFR YAML Support start + + def build_formset_list(self, form_name='', top=None, parent_form='',path =[]): + + if self.formset_level == 1: + self._cfg_page['root']['title'] = 'Platform' + self._cfg_page['root']['child'].append({form_name: {'title': form_name, + 'child': []}}) + self._main_page = form_name + + if top is None: + top = self._cfg_tree + form_name = "Formset" + self._cfg_page['root']['title'] = 'Formset' + + is_leaf = True + + if form_name == "form" or form_name == "formid": + self._cur_page = top["title"].split('#')[0] + self.form_page_map[top['formid'].split('#')[0]] = self._cur_page + for driver in self._cfg_page['root']['child']: + if list(driver.keys())[0] == self._main_page: + driver[self._main_page]['child'].append({self._cur_page: {'title': self._cur_page, 'child': []}}) + + if form_name == "formmap": + self._cur_page = top["formid"].split('#')[0] + self.form_page_map[top['FormId'].split('#')[0]] = self._cur_page + self._cfg_page['root']['child'].append({self._cur_page: {'title': self._cur_page, + 'child': []}}) + + + form_data = {} + temp_data = [] + + for key in top: + if key == 'include': + form_data['type'] = key + form_data["page"] = self._cur_page + continue + if type(top[key]) is list and self.formset_level <= 3: + self.formset_level += 1 + path.append(key) + for data in top[key]: + self.build_formset_list(key, data, key, path) + path.pop() + self.formset_level -= 1 + elif type(top[key]) is OrderedDict and (self.formset_level <= 3): + if parent_form != '': + self.formset_level += 1 + path.append(key) + self.build_formset_list(key, top[key], form_name, path) + path.pop() + self.formset_level -= 1 + else: + self.formset_level += 1 + path.append(key) + self.build_formset_list(key, top[key], key, path) + path.pop() + self.formset_level -= 1 + + else: + form_data["page"] = self._cur_page + form_data[key] = top[key] + form_data['path'] = ".".join(path) + if form_name != 'form' or form_name != "formid": + form_data["type"] = form_name + else: + form_data["type"] = " " + count = 0 + if self._cfg_list != []: + for cfg_name in self._cfg_list: + for list_data in cfg_name: + if key == list_data['type']: + count +=1 + if count > 1: + temp_data = cfg_name + + if len(temp_data) != 0 or len(form_data)!=0: + temp_data.append(form_data) + self._cfg_list.append(temp_data) + return + +#EDK2 VFR YAML Support End + def get_field_value(self, top=None): 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 = cfg_yaml.load_yaml(cfg_file) self._def_dict = cfg_yaml.def_dict + self.yaml_type = cfg_yaml.yaml_type self._yaml_path = os.path.dirname(cfg_file) - self.build_cfg_list() - self.build_var_dict() - self.update_def_value() + if self.yaml_type == 'vfr': + self.build_formset_list() + elif self.yaml_type == 'fsp': + self.build_cfg_list() + self.build_var_dict() + self.update_def_value() return 0 @@ -2338,7 +2494,8 @@ def main(): if dlt_file: gen_cfg_data.override_default_value(dlt_file) - gen_cfg_data.detect_fsp() + if gen_cfg_data.yaml_type == 'fsp': + gen_cfg_data.detect_fsp() if command == "GENBIN": if len(file_list) == 3: -- 2.30.2.windows.1 -=-=-=-=-=-=-=-=-=-=-=- Groups.io Links: You receive all messages sent to this group. View/Reply Online (#109645): https://edk2.groups.io/g/devel/message/109645 Mute This Topic: https://groups.io/mt/101996705/7686176 Group Owner: devel+owner@edk2.groups.io Unsubscribe: https://edk2.groups.io/g/devel/unsub [rebecca@openfw.io] -=-=-=-=-=-=-=-=-=-=-=-