Revision b3ceef24 hw/sun4m.c
b/hw/sun4m.c | ||
---|---|---|
154 | 154 |
m48t59_write(nvram, start + 1, sum & 0xff); |
155 | 155 |
} |
156 | 156 |
|
157 |
static m48t59_t *nvram; |
|
158 |
|
|
159 | 157 |
extern int nographic; |
160 | 158 |
|
161 | 159 |
static void nvram_init(m48t59_t *nvram, uint8_t *macaddr, const char *cmdline, |
... | ... | |
292 | 290 |
env->halted = 1; |
293 | 291 |
} |
294 | 292 |
|
295 |
static void sun4m_hw_init(const struct hwdef *hwdef, int ram_size,
|
|
296 |
DisplayState *ds, const char *cpu_model) |
|
293 |
static void *sun4m_hw_init(const struct hwdef *hwdef, int RAM_size,
|
|
294 |
DisplayState *ds, const char *cpu_model)
|
|
297 | 295 |
|
298 | 296 |
{ |
299 | 297 |
CPUState *env, *envs[MAX_CPUS]; |
300 | 298 |
unsigned int i; |
301 |
void *iommu, *espdma, *ledma, *main_esp; |
|
299 |
void *iommu, *espdma, *ledma, *main_esp, *nvram;
|
|
302 | 300 |
const sparc_def_t *def; |
303 | 301 |
qemu_irq *cpu_irqs[MAX_CPUS], *slavio_irq, *slavio_cpu_irq, |
304 | 302 |
*espdma_irq, *ledma_irq; |
... | ... | |
328 | 326 |
cpu_irqs[i] = qemu_allocate_irqs(dummy_cpu_set_irq, NULL, MAX_PILS); |
329 | 327 |
|
330 | 328 |
/* allocate RAM */ |
331 |
cpu_register_physical_memory(0, ram_size, 0);
|
|
329 |
cpu_register_physical_memory(0, RAM_size, 0);
|
|
332 | 330 |
|
333 | 331 |
iommu = iommu_init(hwdef->iommu_base); |
334 | 332 |
slavio_intctl = slavio_intctl_init(hwdef->intctl_base, |
... | ... | |
347 | 345 |
fprintf(stderr, "qemu: Unsupported depth: %d\n", graphic_depth); |
348 | 346 |
exit (1); |
349 | 347 |
} |
350 |
tcx_init(ds, hwdef->tcx_base, phys_ram_base + ram_size, ram_size,
|
|
348 |
tcx_init(ds, hwdef->tcx_base, phys_ram_base + RAM_size, RAM_size,
|
|
351 | 349 |
hwdef->vram_size, graphic_width, graphic_height, graphic_depth); |
352 | 350 |
|
353 | 351 |
if (nd_table[0].model == NULL |
... | ... | |
388 | 386 |
slavio_irq[hwdef->me_irq]); |
389 | 387 |
if (hwdef->cs_base != (target_phys_addr_t)-1) |
390 | 388 |
cs_init(hwdef->cs_base, hwdef->cs_irq, slavio_intctl); |
389 |
|
|
390 |
return nvram; |
|
391 | 391 |
} |
392 | 392 |
|
393 |
static void sun4m_load_kernel(long vram_size, int ram_size, int boot_device,
|
|
393 |
static void sun4m_load_kernel(long vram_size, int RAM_size, int boot_device,
|
|
394 | 394 |
const char *kernel_filename, |
395 | 395 |
const char *kernel_cmdline, |
396 | 396 |
const char *initrd_filename, |
397 |
int machine_id) |
|
397 |
int machine_id, |
|
398 |
void *nvram) |
|
398 | 399 |
{ |
399 | 400 |
int ret, linux_boot; |
400 | 401 |
char buf[1024]; |
... | ... | |
403 | 404 |
|
404 | 405 |
linux_boot = (kernel_filename != NULL); |
405 | 406 |
|
406 |
prom_offset = ram_size + vram_size;
|
|
407 |
prom_offset = RAM_size + vram_size;
|
|
407 | 408 |
cpu_register_physical_memory(PROM_ADDR, |
408 | 409 |
(PROM_SIZE_MAX + TARGET_PAGE_SIZE - 1) & TARGET_PAGE_MASK, |
409 | 410 |
prom_offset | IO_MEM_ROM); |
... | ... | |
451 | 452 |
} |
452 | 453 |
} |
453 | 454 |
nvram_init(nvram, (uint8_t *)&nd_table[0].macaddr, kernel_cmdline, |
454 |
boot_device, ram_size, kernel_size, graphic_width,
|
|
455 |
boot_device, RAM_size, kernel_size, graphic_width,
|
|
455 | 456 |
graphic_height, graphic_depth, machine_id); |
456 | 457 |
} |
457 | 458 |
|
... | ... | |
524 | 525 |
}, |
525 | 526 |
}; |
526 | 527 |
|
527 |
static void sun4m_common_init(int ram_size, int boot_device, DisplayState *ds,
|
|
528 |
static void sun4m_common_init(int RAM_size, int boot_device, DisplayState *ds,
|
|
528 | 529 |
const char *kernel_filename, const char *kernel_cmdline, |
529 | 530 |
const char *initrd_filename, const char *cpu_model, |
530 | 531 |
unsigned int machine, int max_ram) |
531 | 532 |
{ |
532 |
if ((unsigned int)ram_size > (unsigned int)max_ram) { |
|
533 |
void *nvram; |
|
534 |
|
|
535 |
if ((unsigned int)RAM_size > (unsigned int)max_ram) { |
|
533 | 536 |
fprintf(stderr, "qemu: Too much memory for this machine: %d, maximum %d\n", |
534 |
(unsigned int)ram_size / (1024 * 1024),
|
|
537 |
(unsigned int)RAM_size / (1024 * 1024),
|
|
535 | 538 |
(unsigned int)max_ram / (1024 * 1024)); |
536 | 539 |
exit(1); |
537 | 540 |
} |
538 |
sun4m_hw_init(&hwdefs[machine], ram_size, ds, cpu_model);
|
|
541 |
nvram = sun4m_hw_init(&hwdefs[machine], RAM_size, ds, cpu_model);
|
|
539 | 542 |
|
540 |
sun4m_load_kernel(hwdefs[machine].vram_size, ram_size, boot_device,
|
|
543 |
sun4m_load_kernel(hwdefs[machine].vram_size, RAM_size, boot_device,
|
|
541 | 544 |
kernel_filename, kernel_cmdline, initrd_filename, |
542 |
hwdefs[machine].machine_id); |
|
545 |
hwdefs[machine].machine_id, nvram);
|
|
543 | 546 |
} |
544 | 547 |
|
545 | 548 |
/* SPARCstation 5 hardware initialisation */ |
546 |
static void ss5_init(int ram_size, int vga_ram_size, int boot_device,
|
|
549 |
static void ss5_init(int RAM_size, int vga_ram_size, int boot_device,
|
|
547 | 550 |
DisplayState *ds, const char **fd_filename, int snapshot, |
548 | 551 |
const char *kernel_filename, const char *kernel_cmdline, |
549 | 552 |
const char *initrd_filename, const char *cpu_model) |
550 | 553 |
{ |
551 | 554 |
if (cpu_model == NULL) |
552 | 555 |
cpu_model = "Fujitsu MB86904"; |
553 |
sun4m_common_init(ram_size, boot_device, ds, kernel_filename,
|
|
556 |
sun4m_common_init(RAM_size, boot_device, ds, kernel_filename,
|
|
554 | 557 |
kernel_cmdline, initrd_filename, cpu_model, |
555 | 558 |
0, 0x10000000); |
556 | 559 |
} |
557 | 560 |
|
558 | 561 |
/* SPARCstation 10 hardware initialisation */ |
559 |
static void ss10_init(int ram_size, int vga_ram_size, int boot_device,
|
|
562 |
static void ss10_init(int RAM_size, int vga_ram_size, int boot_device,
|
|
560 | 563 |
DisplayState *ds, const char **fd_filename, int snapshot, |
561 | 564 |
const char *kernel_filename, const char *kernel_cmdline, |
562 | 565 |
const char *initrd_filename, const char *cpu_model) |
563 | 566 |
{ |
564 | 567 |
if (cpu_model == NULL) |
565 | 568 |
cpu_model = "TI SuperSparc II"; |
566 |
sun4m_common_init(ram_size, boot_device, ds, kernel_filename,
|
|
569 |
sun4m_common_init(RAM_size, boot_device, ds, kernel_filename,
|
|
567 | 570 |
kernel_cmdline, initrd_filename, cpu_model, |
568 | 571 |
1, PROM_ADDR); // XXX prom overlap, actually first 4GB ok |
569 | 572 |
} |
Also available in: Unified diff