From nobody Mon Feb 9 07:43:04 2026 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) client-ip=208.118.235.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zoho.com; spf=pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; Return-Path: Received: from lists.gnu.org (lists.gnu.org [208.118.235.17]) by mx.zohomail.com with SMTPS id 1487524158207111.712321219366; Sun, 19 Feb 2017 09:09:18 -0800 (PST) Received: from localhost ([::1]:34488 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1cfUz6-0004gk-Iq for importer@patchew.org; Sun, 19 Feb 2017 12:09:16 -0500 Received: from eggs.gnu.org ([2001:4830:134:3::10]:34569) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1cfUtz-00005w-Pi for qemu-devel@nongnu.org; Sun, 19 Feb 2017 12:04:01 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1cfUty-0002pD-AP for qemu-devel@nongnu.org; Sun, 19 Feb 2017 12:03:59 -0500 Received: from zero.eik.bme.hu ([152.66.115.2]:65192) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1cfUtx-0002na-Ri; Sun, 19 Feb 2017 12:03:58 -0500 Received: from zero.eik.bme.hu (blah.eik.bme.hu [152.66.115.182]) by localhost (Postfix) with SMTP id 5CA9C745965; Sun, 19 Feb 2017 18:03:46 +0100 (CET) Received: by zero.eik.bme.hu (Postfix, from userid 432) id 20FAF74595F; Sun, 19 Feb 2017 18:03:39 +0100 (CET) Message-Id: In-Reply-To: References: From: BALATON Zoltan Date: Sun, 19 Feb 2017 17:35:23 +0100 To: qemu-devel@nongnu.org, qemu-trivial@nongnu.org X-detected-operating-system: by eggs.gnu.org: FreeBSD 9.x [fuzzy] X-Received-From: 152.66.115.2 Subject: [Qemu-devel] [PATCH 03/10] sm501: QOMify X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Aurelien Jarno Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail: RSF_0 Z_629925259 SPT_0 Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Signed-off-by: BALATON Zoltan --- hw/display/sm501.c | 133 +++++++++++++++++++++++++++++++++++------------= ---- hw/sh4/r2d.c | 11 ++++- include/hw/devices.h | 5 -- 3 files changed, 101 insertions(+), 48 deletions(-) diff --git a/hw/display/sm501.c b/hw/display/sm501.c index 4eb085c..b592022 100644 --- a/hw/display/sm501.c +++ b/hw/display/sm501.c @@ -58,8 +58,8 @@ #define SM501_DPRINTF(fmt, ...) do {} while (0) #endif =20 - #define MMIO_BASE_OFFSET 0x3e00000 +#define MMIO_SIZE 0x200000 =20 /* SM501 register definitions taken from "linux/include/linux/sm501-regs.h= " */ =20 @@ -464,6 +464,7 @@ typedef struct SM501State { uint32_t local_mem_size_index; uint8_t *local_mem; MemoryRegion local_mem_region; + MemoryRegion mmio_region; uint32_t last_width; uint32_t last_height; =20 @@ -1396,20 +1397,14 @@ static const GraphicHwOps sm501_ops =3D { .gfx_update =3D sm501_update_display, }; =20 -void sm501_init(MemoryRegion *address_space_mem, uint32_t base, - uint32_t local_mem_bytes, qemu_irq irq, Chardev *chr) +static void sm501_init(SM501State *s, DeviceState *dev, uint32_t base, + uint32_t local_mem_bytes) { - SM501State *s; - DeviceState *dev; - MemoryRegion *sm501_system_config =3D g_new(MemoryRegion, 1); - MemoryRegion *sm501_disp_ctrl =3D g_new(MemoryRegion, 1); - MemoryRegion *sm501_2d_engine =3D g_new(MemoryRegion, 1); - - /* allocate management data region */ - s =3D g_new0(SM501State, 1); + MemoryRegion *mr; + s->base =3D base; s->local_mem_size_index =3D get_local_mem_size_index(local_mem_bytes); - SM501_DPRINTF("local mem size=3D%x. index=3D%d\n", get_local_mem_size(= s), + SM501_DPRINTF("sm501 local mem size=3D%x. index=3D%d\n", get_local_mem= _size(s), s->local_mem_size_index); s->system_control =3D 0x00100000; /* 2D engine FIFO empty */ s->misc_control =3D SM501_MISC_IRQ_INVERT; /* assumes SH, active=3Dlow= */ @@ -1417,46 +1412,102 @@ void sm501_init(MemoryRegion *address_space_mem, u= int32_t base, s->dc_crt_control =3D 0x00010000; =20 /* allocate local memory */ - memory_region_init_ram(&s->local_mem_region, NULL, "sm501.local", + memory_region_init_ram(&s->local_mem_region, OBJECT(dev), "sm501.local= ", local_mem_bytes, &error_fatal); vmstate_register_ram_global(&s->local_mem_region); memory_region_set_log(&s->local_mem_region, true, DIRTY_MEMORY_VGA); s->local_mem =3D memory_region_get_ram_ptr(&s->local_mem_region); - memory_region_add_subregion(address_space_mem, base, &s->local_mem_reg= ion); - - /* map mmio */ - memory_region_init_io(sm501_system_config, NULL, &sm501_system_config_= ops, - s, "sm501-system-config", 0x6c); - memory_region_add_subregion(address_space_mem, base + MMIO_BASE_OFFSET, - sm501_system_config); - memory_region_init_io(sm501_disp_ctrl, NULL, &sm501_disp_ctrl_ops, s, + + /* allocate mmio */ + memory_region_init(&s->mmio_region, OBJECT(dev), "sm501.mmio", MMIO_SI= ZE); + mr =3D g_new(MemoryRegion, 1); + memory_region_init_io(mr, OBJECT(dev), &sm501_system_config_ops, s, + "sm501-system-config", 0x6c); + memory_region_add_subregion(&s->mmio_region, SM501_SYS_CONFIG, mr); + mr =3D g_new(MemoryRegion, 1); + memory_region_init_io(mr, OBJECT(dev), &sm501_disp_ctrl_ops, s, "sm501-disp-ctrl", 0x1000); - memory_region_add_subregion(address_space_mem, - base + MMIO_BASE_OFFSET + SM501_DC, - sm501_disp_ctrl); - memory_region_init_io(sm501_2d_engine, NULL, &sm501_2d_engine_ops, s, + memory_region_add_subregion(&s->mmio_region, SM501_DC, mr); + mr =3D g_new(MemoryRegion, 1); + memory_region_init_io(mr, OBJECT(dev), &sm501_2d_engine_ops, s, "sm501-2d-engine", 0x54); - memory_region_add_subregion(address_space_mem, - base + MMIO_BASE_OFFSET + SM501_2D_ENGINE, - sm501_2d_engine); + memory_region_add_subregion(&s->mmio_region, SM501_2D_ENGINE, mr); + + /* create qemu graphic console */ + s->con =3D graphic_console_init(DEVICE(dev), 0, &sm501_ops, s); +} + +#define TYPE_SYSBUS_SM501 "sysbus-sm501" +#define SYSBUS_SM501(obj) \ + OBJECT_CHECK(SM501SysBusState, (obj), TYPE_SYSBUS_SM501) + +typedef struct { + /*< private >*/ + SysBusDevice parent_obj; + /*< public >*/ + SM501State state; + uint32_t vram_size; + uint32_t base; + void *chr_state; +} SM501SysBusState; + +static void sm501_realize_sysbus(DeviceState *dev, Error **errp) +{ + SM501SysBusState *s =3D SYSBUS_SM501(dev); + SysBusDevice *sbd =3D SYS_BUS_DEVICE(dev); + DeviceState *usb_dev; + + sm501_init(&s->state, dev, s->base, s->vram_size); + sysbus_init_mmio(sbd, &s->state.local_mem_region); + sysbus_init_mmio(sbd, &s->state.mmio_region); =20 /* bridge to usb host emulation module */ - dev =3D qdev_create(NULL, "sysbus-ohci"); - qdev_prop_set_uint32(dev, "num-ports", 2); - qdev_prop_set_uint64(dev, "dma-offset", base); - qdev_init_nofail(dev); - sysbus_mmio_map(SYS_BUS_DEVICE(dev), 0, - base + MMIO_BASE_OFFSET + SM501_USB_HOST); - sysbus_connect_irq(SYS_BUS_DEVICE(dev), 0, irq); + usb_dev =3D qdev_create(NULL, "sysbus-ohci"); + qdev_prop_set_uint32(usb_dev, "num-ports", 2); + qdev_prop_set_uint64(usb_dev, "dma-offset", s->base); + qdev_init_nofail(usb_dev); + memory_region_add_subregion(&s->state.mmio_region, SM501_USB_HOST, + sysbus_mmio_get_region(SYS_BUS_DEVICE(usb_dev), 0)); + sysbus_pass_irq(sbd, SYS_BUS_DEVICE(usb_dev)); =20 /* bridge to serial emulation module */ - if (chr) { - serial_mm_init(address_space_mem, - base + MMIO_BASE_OFFSET + SM501_UART0, 2, + if (s->chr_state) { + serial_mm_init(&s->state.mmio_region, SM501_UART0, 2, NULL, /* TODO : chain irq to IRL */ - 115200, chr, DEVICE_NATIVE_ENDIAN); + 115200, s->chr_state, DEVICE_NATIVE_ENDIAN); } +} =20 - /* create qemu graphic console */ - s->con =3D graphic_console_init(DEVICE(dev), 0, &sm501_ops, s); +static Property sm501_sysbus_properties[] =3D { + DEFINE_PROP_UINT32("vram-size", SM501SysBusState, vram_size, 0), + DEFINE_PROP_UINT32("base", SM501SysBusState, base, 0), + DEFINE_PROP_PTR("chr-state", SM501SysBusState, chr_state), + DEFINE_PROP_END_OF_LIST(), +}; + +static void sm501_sysbus_class_init(ObjectClass *klass, void *data) +{ + DeviceClass *dc =3D DEVICE_CLASS(klass); + + dc->realize =3D sm501_realize_sysbus; + set_bit(DEVICE_CATEGORY_DISPLAY, dc->categories); + dc->desc =3D "SM501 Multimedia Companion"; + dc->props =3D sm501_sysbus_properties; +/* Note: pointer property "chr-state" may remain null, thus + * no need for dc->cannot_instantiate_with_device_add_yet =3D true; + */ } + +static const TypeInfo sm501_sysbus_info =3D { + .name =3D TYPE_SYSBUS_SM501, + .parent =3D TYPE_SYS_BUS_DEVICE, + .instance_size =3D sizeof(SM501SysBusState), + .class_init =3D sm501_sysbus_class_init, +}; + +static void sm501_register_types(void) +{ + type_register_static(&sm501_sysbus_info); +} + +type_init(sm501_register_types) diff --git a/hw/sh4/r2d.c b/hw/sh4/r2d.c index db373c7..adc41b6 100644 --- a/hw/sh4/r2d.c +++ b/hw/sh4/r2d.c @@ -277,8 +277,15 @@ static void r2d_init(MachineState *machine) sysbus_connect_irq(busdev, 2, irq[PCI_INTC]); sysbus_connect_irq(busdev, 3, irq[PCI_INTD]); =20 - sm501_init(address_space_mem, 0x10000000, SM501_VRAM_SIZE, - irq[SM501], serial_hds[2]); + dev =3D qdev_create(NULL, "sysbus-sm501"); + busdev =3D SYS_BUS_DEVICE(dev); + qdev_prop_set_uint32(dev, "vram-size", SM501_VRAM_SIZE); + qdev_prop_set_uint32(dev, "base", 0x10000000); + qdev_prop_set_ptr(dev, "chr-state", serial_hds[2]); + qdev_init_nofail(dev); + sysbus_mmio_map(busdev, 0, 0x10000000); + sysbus_mmio_map(busdev, 1, 0x13e00000); + sysbus_connect_irq(busdev, 0, irq[SM501]); =20 /* onboard CF (True IDE mode, Master only). */ dinfo =3D drive_get(IF_IDE, 0, 0); diff --git a/include/hw/devices.h b/include/hw/devices.h index 7475b71..861ddea 100644 --- a/include/hw/devices.h +++ b/include/hw/devices.h @@ -62,9 +62,4 @@ void tc6393xb_gpio_out_set(TC6393xbState *s, int line, qemu_irq *tc6393xb_gpio_in_get(TC6393xbState *s); qemu_irq tc6393xb_l3v_get(TC6393xbState *s); =20 -/* sm501.c */ -void sm501_init(struct MemoryRegion *address_space_mem, uint32_t base, - uint32_t local_mem_bytes, qemu_irq irq, - Chardev *chr); - #endif --=20 2.7.4