From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([140.186.70.92]:53780) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1Qcv4s-00063x-TZ for qemu-devel@nongnu.org; Sat, 02 Jul 2011 03:57:24 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1Qcv4q-0006a3-WF for qemu-devel@nongnu.org; Sat, 02 Jul 2011 03:57:22 -0400 Received: from smtp5-g21.free.fr ([212.27.42.5]:43761) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1Qcv4p-0006V5-LA for qemu-devel@nongnu.org; Sat, 02 Jul 2011 03:57:20 -0400 From: =?UTF-8?q?Herv=C3=A9=20Poussineau?= Date: Sat, 2 Jul 2011 09:57:03 +0200 Message-Id: <1309593423-17073-4-git-send-email-hpoussin@reactos.org> In-Reply-To: <1309593423-17073-1-git-send-email-hpoussin@reactos.org> References: <1309593423-17073-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] [PATCHv2 3/3] ds1225y: convert to qdev device, and use it in MIPS Jazz emulation List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: qemu-devel@nongnu.org Cc: =?UTF-8?q?Herv=C3=A9=20Poussineau?= Signed-off-by: Herv=C3=A9 Poussineau --- hw/ds1225y.c | 100 +++++++++++++++++++++++++++++++++++++++++---------= ----- hw/mips.h | 3 -- hw/mips_jazz.c | 11 +++++- 3 files changed, 83 insertions(+), 31 deletions(-) diff --git a/hw/ds1225y.c b/hw/ds1225y.c index 5105b9b..87412e2 100644 --- a/hw/ds1225y.c +++ b/hw/ds1225y.c @@ -22,21 +22,20 @@ * THE SOFTWARE. */ =20 -#include "hw.h" -#include "mips.h" +#include "sysbus.h" #include "trace.h" =20 -typedef struct ds1225y_t -{ +typedef struct { + DeviceState qdev; uint32_t chip_size; + char *filename; QEMUFile *file; uint8_t *contents; -} ds1225y_t; - +} NvRamState; =20 static uint32_t nvram_readb (void *opaque, target_phys_addr_t addr) { - ds1225y_t *s =3D opaque; + NvRamState *s =3D opaque; uint32_t val; =20 val =3D s->contents[addr]; @@ -64,7 +63,7 @@ static uint32_t nvram_readl (void *opaque, target_phys_= addr_t addr) =20 static void nvram_writeb (void *opaque, target_phys_addr_t addr, uint32_= t val) { - ds1225y_t *s =3D opaque; + NvRamState *s =3D opaque; =20 val &=3D 0xff; trace_nvram_write(addr, s->contents[addr], val); @@ -103,34 +102,83 @@ static CPUWriteMemoryFunc * const nvram_write[] =3D= { &nvram_writel, }; =20 -/* Initialisation routine */ -void *ds1225y_init(target_phys_addr_t mem_base, const char *filename) +static int nvram_post_load(void *opaque, int version_id) { - ds1225y_t *s; - int mem_indexRW; + NvRamState *s =3D opaque; + + /* Close file, as filename may has changed in load/store process */ + if (s->file) { + qemu_fclose(s->file); + } + + /* Write back nvram contents */ + s->file =3D qemu_fopen(s->filename, "wb"); + if (s->file) { + /* Write back contents, as 'wb' mode cleaned the file */ + qemu_put_buffer(s->file, s->contents, s->chip_size); + qemu_fflush(s->file); + } + + return 0; +} + +static const VMStateDescription vmstate_nvram =3D { + .name =3D "nvram", + .version_id =3D 0, + .minimum_version_id =3D 0, + .minimum_version_id_old =3D 0, + .post_load =3D nvram_post_load, + .fields =3D (VMStateField[]) { + VMSTATE_VARRAY_UINT32(contents, NvRamState, chip_size, 0, + vmstate_info_uint8, uint8_t), + VMSTATE_END_OF_LIST() + } +}; + +typedef struct { + SysBusDevice busdev; + NvRamState nvram; +} SysBusNvRamState; + +static int nvram_sysbus_initfn(SysBusDevice *dev) +{ + NvRamState *s =3D &FROM_SYSBUS(SysBusNvRamState, dev)->nvram; QEMUFile *file; + int s_io; =20 - s =3D qemu_mallocz(sizeof(ds1225y_t)); - s->chip_size =3D 0x2000; /* Fixed for ds1225y chip: 8 KiB */ s->contents =3D qemu_mallocz(s->chip_size); =20 + s_io =3D cpu_register_io_memory(nvram_read, nvram_write, s, + DEVICE_NATIVE_ENDIAN); + sysbus_init_mmio(dev, s->chip_size, s_io); + /* Read current file */ - file =3D qemu_fopen(filename, "rb"); + file =3D qemu_fopen(s->filename, "rb"); if (file) { /* Read nvram contents */ qemu_get_buffer(file, s->contents, s->chip_size); qemu_fclose(file); } - s->file =3D qemu_fopen(filename, "wb"); - if (s->file) { - /* Write back contents, as 'wb' mode cleaned the file */ - qemu_put_buffer(s->file, s->contents, s->chip_size); - qemu_fflush(s->file); - } + nvram_post_load(s, 0); =20 - /* Read/write memory */ - mem_indexRW =3D cpu_register_io_memory(nvram_read, nvram_write, s, - DEVICE_NATIVE_ENDIAN); - cpu_register_physical_memory(mem_base, s->chip_size, mem_indexRW); - return s; + return 0; } + +static SysBusDeviceInfo nvram_sysbus_info =3D { + .qdev.name =3D "nvram", + .qdev.size =3D sizeof(SysBusNvRamState), + .qdev.vmsd =3D &vmstate_nvram, + .init =3D nvram_sysbus_initfn, + .qdev.props =3D (Property[]) { + DEFINE_PROP_UINT32("size", SysBusNvRamState, nvram.chip_size, 0x= 2000), + DEFINE_PROP_STRING("filename", SysBusNvRamState, nvram.filename)= , + DEFINE_PROP_END_OF_LIST(), + }, +}; + +static void nvram_register(void) +{ + sysbus_register_withprop(&nvram_sysbus_info); +} + +device_init(nvram_register) diff --git a/hw/mips.h b/hw/mips.h index 93c8831..cae5f4c 100644 --- a/hw/mips.h +++ b/hw/mips.h @@ -8,9 +8,6 @@ PCIBus *gt64120_register(qemu_irq *pic); /* bonito.c */ PCIBus *bonito_init(qemu_irq *pic); =20 -/* ds1225y.c */ -void *ds1225y_init(target_phys_addr_t mem_base, const char *filename); - /* g364fb.c */ int g364fb_mm_init(target_phys_addr_t vram_base, target_phys_addr_t ctrl_base, int it_shift, diff --git a/hw/mips_jazz.c b/hw/mips_jazz.c index a100394..99002c3 100644 --- a/hw/mips_jazz.c +++ b/hw/mips_jazz.c @@ -37,6 +37,7 @@ #include "loader.h" #include "mc146818rtc.h" #include "blockdev.h" +#include "sysbus.h" =20 enum jazz_model_e { @@ -115,6 +116,8 @@ void mips_jazz_init (ram_addr_t ram_size, void* rc4030_opaque; int s_rtc, s_dma_dummy; NICInfo *nd; + DeviceState *dev; + SysBusDevice *sysbus; ISADevice *pit; DriveInfo *fds[MAX_FD]; qemu_irq esp_reset, dma_enable; @@ -266,8 +269,12 @@ void mips_jazz_init (ram_addr_t ram_size, /* FIXME: missing Jazz sound at 0x8000c000, rc4030[2] */ audio_init(i8259, NULL); =20 - /* NVRAM: Unprotected at 0x9000, Protected at 0xa000, Read only at 0= xb000 */ - ds1225y_init(0x80009000, "nvram"); + /* NVRAM */ + dev =3D qdev_create(NULL, "nvram"); + qdev_prop_set_string(dev, "filename", qemu_strdup("nvram")); + qdev_init_nofail(dev); + sysbus =3D sysbus_from_qdev(dev); + sysbus_mmio_map(sysbus, 0, 0x80009000); =20 /* LED indicator */ jazz_led_init(0x8000f000); --=20 1.7.5.4