Skip to content

Commit 8563025

Browse files
Wei Liuwenlingz
authored andcommitted
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>
1 parent e0c7565 commit 8563025

File tree

9 files changed

+173
-91
lines changed

9 files changed

+173
-91
lines changed

misc/acrn-config/launch_config/launch_item.py

Lines changed: 12 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -49,18 +49,18 @@ def get_bdf_vpid_map(self):
4949
return self.bdf_vpid_map
5050

5151
def get_pci_dev(self):
52-
self.avl["usb_xdci"] = launch_cfg_lib.get_avl_dev_info(self.bdf_desc_map, launch_cfg_lib.PT_SUB_PCI['usb_xdci'])
53-
self.avl["ipu"] = launch_cfg_lib.get_avl_dev_info(self.bdf_desc_map, launch_cfg_lib.PT_SUB_PCI['ipu'])
54-
self.avl["ipu_i2c"] = launch_cfg_lib.get_avl_dev_info(self.bdf_desc_map, launch_cfg_lib.PT_SUB_PCI['ipu_i2c'])
55-
self.avl["cse"] = launch_cfg_lib.get_avl_dev_info(self.bdf_desc_map, launch_cfg_lib.PT_SUB_PCI['cse'])
56-
self.avl["audio"] = launch_cfg_lib.get_avl_dev_info(self.bdf_desc_map, launch_cfg_lib.PT_SUB_PCI['audio'])
57-
self.avl["audio_codec"] = launch_cfg_lib.get_avl_dev_info(self.bdf_desc_map, launch_cfg_lib.PT_SUB_PCI['audio_codec'])
58-
self.avl["sd_card"] = launch_cfg_lib.get_avl_dev_info(self.bdf_desc_map, launch_cfg_lib.PT_SUB_PCI['sd_card'])
59-
self.avl["wifi"] = launch_cfg_lib.get_avl_dev_info(self.bdf_desc_map, launch_cfg_lib.PT_SUB_PCI['wifi'])
60-
self.avl["ethernet"] = launch_cfg_lib.get_avl_dev_info(self.bdf_desc_map, launch_cfg_lib.PT_SUB_PCI['ethernet'])
61-
self.avl["sata"] = launch_cfg_lib.get_avl_dev_info(self.bdf_desc_map, launch_cfg_lib.PT_SUB_PCI['sata'])
62-
self.avl["nvme"] = launch_cfg_lib.get_avl_dev_info(self.bdf_desc_map, launch_cfg_lib.PT_SUB_PCI['nvme'])
63-
self.avl["bluetooth"] = launch_cfg_lib.get_avl_dev_info(self.bdf_desc_map, launch_cfg_lib.PT_SUB_PCI['bluetooth'])
52+
self.avl["usb_xdci"] = common.get_avl_dev_info(self.bdf_desc_map, launch_cfg_lib.PT_SUB_PCI['usb_xdci'])
53+
self.avl["ipu"] = common.get_avl_dev_info(self.bdf_desc_map, launch_cfg_lib.PT_SUB_PCI['ipu'])
54+
self.avl["ipu_i2c"] = common.get_avl_dev_info(self.bdf_desc_map, launch_cfg_lib.PT_SUB_PCI['ipu_i2c'])
55+
self.avl["cse"] = common.get_avl_dev_info(self.bdf_desc_map, launch_cfg_lib.PT_SUB_PCI['cse'])
56+
self.avl["audio"] = common.get_avl_dev_info(self.bdf_desc_map, launch_cfg_lib.PT_SUB_PCI['audio'])
57+
self.avl["audio_codec"] = common.get_avl_dev_info(self.bdf_desc_map, launch_cfg_lib.PT_SUB_PCI['audio_codec'])
58+
self.avl["sd_card"] = common.get_avl_dev_info(self.bdf_desc_map, launch_cfg_lib.PT_SUB_PCI['sd_card'])
59+
self.avl["wifi"] = common.get_avl_dev_info(self.bdf_desc_map, launch_cfg_lib.PT_SUB_PCI['wifi'])
60+
self.avl["ethernet"] = common.get_avl_dev_info(self.bdf_desc_map, launch_cfg_lib.PT_SUB_PCI['ethernet'])
61+
self.avl["sata"] = common.get_avl_dev_info(self.bdf_desc_map, launch_cfg_lib.PT_SUB_PCI['sata'])
62+
self.avl["nvme"] = common.get_avl_dev_info(self.bdf_desc_map, launch_cfg_lib.PT_SUB_PCI['nvme'])
63+
self.avl["bluetooth"] = common.get_avl_dev_info(self.bdf_desc_map, launch_cfg_lib.PT_SUB_PCI['bluetooth'])
6464

