kvm: build: Make "make sync" get correct header files with latest Linux source
[kvm-userspace.git] / qemu / hw / sun4m.c
blob33abf0101cd5a2377623c432c921ddbfc40e5aaa
1 /*
2 * QEMU Sun4m & Sun4d & Sun4c System Emulator
4 * Copyright (c) 2003-2005 Fabrice Bellard
6 * Permission is hereby granted, free of charge, to any person obtaining a copy
7 * of this software and associated documentation files (the "Software"), to deal
8 * in the Software without restriction, including without limitation the rights
9 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
10 * copies of the Software, and to permit persons to whom the Software is
11 * furnished to do so, subject to the following conditions:
13 * The above copyright notice and this permission notice shall be included in
14 * all copies or substantial portions of the Software.
16 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
17 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
19 * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
20 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
21 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
22 * THE SOFTWARE.
24 #include "hw.h"
25 #include "qemu-timer.h"
26 #include "sun4m.h"
27 #include "nvram.h"
28 #include "sparc32_dma.h"
29 #include "fdc.h"
30 #include "sysemu.h"
31 #include "net.h"
32 #include "boards.h"
33 #include "firmware_abi.h"
34 #include "scsi.h"
35 #include "pc.h"
36 #include "isa.h"
38 //#define DEBUG_IRQ
41 * Sun4m architecture was used in the following machines:
43 * SPARCserver 6xxMP/xx
44 * SPARCclassic (SPARCclassic Server)(SPARCstation LC) (4/15),
45 * SPARCclassic X (4/10)
46 * SPARCstation LX/ZX (4/30)
47 * SPARCstation Voyager
48 * SPARCstation 10/xx, SPARCserver 10/xx
49 * SPARCstation 5, SPARCserver 5
50 * SPARCstation 20/xx, SPARCserver 20
51 * SPARCstation 4
53 * Sun4d architecture was used in the following machines:
55 * SPARCcenter 2000
56 * SPARCserver 1000
58 * Sun4c architecture was used in the following machines:
59 * SPARCstation 1/1+, SPARCserver 1/1+
60 * SPARCstation SLC
61 * SPARCstation IPC
62 * SPARCstation ELC
63 * SPARCstation IPX
65 * See for example: http://www.sunhelp.org/faq/sunref1.html
68 #ifdef DEBUG_IRQ
69 #define DPRINTF(fmt, args...) \
70 do { printf("CPUIRQ: " fmt , ##args); } while (0)
71 #else
72 #define DPRINTF(fmt, args...)
73 #endif
75 #define KERNEL_LOAD_ADDR 0x00004000
76 #define CMDLINE_ADDR 0x007ff000
77 #define INITRD_LOAD_ADDR 0x00800000
78 #define PROM_SIZE_MAX (512 * 1024)
79 #define PROM_VADDR 0xffd00000
80 #define PROM_FILENAME "openbios-sparc32"
82 // Control plane, 8-bit and 24-bit planes
83 #define TCX_SIZE (9 * 1024 * 1024)
85 #define MAX_CPUS 16
86 #define MAX_PILS 16
88 struct hwdef {
89 target_phys_addr_t iommu_base, slavio_base;
90 target_phys_addr_t intctl_base, counter_base, nvram_base, ms_kb_base;
91 target_phys_addr_t serial_base, fd_base;
92 target_phys_addr_t idreg_base, dma_base, esp_base, le_base;
93 target_phys_addr_t tcx_base, cs_base, apc_base, aux1_base, aux2_base;
94 target_phys_addr_t ecc_base;
95 uint32_t ecc_version;
96 target_phys_addr_t sun4c_intctl_base, sun4c_counter_base;
97 long vram_size, nvram_size;
98 // IRQ numbers are not PIL ones, but master interrupt controller
99 // register bit numbers
100 int intctl_g_intr, esp_irq, le_irq, clock_irq, clock1_irq;
101 int ser_irq, ms_kb_irq, fd_irq, me_irq, cs_irq, ecc_irq;
102 int machine_id; // For NVRAM
103 uint32_t iommu_version;
104 uint32_t intbit_to_level[32];
105 uint64_t max_mem;
106 const char * const default_cpu_model;
109 #define MAX_IOUNITS 5
111 struct sun4d_hwdef {
112 target_phys_addr_t iounit_bases[MAX_IOUNITS], slavio_base;
113 target_phys_addr_t counter_base, nvram_base, ms_kb_base;
114 target_phys_addr_t serial_base;
115 target_phys_addr_t espdma_base, esp_base;
116 target_phys_addr_t ledma_base, le_base;
117 target_phys_addr_t tcx_base;
118 target_phys_addr_t sbi_base;
119 unsigned long vram_size, nvram_size;
120 // IRQ numbers are not PIL ones, but SBI register bit numbers
121 int esp_irq, le_irq, clock_irq, clock1_irq;
122 int ser_irq, ms_kb_irq, me_irq;
123 int machine_id; // For NVRAM
124 uint32_t iounit_version;
125 uint64_t max_mem;
126 const char * const default_cpu_model;
129 int DMA_get_channel_mode (int nchan)
131 return 0;
133 int DMA_read_memory (int nchan, void *buf, int pos, int size)
135 return 0;
137 int DMA_write_memory (int nchan, void *buf, int pos, int size)
139 return 0;
141 void DMA_hold_DREQ (int nchan) {}
142 void DMA_release_DREQ (int nchan) {}
143 void DMA_schedule(int nchan) {}
144 void DMA_run (void) {}
145 void DMA_init (int high_page_enable) {}
146 void DMA_register_channel (int nchan,
147 DMA_transfer_handler transfer_handler,
148 void *opaque)
152 static int nvram_boot_set(void *opaque, const char *boot_device)
154 unsigned int i;
155 uint8_t image[sizeof(ohwcfg_v3_t)];
156 ohwcfg_v3_t *header = (ohwcfg_v3_t *)ℑ
157 m48t59_t *nvram = (m48t59_t *)opaque;
159 for (i = 0; i < sizeof(image); i++)
160 image[i] = m48t59_read(nvram, i) & 0xff;
162 strcpy((char *)header->boot_devices, boot_device);
163 header->nboot_devices = strlen(boot_device) & 0xff;
164 header->crc = cpu_to_be16(OHW_compute_crc(header, 0x00, 0xF8));
166 for (i = 0; i < sizeof(image); i++)
167 m48t59_write(nvram, i, image[i]);
169 return 0;
172 extern int nographic;
174 static void nvram_init(m48t59_t *nvram, uint8_t *macaddr, const char *cmdline,
175 const char *boot_devices, ram_addr_t RAM_size,
176 uint32_t kernel_size,
177 int width, int height, int depth,
178 int machine_id, const char *arch)
180 unsigned int i;
181 uint32_t start, end;
182 uint8_t image[0x1ff0];
183 ohwcfg_v3_t *header = (ohwcfg_v3_t *)&image;
184 struct sparc_arch_cfg *sparc_header;
185 struct OpenBIOS_nvpart_v1 *part_header;
187 memset(image, '\0', sizeof(image));
189 // Try to match PPC NVRAM
190 strcpy((char *)header->struct_ident, "QEMU_BIOS");
191 header->struct_version = cpu_to_be32(3); /* structure v3 */
193 header->nvram_size = cpu_to_be16(0x2000);
194 header->nvram_arch_ptr = cpu_to_be16(sizeof(ohwcfg_v3_t));
195 header->nvram_arch_size = cpu_to_be16(sizeof(struct sparc_arch_cfg));
196 strcpy((char *)header->arch, arch);
197 header->nb_cpus = smp_cpus & 0xff;
198 header->RAM0_base = 0;
199 header->RAM0_size = cpu_to_be64((uint64_t)RAM_size);
200 strcpy((char *)header->boot_devices, boot_devices);
201 header->nboot_devices = strlen(boot_devices) & 0xff;
202 header->kernel_image = cpu_to_be64((uint64_t)KERNEL_LOAD_ADDR);
203 header->kernel_size = cpu_to_be64((uint64_t)kernel_size);
204 if (cmdline) {
205 pstrcpy_targphys(CMDLINE_ADDR, TARGET_PAGE_SIZE, cmdline);
206 header->cmdline = cpu_to_be64((uint64_t)CMDLINE_ADDR);
207 header->cmdline_size = cpu_to_be64((uint64_t)strlen(cmdline));
209 // XXX add initrd_image, initrd_size
210 header->width = cpu_to_be16(width);
211 header->height = cpu_to_be16(height);
212 header->depth = cpu_to_be16(depth);
213 if (nographic)
214 header->graphic_flags = cpu_to_be16(OHW_GF_NOGRAPHICS);
216 header->crc = cpu_to_be16(OHW_compute_crc(header, 0x00, 0xF8));
218 // Architecture specific header
219 start = sizeof(ohwcfg_v3_t);
220 sparc_header = (struct sparc_arch_cfg *)&image[start];
221 sparc_header->valid = 0;
222 start += sizeof(struct sparc_arch_cfg);
224 // OpenBIOS nvram variables
225 // Variable partition
226 part_header = (struct OpenBIOS_nvpart_v1 *)&image[start];
227 part_header->signature = OPENBIOS_PART_SYSTEM;
228 strcpy(part_header->name, "system");
230 end = start + sizeof(struct OpenBIOS_nvpart_v1);
231 for (i = 0; i < nb_prom_envs; i++)
232 end = OpenBIOS_set_var(image, end, prom_envs[i]);
234 // End marker
235 image[end++] = '\0';
237 end = start + ((end - start + 15) & ~15);
238 OpenBIOS_finish_partition(part_header, end - start);
240 // free partition
241 start = end;
242 part_header = (struct OpenBIOS_nvpart_v1 *)&image[start];
243 part_header->signature = OPENBIOS_PART_FREE;
244 strcpy(part_header->name, "free");
246 end = 0x1fd0;
247 OpenBIOS_finish_partition(part_header, end - start);
249 Sun_init_header((struct Sun_nvram *)&image[0x1fd8], macaddr, machine_id);
251 for (i = 0; i < sizeof(image); i++)
252 m48t59_write(nvram, i, image[i]);
254 qemu_register_boot_set(nvram_boot_set, nvram);
257 static void *slavio_intctl;
259 void pic_info(void)
261 if (slavio_intctl)
262 slavio_pic_info(slavio_intctl);
265 void irq_info(void)
267 if (slavio_intctl)
268 slavio_irq_info(slavio_intctl);
271 void cpu_check_irqs(CPUState *env)
273 if (env->pil_in && (env->interrupt_index == 0 ||
274 (env->interrupt_index & ~15) == TT_EXTINT)) {
275 unsigned int i;
277 for (i = 15; i > 0; i--) {
278 if (env->pil_in & (1 << i)) {
279 int old_interrupt = env->interrupt_index;
281 env->interrupt_index = TT_EXTINT | i;
282 if (old_interrupt != env->interrupt_index) {
283 DPRINTF("Set CPU IRQ %d\n", i);
284 cpu_interrupt(env, CPU_INTERRUPT_HARD);
286 break;
289 } else if (!env->pil_in && (env->interrupt_index & ~15) == TT_EXTINT) {
290 DPRINTF("Reset CPU IRQ %d\n", env->interrupt_index & 15);
291 env->interrupt_index = 0;
292 cpu_reset_interrupt(env, CPU_INTERRUPT_HARD);
296 static void cpu_set_irq(void *opaque, int irq, int level)
298 CPUState *env = opaque;
300 if (level) {
301 DPRINTF("Raise CPU IRQ %d\n", irq);
302 env->halted = 0;
303 env->pil_in |= 1 << irq;
304 cpu_check_irqs(env);
305 } else {
306 DPRINTF("Lower CPU IRQ %d\n", irq);
307 env->pil_in &= ~(1 << irq);
308 cpu_check_irqs(env);
312 static void dummy_cpu_set_irq(void *opaque, int irq, int level)
316 static void *slavio_misc;
318 void qemu_system_powerdown(void)
320 slavio_set_power_fail(slavio_misc, 1);
323 static void main_cpu_reset(void *opaque)
325 CPUState *env = opaque;
327 cpu_reset(env);
328 env->halted = 0;
331 static void secondary_cpu_reset(void *opaque)
333 CPUState *env = opaque;
335 cpu_reset(env);
336 env->halted = 1;
339 static unsigned long sun4m_load_kernel(const char *kernel_filename,
340 const char *initrd_filename,
341 ram_addr_t RAM_size)
343 int linux_boot;
344 unsigned int i;
345 long initrd_size, kernel_size;
347 linux_boot = (kernel_filename != NULL);
349 kernel_size = 0;
350 if (linux_boot) {
351 kernel_size = load_elf(kernel_filename, -0xf0000000ULL, NULL, NULL,
352 NULL);
353 if (kernel_size < 0)
354 kernel_size = load_aout(kernel_filename, KERNEL_LOAD_ADDR,
355 RAM_size - KERNEL_LOAD_ADDR);
356 if (kernel_size < 0)
357 kernel_size = load_image_targphys(kernel_filename,
358 KERNEL_LOAD_ADDR,
359 RAM_size - KERNEL_LOAD_ADDR);
360 if (kernel_size < 0) {
361 fprintf(stderr, "qemu: could not load kernel '%s'\n",
362 kernel_filename);
363 exit(1);
366 /* load initrd */
367 initrd_size = 0;
368 if (initrd_filename) {
369 initrd_size = load_image_targphys(initrd_filename,
370 INITRD_LOAD_ADDR,
371 RAM_size - INITRD_LOAD_ADDR);
372 if (initrd_size < 0) {
373 fprintf(stderr, "qemu: could not load initial ram disk '%s'\n",
374 initrd_filename);
375 exit(1);
378 if (initrd_size > 0) {
379 for (i = 0; i < 64 * TARGET_PAGE_SIZE; i += TARGET_PAGE_SIZE) {
380 if (ldl_phys(KERNEL_LOAD_ADDR + i) == 0x48647253) { // HdrS
381 stl_phys(KERNEL_LOAD_ADDR + i + 16, INITRD_LOAD_ADDR);
382 stl_phys(KERNEL_LOAD_ADDR + i + 20, initrd_size);
383 break;
388 return kernel_size;
391 static void sun4m_hw_init(const struct hwdef *hwdef, ram_addr_t RAM_size,
392 const char *boot_device,
393 DisplayState *ds, const char *kernel_filename,
394 const char *kernel_cmdline,
395 const char *initrd_filename, const char *cpu_model)
398 CPUState *env, *envs[MAX_CPUS];
399 unsigned int i;
400 void *iommu, *espdma, *ledma, *main_esp, *nvram;
401 qemu_irq *cpu_irqs[MAX_CPUS], *slavio_irq, *slavio_cpu_irq,
402 *espdma_irq, *ledma_irq;
403 qemu_irq *esp_reset, *le_reset;
404 qemu_irq *fdc_tc;
405 unsigned long prom_offset, kernel_size;
406 int ret;
407 char buf[1024];
408 BlockDriverState *fd[MAX_FD];
409 int drive_index;
411 /* init CPUs */
412 if (!cpu_model)
413 cpu_model = hwdef->default_cpu_model;
415 for(i = 0; i < smp_cpus; i++) {
416 env = cpu_init(cpu_model);
417 if (!env) {
418 fprintf(stderr, "qemu: Unable to find Sparc CPU definition\n");
419 exit(1);
421 cpu_sparc_set_id(env, i);
422 envs[i] = env;
423 if (i == 0) {
424 qemu_register_reset(main_cpu_reset, env);
425 } else {
426 qemu_register_reset(secondary_cpu_reset, env);
427 env->halted = 1;
429 cpu_irqs[i] = qemu_allocate_irqs(cpu_set_irq, envs[i], MAX_PILS);
430 env->prom_addr = hwdef->slavio_base;
433 for (i = smp_cpus; i < MAX_CPUS; i++)
434 cpu_irqs[i] = qemu_allocate_irqs(dummy_cpu_set_irq, NULL, MAX_PILS);
437 /* allocate RAM */
438 if ((uint64_t)RAM_size > hwdef->max_mem) {
439 fprintf(stderr,
440 "qemu: Too much memory for this machine: %d, maximum %d\n",
441 (unsigned int)(RAM_size / (1024 * 1024)),
442 (unsigned int)(hwdef->max_mem / (1024 * 1024)));
443 exit(1);
445 cpu_register_physical_memory(0, RAM_size, 0);
447 /* load boot prom */
448 prom_offset = RAM_size + hwdef->vram_size;
449 cpu_register_physical_memory(hwdef->slavio_base,
450 (PROM_SIZE_MAX + TARGET_PAGE_SIZE - 1) &
451 TARGET_PAGE_MASK,
452 prom_offset | IO_MEM_ROM);
454 if (bios_name == NULL)
455 bios_name = PROM_FILENAME;
456 snprintf(buf, sizeof(buf), "%s/%s", bios_dir, bios_name);
457 ret = load_elf(buf, hwdef->slavio_base - PROM_VADDR, NULL, NULL, NULL);
458 if (ret < 0 || ret > PROM_SIZE_MAX)
459 ret = load_image_targphys(buf, hwdef->slavio_base, PROM_SIZE_MAX);
460 if (ret < 0 || ret > PROM_SIZE_MAX) {
461 fprintf(stderr, "qemu: could not load prom '%s'\n",
462 buf);
463 exit(1);
465 prom_offset += (ret + TARGET_PAGE_SIZE - 1) & TARGET_PAGE_MASK;
467 /* set up devices */
468 slavio_intctl = slavio_intctl_init(hwdef->intctl_base,
469 hwdef->intctl_base + 0x10000ULL,
470 &hwdef->intbit_to_level[0],
471 &slavio_irq, &slavio_cpu_irq,
472 cpu_irqs,
473 hwdef->clock_irq);
475 if (hwdef->idreg_base != (target_phys_addr_t)-1) {
476 static const uint8_t idreg_data[] = { 0xfe, 0x81, 0x01, 0x03 };
478 cpu_register_physical_memory(hwdef->idreg_base, sizeof(idreg_data),
479 prom_offset | IO_MEM_ROM);
480 cpu_physical_memory_write_rom(hwdef->idreg_base, idreg_data,
481 sizeof(idreg_data));
484 iommu = iommu_init(hwdef->iommu_base, hwdef->iommu_version,
485 slavio_irq[hwdef->me_irq]);
487 espdma = sparc32_dma_init(hwdef->dma_base, slavio_irq[hwdef->esp_irq],
488 iommu, &espdma_irq, &esp_reset);
490 ledma = sparc32_dma_init(hwdef->dma_base + 16ULL,
491 slavio_irq[hwdef->le_irq], iommu, &ledma_irq,
492 &le_reset);
494 if (graphic_depth != 8 && graphic_depth != 24) {
495 fprintf(stderr, "qemu: Unsupported depth: %d\n", graphic_depth);
496 exit (1);
498 tcx_init(ds, hwdef->tcx_base, phys_ram_base + RAM_size, RAM_size,
499 hwdef->vram_size, graphic_width, graphic_height, graphic_depth);
501 if (nd_table[0].model == NULL
502 || strcmp(nd_table[0].model, "lance") == 0) {
503 lance_init(&nd_table[0], hwdef->le_base, ledma, *ledma_irq, le_reset);
504 } else if (strcmp(nd_table[0].model, "?") == 0) {
505 fprintf(stderr, "qemu: Supported NICs: lance\n");
506 exit (1);
507 } else {
508 fprintf(stderr, "qemu: Unsupported NIC: %s\n", nd_table[0].model);
509 exit (1);
512 nvram = m48t59_init(slavio_irq[0], hwdef->nvram_base, 0,
513 hwdef->nvram_size, 8);
515 slavio_timer_init_all(hwdef->counter_base, slavio_irq[hwdef->clock1_irq],
516 slavio_cpu_irq, smp_cpus);
518 slavio_serial_ms_kbd_init(hwdef->ms_kb_base, slavio_irq[hwdef->ms_kb_irq],
519 nographic);
520 // Slavio TTYA (base+4, Linux ttyS0) is the first Qemu serial device
521 // Slavio TTYB (base+0, Linux ttyS1) is the second Qemu serial device
522 slavio_serial_init(hwdef->serial_base, slavio_irq[hwdef->ser_irq],
523 serial_hds[1], serial_hds[0]);
525 slavio_misc = slavio_misc_init(hwdef->slavio_base, hwdef->apc_base,
526 hwdef->aux1_base, hwdef->aux2_base,
527 slavio_irq[hwdef->me_irq], envs[0],
528 &fdc_tc);
530 if (hwdef->fd_base != (target_phys_addr_t)-1) {
531 /* there is zero or one floppy drive */
532 memset(fd, 0, sizeof(fd));
533 drive_index = drive_get_index(IF_FLOPPY, 0, 0);
534 if (drive_index != -1)
535 fd[0] = drives_table[drive_index].bdrv;
537 sun4m_fdctrl_init(slavio_irq[hwdef->fd_irq], hwdef->fd_base, fd,
538 fdc_tc);
541 if (drive_get_max_bus(IF_SCSI) > 0) {
542 fprintf(stderr, "qemu: too many SCSI bus\n");
543 exit(1);
546 main_esp = esp_init(hwdef->esp_base, 2,
547 espdma_memory_read, espdma_memory_write,
548 espdma, *espdma_irq, esp_reset);
550 for (i = 0; i < ESP_MAX_DEVS; i++) {
551 drive_index = drive_get_index(IF_SCSI, 0, i);
552 if (drive_index == -1)
553 continue;
554 esp_scsi_attach(main_esp, drives_table[drive_index].bdrv, i);
557 if (hwdef->cs_base != (target_phys_addr_t)-1)
558 cs_init(hwdef->cs_base, hwdef->cs_irq, slavio_intctl);
560 kernel_size = sun4m_load_kernel(kernel_filename, initrd_filename,
561 RAM_size);
563 nvram_init(nvram, (uint8_t *)&nd_table[0].macaddr, kernel_cmdline,
564 boot_device, RAM_size, kernel_size, graphic_width,
565 graphic_height, graphic_depth, hwdef->machine_id, "Sun4m");
567 if (hwdef->ecc_base != (target_phys_addr_t)-1)
568 ecc_init(hwdef->ecc_base, slavio_irq[hwdef->ecc_irq],
569 hwdef->ecc_version);
572 static void sun4c_hw_init(const struct hwdef *hwdef, ram_addr_t RAM_size,
573 const char *boot_device,
574 DisplayState *ds, const char *kernel_filename,
575 const char *kernel_cmdline,
576 const char *initrd_filename, const char *cpu_model)
578 CPUState *env;
579 unsigned int i;
580 void *iommu, *espdma, *ledma, *main_esp, *nvram;
581 qemu_irq *cpu_irqs, *slavio_irq, *espdma_irq, *ledma_irq;
582 qemu_irq *esp_reset, *le_reset;
583 qemu_irq *fdc_tc;
584 unsigned long prom_offset, kernel_size;
585 int ret;
586 char buf[1024];
587 BlockDriverState *fd[MAX_FD];
588 int drive_index;
590 /* init CPU */
591 if (!cpu_model)
592 cpu_model = hwdef->default_cpu_model;
594 env = cpu_init(cpu_model);
595 if (!env) {
596 fprintf(stderr, "qemu: Unable to find Sparc CPU definition\n");
597 exit(1);
600 cpu_sparc_set_id(env, 0);
602 qemu_register_reset(main_cpu_reset, env);
603 cpu_irqs = qemu_allocate_irqs(cpu_set_irq, env, MAX_PILS);
604 env->prom_addr = hwdef->slavio_base;
606 /* allocate RAM */
607 if ((uint64_t)RAM_size > hwdef->max_mem) {
608 fprintf(stderr,
609 "qemu: Too much memory for this machine: %d, maximum %d\n",
610 (unsigned int)(RAM_size / (1024 * 1024)),
611 (unsigned int)(hwdef->max_mem / (1024 * 1024)));
612 exit(1);
614 cpu_register_physical_memory(0, RAM_size, 0);
616 /* load boot prom */
617 prom_offset = RAM_size + hwdef->vram_size;
618 cpu_register_physical_memory(hwdef->slavio_base,
619 (PROM_SIZE_MAX + TARGET_PAGE_SIZE - 1) &
620 TARGET_PAGE_MASK,
621 prom_offset | IO_MEM_ROM);
623 if (bios_name == NULL)
624 bios_name = PROM_FILENAME;
625 snprintf(buf, sizeof(buf), "%s/%s", bios_dir, bios_name);
626 ret = load_elf(buf, hwdef->slavio_base - PROM_VADDR, NULL, NULL, NULL);
627 if (ret < 0 || ret > PROM_SIZE_MAX)
628 ret = load_image_targphys(buf, hwdef->slavio_base, PROM_SIZE_MAX);
629 if (ret < 0 || ret > PROM_SIZE_MAX) {
630 fprintf(stderr, "qemu: could not load prom '%s'\n",
631 buf);
632 exit(1);
634 prom_offset += (ret + TARGET_PAGE_SIZE - 1) & TARGET_PAGE_MASK;
636 /* set up devices */
637 slavio_intctl = sun4c_intctl_init(hwdef->sun4c_intctl_base,
638 &slavio_irq, cpu_irqs);
640 iommu = iommu_init(hwdef->iommu_base, hwdef->iommu_version,
641 slavio_irq[hwdef->me_irq]);
643 espdma = sparc32_dma_init(hwdef->dma_base, slavio_irq[hwdef->esp_irq],
644 iommu, &espdma_irq, &esp_reset);
646 ledma = sparc32_dma_init(hwdef->dma_base + 16ULL,
647 slavio_irq[hwdef->le_irq], iommu, &ledma_irq,
648 &le_reset);
650 if (graphic_depth != 8 && graphic_depth != 24) {
651 fprintf(stderr, "qemu: Unsupported depth: %d\n", graphic_depth);
652 exit (1);
654 tcx_init(ds, hwdef->tcx_base, phys_ram_base + RAM_size, RAM_size,
655 hwdef->vram_size, graphic_width, graphic_height, graphic_depth);
657 if (nd_table[0].model == NULL
658 || strcmp(nd_table[0].model, "lance") == 0) {
659 lance_init(&nd_table[0], hwdef->le_base, ledma, *ledma_irq, le_reset);
660 } else if (strcmp(nd_table[0].model, "?") == 0) {
661 fprintf(stderr, "qemu: Supported NICs: lance\n");
662 exit (1);
663 } else {
664 fprintf(stderr, "qemu: Unsupported NIC: %s\n", nd_table[0].model);
665 exit (1);
668 nvram = m48t59_init(slavio_irq[0], hwdef->nvram_base, 0,
669 hwdef->nvram_size, 2);
671 slavio_serial_ms_kbd_init(hwdef->ms_kb_base, slavio_irq[hwdef->ms_kb_irq],
672 nographic);
673 // Slavio TTYA (base+4, Linux ttyS0) is the first Qemu serial device
674 // Slavio TTYB (base+0, Linux ttyS1) is the second Qemu serial device
675 slavio_serial_init(hwdef->serial_base, slavio_irq[hwdef->ser_irq],
676 serial_hds[1], serial_hds[0]);
678 slavio_misc = slavio_misc_init(-1, hwdef->apc_base,
679 hwdef->aux1_base, hwdef->aux2_base,
680 slavio_irq[hwdef->me_irq], env, &fdc_tc);
682 if (hwdef->fd_base != (target_phys_addr_t)-1) {
683 /* there is zero or one floppy drive */
684 fd[1] = fd[0] = NULL;
685 drive_index = drive_get_index(IF_FLOPPY, 0, 0);
686 if (drive_index != -1)
687 fd[0] = drives_table[drive_index].bdrv;
689 sun4m_fdctrl_init(slavio_irq[hwdef->fd_irq], hwdef->fd_base, fd,
690 fdc_tc);
693 if (drive_get_max_bus(IF_SCSI) > 0) {
694 fprintf(stderr, "qemu: too many SCSI bus\n");
695 exit(1);
698 main_esp = esp_init(hwdef->esp_base, 2,
699 espdma_memory_read, espdma_memory_write,
700 espdma, *espdma_irq, esp_reset);
702 for (i = 0; i < ESP_MAX_DEVS; i++) {
703 drive_index = drive_get_index(IF_SCSI, 0, i);
704 if (drive_index == -1)
705 continue;
706 esp_scsi_attach(main_esp, drives_table[drive_index].bdrv, i);
709 kernel_size = sun4m_load_kernel(kernel_filename, initrd_filename,
710 RAM_size);
712 nvram_init(nvram, (uint8_t *)&nd_table[0].macaddr, kernel_cmdline,
713 boot_device, RAM_size, kernel_size, graphic_width,
714 graphic_height, graphic_depth, hwdef->machine_id, "Sun4c");
717 static const struct hwdef hwdefs[] = {
718 /* SS-5 */
720 .iommu_base = 0x10000000,
721 .tcx_base = 0x50000000,
722 .cs_base = 0x6c000000,
723 .slavio_base = 0x70000000,
724 .ms_kb_base = 0x71000000,
725 .serial_base = 0x71100000,
726 .nvram_base = 0x71200000,
727 .fd_base = 0x71400000,
728 .counter_base = 0x71d00000,
729 .intctl_base = 0x71e00000,
730 .idreg_base = 0x78000000,
731 .dma_base = 0x78400000,
732 .esp_base = 0x78800000,
733 .le_base = 0x78c00000,
734 .apc_base = 0x6a000000,
735 .aux1_base = 0x71900000,
736 .aux2_base = 0x71910000,
737 .ecc_base = -1,
738 .sun4c_intctl_base = -1,
739 .sun4c_counter_base = -1,
740 .vram_size = 0x00100000,
741 .nvram_size = 0x2000,
742 .esp_irq = 18,
743 .le_irq = 16,
744 .clock_irq = 7,
745 .clock1_irq = 19,
746 .ms_kb_irq = 14,
747 .ser_irq = 15,
748 .fd_irq = 22,
749 .me_irq = 30,
750 .cs_irq = 5,
751 .machine_id = 0x80,
752 .iommu_version = 0x05000000,
753 .intbit_to_level = {
754 2, 3, 5, 7, 9, 11, 0, 14, 3, 5, 7, 9, 11, 13, 12, 12,
755 6, 0, 4, 10, 8, 0, 11, 0, 0, 0, 0, 0, 15, 0, 15, 0,
757 .max_mem = 0x10000000,
758 .default_cpu_model = "Fujitsu MB86904",
760 /* SS-10 */
762 .iommu_base = 0xfe0000000ULL,
763 .tcx_base = 0xe20000000ULL,
764 .cs_base = -1,
765 .slavio_base = 0xff0000000ULL,
766 .ms_kb_base = 0xff1000000ULL,
767 .serial_base = 0xff1100000ULL,
768 .nvram_base = 0xff1200000ULL,
769 .fd_base = 0xff1700000ULL,
770 .counter_base = 0xff1300000ULL,
771 .intctl_base = 0xff1400000ULL,
772 .idreg_base = 0xef0000000ULL,
773 .dma_base = 0xef0400000ULL,
774 .esp_base = 0xef0800000ULL,
775 .le_base = 0xef0c00000ULL,
776 .apc_base = 0xefa000000ULL, // XXX should not exist
777 .aux1_base = 0xff1800000ULL,
778 .aux2_base = 0xff1a01000ULL,
779 .ecc_base = 0xf00000000ULL,
780 .ecc_version = 0x10000000, // version 0, implementation 1
781 .sun4c_intctl_base = -1,
782 .sun4c_counter_base = -1,
783 .vram_size = 0x00100000,
784 .nvram_size = 0x2000,
785 .esp_irq = 18,
786 .le_irq = 16,
787 .clock_irq = 7,
788 .clock1_irq = 19,
789 .ms_kb_irq = 14,
790 .ser_irq = 15,
791 .fd_irq = 22,
792 .me_irq = 30,
793 .cs_irq = -1,
794 .ecc_irq = 28,
795 .machine_id = 0x72,
796 .iommu_version = 0x03000000,
797 .intbit_to_level = {
798 2, 3, 5, 7, 9, 11, 0, 14, 3, 5, 7, 9, 11, 13, 12, 12,
799 6, 0, 4, 10, 8, 0, 11, 0, 0, 0, 0, 0, 15, 0, 15, 0,
801 .max_mem = 0xf00000000ULL,
802 .default_cpu_model = "TI SuperSparc II",
804 /* SS-600MP */
806 .iommu_base = 0xfe0000000ULL,
807 .tcx_base = 0xe20000000ULL,
808 .cs_base = -1,
809 .slavio_base = 0xff0000000ULL,
810 .ms_kb_base = 0xff1000000ULL,
811 .serial_base = 0xff1100000ULL,
812 .nvram_base = 0xff1200000ULL,
813 .fd_base = -1,
814 .counter_base = 0xff1300000ULL,
815 .intctl_base = 0xff1400000ULL,
816 .idreg_base = -1,
817 .dma_base = 0xef0081000ULL,
818 .esp_base = 0xef0080000ULL,
819 .le_base = 0xef0060000ULL,
820 .apc_base = 0xefa000000ULL, // XXX should not exist
821 .aux1_base = 0xff1800000ULL,
822 .aux2_base = 0xff1a01000ULL, // XXX should not exist
823 .ecc_base = 0xf00000000ULL,
824 .ecc_version = 0x00000000, // version 0, implementation 0
825 .sun4c_intctl_base = -1,
826 .sun4c_counter_base = -1,
827 .vram_size = 0x00100000,
828 .nvram_size = 0x2000,
829 .esp_irq = 18,
830 .le_irq = 16,
831 .clock_irq = 7,
832 .clock1_irq = 19,
833 .ms_kb_irq = 14,
834 .ser_irq = 15,
835 .fd_irq = 22,
836 .me_irq = 30,
837 .cs_irq = -1,
838 .ecc_irq = 28,
839 .machine_id = 0x71,
840 .iommu_version = 0x01000000,
841 .intbit_to_level = {
842 2, 3, 5, 7, 9, 11, 0, 14, 3, 5, 7, 9, 11, 13, 12, 12,
843 6, 0, 4, 10, 8, 0, 11, 0, 0, 0, 0, 0, 15, 0, 15, 0,
845 .max_mem = 0xf00000000ULL,
846 .default_cpu_model = "TI SuperSparc II",
848 /* SS-20 */
850 .iommu_base = 0xfe0000000ULL,
851 .tcx_base = 0xe20000000ULL,
852 .cs_base = -1,
853 .slavio_base = 0xff0000000ULL,
854 .ms_kb_base = 0xff1000000ULL,
855 .serial_base = 0xff1100000ULL,
856 .nvram_base = 0xff1200000ULL,
857 .fd_base = 0xff1700000ULL,
858 .counter_base = 0xff1300000ULL,
859 .intctl_base = 0xff1400000ULL,
860 .idreg_base = 0xef0000000ULL,
861 .dma_base = 0xef0400000ULL,
862 .esp_base = 0xef0800000ULL,
863 .le_base = 0xef0c00000ULL,
864 .apc_base = 0xefa000000ULL, // XXX should not exist
865 .aux1_base = 0xff1800000ULL,
866 .aux2_base = 0xff1a01000ULL,
867 .ecc_base = 0xf00000000ULL,
868 .ecc_version = 0x20000000, // version 0, implementation 2
869 .sun4c_intctl_base = -1,
870 .sun4c_counter_base = -1,
871 .vram_size = 0x00100000,
872 .nvram_size = 0x2000,
873 .esp_irq = 18,
874 .le_irq = 16,
875 .clock_irq = 7,
876 .clock1_irq = 19,
877 .ms_kb_irq = 14,
878 .ser_irq = 15,
879 .fd_irq = 22,
880 .me_irq = 30,
881 .cs_irq = -1,
882 .ecc_irq = 28,
883 .machine_id = 0x72,
884 .iommu_version = 0x13000000,
885 .intbit_to_level = {
886 2, 3, 5, 7, 9, 11, 0, 14, 3, 5, 7, 9, 11, 13, 12, 12,
887 6, 0, 4, 10, 8, 0, 11, 0, 0, 0, 0, 0, 15, 0, 15, 0,
889 .max_mem = 0xf00000000ULL,
890 .default_cpu_model = "TI SuperSparc II",
892 /* SS-2 */
894 .iommu_base = 0xf8000000,
895 .tcx_base = 0xfe000000,
896 .cs_base = -1,
897 .slavio_base = 0xf6000000,
898 .ms_kb_base = 0xf0000000,
899 .serial_base = 0xf1000000,
900 .nvram_base = 0xf2000000,
901 .fd_base = 0xf7200000,
902 .counter_base = -1,
903 .intctl_base = -1,
904 .dma_base = 0xf8400000,
905 .esp_base = 0xf8800000,
906 .le_base = 0xf8c00000,
907 .apc_base = -1,
908 .aux1_base = 0xf7400003,
909 .aux2_base = -1,
910 .sun4c_intctl_base = 0xf5000000,
911 .sun4c_counter_base = 0xf3000000,
912 .vram_size = 0x00100000,
913 .nvram_size = 0x800,
914 .esp_irq = 2,
915 .le_irq = 3,
916 .clock_irq = 5,
917 .clock1_irq = 7,
918 .ms_kb_irq = 1,
919 .ser_irq = 1,
920 .fd_irq = 1,
921 .me_irq = 1,
922 .cs_irq = -1,
923 .machine_id = 0x55,
924 .max_mem = 0x10000000,
925 .default_cpu_model = "Cypress CY7C601",
927 /* Voyager */
929 .iommu_base = 0x10000000,
930 .tcx_base = 0x50000000,
931 .cs_base = -1,
932 .slavio_base = 0x70000000,
933 .ms_kb_base = 0x71000000,
934 .serial_base = 0x71100000,
935 .nvram_base = 0x71200000,
936 .fd_base = 0x71400000,
937 .counter_base = 0x71d00000,
938 .intctl_base = 0x71e00000,
939 .idreg_base = 0x78000000,
940 .dma_base = 0x78400000,
941 .esp_base = 0x78800000,
942 .le_base = 0x78c00000,
943 .apc_base = 0x71300000, // pmc
944 .aux1_base = 0x71900000,
945 .aux2_base = 0x71910000,
946 .ecc_base = -1,
947 .sun4c_intctl_base = -1,
948 .sun4c_counter_base = -1,
949 .vram_size = 0x00100000,
950 .nvram_size = 0x2000,
951 .esp_irq = 18,
952 .le_irq = 16,
953 .clock_irq = 7,
954 .clock1_irq = 19,
955 .ms_kb_irq = 14,
956 .ser_irq = 15,
957 .fd_irq = 22,
958 .me_irq = 30,
959 .cs_irq = -1,
960 .machine_id = 0x80,
961 .iommu_version = 0x05000000,
962 .intbit_to_level = {
963 2, 3, 5, 7, 9, 11, 0, 14, 3, 5, 7, 9, 11, 13, 12, 12,
964 6, 0, 4, 10, 8, 0, 11, 0, 0, 0, 0, 0, 15, 0, 15, 0,
966 .max_mem = 0x10000000,
967 .default_cpu_model = "Fujitsu MB86904",
969 /* LX */
971 .iommu_base = 0x10000000,
972 .tcx_base = 0x50000000,
973 .cs_base = -1,
974 .slavio_base = 0x70000000,
975 .ms_kb_base = 0x71000000,
976 .serial_base = 0x71100000,
977 .nvram_base = 0x71200000,
978 .fd_base = 0x71400000,
979 .counter_base = 0x71d00000,
980 .intctl_base = 0x71e00000,
981 .idreg_base = 0x78000000,
982 .dma_base = 0x78400000,
983 .esp_base = 0x78800000,
984 .le_base = 0x78c00000,
985 .apc_base = -1,
986 .aux1_base = 0x71900000,
987 .aux2_base = 0x71910000,
988 .ecc_base = -1,
989 .sun4c_intctl_base = -1,
990 .sun4c_counter_base = -1,
991 .vram_size = 0x00100000,
992 .nvram_size = 0x2000,
993 .esp_irq = 18,
994 .le_irq = 16,
995 .clock_irq = 7,
996 .clock1_irq = 19,
997 .ms_kb_irq = 14,
998 .ser_irq = 15,
999 .fd_irq = 22,
1000 .me_irq = 30,
1001 .cs_irq = -1,
1002 .machine_id = 0x80,
1003 .iommu_version = 0x04000000,
1004 .intbit_to_level = {
1005 2, 3, 5, 7, 9, 11, 0, 14, 3, 5, 7, 9, 11, 13, 12, 12,
1006 6, 0, 4, 10, 8, 0, 11, 0, 0, 0, 0, 0, 15, 0, 15, 0,
1008 .max_mem = 0x10000000,
1009 .default_cpu_model = "TI MicroSparc I",
1011 /* SS-4 */
1013 .iommu_base = 0x10000000,
1014 .tcx_base = 0x50000000,
1015 .cs_base = 0x6c000000,
1016 .slavio_base = 0x70000000,
1017 .ms_kb_base = 0x71000000,
1018 .serial_base = 0x71100000,
1019 .nvram_base = 0x71200000,
1020 .fd_base = 0x71400000,
1021 .counter_base = 0x71d00000,
1022 .intctl_base = 0x71e00000,
1023 .idreg_base = 0x78000000,
1024 .dma_base = 0x78400000,
1025 .esp_base = 0x78800000,
1026 .le_base = 0x78c00000,
1027 .apc_base = 0x6a000000,
1028 .aux1_base = 0x71900000,
1029 .aux2_base = 0x71910000,
1030 .ecc_base = -1,
1031 .sun4c_intctl_base = -1,
1032 .sun4c_counter_base = -1,
1033 .vram_size = 0x00100000,
1034 .nvram_size = 0x2000,
1035 .esp_irq = 18,
1036 .le_irq = 16,
1037 .clock_irq = 7,
1038 .clock1_irq = 19,
1039 .ms_kb_irq = 14,
1040 .ser_irq = 15,
1041 .fd_irq = 22,
1042 .me_irq = 30,
1043 .cs_irq = 5,
1044 .machine_id = 0x80,
1045 .iommu_version = 0x05000000,
1046 .intbit_to_level = {
1047 2, 3, 5, 7, 9, 11, 0, 14, 3, 5, 7, 9, 11, 13, 12, 12,
1048 6, 0, 4, 10, 8, 0, 11, 0, 0, 0, 0, 0, 15, 0, 15, 0,
1050 .max_mem = 0x10000000,
1051 .default_cpu_model = "Fujitsu MB86904",
1053 /* SPARCClassic */
1055 .iommu_base = 0x10000000,
1056 .tcx_base = 0x50000000,
1057 .cs_base = -1,
1058 .slavio_base = 0x70000000,
1059 .ms_kb_base = 0x71000000,
1060 .serial_base = 0x71100000,
1061 .nvram_base = 0x71200000,
1062 .fd_base = 0x71400000,
1063 .counter_base = 0x71d00000,
1064 .intctl_base = 0x71e00000,
1065 .idreg_base = 0x78000000,
1066 .dma_base = 0x78400000,
1067 .esp_base = 0x78800000,
1068 .le_base = 0x78c00000,
1069 .apc_base = 0x6a000000,
1070 .aux1_base = 0x71900000,
1071 .aux2_base = 0x71910000,
1072 .ecc_base = -1,
1073 .sun4c_intctl_base = -1,
1074 .sun4c_counter_base = -1,
1075 .vram_size = 0x00100000,
1076 .nvram_size = 0x2000,
1077 .esp_irq = 18,
1078 .le_irq = 16,
1079 .clock_irq = 7,
1080 .clock1_irq = 19,
1081 .ms_kb_irq = 14,
1082 .ser_irq = 15,
1083 .fd_irq = 22,
1084 .me_irq = 30,
1085 .cs_irq = -1,
1086 .machine_id = 0x80,
1087 .iommu_version = 0x05000000,
1088 .intbit_to_level = {
1089 2, 3, 5, 7, 9, 11, 0, 14, 3, 5, 7, 9, 11, 13, 12, 12,
1090 6, 0, 4, 10, 8, 0, 11, 0, 0, 0, 0, 0, 15, 0, 15, 0,
1092 .max_mem = 0x10000000,
1093 .default_cpu_model = "TI MicroSparc I",
1095 /* SPARCbook */
1097 .iommu_base = 0x10000000,
1098 .tcx_base = 0x50000000, // XXX
1099 .cs_base = -1,
1100 .slavio_base = 0x70000000,
1101 .ms_kb_base = 0x71000000,
1102 .serial_base = 0x71100000,
1103 .nvram_base = 0x71200000,
1104 .fd_base = 0x71400000,
1105 .counter_base = 0x71d00000,
1106 .intctl_base = 0x71e00000,
1107 .idreg_base = 0x78000000,
1108 .dma_base = 0x78400000,
1109 .esp_base = 0x78800000,
1110 .le_base = 0x78c00000,
1111 .apc_base = 0x6a000000,
1112 .aux1_base = 0x71900000,
1113 .aux2_base = 0x71910000,
1114 .ecc_base = -1,
1115 .sun4c_intctl_base = -1,
1116 .sun4c_counter_base = -1,
1117 .vram_size = 0x00100000,
1118 .nvram_size = 0x2000,
1119 .esp_irq = 18,
1120 .le_irq = 16,
1121 .clock_irq = 7,
1122 .clock1_irq = 19,
1123 .ms_kb_irq = 14,
1124 .ser_irq = 15,
1125 .fd_irq = 22,
1126 .me_irq = 30,
1127 .cs_irq = -1,
1128 .machine_id = 0x80,
1129 .iommu_version = 0x05000000,
1130 .intbit_to_level = {
1131 2, 3, 5, 7, 9, 11, 0, 14, 3, 5, 7, 9, 11, 13, 12, 12,
1132 6, 0, 4, 10, 8, 0, 11, 0, 0, 0, 0, 0, 15, 0, 15, 0,
1134 .max_mem = 0x10000000,
1135 .default_cpu_model = "TI MicroSparc I",
1139 /* SPARCstation 5 hardware initialisation */
1140 static void ss5_init(ram_addr_t RAM_size, int vga_ram_size,
1141 const char *boot_device, DisplayState *ds,
1142 const char *kernel_filename, const char *kernel_cmdline,
1143 const char *initrd_filename, const char *cpu_model)
1145 sun4m_hw_init(&hwdefs[0], RAM_size, boot_device, ds, kernel_filename,
1146 kernel_cmdline, initrd_filename, cpu_model);
1149 /* SPARCstation 10 hardware initialisation */
1150 static void ss10_init(ram_addr_t RAM_size, int vga_ram_size,
1151 const char *boot_device, DisplayState *ds,
1152 const char *kernel_filename, const char *kernel_cmdline,
1153 const char *initrd_filename, const char *cpu_model)
1155 sun4m_hw_init(&hwdefs[1], RAM_size, boot_device, ds, kernel_filename,
1156 kernel_cmdline, initrd_filename, cpu_model);
1159 /* SPARCserver 600MP hardware initialisation */
1160 static void ss600mp_init(ram_addr_t RAM_size, int vga_ram_size,
1161 const char *boot_device, DisplayState *ds,
1162 const char *kernel_filename,
1163 const char *kernel_cmdline,
1164 const char *initrd_filename, const char *cpu_model)
1166 sun4m_hw_init(&hwdefs[2], RAM_size, boot_device, ds, kernel_filename,
1167 kernel_cmdline, initrd_filename, cpu_model);
1170 /* SPARCstation 20 hardware initialisation */
1171 static void ss20_init(ram_addr_t RAM_size, int vga_ram_size,
1172 const char *boot_device, DisplayState *ds,
1173 const char *kernel_filename, const char *kernel_cmdline,
1174 const char *initrd_filename, const char *cpu_model)
1176 sun4m_hw_init(&hwdefs[3], RAM_size, boot_device, ds, kernel_filename,
1177 kernel_cmdline, initrd_filename, cpu_model);
1180 /* SPARCstation 2 hardware initialisation */
1181 static void ss2_init(ram_addr_t RAM_size, int vga_ram_size,
1182 const char *boot_device, DisplayState *ds,
1183 const char *kernel_filename, const char *kernel_cmdline,
1184 const char *initrd_filename, const char *cpu_model)
1186 sun4c_hw_init(&hwdefs[4], RAM_size, boot_device, ds, kernel_filename,
1187 kernel_cmdline, initrd_filename, cpu_model);
1190 /* SPARCstation Voyager hardware initialisation */
1191 static void vger_init(ram_addr_t RAM_size, int vga_ram_size,
1192 const char *boot_device, DisplayState *ds,
1193 const char *kernel_filename, const char *kernel_cmdline,
1194 const char *initrd_filename, const char *cpu_model)
1196 sun4m_hw_init(&hwdefs[5], RAM_size, boot_device, ds, kernel_filename,
1197 kernel_cmdline, initrd_filename, cpu_model);
1200 /* SPARCstation LX hardware initialisation */
1201 static void ss_lx_init(ram_addr_t RAM_size, int vga_ram_size,
1202 const char *boot_device, DisplayState *ds,
1203 const char *kernel_filename, const char *kernel_cmdline,
1204 const char *initrd_filename, const char *cpu_model)
1206 sun4m_hw_init(&hwdefs[6], RAM_size, boot_device, ds, kernel_filename,
1207 kernel_cmdline, initrd_filename, cpu_model);
1210 /* SPARCstation 4 hardware initialisation */
1211 static void ss4_init(ram_addr_t RAM_size, int vga_ram_size,
1212 const char *boot_device, DisplayState *ds,
1213 const char *kernel_filename, const char *kernel_cmdline,
1214 const char *initrd_filename, const char *cpu_model)
1216 sun4m_hw_init(&hwdefs[7], RAM_size, boot_device, ds, kernel_filename,
1217 kernel_cmdline, initrd_filename, cpu_model);
1220 /* SPARCClassic hardware initialisation */
1221 static void scls_init(ram_addr_t RAM_size, int vga_ram_size,
1222 const char *boot_device, DisplayState *ds,
1223 const char *kernel_filename, const char *kernel_cmdline,
1224 const char *initrd_filename, const char *cpu_model)
1226 sun4m_hw_init(&hwdefs[8], RAM_size, boot_device, ds, kernel_filename,
1227 kernel_cmdline, initrd_filename, cpu_model);
1230 /* SPARCbook hardware initialisation */
1231 static void sbook_init(ram_addr_t RAM_size, int vga_ram_size,
1232 const char *boot_device, DisplayState *ds,
1233 const char *kernel_filename, const char *kernel_cmdline,
1234 const char *initrd_filename, const char *cpu_model)
1236 sun4m_hw_init(&hwdefs[9], RAM_size, boot_device, ds, kernel_filename,
1237 kernel_cmdline, initrd_filename, cpu_model);
1240 QEMUMachine ss5_machine = {
1241 .name = "SS-5",
1242 .desc = "Sun4m platform, SPARCstation 5",
1243 .init = ss5_init,
1244 .ram_require = PROM_SIZE_MAX + TCX_SIZE,
1245 .nodisk_ok = 1,
1248 QEMUMachine ss10_machine = {
1249 .name = "SS-10",
1250 .desc = "Sun4m platform, SPARCstation 10",
1251 .init = ss10_init,
1252 .ram_require = PROM_SIZE_MAX + TCX_SIZE,
1253 .nodisk_ok = 1,
1256 QEMUMachine ss600mp_machine = {
1257 .name = "SS-600MP",
1258 .desc = "Sun4m platform, SPARCserver 600MP",
1259 .init = ss600mp_init,
1260 .ram_require = PROM_SIZE_MAX + TCX_SIZE,
1261 .nodisk_ok = 1,
1264 QEMUMachine ss20_machine = {
1265 .name = "SS-20",
1266 .desc = "Sun4m platform, SPARCstation 20",
1267 .init = ss20_init,
1268 .ram_require = PROM_SIZE_MAX + TCX_SIZE,
1269 .nodisk_ok = 1,
1272 QEMUMachine ss2_machine = {
1273 .name = "SS-2",
1274 .desc = "Sun4c platform, SPARCstation 2",
1275 .init = ss2_init,
1276 .ram_require = PROM_SIZE_MAX + TCX_SIZE,
1277 .nodisk_ok = 1,
1280 QEMUMachine voyager_machine = {
1281 .name = "Voyager",
1282 .desc = "Sun4m platform, SPARCstation Voyager",
1283 .init = vger_init,
1284 .ram_require = PROM_SIZE_MAX + TCX_SIZE,
1285 .nodisk_ok = 1,
1288 QEMUMachine ss_lx_machine = {
1289 .name = "LX",
1290 .desc = "Sun4m platform, SPARCstation LX",
1291 .init = ss_lx_init,
1292 .ram_require = PROM_SIZE_MAX + TCX_SIZE,
1293 .nodisk_ok = 1,
1296 QEMUMachine ss4_machine = {
1297 .name = "SS-4",
1298 .desc = "Sun4m platform, SPARCstation 4",
1299 .init = ss4_init,
1300 .ram_require = PROM_SIZE_MAX + TCX_SIZE,
1301 .nodisk_ok = 1,
1304 QEMUMachine scls_machine = {
1305 .name = "SPARCClassic",
1306 .desc = "Sun4m platform, SPARCClassic",
1307 .init = scls_init,
1308 .ram_require = PROM_SIZE_MAX + TCX_SIZE,
1309 .nodisk_ok = 1,
1312 QEMUMachine sbook_machine = {
1313 .name = "SPARCbook",
1314 .desc = "Sun4m platform, SPARCbook",
1315 .init = sbook_init,
1316 .ram_require = PROM_SIZE_MAX + TCX_SIZE,
1317 .nodisk_ok = 1,
1320 static const struct sun4d_hwdef sun4d_hwdefs[] = {
1321 /* SS-1000 */
1323 .iounit_bases = {
1324 0xfe0200000ULL,
1325 0xfe1200000ULL,
1326 0xfe2200000ULL,
1327 0xfe3200000ULL,
1330 .tcx_base = 0x820000000ULL,
1331 .slavio_base = 0xf00000000ULL,
1332 .ms_kb_base = 0xf00240000ULL,
1333 .serial_base = 0xf00200000ULL,
1334 .nvram_base = 0xf00280000ULL,
1335 .counter_base = 0xf00300000ULL,
1336 .espdma_base = 0x800081000ULL,
1337 .esp_base = 0x800080000ULL,
1338 .ledma_base = 0x800040000ULL,
1339 .le_base = 0x800060000ULL,
1340 .sbi_base = 0xf02800000ULL,
1341 .vram_size = 0x00100000,
1342 .nvram_size = 0x2000,
1343 .esp_irq = 3,
1344 .le_irq = 4,
1345 .clock_irq = 14,
1346 .clock1_irq = 10,
1347 .ms_kb_irq = 12,
1348 .ser_irq = 12,
1349 .machine_id = 0x80,
1350 .iounit_version = 0x03000000,
1351 .max_mem = 0xf00000000ULL,
1352 .default_cpu_model = "TI SuperSparc II",
1354 /* SS-2000 */
1356 .iounit_bases = {
1357 0xfe0200000ULL,
1358 0xfe1200000ULL,
1359 0xfe2200000ULL,
1360 0xfe3200000ULL,
1361 0xfe4200000ULL,
1363 .tcx_base = 0x820000000ULL,
1364 .slavio_base = 0xf00000000ULL,
1365 .ms_kb_base = 0xf00240000ULL,
1366 .serial_base = 0xf00200000ULL,
1367 .nvram_base = 0xf00280000ULL,
1368 .counter_base = 0xf00300000ULL,
1369 .espdma_base = 0x800081000ULL,
1370 .esp_base = 0x800080000ULL,
1371 .ledma_base = 0x800040000ULL,
1372 .le_base = 0x800060000ULL,
1373 .sbi_base = 0xf02800000ULL,
1374 .vram_size = 0x00100000,
1375 .nvram_size = 0x2000,
1376 .esp_irq = 3,
1377 .le_irq = 4,
1378 .clock_irq = 14,
1379 .clock1_irq = 10,
1380 .ms_kb_irq = 12,
1381 .ser_irq = 12,
1382 .machine_id = 0x80,
1383 .iounit_version = 0x03000000,
1384 .max_mem = 0xf00000000ULL,
1385 .default_cpu_model = "TI SuperSparc II",
1389 static void sun4d_hw_init(const struct sun4d_hwdef *hwdef, ram_addr_t RAM_size,
1390 const char *boot_device,
1391 DisplayState *ds, const char *kernel_filename,
1392 const char *kernel_cmdline,
1393 const char *initrd_filename, const char *cpu_model)
1395 CPUState *env, *envs[MAX_CPUS];
1396 unsigned int i;
1397 void *iounits[MAX_IOUNITS], *espdma, *ledma, *main_esp, *nvram, *sbi;
1398 qemu_irq *cpu_irqs[MAX_CPUS], *sbi_irq, *sbi_cpu_irq,
1399 *espdma_irq, *ledma_irq;
1400 qemu_irq *esp_reset, *le_reset;
1401 unsigned long prom_offset, kernel_size;
1402 int ret;
1403 char buf[1024];
1404 int drive_index;
1406 /* init CPUs */
1407 if (!cpu_model)
1408 cpu_model = hwdef->default_cpu_model;
1410 for (i = 0; i < smp_cpus; i++) {
1411 env = cpu_init(cpu_model);
1412 if (!env) {
1413 fprintf(stderr, "qemu: Unable to find Sparc CPU definition\n");
1414 exit(1);
1416 cpu_sparc_set_id(env, i);
1417 envs[i] = env;
1418 if (i == 0) {
1419 qemu_register_reset(main_cpu_reset, env);
1420 } else {
1421 qemu_register_reset(secondary_cpu_reset, env);
1422 env->halted = 1;
1424 cpu_irqs[i] = qemu_allocate_irqs(cpu_set_irq, envs[i], MAX_PILS);
1425 env->prom_addr = hwdef->slavio_base;
1428 for (i = smp_cpus; i < MAX_CPUS; i++)
1429 cpu_irqs[i] = qemu_allocate_irqs(dummy_cpu_set_irq, NULL, MAX_PILS);
1431 /* allocate RAM */
1432 if ((uint64_t)RAM_size > hwdef->max_mem) {
1433 fprintf(stderr,
1434 "qemu: Too much memory for this machine: %d, maximum %d\n",
1435 (unsigned int)(RAM_size / (1024 * 1024)),
1436 (unsigned int)(hwdef->max_mem / (1024 * 1024)));
1437 exit(1);
1439 cpu_register_physical_memory(0, RAM_size, 0);
1441 /* load boot prom */
1442 prom_offset = RAM_size + hwdef->vram_size;
1443 cpu_register_physical_memory(hwdef->slavio_base,
1444 (PROM_SIZE_MAX + TARGET_PAGE_SIZE - 1) &
1445 TARGET_PAGE_MASK,
1446 prom_offset | IO_MEM_ROM);
1448 if (bios_name == NULL)
1449 bios_name = PROM_FILENAME;
1450 snprintf(buf, sizeof(buf), "%s/%s", bios_dir, bios_name);
1451 ret = load_elf(buf, hwdef->slavio_base - PROM_VADDR, NULL, NULL, NULL);
1452 if (ret < 0 || ret > PROM_SIZE_MAX)
1453 ret = load_image_targphys(buf, hwdef->slavio_base, PROM_SIZE_MAX);
1454 if (ret < 0 || ret > PROM_SIZE_MAX) {
1455 fprintf(stderr, "qemu: could not load prom '%s'\n",
1456 buf);
1457 exit(1);
1460 /* set up devices */
1461 sbi = sbi_init(hwdef->sbi_base, &sbi_irq, &sbi_cpu_irq, cpu_irqs);
1463 for (i = 0; i < MAX_IOUNITS; i++)
1464 if (hwdef->iounit_bases[i] != (target_phys_addr_t)-1)
1465 iounits[i] = iommu_init(hwdef->iounit_bases[i],
1466 hwdef->iounit_version,
1467 sbi_irq[hwdef->me_irq]);
1469 espdma = sparc32_dma_init(hwdef->espdma_base, sbi_irq[hwdef->esp_irq],
1470 iounits[0], &espdma_irq, &esp_reset);
1472 ledma = sparc32_dma_init(hwdef->ledma_base, sbi_irq[hwdef->le_irq],
1473 iounits[0], &ledma_irq, &le_reset);
1475 if (graphic_depth != 8 && graphic_depth != 24) {
1476 fprintf(stderr, "qemu: Unsupported depth: %d\n", graphic_depth);
1477 exit (1);
1479 tcx_init(ds, hwdef->tcx_base, phys_ram_base + RAM_size, RAM_size,
1480 hwdef->vram_size, graphic_width, graphic_height, graphic_depth);
1482 if (nd_table[0].model == NULL
1483 || strcmp(nd_table[0].model, "lance") == 0) {
1484 lance_init(&nd_table[0], hwdef->le_base, ledma, *ledma_irq, le_reset);
1485 } else if (strcmp(nd_table[0].model, "?") == 0) {
1486 fprintf(stderr, "qemu: Supported NICs: lance\n");
1487 exit (1);
1488 } else {
1489 fprintf(stderr, "qemu: Unsupported NIC: %s\n", nd_table[0].model);
1490 exit (1);
1493 nvram = m48t59_init(sbi_irq[0], hwdef->nvram_base, 0,
1494 hwdef->nvram_size, 8);
1496 slavio_timer_init_all(hwdef->counter_base, sbi_irq[hwdef->clock1_irq],
1497 sbi_cpu_irq, smp_cpus);
1499 slavio_serial_ms_kbd_init(hwdef->ms_kb_base, sbi_irq[hwdef->ms_kb_irq],
1500 nographic);
1501 // Slavio TTYA (base+4, Linux ttyS0) is the first Qemu serial device
1502 // Slavio TTYB (base+0, Linux ttyS1) is the second Qemu serial device
1503 slavio_serial_init(hwdef->serial_base, sbi_irq[hwdef->ser_irq],
1504 serial_hds[1], serial_hds[0]);
1506 if (drive_get_max_bus(IF_SCSI) > 0) {
1507 fprintf(stderr, "qemu: too many SCSI bus\n");
1508 exit(1);
1511 main_esp = esp_init(hwdef->esp_base, 2,
1512 espdma_memory_read, espdma_memory_write,
1513 espdma, *espdma_irq, esp_reset);
1515 for (i = 0; i < ESP_MAX_DEVS; i++) {
1516 drive_index = drive_get_index(IF_SCSI, 0, i);
1517 if (drive_index == -1)
1518 continue;
1519 esp_scsi_attach(main_esp, drives_table[drive_index].bdrv, i);
1522 kernel_size = sun4m_load_kernel(kernel_filename, initrd_filename,
1523 RAM_size);
1525 nvram_init(nvram, (uint8_t *)&nd_table[0].macaddr, kernel_cmdline,
1526 boot_device, RAM_size, kernel_size, graphic_width,
1527 graphic_height, graphic_depth, hwdef->machine_id, "Sun4d");
1530 /* SPARCserver 1000 hardware initialisation */
1531 static void ss1000_init(ram_addr_t RAM_size, int vga_ram_size,
1532 const char *boot_device, DisplayState *ds,
1533 const char *kernel_filename, const char *kernel_cmdline,
1534 const char *initrd_filename, const char *cpu_model)
1536 sun4d_hw_init(&sun4d_hwdefs[0], RAM_size, boot_device, ds, kernel_filename,
1537 kernel_cmdline, initrd_filename, cpu_model);
1540 /* SPARCcenter 2000 hardware initialisation */
1541 static void ss2000_init(ram_addr_t RAM_size, int vga_ram_size,
1542 const char *boot_device, DisplayState *ds,
1543 const char *kernel_filename, const char *kernel_cmdline,
1544 const char *initrd_filename, const char *cpu_model)
1546 sun4d_hw_init(&sun4d_hwdefs[1], RAM_size, boot_device, ds, kernel_filename,
1547 kernel_cmdline, initrd_filename, cpu_model);
1550 QEMUMachine ss1000_machine = {
1551 .name = "SS-1000",
1552 .desc = "Sun4d platform, SPARCserver 1000",
1553 .init = ss1000_init,
1554 .ram_require = PROM_SIZE_MAX + TCX_SIZE,
1555 .nodisk_ok = 1,
1558 QEMUMachine ss2000_machine = {
1559 .name = "SS-2000",
1560 .desc = "Sun4d platform, SPARCcenter 2000",
1561 .init = ss2000_init,
1562 .ram_require = PROM_SIZE_MAX + TCX_SIZE,
1563 .nodisk_ok = 1,