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