acrn-config: support to parse pci_devs for pre launched vm

As it doesn't depends on the scenario, there are sos/pre launched VMS
in config xmls, emulate vhostbridge for sos vm, specify the pass-thru
PCI device for pre launched vm.
Add support to parse pci_devs for pre launched vm.

Tracked-On: #4641
Signed-off-by: Wei Liu <weix.w.liu@intel.com>
Acked-by: Victor Sun <victor.sun@intel.com>
Acked-by: Terry Zou <terry.zou@intel.com>
This commit is contained in:
Wei Liu
2020-04-09 11:11:16 +08:00
committed by wenlingz
parent 8fbd859fbf
commit eba8c23bff
9 changed files with 173 additions and 91 deletions

View File

@@ -9,7 +9,7 @@ import scenario_cfg_lib
PCI_DEV_TYPE = ['PCI_DEV_TYPE_HVEMUL', 'PCI_DEV_TYPE_PTDEV']
def generate_file(config):
def generate_file(vm_info, config):
"""
Generate pci_dev.c while logical_partition scenario
:param config: it is pointer for for file write to
@@ -29,27 +29,31 @@ def generate_file(config):
print(" * The memory range of vBAR should exactly match with the e820 layout of VM.",
file=config)
print(" */", file=config)
for i in list(common.VM_TYPES.keys()):
for vm_i, pci_bdf_devs_list in vm_info.cfg_pci.pci_devs.items():
pci_cnt = 1
if not pci_bdf_devs_list:
continue
print("", file=config)
print("struct acrn_vm_pci_dev_config " +
"vm{}_pci_devs[VM{}_CONFIG_PCI_DEV_NUM] = {{".format(i, i), file=config)
"vm{}_pci_devs[{}] = {{".format(vm_i, vm_info.cfg_pci.pci_dev_num[vm_i]), file=config)
print("\t{", file=config)
print("\t\t.emu_type = {},".format(PCI_DEV_TYPE[0]), file=config)
print("\t\t.vbdf.bits = {.b = 0x00U, .d = 0x00U, .f = 0x00U},", file=config)
print("\t\t.vdev_ops = &vhostbridge_ops,", file=config)
print("\t},", file=config)
print("\t{", file=config)
print("\t\t.emu_type = {},".format(PCI_DEV_TYPE[1]), file=config)
print("\t\t.vbdf.bits = {.b = 0x00U, .d = 0x01U, .f = 0x00U},", file=config)
print("\t\tVM{}_STORAGE_CONTROLLER".format(i), file=config)
print("\t},", file=config)
if i != 0:
print("#if defined(VM{}_NETWORK_CONTROLLER)".format(i), file=config)
print("\t{", file=config)
print("\t\t.emu_type = {},".format(PCI_DEV_TYPE[1]), file=config)
print("\t\t.vbdf.bits = {.b = 0x00U, .d = 0x02U, .f = 0x00U},", file=config)
print("\t\tVM{}_NETWORK_CONTROLLER".format(i), file=config)
print("\t},", file=config)
if i != 0:
print("#endif", file=config)
for pci_bdf_dev in pci_bdf_devs_list:
if not pci_bdf_dev:
continue
bus = int(pci_bdf_dev.split(':')[0], 16)
dev = int(pci_bdf_dev.split(':')[1].split('.')[0], 16)
fun = int(pci_bdf_dev.split('.')[1], 16)
print("\t{", file=config)
print("\t\t.emu_type = {},".format(PCI_DEV_TYPE[1]), file=config)
print("\t\t.vbdf.bits = {{.b = 0x00U, .d = 0x0{}U, .f = 0x00U}},".format(pci_cnt), file=config)
print("\t\t.pbdf.bits = {{.b = 0x{:02X}U, .d = 0x{:02X}U, .f = 0x{:02X}U}},".format(bus, dev, fun), file=config)
print("\t},", file=config)
pci_cnt += 1
print("};", file=config)

View File

@@ -47,6 +47,7 @@ def get_scenario_item_values(board_info, scenario_info):
scenario_item_values["vm,guest_flags"] = guest_flags
scenario_item_values["vm,clos"] = hw_info.get_clos_val()
scenario_item_values["vm,severity"] = scenario_cfg_lib.VM_SEVERITY
scenario_item_values["vm,pci_devs,pci_dev"] = scenario_cfg_lib.avl_pci_devs()
scenario_item_values["vm,os_config,kern_type"] = scenario_cfg_lib.KERN_TYPE_LIST
scenario_item_values.update(scenario_cfg_lib.avl_vuart_ui_select(scenario_info))
@@ -185,9 +186,11 @@ def main(args):
return err_dic
# generate pci_dev.c
if scenario_items['vm'].load_order_cnt.pre_vm >= 2:
with open(pci_config_c, 'w') as config:
pci_dev_c.generate_file(config)
for vm_i,pci_dev_num in scenario_items['vm'].cfg_pci.pci_dev_num.items():
if pci_dev_num >= 2:
with open(pci_config_c, 'w') as config:
pci_dev_c.generate_file(scenario_items['vm'], config)
break
if not err_dic:
print("Scenario configurations for {} is generated successfully.".format(scenario))

View File

@@ -142,8 +142,14 @@ class VuartInfo:
"""
self.v0_vuart = board_cfg_lib.get_vuart_info_id(self.scenario_info, 0)
self.v1_vuart = board_cfg_lib.get_vuart_info_id(self.scenario_info, 1)
scenario_cfg_lib.check_board_private_info()
def check_item(self):
"""
Check all items in this class
:return: None
"""
scenario_cfg_lib.check_board_private_info()
scenario_cfg_lib.check_vuart(self.v0_vuart, self.v1_vuart)
class MemInfo:
""" This is Abstract of class of memory setting information """
@@ -193,14 +199,15 @@ class CfgPci:
Get pci device number items
:return: None
"""
self.pci_dev_num = common.get_leaf_tag_map(self.scenario_info, "pci_dev_num")
self.pci_dev_num = scenario_cfg_lib.get_pci_num(self.pci_devs)
def get_pci_devs(self):
"""
Get pci devices items
:return: None
"""
self.pci_devs = common.get_leaf_tag_map(self.scenario_info, "pci_devs")
pci_items = common.get_leaf_tag_map(self.scenario_info, "pci_devs", "pci_dev")
self.pci_devs = scenario_cfg_lib.get_pci_devs(pci_items)
def get_info(self):
@@ -208,15 +215,14 @@ class CfgPci:
Get all items which belong to this class
:return: None
"""
self.get_pci_dev_num()
self.get_pci_devs()
self.get_pci_dev_num()
def check_item(self):
""" Check all items in this class
:return: None
"""
scenario_cfg_lib.pci_dev_num_check(self.pci_dev_num, "pci_dev_num")
scenario_cfg_lib.pci_devs_check(self.pci_devs, "pci_devs")
scenario_cfg_lib.pci_devs_check(self.pci_devs, "pci_devs", "pci_dev")
class EpcSection:
@@ -316,3 +322,4 @@ class VmInfo:
self.mem_info.check_item()
self.os_cfg.check_item()
self.cfg_pci.check_item()
self.vuart.check_item()

