diff --git a/misc/config_tools/schema/VMtypes.xsd b/misc/config_tools/schema/VMtypes.xsd
index 2d76c43e0..dddb0a5dd 100644
--- a/misc/config_tools/schema/VMtypes.xsd
+++ b/misc/config_tools/schema/VMtypes.xsd
@@ -177,6 +177,38 @@ must exactly match the module tag in the GRUB multiboot cmdline.
+
+
+ vCOM type
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
vCOM type
diff --git a/misc/config_tools/schema/config.xsd b/misc/config_tools/schema/config.xsd
index 0556711e6..4bf20ad6c 100644
--- a/misc/config_tools/schema/config.xsd
+++ b/misc/config_tools/schema/config.xsd
@@ -292,6 +292,12 @@ If this value is empty, then the default value will be calculated from informati
+
+
+ Specify the vUART connection setting.
+Refer to :ref:`vuart_config` for detailed vUART settings.
+
+
@@ -395,7 +401,7 @@ Refer SDM 17.19.2 for details, and use with caution.
argument and memory.
-
+
Specify the vUART (aka COM) with the vUART ID by its ``id`` attribute.
Refer to :ref:`vuart_config` for detailed vUART settings.
@@ -407,12 +413,6 @@ Refer to :ref:`vuart_config` for detailed vUART settings.
its ``id`` attribute.
-
-
- Specify the communication vUART (aka PCI based vUART) with the vUART ID by
-its ``id`` attribute. When it is enabled, specify which target VM's vUART the current VM connects to.
-
-
MMIO resources to passthrough.
diff --git a/misc/config_tools/service_vm_config/serial_config.py b/misc/config_tools/service_vm_config/serial_config.py
index 455c63d43..d7eaf2b55 100644
--- a/misc/config_tools/service_vm_config/serial_config.py
+++ b/misc/config_tools/service_vm_config/serial_config.py
@@ -37,20 +37,6 @@ def main(args):
user_vm_id = legacy_vuart.find('target_vm_id').text
legacy_vuartid = int(legacy_vuart.attrib["id"])
vuart_target_vmid[legacy_vuartid] = user_vm_id
-
- vm_list = allocation_etree.xpath("//vm[load_order = 'SERVICE_VM']")
- for vm in vm_list:
- vuart_list = find_non_standard_uart(vm)
- if len(vuart_list) != 0:
- with open(args.out, "w+") as config_f:
- for uart_start_num, vuart in enumerate(vuart_list, start=START_VUART_DEV_NAME_NO):
- base = " port " + vuart.find('base').text
- vuart_id = int(vuart.attrib["id"])
- vm_id_note = "# User_VM_id: " + str(vuart_target_vmid[vuart_id]) + '\n'
- config_f.write(vm_id_note)
- conf = "/dev/ttyS" + str(uart_start_num) + base + UART_IRQ_BAUD + '\n'
- config_f.write(conf)
-
if __name__ == '__main__':
parser = argparse.ArgumentParser()
parser.add_argument("--allocation", help="the XML file summarizing resource allocated by config tool")
diff --git a/misc/config_tools/static_allocators/bdf.py b/misc/config_tools/static_allocators/bdf.py
index 7952af473..005c9000f 100644
--- a/misc/config_tools/static_allocators/bdf.py
+++ b/misc/config_tools/static_allocators/bdf.py
@@ -27,15 +27,10 @@ def find_unused_bdf(used_bdf):
def insert_vuart_to_dev_dict(scenario_etree, devdict, used):
console_vuart = scenario_etree.xpath(f"./console_vuart[base != 'INVALID_PCI_BASE']/@id")
- communication_vuarts = scenario_etree.xpath(f".//communication_vuart[base != 'INVALID_PCI_BASE']/@id")
for vuart_id in console_vuart:
free_bdf = find_unused_bdf(used)
devdict[f"{VUART}_{vuart_id}"] = free_bdf
used.append(free_bdf)
- for vuart_id in communication_vuarts:
- free_bdf = find_unused_bdf(used)
- devdict[f"{VUART}_{vuart_id}"] = free_bdf
- used.append(free_bdf)
def insert_ivsheme_to_dev_dict(scenario_etree, devdict, vm_id, used):
shmem_regions = lib.lib.get_ivshmem_regions_by_tree(scenario_etree)
diff --git a/misc/config_tools/static_allocators/intx.py b/misc/config_tools/static_allocators/intx.py
index 9ca099200..b8316cfed 100644
--- a/misc/config_tools/static_allocators/intx.py
+++ b/misc/config_tools/static_allocators/intx.py
@@ -95,6 +95,26 @@ def alloc_legacy_vuart_irqs(board_etree, scenario_etree, allocation_etree):
create_vuart_irq_node(allocation_etree, common.get_node("./@id", vm_node), load_order, legacy_vuart_id, legacy_vuart_irq)
+def alloc_vuart_connection_irqs(board_etree, scenario_etree, allocation_etree):
+ native_ttys = lib.lib.get_native_ttys()
+ hv_debug_console = lib.lib.parse_hv_console(scenario_etree)
+
+ vm_node_list = scenario_etree.xpath("//vm")
+ for vm_node in vm_node_list:
+ load_order = common.get_node("./load_order/text()", vm_node)
+ irq_list = get_native_valid_irq() if load_order == "SERVICE_VM" else [f"{d}" for d in list(range(1,15))]
+ vuart_id = '1'
+ vmname = common.get_node("./name/text()", vm_node)
+ vuart_connections = scenario_etree.xpath("//vuart_connection")
+ for connection in vuart_connections:
+ endpoint_list = connection.xpath(".//endpoint")
+ for endpoint in endpoint_list:
+ vm_name = common.get_node("./vm_name/text()",endpoint)
+ if vm_name == vmname:
+ legacy_vuart_irq = alloc_irq(irq_list)
+ create_vuart_irq_node(allocation_etree, common.get_node("./@id", vm_node), load_order, vuart_id, legacy_vuart_irq)
+ vuart_id = str(int(vuart_id) + 1)
+
def get_irqs_of_device(device_node):
irqs = set()
@@ -231,4 +251,5 @@ def alloc_device_irqs(board_etree, scenario_etree, allocation_etree):
def fn(board_etree, scenario_etree, allocation_etree):
alloc_legacy_vuart_irqs(board_etree, scenario_etree, allocation_etree)
+ alloc_vuart_connection_irqs(board_etree, scenario_etree, allocation_etree)
alloc_device_irqs(board_etree, scenario_etree, allocation_etree)
diff --git a/misc/config_tools/xforms/vm_configurations.c.xsl b/misc/config_tools/xforms/vm_configurations.c.xsl
index 9d27617c1..001b0e592 100644
--- a/misc/config_tools/xforms/vm_configurations.c.xsl
+++ b/misc/config_tools/xforms/vm_configurations.c.xsl
@@ -103,6 +103,7 @@
+
@@ -264,6 +265,55 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ },
+
+
+
+