Revision cd3e2409

b/hw/ds1225y.c
22 22
 * THE SOFTWARE.
23 23
 */
24 24

  
25
#include "hw.h"
26
#include "mips.h"
25
#include "sysbus.h"
27 26
#include "trace.h"
28 27

  
29
typedef struct ds1225y_t
30
{
28
typedef struct {
29
    DeviceState qdev;
31 30
    uint32_t chip_size;
31
    char *filename;
32 32
    QEMUFile *file;
33 33
    uint8_t *contents;
34
} ds1225y_t;
35

  
34
} NvRamState;
36 35

  
37 36
static uint32_t nvram_readb (void *opaque, target_phys_addr_t addr)
38 37
{
39
    ds1225y_t *s = opaque;
38
    NvRamState *s = opaque;
40 39
    uint32_t val;
41 40

  
42 41
    val = s->contents[addr];
......
64 63

  
65 64
static void nvram_writeb (void *opaque, target_phys_addr_t addr, uint32_t val)
66 65
{
67
    ds1225y_t *s = opaque;
66
    NvRamState *s = opaque;
68 67

  
69 68
    val &= 0xff;
70 69
    trace_nvram_write(addr, s->contents[addr], val);
......
103 102
    &nvram_writel,
104 103
};
105 104

  
106
/* Initialisation routine */
107
void *ds1225y_init(target_phys_addr_t mem_base, const char *filename)
105
static int nvram_post_load(void *opaque, int version_id)
108 106
{
109
    ds1225y_t *s;
110
    int mem_indexRW;
107
    NvRamState *s = opaque;
108

  
109
    /* Close file, as filename may has changed in load/store process */
110
    if (s->file) {
111
        qemu_fclose(s->file);
112
    }
113

  
114
    /* Write back nvram contents */
115
    s->file = qemu_fopen(s->filename, "wb");
116
    if (s->file) {
117
        /* Write back contents, as 'wb' mode cleaned the file */
118
        qemu_put_buffer(s->file, s->contents, s->chip_size);
119
        qemu_fflush(s->file);
120
    }
121

  
122
    return 0;
123
}
124

  
125
static const VMStateDescription vmstate_nvram = {
126
    .name = "nvram",
127
    .version_id = 0,
128
    .minimum_version_id = 0,
129
    .minimum_version_id_old = 0,
130
    .post_load = nvram_post_load,
131
    .fields = (VMStateField[]) {
132
        VMSTATE_VARRAY_UINT32(contents, NvRamState, chip_size, 0,
133
                              vmstate_info_uint8, uint8_t),
134
        VMSTATE_END_OF_LIST()
135
    }
136
};
137

  
138
typedef struct {
139
    SysBusDevice busdev;
140
    NvRamState nvram;
141
} SysBusNvRamState;
142

  
143
static int nvram_sysbus_initfn(SysBusDevice *dev)
144
{
145
    NvRamState *s = &FROM_SYSBUS(SysBusNvRamState, dev)->nvram;
111 146
    QEMUFile *file;
147
    int s_io;
112 148

  
113
    s = qemu_mallocz(sizeof(ds1225y_t));
114
    s->chip_size = 0x2000; /* Fixed for ds1225y chip: 8 KiB */
115 149
    s->contents = qemu_mallocz(s->chip_size);
116 150

  
151
    s_io = cpu_register_io_memory(nvram_read, nvram_write, s,
152
                                  DEVICE_NATIVE_ENDIAN);
153
    sysbus_init_mmio(dev, s->chip_size, s_io);
154

  
117 155
    /* Read current file */
118
    file = qemu_fopen(filename, "rb");
156
    file = qemu_fopen(s->filename, "rb");
119 157
    if (file) {
120 158
        /* Read nvram contents */
121 159
        qemu_get_buffer(file, s->contents, s->chip_size);
122 160
        qemu_fclose(file);
123 161
    }
124
    s->file = qemu_fopen(filename, "wb");
125
    if (s->file) {
126
        /* Write back contents, as 'wb' mode cleaned the file */
127
        qemu_put_buffer(s->file, s->contents, s->chip_size);
128
        qemu_fflush(s->file);
129
    }
162
    nvram_post_load(s, 0);
130 163

  
131
    /* Read/write memory */
132
    mem_indexRW = cpu_register_io_memory(nvram_read, nvram_write, s,
133
                                         DEVICE_NATIVE_ENDIAN);
134
    cpu_register_physical_memory(mem_base, s->chip_size, mem_indexRW);
135
    return s;
164
    return 0;
136 165
}
166

  
167
static SysBusDeviceInfo nvram_sysbus_info = {
168
    .qdev.name  = "ds1225y",
169
    .qdev.size  = sizeof(SysBusNvRamState),
170
    .qdev.vmsd  = &vmstate_nvram,
171
    .init       = nvram_sysbus_initfn,
172
    .qdev.props = (Property[]) {
173
        DEFINE_PROP_UINT32("size", SysBusNvRamState, nvram.chip_size, 0x2000),
174
        DEFINE_PROP_STRING("filename", SysBusNvRamState, nvram.filename),
175
        DEFINE_PROP_END_OF_LIST(),
176
    },
177
};
178

  
179
static void nvram_register(void)
180
{
181
    sysbus_register_withprop(&nvram_sysbus_info);
182
}
183

  
184
device_init(nvram_register)
b/hw/mips.h
8 8
/* bonito.c */
9 9
PCIBus *bonito_init(qemu_irq *pic);
10 10

  
11
/* ds1225y.c */
12
void *ds1225y_init(target_phys_addr_t mem_base, const char *filename);
13

  
14 11
/* g364fb.c */
15 12
int g364fb_mm_init(target_phys_addr_t vram_base,
16 13
                   target_phys_addr_t ctrl_base, int it_shift,
b/hw/mips_jazz.c
37 37
#include "loader.h"
38 38
#include "mc146818rtc.h"
39 39
#include "blockdev.h"
40
#include "sysbus.h"
40 41

  
41 42
enum jazz_model_e
42 43
{
......
115 116
    void* rc4030_opaque;
116 117
    int s_rtc, s_dma_dummy;
117 118
    NICInfo *nd;
119
    DeviceState *dev;
120
    SysBusDevice *sysbus;
118 121
    ISADevice *pit;
119 122
    DriveInfo *fds[MAX_FD];
120 123
    qemu_irq esp_reset, dma_enable;
......
266 269
    /* FIXME: missing Jazz sound at 0x8000c000, rc4030[2] */
267 270
    audio_init(i8259, NULL);
268 271

  
269
    /* NVRAM: Unprotected at 0x9000, Protected at 0xa000, Read only at 0xb000 */
270
    ds1225y_init(0x80009000, "nvram");
272
    /* NVRAM */
273
    dev = qdev_create(NULL, "ds1225y");
274
    qdev_init_nofail(dev);
275
    sysbus = sysbus_from_qdev(dev);
276
    sysbus_mmio_map(sysbus, 0, 0x80009000);
271 277

  
272 278
    /* LED indicator */
273 279
    jazz_led_init(0x8000f000);

Also available in: Unified diff