6565
def insert_nun(self):
6666
self.avl["usb_xdci"].insert(0, '')

misc/acrn-config/library/common.py

Lines changed: 22 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@
1919
GUEST_FLAG = ["0UL", "GUEST_FLAG_SECURE_WORLD_ENABLED", "GUEST_FLAG_LAPIC_PASSTHROUGH",
2020
"GUEST_FLAG_IO_COMPLETION_POLLING", "GUEST_FLAG_HIDE_MTRR", "GUEST_FLAG_RT"]
2121

22-
MULTI_ITEM = ["guest_flag", "pcpu_id", "vcpu_clos", "input", "block", "network"]
22+
MULTI_ITEM = ["guest_flag", "pcpu_id", "vcpu_clos", "input", "block", "network", "pci_dev"]
2323

2424
SIZE_K = 1024
2525
SIZE_M = SIZE_K * 1024
@@ -43,6 +43,7 @@ def __init__(self):
4343
self.vir_block = []
4444
self.vir_console = []
4545
self.vir_network = []
46+
self.pci_dev = []
4647

4748
class TmpItem():
4849

@@ -255,7 +256,6 @@ def get_leaf_value(tmp, tag_str, leaf):
255256
# get guest flag for logical partition vm1
256257
if leaf.tag == "guest_flag" and tag_str == "guest_flag":
257258
t_flag = find_tmp_flag(leaf.text)
258-
#print("--debug: tag:{},{}".format(tag_str), t_flag)
259259
tmp.multi.guest_flag.append(t_flag)
260260

261261
# get cpu for vm
@@ -278,6 +278,10 @@ def get_leaf_value(tmp, tag_str, leaf):
278278
if leaf.tag == "network" and tag_str == "network":
279279
tmp.multi.vir_network.append(leaf.text)
280280

281+
# get pci_dev for vm
282+
if leaf.tag == "pci_dev" and tag_str == "pci_dev":
283+
tmp.multi.pci_dev.append(leaf.text)
284+
281285

282286
def get_sub_value(tmp, tag_str, vm_id):
283287

@@ -305,6 +309,10 @@ def get_sub_value(tmp, tag_str, vm_id):
305309
if tmp.multi.vir_network and tag_str == "network":
306310
tmp.tag[vm_id] = tmp.multi.vir_network
307311

312+
# append pci_dev for vm
313+
if tmp.multi.pci_dev and tag_str == "pci_dev":
314+
tmp.tag[vm_id] = tmp.multi.pci_dev
315+
308316

