]> git.proxmox.com Git - qemu.git/blob - hw/sun4m.c
Make DMA bottom-half driven (v2)
[qemu.git] / hw / sun4m.c
1 /*
2 * QEMU Sun4m & Sun4d & Sun4c System Emulator
3 *
4 * Copyright (c) 2003-2005 Fabrice Bellard
5 *
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:
12 *
13 * The above copyright notice and this permission notice shall be included in
14 * all copies or substantial portions of the Software.
15 *
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.
23 */
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"
37 #include "fw_cfg.h"
38
39 //#define DEBUG_IRQ
40
41 /*
42 * Sun4m architecture was used in the following machines:
43 *
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
52 * SPARCstation 4
53 *
54 * Sun4d architecture was used in the following machines:
55 *
56 * SPARCcenter 2000
57 * SPARCserver 1000
58 *
59 * Sun4c architecture was used in the following machines:
60 * SPARCstation 1/1+, SPARCserver 1/1+
61 * SPARCstation SLC
62 * SPARCstation IPC
63 * SPARCstation ELC
64 * SPARCstation IPX
65 *
66 * See for example: http://www.sunhelp.org/faq/sunref1.html
67 */
68
69 #ifdef DEBUG_IRQ
70 #define DPRINTF(fmt, args...) \
71 do { printf("CPUIRQ: " fmt , ##args); } while (0)
72 #else
73 #define DPRINTF(fmt, args...)
74 #endif
75
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)
84
85 // Control plane, 8-bit and 24-bit planes
86 #define TCX_SIZE (9 * 1024 * 1024)
87
88 #define MAX_CPUS 16
89 #define MAX_PILS 16
90
91 struct sun4m_hwdef {
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;
98 uint32_t ecc_version;
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;
105 uint16_t machine_id;
106 uint32_t iommu_version;
107 uint32_t intbit_to_level[32];
108 uint64_t max_mem;
109 const char * const default_cpu_model;
110 };
111
112 #define MAX_IOUNITS 5
113
114 struct sun4d_hwdef {
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;
127 uint16_t machine_id;
128 uint32_t iounit_version;
129 uint64_t max_mem;
130 const char * const default_cpu_model;
131 };
132
133 struct sun4c_hwdef {
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;
145 uint16_t machine_id;
146 uint32_t iommu_version;
147 uint32_t intbit_to_level[32];
148 uint64_t max_mem;
149 const char * const default_cpu_model;
150 };
151
152 int DMA_get_channel_mode (int nchan)
153 {
154 return 0;
155 }
156 int DMA_read_memory (int nchan, void *buf, int pos, int size)
157 {
158 return 0;
159 }
160 int DMA_write_memory (int nchan, void *buf, int pos, int size)
161 {
162 return 0;
163 }
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,
170 void *opaque)
171 {
172 }
173
174 static int nvram_boot_set(void *opaque, const char *boot_device)
175 {
176 unsigned int i;
177 uint8_t image[sizeof(ohwcfg_v3_t)];
178 ohwcfg_v3_t *header = (ohwcfg_v3_t *)ℑ
179 m48t59_t *nvram = (m48t59_t *)opaque;
180
181 for (i = 0; i < sizeof(image); i++)
182 image[i] = m48t59_read(nvram, i) & 0xff;
183
184 pstrcpy((char *)header->boot_devices, sizeof(header->boot_devices),
185 boot_device);
186 header->nboot_devices = strlen(boot_device) & 0xff;
187 header->crc = cpu_to_be16(OHW_compute_crc(header, 0x00, 0xF8));
188
189 for (i = 0; i < sizeof(image); i++)
190 m48t59_write(nvram, i, image[i]);
191
192 return 0;
193 }
194
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)
200 {
201 unsigned int i;
202 uint32_t start, end;
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;
207
208 memset(image, '\0', sizeof(image));
209
210 // Try to match PPC NVRAM
211 pstrcpy((char *)header->struct_ident, sizeof(header->struct_ident),
212 "QEMU_BIOS");
213 header->struct_version = cpu_to_be32(3); /* structure v3 */
214
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),
223 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);
227 if (cmdline) {
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));
231 }
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);
236 if (nographic)
237 header->graphic_flags = cpu_to_be16(OHW_GF_NOGRAPHICS);
238
239 header->crc = cpu_to_be16(OHW_compute_crc(header, 0x00, 0xF8));
240
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);
246
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");
252
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]);
256
257 // End marker
258 image[end++] = '\0';
259
260 end = start + ((end - start + 15) & ~15);
261 OpenBIOS_finish_partition(part_header, end - start);
262
263 // free partition
264 start = end;
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");
268
269 end = 0x1fd0;
270 OpenBIOS_finish_partition(part_header, end - start);
271
272 Sun_init_header((struct Sun_nvram *)&image[0x1fd8], macaddr,
273 nvram_machine_id);
274
275 for (i = 0; i < sizeof(image); i++)
276 m48t59_write(nvram, i, image[i]);
277
278 qemu_register_boot_set(nvram_boot_set, nvram);
279 }
280
281 static void *slavio_intctl;
282
283 void pic_info(void)
284 {
285 if (slavio_intctl)
286 slavio_pic_info(slavio_intctl);
287 }
288
289 void irq_info(void)
290 {
291 if (slavio_intctl)
292 slavio_irq_info(slavio_intctl);
293 }
294
295 void cpu_check_irqs(CPUState *env)
296 {
297 if (env->pil_in && (env->interrupt_index == 0 ||
298 (env->interrupt_index & ~15) == TT_EXTINT)) {
299 unsigned int i;
300
301 for (i = 15; i > 0; i--) {
302 if (env->pil_in & (1 << i)) {
303 int old_interrupt = env->interrupt_index;
304
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);
309 }
310 break;
311 }
312 }
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);
317 }
318 }
319
320 static void cpu_set_irq(void *opaque, int irq, int level)
321 {
322 CPUState *env = opaque;
323
324 if (level) {
325 DPRINTF("Raise CPU IRQ %d\n", irq);
326 env->halted = 0;
327 env->pil_in |= 1 << irq;
328 cpu_check_irqs(env);
329 } else {
330 DPRINTF("Lower CPU IRQ %d\n", irq);
331 env->pil_in &= ~(1 << irq);
332 cpu_check_irqs(env);
333 }
334 }
335
336 static void dummy_cpu_set_irq(void *opaque, int irq, int level)
337 {
338 }
339
340 static void *slavio_misc;
341
342 void qemu_system_powerdown(void)
343 {
344 slavio_set_power_fail(slavio_misc, 1);
345 }
346
347 static void main_cpu_reset(void *opaque)
348 {
349 CPUState *env = opaque;
350
351 cpu_reset(env);
352 env->halted = 0;
353 }
354
355 static void secondary_cpu_reset(void *opaque)
356 {
357 CPUState *env = opaque;
358
359 cpu_reset(env);
360 env->halted = 1;
361 }
362
363 static unsigned long sun4m_load_kernel(const char *kernel_filename,
364 const char *initrd_filename,
365 ram_addr_t RAM_size)
366 {
367 int linux_boot;
368 unsigned int i;
369 long initrd_size, kernel_size;
370
371 linux_boot = (kernel_filename != NULL);
372
373 kernel_size = 0;
374 if (linux_boot) {
375 kernel_size = load_elf(kernel_filename, -0xf0000000ULL, NULL, NULL,
376 NULL);
377 if (kernel_size < 0)
378 kernel_size = load_aout(kernel_filename, KERNEL_LOAD_ADDR,
379 RAM_size - KERNEL_LOAD_ADDR);
380 if (kernel_size < 0)
381 kernel_size = load_image_targphys(kernel_filename,
382 KERNEL_LOAD_ADDR,
383 RAM_size - KERNEL_LOAD_ADDR);
384 if (kernel_size < 0) {
385 fprintf(stderr, "qemu: could not load kernel '%s'\n",
386 kernel_filename);
387 exit(1);
388 }
389
390 /* load initrd */
391 initrd_size = 0;
392 if (initrd_filename) {
393 initrd_size = load_image_targphys(initrd_filename,
394 INITRD_LOAD_ADDR,
395 RAM_size - INITRD_LOAD_ADDR);
396 if (initrd_size < 0) {
397 fprintf(stderr, "qemu: could not load initial ram disk '%s'\n",
398 initrd_filename);
399 exit(1);
400 }
401 }
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);
407 break;
408 }
409 }
410 }
411 }
412 return kernel_size;
413 }
414
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)
420
421 {
422 CPUState *env, *envs[MAX_CPUS];
423 unsigned int i;
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;
428 qemu_irq *fdc_tc;
429 unsigned long prom_offset, kernel_size;
430 int ret;
431 char buf[1024];
432 BlockDriverState *fd[MAX_FD];
433 int drive_index;
434 void *fw_cfg;
435
436 /* init CPUs */
437 if (!cpu_model)
438 cpu_model = hwdef->default_cpu_model;
439
440 for(i = 0; i < smp_cpus; i++) {
441 env = cpu_init(cpu_model);
442 if (!env) {
443 fprintf(stderr, "qemu: Unable to find Sparc CPU definition\n");
444 exit(1);
445 }
446 cpu_sparc_set_id(env, i);
447 envs[i] = env;
448 if (i == 0) {
449 qemu_register_reset(main_cpu_reset, env);
450 } else {
451 qemu_register_reset(secondary_cpu_reset, env);
452 env->halted = 1;
453 }
454 cpu_irqs[i] = qemu_allocate_irqs(cpu_set_irq, envs[i], MAX_PILS);
455 env->prom_addr = hwdef->slavio_base;
456 }
457
458 for (i = smp_cpus; i < MAX_CPUS; i++)
459 cpu_irqs[i] = qemu_allocate_irqs(dummy_cpu_set_irq, NULL, MAX_PILS);
460
461
462 /* allocate RAM */
463 if ((uint64_t)RAM_size > hwdef->max_mem) {
464 fprintf(stderr,
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)));
468 exit(1);
469 }
470 cpu_register_physical_memory(0, RAM_size, 0);
471
472 /* load boot prom */
473 prom_offset = RAM_size + hwdef->vram_size;
474 cpu_register_physical_memory(hwdef->slavio_base,
475 (PROM_SIZE_MAX + TARGET_PAGE_SIZE - 1) &
476 TARGET_PAGE_MASK,
477 prom_offset | IO_MEM_ROM);
478
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",
487 buf);
488 exit(1);
489 }
490 prom_offset += (ret + TARGET_PAGE_SIZE - 1) & TARGET_PAGE_MASK;
491
492 /* set up devices */
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,
497 cpu_irqs,
498 hwdef->clock_irq);
499
500 if (hwdef->idreg_base != (target_phys_addr_t)-1) {
501 static const uint8_t idreg_data[] = { 0xfe, 0x81, 0x01, 0x03 };
502
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,
506 sizeof(idreg_data));
507 }
508
509 iommu = iommu_init(hwdef->iommu_base, hwdef->iommu_version,
510 slavio_irq[hwdef->me_irq]);
511
512 espdma = sparc32_dma_init(hwdef->dma_base, slavio_irq[hwdef->esp_irq],
513 iommu, &espdma_irq, &esp_reset);
514
515 ledma = sparc32_dma_init(hwdef->dma_base + 16ULL,
516 slavio_irq[hwdef->le_irq], iommu, &ledma_irq,
517 &le_reset);
518
519 if (graphic_depth != 8 && graphic_depth != 24) {
520 fprintf(stderr, "qemu: Unsupported depth: %d\n", graphic_depth);
521 exit (1);
522 }
523 tcx_init(ds, hwdef->tcx_base, phys_ram_base + RAM_size, RAM_size,
524 hwdef->vram_size, graphic_width, graphic_height, graphic_depth);
525
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");
531 exit (1);
532 } else {
533 fprintf(stderr, "qemu: Unsupported NIC: %s\n", nd_table[0].model);
534 exit (1);
535 }
536
537 nvram = m48t59_init(slavio_irq[0], hwdef->nvram_base, 0,
538 hwdef->nvram_size, 8);
539
540 slavio_timer_init_all(hwdef->counter_base, slavio_irq[hwdef->clock1_irq],
541 slavio_cpu_irq, smp_cpus);
542
543 slavio_serial_ms_kbd_init(hwdef->ms_kb_base, slavio_irq[hwdef->ms_kb_irq],
544 nographic);
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]);
549
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],
553 &fdc_tc);
554
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;
561
562 sun4m_fdctrl_init(slavio_irq[hwdef->fd_irq], hwdef->fd_base, fd,
563 fdc_tc);
564 }
565
566 if (drive_get_max_bus(IF_SCSI) > 0) {
567 fprintf(stderr, "qemu: too many SCSI bus\n");
568 exit(1);
569 }
570
571 main_esp = esp_init(hwdef->esp_base, 2,
572 espdma_memory_read, espdma_memory_write,
573 espdma, *espdma_irq, esp_reset);
574
575 for (i = 0; i < ESP_MAX_DEVS; i++) {
576 drive_index = drive_get_index(IF_SCSI, 0, i);
577 if (drive_index == -1)
578 continue;
579 esp_scsi_attach(main_esp, drives_table[drive_index].bdrv, i);
580 }
581
582 if (hwdef->cs_base != (target_phys_addr_t)-1)
583 cs_init(hwdef->cs_base, hwdef->cs_irq, slavio_intctl);
584
585 kernel_size = sun4m_load_kernel(kernel_filename, initrd_filename,
586 RAM_size);
587
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,
591 "Sun4m");
592
593 if (hwdef->ecc_base != (target_phys_addr_t)-1)
594 ecc_init(hwdef->ecc_base, slavio_irq[hwdef->ecc_irq],
595 hwdef->ecc_version);
596
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);
602 }
603
604 enum {
605 ss2_id = 0,
606 ss5_id = 32,
607 vger_id,
608 lx_id,
609 ss4_id,
610 scls_id,
611 sbook_id,
612 ss10_id = 64,
613 ss20_id,
614 ss600mp_id,
615 ss1000_id = 96,
616 ss2000_id,
617 };
618
619 static const struct sun4m_hwdef sun4m_hwdefs[] = {
620 /* SS-5 */
621 {
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,
639 .ecc_base = -1,
640 .vram_size = 0x00100000,
641 .nvram_size = 0x2000,
642 .esp_irq = 18,
643 .le_irq = 16,
644 .clock_irq = 7,
645 .clock1_irq = 19,
646 .ms_kb_irq = 14,
647 .ser_irq = 15,
648 .fd_irq = 22,
649 .me_irq = 30,
650 .cs_irq = 5,
651 .nvram_machine_id = 0x80,
652 .machine_id = ss5_id,
653 .iommu_version = 0x05000000,
654 .intbit_to_level = {
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,
657 },
658 .max_mem = 0x10000000,
659 .default_cpu_model = "Fujitsu MB86904",
660 },
661 /* SS-10 */
662 {
663 .iommu_base = 0xfe0000000ULL,
664 .tcx_base = 0xe20000000ULL,
665 .cs_base = -1,
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,
684 .esp_irq = 18,
685 .le_irq = 16,
686 .clock_irq = 7,
687 .clock1_irq = 19,
688 .ms_kb_irq = 14,
689 .ser_irq = 15,
690 .fd_irq = 22,
691 .me_irq = 30,
692 .cs_irq = -1,
693 .ecc_irq = 28,
694 .nvram_machine_id = 0x72,
695 .machine_id = ss10_id,
696 .iommu_version = 0x03000000,
697 .intbit_to_level = {
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,
700 },
701 .max_mem = 0xf00000000ULL,
702 .default_cpu_model = "TI SuperSparc II",
703 },
704 /* SS-600MP */
705 {
706 .iommu_base = 0xfe0000000ULL,
707 .tcx_base = 0xe20000000ULL,
708 .cs_base = -1,
709 .slavio_base = 0xff0000000ULL,
710 .ms_kb_base = 0xff1000000ULL,
711 .serial_base = 0xff1100000ULL,
712 .nvram_base = 0xff1200000ULL,
713 .fd_base = -1,
714 .counter_base = 0xff1300000ULL,
715 .intctl_base = 0xff1400000ULL,
716 .idreg_base = -1,
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,
727 .esp_irq = 18,
728 .le_irq = 16,
729 .clock_irq = 7,
730 .clock1_irq = 19,
731 .ms_kb_irq = 14,
732 .ser_irq = 15,
733 .fd_irq = 22,
734 .me_irq = 30,
735 .cs_irq = -1,
736 .ecc_irq = 28,
737 .nvram_machine_id = 0x71,
738 .machine_id = ss600mp_id,
739 .iommu_version = 0x01000000,
740 .intbit_to_level = {
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,
743 },
744 .max_mem = 0xf00000000ULL,
745 .default_cpu_model = "TI SuperSparc II",
746 },
747 /* SS-20 */
748 {
749 .iommu_base = 0xfe0000000ULL,
750 .tcx_base = 0xe20000000ULL,
751 .cs_base = -1,
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,
770 .esp_irq = 18,
771 .le_irq = 16,
772 .clock_irq = 7,
773 .clock1_irq = 19,
774 .ms_kb_irq = 14,
775 .ser_irq = 15,
776 .fd_irq = 22,
777 .me_irq = 30,
778 .cs_irq = -1,
779 .ecc_irq = 28,
780 .nvram_machine_id = 0x72,
781 .machine_id = ss20_id,
782 .iommu_version = 0x13000000,
783 .intbit_to_level = {
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,
786 },
787 .max_mem = 0xf00000000ULL,
788 .default_cpu_model = "TI SuperSparc II",
789 },
790 /* Voyager */
791 {
792 .iommu_base = 0x10000000,
793 .tcx_base = 0x50000000,
794 .cs_base = -1,
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,
809 .ecc_base = -1,
810 .vram_size = 0x00100000,
811 .nvram_size = 0x2000,
812 .esp_irq = 18,
813 .le_irq = 16,
814 .clock_irq = 7,
815 .clock1_irq = 19,
816 .ms_kb_irq = 14,
817 .ser_irq = 15,
818 .fd_irq = 22,
819 .me_irq = 30,
820 .cs_irq = -1,
821 .nvram_machine_id = 0x80,
822 .machine_id = vger_id,
823 .iommu_version = 0x05000000,
824 .intbit_to_level = {
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,
827 },
828 .max_mem = 0x10000000,
829 .default_cpu_model = "Fujitsu MB86904",
830 },
831 /* LX */
832 {
833 .iommu_base = 0x10000000,
834 .tcx_base = 0x50000000,
835 .cs_base = -1,
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,
847 .apc_base = -1,
848 .aux1_base = 0x71900000,
849 .aux2_base = 0x71910000,
850 .ecc_base = -1,
851 .vram_size = 0x00100000,
852 .nvram_size = 0x2000,
853 .esp_irq = 18,
854 .le_irq = 16,
855 .clock_irq = 7,
856 .clock1_irq = 19,
857 .ms_kb_irq = 14,
858 .ser_irq = 15,
859 .fd_irq = 22,
860 .me_irq = 30,
861 .cs_irq = -1,
862 .nvram_machine_id = 0x80,
863 .machine_id = lx_id,
864 .iommu_version = 0x04000000,
865 .intbit_to_level = {
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,
868 },
869 .max_mem = 0x10000000,
870 .default_cpu_model = "TI MicroSparc I",
871 },
872 /* SS-4 */
873 {
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,
891 .ecc_base = -1,
892 .vram_size = 0x00100000,
893 .nvram_size = 0x2000,
894 .esp_irq = 18,
895 .le_irq = 16,
896 .clock_irq = 7,
897 .clock1_irq = 19,
898 .ms_kb_irq = 14,
899 .ser_irq = 15,
900 .fd_irq = 22,
901 .me_irq = 30,
902 .cs_irq = 5,
903 .nvram_machine_id = 0x80,
904 .machine_id = ss4_id,
905 .iommu_version = 0x05000000,
906 .intbit_to_level = {
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,
909 },
910 .max_mem = 0x10000000,
911 .default_cpu_model = "Fujitsu MB86904",
912 },
913 /* SPARCClassic */
914 {
915 .iommu_base = 0x10000000,
916 .tcx_base = 0x50000000,
917 .cs_base = -1,
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,
932 .ecc_base = -1,
933 .vram_size = 0x00100000,
934 .nvram_size = 0x2000,
935 .esp_irq = 18,
936 .le_irq = 16,
937 .clock_irq = 7,
938 .clock1_irq = 19,
939 .ms_kb_irq = 14,
940 .ser_irq = 15,
941 .fd_irq = 22,
942 .me_irq = 30,
943 .cs_irq = -1,
944 .nvram_machine_id = 0x80,
945 .machine_id = scls_id,
946 .iommu_version = 0x05000000,
947 .intbit_to_level = {
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,
950 },
951 .max_mem = 0x10000000,
952 .default_cpu_model = "TI MicroSparc I",
953 },
954 /* SPARCbook */
955 {
956 .iommu_base = 0x10000000,
957 .tcx_base = 0x50000000, // XXX
958 .cs_base = -1,
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,
973 .ecc_base = -1,
974 .vram_size = 0x00100000,
975 .nvram_size = 0x2000,
976 .esp_irq = 18,
977 .le_irq = 16,
978 .clock_irq = 7,
979 .clock1_irq = 19,
980 .ms_kb_irq = 14,
981 .ser_irq = 15,
982 .fd_irq = 22,
983 .me_irq = 30,
984 .cs_irq = -1,
985 .nvram_machine_id = 0x80,
986 .machine_id = sbook_id,
987 .iommu_version = 0x05000000,
988 .intbit_to_level = {
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,
991 },
992 .max_mem = 0x10000000,
993 .default_cpu_model = "TI MicroSparc I",
994 },
995 };
996
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)
1002 {
1003 sun4m_hw_init(&sun4m_hwdefs[0], RAM_size, boot_device, ds, kernel_filename,
1004 kernel_cmdline, initrd_filename, cpu_model);
1005 }
1006
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)
1012 {
1013 sun4m_hw_init(&sun4m_hwdefs[1], RAM_size, boot_device, ds, kernel_filename,
1014 kernel_cmdline, initrd_filename, cpu_model);
1015 }
1016
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)
1023 {
1024 sun4m_hw_init(&sun4m_hwdefs[2], RAM_size, boot_device, ds, kernel_filename,
1025 kernel_cmdline, initrd_filename, cpu_model);
1026 }
1027
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)
1033 {
1034 sun4m_hw_init(&sun4m_hwdefs[3], RAM_size, boot_device, ds, kernel_filename,
1035 kernel_cmdline, initrd_filename, cpu_model);
1036 }
1037
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)
1043 {
1044 sun4m_hw_init(&sun4m_hwdefs[4], RAM_size, boot_device, ds, kernel_filename,
1045 kernel_cmdline, initrd_filename, cpu_model);
1046 }
1047
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)
1053 {
1054 sun4m_hw_init(&sun4m_hwdefs[5], RAM_size, boot_device, ds, kernel_filename,
1055 kernel_cmdline, initrd_filename, cpu_model);
1056 }
1057
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)
1063 {
1064 sun4m_hw_init(&sun4m_hwdefs[6], RAM_size, boot_device, ds, kernel_filename,
1065 kernel_cmdline, initrd_filename, cpu_model);
1066 }
1067
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)
1073 {
1074 sun4m_hw_init(&sun4m_hwdefs[7], RAM_size, boot_device, ds, kernel_filename,
1075 kernel_cmdline, initrd_filename, cpu_model);
1076 }
1077
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)
1083 {
1084 sun4m_hw_init(&sun4m_hwdefs[8], RAM_size, boot_device, ds, kernel_filename,
1085 kernel_cmdline, initrd_filename, cpu_model);
1086 }
1087
1088 QEMUMachine ss5_machine = {
1089 .name = "SS-5",
1090 .desc = "Sun4m platform, SPARCstation 5",
1091 .init = ss5_init,
1092 .ram_require = PROM_SIZE_MAX + TCX_SIZE,
1093 .nodisk_ok = 1,
1094 .use_scsi = 1,
1095 .max_cpus = 16,
1096 };
1097
1098 QEMUMachine ss10_machine = {
1099 .name = "SS-10",
1100 .desc = "Sun4m platform, SPARCstation 10",
1101 .init = ss10_init,
1102 .ram_require = PROM_SIZE_MAX + TCX_SIZE,
1103 .nodisk_ok = 1,
1104 .use_scsi = 1,
1105 .max_cpus = 16,
1106 };
1107
1108 QEMUMachine ss600mp_machine = {
1109 .name = "SS-600MP",
1110 .desc = "Sun4m platform, SPARCserver 600MP",
1111 .init = ss600mp_init,
1112 .ram_require = PROM_SIZE_MAX + TCX_SIZE,
1113 .nodisk_ok = 1,
1114 .use_scsi = 1,
1115 .max_cpus = 16,
1116 };
1117
1118 QEMUMachine ss20_machine = {
1119 .name = "SS-20",
1120 .desc = "Sun4m platform, SPARCstation 20",
1121 .init = ss20_init,
1122 .ram_require = PROM_SIZE_MAX + TCX_SIZE,
1123 .nodisk_ok = 1,
1124 .use_scsi = 1,
1125 .max_cpus = 16,
1126 };
1127
1128 QEMUMachine voyager_machine = {
1129 .name = "Voyager",
1130 .desc = "Sun4m platform, SPARCstation Voyager",
1131 .init = vger_init,
1132 .ram_require = PROM_SIZE_MAX + TCX_SIZE,
1133 .nodisk_ok = 1,
1134 .use_scsi = 1,
1135 .max_cpus = 16,
1136 };
1137
1138 QEMUMachine ss_lx_machine = {
1139 .name = "LX",
1140 .desc = "Sun4m platform, SPARCstation LX",
1141 .init = ss_lx_init,
1142 .ram_require = PROM_SIZE_MAX + TCX_SIZE,
1143 .nodisk_ok = 1,
1144 .use_scsi = 1,
1145 .max_cpus = 16,
1146 };
1147
1148 QEMUMachine ss4_machine = {
1149 .name = "SS-4",
1150 .desc = "Sun4m platform, SPARCstation 4",
1151 .init = ss4_init,
1152 .ram_require = PROM_SIZE_MAX + TCX_SIZE,
1153 .nodisk_ok = 1,
1154 .use_scsi = 1,
1155 .max_cpus = 16,
1156 };
1157
1158 QEMUMachine scls_machine = {
1159 .name = "SPARCClassic",
1160 .desc = "Sun4m platform, SPARCClassic",
1161 .init = scls_init,
1162 .ram_require = PROM_SIZE_MAX + TCX_SIZE,
1163 .nodisk_ok = 1,
1164 .use_scsi = 1,
1165 .max_cpus = 16,
1166 };
1167
1168 QEMUMachine sbook_machine = {
1169 .name = "SPARCbook",
1170 .desc = "Sun4m platform, SPARCbook",
1171 .init = sbook_init,
1172 .ram_require = PROM_SIZE_MAX + TCX_SIZE,
1173 .nodisk_ok = 1,
1174 .use_scsi = 1,
1175 .max_cpus = 16,
1176 };
1177
1178 static const struct sun4d_hwdef sun4d_hwdefs[] = {
1179 /* SS-1000 */
1180 {
1181 .iounit_bases = {
1182 0xfe0200000ULL,
1183 0xfe1200000ULL,
1184 0xfe2200000ULL,
1185 0xfe3200000ULL,
1186 -1,
1187 },
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,
1201 .esp_irq = 3,
1202 .le_irq = 4,
1203 .clock_irq = 14,
1204 .clock1_irq = 10,
1205 .ms_kb_irq = 12,
1206 .ser_irq = 12,
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",
1212 },
1213 /* SS-2000 */
1214 {
1215 .iounit_bases = {
1216 0xfe0200000ULL,
1217 0xfe1200000ULL,
1218 0xfe2200000ULL,
1219 0xfe3200000ULL,
1220 0xfe4200000ULL,
1221 },
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,
1235 .esp_irq = 3,
1236 .le_irq = 4,
1237 .clock_irq = 14,
1238 .clock1_irq = 10,
1239 .ms_kb_irq = 12,
1240 .ser_irq = 12,
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",
1246 },
1247 };
1248
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)
1254 {
1255 CPUState *env, *envs[MAX_CPUS];
1256 unsigned int i;
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;
1262 int ret;
1263 char buf[1024];
1264 int drive_index;
1265 void *fw_cfg;
1266
1267 /* init CPUs */
1268 if (!cpu_model)
1269 cpu_model = hwdef->default_cpu_model;
1270
1271 for (i = 0; i < smp_cpus; i++) {
1272 env = cpu_init(cpu_model);
1273 if (!env) {
1274 fprintf(stderr, "qemu: Unable to find Sparc CPU definition\n");
1275 exit(1);
1276 }
1277 cpu_sparc_set_id(env, i);
1278 envs[i] = env;
1279 if (i == 0) {
1280 qemu_register_reset(main_cpu_reset, env);
1281 } else {
1282 qemu_register_reset(secondary_cpu_reset, env);
1283 env->halted = 1;
1284 }
1285 cpu_irqs[i] = qemu_allocate_irqs(cpu_set_irq, envs[i], MAX_PILS);
1286 env->prom_addr = hwdef->slavio_base;
1287 }
1288
1289 for (i = smp_cpus; i < MAX_CPUS; i++)
1290 cpu_irqs[i] = qemu_allocate_irqs(dummy_cpu_set_irq, NULL, MAX_PILS);
1291
1292 /* allocate RAM */
1293 if ((uint64_t)RAM_size > hwdef->max_mem) {
1294 fprintf(stderr,
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)));
1298 exit(1);
1299 }
1300 cpu_register_physical_memory(0, RAM_size, 0);
1301
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) &
1306 TARGET_PAGE_MASK,
1307 prom_offset | IO_MEM_ROM);
1308
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",
1317 buf);
1318 exit(1);
1319 }
1320
1321 /* set up devices */
1322 sbi = sbi_init(hwdef->sbi_base, &sbi_irq, &sbi_cpu_irq, cpu_irqs);
1323
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]);
1329
1330 espdma = sparc32_dma_init(hwdef->espdma_base, sbi_irq[hwdef->esp_irq],
1331 iounits[0], &espdma_irq, &esp_reset);
1332
1333 ledma = sparc32_dma_init(hwdef->ledma_base, sbi_irq[hwdef->le_irq],
1334 iounits[0], &ledma_irq, &le_reset);
1335
1336 if (graphic_depth != 8 && graphic_depth != 24) {
1337 fprintf(stderr, "qemu: Unsupported depth: %d\n", graphic_depth);
1338 exit (1);
1339 }
1340 tcx_init(ds, hwdef->tcx_base, phys_ram_base + RAM_size, RAM_size,
1341 hwdef->vram_size, graphic_width, graphic_height, graphic_depth);
1342
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");
1348 exit (1);
1349 } else {
1350 fprintf(stderr, "qemu: Unsupported NIC: %s\n", nd_table[0].model);
1351 exit (1);
1352 }
1353
1354 nvram = m48t59_init(sbi_irq[0], hwdef->nvram_base, 0,
1355 hwdef->nvram_size, 8);
1356
1357 slavio_timer_init_all(hwdef->counter_base, sbi_irq[hwdef->clock1_irq],
1358 sbi_cpu_irq, smp_cpus);
1359
1360 slavio_serial_ms_kbd_init(hwdef->ms_kb_base, sbi_irq[hwdef->ms_kb_irq],
1361 nographic);
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]);
1366
1367 if (drive_get_max_bus(IF_SCSI) > 0) {
1368 fprintf(stderr, "qemu: too many SCSI bus\n");
1369 exit(1);
1370 }
1371
1372 main_esp = esp_init(hwdef->esp_base, 2,
1373 espdma_memory_read, espdma_memory_write,
1374 espdma, *espdma_irq, esp_reset);
1375
1376 for (i = 0; i < ESP_MAX_DEVS; i++) {
1377 drive_index = drive_get_index(IF_SCSI, 0, i);
1378 if (drive_index == -1)
1379 continue;
1380 esp_scsi_attach(main_esp, drives_table[drive_index].bdrv, i);
1381 }
1382
1383 kernel_size = sun4m_load_kernel(kernel_filename, initrd_filename,
1384 RAM_size);
1385
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,
1389 "Sun4d");
1390
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);
1395 }
1396
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)
1402 {
1403 sun4d_hw_init(&sun4d_hwdefs[0], RAM_size, boot_device, ds, kernel_filename,
1404 kernel_cmdline, initrd_filename, cpu_model);
1405 }
1406
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)
1412 {
1413 sun4d_hw_init(&sun4d_hwdefs[1], RAM_size, boot_device, ds, kernel_filename,
1414 kernel_cmdline, initrd_filename, cpu_model);
1415 }
1416
1417 QEMUMachine ss1000_machine = {
1418 .name = "SS-1000",
1419 .desc = "Sun4d platform, SPARCserver 1000",
1420 .init = ss1000_init,
1421 .ram_require = PROM_SIZE_MAX + TCX_SIZE,
1422 .nodisk_ok = 1,
1423 .use_scsi = 1,
1424 .max_cpus = 16,
1425 };
1426
1427 QEMUMachine ss2000_machine = {
1428 .name = "SS-2000",
1429 .desc = "Sun4d platform, SPARCcenter 2000",
1430 .init = ss2000_init,
1431 .ram_require = PROM_SIZE_MAX + TCX_SIZE,
1432 .nodisk_ok = 1,
1433 .use_scsi = 1,
1434 .max_cpus = 16,
1435 };
1436
1437 static const struct sun4c_hwdef sun4c_hwdefs[] = {
1438 /* SS-2 */
1439 {
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,
1455 .esp_irq = 2,
1456 .le_irq = 3,
1457 .clock_irq = 5,
1458 .clock1_irq = 7,
1459 .ms_kb_irq = 1,
1460 .ser_irq = 1,
1461 .fd_irq = 1,
1462 .me_irq = 1,
1463 .nvram_machine_id = 0x55,
1464 .machine_id = ss2_id,
1465 .max_mem = 0x10000000,
1466 .default_cpu_model = "Cypress CY7C601",
1467 },
1468 };
1469
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)
1475 {
1476 CPUState *env;
1477 unsigned int i;
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;
1481 qemu_irq *fdc_tc;
1482 unsigned long prom_offset, kernel_size;
1483 int ret;
1484 char buf[1024];
1485 BlockDriverState *fd[MAX_FD];
1486 int drive_index;
1487 void *fw_cfg;
1488
1489 /* init CPU */
1490 if (!cpu_model)
1491 cpu_model = hwdef->default_cpu_model;
1492
1493 env = cpu_init(cpu_model);
1494 if (!env) {
1495 fprintf(stderr, "qemu: Unable to find Sparc CPU definition\n");
1496 exit(1);
1497 }
1498
1499 cpu_sparc_set_id(env, 0);
1500
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;
1504
1505 /* allocate RAM */
1506 if ((uint64_t)RAM_size > hwdef->max_mem) {
1507 fprintf(stderr,
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)));
1511 exit(1);
1512 }
1513 cpu_register_physical_memory(0, RAM_size, 0);
1514
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) &
1519 TARGET_PAGE_MASK,
1520 prom_offset | IO_MEM_ROM);
1521
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",
1530 buf);
1531 exit(1);
1532 }
1533 prom_offset += (ret + TARGET_PAGE_SIZE - 1) & TARGET_PAGE_MASK;
1534
1535 /* set up devices */
1536 slavio_intctl = sun4c_intctl_init(hwdef->intctl_base,
1537 &slavio_irq, cpu_irqs);
1538
1539 iommu = iommu_init(hwdef->iommu_base, hwdef->iommu_version,
1540 slavio_irq[hwdef->me_irq]);
1541
1542 espdma = sparc32_dma_init(hwdef->dma_base, slavio_irq[hwdef->esp_irq],
1543 iommu, &espdma_irq, &esp_reset);
1544
1545 ledma = sparc32_dma_init(hwdef->dma_base + 16ULL,
1546 slavio_irq[hwdef->le_irq], iommu, &ledma_irq,
1547 &le_reset);
1548
1549 if (graphic_depth != 8 && graphic_depth != 24) {
1550 fprintf(stderr, "qemu: Unsupported depth: %d\n", graphic_depth);
1551 exit (1);
1552 }
1553 tcx_init(ds, hwdef->tcx_base, phys_ram_base + RAM_size, RAM_size,
1554 hwdef->vram_size, graphic_width, graphic_height, graphic_depth);
1555
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");
1561 exit (1);
1562 } else {
1563 fprintf(stderr, "qemu: Unsupported NIC: %s\n", nd_table[0].model);
1564 exit (1);
1565 }
1566
1567 nvram = m48t59_init(slavio_irq[0], hwdef->nvram_base, 0,
1568 hwdef->nvram_size, 2);
1569
1570 slavio_serial_ms_kbd_init(hwdef->ms_kb_base, slavio_irq[hwdef->ms_kb_irq],
1571 nographic);
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]);
1576
1577 slavio_misc = slavio_misc_init(0, -1, hwdef->aux1_base, -1,
1578 slavio_irq[hwdef->me_irq], env, &fdc_tc);
1579
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;
1586
1587 sun4m_fdctrl_init(slavio_irq[hwdef->fd_irq], hwdef->fd_base, fd,
1588 fdc_tc);
1589 }
1590
1591 if (drive_get_max_bus(IF_SCSI) > 0) {
1592 fprintf(stderr, "qemu: too many SCSI bus\n");
1593 exit(1);
1594 }
1595
1596 main_esp = esp_init(hwdef->esp_base, 2,
1597 espdma_memory_read, espdma_memory_write,
1598 espdma, *espdma_irq, esp_reset);
1599
1600 for (i = 0; i < ESP_MAX_DEVS; i++) {
1601 drive_index = drive_get_index(IF_SCSI, 0, i);
1602 if (drive_index == -1)
1603 continue;
1604 esp_scsi_attach(main_esp, drives_table[drive_index].bdrv, i);
1605 }
1606
1607 kernel_size = sun4m_load_kernel(kernel_filename, initrd_filename,
1608 RAM_size);
1609
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,
1613 "Sun4c");
1614
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);
1619 }
1620
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)
1626 {
1627 sun4c_hw_init(&sun4c_hwdefs[0], RAM_size, boot_device, ds, kernel_filename,
1628 kernel_cmdline, initrd_filename, cpu_model);
1629 }
1630
1631 QEMUMachine ss2_machine = {
1632 .name = "SS-2",
1633 .desc = "Sun4c platform, SPARCstation 2",
1634 .init = ss2_init,
1635 .ram_require = PROM_SIZE_MAX + TCX_SIZE,
1636 .nodisk_ok = 1,
1637 .use_scsi = 1,
1638 .max_cpus = 16,
1639 };
1640