misc: refine vuart connection

We have redesign the vuart and the UI for user, so the config tool
should change the schema and xform for the new xml, then change the
static_allocators to alloc irq and io_port for new connection.

This patch add a new vuart connection type and change the xforms to
adapter the new type.

Tracked-On: #6690
Reviewed-by: Junjie Mao <junjie.mao@intel.com>
Signed-off-by: Chenli Wei <chenli.wei@linux.intel.com>
This commit is contained in:
Chenli Wei 2022-02-28 16:41:14 +08:00 committed by acrnsi-robot
parent c4c7835c12
commit 9450fcf3e1
6 changed files with 110 additions and 26 deletions

View File

@ -177,6 +177,38 @@ must exactly match the module tag in the GRUB multiboot cmdline.</xs:documentati
</xs:restriction> </xs:restriction>
</xs:simpleType> </xs:simpleType>
<xs:simpleType name="VuartType">
<xs:annotation>
<xs:documentation>vCOM type</xs:documentation>
</xs:annotation>
<xs:restriction base="xs:string">
<xs:enumeration value="legacy" />
<xs:enumeration value="pci" />
</xs:restriction>
</xs:simpleType>
<xs:complexType name="VuartEndpointType">
<xs:sequence>
<xs:element name="vm_name" type="xs:string"/>
<xs:element name="io_port" type="HexFormat" default="0x3F" />
<xs:element name="vbdf" type="VBDFType" minOccurs="0" maxOccurs="1" />
</xs:sequence>
</xs:complexType>
<xs:complexType name="VuartConnectionType">
<xs:sequence>
<xs:element name="name" type="xs:string" />
<xs:element name="type" type="VuartType" default="legacy" />
<xs:element name="endpoint" type="VuartEndpointType" minOccurs="2" maxOccurs="2" />
</xs:sequence>
</xs:complexType>
<xs:complexType name="VuartConnectionsType">
<xs:sequence>
<xs:element name="vuart_connection" type="VuartConnectionType" minOccurs="0" maxOccurs="unbounded"/>
</xs:sequence>
</xs:complexType>
<xs:simpleType name="LegacyVuartType"> <xs:simpleType name="LegacyVuartType">
<xs:annotation acrn:configurable="n"> <xs:annotation acrn:configurable="n">
<xs:documentation>vCOM type</xs:documentation> <xs:documentation>vCOM type</xs:documentation>

View File

@ -292,6 +292,12 @@ If this value is empty, then the default value will be calculated from informati
<xs:element name="MEMORY" type="MemoryOptionsType" /> <xs:element name="MEMORY" type="MemoryOptionsType" />
<xs:element name="CAPACITIES" type="CapacitiesOptionsType" /> <xs:element name="CAPACITIES" type="CapacitiesOptionsType" />
<xs:element name="MISC_CFG" type="MiscCfgOptionsType" /> <xs:element name="MISC_CFG" type="MiscCfgOptionsType" />
<xs:element name="vuart_connections" type="VuartConnectionsType" minOccurs="0" maxOccurs="8">
<xs:annotation>
<xs:documentation>Specify the vUART connection setting.
Refer to :ref:`vuart_config` for detailed vUART settings.</xs:documentation>
</xs:annotation>
</xs:element>
</xs:all> </xs:all>
</xs:complexType> </xs:complexType>
@ -395,7 +401,7 @@ Refer SDM 17.19.2 for details, and use with caution.</xs:documentation>
argument and memory.</xs:documentation> argument and memory.</xs:documentation>
</xs:annotation> </xs:annotation>
</xs:element> </xs:element>
<xs:element name="legacy_vuart" type="LegacyVuartConfiguration" minOccurs="2" maxOccurs="8"> <xs:element name="legacy_vuart" type="LegacyVuartConfiguration" minOccurs="1" maxOccurs="8">
<xs:annotation> <xs:annotation>
<xs:documentation>Specify the vUART (aka COM) with the vUART ID by its ``id`` attribute. <xs:documentation>Specify the vUART (aka COM) with the vUART ID by its ``id`` attribute.
Refer to :ref:`vuart_config` for detailed vUART settings.</xs:documentation> Refer to :ref:`vuart_config` for detailed vUART settings.</xs:documentation>
@ -407,12 +413,6 @@ Refer to :ref:`vuart_config` for detailed vUART settings.</xs:documentation>
its ``id`` attribute.</xs:documentation> its ``id`` attribute.</xs:documentation>
</xs:annotation> </xs:annotation>
</xs:element> </xs:element>
<xs:element name="communication_vuart" type="CommunicationVuartConfiguration" maxOccurs="unbounded">
<xs:annotation>
<xs:documentation>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.</xs:documentation>
</xs:annotation>
</xs:element>
<xs:element name="mmio_resources" type="MMIOResourcesConfiguration" minOccurs="0"> <xs:element name="mmio_resources" type="MMIOResourcesConfiguration" minOccurs="0">
<xs:annotation> <xs:annotation>
<xs:documentation>MMIO resources to passthrough.</xs:documentation> <xs:documentation>MMIO resources to passthrough.</xs:documentation>

View File

