Revision 49e66373 hw/eccmemctl.c

b/hw/eccmemctl.c
21 21
 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
22 22
 * THE SOFTWARE.
23 23
 */
24
#include "hw.h"
24

  
25 25
#include "sun4m.h"
26
#include "sysemu.h"
26
#include "sysbus.h"
27 27

  
28 28
//#define DEBUG_ECC
29 29

  
......
126 126
#define ECC_DIAG_MASK  (ECC_DIAG_SIZE - 1)
127 127

  
128 128
typedef struct ECCState {
129
    SysBusDevice busdev;
129 130
    qemu_irq irq;
130 131
    uint32_t regs[ECC_NREGS];
131 132
    uint8_t diag[ECC_DIAG_SIZE];
......
314 315
    s->regs[ECC_ECR1] = 0;
315 316
}
316 317

  
317
void * ecc_init(target_phys_addr_t base, qemu_irq irq, uint32_t version)
318
static void ecc_init1(SysBusDevice *dev)
318 319
{
319 320
    int ecc_io_memory;
320
    ECCState *s;
321

  
322
    s = qemu_mallocz(sizeof(ECCState));
323

  
324
    s->version = version;
325
    s->regs[0] = version;
326
    s->irq = irq;
321
    ECCState *s = FROM_SYSBUS(ECCState, dev);
327 322

  
323
    sysbus_init_irq(dev, &s->irq);
324
    s->version = qdev_get_prop_int(&dev->qdev, "version", -1);
325
    s->regs[0] = s->version;
328 326
    ecc_io_memory = cpu_register_io_memory(ecc_mem_read, ecc_mem_write, s);
329
    cpu_register_physical_memory(base, ECC_SIZE, ecc_io_memory);
330
    if (version == ECC_MCC) { // SS-600MP only
327
    sysbus_init_mmio(dev, ECC_SIZE, ecc_io_memory);
328

  
329
    if (s->version == ECC_MCC) { // SS-600MP only
331 330
        ecc_io_memory = cpu_register_io_memory(ecc_diag_mem_read,
332 331
                                               ecc_diag_mem_write, s);
333
        cpu_register_physical_memory(base + 0x1000, ECC_DIAG_SIZE,
334
                                     ecc_io_memory);
332
        sysbus_init_mmio(dev, ECC_DIAG_SIZE, ecc_io_memory);
335 333
    }
336
    register_savevm("ECC", base, 3, ecc_save, ecc_load, s);
334
    register_savevm("ECC", -1, 3, ecc_save, ecc_load, s);
337 335
    qemu_register_reset(ecc_reset, s);
338 336
    ecc_reset(s);
339
    return s;
340 337
}
338

  
339
void ecc_init(target_phys_addr_t base, qemu_irq irq, uint32_t version)
340
{
341
    DeviceState *dev;
342
    SysBusDevice *s;
343

  
344
    dev = qdev_create(NULL, "ecc");
345
    qdev_set_prop_int(dev, "version", version);
346
    qdev_init(dev);
347
    s = sysbus_from_qdev(dev);
348
    sysbus_connect_irq(s, 0, irq);
349
    sysbus_mmio_map(s, 0, base);
350
    if (version == ECC_MCC) { // SS-600MP only
351
        sysbus_mmio_map(s, 1, base + 0x1000);
352
    }
353
}
354

  
355
static void ecc_register_devices(void)
356
{
357
    sysbus_register_dev("ecc", sizeof(ECCState), ecc_init1);
358
}
359

  
360
device_init(ecc_register_devices)

Also available in: Unified diff