From: "Arun Sura" <arun.surax.soundara.pandian@intel.com>
To: devel@edk2.groups.io
Cc: Arun Sura <arun.surax.soundara.pandian@intel.com>,
Chasel Chiu <chasel.chiu@intel.com>,
Ray Han Lim Ng <ray.han.lim.ng@intel.com>,
Nate DeSimone <nathaniel.l.desimone@intel.com>,
Ashraf Ali S <ashraf.ali.s@intel.com>
Subject: [edk2-devel] [PATCH] IntelFsp2Pkg\Tools\ConfigEditor: Added support for VFR format YAML.
Date: Mon, 16 Oct 2023 17:21:22 +0530 [thread overview]
Message-ID: <20231016115122.9453-1-arun.surax.soundara.pandian@intel.com> (raw)
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/7686176
Group Owner: devel+owner@edk2.groups.io
Unsubscribe: https://edk2.groups.io/g/devel/unsub [rebecca@openfw.io]
-=-=-=-=-=-=-=-=-=-=-=-
reply other threads:[~2023-10-16 14:31 UTC|newest]
Thread overview: [no followups] expand[flat|nested] mbox.gz Atom feed
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-list from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20231016115122.9453-1-arun.surax.soundara.pandian@intel.com \
--to=devel@edk2.groups.io \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox