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"
43 * Sun4m architecture was used in the following machines:
45 * SPARCserver 6xxMP/xx
46 * SPARCclassic (SPARCclassic Server)(SPARCstation LC) (4/15),
47 * SPARCclassic X (4/10)
48 * SPARCstation LX/ZX (4/30)
49 * SPARCstation Voyager
50 * SPARCstation 10/xx, SPARCserver 10/xx
51 * SPARCstation 5, SPARCserver 5
52 * SPARCstation 20/xx, SPARCserver 20
55 * Sun4d architecture was used in the following machines:
60 * Sun4c architecture was used in the following machines:
61 * SPARCstation 1/1+, SPARCserver 1/1+
67 * See for example: http://www.sunhelp.org/faq/sunref1.html
71 #define DPRINTF(fmt, args...) \
72 do { printf("CPUIRQ: " fmt , ##args); } while (0)
74 #define DPRINTF(fmt, args...)
77 #define KERNEL_LOAD_ADDR 0x00004000
78 #define CMDLINE_ADDR 0x007ff000
79 #define INITRD_LOAD_ADDR 0x00800000
80 #define PROM_SIZE_MAX (1024 * 1024)
81 #define PROM_VADDR 0xffd00000
82 #define PROM_FILENAME "openbios-sparc32"
83 #define CFG_ADDR 0xd00000510ULL
84 #define FW_CFG_SUN4M_DEPTH (FW_CFG_ARCH_LOCAL + 0x00)
86 // Control plane, 8-bit and 24-bit planes
87 #define TCX_SIZE (9 * 1024 * 1024)
92 #define ESCC_CLOCK 4915200
95 target_phys_addr_t iommu_base
, slavio_base
;
96 target_phys_addr_t intctl_base
, counter_base
, nvram_base
, ms_kb_base
;
97 target_phys_addr_t serial_base
, fd_base
;
98 target_phys_addr_t idreg_base
, dma_base
, esp_base
, le_base
;
99 target_phys_addr_t tcx_base
, cs_base
, apc_base
, aux1_base
, aux2_base
;
100 target_phys_addr_t ecc_base
;
101 uint32_t ecc_version
;
102 long vram_size
, nvram_size
;
103 // IRQ numbers are not PIL ones, but master interrupt controller
104 // register bit numbers
105 int esp_irq
, le_irq
, clock_irq
, clock1_irq
;
106 int ser_irq
, ms_kb_irq
, fd_irq
, me_irq
, cs_irq
, ecc_irq
;
107 uint8_t nvram_machine_id
;
109 uint32_t iommu_version
;
110 uint32_t intbit_to_level
[32];
112 const char * const default_cpu_model
;
115 #define MAX_IOUNITS 5
118 target_phys_addr_t iounit_bases
[MAX_IOUNITS
], slavio_base
;
119 target_phys_addr_t counter_base
, nvram_base
, ms_kb_base
;
120 target_phys_addr_t serial_base
;
121 target_phys_addr_t espdma_base
, esp_base
;
122 target_phys_addr_t ledma_base
, le_base
;
123 target_phys_addr_t tcx_base
;
124 target_phys_addr_t sbi_base
;
125 unsigned long vram_size
, nvram_size
;
126 // IRQ numbers are not PIL ones, but SBI register bit numbers
127 int esp_irq
, le_irq
, clock_irq
, clock1_irq
;
128 int ser_irq
, ms_kb_irq
, me_irq
;
129 uint8_t nvram_machine_id
;
131 uint32_t iounit_version
;
133 const char * const default_cpu_model
;
137 target_phys_addr_t iommu_base
, slavio_base
;
138 target_phys_addr_t intctl_base
, counter_base
, nvram_base
, ms_kb_base
;
139 target_phys_addr_t serial_base
, fd_base
;
140 target_phys_addr_t idreg_base
, dma_base
, esp_base
, le_base
;
141 target_phys_addr_t tcx_base
, aux1_base
;
142 long vram_size
, nvram_size
;
143 // IRQ numbers are not PIL ones, but master interrupt controller
144 // register bit numbers
145 int esp_irq
, le_irq
, clock_irq
, clock1_irq
;
146 int ser_irq
, ms_kb_irq
, fd_irq
, me_irq
;
147 uint8_t nvram_machine_id
;
149 uint32_t iommu_version
;
150 uint32_t intbit_to_level
[32];
152 const char * const default_cpu_model
;
155 int DMA_get_channel_mode (int nchan
)
159 int DMA_read_memory (int nchan
, void *buf
, int pos
, int size
)
163 int DMA_write_memory (int nchan
, void *buf
, int pos
, int size
)
167 void DMA_hold_DREQ (int nchan
) {}
168 void DMA_release_DREQ (int nchan
) {}
169 void DMA_schedule(int nchan
) {}
170 void DMA_init (int high_page_enable
) {}
171 void DMA_register_channel (int nchan
,
172 DMA_transfer_handler transfer_handler
,
177 static int nvram_boot_set(void *opaque
, const char *boot_device
)
180 uint8_t image
[sizeof(ohwcfg_v3_t
)];
181 ohwcfg_v3_t
*header
= (ohwcfg_v3_t
*)&image
;
182 m48t59_t
*nvram
= (m48t59_t
*)opaque
;
184 for (i
= 0; i
< sizeof(image
); i
++)
185 image
[i
] = m48t59_read(nvram
, i
) & 0xff;
187 pstrcpy((char *)header
->boot_devices
, sizeof(header
->boot_devices
),
189 header
->nboot_devices
= strlen(boot_device
) & 0xff;
190 header
->crc
= cpu_to_be16(OHW_compute_crc(header
, 0x00, 0xF8));
192 for (i
= 0; i
< sizeof(image
); i
++)
193 m48t59_write(nvram
, i
, image
[i
]);
198 static void nvram_init(m48t59_t
*nvram
, uint8_t *macaddr
, const char *cmdline
,
199 const char *boot_devices
, ram_addr_t RAM_size
,
200 uint32_t kernel_size
,
201 int width
, int height
, int depth
,
202 int nvram_machine_id
, const char *arch
)
206 uint8_t image
[0x1ff0];
207 ohwcfg_v3_t
*header
= (ohwcfg_v3_t
*)&image
;
208 struct sparc_arch_cfg
*sparc_header
;
209 struct OpenBIOS_nvpart_v1
*part_header
;
211 memset(image
, '\0', sizeof(image
));
213 // Try to match PPC NVRAM
214 pstrcpy((char *)header
->struct_ident
, sizeof(header
->struct_ident
),
216 header
->struct_version
= cpu_to_be32(3); /* structure v3 */
218 header
->nvram_size
= cpu_to_be16(0x2000);
219 header
->nvram_arch_ptr
= cpu_to_be16(sizeof(ohwcfg_v3_t
));
220 header
->nvram_arch_size
= cpu_to_be16(sizeof(struct sparc_arch_cfg
));
221 pstrcpy((char *)header
->arch
, sizeof(header
->arch
), arch
);
222 header
->nb_cpus
= smp_cpus
& 0xff;
223 header
->RAM0_base
= 0;
224 header
->RAM0_size
= cpu_to_be64((uint64_t)RAM_size
);
225 pstrcpy((char *)header
->boot_devices
, sizeof(header
->boot_devices
),
227 header
->nboot_devices
= strlen(boot_devices
) & 0xff;
228 header
->kernel_image
= cpu_to_be64((uint64_t)KERNEL_LOAD_ADDR
);
229 header
->kernel_size
= cpu_to_be64((uint64_t)kernel_size
);
231 pstrcpy_targphys(CMDLINE_ADDR
, TARGET_PAGE_SIZE
, cmdline
);
232 header
->cmdline
= cpu_to_be64((uint64_t)CMDLINE_ADDR
);
233 header
->cmdline_size
= cpu_to_be64((uint64_t)strlen(cmdline
));
235 // XXX add initrd_image, initrd_size
236 header
->width
= cpu_to_be16(width
);
237 header
->height
= cpu_to_be16(height
);
238 header
->depth
= cpu_to_be16(depth
);
240 header
->graphic_flags
= cpu_to_be16(OHW_GF_NOGRAPHICS
);
242 header
->crc
= cpu_to_be16(OHW_compute_crc(header
, 0x00, 0xF8));
244 // Architecture specific header
245 start
= sizeof(ohwcfg_v3_t
);
246 sparc_header
= (struct sparc_arch_cfg
*)&image
[start
];
247 sparc_header
->valid
= 0;
248 start
+= sizeof(struct sparc_arch_cfg
);
250 // OpenBIOS nvram variables
251 // Variable partition
252 part_header
= (struct OpenBIOS_nvpart_v1
*)&image
[start
];
253 part_header
->signature
= OPENBIOS_PART_SYSTEM
;
254 pstrcpy(part_header
->name
, sizeof(part_header
->name
), "system");
256 end
= start
+ sizeof(struct OpenBIOS_nvpart_v1
);
257 for (i
= 0; i
< nb_prom_envs
; i
++)
258 end
= OpenBIOS_set_var(image
, end
, prom_envs
[i
]);
263 end
= start
+ ((end
- start
+ 15) & ~15);
264 OpenBIOS_finish_partition(part_header
, end
- start
);
268 part_header
= (struct OpenBIOS_nvpart_v1
*)&image
[start
];
269 part_header
->signature
= OPENBIOS_PART_FREE
;
270 pstrcpy(part_header
->name
, sizeof(part_header
->name
), "free");
273 OpenBIOS_finish_partition(part_header
, end
- start
);
275 Sun_init_header((struct Sun_nvram
*)&image
[0x1fd8], macaddr
,
278 for (i
= 0; i
< sizeof(image
); i
++)
279 m48t59_write(nvram
, i
, image
[i
]);
281 qemu_register_boot_set(nvram_boot_set
, nvram
);
284 static void *slavio_intctl
;
289 slavio_pic_info(slavio_intctl
);
295 slavio_irq_info(slavio_intctl
);
298 void cpu_check_irqs(CPUState
*env
)
300 if (env
->pil_in
&& (env
->interrupt_index
== 0 ||
301 (env
->interrupt_index
& ~15) == TT_EXTINT
)) {
304 for (i
= 15; i
> 0; i
--) {
305 if (env
->pil_in
& (1 << i
)) {
306 int old_interrupt
= env
->interrupt_index
;
308 env
->interrupt_index
= TT_EXTINT
| i
;
309 if (old_interrupt
!= env
->interrupt_index
) {
310 DPRINTF("Set CPU IRQ %d\n", i
);
311 cpu_interrupt(env
, CPU_INTERRUPT_HARD
);
316 } else if (!env
->pil_in
&& (env
->interrupt_index
& ~15) == TT_EXTINT
) {
317 DPRINTF("Reset CPU IRQ %d\n", env
->interrupt_index
& 15);
318 env
->interrupt_index
= 0;
319 cpu_reset_interrupt(env
, CPU_INTERRUPT_HARD
);
323 static void cpu_set_irq(void *opaque
, int irq
, int level
)
325 CPUState
*env
= opaque
;
328 DPRINTF("Raise CPU IRQ %d\n", irq
);
330 env
->pil_in
|= 1 << irq
;
333 DPRINTF("Lower CPU IRQ %d\n", irq
);
334 env
->pil_in
&= ~(1 << irq
);
339 static void dummy_cpu_set_irq(void *opaque
, int irq
, int level
)
343 static void *slavio_misc
;
345 void qemu_system_powerdown(void)
347 slavio_set_power_fail(slavio_misc
, 1);
350 static void main_cpu_reset(void *opaque
)
352 CPUState
*env
= opaque
;
358 static void secondary_cpu_reset(void *opaque
)
360 CPUState
*env
= opaque
;
366 static void cpu_halt_signal(void *opaque
, int irq
, int level
)
368 if (level
&& cpu_single_env
)
369 cpu_interrupt(cpu_single_env
, CPU_INTERRUPT_HALT
);
372 static unsigned long sun4m_load_kernel(const char *kernel_filename
,
373 const char *initrd_filename
,
378 long initrd_size
, kernel_size
;
380 linux_boot
= (kernel_filename
!= NULL
);
384 kernel_size
= load_elf(kernel_filename
, -0xf0000000ULL
, NULL
, NULL
,
387 kernel_size
= load_aout(kernel_filename
, KERNEL_LOAD_ADDR
,
388 RAM_size
- KERNEL_LOAD_ADDR
);
390 kernel_size
= load_image_targphys(kernel_filename
,
392 RAM_size
- KERNEL_LOAD_ADDR
);
393 if (kernel_size
< 0) {
394 fprintf(stderr
, "qemu: could not load kernel '%s'\n",
401 if (initrd_filename
) {
402 initrd_size
= load_image_targphys(initrd_filename
,
404 RAM_size
- INITRD_LOAD_ADDR
);
405 if (initrd_size
< 0) {
406 fprintf(stderr
, "qemu: could not load initial ram disk '%s'\n",
411 if (initrd_size
> 0) {
412 for (i
= 0; i
< 64 * TARGET_PAGE_SIZE
; i
+= TARGET_PAGE_SIZE
) {
413 if (ldl_phys(KERNEL_LOAD_ADDR
+ i
) == 0x48647253) { // HdrS
414 stl_phys(KERNEL_LOAD_ADDR
+ i
+ 16, INITRD_LOAD_ADDR
);
415 stl_phys(KERNEL_LOAD_ADDR
+ i
+ 20, initrd_size
);
424 static void sun4m_hw_init(const struct sun4m_hwdef
*hwdef
, ram_addr_t RAM_size
,
425 const char *boot_device
,
426 const char *kernel_filename
,
427 const char *kernel_cmdline
,
428 const char *initrd_filename
, const char *cpu_model
)
431 CPUState
*env
, *envs
[MAX_CPUS
];
433 void *iommu
, *espdma
, *ledma
, *main_esp
, *nvram
;
434 qemu_irq
*cpu_irqs
[MAX_CPUS
], *slavio_irq
, *slavio_cpu_irq
,
435 *espdma_irq
, *ledma_irq
;
436 qemu_irq
*esp_reset
, *le_reset
;
439 ram_addr_t ram_offset
, prom_offset
, tcx_offset
, idreg_offset
;
440 unsigned long kernel_size
;
443 BlockDriverState
*fd
[MAX_FD
];
449 cpu_model
= hwdef
->default_cpu_model
;
451 for(i
= 0; i
< smp_cpus
; i
++) {
452 env
= cpu_init(cpu_model
);
454 fprintf(stderr
, "qemu: Unable to find Sparc CPU definition\n");
457 cpu_sparc_set_id(env
, i
);
460 qemu_register_reset(main_cpu_reset
, env
);
462 qemu_register_reset(secondary_cpu_reset
, env
);
465 cpu_irqs
[i
] = qemu_allocate_irqs(cpu_set_irq
, envs
[i
], MAX_PILS
);
466 env
->prom_addr
= hwdef
->slavio_base
;
469 for (i
= smp_cpus
; i
< MAX_CPUS
; i
++)
470 cpu_irqs
[i
] = qemu_allocate_irqs(dummy_cpu_set_irq
, NULL
, MAX_PILS
);
474 if ((uint64_t)RAM_size
> hwdef
->max_mem
) {
476 "qemu: Too much memory for this machine: %d, maximum %d\n",
477 (unsigned int)(RAM_size
/ (1024 * 1024)),
478 (unsigned int)(hwdef
->max_mem
/ (1024 * 1024)));
481 ram_offset
= qemu_ram_alloc(RAM_size
);
482 cpu_register_physical_memory(0, RAM_size
, ram_offset
);
485 prom_offset
= qemu_ram_alloc(PROM_SIZE_MAX
);
486 cpu_register_physical_memory(hwdef
->slavio_base
,
487 (PROM_SIZE_MAX
+ TARGET_PAGE_SIZE
- 1) &
489 prom_offset
| IO_MEM_ROM
);
491 if (bios_name
== NULL
)
492 bios_name
= PROM_FILENAME
;
493 snprintf(buf
, sizeof(buf
), "%s/%s", bios_dir
, bios_name
);
494 ret
= load_elf(buf
, hwdef
->slavio_base
- PROM_VADDR
, NULL
, NULL
, NULL
);
495 if (ret
< 0 || ret
> PROM_SIZE_MAX
)
496 ret
= load_image_targphys(buf
, hwdef
->slavio_base
, PROM_SIZE_MAX
);
497 if (ret
< 0 || ret
> PROM_SIZE_MAX
) {
498 fprintf(stderr
, "qemu: could not load prom '%s'\n",
504 slavio_intctl
= slavio_intctl_init(hwdef
->intctl_base
,
505 hwdef
->intctl_base
+ 0x10000ULL
,
506 &hwdef
->intbit_to_level
[0],
507 &slavio_irq
, &slavio_cpu_irq
,
511 if (hwdef
->idreg_base
) {
512 static const uint8_t idreg_data
[] = { 0xfe, 0x81, 0x01, 0x03 };
514 idreg_offset
= qemu_ram_alloc(sizeof(idreg_data
));
515 cpu_register_physical_memory(hwdef
->idreg_base
, sizeof(idreg_data
),
516 idreg_offset
| IO_MEM_ROM
);
517 cpu_physical_memory_write_rom(hwdef
->idreg_base
, idreg_data
,
521 iommu
= iommu_init(hwdef
->iommu_base
, hwdef
->iommu_version
,
522 slavio_irq
[hwdef
->me_irq
]);
524 espdma
= sparc32_dma_init(hwdef
->dma_base
, slavio_irq
[hwdef
->esp_irq
],
525 iommu
, &espdma_irq
, &esp_reset
);
527 ledma
= sparc32_dma_init(hwdef
->dma_base
+ 16ULL,
528 slavio_irq
[hwdef
->le_irq
], iommu
, &ledma_irq
,
531 if (graphic_depth
!= 8 && graphic_depth
!= 24) {
532 fprintf(stderr
, "qemu: Unsupported depth: %d\n", graphic_depth
);
535 tcx_offset
= qemu_ram_alloc(hwdef
->vram_size
);
536 tcx_init(hwdef
->tcx_base
, phys_ram_base
+ tcx_offset
, tcx_offset
,
537 hwdef
->vram_size
, graphic_width
, graphic_height
, graphic_depth
);
539 lance_init(&nd_table
[0], hwdef
->le_base
, ledma
, *ledma_irq
, le_reset
);
541 nvram
= m48t59_init(slavio_irq
[0], hwdef
->nvram_base
, 0,
542 hwdef
->nvram_size
, 8);
544 slavio_timer_init_all(hwdef
->counter_base
, slavio_irq
[hwdef
->clock1_irq
],
545 slavio_cpu_irq
, smp_cpus
);
547 slavio_serial_ms_kbd_init(hwdef
->ms_kb_base
, slavio_irq
[hwdef
->ms_kb_irq
],
548 nographic
, ESCC_CLOCK
, 1);
549 // Slavio TTYA (base+4, Linux ttyS0) is the first Qemu serial device
550 // Slavio TTYB (base+0, Linux ttyS1) is the second Qemu serial device
551 escc_init(hwdef
->serial_base
, slavio_irq
[hwdef
->ser_irq
], slavio_irq
[hwdef
->ser_irq
],
552 serial_hds
[0], serial_hds
[1], ESCC_CLOCK
, 1);
554 cpu_halt
= qemu_allocate_irqs(cpu_halt_signal
, NULL
, 1);
555 slavio_misc
= slavio_misc_init(hwdef
->slavio_base
, hwdef
->apc_base
,
556 hwdef
->aux1_base
, hwdef
->aux2_base
,
557 slavio_irq
[hwdef
->me_irq
], cpu_halt
[0],
560 if (hwdef
->fd_base
) {
561 /* there is zero or one floppy drive */
562 memset(fd
, 0, sizeof(fd
));
563 drive_index
= drive_get_index(IF_FLOPPY
, 0, 0);
564 if (drive_index
!= -1)
565 fd
[0] = drives_table
[drive_index
].bdrv
;
567 sun4m_fdctrl_init(slavio_irq
[hwdef
->fd_irq
], hwdef
->fd_base
, fd
,
571 if (drive_get_max_bus(IF_SCSI
) > 0) {
572 fprintf(stderr
, "qemu: too many SCSI bus\n");
576 main_esp
= esp_init(hwdef
->esp_base
, 2,
577 espdma_memory_read
, espdma_memory_write
,
578 espdma
, *espdma_irq
, esp_reset
);
580 for (i
= 0; i
< ESP_MAX_DEVS
; i
++) {
581 drive_index
= drive_get_index(IF_SCSI
, 0, i
);
582 if (drive_index
== -1)
584 esp_scsi_attach(main_esp
, drives_table
[drive_index
].bdrv
, i
);
588 cs_init(hwdef
->cs_base
, hwdef
->cs_irq
, slavio_intctl
);
590 kernel_size
= sun4m_load_kernel(kernel_filename
, initrd_filename
,
593 nvram_init(nvram
, (uint8_t *)&nd_table
[0].macaddr
, kernel_cmdline
,
594 boot_device
, RAM_size
, kernel_size
, graphic_width
,
595 graphic_height
, graphic_depth
, hwdef
->nvram_machine_id
,
599 ecc_init(hwdef
->ecc_base
, slavio_irq
[hwdef
->ecc_irq
],
602 fw_cfg
= fw_cfg_init(0, 0, CFG_ADDR
, CFG_ADDR
+ 2);
603 fw_cfg_add_i32(fw_cfg
, FW_CFG_ID
, 1);
604 fw_cfg_add_i64(fw_cfg
, FW_CFG_RAM_SIZE
, (uint64_t)ram_size
);
605 fw_cfg_add_i16(fw_cfg
, FW_CFG_MACHINE_ID
, hwdef
->machine_id
);
606 fw_cfg_add_i16(fw_cfg
, FW_CFG_SUN4M_DEPTH
, graphic_depth
);
624 static const struct sun4m_hwdef sun4m_hwdefs
[] = {
627 .iommu_base
= 0x10000000,
628 .tcx_base
= 0x50000000,
629 .cs_base
= 0x6c000000,
630 .slavio_base
= 0x70000000,
631 .ms_kb_base
= 0x71000000,
632 .serial_base
= 0x71100000,
633 .nvram_base
= 0x71200000,
634 .fd_base
= 0x71400000,
635 .counter_base
= 0x71d00000,
636 .intctl_base
= 0x71e00000,
637 .idreg_base
= 0x78000000,
638 .dma_base
= 0x78400000,
639 .esp_base
= 0x78800000,
640 .le_base
= 0x78c00000,
641 .apc_base
= 0x6a000000,
642 .aux1_base
= 0x71900000,
643 .aux2_base
= 0x71910000,
644 .vram_size
= 0x00100000,
645 .nvram_size
= 0x2000,
655 .nvram_machine_id
= 0x80,
656 .machine_id
= ss5_id
,
657 .iommu_version
= 0x05000000,
659 2, 3, 5, 7, 9, 11, 0, 14, 3, 5, 7, 9, 11, 13, 12, 12,
660 6, 0, 4, 10, 8, 0, 11, 0, 0, 0, 0, 0, 15, 0, 15, 0,
662 .max_mem
= 0x10000000,
663 .default_cpu_model
= "Fujitsu MB86904",
667 .iommu_base
= 0xfe0000000ULL
,
668 .tcx_base
= 0xe20000000ULL
,
669 .slavio_base
= 0xff0000000ULL
,
670 .ms_kb_base
= 0xff1000000ULL
,
671 .serial_base
= 0xff1100000ULL
,
672 .nvram_base
= 0xff1200000ULL
,
673 .fd_base
= 0xff1700000ULL
,
674 .counter_base
= 0xff1300000ULL
,
675 .intctl_base
= 0xff1400000ULL
,
676 .idreg_base
= 0xef0000000ULL
,
677 .dma_base
= 0xef0400000ULL
,
678 .esp_base
= 0xef0800000ULL
,
679 .le_base
= 0xef0c00000ULL
,
680 .apc_base
= 0xefa000000ULL
, // XXX should not exist
681 .aux1_base
= 0xff1800000ULL
,
682 .aux2_base
= 0xff1a01000ULL
,
683 .ecc_base
= 0xf00000000ULL
,
684 .ecc_version
= 0x10000000, // version 0, implementation 1
685 .vram_size
= 0x00100000,
686 .nvram_size
= 0x2000,
696 .nvram_machine_id
= 0x72,
697 .machine_id
= ss10_id
,
698 .iommu_version
= 0x03000000,
700 2, 3, 5, 7, 9, 11, 0, 14, 3, 5, 7, 9, 11, 13, 12, 12,
701 6, 0, 4, 10, 8, 0, 11, 0, 0, 0, 0, 0, 15, 0, 15, 0,
703 .max_mem
= 0xf00000000ULL
,
704 .default_cpu_model
= "TI SuperSparc II",
708 .iommu_base
= 0xfe0000000ULL
,
709 .tcx_base
= 0xe20000000ULL
,
710 .slavio_base
= 0xff0000000ULL
,
711 .ms_kb_base
= 0xff1000000ULL
,
712 .serial_base
= 0xff1100000ULL
,
713 .nvram_base
= 0xff1200000ULL
,
714 .counter_base
= 0xff1300000ULL
,
715 .intctl_base
= 0xff1400000ULL
,
716 .dma_base
= 0xef0081000ULL
,
717 .esp_base
= 0xef0080000ULL
,
718 .le_base
= 0xef0060000ULL
,
719 .apc_base
= 0xefa000000ULL
, // XXX should not exist
720 .aux1_base
= 0xff1800000ULL
,
721 .aux2_base
= 0xff1a01000ULL
, // XXX should not exist
722 .ecc_base
= 0xf00000000ULL
,
723 .ecc_version
= 0x00000000, // version 0, implementation 0
724 .vram_size
= 0x00100000,
725 .nvram_size
= 0x2000,
735 .nvram_machine_id
= 0x71,
736 .machine_id
= ss600mp_id
,
737 .iommu_version
= 0x01000000,
739 2, 3, 5, 7, 9, 11, 0, 14, 3, 5, 7, 9, 11, 13, 12, 12,
740 6, 0, 4, 10, 8, 0, 11, 0, 0, 0, 0, 0, 15, 0, 15, 0,
742 .max_mem
= 0xf00000000ULL
,
743 .default_cpu_model
= "TI SuperSparc II",
747 .iommu_base
= 0xfe0000000ULL
,
748 .tcx_base
= 0xe20000000ULL
,
749 .slavio_base
= 0xff0000000ULL
,
750 .ms_kb_base
= 0xff1000000ULL
,
751 .serial_base
= 0xff1100000ULL
,
752 .nvram_base
= 0xff1200000ULL
,
753 .fd_base
= 0xff1700000ULL
,
754 .counter_base
= 0xff1300000ULL
,
755 .intctl_base
= 0xff1400000ULL
,
756 .idreg_base
= 0xef0000000ULL
,
757 .dma_base
= 0xef0400000ULL
,
758 .esp_base
= 0xef0800000ULL
,
759 .le_base
= 0xef0c00000ULL
,
760 .apc_base
= 0xefa000000ULL
, // XXX should not exist
761 .aux1_base
= 0xff1800000ULL
,
762 .aux2_base
= 0xff1a01000ULL
,
763 .ecc_base
= 0xf00000000ULL
,
764 .ecc_version
= 0x20000000, // version 0, implementation 2
765 .vram_size
= 0x00100000,
766 .nvram_size
= 0x2000,
776 .nvram_machine_id
= 0x72,
777 .machine_id
= ss20_id
,
778 .iommu_version
= 0x13000000,
780 2, 3, 5, 7, 9, 11, 0, 14, 3, 5, 7, 9, 11, 13, 12, 12,
781 6, 0, 4, 10, 8, 0, 11, 0, 0, 0, 0, 0, 15, 0, 15, 0,
783 .max_mem
= 0xf00000000ULL
,
784 .default_cpu_model
= "TI SuperSparc II",
788 .iommu_base
= 0x10000000,
789 .tcx_base
= 0x50000000,
790 .slavio_base
= 0x70000000,
791 .ms_kb_base
= 0x71000000,
792 .serial_base
= 0x71100000,
793 .nvram_base
= 0x71200000,
794 .fd_base
= 0x71400000,
795 .counter_base
= 0x71d00000,
796 .intctl_base
= 0x71e00000,
797 .idreg_base
= 0x78000000,
798 .dma_base
= 0x78400000,
799 .esp_base
= 0x78800000,
800 .le_base
= 0x78c00000,
801 .apc_base
= 0x71300000, // pmc
802 .aux1_base
= 0x71900000,
803 .aux2_base
= 0x71910000,
804 .vram_size
= 0x00100000,
805 .nvram_size
= 0x2000,
814 .nvram_machine_id
= 0x80,
815 .machine_id
= vger_id
,
816 .iommu_version
= 0x05000000,
818 2, 3, 5, 7, 9, 11, 0, 14, 3, 5, 7, 9, 11, 13, 12, 12,
819 6, 0, 4, 10, 8, 0, 11, 0, 0, 0, 0, 0, 15, 0, 15, 0,
821 .max_mem
= 0x10000000,
822 .default_cpu_model
= "Fujitsu MB86904",
826 .iommu_base
= 0x10000000,
827 .tcx_base
= 0x50000000,
828 .slavio_base
= 0x70000000,
829 .ms_kb_base
= 0x71000000,
830 .serial_base
= 0x71100000,
831 .nvram_base
= 0x71200000,
832 .fd_base
= 0x71400000,
833 .counter_base
= 0x71d00000,
834 .intctl_base
= 0x71e00000,
835 .idreg_base
= 0x78000000,
836 .dma_base
= 0x78400000,
837 .esp_base
= 0x78800000,
838 .le_base
= 0x78c00000,
839 .aux1_base
= 0x71900000,
840 .aux2_base
= 0x71910000,
841 .vram_size
= 0x00100000,
842 .nvram_size
= 0x2000,
851 .nvram_machine_id
= 0x80,
853 .iommu_version
= 0x04000000,
855 2, 3, 5, 7, 9, 11, 0, 14, 3, 5, 7, 9, 11, 13, 12, 12,
856 6, 0, 4, 10, 8, 0, 11, 0, 0, 0, 0, 0, 15, 0, 15, 0,
858 .max_mem
= 0x10000000,
859 .default_cpu_model
= "TI MicroSparc I",
863 .iommu_base
= 0x10000000,
864 .tcx_base
= 0x50000000,
865 .cs_base
= 0x6c000000,
866 .slavio_base
= 0x70000000,
867 .ms_kb_base
= 0x71000000,
868 .serial_base
= 0x71100000,
869 .nvram_base
= 0x71200000,
870 .fd_base
= 0x71400000,
871 .counter_base
= 0x71d00000,
872 .intctl_base
= 0x71e00000,
873 .idreg_base
= 0x78000000,
874 .dma_base
= 0x78400000,
875 .esp_base
= 0x78800000,
876 .le_base
= 0x78c00000,
877 .apc_base
= 0x6a000000,
878 .aux1_base
= 0x71900000,
879 .aux2_base
= 0x71910000,
880 .vram_size
= 0x00100000,
881 .nvram_size
= 0x2000,
891 .nvram_machine_id
= 0x80,
892 .machine_id
= ss4_id
,
893 .iommu_version
= 0x05000000,
895 2, 3, 5, 7, 9, 11, 0, 14, 3, 5, 7, 9, 11, 13, 12, 12,
896 6, 0, 4, 10, 8, 0, 11, 0, 0, 0, 0, 0, 15, 0, 15, 0,
898 .max_mem
= 0x10000000,
899 .default_cpu_model
= "Fujitsu MB86904",
903 .iommu_base
= 0x10000000,
904 .tcx_base
= 0x50000000,
905 .slavio_base
= 0x70000000,
906 .ms_kb_base
= 0x71000000,
907 .serial_base
= 0x71100000,
908 .nvram_base
= 0x71200000,
909 .fd_base
= 0x71400000,
910 .counter_base
= 0x71d00000,
911 .intctl_base
= 0x71e00000,
912 .idreg_base
= 0x78000000,
913 .dma_base
= 0x78400000,
914 .esp_base
= 0x78800000,
915 .le_base
= 0x78c00000,
916 .apc_base
= 0x6a000000,
917 .aux1_base
= 0x71900000,
918 .aux2_base
= 0x71910000,
919 .vram_size
= 0x00100000,
920 .nvram_size
= 0x2000,
929 .nvram_machine_id
= 0x80,
930 .machine_id
= scls_id
,
931 .iommu_version
= 0x05000000,
933 2, 3, 5, 7, 9, 11, 0, 14, 3, 5, 7, 9, 11, 13, 12, 12,
934 6, 0, 4, 10, 8, 0, 11, 0, 0, 0, 0, 0, 15, 0, 15, 0,
936 .max_mem
= 0x10000000,
937 .default_cpu_model
= "TI MicroSparc I",
941 .iommu_base
= 0x10000000,
942 .tcx_base
= 0x50000000, // XXX
943 .slavio_base
= 0x70000000,
944 .ms_kb_base
= 0x71000000,
945 .serial_base
= 0x71100000,
946 .nvram_base
= 0x71200000,
947 .fd_base
= 0x71400000,
948 .counter_base
= 0x71d00000,
949 .intctl_base
= 0x71e00000,
950 .idreg_base
= 0x78000000,
951 .dma_base
= 0x78400000,
952 .esp_base
= 0x78800000,
953 .le_base
= 0x78c00000,
954 .apc_base
= 0x6a000000,
955 .aux1_base
= 0x71900000,
956 .aux2_base
= 0x71910000,
957 .vram_size
= 0x00100000,
958 .nvram_size
= 0x2000,
967 .nvram_machine_id
= 0x80,
968 .machine_id
= sbook_id
,
969 .iommu_version
= 0x05000000,
971 2, 3, 5, 7, 9, 11, 0, 14, 3, 5, 7, 9, 11, 13, 12, 12,
972 6, 0, 4, 10, 8, 0, 11, 0, 0, 0, 0, 0, 15, 0, 15, 0,
974 .max_mem
= 0x10000000,
975 .default_cpu_model
= "TI MicroSparc I",
979 /* SPARCstation 5 hardware initialisation */
980 static void ss5_init(ram_addr_t RAM_size
, int vga_ram_size
,
981 const char *boot_device
,
982 const char *kernel_filename
, const char *kernel_cmdline
,
983 const char *initrd_filename
, const char *cpu_model
)
985 sun4m_hw_init(&sun4m_hwdefs
[0], RAM_size
, boot_device
, kernel_filename
,
986 kernel_cmdline
, initrd_filename
, cpu_model
);
989 /* SPARCstation 10 hardware initialisation */
990 static void ss10_init(ram_addr_t RAM_size
, int vga_ram_size
,
991 const char *boot_device
,
992 const char *kernel_filename
, const char *kernel_cmdline
,
993 const char *initrd_filename
, const char *cpu_model
)
995 sun4m_hw_init(&sun4m_hwdefs
[1], RAM_size
, boot_device
, kernel_filename
,
996 kernel_cmdline
, initrd_filename
, cpu_model
);
999 /* SPARCserver 600MP hardware initialisation */
1000 static void ss600mp_init(ram_addr_t RAM_size
, int vga_ram_size
,
1001 const char *boot_device
,
1002 const char *kernel_filename
,
1003 const char *kernel_cmdline
,
1004 const char *initrd_filename
, const char *cpu_model
)
1006 sun4m_hw_init(&sun4m_hwdefs
[2], RAM_size
, boot_device
, kernel_filename
,
1007 kernel_cmdline
, initrd_filename
, cpu_model
);
1010 /* SPARCstation 20 hardware initialisation */
1011 static void ss20_init(ram_addr_t RAM_size
, int vga_ram_size
,
1012 const char *boot_device
,
1013 const char *kernel_filename
, const char *kernel_cmdline
,
1014 const char *initrd_filename
, const char *cpu_model
)
1016 sun4m_hw_init(&sun4m_hwdefs
[3], RAM_size
, boot_device
, kernel_filename
,
1017 kernel_cmdline
, initrd_filename
, cpu_model
);
1020 /* SPARCstation Voyager hardware initialisation */
1021 static void vger_init(ram_addr_t RAM_size
, int vga_ram_size
,
1022 const char *boot_device
,
1023 const char *kernel_filename
, const char *kernel_cmdline
,
1024 const char *initrd_filename
, const char *cpu_model
)
1026 sun4m_hw_init(&sun4m_hwdefs
[4], RAM_size
, boot_device
, kernel_filename
,
1027 kernel_cmdline
, initrd_filename
, cpu_model
);
1030 /* SPARCstation LX hardware initialisation */
1031 static void ss_lx_init(ram_addr_t RAM_size
, int vga_ram_size
,
1032 const char *boot_device
,
1033 const char *kernel_filename
, const char *kernel_cmdline
,
1034 const char *initrd_filename
, const char *cpu_model
)
1036 sun4m_hw_init(&sun4m_hwdefs
[5], RAM_size
, boot_device
, kernel_filename
,
1037 kernel_cmdline
, initrd_filename
, cpu_model
);
1040 /* SPARCstation 4 hardware initialisation */
1041 static void ss4_init(ram_addr_t RAM_size
, int vga_ram_size
,
1042 const char *boot_device
,
1043 const char *kernel_filename
, const char *kernel_cmdline
,
1044 const char *initrd_filename
, const char *cpu_model
)
1046 sun4m_hw_init(&sun4m_hwdefs
[6], RAM_size
, boot_device
, kernel_filename
,
1047 kernel_cmdline
, initrd_filename
, cpu_model
);
1050 /* SPARCClassic hardware initialisation */
1051 static void scls_init(ram_addr_t RAM_size
, int vga_ram_size
,
1052 const char *boot_device
,
1053 const char *kernel_filename
, const char *kernel_cmdline
,
1054 const char *initrd_filename
, const char *cpu_model
)
1056 sun4m_hw_init(&sun4m_hwdefs
[7], RAM_size
, boot_device
, kernel_filename
,
1057 kernel_cmdline
, initrd_filename
, cpu_model
);
1060 /* SPARCbook hardware initialisation */
1061 static void sbook_init(ram_addr_t RAM_size
, int vga_ram_size
,
1062 const char *boot_device
,
1063 const char *kernel_filename
, const char *kernel_cmdline
,
1064 const char *initrd_filename
, const char *cpu_model
)
1066 sun4m_hw_init(&sun4m_hwdefs
[8], RAM_size
, boot_device
, kernel_filename
,
1067 kernel_cmdline
, initrd_filename
, cpu_model
);
1070 QEMUMachine ss5_machine
= {
1072 .desc
= "Sun4m platform, SPARCstation 5",
1074 .ram_require
= PROM_SIZE_MAX
+ TCX_SIZE
,
1079 QEMUMachine ss10_machine
= {
1081 .desc
= "Sun4m platform, SPARCstation 10",
1083 .ram_require
= PROM_SIZE_MAX
+ TCX_SIZE
,
1089 QEMUMachine ss600mp_machine
= {
1091 .desc
= "Sun4m platform, SPARCserver 600MP",
1092 .init
= ss600mp_init
,
1093 .ram_require
= PROM_SIZE_MAX
+ TCX_SIZE
,
1099 QEMUMachine ss20_machine
= {
1101 .desc
= "Sun4m platform, SPARCstation 20",
1103 .ram_require
= PROM_SIZE_MAX
+ TCX_SIZE
,
1109 QEMUMachine voyager_machine
= {
1111 .desc
= "Sun4m platform, SPARCstation Voyager",
1113 .ram_require
= PROM_SIZE_MAX
+ TCX_SIZE
,
1118 QEMUMachine ss_lx_machine
= {
1120 .desc
= "Sun4m platform, SPARCstation LX",
1122 .ram_require
= PROM_SIZE_MAX
+ TCX_SIZE
,
1127 QEMUMachine ss4_machine
= {
1129 .desc
= "Sun4m platform, SPARCstation 4",
1131 .ram_require
= PROM_SIZE_MAX
+ TCX_SIZE
,
1136 QEMUMachine scls_machine
= {
1137 .name
= "SPARCClassic",
1138 .desc
= "Sun4m platform, SPARCClassic",
1140 .ram_require
= PROM_SIZE_MAX
+ TCX_SIZE
,
1145 QEMUMachine sbook_machine
= {
1146 .name
= "SPARCbook",
1147 .desc
= "Sun4m platform, SPARCbook",
1149 .ram_require
= PROM_SIZE_MAX
+ TCX_SIZE
,
1154 static const struct sun4d_hwdef sun4d_hwdefs
[] = {
1164 .tcx_base
= 0x820000000ULL
,
1165 .slavio_base
= 0xf00000000ULL
,
1166 .ms_kb_base
= 0xf00240000ULL
,
1167 .serial_base
= 0xf00200000ULL
,
1168 .nvram_base
= 0xf00280000ULL
,
1169 .counter_base
= 0xf00300000ULL
,
1170 .espdma_base
= 0x800081000ULL
,
1171 .esp_base
= 0x800080000ULL
,
1172 .ledma_base
= 0x800040000ULL
,
1173 .le_base
= 0x800060000ULL
,
1174 .sbi_base
= 0xf02800000ULL
,
1175 .vram_size
= 0x00100000,
1176 .nvram_size
= 0x2000,
1183 .nvram_machine_id
= 0x80,
1184 .machine_id
= ss1000_id
,
1185 .iounit_version
= 0x03000000,
1186 .max_mem
= 0xf00000000ULL
,
1187 .default_cpu_model
= "TI SuperSparc II",
1198 .tcx_base
= 0x820000000ULL
,
1199 .slavio_base
= 0xf00000000ULL
,
1200 .ms_kb_base
= 0xf00240000ULL
,
1201 .serial_base
= 0xf00200000ULL
,
1202 .nvram_base
= 0xf00280000ULL
,
1203 .counter_base
= 0xf00300000ULL
,
1204 .espdma_base
= 0x800081000ULL
,
1205 .esp_base
= 0x800080000ULL
,
1206 .ledma_base
= 0x800040000ULL
,
1207 .le_base
= 0x800060000ULL
,
1208 .sbi_base
= 0xf02800000ULL
,
1209 .vram_size
= 0x00100000,
1210 .nvram_size
= 0x2000,
1217 .nvram_machine_id
= 0x80,
1218 .machine_id
= ss2000_id
,
1219 .iounit_version
= 0x03000000,
1220 .max_mem
= 0xf00000000ULL
,
1221 .default_cpu_model
= "TI SuperSparc II",
1225 static void sun4d_hw_init(const struct sun4d_hwdef
*hwdef
, ram_addr_t RAM_size
,
1226 const char *boot_device
,
1227 const char *kernel_filename
,
1228 const char *kernel_cmdline
,
1229 const char *initrd_filename
, const char *cpu_model
)
1231 CPUState
*env
, *envs
[MAX_CPUS
];
1233 void *iounits
[MAX_IOUNITS
], *espdma
, *ledma
, *main_esp
, *nvram
, *sbi
;
1234 qemu_irq
*cpu_irqs
[MAX_CPUS
], *sbi_irq
, *sbi_cpu_irq
,
1235 *espdma_irq
, *ledma_irq
;
1236 qemu_irq
*esp_reset
, *le_reset
;
1237 ram_addr_t ram_offset
, prom_offset
, tcx_offset
;
1238 unsigned long kernel_size
;
1246 cpu_model
= hwdef
->default_cpu_model
;
1248 for (i
= 0; i
< smp_cpus
; i
++) {
1249 env
= cpu_init(cpu_model
);
1251 fprintf(stderr
, "qemu: Unable to find Sparc CPU definition\n");
1254 cpu_sparc_set_id(env
, i
);
1257 qemu_register_reset(main_cpu_reset
, env
);
1259 qemu_register_reset(secondary_cpu_reset
, env
);
1262 cpu_irqs
[i
] = qemu_allocate_irqs(cpu_set_irq
, envs
[i
], MAX_PILS
);
1263 env
->prom_addr
= hwdef
->slavio_base
;
1266 for (i
= smp_cpus
; i
< MAX_CPUS
; i
++)
1267 cpu_irqs
[i
] = qemu_allocate_irqs(dummy_cpu_set_irq
, NULL
, MAX_PILS
);
1270 if ((uint64_t)RAM_size
> hwdef
->max_mem
) {
1272 "qemu: Too much memory for this machine: %d, maximum %d\n",
1273 (unsigned int)(RAM_size
/ (1024 * 1024)),
1274 (unsigned int)(hwdef
->max_mem
/ (1024 * 1024)));
1277 ram_offset
= qemu_ram_alloc(RAM_size
);
1278 cpu_register_physical_memory(0, RAM_size
, ram_offset
);
1280 /* load boot prom */
1281 prom_offset
= qemu_ram_alloc(PROM_SIZE_MAX
);
1282 cpu_register_physical_memory(hwdef
->slavio_base
,
1283 (PROM_SIZE_MAX
+ TARGET_PAGE_SIZE
- 1) &
1285 prom_offset
| IO_MEM_ROM
);
1287 if (bios_name
== NULL
)
1288 bios_name
= PROM_FILENAME
;
1289 snprintf(buf
, sizeof(buf
), "%s/%s", bios_dir
, bios_name
);
1290 ret
= load_elf(buf
, hwdef
->slavio_base
- PROM_VADDR
, NULL
, NULL
, NULL
);
1291 if (ret
< 0 || ret
> PROM_SIZE_MAX
)
1292 ret
= load_image_targphys(buf
, hwdef
->slavio_base
, PROM_SIZE_MAX
);
1293 if (ret
< 0 || ret
> PROM_SIZE_MAX
) {
1294 fprintf(stderr
, "qemu: could not load prom '%s'\n",
1299 /* set up devices */
1300 sbi
= sbi_init(hwdef
->sbi_base
, &sbi_irq
, &sbi_cpu_irq
, cpu_irqs
);
1302 for (i
= 0; i
< MAX_IOUNITS
; i
++)
1303 if (hwdef
->iounit_bases
[i
] != (target_phys_addr_t
)-1)
1304 iounits
[i
] = iommu_init(hwdef
->iounit_bases
[i
],
1305 hwdef
->iounit_version
,
1306 sbi_irq
[hwdef
->me_irq
]);
1308 espdma
= sparc32_dma_init(hwdef
->espdma_base
, sbi_irq
[hwdef
->esp_irq
],
1309 iounits
[0], &espdma_irq
, &esp_reset
);
1311 ledma
= sparc32_dma_init(hwdef
->ledma_base
, sbi_irq
[hwdef
->le_irq
],
1312 iounits
[0], &ledma_irq
, &le_reset
);
1314 if (graphic_depth
!= 8 && graphic_depth
!= 24) {
1315 fprintf(stderr
, "qemu: Unsupported depth: %d\n", graphic_depth
);
1318 tcx_offset
= qemu_ram_alloc(hwdef
->vram_size
);
1319 tcx_init(hwdef
->tcx_base
, phys_ram_base
+ tcx_offset
, tcx_offset
,
1320 hwdef
->vram_size
, graphic_width
, graphic_height
, graphic_depth
);
1322 lance_init(&nd_table
[0], hwdef
->le_base
, ledma
, *ledma_irq
, le_reset
);
1324 nvram
= m48t59_init(sbi_irq
[0], hwdef
->nvram_base
, 0,
1325 hwdef
->nvram_size
, 8);
1327 slavio_timer_init_all(hwdef
->counter_base
, sbi_irq
[hwdef
->clock1_irq
],
1328 sbi_cpu_irq
, smp_cpus
);
1330 slavio_serial_ms_kbd_init(hwdef
->ms_kb_base
, sbi_irq
[hwdef
->ms_kb_irq
],
1331 nographic
, ESCC_CLOCK
, 1);
1332 // Slavio TTYA (base+4, Linux ttyS0) is the first Qemu serial device
1333 // Slavio TTYB (base+0, Linux ttyS1) is the second Qemu serial device
1334 escc_init(hwdef
->serial_base
, sbi_irq
[hwdef
->ser_irq
], sbi_irq
[hwdef
->ser_irq
],
1335 serial_hds
[0], serial_hds
[1], ESCC_CLOCK
, 1);
1337 if (drive_get_max_bus(IF_SCSI
) > 0) {
1338 fprintf(stderr
, "qemu: too many SCSI bus\n");
1342 main_esp
= esp_init(hwdef
->esp_base
, 2,
1343 espdma_memory_read
, espdma_memory_write
,
1344 espdma
, *espdma_irq
, esp_reset
);
1346 for (i
= 0; i
< ESP_MAX_DEVS
; i
++) {
1347 drive_index
= drive_get_index(IF_SCSI
, 0, i
);
1348 if (drive_index
== -1)
1350 esp_scsi_attach(main_esp
, drives_table
[drive_index
].bdrv
, i
);
1353 kernel_size
= sun4m_load_kernel(kernel_filename
, initrd_filename
,
1356 nvram_init(nvram
, (uint8_t *)&nd_table
[0].macaddr
, kernel_cmdline
,
1357 boot_device
, RAM_size
, kernel_size
, graphic_width
,
1358 graphic_height
, graphic_depth
, hwdef
->nvram_machine_id
,
1361 fw_cfg
= fw_cfg_init(0, 0, CFG_ADDR
, CFG_ADDR
+ 2);
1362 fw_cfg_add_i32(fw_cfg
, FW_CFG_ID
, 1);
1363 fw_cfg_add_i64(fw_cfg
, FW_CFG_RAM_SIZE
, (uint64_t)ram_size
);
1364 fw_cfg_add_i16(fw_cfg
, FW_CFG_MACHINE_ID
, hwdef
->machine_id
);
1367 /* SPARCserver 1000 hardware initialisation */
1368 static void ss1000_init(ram_addr_t RAM_size
, int vga_ram_size
,
1369 const char *boot_device
,
1370 const char *kernel_filename
, const char *kernel_cmdline
,
1371 const char *initrd_filename
, const char *cpu_model
)
1373 sun4d_hw_init(&sun4d_hwdefs
[0], RAM_size
, boot_device
, kernel_filename
,
1374 kernel_cmdline
, initrd_filename
, cpu_model
);
1377 /* SPARCcenter 2000 hardware initialisation */
1378 static void ss2000_init(ram_addr_t RAM_size
, int vga_ram_size
,
1379 const char *boot_device
,
1380 const char *kernel_filename
, const char *kernel_cmdline
,
1381 const char *initrd_filename
, const char *cpu_model
)
1383 sun4d_hw_init(&sun4d_hwdefs
[1], RAM_size
, boot_device
, kernel_filename
,
1384 kernel_cmdline
, initrd_filename
, cpu_model
);
1387 QEMUMachine ss1000_machine
= {
1389 .desc
= "Sun4d platform, SPARCserver 1000",
1390 .init
= ss1000_init
,
1391 .ram_require
= PROM_SIZE_MAX
+ TCX_SIZE
,
1397 QEMUMachine ss2000_machine
= {
1399 .desc
= "Sun4d platform, SPARCcenter 2000",
1400 .init
= ss2000_init
,
1401 .ram_require
= PROM_SIZE_MAX
+ TCX_SIZE
,
1407 static const struct sun4c_hwdef sun4c_hwdefs
[] = {
1410 .iommu_base
= 0xf8000000,
1411 .tcx_base
= 0xfe000000,
1412 .slavio_base
= 0xf6000000,
1413 .intctl_base
= 0xf5000000,
1414 .counter_base
= 0xf3000000,
1415 .ms_kb_base
= 0xf0000000,
1416 .serial_base
= 0xf1000000,
1417 .nvram_base
= 0xf2000000,
1418 .fd_base
= 0xf7200000,
1419 .dma_base
= 0xf8400000,
1420 .esp_base
= 0xf8800000,
1421 .le_base
= 0xf8c00000,
1422 .aux1_base
= 0xf7400003,
1423 .vram_size
= 0x00100000,
1424 .nvram_size
= 0x800,
1433 .nvram_machine_id
= 0x55,
1434 .machine_id
= ss2_id
,
1435 .max_mem
= 0x10000000,
1436 .default_cpu_model
= "Cypress CY7C601",
1440 static void sun4c_hw_init(const struct sun4c_hwdef
*hwdef
, ram_addr_t RAM_size
,
1441 const char *boot_device
,
1442 const char *kernel_filename
,
1443 const char *kernel_cmdline
,
1444 const char *initrd_filename
, const char *cpu_model
)
1448 void *iommu
, *espdma
, *ledma
, *main_esp
, *nvram
;
1449 qemu_irq
*cpu_irqs
, *slavio_irq
, *espdma_irq
, *ledma_irq
;
1450 qemu_irq
*esp_reset
, *le_reset
;
1452 ram_addr_t ram_offset
, prom_offset
, tcx_offset
;
1453 unsigned long kernel_size
;
1456 BlockDriverState
*fd
[MAX_FD
];
1462 cpu_model
= hwdef
->default_cpu_model
;
1464 env
= cpu_init(cpu_model
);
1466 fprintf(stderr
, "qemu: Unable to find Sparc CPU definition\n");
1470 cpu_sparc_set_id(env
, 0);
1472 qemu_register_reset(main_cpu_reset
, env
);
1473 cpu_irqs
= qemu_allocate_irqs(cpu_set_irq
, env
, MAX_PILS
);
1474 env
->prom_addr
= hwdef
->slavio_base
;
1477 if ((uint64_t)RAM_size
> hwdef
->max_mem
) {
1479 "qemu: Too much memory for this machine: %d, maximum %d\n",
1480 (unsigned int)(RAM_size
/ (1024 * 1024)),
1481 (unsigned int)(hwdef
->max_mem
/ (1024 * 1024)));
1484 ram_offset
= qemu_ram_alloc(RAM_size
);
1485 cpu_register_physical_memory(0, RAM_size
, ram_offset
);
1487 /* load boot prom */
1488 prom_offset
= qemu_ram_alloc(PROM_SIZE_MAX
);
1489 cpu_register_physical_memory(hwdef
->slavio_base
,
1490 (PROM_SIZE_MAX
+ TARGET_PAGE_SIZE
- 1) &
1492 prom_offset
| IO_MEM_ROM
);
1494 if (bios_name
== NULL
)
1495 bios_name
= PROM_FILENAME
;
1496 snprintf(buf
, sizeof(buf
), "%s/%s", bios_dir
, bios_name
);
1497 ret
= load_elf(buf
, hwdef
->slavio_base
- PROM_VADDR
, NULL
, NULL
, NULL
);
1498 if (ret
< 0 || ret
> PROM_SIZE_MAX
)
1499 ret
= load_image_targphys(buf
, hwdef
->slavio_base
, PROM_SIZE_MAX
);
1500 if (ret
< 0 || ret
> PROM_SIZE_MAX
) {
1501 fprintf(stderr
, "qemu: could not load prom '%s'\n",
1506 /* set up devices */
1507 slavio_intctl
= sun4c_intctl_init(hwdef
->intctl_base
,
1508 &slavio_irq
, cpu_irqs
);
1510 iommu
= iommu_init(hwdef
->iommu_base
, hwdef
->iommu_version
,
1511 slavio_irq
[hwdef
->me_irq
]);
1513 espdma
= sparc32_dma_init(hwdef
->dma_base
, slavio_irq
[hwdef
->esp_irq
],
1514 iommu
, &espdma_irq
, &esp_reset
);
1516 ledma
= sparc32_dma_init(hwdef
->dma_base
+ 16ULL,
1517 slavio_irq
[hwdef
->le_irq
], iommu
, &ledma_irq
,
1520 if (graphic_depth
!= 8 && graphic_depth
!= 24) {
1521 fprintf(stderr
, "qemu: Unsupported depth: %d\n", graphic_depth
);
1524 tcx_offset
= qemu_ram_alloc(hwdef
->vram_size
);
1525 tcx_init(hwdef
->tcx_base
, phys_ram_base
+ tcx_offset
, tcx_offset
,
1526 hwdef
->vram_size
, graphic_width
, graphic_height
, graphic_depth
);
1528 lance_init(&nd_table
[0], hwdef
->le_base
, ledma
, *ledma_irq
, le_reset
);
1530 nvram
= m48t59_init(slavio_irq
[0], hwdef
->nvram_base
, 0,
1531 hwdef
->nvram_size
, 2);
1533 slavio_serial_ms_kbd_init(hwdef
->ms_kb_base
, slavio_irq
[hwdef
->ms_kb_irq
],
1534 nographic
, ESCC_CLOCK
, 1);
1535 // Slavio TTYA (base+4, Linux ttyS0) is the first Qemu serial device
1536 // Slavio TTYB (base+0, Linux ttyS1) is the second Qemu serial device
1537 escc_init(hwdef
->serial_base
, slavio_irq
[hwdef
->ser_irq
],
1538 slavio_irq
[hwdef
->ser_irq
], serial_hds
[0], serial_hds
[1],
1541 slavio_misc
= slavio_misc_init(0, 0, hwdef
->aux1_base
, 0,
1542 slavio_irq
[hwdef
->me_irq
], NULL
, &fdc_tc
);
1544 if (hwdef
->fd_base
!= (target_phys_addr_t
)-1) {
1545 /* there is zero or one floppy drive */
1546 memset(fd
, 0, sizeof(fd
));
1547 drive_index
= drive_get_index(IF_FLOPPY
, 0, 0);
1548 if (drive_index
!= -1)
1549 fd
[0] = drives_table
[drive_index
].bdrv
;
1551 sun4m_fdctrl_init(slavio_irq
[hwdef
->fd_irq
], hwdef
->fd_base
, fd
,
1555 if (drive_get_max_bus(IF_SCSI
) > 0) {
1556 fprintf(stderr
, "qemu: too many SCSI bus\n");
1560 main_esp
= esp_init(hwdef
->esp_base
, 2,
1561 espdma_memory_read
, espdma_memory_write
,
1562 espdma
, *espdma_irq
, esp_reset
);
1564 for (i
= 0; i
< ESP_MAX_DEVS
; i
++) {
1565 drive_index
= drive_get_index(IF_SCSI
, 0, i
);
1566 if (drive_index
== -1)
1568 esp_scsi_attach(main_esp
, drives_table
[drive_index
].bdrv
, i
);
1571 kernel_size
= sun4m_load_kernel(kernel_filename
, initrd_filename
,
1574 nvram_init(nvram
, (uint8_t *)&nd_table
[0].macaddr
, kernel_cmdline
,
1575 boot_device
, RAM_size
, kernel_size
, graphic_width
,
1576 graphic_height
, graphic_depth
, hwdef
->nvram_machine_id
,
1579 fw_cfg
= fw_cfg_init(0, 0, CFG_ADDR
, CFG_ADDR
+ 2);
1580 fw_cfg_add_i32(fw_cfg
, FW_CFG_ID
, 1);
1581 fw_cfg_add_i64(fw_cfg
, FW_CFG_RAM_SIZE
, (uint64_t)ram_size
);
1582 fw_cfg_add_i16(fw_cfg
, FW_CFG_MACHINE_ID
, hwdef
->machine_id
);
1585 /* SPARCstation 2 hardware initialisation */
1586 static void ss2_init(ram_addr_t RAM_size
, int vga_ram_size
,
1587 const char *boot_device
,
1588 const char *kernel_filename
, const char *kernel_cmdline
,
1589 const char *initrd_filename
, const char *cpu_model
)
1591 sun4c_hw_init(&sun4c_hwdefs
[0], RAM_size
, boot_device
, kernel_filename
,
1592 kernel_cmdline
, initrd_filename
, cpu_model
);
1595 QEMUMachine ss2_machine
= {
1597 .desc
= "Sun4c platform, SPARCstation 2",
1599 .ram_require
= PROM_SIZE_MAX
+ TCX_SIZE
,