@ -37,20 +37,6 @@ def main(args):
user_vm_id = legacy_vuart.find('target_vm_id').text user_vm_id = legacy_vuart.find('target_vm_id').text
legacy_vuartid = int(legacy_vuart.attrib["id"]) legacy_vuartid = int(legacy_vuart.attrib["id"])
vuart_target_vmid[legacy_vuartid] = user_vm_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__': if __name__ == '__main__':
parser = argparse.ArgumentParser() parser = argparse.ArgumentParser()
parser.add_argument("--allocation", help="the XML file summarizing resource allocated by config tool") parser.add_argument("--allocation", help="the XML file summarizing resource allocated by config tool")

View File

@ -27,15 +27,10 @@ def find_unused_bdf(used_bdf):
def insert_vuart_to_dev_dict(scenario_etree, devdict, used): def insert_vuart_to_dev_dict(scenario_etree, devdict, used):
console_vuart = scenario_etree.xpath(f"./console_vuart[base != 'INVALID_PCI_BASE']/@id") 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: for vuart_id in console_vuart:
free_bdf = find_unused_bdf(used) free_bdf = find_unused_bdf(used)
devdict[f"{VUART}_{vuart_id}"] = free_bdf devdict[f"{VUART}_{vuart_id}"] = free_bdf
used.append(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): def insert_ivsheme_to_dev_dict(scenario_etree, devdict, vm_id, used):
shmem_regions = lib.lib.get_ivshmem_regions_by_tree(scenario_etree) shmem_regions = lib.lib.get_ivshmem_regions_by_tree(scenario_etree)

View File

@ -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) 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): def get_irqs_of_device(device_node):
irqs = set() irqs = set()
@ -231,4 +251,5 @@ def alloc_device_irqs(board_etree, scenario_etree, allocation_etree):
def fn(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_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) alloc_device_irqs(board_etree, scenario_etree, allocation_etree)

View File

@ -103,6 +103,7 @@
<xsl:apply-templates select="os_config" /> <xsl:apply-templates select="os_config" />
<xsl:call-template name="acpi_config" /> <xsl:call-template name="acpi_config" />
<xsl:call-template name="legacy_vuart" /> <xsl:call-template name="legacy_vuart" />
<xsl:call-template name="vuart_connection" />
<xsl:call-template name="pci_dev_num" /> <xsl:call-template name="pci_dev_num" />
<xsl:call-template name="pci_devs" /> <xsl:call-template name="pci_devs" />
<xsl:if test="acrn:is-pre-launched-vm(load_order)"> <xsl:if test="acrn:is-pre-launched-vm(load_order)">
@ -264,6 +265,55 @@
</xsl:for-each> </xsl:for-each>
</xsl:template> </xsl:template>
<xsl:template name="vuart_connection">
<xsl:variable name="vm_id" select="@id" />
<xsl:variable name="vmname" select="name/text()" />
<xsl:for-each select="//vuart_connection[endpoint/vm_name = $vmname]">
<xsl:variable name="connection_name" select="name/text()" />
<xsl:variable name="type" select="type/text()" />
<xsl:variable name="vuart_id" select="position()"/>
<xsl:value-of select="acrn:initializer(concat('vuart[', $vuart_id, ']'), '{', true())" />
<xsl:choose>
<xsl:when test="$type = 'legacy'">
<xsl:value-of select="acrn:initializer('type', 'VUART_LEGACY_PIO')" />
</xsl:when>
<xsl:when test="$type = 'pci'">
<xsl:value-of select="acrn:initializer('type', 'VUART_PCI')" />
</xsl:when>
</xsl:choose>
<xsl:value-of select="acrn:initializer('irq', concat(//allocation-data/acrn-config/vm[@id=$vm_id]/legacy_vuart[@id=$vuart_id]/irq, 'U'))" />
<xsl:for-each select="endpoint">
<xsl:choose>
<xsl:when test="vm_name = $vmname">
<xsl:choose>
<xsl:when test="$type = 'legacy'">
<xsl:value-of select="acrn:initializer('addr.port_base', concat(io_port, 'U'))" />
</xsl:when>
<xsl:when test="$type = 'pci'">
<xsl:variable name="b" select="substring-before(vbdf/text(), ':')" />
<xsl:variable name="d" select="substring-before(substring-after(vbdf/text(), ':'), '.')" />
<xsl:variable name="f" select="substring-after(vbdf/text(), '.')" />
<xsl:value-of select="acrn:initializer('addr.bdf', concat('{', $b, ', ', $d, ', ', $f, '}'))" />
</xsl:when>
</xsl:choose>
</xsl:when>
<xsl:otherwise>
<xsl:variable name="target_name" select="vm_name" />
<xsl:value-of select="acrn:initializer('t_vuart.vm_id', concat(//vm[name = $target_name]/@id, 'U'))" />
<xsl:for-each select="//vuart_connection[endpoint/vm_name = $target_name]">
<xsl:variable name="uart_num" select="position()"/>
<xsl:if test="name = $connection_name">
<xsl:value-of select="acrn:initializer('t_vuart.vuart_id', concat($uart_num, 'U'))" />
</xsl:if>
</xsl:for-each>
</xsl:otherwise>
</xsl:choose>
</xsl:for-each>
<xsl:text>},</xsl:text>
<xsl:value-of select="$newline" />
</xsl:for-each>
</xsl:template>
<xsl:template name="pci_dev_num"> <xsl:template name="pci_dev_num">
<xsl:choose> <xsl:choose>
<xsl:when test="acrn:is-service-vm(load_order)"> <xsl:when test="acrn:is-service-vm(load_order)">