From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([140.186.70.92]:37732) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1RunEw-0004Cw-Lg for qemu-devel@nongnu.org; Tue, 07 Feb 2012 10:46:00 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1RunEo-00078W-TZ for qemu-devel@nongnu.org; Tue, 07 Feb 2012 10:45:54 -0500 Received: from smtp1-g21.free.fr ([212.27.42.1]:41685) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1RunEn-00078A-Up for qemu-devel@nongnu.org; Tue, 07 Feb 2012 10:45:46 -0500 From: =?UTF-8?q?Herv=C3=A9=20Poussineau?= Date: Tue, 7 Feb 2012 16:46:13 +0100 Message-Id: <1328629574-11671-3-git-send-email-hpoussin@reactos.org> In-Reply-To: <1328629574-11671-1-git-send-email-hpoussin@reactos.org> References: <1328629574-11671-1-git-send-email-hpoussin@reactos.org> MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: quoted-printable Subject: [Qemu-devel] [PATCH v3 2/3] jazz-led: convert to QOM List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: qemu-devel@nongnu.org Cc: Anthony Liguori , =?UTF-8?q?Herv=C3=A9=20Poussineau?= Some simplifications in I/O functions are possible because Jazz LED only registers one byte of I/O. Signed-off-by: Herv=C3=A9 Poussineau --- hw/jazz_led.c | 157 ++++++++++++++++++++++++--------------------------= ------ hw/mips.h | 3 - hw/mips_jazz.c | 2 +- 3 files changed, 69 insertions(+), 93 deletions(-) diff --git a/hw/jazz_led.c b/hw/jazz_led.c index 1af9268..9fb10d5 100644 --- a/hw/jazz_led.c +++ b/hw/jazz_led.c @@ -1,7 +1,7 @@ /* * QEMU JAZZ LED emulator. * - * Copyright (c) 2007 Herv=C3=A9 Poussineau + * Copyright (c) 2007-2012 Herve Poussineau * * Permission is hereby granted, free of charge, to any person obtaining= a copy * of this software and associated documentation files (the "Software"),= to deal @@ -22,123 +22,53 @@ * THE SOFTWARE. */ =20 -#include "hw.h" -#include "mips.h" #include "console.h" #include "pixel_ops.h" #include "trace.h" +#include "sysbus.h" =20 typedef enum { REDRAW_NONE =3D 0, REDRAW_SEGMENTS =3D 1, REDRAW_BACKGROUND =3D 2, } screen_state_t; =20 typedef struct LedState { + SysBusDevice busdev; MemoryRegion iomem; uint8_t segments; DisplayState *ds; screen_state_t state; } LedState; =20 -static uint32_t led_readb(void *opaque, target_phys_addr_t addr) +static uint64_t jazz_led_read(void *opaque, target_phys_addr_t addr, + unsigned int size) { LedState *s =3D opaque; uint8_t val; =20 - switch (addr) { - case 0: - val =3D s->segments; - break; - default: - error_report("invalid read at [" TARGET_FMT_plx "]\n", addr)= ; - val =3D 0; - } - + val =3D s->segments; trace_jazz_led_read(addr, val); =20 return val; } =20 -static uint32_t led_readw(void *opaque, target_phys_addr_t addr) -{ - uint32_t v; -#ifdef TARGET_WORDS_BIGENDIAN - v =3D led_readb(opaque, addr) << 8; - v |=3D led_readb(opaque, addr + 1); -#else - v =3D led_readb(opaque, addr); - v |=3D led_readb(opaque, addr + 1) << 8; -#endif - return v; -} - -static uint32_t led_readl(void *opaque, target_phys_addr_t addr) -{ - uint32_t v; -#ifdef TARGET_WORDS_BIGENDIAN - v =3D led_readb(opaque, addr) << 24; - v |=3D led_readb(opaque, addr + 1) << 16; - v |=3D led_readb(opaque, addr + 2) << 8; - v |=3D led_readb(opaque, addr + 3); -#else - v =3D led_readb(opaque, addr); - v |=3D led_readb(opaque, addr + 1) << 8; - v |=3D led_readb(opaque, addr + 2) << 16; - v |=3D led_readb(opaque, addr + 3) << 24; -#endif - return v; -} - -static void led_writeb(void *opaque, target_phys_addr_t addr, uint32_t v= al) +static void jazz_led_write(void *opaque, target_phys_addr_t addr, + uint64_t val, unsigned int size) { LedState *s =3D opaque; uint8_t new_val =3D val & 0xff; =20 trace_jazz_led_write(addr, new_val); =20 - switch (addr) { - case 0: - s->segments =3D new_val; - s->state |=3D REDRAW_SEGMENTS; - break; - default: - error_report("invalid write of 0x%x at [" TARGET_FMT_plx "]\= n", - new_val, addr); - break; - } -} - -static void led_writew(void *opaque, target_phys_addr_t addr, uint32_t v= al) -{ -#ifdef TARGET_WORDS_BIGENDIAN - led_writeb(opaque, addr, (val >> 8) & 0xff); - led_writeb(opaque, addr + 1, val & 0xff); -#else - led_writeb(opaque, addr, val & 0xff); - led_writeb(opaque, addr + 1, (val >> 8) & 0xff); -#endif -} - -static void led_writel(void *opaque, target_phys_addr_t addr, uint32_t v= al) -{ -#ifdef TARGET_WORDS_BIGENDIAN - led_writeb(opaque, addr, (val >> 24) & 0xff); - led_writeb(opaque, addr + 1, (val >> 16) & 0xff); - led_writeb(opaque, addr + 2, (val >> 8) & 0xff); - led_writeb(opaque, addr + 3, val & 0xff); -#else - led_writeb(opaque, addr, val & 0xff); - led_writeb(opaque, addr + 1, (val >> 8) & 0xff); - led_writeb(opaque, addr + 2, (val >> 16) & 0xff); - led_writeb(opaque, addr + 3, (val >> 24) & 0xff); -#endif + s->segments =3D new_val; + s->state |=3D REDRAW_SEGMENTS; } =20 static const MemoryRegionOps led_ops =3D { - .old_mmio =3D { - .read =3D { led_readb, led_readw, led_readl, }, - .write =3D { led_writeb, led_writew, led_writel, }, - }, + .read =3D jazz_led_read, + .write =3D jazz_led_write, .endianness =3D DEVICE_NATIVE_ENDIAN, + .impl.min_access_size =3D 1, + .impl.max_access_size =3D 1, }; =20 /***********************************************************/ @@ -296,20 +226,69 @@ static void jazz_led_text_update(void *opaque, cons= ole_ch_t *chardata) dpy_update(s->ds, 0, 0, 2, 1); } =20 -void jazz_led_init(MemoryRegion *address_space, target_phys_addr_t base) +static int jazz_led_post_load(void *opaque, int version_id) { - LedState *s; + /* force refresh */ + jazz_led_invalidate_display(opaque); =20 - s =3D g_malloc0(sizeof(LedState)); + return 0; +} =20 - s->state =3D REDRAW_SEGMENTS | REDRAW_BACKGROUND; +static const VMStateDescription vmstate_jazz_led =3D { + .name =3D "jazz-led", + .version_id =3D 0, + .minimum_version_id =3D 0, + .minimum_version_id_old =3D 0, + .post_load =3D jazz_led_post_load, + .fields =3D (VMStateField[]) { + VMSTATE_UINT8(segments, LedState), + VMSTATE_END_OF_LIST() + } +}; + +static int jazz_led_init(SysBusDevice *dev) +{ + LedState *s =3D FROM_SYSBUS(LedState, dev); =20 memory_region_init_io(&s->iomem, &led_ops, s, "led", 1); - memory_region_add_subregion(address_space, base, &s->iomem); + sysbus_init_mmio(dev, &s->iomem); =20 s->ds =3D graphic_console_init(jazz_led_update_display, jazz_led_invalidate_display, jazz_led_screen_dump, jazz_led_text_update, s); + + return 0; +} + +static void jazz_led_reset(DeviceState *d) +{ + LedState *s =3D DO_UPCAST(LedState, busdev.qdev, d); + + s->segments =3D 0; + s->state =3D REDRAW_SEGMENTS | REDRAW_BACKGROUND; qemu_console_resize(s->ds, 60, 80); } + +static void jazz_led_class_init(ObjectClass *klass, void *data) +{ + SysBusDeviceClass *k =3D SYS_BUS_DEVICE_CLASS(klass); + + k->init =3D jazz_led_init; +} + +static DeviceInfo jazz_led_info =3D { + .name =3D "jazz-led", + .desc =3D "Jazz LED display", + .size =3D sizeof(LedState), + .vmsd =3D &vmstate_jazz_led, + .reset =3D jazz_led_reset, + .class_init =3D jazz_led_class_init, +}; + +static void jazz_led_register(void) +{ + sysbus_register_withprop(&jazz_led_info); +} + +device_init(jazz_led_register); diff --git a/hw/mips.h b/hw/mips.h index 22156fc..a7e6d4c 100644 --- a/hw/mips.h +++ b/hw/mips.h @@ -10,9 +10,6 @@ PCIBus *gt64120_register(qemu_irq *pic); /* bonito.c */ PCIBus *bonito_init(qemu_irq *pic); =20 -/* jazz_led.c */ -void jazz_led_init(MemoryRegion *address_space, target_phys_addr_t base)= ; - /* rc4030.c */ typedef struct rc4030DMAState *rc4030_dma; void rc4030_dma_memory_rw(void *opaque, target_phys_addr_t addr, uint8_t= *buf, int len, int is_write); diff --git a/hw/mips_jazz.c b/hw/mips_jazz.c index 63165b9..ef39b20 100644 --- a/hw/mips_jazz.c +++ b/hw/mips_jazz.c @@ -293,7 +293,7 @@ static void mips_jazz_init(MemoryRegion *address_spac= e, sysbus_mmio_map(sysbus, 0, 0x80009000); =20 /* LED indicator */ - jazz_led_init(address_space, 0x8000f000); + sysbus_create_simple("jazz-led", 0x8000f000, NULL); } =20 static --=20 1.7.8.3