309317
def get_leaf_tag_map(config_file, branch_tag, tag_str=''):
310318
"""
@@ -421,3 +429,15 @@ def num2int(str_value):
421429
def get_vm_types():
422430
global VM_TYPES
423431
VM_TYPES = get_leaf_tag_map(SCENARIO_INFO_FILE, "load_order")
432+
433+
434+
def get_avl_dev_info(bdf_desc_map, pci_sub_class):
435+
436+
tmp_pci_desc = []
437+
for sub_class in pci_sub_class:
438+
for pci_desc_value in bdf_desc_map.values():
439+
pci_desc_sub_class = ' '.join(pci_desc_value.strip().split(':')[1].split()[1:])
440+
if sub_class == pci_desc_sub_class:
441+
tmp_pci_desc.append(pci_desc_value.strip())
442+
443+
return tmp_pci_desc

misc/acrn-config/library/launch_cfg_lib.py

Lines changed: 0 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -184,18 +184,6 @@ def get_post_vm_cnt():
184184
return (launch_vm_count, post_vm_count)
185185

186186

187-
def get_avl_dev_info(bdf_desc_map, pci_sub_class):
188-
189-
tmp_pci_desc = []
190-
for sub_class in pci_sub_class:
191-
for pci_desc_value in bdf_desc_map.values():
192-
pci_desc_sub_class = ' '.join(pci_desc_value.strip().split(':')[1].split()[1:])
193-
if sub_class == pci_desc_sub_class:
194-
tmp_pci_desc.append(pci_desc_value.strip())
195-
196-
return tmp_pci_desc
197-
198-
199187
def is_config_file_match():
200188

201189
match = True

misc/acrn-config/library/scenario_cfg_lib.py

Lines changed: 89 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -25,8 +25,6 @@
2525
VUART_IRQ = ['SOS_COM1_IRQ', 'SOS_COM2_IRQ', 'COM1_IRQ', 'COM2_IRQ', 'COM3_IRQ',
2626
'COM4_IRQ', 'CONFIG_COM_IRQ', '3', '4', '6', '7']
2727

28-
PCI_DEV_NUM_LIST = ['SOS_EMULATED_PCI_DEV_NUM', 'VM0_CONFIG_PCI_DEV_NUM', 'VM1_CONFIG_PCI_DEV_NUM']
29-
PCI_DEVS_LIST = ['sos_pci_devs', 'vm0_pci_devs', 'vm1_pci_devs']
3028
# Support 512M, 1G, 2G
3129
# pre launch less then 2G, sos vm less than 24G
3230
START_HPA_SIZE_LIST = ['0x20000000', '0x40000000', '0x80000000', 'CONFIG_SOS_RAM_SIZE']
@@ -36,6 +34,43 @@
3634
ERR_LIST = {}
3735

3836
KATA_VM_COUNT = 0
37+
PT_SUB_PCI = {}
38+
PT_SUB_PCI['ethernet'] = ['Ethernet controller', 'Network controller', '802.1a controller',
39+
'802.1b controller', 'Wireless controller']
40+
PT_SUB_PCI['sata'] = ['SATA controller']
41+
PT_SUB_PCI['nvme'] = ['Non-Volatile memory controller']
42+
43+
44+
def get_pci_devs(pci_items):
45+
46+
pci_devs = {}
47+
for vm_i,pci_descs in pci_items.items():
48+
bdf_list = []
49+
for pci_des in pci_descs:
50+
if not pci_des:
51+
continue
52+
bdf = pci_des.split()[0]
53+
bdf_list.append(bdf)
54+
55+
pci_devs[vm_i] = bdf_list
56+
57+
return pci_devs
58+
59+
60+
def get_pci_num(pci_devs):
61+
62+
pci_devs_num = {}
63+
for vm_i,pci_devs_list in pci_devs.items():
64+
# vhostbridge
65+
cnt_dev = 1
66+
for pci_dev in pci_devs_list:
67+
if not pci_dev:
68+
continue
69+
cnt_dev += 1
70+
71+
pci_devs_num[vm_i] = cnt_dev
72+
73+
return pci_devs_num
3974

4075

4176
def check_board_private_info():
@@ -362,37 +397,18 @@ def os_kern_root_dev_check(id_kern_rootdev_dic, prime_item, item):
362397
ERR_LIST[key] = "VM os config kernel root device should not empty"
363398

364399

365-
def pci_dev_num_check(id_dev_num_dic, item):
366-
"""
367-
Check vm pci device number
368-
:param item: vm pci_dev_num item in xml
369-
:return: None
370-
"""
371-
372-
for vm_i,vm_type in common.VM_TYPES.items():
373-
if vm_i not in id_dev_num_dic.keys():
374-
continue
375-
pci_dev_num = id_dev_num_dic[vm_i]
376-
if vm_type != "POST_LAUNCHED_VM" and pci_dev_num:
377-
if pci_dev_num not in PCI_DEV_NUM_LIST:
378-
key = "vm:id={},{}".format(vm_i, item)
379-
ERR_LIST[key] = "VM pci device number shoud be one of {}".format(PCI_DEV_NUM_LIST)
380-
381-
def pci_devs_check(id_devs_dic, item):
400+
def pci_devs_check(pci_bdf_devs, branch_tag, tag_str):
382401
"""
383402
Check vm pci devices
384403
:param item: vm pci_devs item in xml
385404
:return: None
386405
"""
387-
388-
for vm_i,vm_type in common.VM_TYPES.items():
389-
if vm_i not in id_devs_dic.keys():
390-
continue
391-
pci_dev = id_devs_dic[vm_i]
392-
if vm_type != "POST_LAUNCHED_VM" and pci_dev:
393-
if pci_dev not in PCI_DEVS_LIST:
394-
key = "vm:id={},{}".format(vm_i, item)
395-
ERR_LIST[key] = "VM pci device shoud be one of {}".format(PCI_DEVS_LIST)
406+
(bdf_desc_map, bdf_vpid_map) = board_cfg_lib.get_pci_info(common.BOARD_INFO_FILE)
407+
for id_key, pci_bdf_devs_list in pci_bdf_devs.items():
408+
for pci_bdf_dev in pci_bdf_devs_list:
409+
if pci_bdf_dev and pci_bdf_dev not in bdf_desc_map.keys():
410+
key = "vm:id={},{},{}".format(id_key, branch_tag, tag_str)
411+
ERR_LIST[key] = "The {} is unkonw device of PCI".format(pci_bdf_dev)
396412

397413

398414
def get_vuart1_vmid(vm_vuart1):
@@ -497,3 +513,48 @@ def get_first_post_vm():
497513
break
498514

499515
return (err_dic, i)
516+
517+
518+
def avl_pci_devs():
519+
520+
pci_dev_list = []
521+
(bdf_desc_map, bdf_vpid_map) = board_cfg_lib.get_pci_info(common.BOARD_INFO_FILE)
522+
pci_dev_list = common.get_avl_dev_info(bdf_desc_map, PT_SUB_PCI['ethernet'])
523+
tmp_pci_list = common.get_avl_dev_info(bdf_desc_map, PT_SUB_PCI['sata'])
524+
pci_dev_list.extend(tmp_pci_list)
525+
tmp_pci_list = common.get_avl_dev_info(bdf_desc_map, PT_SUB_PCI['nvme'])
526+
pci_dev_list.extend(tmp_pci_list)
527+
528+
return pci_dev_list
529+
530+
531+
def check_vuart(v0_vuart, v1_vuart):
532+
533+
vm_target_id_dic = {}
534+
for vm_i,vuart_dic in v1_vuart.items():
535+
# check target vm id
536+
if 'base' not in vuart_dic.keys():
537+
key = "vm:id={},vuart:id=1,base".format(vm_i)
538+
ERR_LIST[key] = "base should be in xml"
539+
return
540+
541+
if not vuart_dic['base'] or vuart_dic['base'] not in VUART_BASE:
542+
key = "vm:id={},vuart:id=1,base".format(vm_i)
543+
ERR_LIST[key] = "base should be SOS/COM BASE"
544+
545+
if vuart_dic['base'] == "INVALID_COM_BASE":
546+
continue
547+
548+
if 'target_vm_id' not in vuart_dic.keys():
549+
key = "vm:id={},vuart:id=1,target_vm_id".format(vm_i)
550+
ERR_LIST[key] = "target_vm_id should be in xml"
551+
552+
if not vuart_dic['target_vm_id'] or not vuart_dic['target_vm_id'].isnumeric():
553+
key = "vm:id={},vuart:id=1,target_vm_id".format(vm_i)
554+
ERR_LIST[key] = "target_vm_id should be numeric of vm id"
555+
vm_target_id_dic[vm_i] = vuart_dic['target_vm_id']
556+
557+
for vm_i,t_vm_id in vm_target_id_dic.items():
558+
if t_vm_id.isnumeric() and int(t_vm_id) not in common.VM_TYPES.keys():
559+
key = "vm:id={},vuart:id=1,target_vm_id".format(vm_i)
560+
ERR_LIST[key] = "target_vm_id which specified does not exist"

misc/acrn-config/scenario_config/pci_dev_c.py

Lines changed: 21 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@
99
PCI_DEV_TYPE = ['PCI_DEV_TYPE_HVEMUL', 'PCI_DEV_TYPE_PTDEV']
1010

1111

12-
def generate_file(config):
12+
def generate_file(vm_info, config):
1313
"""
1414
Generate pci_dev.c while logical_partition scenario
1515
:param config: it is pointer for for file write to
@@ -29,27 +29,31 @@ def generate_file(config):
2929
print(" * The memory range of vBAR should exactly match with the e820 layout of VM.",
3030
file=config)
3131
print(" */", file=config)
32-
for i in list(common.VM_TYPES.keys()):
32+
for vm_i, pci_bdf_devs_list in vm_info.cfg_pci.pci_devs.items():
33+
pci_cnt = 1
34+
if not pci_bdf_devs_list:
35+
continue
36+
3337
print("", file=config)
3438
print("struct acrn_vm_pci_dev_config " +
35-
"vm{}_pci_devs[VM{}_CONFIG_PCI_DEV_NUM] = {{".format(i, i), file=config)
39+
"vm{}_pci_devs[{}] = {{".format(vm_i, vm_info.cfg_pci.pci_dev_num[vm_i]), file=config)
3640
print("\t{", file=config)
3741
print("\t\t.emu_type = {},".format(PCI_DEV_TYPE[0]), file=config)
3842
print("\t\t.vbdf.bits = {.b = 0x00U, .d = 0x00U, .f = 0x00U},", file=config)
3943
print("\t\t.vdev_ops = &vhostbridge_ops,", file=config)
4044
print("\t},", file=config)
41-
print("\t{", file=config)
42-
print("\t\t.emu_type = {},".format(PCI_DEV_TYPE[1]), file=config)
43-
print("\t\t.vbdf.bits = {.b = 0x00U, .d = 0x01U, .f = 0x00U},", file=config)
44-
print("\t\tVM{}_STORAGE_CONTROLLER".format(i), file=config)
45-
print("\t},", file=config)
46-
if i != 0:
47-
print("#if defined(VM{}_NETWORK_CONTROLLER)".format(i), file=config)
48-
print("\t{", file=config)
49-
print("\t\t.emu_type = {},".format(PCI_DEV_TYPE[1]), file=config)
50-
print("\t\t.vbdf.bits = {.b = 0x00U, .d = 0x02U, .f = 0x00U},", file=config)
51-
print("\t\tVM{}_NETWORK_CONTROLLER".format(i), file=config)
52-
print("\t},", file=config)
53-
if i != 0:
54-
print("#endif", file=config)
45+
46+
for pci_bdf_dev in pci_bdf_devs_list:
47+
if not pci_bdf_dev:
48+
continue
49+
bus = int(pci_bdf_dev.split(':')[0], 16)
50+
dev = int(pci_bdf_dev.split(':')[1].split('.')[0], 16)
51+
fun = int(pci_bdf_dev.split('.')[1], 16)
52+
print("\t{", file=config)
53+
print("\t\t.emu_type = {},".format(PCI_DEV_TYPE[1]), file=config)
54+
print("\t\t.vbdf.bits = {{.b = 0x00U, .d = 0x0{}U, .f = 0x00U}},".format(pci_cnt), file=config)
55+
print("\t\t.pbdf.bits = {{.b = 0x{:02X}U, .d = 0x{:02X}U, .f = 0x{:02X}U}},".format(bus, dev, fun), file=config)
56+
print("\t},", file=config)
57+
pci_cnt += 1
58+
5559
print("};", file=config)

