This patch introduces a basic approach to support platform bus.
virtio-mmio devices are popular on arm/arm64 VM, so introduce
the platform bus for arm/arm64 support.

Basically, the patch can start qemu on arm64.

Signed-off-by: Ming Lei <[email protected]>
---
 shared/cfg/guest-os/Linux/LinuxCustom/trusty.cfg |    1 +
 virttest/qemu_devices/qcontainer.py              |   29 +++++++++++++++-------
 virttest/qemu_devices/qdevices.py                |   21 ++++++++++++++++
 virttest/qemu_vm.py                              |    4 ++-
 4 files changed, 45 insertions(+), 10 deletions(-)

diff --git a/shared/cfg/guest-os/Linux/LinuxCustom/trusty.cfg 
b/shared/cfg/guest-os/Linux/LinuxCustom/trusty.cfg
index c25851d..b085043 100644
--- a/shared/cfg/guest-os/Linux/LinuxCustom/trusty.cfg
+++ b/shared/cfg/guest-os/Linux/LinuxCustom/trusty.cfg
@@ -11,3 +11,4 @@
     pci_assignable = no
     usbs = ""
     usb_devices = ""
+    pci_bus = platform
diff --git a/virttest/qemu_devices/qcontainer.py 
b/virttest/qemu_devices/qcontainer.py
index 16be016..6edb539 100644
--- a/virttest/qemu_devices/qcontainer.py
+++ b/virttest/qemu_devices/qcontainer.py
@@ -487,6 +487,16 @@ class DevContainer(object):
             for device in added_devices:
                 self.wash_the_device_out(device)
 
+        def add(device, added_devices):
+            if device.get_qid() and self.get_by_qid(device.get_qid()):
+                err = "Devices qid %s already used in VM\n" % device.get_qid()
+                clean(device, added_devices)
+                raise DeviceInsertError(device, err, self)
+            device.set_aid(self.__create_unique_aid(device.get_qid()))
+            self.__devices.append(device)
+            added_devices.append(device)
+            return added_devices
+
         if strict_mode is None:
             _strict_mode = self.strict_mode
         if strict_mode is True:
@@ -498,6 +508,11 @@ class DevContainer(object):
                                                             (list, tuple)):
             # it have to be list of parent buses
             device.parent_bus = (device.parent_bus,)
+
+        # all platform devices belong to one same platform bus
+        if device.is_plat_device():
+           return add(device, added_devices)
+
         for parent_bus in device.parent_bus:
             # type, aobject, busid
             if parent_bus is None:
@@ -540,14 +555,7 @@ class DevContainer(object):
         for bus in device.child_bus:
             self.__buses.insert(0, bus)
         # 4
-        if device.get_qid() and self.get_by_qid(device.get_qid()):
-            err = "Devices qid %s already used in VM\n" % device.get_qid()
-            clean(device, added_devices)
-            raise DeviceInsertError(device, err, self)
-        device.set_aid(self.__create_unique_aid(device.get_qid()))
-        self.__devices.append(device)
-        added_devices.append(device)
-        return added_devices
+        return add(device, added_devices)
 
     def simple_hotplug(self, device, monitor):
         """
@@ -1288,7 +1296,10 @@ class DevContainer(object):
             if strict_mode:
                 devices[-1].set_param('channel', 0)
         elif fmt == 'virtio':
-            devices[-1].set_param('driver', 'virtio-blk-pci')
+            if devices[-1].is_plat_device():
+                devices[-1].set_param('driver', 'virtio-blk-device')
+            else:
+                devices[-1].set_param('driver', 'virtio-blk-pci')
             devices[-1].set_param("scsi", scsi, bool)
             if bus is not None:
                 devices[-1].set_param('addr', hex(bus))
diff --git a/virttest/qemu_devices/qdevices.py 
b/virttest/qemu_devices/qdevices.py
index b272e7d..b01e0d1 100644
--- a/virttest/qemu_devices/qdevices.py
+++ b/virttest/qemu_devices/qdevices.py
@@ -88,6 +88,27 @@ class QBaseDevice(object):
             for key, value in params.iteritems():
                 self.set_param(key, value)
 
+    def is_plat_device(self):
+        def is_plat_bus(tbus):
+            if tbus.has_key('aobject'):
+                    if tbus.get('aobject') == 'platform':
+                        return True
+                    else:
+                        return False
+            return False
+
+        if self.parent_bus is None:
+            return False
+        tbus = self.parent_bus
+        if type(tbus) is dict and is_plat_bus(tbus) is True:
+            return True
+        for tbus in self.parent_bus:
+            if not type(tbus) is dict:
+                continue
+            if is_plat_bus(tbus) is True:
+                return True
+        return False
+
     def add_child_bus(self, bus):
         """
         Add child bus
diff --git a/virttest/qemu_vm.py b/virttest/qemu_vm.py
index 5c76e15..79b3d4e 100644
--- a/virttest/qemu_vm.py
+++ b/virttest/qemu_vm.py
@@ -559,8 +559,10 @@ class VM(virt_vm.BaseVM):
             if "virtio" in model:
                 if int(queues) > 1:
                     dev.set_param('mq', 'on')
-                if vectors:
+                if vectors and not dev.is_plat_device() is True:
                     dev.set_param('vectors', vectors)
+                if dev.is_plat_device():
+                    dev.set_param('driver', 'virtio-net-device')
             if devices.has_option("netdev"):
                 dev.set_param('netdev', netdev_id)
             else:
-- 
1.7.9.5

_______________________________________________
Virt-test-devel mailing list
[email protected]
https://www.redhat.com/mailman/listinfo/virt-test-devel

Reply via email to