From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([2001:4830:134:3::10]:48513) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1WsAJV-00065z-Tz for qemu-devel@nongnu.org; Wed, 04 Jun 2014 08:29:12 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1WsAJP-0001WN-3w for qemu-devel@nongnu.org; Wed, 04 Jun 2014 08:29:05 -0400 From: Alexander Graf Date: Wed, 4 Jun 2014 14:28:56 +0200 Message-Id: <1401884936-12907-6-git-send-email-agraf@suse.de> In-Reply-To: <1401884936-12907-1-git-send-email-agraf@suse.de> References: <1401884936-12907-1-git-send-email-agraf@suse.de> Subject: [Qemu-devel] [PATCH 5/5] PPC: e500: Add support for platform serial devices List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: qemu-ppc@nongnu.org Cc: qemu-devel@nongnu.org, eric.auger@linaro.org The guest only becomes aware of platform devices when we describe them inside the device tree. This patch adds description support for platform serial devices in device tree, allowing us to specify a serial port on the command line with -device. Signed-off-by: Alexander Graf --- default-configs/ppc-softmmu.mak | 1 + default-configs/ppc64-softmmu.mak | 1 + hw/ppc/e500.c | 28 ++++++++++++++++++++++++++-- 3 files changed, 28 insertions(+), 2 deletions(-) diff --git a/default-configs/ppc-softmmu.mak b/default-configs/ppc-softmmu.mak index d6ec8b9..63e7949 100644 --- a/default-configs/ppc-softmmu.mak +++ b/default-configs/ppc-softmmu.mak @@ -46,6 +46,7 @@ CONFIG_MAC=y CONFIG_E500=y CONFIG_OPENPIC_KVM=$(and $(CONFIG_E500),$(CONFIG_KVM)) CONFIG_PLATFORM=y +CONFIG_SERIAL_PLATFORM=y # For PReP CONFIG_MC146818RTC=y CONFIG_ETSEC=y diff --git a/default-configs/ppc64-softmmu.mak b/default-configs/ppc64-softmmu.mak index 06677bf..b72fb45 100644 --- a/default-configs/ppc64-softmmu.mak +++ b/default-configs/ppc64-softmmu.mak @@ -46,6 +46,7 @@ CONFIG_PREP=y CONFIG_MAC=y CONFIG_E500=y CONFIG_PLATFORM=y +CONFIG_SERIAL_PLATFORM=y CONFIG_OPENPIC_KVM=$(and $(CONFIG_E500),$(CONFIG_KVM)) # For pSeries CONFIG_XICS=$(CONFIG_PSERIES) diff --git a/hw/ppc/e500.c b/hw/ppc/e500.c index bc26215..39f028f 100644 --- a/hw/ppc/e500.c +++ b/hw/ppc/e500.c @@ -37,6 +37,7 @@ #include "qemu/host-utils.h" #include "hw/pci-host/ppce500.h" #include "hw/platform/device.h" +#include "hw/char/serial-platform.h" #define EPAPR_MAGIC (0x45504150) #define BINARY_DEVICE_TREE_FILE "mpc8544ds.dtb" @@ -110,7 +111,7 @@ static uint32_t *pci_map_create(void *fdt, uint32_t mpic, int first_slot, } static void dt_serial_create(void *fdt, unsigned long long offset, - const char *soc, const char *mpic, + const char *soc, const char *mpic, int irq, const char *alias, int idx, bool defcon) { char ser[128]; @@ -122,7 +123,7 @@ static void dt_serial_create(void *fdt, unsigned long long offset, qemu_fdt_setprop_cells(fdt, ser, "reg", offset, 0x100); qemu_fdt_setprop_cell(fdt, ser, "cell-index", idx); qemu_fdt_setprop_cell(fdt, ser, "clock-frequency", 0); - qemu_fdt_setprop_cells(fdt, ser, "interrupts", 42, 2); + qemu_fdt_setprop_cells(fdt, ser, "interrupts", irq, 2); qemu_fdt_setprop_phandle(fdt, ser, "interrupt-parent", mpic); qemu_fdt_setprop_string(fdt, "/aliases", alias, ser); @@ -135,6 +136,7 @@ typedef struct PlatformDevtreeData { void *fdt; const char *mpic; int irq_start; + int serial_idx; const char *node; } PlatformDevtreeData; @@ -152,9 +154,30 @@ static int platform_device_create_devtree(Object *obj, void *opaque) return object_child_foreach(obj, platform_device_create_devtree, data); } + if (PLATFORM_SERIAL(dev)) { + char *alias = g_strdup_printf("serial%d", data->serial_idx); + dt_serial_create(data->fdt, pdev->plat_region_addrs[0], data->node, + data->mpic, data->irq_start + pdev->plat_irqs[0], + alias, data->serial_idx, data->serial_idx == 0); + data->serial_idx++; + } + return 0; } +static int count_serial_hds(void) +{ + int r = 0, i; + + for (i = 0; i < 2; i++) { + if (serial_hds[i]) { + r++; + } + } + + return r; +} + static void platform_create_devtree(void *fdt, const char *node, uint64_t addr, const char *mpic, int irq_start, int nr_irqs) @@ -180,6 +203,7 @@ static void platform_create_devtree(void *fdt, const char *node, uint64_t addr, /* Loop through all devices and create nodes for known ones */ data.fdt = fdt; + data.serial_idx = count_serial_hds(); data.mpic = mpic; data.irq_start = irq_start; data.node = node; -- 1.8.1.4