[edk2-devel] [PATCH] IntelFsp2Pkg\Tools\ConfigEditor: Added support for VFR format YAML.

Arun Sura posted 1 patch 6 months, 3 weeks ago
Failed in applying to current master (apply log)
IntelFsp2Pkg/Tools/ConfigEditor/ConfigEditor.py | 226 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++-----------------------------------
IntelFsp2Pkg/Tools/ConfigEditor/GenYamlCfg.py   | 197 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++--------------------
2 files changed, 368 insertions(+), 55 deletions(-)
[edk2-devel] [PATCH] IntelFsp2Pkg\Tools\ConfigEditor: Added support for VFR format YAML.
Posted by Arun Sura 6 months, 3 weeks ago
Signed-off-by: Arun Sura <arun.surax.soundara.pandian@intel.com>
Cc: Chasel Chiu <chasel.chiu@intel.com>
Cc: Ray Han Lim Ng <ray.han.lim.ng@intel.com>
Cc: Nate DeSimone <nathaniel.l.desimone@intel.com>
Cc: Ashraf Ali S <ashraf.ali.s@intel.com>
---
 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("<<TreeviewSelect>>", 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/1787277
Group Owner: devel+owner@edk2.groups.io
Unsubscribe: https://edk2.groups.io/g/devel/unsub [importer@patchew.org]
-=-=-=-=-=-=-=-=-=-=-=-