View File

@@ -139,13 +139,6 @@ def vuart_output(vm_type, i, vm_info, config):
vuart1_output(i, vm_type, vuart1_vmid_dic, vm_info, config)
print("\t\t},", file=config)
# pci_dev_num/pci_devs only for SOS_VM or logical_partition pre_launched_vm
if vm_type == "SOS_VM" or vm_type == "PRE_LAUNCHED_VM":
if vm_info.cfg_pci.pci_dev_num[i] and vm_info.cfg_pci.pci_dev_num[i] != None:
print("\t\t.pci_dev_num = {},".format(vm_info.cfg_pci.pci_dev_num[i]), file=config)
if vm_info.cfg_pci.pci_devs[i] and vm_info.cfg_pci.pci_devs[i] != None:
print("\t\t.pci_devs = {},".format(vm_info.cfg_pci.pci_devs[i]), file=config)
def is_need_epc(epc_section, i, config):
"""
@@ -337,6 +330,10 @@ def gen_pre_launch_vm(vm_type, vm_i, vm_info, config):
if err_dic:
return err_dic
if vm_info.cfg_pci.pci_devs[vm_i] and vm_info.cfg_pci.pci_devs[vm_i] != None:
print("\t\t.pci_dev_num = {}U,".format(vm_info.cfg_pci.pci_dev_num[vm_i]), file=config)
print("\t\t.pci_devs = vm{}_pci_devs,".format(vm_i), file=config)
print("\t},", file=config)
@@ -387,7 +384,7 @@ def pre_launch_definiation(vm_info, config):
if vm_type != "PRE_LAUNCHED_VM":
continue
print("extern struct acrn_vm_pci_dev_config " +
"vm{0}_pci_devs[VM{1}_CONFIG_PCI_DEV_NUM];".format(vm_i, vm_i), file=config)
"vm{}_pci_devs[{}];".format(vm_i, vm_info.cfg_pci.pci_dev_num[vm_i]), file=config)
print("", file=config)
def generate_file(vm_info, config):
@@ -397,8 +394,10 @@ def generate_file(vm_info, config):
"""
err_dic = {}
gen_source_header(config)
if vm_info.load_order_cnt.pre_vm >= 2:
pre_launch_definiation(vm_info, config)
for vm_i,pci_dev_num in vm_info.cfg_pci.pci_dev_num.items():
if pci_dev_num >= 2:
pre_launch_definiation(vm_info, config)
break
print("struct acrn_vm_config vm_configs[CONFIG_MAX_VM_NUM] = {", file=config)
for vm_i, vm_type in common.VM_TYPES.items():

View File

@@ -126,7 +126,7 @@ def gen_header_file(vm_info, config):
def get_dm_owned_guest_flag_mask(vm_info, config):
if vm_info.load_order_cnt.pre_vm >= 2:
if "SOS_VM" not in common.VM_TYPES.values():
print("#define DM_OWNED_GUEST_FLAG_MASK\t0UL", file=config)
else:
print("/* Bits mask of guest flags that can be programmed by device model." +