From: Geert Uytterhoeven <geert+renesas@glider.be>
To: Peter Maydell <peter.maydell@linaro.org>,
Alex Williamson <alex.williamson@redhat.com>
Cc: Auger Eric <eric.auger@redhat.com>,
Magnus Damm <damm+renesas@opensource.se>,
Laurent Pinchart <laurent.pinchart+renesas@ideasonboard.com>,
Wolfram Sang <wsa+renesas@sang-engineering.com>,
Kieran Bingham <kieran.bingham+renesas@ideasonboard.com>,
qemu-arm@nongnu.org, qemu-devel@nongnu.org,
linux-renesas-soc@vger.kernel.org,
Geert Uytterhoeven <geert+renesas@glider.be>
Subject: [Qemu-devel] [PATCH v3 4/4] hw/arm/sysbus-fdt: Add support for instantiating generic devices
Date: Wed, 25 Jul 2018 16:34:13 +0200 [thread overview]
Message-ID: <20180725143413.9728-5-geert+renesas@glider.be> (raw)
In-Reply-To: <20180725143413.9728-1-geert+renesas@glider.be>
Add a fallback for instantiating generic devices without a type-specific
or compatible-specific instantation method. This will be used when no
other match is found.
The generic instantation method creates a device node with "reg" and
(optional) "interrupts" properties, and copies the "compatible"
property and other optional properties from the host.
For now the following optional properties are copied, if found:
- "#gpio-cells",
- "gpio-controller",
- "#interrupt-cells",
- "interrupt-controller",
- "interrupt-names".
More can be added when needed.
This avoids having to write device-specific instantation methods for
each and every "simple" device using only a set of generic properties.
Devices that need more specialized handling can still provide their
own instantation method.
This has been tested on a Renesas Salvator-XS board with R-Car H3 ES2.0
with SATA:
-device vfio-platform,host=ee300000.sata
and GPIO (needs VFIO No-IOMMU support):
-device vfio-platform,host=e6055400.gpio
Signed-off-by: Geert Uytterhoeven <geert+renesas@glider.be>
---
v3:
- New.
---
hw/arm/sysbus-fdt.c | 102 ++++++++++++++++++++++++++++++++++++++++++++
1 file changed, 102 insertions(+)
diff --git a/hw/arm/sysbus-fdt.c b/hw/arm/sysbus-fdt.c
index 0e24c803a1c2c734..8040af00ccf131d7 100644
--- a/hw/arm/sysbus-fdt.c
+++ b/hw/arm/sysbus-fdt.c
@@ -415,6 +415,99 @@ static int add_amd_xgbe_fdt_node(SysBusDevice *sbdev, void *opaque)
return 0;
}
+static HostProperty generic_copied_properties[] = {
+ {"compatible", false},
+ {"#gpio-cells", true},
+ {"gpio-controller", true},
+ {"#interrupt-cells", true},
+ {"interrupt-controller", true},
+ {"interrupt-names", true},
+};
+
+/**
+ * add_generic_fdt_node
+ *
+ * Generates a generic DT node by copying properties from the host
+ */
+static int add_generic_fdt_node(SysBusDevice *sbdev, void *opaque)
+{
+ PlatformBusFDTData *data = opaque;
+ VFIOPlatformDevice *vdev = VFIO_PLATFORM_DEVICE(sbdev);
+ const char *parent_node = data->pbus_node_name;
+ void *guest_fdt = data->fdt, *host_fdt;
+ VFIODevice *vbasedev = &vdev->vbasedev;
+ char **node_path, *node_name, *dt_name;
+ PlatformBusDevice *pbus = data->pbus;
+ int i, irq_number;
+ uint32_t *reg_attr, *irq_attr;
+ uint64_t mmio_base;
+
+ host_fdt = load_device_tree_from_sysfs();
+
+ dt_name = sysfs_to_dt_name(vbasedev->name);
+ if (!dt_name) {
+ error_report("%s incorrect sysfs device name %s", __func__,
+ vbasedev->name);
+ exit(1);
+ }
+ node_path = qemu_fdt_node_path(host_fdt, dt_name, vdev->compat,
+ &error_fatal);
+ if (!node_path || !node_path[0]) {
+ error_report("%s unable to retrieve node path for %s/%s", __func__,
+ dt_name, vdev->compat);
+ exit(1);
+ }
+
+ if (node_path[1]) {
+ error_report("%s more than one node matching %s/%s!", __func__, dt_name,
+ vdev->compat);
+ exit(1);
+ }
+
+ mmio_base = platform_bus_get_mmio_addr(pbus, sbdev, 0);
+ node_name = g_strdup_printf("%s/%s@%" PRIx64, parent_node,
+ vbasedev->name, mmio_base);
+ qemu_fdt_add_subnode(guest_fdt, node_name);
+
+ /* Copy generic properties */
+ copy_properties_from_host(generic_copied_properties,
+ ARRAY_SIZE(generic_copied_properties), host_fdt,
+ guest_fdt, node_path[0], node_name);
+
+ /* Copy reg (remapped) */
+ reg_attr = g_new(uint32_t, vbasedev->num_regions * 2);
+ for (i = 0; i < vbasedev->num_regions; i++) {
+ mmio_base = platform_bus_get_mmio_addr(pbus, sbdev, i);
+ reg_attr[2 * i] = cpu_to_be32(mmio_base);
+ reg_attr[2 * i + 1] = cpu_to_be32(
+ memory_region_size(vdev->regions[i]->mem));
+ }
+ qemu_fdt_setprop(guest_fdt, node_name, "reg", reg_attr,
+ vbasedev->num_regions * 2 * sizeof(uint32_t));
+
+ /* Copy interrupts (remapped) */
+ if (vbasedev->num_irqs) {
+ irq_attr = g_new(uint32_t, vbasedev->num_irqs * 3);
+ for (i = 0; i < vbasedev->num_irqs; i++) {
+ irq_number = platform_bus_get_irqn(pbus, sbdev , i)
+ + data->irq_start;
+ irq_attr[3 * i] = cpu_to_be32(GIC_FDT_IRQ_TYPE_SPI);
+ irq_attr[3 * i + 1] = cpu_to_be32(irq_number);
+ irq_attr[3 * i + 2] = cpu_to_be32(GIC_FDT_IRQ_FLAGS_LEVEL_HI);
+ }
+ qemu_fdt_setprop(guest_fdt, node_name, "interrupts",
+ irq_attr, vbasedev->num_irqs * 3 * sizeof(uint32_t));
+ g_free(irq_attr);
+ }
+
+ g_free(reg_attr);
+ g_free(node_name);
+ g_strfreev(node_path);
+ g_free(dt_name);
+ g_free(host_fdt);
+ return 0;
+}
+
/* DT compatible matching */
static bool vfio_platform_match(SysBusDevice *sbdev,
const BindingEntry *entry)
@@ -423,6 +516,11 @@ static bool vfio_platform_match(SysBusDevice *sbdev,
const char *compat;
unsigned int n;
+ if (!entry->compat) {
+ /* Generic DT fallback */
+ return true;
+ }
+
for (n = vdev->num_compat, compat = vdev->compat; n > 0;
n--, compat += strlen(compat) + 1) {
if (!strcmp(entry->compat, compat)) {
@@ -459,6 +557,10 @@ static const BindingEntry bindings[] = {
VFIO_PLATFORM_BINDING("amd,xgbe-seattle-v1a", add_amd_xgbe_fdt_node),
#endif
TYPE_BINDING(TYPE_RAMFB_DEVICE, no_fdt_node),
+#ifdef CONFIG_LINUX
+ /* Generic DT fallback must be last */
+ VFIO_PLATFORM_BINDING(NULL, add_generic_fdt_node),
+#endif
TYPE_BINDING("", NULL), /* last element */
};
--
2.17.1
next prev parent reply other threads:[~2018-07-25 14:34 UTC|newest]
Thread overview: 16+ messages / expand[flat|nested] mbox.gz Atom feed top
2018-07-25 14:34 [Qemu-devel] [PATCH v3 0/4] hw/arm/sysbus-fdt: Generic DT Pass-Through Geert Uytterhoeven
2018-07-25 14:34 ` [Qemu-devel] [PATCH v3 1/4] vfio/platform: Make the vfio-platform device non-abstract Geert Uytterhoeven
2018-08-07 14:18 ` Auger Eric
2018-08-07 15:00 ` Geert Uytterhoeven
2018-08-07 15:05 ` Auger Eric
2018-07-25 14:34 ` [Qemu-devel] [PATCH v3 2/4] hw/arm/sysbus-fdt: Allow device matching with DT compatible value Geert Uytterhoeven
2018-08-07 14:18 ` Auger Eric
2018-07-25 14:34 ` [Qemu-devel] [PATCH v3 3/4] hw/arm/virt: Allow dynamic sysbus devices again Geert Uytterhoeven
2018-08-07 14:18 ` Auger Eric
2018-07-25 14:34 ` Geert Uytterhoeven [this message]
2018-08-07 14:19 ` [Qemu-devel] [PATCH v3 4/4] hw/arm/sysbus-fdt: Add support for instantiating generic devices Auger Eric
2018-08-07 15:32 ` Geert Uytterhoeven
2018-08-07 17:21 ` Auger Eric
2018-08-08 12:59 ` Geert Uytterhoeven
2018-08-08 13:16 ` Auger Eric
2018-08-08 13:45 ` Geert Uytterhoeven
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=20180725143413.9728-5-geert+renesas@glider.be \
--to=geert+renesas@glider.be \
--cc=alex.williamson@redhat.com \
--cc=damm+renesas@opensource.se \
--cc=eric.auger@redhat.com \
--cc=kieran.bingham+renesas@ideasonboard.com \
--cc=laurent.pinchart+renesas@ideasonboard.com \
--cc=linux-renesas-soc@vger.kernel.org \
--cc=peter.maydell@linaro.org \
--cc=qemu-arm@nongnu.org \
--cc=qemu-devel@nongnu.org \
--cc=wsa+renesas@sang-engineering.com \
/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).