qemu-devel.nongnu.org archive mirror
 help / color / mirror / Atom feed
From: Alexander Graf <agraf@suse.de>
To: "qemu-devel@nongnu.org Developers" <qemu-devel@nongnu.org>
Cc: Blue Swirl <blauwirbel@gmail.com>,
	Michael Ellerman <michael@ellerman.id.au>,
	Aurelien Jarno <aurelien@aurel32.net>,
	David Gibson <david@gibson.dropbear.id.au>
Subject: [Qemu-devel] [PATCH 06/10] pseries: Emit device tree nodes in reg order
Date: Tue,  3 Jan 2012 16:08:18 +0100	[thread overview]
Message-ID: <1325603302-12412-7-git-send-email-agraf@suse.de> (raw)
In-Reply-To: <1325603302-12412-1-git-send-email-agraf@suse.de>

From: David Gibson <david@gibson.dropbear.id.au>

Although in theory the device tree has no inherent ordering, in practice
the order of nodes in the device tree does effect the order that devices
are detected by software.

Currently the ordering is determined by the order the devices appear on
the QEMU command line. Although that does give the user control over the
ordering, it is fragile, especially when the user does not generate the
command line manually - eg. when using libvirt etc.

So order the device tree based on the reg value, ie. the address of on
the VIO bus of the devices. This gives us a sane and stable ordering.

Signed-off-by: Michael Ellerman <michael@ellerman.id.au>
Signed-off-by: David Gibson <david@gibson.dropbear.id.au>
Signed-off-by: Alexander Graf <agraf@suse.de>

[agraf] add braces
---
 hw/spapr_vio.c |   50 +++++++++++++++++++++++++++++++++++++++++++++-----
 1 files changed, 45 insertions(+), 5 deletions(-)

diff --git a/hw/spapr_vio.c b/hw/spapr_vio.c
index 5a35541..2cce421 100644
--- a/hw/spapr_vio.c
+++ b/hw/spapr_vio.c
@@ -736,21 +736,61 @@ static void spapr_vio_register_devices(void)
 device_init(spapr_vio_register_devices)
 
 #ifdef CONFIG_FDT
+static int compare_reg(const void *p1, const void *p2)
+{
+    VIOsPAPRDevice const *dev1, *dev2;
+
+    dev1 = (VIOsPAPRDevice *)*(DeviceState **)p1;
+    dev2 = (VIOsPAPRDevice *)*(DeviceState **)p2;
+
+    if (dev1->reg < dev2->reg) {
+        return -1;
+    }
+    if (dev1->reg == dev2->reg) {
+        return 0;
+    }
+
+    /* dev1->reg > dev2->reg */
+    return 1;
+}
+
 int spapr_populate_vdevice(VIOsPAPRBus *bus, void *fdt)
 {
-    DeviceState *qdev;
-    int ret = 0;
+    DeviceState *qdev, **qdevs;
+    int i, num, ret = 0;
 
+    /* Count qdevs on the bus list */
+    num = 0;
     QTAILQ_FOREACH(qdev, &bus->bus.children, sibling) {
-        VIOsPAPRDevice *dev = (VIOsPAPRDevice *)qdev;
+        num++;
+    }
+
+    /* Copy out into an array of pointers */
+    qdevs = g_malloc(sizeof(qdev) * num);
+    num = 0;
+    QTAILQ_FOREACH(qdev, &bus->bus.children, sibling) {
+        qdevs[num++] = qdev;
+    }
+
+    /* Sort the array */
+    qsort(qdevs, num, sizeof(qdev), compare_reg);
+
+    /* Hack alert. Give the devices to libfdt in reverse order, we happen
+     * to know that will mean they are in forward order in the tree. */
+    for (i = num - 1; i >= 0; i--) {
+        VIOsPAPRDevice *dev = (VIOsPAPRDevice *)(qdevs[i]);
 
         ret = vio_make_devnode(dev, fdt);
 
         if (ret < 0) {
-            return ret;
+            goto out;
         }
     }
 
-    return 0;
+    ret = 0;
+out:
+    free(qdevs);
+
+    return ret;
 }
 #endif /* CONFIG_FDT */
-- 
1.6.0.2

  parent reply	other threads:[~2012-01-03 14:54 UTC|newest]

Thread overview: 12+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2012-01-03 15:08 [Qemu-devel] [PULL 00/10] ppc patch queue 2012-01-03 Alexander Graf
2012-01-03 15:08 ` [Qemu-devel] [PATCH 01/10] PPC: monitor: add ability to dump SLB entries Alexander Graf
2012-01-03 15:08 ` [Qemu-devel] [PATCH 02/10] console: Fix segfault on screendump without VGA adapter Alexander Graf
2012-01-03 15:08 ` [Qemu-devel] [PATCH 03/10] kvm-ppc: halt secondary cpus when guest reset Alexander Graf
2012-01-03 15:08 ` [Qemu-devel] [PATCH 04/10] pseries: Remove hcalls callback Alexander Graf
2012-01-03 15:08 ` [Qemu-devel] [PATCH 05/10] pseries: FDT NUMA extensions to support multi-node guests Alexander Graf
2012-01-03 15:08 ` Alexander Graf [this message]
2012-01-03 15:08 ` [Qemu-devel] [PATCH 07/10] pseries: Add a routine to find a stable "default" vty and use it Alexander Graf
2012-01-03 15:08 ` [Qemu-devel] [PATCH 08/10] pseries: Populate "/chosen/linux, stdout-path" in the FDT Alexander Graf
2012-01-03 15:08 ` [Qemu-devel] [PATCH 09/10] pseries: Check for duplicate addresses on the spapr-vio bus Alexander Graf
2012-01-03 15:08 ` [Qemu-devel] [PATCH 10/10] PPC: Add description for the Freescale e500mc core Alexander Graf
2012-01-07 21:04 ` [Qemu-devel] [PULL 00/10] ppc patch queue 2012-01-03 Aurelien Jarno

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=1325603302-12412-7-git-send-email-agraf@suse.de \
    --to=agraf@suse.de \
    --cc=aurelien@aurel32.net \
    --cc=blauwirbel@gmail.com \
    --cc=david@gibson.dropbear.id.au \
    --cc=michael@ellerman.id.au \
    --cc=qemu-devel@nongnu.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).