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
25 #include "qemu-timer.h"
28 #include "sparc32_dma.h"
33 #include "firmware_abi.h"
42 * Sun4m architecture was used in the following machines:
44 * SPARCserver 6xxMP/xx
45 * SPARCclassic (SPARCclassic Server)(SPARCstation LC) (4/15),
46 * SPARCclassic X (4/10)
47 * SPARCstation LX/ZX (4/30)
48 * SPARCstation Voyager
49 * SPARCstation 10/xx, SPARCserver 10/xx
50 * SPARCstation 5, SPARCserver 5
51 * SPARCstation 20/xx, SPARCserver 20
54 * Sun4d architecture was used in the following machines:
59 * Sun4c architecture was used in the following machines:
60 * SPARCstation 1/1+, SPARCserver 1/1+
66 * See for example: http://www.sunhelp.org/faq/sunref1.html
70 #define DPRINTF(fmt, args...) \
71 do { printf("CPUIRQ: " fmt , ##args); } while (0)
73 #define DPRINTF(fmt, args...)
76 #define KERNEL_LOAD_ADDR 0x00004000
77 #define CMDLINE_ADDR 0x007ff000
78 #define INITRD_LOAD_ADDR 0x00800000
79 #define PROM_SIZE_MAX (512 * 1024)
80 #define PROM_VADDR 0xffd00000
81 #define PROM_FILENAME "openbios-sparc32"
82 #define CFG_ADDR 0xd00000510ULL
83 #define FW_CFG_SUN4M_DEPTH (FW_CFG_ARCH_LOCAL + 0x00)
85 // Control plane, 8-bit and 24-bit planes
86 #define TCX_SIZE (9 * 1024 * 1024)
92 target_phys_addr_t iommu_base
, slavio_base
;
93 target_phys_addr_t intctl_base
, counter_base
, nvram_base
, ms_kb_base
;
94 target_phys_addr_t serial_base
, fd_base
;
95 target_phys_addr_t idreg_base
, dma_base
, esp_base
, le_base
;
96 target_phys_addr_t tcx_base
, cs_base
, apc_base
, aux1_base
, aux2_base
;
97 target_phys_addr_t ecc_base
;
99 long vram_size
, nvram_size
;
100 // IRQ numbers are not PIL ones, but master interrupt controller
101 // register bit numbers
102 int esp_irq
, le_irq
, clock_irq
, clock1_irq
;
103 int ser_irq
, ms_kb_irq
, fd_irq
, me_irq
, cs_irq
, ecc_irq
;
104 uint8_t nvram_machine_id
;
106 uint32_t iommu_version
;
107 uint32_t intbit_to_level
[32];
109 const char * const default_cpu_model
;
112 #define MAX_IOUNITS 5
115 target_phys_addr_t iounit_bases
[MAX_IOUNITS
], slavio_base
;
116 target_phys_addr_t counter_base
, nvram_base
, ms_kb_base
;
117 target_phys_addr_t serial_base
;
118 target_phys_addr_t espdma_base
, esp_base
;
119 target_phys_addr_t ledma_base
, le_base
;
120 target_phys_addr_t tcx_base
;
121 target_phys_addr_t sbi_base
;
122 unsigned long vram_size
, nvram_size
;
123 // IRQ numbers are not PIL ones, but SBI register bit numbers
124 int esp_irq
, le_irq
, clock_irq
, clock1_irq
;
125 int ser_irq
, ms_kb_irq
, me_irq
;
126 uint8_t nvram_machine_id
;
128 uint32_t iounit_version
;
130 const char * const default_cpu_model
;
134 target_phys_addr_t iommu_base
, slavio_base
;
135 target_phys_addr_t intctl_base
, counter_base
, nvram_base
, ms_kb_base
;
136 target_phys_addr_t serial_base
, fd_base
;
137 target_phys_addr_t idreg_base
, dma_base
, esp_base
, le_base
;
138 target_phys_addr_t tcx_base
, aux1_base
;
139 long vram_size
, nvram_size
;
140 // IRQ numbers are not PIL ones, but master interrupt controller
141 // register bit numbers
142 int esp_irq
, le_irq
, clock_irq
, clock1_irq
;
143 int ser_irq
, ms_kb_irq
, fd_irq
, me_irq
;
144 uint8_t nvram_machine_id
;
146 uint32_t iommu_version
;
147 uint32_t intbit_to_level
[32];
149 const char * const default_cpu_model
;
152 int DMA_get_channel_mode (int nchan
)
156 int DMA_read_memory (int nchan
, void *buf
, int pos
, int size
)
160 int DMA_write_memory (int nchan
, void *buf
, int pos
, int size
)
164 void DMA_hold_DREQ (int nchan
) {}
165 void DMA_release_DREQ (int nchan
) {}
166 void DMA_schedule(int nchan
) {}
167 void DMA_init (int high_page_enable
) {}
168 void DMA_register_channel (int nchan
,
169 DMA_transfer_handler transfer_handler
,
174 static int nvram_boot_set(void *opaque
, const char *boot_device
)
177 uint8_t image
[sizeof(ohwcfg_v3_t
)];
178 ohwcfg_v3_t
*header
= (ohwcfg_v3_t
*)&image
;
179 m48t59_t
*nvram
= (m48t59_t
*)opaque
;
181 for (i
= 0; i
< sizeof(image
); i
++)
182 image
[i
] = m48t59_read(nvram
, i
) & 0xff;
184 pstrcpy((char *)header
->boot_devices
, sizeof(header
->boot_devices
),
186 header
->nboot_devices
= strlen(boot_device
) & 0xff;
187 header
->crc
= cpu_to_be16(OHW_compute_crc(header
, 0x00, 0xF8));
189 for (i
= 0; i
< sizeof(image
); i
++)
190 m48t59_write(nvram
, i
, image
[i
]);
195 static void nvram_init(m48t59_t
*nvram
, uint8_t *macaddr
, const char *cmdline
,
196 const char *boot_devices
, ram_addr_t RAM_size
,
197 uint32_t kernel_size
,
198 int width
, int height
, int depth
,
199 int nvram_machine_id
, const char *arch
)
203 uint8_t image
[0x1ff0];
204 ohwcfg_v3_t
*header
= (ohwcfg_v3_t
*)&image
;
205 struct sparc_arch_cfg
*sparc_header
;
206 struct OpenBIOS_nvpart_v1
*part_header
;
208 memset(image
, '\0', sizeof(image
));
210 // Try to match PPC NVRAM
211 pstrcpy((char *)header
->struct_ident
, sizeof(header
->struct_ident
),
213 header
->struct_version
= cpu_to_be32(3); /* structure v3 */
215 header
->nvram_size
= cpu_to_be16(0x2000);
216 header
->nvram_arch_ptr
= cpu_to_be16(sizeof(ohwcfg_v3_t
));
217 header
->nvram_arch_size
= cpu_to_be16(sizeof(struct sparc_arch_cfg
));
218 pstrcpy((char *)header
->arch
, sizeof(header
->arch
), arch
);
219 header
->nb_cpus
= smp_cpus
& 0xff;
220 header
->RAM0_base
= 0;
221 header
->RAM0_size
= cpu_to_be64((uint64_t)RAM_size
);
222 pstrcpy((char *)header
->boot_devices
, sizeof(header
->boot_devices
),
224 header
->nboot_devices
= strlen(boot_devices
) & 0xff;
225 header
->kernel_image
= cpu_to_be64((uint64_t)KERNEL_LOAD_ADDR
);
226 header
->kernel_size
= cpu_to_be64((uint64_t)kernel_size
);
228 pstrcpy_targphys(CMDLINE_ADDR
, TARGET_PAGE_SIZE
, cmdline
);
229 header
->cmdline
= cpu_to_be64((uint64_t)CMDLINE_ADDR
);
230 header
->cmdline_size
= cpu_to_be64((uint64_t)strlen(cmdline
));
232 // XXX add initrd_image, initrd_size
233 header
->width
= cpu_to_be16(width
);
234 header
->height
= cpu_to_be16(height
);
235 header
->depth
= cpu_to_be16(depth
);
237 header
->graphic_flags
= cpu_to_be16(OHW_GF_NOGRAPHICS
);
239 header
->crc
= cpu_to_be16(OHW_compute_crc(header
, 0x00, 0xF8));
241 // Architecture specific header
242 start
= sizeof(ohwcfg_v3_t
);
243 sparc_header
= (struct sparc_arch_cfg
*)&image
[start
];
244 sparc_header
->valid
= 0;
245 start
+= sizeof(struct sparc_arch_cfg
);
247 // OpenBIOS nvram variables
248 // Variable partition
249 part_header
= (struct OpenBIOS_nvpart_v1
*)&image
[start
];
250 part_header
->signature
= OPENBIOS_PART_SYSTEM
;
251 pstrcpy(part_header
->name
, sizeof(part_header
->name
), "system");
253 end
= start
+ sizeof(struct OpenBIOS_nvpart_v1
);
254 for (i
= 0; i
< nb_prom_envs
; i
++)
255 end
= OpenBIOS_set_var(image
, end
, prom_envs
[i
]);
260 end
= start
+ ((end
- start
+ 15) & ~15);
261 OpenBIOS_finish_partition(part_header
, end
- start
);
265 part_header
= (struct OpenBIOS_nvpart_v1
*)&image
[start
];
266 part_header
->signature
= OPENBIOS_PART_FREE
;
267 pstrcpy(part_header
->name
, sizeof(part_header
->name
), "free");
270 OpenBIOS_finish_partition(part_header
, end
- start
);
272 Sun_init_header((struct Sun_nvram
*)&image
[0x1fd8], macaddr
,
275 for (i
= 0; i
< sizeof(image
); i
++)
276 m48t59_write(nvram
, i
, image
[i
]);
278 qemu_register_boot_set(nvram_boot_set
, nvram
);
281 static void *slavio_intctl
;
286 slavio_pic_info(slavio_intctl
);
292 slavio_irq_info(slavio_intctl
);
295 void cpu_check_irqs(CPUState
*env
)
297 if (env
->pil_in
&& (env
->interrupt_index
== 0 ||
298 (env
->interrupt_index
& ~15) == TT_EXTINT
)) {
301 for (i
= 15; i
> 0; i
--) {
302 if (env
->pil_in
& (1 << i
)) {
303 int old_interrupt
= env
->interrupt_index
;
305 env
->interrupt_index
= TT_EXTINT
| i
;
306 if (old_interrupt
!= env
->interrupt_index
) {
307 DPRINTF("Set CPU IRQ %d\n", i
);
308 cpu_interrupt(env
, CPU_INTERRUPT_HARD
);
313 } else if (!env
->pil_in
&& (env
->interrupt_index
& ~15) == TT_EXTINT
) {
314 DPRINTF("Reset CPU IRQ %d\n", env
->interrupt_index
& 15);
315 env
->interrupt_index
= 0;
316 cpu_reset_interrupt(env
, CPU_INTERRUPT_HARD
);
320 static void cpu_set_irq(void *opaque
, int irq
, int level
)
322 CPUState
*env
= opaque
;
325 DPRINTF("Raise CPU IRQ %d\n", irq
);
327 env
->pil_in
|= 1 << irq
;
330 DPRINTF("Lower CPU IRQ %d\n", irq
);
331 env
->pil_in
&= ~(1 << irq
);
336 static void dummy_cpu_set_irq(void *opaque
, int irq
, int level
)
340 static void *slavio_misc
;
342 void qemu_system_powerdown(void)
344 slavio_set_power_fail(slavio_misc
, 1);
347 static void main_cpu_reset(void *opaque
)
349 CPUState
*env
= opaque
;
355 static void secondary_cpu_reset(void *opaque
)
357 CPUState
*env
= opaque
;
363 static unsigned long sun4m_load_kernel(const char *kernel_filename
,
364 const char *initrd_filename
,
369 long initrd_size
, kernel_size
;
371 linux_boot
= (kernel_filename
!= NULL
);
375 kernel_size
= load_elf(kernel_filename
, -0xf0000000ULL
, NULL
, NULL
,
378 kernel_size
= load_aout(kernel_filename
, KERNEL_LOAD_ADDR
,
379 RAM_size
- KERNEL_LOAD_ADDR
);
381 kernel_size
= load_image_targphys(kernel_filename
,
383 RAM_size
- KERNEL_LOAD_ADDR
);
384 if (kernel_size
< 0) {
385 fprintf(stderr
, "qemu: could not load kernel '%s'\n",
392 if (initrd_filename
) {
393 initrd_size
= load_image_targphys(initrd_filename
,
395 RAM_size
- INITRD_LOAD_ADDR
);
396 if (initrd_size
< 0) {
397 fprintf(stderr
, "qemu: could not load initial ram disk '%s'\n",
402 if (initrd_size
> 0) {
403 for (i
= 0; i
< 64 * TARGET_PAGE_SIZE
; i
+= TARGET_PAGE_SIZE
) {
404 if (ldl_phys(KERNEL_LOAD_ADDR
+ i
) == 0x48647253) { // HdrS
405 stl_phys(KERNEL_LOAD_ADDR
+ i
+ 16, INITRD_LOAD_ADDR
);
406 stl_phys(KERNEL_LOAD_ADDR
+ i
+ 20, initrd_size
);
415 static void sun4m_hw_init(const struct sun4m_hwdef
*hwdef
, ram_addr_t RAM_size
,
416 const char *boot_device
,
417 DisplayState
*ds
, const char *kernel_filename
,
418 const char *kernel_cmdline
,
419 const char *initrd_filename
, const char *cpu_model
)
422 CPUState
*env
, *envs
[MAX_CPUS
];
424 void *iommu
, *espdma
, *ledma
, *main_esp
, *nvram
;
425 qemu_irq
*cpu_irqs
[MAX_CPUS
], *slavio_irq
, *slavio_cpu_irq
,
426 *espdma_irq
, *ledma_irq
;
427 qemu_irq
*esp_reset
, *le_reset
;
429 unsigned long prom_offset
, kernel_size
;
432 BlockDriverState
*fd
[MAX_FD
];
438 cpu_model
= hwdef
->default_cpu_model
;
440 for(i
= 0; i
< smp_cpus
; i
++) {
441 env
= cpu_init(cpu_model
);
443 fprintf(stderr
, "qemu: Unable to find Sparc CPU definition\n");
446 cpu_sparc_set_id(env
, i
);
449 qemu_register_reset(main_cpu_reset
, env
);
451 qemu_register_reset(secondary_cpu_reset
, env
);
454 cpu_irqs
[i
] = qemu_allocate_irqs(cpu_set_irq
, envs
[i
], MAX_PILS
);
455 env
->prom_addr
= hwdef
->slavio_base
;
458 for (i
= smp_cpus
; i
< MAX_CPUS
; i
++)
459 cpu_irqs
[i
] = qemu_allocate_irqs(dummy_cpu_set_irq
, NULL
, MAX_PILS
);
463 if ((uint64_t)RAM_size
> hwdef
->max_mem
) {
465 "qemu: Too much memory for this machine: %d, maximum %d\n",
466 (unsigned int)(RAM_size
/ (1024 * 1024)),
467 (unsigned int)(hwdef
->max_mem
/ (1024 * 1024)));
470 cpu_register_physical_memory(0, RAM_size
, 0);
473 prom_offset
= RAM_size
+ hwdef
->vram_size
;
474 cpu_register_physical_memory(hwdef
->slavio_base
,
475 (PROM_SIZE_MAX
+ TARGET_PAGE_SIZE
- 1) &
477 prom_offset
| IO_MEM_ROM
);
479 if (bios_name
== NULL
)
480 bios_name
= PROM_FILENAME
;
481 snprintf(buf
, sizeof(buf
), "%s/%s", bios_dir
, bios_name
);
482 ret
= load_elf(buf
, hwdef
->slavio_base
- PROM_VADDR
, NULL
, NULL
, NULL
);
483 if (ret
< 0 || ret
> PROM_SIZE_MAX
)
484 ret
= load_image_targphys(buf
, hwdef
->slavio_base
, PROM_SIZE_MAX
);
485 if (ret
< 0 || ret
> PROM_SIZE_MAX
) {
486 fprintf(stderr
, "qemu: could not load prom '%s'\n",
490 prom_offset
+= (ret
+ TARGET_PAGE_SIZE
- 1) & TARGET_PAGE_MASK
;
493 slavio_intctl
= slavio_intctl_init(hwdef
->intctl_base
,
494 hwdef
->intctl_base
+ 0x10000ULL
,
495 &hwdef
->intbit_to_level
[0],
496 &slavio_irq
, &slavio_cpu_irq
,
500 if (hwdef
->idreg_base
!= (target_phys_addr_t
)-1) {
501 static const uint8_t idreg_data
[] = { 0xfe, 0x81, 0x01, 0x03 };
503 cpu_register_physical_memory(hwdef
->idreg_base
, sizeof(idreg_data
),
504 prom_offset
| IO_MEM_ROM
);
505 cpu_physical_memory_write_rom(hwdef
->idreg_base
, idreg_data
,
509 iommu
= iommu_init(hwdef
->iommu_base
, hwdef
->iommu_version
,
510 slavio_irq
[hwdef
->me_irq
]);
512 espdma
= sparc32_dma_init(hwdef
->dma_base
, slavio_irq
[hwdef
->esp_irq
],
513 iommu
, &espdma_irq
, &esp_reset
);
515 ledma
= sparc32_dma_init(hwdef
->dma_base
+ 16ULL,
516 slavio_irq
[hwdef
->le_irq
], iommu
, &ledma_irq
,
519 if (graphic_depth
!= 8 && graphic_depth
!= 24) {
520 fprintf(stderr
, "qemu: Unsupported depth: %d\n", graphic_depth
);
523 tcx_init(ds
, hwdef
->tcx_base
, phys_ram_base
+ RAM_size
, RAM_size
,
524 hwdef
->vram_size
, graphic_width
, graphic_height
, graphic_depth
);
526 if (nd_table
[0].model
== NULL
527 || strcmp(nd_table
[0].model
, "lance") == 0) {
528 lance_init(&nd_table
[0], hwdef
->le_base
, ledma
, *ledma_irq
, le_reset
);
529 } else if (strcmp(nd_table
[0].model
, "?") == 0) {
530 fprintf(stderr
, "qemu: Supported NICs: lance\n");
533 fprintf(stderr
, "qemu: Unsupported NIC: %s\n", nd_table
[0].model
);
537 nvram
= m48t59_init(slavio_irq
[0], hwdef
->nvram_base
, 0,
538 hwdef
->nvram_size
, 8);
540 slavio_timer_init_all(hwdef
->counter_base
, slavio_irq
[hwdef
->clock1_irq
],
541 slavio_cpu_irq
, smp_cpus
);
543 slavio_serial_ms_kbd_init(hwdef
->ms_kb_base
, slavio_irq
[hwdef
->ms_kb_irq
],
545 // Slavio TTYA (base+4, Linux ttyS0) is the first Qemu serial device
546 // Slavio TTYB (base+0, Linux ttyS1) is the second Qemu serial device
547 slavio_serial_init(hwdef
->serial_base
, slavio_irq
[hwdef
->ser_irq
],
548 serial_hds
[1], serial_hds
[0]);
550 slavio_misc
= slavio_misc_init(hwdef
->slavio_base
, hwdef
->apc_base
,
551 hwdef
->aux1_base
, hwdef
->aux2_base
,
552 slavio_irq
[hwdef
->me_irq
], envs
[0],
555 if (hwdef
->fd_base
!= (target_phys_addr_t
)-1) {
556 /* there is zero or one floppy drive */
557 memset(fd
, 0, sizeof(fd
));
558 drive_index
= drive_get_index(IF_FLOPPY
, 0, 0);
559 if (drive_index
!= -1)
560 fd
[0] = drives_table
[drive_index
].bdrv
;
562 sun4m_fdctrl_init(slavio_irq
[hwdef
->fd_irq
], hwdef
->fd_base
, fd
,
566 if (drive_get_max_bus(IF_SCSI
) > 0) {
567 fprintf(stderr
, "qemu: too many SCSI bus\n");
571 main_esp
= esp_init(hwdef
->esp_base
, 2,
572 espdma_memory_read
, espdma_memory_write
,
573 espdma
, *espdma_irq
, esp_reset
);
575 for (i
= 0; i
< ESP_MAX_DEVS
; i
++) {
576 drive_index
= drive_get_index(IF_SCSI
, 0, i
);
577 if (drive_index
== -1)
579 esp_scsi_attach(main_esp
, drives_table
[drive_index
].bdrv
, i
);
582 if (hwdef
->cs_base
!= (target_phys_addr_t
)-1)
583 cs_init(hwdef
->cs_base
, hwdef
->cs_irq
, slavio_intctl
);
585 kernel_size
= sun4m_load_kernel(kernel_filename
, initrd_filename
,
588 nvram_init(nvram
, (uint8_t *)&nd_table
[0].macaddr
, kernel_cmdline
,
589 boot_device
, RAM_size
, kernel_size
, graphic_width
,
590 graphic_height
, graphic_depth
, hwdef
->nvram_machine_id
,
593 if (hwdef
->ecc_base
!= (target_phys_addr_t
)-1)
594 ecc_init(hwdef
->ecc_base
, slavio_irq
[hwdef
->ecc_irq
],
597 fw_cfg
= fw_cfg_init(0, 0, CFG_ADDR
, CFG_ADDR
+ 2);
598 fw_cfg_add_i32(fw_cfg
, FW_CFG_ID
, 1);
599 fw_cfg_add_i64(fw_cfg
, FW_CFG_RAM_SIZE
, (uint64_t)ram_size
);
600 fw_cfg_add_i16(fw_cfg
, FW_CFG_MACHINE_ID
, hwdef
->machine_id
);
601 fw_cfg_add_i16(fw_cfg
, FW_CFG_SUN4M_DEPTH
, graphic_depth
);
619 static const struct sun4m_hwdef sun4m_hwdefs
[] = {
622 .iommu_base
= 0x10000000,
623 .tcx_base
= 0x50000000,
624 .cs_base
= 0x6c000000,
625 .slavio_base
= 0x70000000,
626 .ms_kb_base
= 0x71000000,
627 .serial_base
= 0x71100000,
628 .nvram_base
= 0x71200000,
629 .fd_base
= 0x71400000,
630 .counter_base
= 0x71d00000,
631 .intctl_base
= 0x71e00000,
632 .idreg_base
= 0x78000000,
633 .dma_base
= 0x78400000,
634 .esp_base
= 0x78800000,
635 .le_base
= 0x78c00000,
636 .apc_base
= 0x6a000000,
637 .aux1_base
= 0x71900000,
638 .aux2_base
= 0x71910000,
640 .vram_size
= 0x00100000,
641 .nvram_size
= 0x2000,
651 .nvram_machine_id
= 0x80,
652 .machine_id
= ss5_id
,
653 .iommu_version
= 0x05000000,
655 2, 3, 5, 7, 9, 11, 0, 14, 3, 5, 7, 9, 11, 13, 12, 12,
656 6, 0, 4, 10, 8, 0, 11, 0, 0, 0, 0, 0, 15, 0, 15, 0,
658 .max_mem
= 0x10000000,
659 .default_cpu_model
= "Fujitsu MB86904",
663 .iommu_base
= 0xfe0000000ULL
,
664 .tcx_base
= 0xe20000000ULL
,
666 .slavio_base
= 0xff0000000ULL
,
667 .ms_kb_base
= 0xff1000000ULL
,
668 .serial_base
= 0xff1100000ULL
,
669 .nvram_base
= 0xff1200000ULL
,
670 .fd_base
= 0xff1700000ULL
,
671 .counter_base
= 0xff1300000ULL
,
672 .intctl_base
= 0xff1400000ULL
,
673 .idreg_base
= 0xef0000000ULL
,
674 .dma_base
= 0xef0400000ULL
,
675 .esp_base
= 0xef0800000ULL
,
676 .le_base
= 0xef0c00000ULL
,
677 .apc_base
= 0xefa000000ULL
, // XXX should not exist
678 .aux1_base
= 0xff1800000ULL
,
679 .aux2_base
= 0xff1a01000ULL
,
680 .ecc_base
= 0xf00000000ULL
,
681 .ecc_version
= 0x10000000, // version 0, implementation 1
682 .vram_size
= 0x00100000,
683 .nvram_size
= 0x2000,
694 .nvram_machine_id
= 0x72,
695 .machine_id
= ss10_id
,
696 .iommu_version
= 0x03000000,
698 2, 3, 5, 7, 9, 11, 0, 14, 3, 5, 7, 9, 11, 13, 12, 12,
699 6, 0, 4, 10, 8, 0, 11, 0, 0, 0, 0, 0, 15, 0, 15, 0,
701 .max_mem
= 0xf00000000ULL
,
702 .default_cpu_model
= "TI SuperSparc II",
706 .iommu_base
= 0xfe0000000ULL
,
707 .tcx_base
= 0xe20000000ULL
,
709 .slavio_base
= 0xff0000000ULL
,
710 .ms_kb_base
= 0xff1000000ULL
,
711 .serial_base
= 0xff1100000ULL
,
712 .nvram_base
= 0xff1200000ULL
,
714 .counter_base
= 0xff1300000ULL
,
715 .intctl_base
= 0xff1400000ULL
,
717 .dma_base
= 0xef0081000ULL
,
718 .esp_base
= 0xef0080000ULL
,
719 .le_base
= 0xef0060000ULL
,
720 .apc_base
= 0xefa000000ULL
, // XXX should not exist
721 .aux1_base
= 0xff1800000ULL
,
722 .aux2_base
= 0xff1a01000ULL
, // XXX should not exist
723 .ecc_base
= 0xf00000000ULL
,
724 .ecc_version
= 0x00000000, // version 0, implementation 0
725 .vram_size
= 0x00100000,
726 .nvram_size
= 0x2000,
737 .nvram_machine_id
= 0x71,
738 .machine_id
= ss600mp_id
,
739 .iommu_version
= 0x01000000,
741 2, 3, 5, 7, 9, 11, 0, 14, 3, 5, 7, 9, 11, 13, 12, 12,
742 6, 0, 4, 10, 8, 0, 11, 0, 0, 0, 0, 0, 15, 0, 15, 0,
744 .max_mem
= 0xf00000000ULL
,
745 .default_cpu_model
= "TI SuperSparc II",
749 .iommu_base
= 0xfe0000000ULL
,
750 .tcx_base
= 0xe20000000ULL
,
752 .slavio_base
= 0xff0000000ULL
,
753 .ms_kb_base
= 0xff1000000ULL
,
754 .serial_base
= 0xff1100000ULL
,
755 .nvram_base
= 0xff1200000ULL
,
756 .fd_base
= 0xff1700000ULL
,
757 .counter_base
= 0xff1300000ULL
,
758 .intctl_base
= 0xff1400000ULL
,
759 .idreg_base
= 0xef0000000ULL
,
760 .dma_base
= 0xef0400000ULL
,
761 .esp_base
= 0xef0800000ULL
,
762 .le_base
= 0xef0c00000ULL
,
763 .apc_base
= 0xefa000000ULL
, // XXX should not exist
764 .aux1_base
= 0xff1800000ULL
,
765 .aux2_base
= 0xff1a01000ULL
,
766 .ecc_base
= 0xf00000000ULL
,
767 .ecc_version
= 0x20000000, // version 0, implementation 2
768 .vram_size
= 0x00100000,
769 .nvram_size
= 0x2000,
780 .nvram_machine_id
= 0x72,
781 .machine_id
= ss20_id
,
782 .iommu_version
= 0x13000000,
784 2, 3, 5, 7, 9, 11, 0, 14, 3, 5, 7, 9, 11, 13, 12, 12,
785 6, 0, 4, 10, 8, 0, 11, 0, 0, 0, 0, 0, 15, 0, 15, 0,
787 .max_mem
= 0xf00000000ULL
,
788 .default_cpu_model
= "TI SuperSparc II",
792 .iommu_base
= 0x10000000,
793 .tcx_base
= 0x50000000,
795 .slavio_base
= 0x70000000,
796 .ms_kb_base
= 0x71000000,
797 .serial_base
= 0x71100000,
798 .nvram_base
= 0x71200000,
799 .fd_base
= 0x71400000,
800 .counter_base
= 0x71d00000,
801 .intctl_base
= 0x71e00000,
802 .idreg_base
= 0x78000000,
803 .dma_base
= 0x78400000,
804 .esp_base
= 0x78800000,
805 .le_base
= 0x78c00000,
806 .apc_base
= 0x71300000, // pmc
807 .aux1_base
= 0x71900000,
808 .aux2_base
= 0x71910000,
810 .vram_size
= 0x00100000,
811 .nvram_size
= 0x2000,
821 .nvram_machine_id
= 0x80,
822 .machine_id
= vger_id
,
823 .iommu_version
= 0x05000000,
825 2, 3, 5, 7, 9, 11, 0, 14, 3, 5, 7, 9, 11, 13, 12, 12,
826 6, 0, 4, 10, 8, 0, 11, 0, 0, 0, 0, 0, 15, 0, 15, 0,
828 .max_mem
= 0x10000000,
829 .default_cpu_model
= "Fujitsu MB86904",
833 .iommu_base
= 0x10000000,
834 .tcx_base
= 0x50000000,
836 .slavio_base
= 0x70000000,
837 .ms_kb_base
= 0x71000000,
838 .serial_base
= 0x71100000,
839 .nvram_base
= 0x71200000,
840 .fd_base
= 0x71400000,
841 .counter_base
= 0x71d00000,
842 .intctl_base
= 0x71e00000,
843 .idreg_base
= 0x78000000,
844 .dma_base
= 0x78400000,
845 .esp_base
= 0x78800000,
846 .le_base
= 0x78c00000,
848 .aux1_base
= 0x71900000,
849 .aux2_base
= 0x71910000,
851 .vram_size
= 0x00100000,
852 .nvram_size
= 0x2000,
862 .nvram_machine_id
= 0x80,
864 .iommu_version
= 0x04000000,
866 2, 3, 5, 7, 9, 11, 0, 14, 3, 5, 7, 9, 11, 13, 12, 12,
867 6, 0, 4, 10, 8, 0, 11, 0, 0, 0, 0, 0, 15, 0, 15, 0,
869 .max_mem
= 0x10000000,
870 .default_cpu_model
= "TI MicroSparc I",
874 .iommu_base
= 0x10000000,
875 .tcx_base
= 0x50000000,
876 .cs_base
= 0x6c000000,
877 .slavio_base
= 0x70000000,
878 .ms_kb_base
= 0x71000000,
879 .serial_base
= 0x71100000,
880 .nvram_base
= 0x71200000,
881 .fd_base
= 0x71400000,
882 .counter_base
= 0x71d00000,
883 .intctl_base
= 0x71e00000,
884 .idreg_base
= 0x78000000,
885 .dma_base
= 0x78400000,
886 .esp_base
= 0x78800000,
887 .le_base
= 0x78c00000,
888 .apc_base
= 0x6a000000,
889 .aux1_base
= 0x71900000,
890 .aux2_base
= 0x71910000,
892 .vram_size
= 0x00100000,
893 .nvram_size
= 0x2000,
903 .nvram_machine_id
= 0x80,
904 .machine_id
= ss4_id
,
905 .iommu_version
= 0x05000000,
907 2, 3, 5, 7, 9, 11, 0, 14, 3, 5, 7, 9, 11, 13, 12, 12,
908 6, 0, 4, 10, 8, 0, 11, 0, 0, 0, 0, 0, 15, 0, 15, 0,
910 .max_mem
= 0x10000000,
911 .default_cpu_model
= "Fujitsu MB86904",
915 .iommu_base
= 0x10000000,
916 .tcx_base
= 0x50000000,
918 .slavio_base
= 0x70000000,
919 .ms_kb_base
= 0x71000000,
920 .serial_base
= 0x71100000,
921 .nvram_base
= 0x71200000,
922 .fd_base
= 0x71400000,
923 .counter_base
= 0x71d00000,
924 .intctl_base
= 0x71e00000,
925 .idreg_base
= 0x78000000,
926 .dma_base
= 0x78400000,
927 .esp_base
= 0x78800000,
928 .le_base
= 0x78c00000,
929 .apc_base
= 0x6a000000,
930 .aux1_base
= 0x71900000,
931 .aux2_base
= 0x71910000,
933 .vram_size
= 0x00100000,
934 .nvram_size
= 0x2000,
944 .nvram_machine_id
= 0x80,
945 .machine_id
= scls_id
,
946 .iommu_version
= 0x05000000,
948 2, 3, 5, 7, 9, 11, 0, 14, 3, 5, 7, 9, 11, 13, 12, 12,
949 6, 0, 4, 10, 8, 0, 11, 0, 0, 0, 0, 0, 15, 0, 15, 0,
951 .max_mem
= 0x10000000,
952 .default_cpu_model
= "TI MicroSparc I",
956 .iommu_base
= 0x10000000,
957 .tcx_base
= 0x50000000, // XXX
959 .slavio_base
= 0x70000000,
960 .ms_kb_base
= 0x71000000,
961 .serial_base
= 0x71100000,
962 .nvram_base
= 0x71200000,
963 .fd_base
= 0x71400000,
964 .counter_base
= 0x71d00000,
965 .intctl_base
= 0x71e00000,
966 .idreg_base
= 0x78000000,
967 .dma_base
= 0x78400000,
968 .esp_base
= 0x78800000,
969 .le_base
= 0x78c00000,
970 .apc_base
= 0x6a000000,
971 .aux1_base
= 0x71900000,
972 .aux2_base
= 0x71910000,
974 .vram_size
= 0x00100000,
975 .nvram_size
= 0x2000,
985 .nvram_machine_id
= 0x80,
986 .machine_id
= sbook_id
,
987 .iommu_version
= 0x05000000,
989 2, 3, 5, 7, 9, 11, 0, 14, 3, 5, 7, 9, 11, 13, 12, 12,
990 6, 0, 4, 10, 8, 0, 11, 0, 0, 0, 0, 0, 15, 0, 15, 0,
992 .max_mem
= 0x10000000,
993 .default_cpu_model
= "TI MicroSparc I",
997 /* SPARCstation 5 hardware initialisation */
998 static void ss5_init(ram_addr_t RAM_size
, int vga_ram_size
,
999 const char *boot_device
, DisplayState
*ds
,
1000 const char *kernel_filename
, const char *kernel_cmdline
,
1001 const char *initrd_filename
, const char *cpu_model
)
1003 sun4m_hw_init(&sun4m_hwdefs
[0], RAM_size
, boot_device
, ds
, kernel_filename
,
1004 kernel_cmdline
, initrd_filename
, cpu_model
);
1007 /* SPARCstation 10 hardware initialisation */
1008 static void ss10_init(ram_addr_t RAM_size
, int vga_ram_size
,
1009 const char *boot_device
, DisplayState
*ds
,
1010 const char *kernel_filename
, const char *kernel_cmdline
,
1011 const char *initrd_filename
, const char *cpu_model
)
1013 sun4m_hw_init(&sun4m_hwdefs
[1], RAM_size
, boot_device
, ds
, kernel_filename
,
1014 kernel_cmdline
, initrd_filename
, cpu_model
);
1017 /* SPARCserver 600MP hardware initialisation */
1018 static void ss600mp_init(ram_addr_t RAM_size
, int vga_ram_size
,
1019 const char *boot_device
, DisplayState
*ds
,
1020 const char *kernel_filename
,
1021 const char *kernel_cmdline
,
1022 const char *initrd_filename
, const char *cpu_model
)
1024 sun4m_hw_init(&sun4m_hwdefs
[2], RAM_size
, boot_device
, ds
, kernel_filename
,
1025 kernel_cmdline
, initrd_filename
, cpu_model
);
1028 /* SPARCstation 20 hardware initialisation */
1029 static void ss20_init(ram_addr_t RAM_size
, int vga_ram_size
,
1030 const char *boot_device
, DisplayState
*ds
,
1031 const char *kernel_filename
, const char *kernel_cmdline
,
1032 const char *initrd_filename
, const char *cpu_model
)
1034 sun4m_hw_init(&sun4m_hwdefs
[3], RAM_size
, boot_device
, ds
, kernel_filename
,
1035 kernel_cmdline
, initrd_filename
, cpu_model
);
1038 /* SPARCstation Voyager hardware initialisation */
1039 static void vger_init(ram_addr_t RAM_size
, int vga_ram_size
,
1040 const char *boot_device
, DisplayState
*ds
,
1041 const char *kernel_filename
, const char *kernel_cmdline
,
1042 const char *initrd_filename
, const char *cpu_model
)
1044 sun4m_hw_init(&sun4m_hwdefs
[4], RAM_size
, boot_device
, ds
, kernel_filename
,
1045 kernel_cmdline
, initrd_filename
, cpu_model
);
1048 /* SPARCstation LX hardware initialisation */
1049 static void ss_lx_init(ram_addr_t RAM_size
, int vga_ram_size
,
1050 const char *boot_device
, DisplayState
*ds
,
1051 const char *kernel_filename
, const char *kernel_cmdline
,
1052 const char *initrd_filename
, const char *cpu_model
)
1054 sun4m_hw_init(&sun4m_hwdefs
[5], RAM_size
, boot_device
, ds
, kernel_filename
,
1055 kernel_cmdline
, initrd_filename
, cpu_model
);
1058 /* SPARCstation 4 hardware initialisation */
1059 static void ss4_init(ram_addr_t RAM_size
, int vga_ram_size
,
1060 const char *boot_device
, DisplayState
*ds
,
1061 const char *kernel_filename
, const char *kernel_cmdline
,
1062 const char *initrd_filename
, const char *cpu_model
)
1064 sun4m_hw_init(&sun4m_hwdefs
[6], RAM_size
, boot_device
, ds
, kernel_filename
,
1065 kernel_cmdline
, initrd_filename
, cpu_model
);
1068 /* SPARCClassic hardware initialisation */
1069 static void scls_init(ram_addr_t RAM_size
, int vga_ram_size
,
1070 const char *boot_device
, DisplayState
*ds
,
1071 const char *kernel_filename
, const char *kernel_cmdline
,
1072 const char *initrd_filename
, const char *cpu_model
)
1074 sun4m_hw_init(&sun4m_hwdefs
[7], RAM_size
, boot_device
, ds
, kernel_filename
,
1075 kernel_cmdline
, initrd_filename
, cpu_model
);
1078 /* SPARCbook hardware initialisation */
1079 static void sbook_init(ram_addr_t RAM_size
, int vga_ram_size
,
1080 const char *boot_device
, DisplayState
*ds
,
1081 const char *kernel_filename
, const char *kernel_cmdline
,
1082 const char *initrd_filename
, const char *cpu_model
)
1084 sun4m_hw_init(&sun4m_hwdefs
[8], RAM_size
, boot_device
, ds
, kernel_filename
,
1085 kernel_cmdline
, initrd_filename
, cpu_model
);
1088 QEMUMachine ss5_machine
= {
1090 .desc
= "Sun4m platform, SPARCstation 5",
1092 .ram_require
= PROM_SIZE_MAX
+ TCX_SIZE
,
1098 QEMUMachine ss10_machine
= {
1100 .desc
= "Sun4m platform, SPARCstation 10",
1102 .ram_require
= PROM_SIZE_MAX
+ TCX_SIZE
,
1108 QEMUMachine ss600mp_machine
= {
1110 .desc
= "Sun4m platform, SPARCserver 600MP",
1111 .init
= ss600mp_init
,
1112 .ram_require
= PROM_SIZE_MAX
+ TCX_SIZE
,
1118 QEMUMachine ss20_machine
= {
1120 .desc
= "Sun4m platform, SPARCstation 20",
1122 .ram_require
= PROM_SIZE_MAX
+ TCX_SIZE
,
1128 QEMUMachine voyager_machine
= {
1130 .desc
= "Sun4m platform, SPARCstation Voyager",
1132 .ram_require
= PROM_SIZE_MAX
+ TCX_SIZE
,
1138 QEMUMachine ss_lx_machine
= {
1140 .desc
= "Sun4m platform, SPARCstation LX",
1142 .ram_require
= PROM_SIZE_MAX
+ TCX_SIZE
,
1148 QEMUMachine ss4_machine
= {
1150 .desc
= "Sun4m platform, SPARCstation 4",
1152 .ram_require
= PROM_SIZE_MAX
+ TCX_SIZE
,
1158 QEMUMachine scls_machine
= {
1159 .name
= "SPARCClassic",
1160 .desc
= "Sun4m platform, SPARCClassic",
1162 .ram_require
= PROM_SIZE_MAX
+ TCX_SIZE
,
1168 QEMUMachine sbook_machine
= {
1169 .name
= "SPARCbook",
1170 .desc
= "Sun4m platform, SPARCbook",
1172 .ram_require
= PROM_SIZE_MAX
+ TCX_SIZE
,
1178 static const struct sun4d_hwdef sun4d_hwdefs
[] = {
1188 .tcx_base
= 0x820000000ULL
,
1189 .slavio_base
= 0xf00000000ULL
,
1190 .ms_kb_base
= 0xf00240000ULL
,
1191 .serial_base
= 0xf00200000ULL
,
1192 .nvram_base
= 0xf00280000ULL
,
1193 .counter_base
= 0xf00300000ULL
,
1194 .espdma_base
= 0x800081000ULL
,
1195 .esp_base
= 0x800080000ULL
,
1196 .ledma_base
= 0x800040000ULL
,
1197 .le_base
= 0x800060000ULL
,
1198 .sbi_base
= 0xf02800000ULL
,
1199 .vram_size
= 0x00100000,
1200 .nvram_size
= 0x2000,
1207 .nvram_machine_id
= 0x80,
1208 .machine_id
= ss1000_id
,
1209 .iounit_version
= 0x03000000,
1210 .max_mem
= 0xf00000000ULL
,
1211 .default_cpu_model
= "TI SuperSparc II",
1222 .tcx_base
= 0x820000000ULL
,
1223 .slavio_base
= 0xf00000000ULL
,
1224 .ms_kb_base
= 0xf00240000ULL
,
1225 .serial_base
= 0xf00200000ULL
,
1226 .nvram_base
= 0xf00280000ULL
,
1227 .counter_base
= 0xf00300000ULL
,
1228 .espdma_base
= 0x800081000ULL
,
1229 .esp_base
= 0x800080000ULL
,
1230 .ledma_base
= 0x800040000ULL
,
1231 .le_base
= 0x800060000ULL
,
1232 .sbi_base
= 0xf02800000ULL
,
1233 .vram_size
= 0x00100000,
1234 .nvram_size
= 0x2000,
1241 .nvram_machine_id
= 0x80,
1242 .machine_id
= ss2000_id
,
1243 .iounit_version
= 0x03000000,
1244 .max_mem
= 0xf00000000ULL
,
1245 .default_cpu_model
= "TI SuperSparc II",
1249 static void sun4d_hw_init(const struct sun4d_hwdef
*hwdef
, ram_addr_t RAM_size
,
1250 const char *boot_device
,
1251 DisplayState
*ds
, const char *kernel_filename
,
1252 const char *kernel_cmdline
,
1253 const char *initrd_filename
, const char *cpu_model
)
1255 CPUState
*env
, *envs
[MAX_CPUS
];
1257 void *iounits
[MAX_IOUNITS
], *espdma
, *ledma
, *main_esp
, *nvram
, *sbi
;
1258 qemu_irq
*cpu_irqs
[MAX_CPUS
], *sbi_irq
, *sbi_cpu_irq
,
1259 *espdma_irq
, *ledma_irq
;
1260 qemu_irq
*esp_reset
, *le_reset
;
1261 unsigned long prom_offset
, kernel_size
;
1269 cpu_model
= hwdef
->default_cpu_model
;
1271 for (i
= 0; i
< smp_cpus
; i
++) {
1272 env
= cpu_init(cpu_model
);
1274 fprintf(stderr
, "qemu: Unable to find Sparc CPU definition\n");
1277 cpu_sparc_set_id(env
, i
);
1280 qemu_register_reset(main_cpu_reset
, env
);
1282 qemu_register_reset(secondary_cpu_reset
, env
);
1285 cpu_irqs
[i
] = qemu_allocate_irqs(cpu_set_irq
, envs
[i
], MAX_PILS
);
1286 env
->prom_addr
= hwdef
->slavio_base
;
1289 for (i
= smp_cpus
; i
< MAX_CPUS
; i
++)
1290 cpu_irqs
[i
] = qemu_allocate_irqs(dummy_cpu_set_irq
, NULL
, MAX_PILS
);
1293 if ((uint64_t)RAM_size
> hwdef
->max_mem
) {
1295 "qemu: Too much memory for this machine: %d, maximum %d\n",
1296 (unsigned int)(RAM_size
/ (1024 * 1024)),
1297 (unsigned int)(hwdef
->max_mem
/ (1024 * 1024)));
1300 cpu_register_physical_memory(0, RAM_size
, 0);
1302 /* load boot prom */
1303 prom_offset
= RAM_size
+ hwdef
->vram_size
;
1304 cpu_register_physical_memory(hwdef
->slavio_base
,
1305 (PROM_SIZE_MAX
+ TARGET_PAGE_SIZE
- 1) &
1307 prom_offset
| IO_MEM_ROM
);
1309 if (bios_name
== NULL
)
1310 bios_name
= PROM_FILENAME
;
1311 snprintf(buf
, sizeof(buf
), "%s/%s", bios_dir
, bios_name
);
1312 ret
= load_elf(buf
, hwdef
->slavio_base
- PROM_VADDR
, NULL
, NULL
, NULL
);
1313 if (ret
< 0 || ret
> PROM_SIZE_MAX
)
1314 ret
= load_image_targphys(buf
, hwdef
->slavio_base
, PROM_SIZE_MAX
);
1315 if (ret
< 0 || ret
> PROM_SIZE_MAX
) {
1316 fprintf(stderr
, "qemu: could not load prom '%s'\n",
1321 /* set up devices */
1322 sbi
= sbi_init(hwdef
->sbi_base
, &sbi_irq
, &sbi_cpu_irq
, cpu_irqs
);
1324 for (i
= 0; i
< MAX_IOUNITS
; i
++)
1325 if (hwdef
->iounit_bases
[i
] != (target_phys_addr_t
)-1)
1326 iounits
[i
] = iommu_init(hwdef
->iounit_bases
[i
],
1327 hwdef
->iounit_version
,
1328 sbi_irq
[hwdef
->me_irq
]);
1330 espdma
= sparc32_dma_init(hwdef
->espdma_base
, sbi_irq
[hwdef
->esp_irq
],
1331 iounits
[0], &espdma_irq
, &esp_reset
);
1333 ledma
= sparc32_dma_init(hwdef
->ledma_base
, sbi_irq
[hwdef
->le_irq
],
1334 iounits
[0], &ledma_irq
, &le_reset
);
1336 if (graphic_depth
!= 8 && graphic_depth
!= 24) {
1337 fprintf(stderr
, "qemu: Unsupported depth: %d\n", graphic_depth
);
1340 tcx_init(ds
, hwdef
->tcx_base
, phys_ram_base
+ RAM_size
, RAM_size
,
1341 hwdef
->vram_size
, graphic_width
, graphic_height
, graphic_depth
);
1343 if (nd_table
[0].model
== NULL
1344 || strcmp(nd_table
[0].model
, "lance") == 0) {
1345 lance_init(&nd_table
[0], hwdef
->le_base
, ledma
, *ledma_irq
, le_reset
);
1346 } else if (strcmp(nd_table
[0].model
, "?") == 0) {
1347 fprintf(stderr
, "qemu: Supported NICs: lance\n");
1350 fprintf(stderr
, "qemu: Unsupported NIC: %s\n", nd_table
[0].model
);
1354 nvram
= m48t59_init(sbi_irq
[0], hwdef
->nvram_base
, 0,
1355 hwdef
->nvram_size
, 8);
1357 slavio_timer_init_all(hwdef
->counter_base
, sbi_irq
[hwdef
->clock1_irq
],
1358 sbi_cpu_irq
, smp_cpus
);
1360 slavio_serial_ms_kbd_init(hwdef
->ms_kb_base
, sbi_irq
[hwdef
->ms_kb_irq
],
1362 // Slavio TTYA (base+4, Linux ttyS0) is the first Qemu serial device
1363 // Slavio TTYB (base+0, Linux ttyS1) is the second Qemu serial device
1364 slavio_serial_init(hwdef
->serial_base
, sbi_irq
[hwdef
->ser_irq
],
1365 serial_hds
[1], serial_hds
[0]);
1367 if (drive_get_max_bus(IF_SCSI
) > 0) {
1368 fprintf(stderr
, "qemu: too many SCSI bus\n");
1372 main_esp
= esp_init(hwdef
->esp_base
, 2,
1373 espdma_memory_read
, espdma_memory_write
,
1374 espdma
, *espdma_irq
, esp_reset
);
1376 for (i
= 0; i
< ESP_MAX_DEVS
; i
++) {
1377 drive_index
= drive_get_index(IF_SCSI
, 0, i
);
1378 if (drive_index
== -1)
1380 esp_scsi_attach(main_esp
, drives_table
[drive_index
].bdrv
, i
);
1383 kernel_size
= sun4m_load_kernel(kernel_filename
, initrd_filename
,
1386 nvram_init(nvram
, (uint8_t *)&nd_table
[0].macaddr
, kernel_cmdline
,
1387 boot_device
, RAM_size
, kernel_size
, graphic_width
,
1388 graphic_height
, graphic_depth
, hwdef
->nvram_machine_id
,
1391 fw_cfg
= fw_cfg_init(0, 0, CFG_ADDR
, CFG_ADDR
+ 2);
1392 fw_cfg_add_i32(fw_cfg
, FW_CFG_ID
, 1);
1393 fw_cfg_add_i64(fw_cfg
, FW_CFG_RAM_SIZE
, (uint64_t)ram_size
);
1394 fw_cfg_add_i16(fw_cfg
, FW_CFG_MACHINE_ID
, hwdef
->machine_id
);
1397 /* SPARCserver 1000 hardware initialisation */
1398 static void ss1000_init(ram_addr_t RAM_size
, int vga_ram_size
,
1399 const char *boot_device
, DisplayState
*ds
,
1400 const char *kernel_filename
, const char *kernel_cmdline
,
1401 const char *initrd_filename
, const char *cpu_model
)
1403 sun4d_hw_init(&sun4d_hwdefs
[0], RAM_size
, boot_device
, ds
, kernel_filename
,
1404 kernel_cmdline
, initrd_filename
, cpu_model
);
1407 /* SPARCcenter 2000 hardware initialisation */
1408 static void ss2000_init(ram_addr_t RAM_size
, int vga_ram_size
,
1409 const char *boot_device
, DisplayState
*ds
,
1410 const char *kernel_filename
, const char *kernel_cmdline
,
1411 const char *initrd_filename
, const char *cpu_model
)
1413 sun4d_hw_init(&sun4d_hwdefs
[1], RAM_size
, boot_device
, ds
, kernel_filename
,
1414 kernel_cmdline
, initrd_filename
, cpu_model
);
1417 QEMUMachine ss1000_machine
= {
1419 .desc
= "Sun4d platform, SPARCserver 1000",
1420 .init
= ss1000_init
,
1421 .ram_require
= PROM_SIZE_MAX
+ TCX_SIZE
,
1427 QEMUMachine ss2000_machine
= {
1429 .desc
= "Sun4d platform, SPARCcenter 2000",
1430 .init
= ss2000_init
,
1431 .ram_require
= PROM_SIZE_MAX
+ TCX_SIZE
,
1437 static const struct sun4c_hwdef sun4c_hwdefs
[] = {
1440 .iommu_base
= 0xf8000000,
1441 .tcx_base
= 0xfe000000,
1442 .slavio_base
= 0xf6000000,
1443 .intctl_base
= 0xf5000000,
1444 .counter_base
= 0xf3000000,
1445 .ms_kb_base
= 0xf0000000,
1446 .serial_base
= 0xf1000000,
1447 .nvram_base
= 0xf2000000,
1448 .fd_base
= 0xf7200000,
1449 .dma_base
= 0xf8400000,
1450 .esp_base
= 0xf8800000,
1451 .le_base
= 0xf8c00000,
1452 .aux1_base
= 0xf7400003,
1453 .vram_size
= 0x00100000,
1454 .nvram_size
= 0x800,
1463 .nvram_machine_id
= 0x55,
1464 .machine_id
= ss2_id
,
1465 .max_mem
= 0x10000000,
1466 .default_cpu_model
= "Cypress CY7C601",
1470 static void sun4c_hw_init(const struct sun4c_hwdef
*hwdef
, ram_addr_t RAM_size
,
1471 const char *boot_device
,
1472 DisplayState
*ds
, const char *kernel_filename
,
1473 const char *kernel_cmdline
,
1474 const char *initrd_filename
, const char *cpu_model
)
1478 void *iommu
, *espdma
, *ledma
, *main_esp
, *nvram
;
1479 qemu_irq
*cpu_irqs
, *slavio_irq
, *espdma_irq
, *ledma_irq
;
1480 qemu_irq
*esp_reset
, *le_reset
;
1482 unsigned long prom_offset
, kernel_size
;
1485 BlockDriverState
*fd
[MAX_FD
];
1491 cpu_model
= hwdef
->default_cpu_model
;
1493 env
= cpu_init(cpu_model
);
1495 fprintf(stderr
, "qemu: Unable to find Sparc CPU definition\n");
1499 cpu_sparc_set_id(env
, 0);
1501 qemu_register_reset(main_cpu_reset
, env
);
1502 cpu_irqs
= qemu_allocate_irqs(cpu_set_irq
, env
, MAX_PILS
);
1503 env
->prom_addr
= hwdef
->slavio_base
;
1506 if ((uint64_t)RAM_size
> hwdef
->max_mem
) {
1508 "qemu: Too much memory for this machine: %d, maximum %d\n",
1509 (unsigned int)(RAM_size
/ (1024 * 1024)),
1510 (unsigned int)(hwdef
->max_mem
/ (1024 * 1024)));
1513 cpu_register_physical_memory(0, RAM_size
, 0);
1515 /* load boot prom */
1516 prom_offset
= RAM_size
+ hwdef
->vram_size
;
1517 cpu_register_physical_memory(hwdef
->slavio_base
,
1518 (PROM_SIZE_MAX
+ TARGET_PAGE_SIZE
- 1) &
1520 prom_offset
| IO_MEM_ROM
);
1522 if (bios_name
== NULL
)
1523 bios_name
= PROM_FILENAME
;
1524 snprintf(buf
, sizeof(buf
), "%s/%s", bios_dir
, bios_name
);
1525 ret
= load_elf(buf
, hwdef
->slavio_base
- PROM_VADDR
, NULL
, NULL
, NULL
);
1526 if (ret
< 0 || ret
> PROM_SIZE_MAX
)
1527 ret
= load_image_targphys(buf
, hwdef
->slavio_base
, PROM_SIZE_MAX
);
1528 if (ret
< 0 || ret
> PROM_SIZE_MAX
) {
1529 fprintf(stderr
, "qemu: could not load prom '%s'\n",
1533 prom_offset
+= (ret
+ TARGET_PAGE_SIZE
- 1) & TARGET_PAGE_MASK
;
1535 /* set up devices */
1536 slavio_intctl
= sun4c_intctl_init(hwdef
->intctl_base
,
1537 &slavio_irq
, cpu_irqs
);
1539 iommu
= iommu_init(hwdef
->iommu_base
, hwdef
->iommu_version
,
1540 slavio_irq
[hwdef
->me_irq
]);
1542 espdma
= sparc32_dma_init(hwdef
->dma_base
, slavio_irq
[hwdef
->esp_irq
],
1543 iommu
, &espdma_irq
, &esp_reset
);
1545 ledma
= sparc32_dma_init(hwdef
->dma_base
+ 16ULL,
1546 slavio_irq
[hwdef
->le_irq
], iommu
, &ledma_irq
,
1549 if (graphic_depth
!= 8 && graphic_depth
!= 24) {
1550 fprintf(stderr
, "qemu: Unsupported depth: %d\n", graphic_depth
);
1553 tcx_init(ds
, hwdef
->tcx_base
, phys_ram_base
+ RAM_size
, RAM_size
,
1554 hwdef
->vram_size
, graphic_width
, graphic_height
, graphic_depth
);
1556 if (nd_table
[0].model
== NULL
1557 || strcmp(nd_table
[0].model
, "lance") == 0) {
1558 lance_init(&nd_table
[0], hwdef
->le_base
, ledma
, *ledma_irq
, le_reset
);
1559 } else if (strcmp(nd_table
[0].model
, "?") == 0) {
1560 fprintf(stderr
, "qemu: Supported NICs: lance\n");
1563 fprintf(stderr
, "qemu: Unsupported NIC: %s\n", nd_table
[0].model
);
1567 nvram
= m48t59_init(slavio_irq
[0], hwdef
->nvram_base
, 0,
1568 hwdef
->nvram_size
, 2);
1570 slavio_serial_ms_kbd_init(hwdef
->ms_kb_base
, slavio_irq
[hwdef
->ms_kb_irq
],
1572 // Slavio TTYA (base+4, Linux ttyS0) is the first Qemu serial device
1573 // Slavio TTYB (base+0, Linux ttyS1) is the second Qemu serial device
1574 slavio_serial_init(hwdef
->serial_base
, slavio_irq
[hwdef
->ser_irq
],
1575 serial_hds
[1], serial_hds
[0]);
1577 slavio_misc
= slavio_misc_init(0, -1, hwdef
->aux1_base
, -1,
1578 slavio_irq
[hwdef
->me_irq
], env
, &fdc_tc
);
1580 if (hwdef
->fd_base
!= (target_phys_addr_t
)-1) {
1581 /* there is zero or one floppy drive */
1582 fd
[1] = fd
[0] = NULL
;
1583 drive_index
= drive_get_index(IF_FLOPPY
, 0, 0);
1584 if (drive_index
!= -1)
1585 fd
[0] = drives_table
[drive_index
].bdrv
;
1587 sun4m_fdctrl_init(slavio_irq
[hwdef
->fd_irq
], hwdef
->fd_base
, fd
,
1591 if (drive_get_max_bus(IF_SCSI
) > 0) {
1592 fprintf(stderr
, "qemu: too many SCSI bus\n");
1596 main_esp
= esp_init(hwdef
->esp_base
, 2,
1597 espdma_memory_read
, espdma_memory_write
,
1598 espdma
, *espdma_irq
, esp_reset
);
1600 for (i
= 0; i
< ESP_MAX_DEVS
; i
++) {
1601 drive_index
= drive_get_index(IF_SCSI
, 0, i
);
1602 if (drive_index
== -1)
1604 esp_scsi_attach(main_esp
, drives_table
[drive_index
].bdrv
, i
);
1607 kernel_size
= sun4m_load_kernel(kernel_filename
, initrd_filename
,
1610 nvram_init(nvram
, (uint8_t *)&nd_table
[0].macaddr
, kernel_cmdline
,
1611 boot_device
, RAM_size
, kernel_size
, graphic_width
,
1612 graphic_height
, graphic_depth
, hwdef
->nvram_machine_id
,
1615 fw_cfg
= fw_cfg_init(0, 0, CFG_ADDR
, CFG_ADDR
+ 2);
1616 fw_cfg_add_i32(fw_cfg
, FW_CFG_ID
, 1);
1617 fw_cfg_add_i64(fw_cfg
, FW_CFG_RAM_SIZE
, (uint64_t)ram_size
);
1618 fw_cfg_add_i16(fw_cfg
, FW_CFG_MACHINE_ID
, hwdef
->machine_id
);
1621 /* SPARCstation 2 hardware initialisation */
1622 static void ss2_init(ram_addr_t RAM_size
, int vga_ram_size
,
1623 const char *boot_device
, DisplayState
*ds
,
1624 const char *kernel_filename
, const char *kernel_cmdline
,
1625 const char *initrd_filename
, const char *cpu_model
)
1627 sun4c_hw_init(&sun4c_hwdefs
[0], RAM_size
, boot_device
, ds
, kernel_filename
,
1628 kernel_cmdline
, initrd_filename
, cpu_model
);
1631 QEMUMachine ss2_machine
= {
1633 .desc
= "Sun4c platform, SPARCstation 2",
1635 .ram_require
= PROM_SIZE_MAX
+ TCX_SIZE
,