From: "Hervé Poussineau" <hpoussin@reactos.org>
To: qemu-devel@nongnu.org
Cc: "Anthony Liguori" <aliguori@us.ibm.com>,
"Hervé Poussineau" <hpoussin@reactos.org>
Subject: [Qemu-devel] [PATCH 2/3] jazz-led: convert to qdev
Date: Mon, 23 Jan 2012 11:34:05 +0100 [thread overview]
Message-ID: <1327314846-25318-3-git-send-email-hpoussin@reactos.org> (raw)
In-Reply-To: <1327314846-25318-1-git-send-email-hpoussin@reactos.org>
Some simplifications in I/O functions are possible because
Jazz LED only registers one byte of I/O.
Signed-off-by: Hervé Poussineau <hpoussin@reactos.org>
---
hw/jazz_led.c | 153 +++++++++++++++++++++++--------------------------------
hw/mips.h | 3 -
hw/mips_jazz.c | 2 +-
3 files changed, 65 insertions(+), 93 deletions(-)
diff --git a/hw/jazz_led.c b/hw/jazz_led.c
index 1af9268..de401a9 100644
--- a/hw/jazz_led.c
+++ b/hw/jazz_led.c
@@ -1,7 +1,7 @@
/*
* QEMU JAZZ LED emulator.
*
- * Copyright (c) 2007 Hervé 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.
*/
-#include "hw.h"
-#include "mips.h"
#include "console.h"
#include "pixel_ops.h"
#include "trace.h"
+#include "sysbus.h"
typedef enum {
REDRAW_NONE = 0, REDRAW_SEGMENTS = 1, REDRAW_BACKGROUND = 2,
} screen_state_t;
typedef struct LedState {
+ SysBusDevice busdev;
MemoryRegion iomem;
uint8_t segments;
DisplayState *ds;
screen_state_t state;
} LedState;
-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 = opaque;
uint8_t val;
- switch (addr) {
- case 0:
- val = s->segments;
- break;
- default:
- error_report("invalid read at [" TARGET_FMT_plx "]\n", addr);
- val = 0;
- }
-
+ val = s->segments;
trace_jazz_led_read(addr, val);
return val;
}
-static uint32_t led_readw(void *opaque, target_phys_addr_t addr)
-{
- uint32_t v;
-#ifdef TARGET_WORDS_BIGENDIAN
- v = led_readb(opaque, addr) << 8;
- v |= led_readb(opaque, addr + 1);
-#else
- v = led_readb(opaque, addr);
- v |= 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 = led_readb(opaque, addr) << 24;
- v |= led_readb(opaque, addr + 1) << 16;
- v |= led_readb(opaque, addr + 2) << 8;
- v |= led_readb(opaque, addr + 3);
-#else
- v = led_readb(opaque, addr);
- v |= led_readb(opaque, addr + 1) << 8;
- v |= led_readb(opaque, addr + 2) << 16;
- v |= led_readb(opaque, addr + 3) << 24;
-#endif
- return v;
-}
-
-static void led_writeb(void *opaque, target_phys_addr_t addr, uint32_t val)
+static void jazz_led_write(void *opaque, target_phys_addr_t addr,
+ uint64_t val, unsigned int size)
{
LedState *s = opaque;
uint8_t new_val = val & 0xff;
trace_jazz_led_write(addr, new_val);
- switch (addr) {
- case 0:
- s->segments = new_val;
- s->state |= 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 val)
-{
-#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 val)
-{
-#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 = new_val;
+ s->state |= REDRAW_SEGMENTS;
}
static const MemoryRegionOps led_ops = {
- .old_mmio = {
- .read = { led_readb, led_readw, led_readl, },
- .write = { led_writeb, led_writew, led_writel, },
- },
+ .read = jazz_led_read,
+ .write = jazz_led_write,
.endianness = DEVICE_NATIVE_ENDIAN,
+ .impl.min_access_size = 1,
+ .impl.max_access_size = 1,
};
/***********************************************************/
@@ -296,20 +226,65 @@ static void jazz_led_text_update(void *opaque, console_ch_t *chardata)
dpy_update(s->ds, 0, 0, 2, 1);
}
-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);
- s = g_malloc0(sizeof(LedState));
+ return 0;
+}
- s->state = REDRAW_SEGMENTS | REDRAW_BACKGROUND;
+static const VMStateDescription vmstate_jazz_led = {
+ .name = "jazz-led",
+ .version_id = 0,
+ .minimum_version_id = 0,
+ .minimum_version_id_old = 0,
+ .post_load = jazz_led_post_load,
+ .fields = (VMStateField[]) {
+ VMSTATE_UINT8(segments, LedState),
+ VMSTATE_END_OF_LIST()
+ }
+};
+
+static int jazz_led_init(SysBusDevice *dev)
+{
+ LedState *s = FROM_SYSBUS(LedState, dev);
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);
s->ds = 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 = DO_UPCAST(LedState, busdev.qdev, d);
+
+ s->segments = 0;
+ s->state = REDRAW_SEGMENTS | REDRAW_BACKGROUND;
qemu_console_resize(s->ds, 60, 80);
}
+
+static SysBusDeviceInfo jazz_led_info = {
+ .init = jazz_led_init,
+ .qdev.name = "jazz-led",
+ .qdev.desc = "Jazz LED display",
+ .qdev.size = sizeof(LedState),
+ .qdev.vmsd = &vmstate_jazz_led,
+ .qdev.reset = jazz_led_reset,
+ .qdev.props = (Property[]) {
+ DEFINE_PROP_END_OF_LIST(),
+ }
+};
+
+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);
-/* 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_space,
sysbus_mmio_map(sysbus, 0, 0x80009000);
/* LED indicator */
- jazz_led_init(address_space, 0x8000f000);
+ sysbus_create_simple("jazz-led", 0x8000f000, NULL);
}
static
--
1.7.7.3
next prev parent reply other threads:[~2012-01-23 10:33 UTC|newest]
Thread overview: 6+ messages / expand[flat|nested] mbox.gz Atom feed top
2012-01-23 10:34 [Qemu-devel] [PATCH 0/3] jazz-led: qdev conversion Hervé Poussineau
2012-01-23 10:34 ` [Qemu-devel] [PATCH 1/3] jazz-led: use trace framework Hervé Poussineau
2012-01-23 10:34 ` Hervé Poussineau [this message]
2012-01-23 10:34 ` [Qemu-devel] [PATCH 3/3] jazz-led: compile it only twice Hervé Poussineau
2012-02-01 20:44 ` [Qemu-devel] [PATCH 0/3] jazz-led: qdev conversion Anthony Liguori
2012-02-01 22:28 ` Hervé Poussineau
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=1327314846-25318-3-git-send-email-hpoussin@reactos.org \
--to=hpoussin@reactos.org \
--cc=aliguori@us.ibm.com \
--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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.