Commit a350db853f97f3db7f9ebf7af43150d3cb20be79
1 parent
f48f6569
Sparc32: convert memory to qdev
Signed-off-by: Blue Swirl <blauwirbel@gmail.com>
Showing
1 changed file
with
56 additions
and
36 deletions
hw/sun4m.c
| ... | ... | @@ -480,6 +480,56 @@ static void prom_register_devices(void) |
| 480 | 480 | |
| 481 | 481 | device_init(prom_register_devices); |
| 482 | 482 | |
| 483 | +/* System RAM */ | |
| 484 | +static void ram_init1(SysBusDevice *dev) | |
| 485 | +{ | |
| 486 | + ram_addr_t RAM_size, ram_offset; | |
| 487 | + | |
| 488 | + RAM_size = qdev_get_prop_int(&dev->qdev, "size", 0); | |
| 489 | + | |
| 490 | + ram_offset = qemu_ram_alloc(RAM_size); | |
| 491 | + sysbus_init_mmio(dev, RAM_size, ram_offset); | |
| 492 | +} | |
| 493 | + | |
| 494 | +static void ram_init(target_phys_addr_t addr, ram_addr_t RAM_size, | |
| 495 | + uint64_t max_mem) | |
| 496 | +{ | |
| 497 | + DeviceState *dev; | |
| 498 | + SysBusDevice *s; | |
| 499 | + | |
| 500 | + /* allocate RAM */ | |
| 501 | + if ((uint64_t)RAM_size > max_mem) { | |
| 502 | + fprintf(stderr, | |
| 503 | + "qemu: Too much memory for this machine: %d, maximum %d\n", | |
| 504 | + (unsigned int)(RAM_size / (1024 * 1024)), | |
| 505 | + (unsigned int)(max_mem / (1024 * 1024))); | |
| 506 | + exit(1); | |
| 507 | + } | |
| 508 | + dev = qdev_create(NULL, "memory"); | |
| 509 | + qdev_set_prop_int(dev, "size", RAM_size); | |
| 510 | + qdev_init(dev); | |
| 511 | + s = sysbus_from_qdev(dev); | |
| 512 | + | |
| 513 | + sysbus_mmio_map(s, 0, addr); | |
| 514 | +} | |
| 515 | + | |
| 516 | +static SysBusDeviceInfo ram_info = { | |
| 517 | + .init = ram_init1, | |
| 518 | + .qdev.name = "memory", | |
| 519 | + .qdev.size = sizeof(SysBusDevice), | |
| 520 | + .qdev.props = (DevicePropList[]) { | |
| 521 | + {.name = "size", .type = PROP_TYPE_INT}, | |
| 522 | + {.name = NULL} | |
| 523 | + } | |
| 524 | +}; | |
| 525 | + | |
| 526 | +static void ram_register_devices(void) | |
| 527 | +{ | |
| 528 | + sysbus_register_withprop(&ram_info); | |
| 529 | +} | |
| 530 | + | |
| 531 | +device_init(ram_register_devices); | |
| 532 | + | |
| 483 | 533 | static void sun4m_hw_init(const struct sun4m_hwdef *hwdef, ram_addr_t RAM_size, |
| 484 | 534 | const char *boot_device, |
| 485 | 535 | const char *kernel_filename, |
| ... | ... | @@ -495,7 +545,6 @@ static void sun4m_hw_init(const struct sun4m_hwdef *hwdef, ram_addr_t RAM_size, |
| 495 | 545 | qemu_irq *esp_reset, *le_reset; |
| 496 | 546 | qemu_irq fdc_tc; |
| 497 | 547 | qemu_irq *cpu_halt; |
| 498 | - ram_addr_t ram_offset; | |
| 499 | 548 | unsigned long kernel_size; |
| 500 | 549 | BlockDriverState *fd[MAX_FD]; |
| 501 | 550 | int drive_index; |
| ... | ... | @@ -527,18 +576,9 @@ static void sun4m_hw_init(const struct sun4m_hwdef *hwdef, ram_addr_t RAM_size, |
| 527 | 576 | cpu_irqs[i] = qemu_allocate_irqs(dummy_cpu_set_irq, NULL, MAX_PILS); |
| 528 | 577 | |
| 529 | 578 | |
| 530 | - /* allocate RAM */ | |
| 531 | - if ((uint64_t)RAM_size > hwdef->max_mem) { | |
| 532 | - fprintf(stderr, | |
| 533 | - "qemu: Too much memory for this machine: %d, maximum %d\n", | |
| 534 | - (unsigned int)(RAM_size / (1024 * 1024)), | |
| 535 | - (unsigned int)(hwdef->max_mem / (1024 * 1024))); | |
| 536 | - exit(1); | |
| 537 | - } | |
| 538 | - ram_offset = qemu_ram_alloc(RAM_size); | |
| 539 | - cpu_register_physical_memory(0, RAM_size, ram_offset); | |
| 540 | - | |
| 541 | 579 | /* set up devices */ |
| 580 | + ram_init(0, RAM_size, hwdef->max_mem); | |
| 581 | + | |
| 542 | 582 | prom_init(hwdef->slavio_base, bios_name); |
| 543 | 583 | |
| 544 | 584 | slavio_intctl = slavio_intctl_init(hwdef->intctl_base, |
| ... | ... | @@ -1259,7 +1299,6 @@ static void sun4d_hw_init(const struct sun4d_hwdef *hwdef, ram_addr_t RAM_size, |
| 1259 | 1299 | qemu_irq *cpu_irqs[MAX_CPUS], *sbi_irq, *sbi_cpu_irq, |
| 1260 | 1300 | espdma_irq, ledma_irq; |
| 1261 | 1301 | qemu_irq *esp_reset, *le_reset; |
| 1262 | - ram_addr_t ram_offset; | |
| 1263 | 1302 | unsigned long kernel_size; |
| 1264 | 1303 | void *fw_cfg; |
| 1265 | 1304 | |
| ... | ... | @@ -1288,18 +1327,9 @@ static void sun4d_hw_init(const struct sun4d_hwdef *hwdef, ram_addr_t RAM_size, |
| 1288 | 1327 | for (i = smp_cpus; i < MAX_CPUS; i++) |
| 1289 | 1328 | cpu_irqs[i] = qemu_allocate_irqs(dummy_cpu_set_irq, NULL, MAX_PILS); |
| 1290 | 1329 | |
| 1291 | - /* allocate RAM */ | |
| 1292 | - if ((uint64_t)RAM_size > hwdef->max_mem) { | |
| 1293 | - fprintf(stderr, | |
| 1294 | - "qemu: Too much memory for this machine: %d, maximum %d\n", | |
| 1295 | - (unsigned int)(RAM_size / (1024 * 1024)), | |
| 1296 | - (unsigned int)(hwdef->max_mem / (1024 * 1024))); | |
| 1297 | - exit(1); | |
| 1298 | - } | |
| 1299 | - ram_offset = qemu_ram_alloc(RAM_size); | |
| 1300 | - cpu_register_physical_memory(0, RAM_size, ram_offset); | |
| 1301 | - | |
| 1302 | 1330 | /* set up devices */ |
| 1331 | + ram_init(0, RAM_size, hwdef->max_mem); | |
| 1332 | + | |
| 1303 | 1333 | prom_init(hwdef->slavio_base, bios_name); |
| 1304 | 1334 | |
| 1305 | 1335 | sbi = sbi_init(hwdef->sbi_base, &sbi_irq, &sbi_cpu_irq, cpu_irqs); |
| ... | ... | @@ -1454,7 +1484,6 @@ static void sun4c_hw_init(const struct sun4c_hwdef *hwdef, ram_addr_t RAM_size, |
| 1454 | 1484 | qemu_irq *cpu_irqs, *slavio_irq, espdma_irq, ledma_irq; |
| 1455 | 1485 | qemu_irq *esp_reset, *le_reset; |
| 1456 | 1486 | qemu_irq fdc_tc; |
| 1457 | - ram_addr_t ram_offset; | |
| 1458 | 1487 | unsigned long kernel_size; |
| 1459 | 1488 | BlockDriverState *fd[MAX_FD]; |
| 1460 | 1489 | int drive_index; |
| ... | ... | @@ -1476,18 +1505,9 @@ static void sun4c_hw_init(const struct sun4c_hwdef *hwdef, ram_addr_t RAM_size, |
| 1476 | 1505 | cpu_irqs = qemu_allocate_irqs(cpu_set_irq, env, MAX_PILS); |
| 1477 | 1506 | env->prom_addr = hwdef->slavio_base; |
| 1478 | 1507 | |
| 1479 | - /* allocate RAM */ | |
| 1480 | - if ((uint64_t)RAM_size > hwdef->max_mem) { | |
| 1481 | - fprintf(stderr, | |
| 1482 | - "qemu: Too much memory for this machine: %d, maximum %d\n", | |
| 1483 | - (unsigned int)(RAM_size / (1024 * 1024)), | |
| 1484 | - (unsigned int)(hwdef->max_mem / (1024 * 1024))); | |
| 1485 | - exit(1); | |
| 1486 | - } | |
| 1487 | - ram_offset = qemu_ram_alloc(RAM_size); | |
| 1488 | - cpu_register_physical_memory(0, RAM_size, ram_offset); | |
| 1489 | - | |
| 1490 | 1508 | /* set up devices */ |
| 1509 | + ram_init(0, RAM_size, hwdef->max_mem); | |
| 1510 | + | |
| 1491 | 1511 | prom_init(hwdef->slavio_base, bios_name); |
| 1492 | 1512 | |
| 1493 | 1513 | slavio_intctl = sun4c_intctl_init(hwdef->intctl_base, | ... | ... |