misc/acrn-config/scenario_config/scenario_cfg_gen.py

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,7 @@ def get_scenario_item_values(board_info, scenario_info):
4747
scenario_item_values["vm,guest_flags"] = guest_flags
4848
scenario_item_values["vm,clos"] = hw_info.get_clos_val()
4949
scenario_item_values["vm,severity"] = scenario_cfg_lib.VM_SEVERITY
50+
scenario_item_values["vm,pci_devs,pci_dev"] = scenario_cfg_lib.avl_pci_devs()
5051
scenario_item_values["vm,os_config,kern_type"] = scenario_cfg_lib.KERN_TYPE_LIST
5152
scenario_item_values.update(scenario_cfg_lib.avl_vuart_ui_select(scenario_info))
5253

@@ -185,9 +186,11 @@ def main(args):
185186
return err_dic
186187

187188
# generate pci_dev.c
188-
if scenario_items['vm'].load_order_cnt.pre_vm >= 2:
189-
with open(pci_config_c, 'w') as config:
190-
pci_dev_c.generate_file(config)
189+
for vm_i,pci_dev_num in scenario_items['vm'].cfg_pci.pci_dev_num.items():
190+
if pci_dev_num >= 2:
191+
with open(pci_config_c, 'w') as config:
192+
pci_dev_c.generate_file(scenario_items['vm'], config)
193+
break
191194

192195
if not err_dic:
193196
print("Scenario configurations for {} is generated successfully.".format(scenario))

misc/acrn-config/scenario_config/scenario_item.py

Lines changed: 13 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -142,8 +142,14 @@ def get_info(self):
142142
"""
143143
self.v0_vuart = board_cfg_lib.get_vuart_info_id(self.scenario_info, 0)
144144
self.v1_vuart = board_cfg_lib.get_vuart_info_id(self.scenario_info, 1)
145-
scenario_cfg_lib.check_board_private_info()
146145

146+
def check_item(self):
147+
"""
148+
Check all items in this class
149+
:return: None
150+
"""
151+
scenario_cfg_lib.check_board_private_info()
152+
scenario_cfg_lib.check_vuart(self.v0_vuart, self.v1_vuart)
147153

148154
class MemInfo:
149155
""" This is Abstract of class of memory setting information """
@@ -193,30 +199,30 @@ def get_pci_dev_num(self):
193199
Get pci device number items
194200
:return: None
195201
"""
196-
self.pci_dev_num = common.get_leaf_tag_map(self.scenario_info, "pci_dev_num")
202+
self.pci_dev_num = scenario_cfg_lib.get_pci_num(self.pci_devs)
197203

198204
def get_pci_devs(self):
199205
"""
200206
Get pci devices items
201207
:return: None
202208
"""
203-
self.pci_devs = common.get_leaf_tag_map(self.scenario_info, "pci_devs")
209+
pci_items = common.get_leaf_tag_map(self.scenario_info, "pci_devs", "pci_dev")
210+
self.pci_devs = scenario_cfg_lib.get_pci_devs(pci_items)
204211

205212

206213
def get_info(self):
207214
"""
208215
Get all items which belong to this class
209216
:return: None
210217
"""
211-
self.get_pci_dev_num()
212218
self.get_pci_devs()
219+
self.get_pci_dev_num()
213220

214221
def check_item(self):
215222
""" Check all items in this class
216223
:return: None
217224
"""
218-
scenario_cfg_lib.pci_dev_num_check(self.pci_dev_num, "pci_dev_num")
219-
scenario_cfg_lib.pci_devs_check(self.pci_devs, "pci_devs")
225+
scenario_cfg_lib.pci_devs_check(self.pci_devs, "pci_devs", "pci_dev")
220226

221227

222228
class EpcSection:
@@ -316,3 +322,4 @@ def check_item(self):
316322
self.mem_info.check_item()
317323
self.os_cfg.check_item()
318324
self.cfg_pci.check_item()
325+
self.vuart.check_item()

0 commit comments

Comments
 (0)