]> git.proxmox.com Git - mirror_qemu.git/blob - hw/sun4m.c
Add common keys to firmware configuration
[mirror_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
84 // Control plane, 8-bit and 24-bit planes
85 #define TCX_SIZE (9 * 1024 * 1024)
86
87 #define MAX_CPUS 16
88 #define MAX_PILS 16
89
90 struct hwdef {
91 target_phys_addr_t iommu_base, slavio_base;
92 target_phys_addr_t intctl_base, counter_base, nvram_base, ms_kb_base;
93 target_phys_addr_t serial_base, fd_base;
94 target_phys_addr_t idreg_base, dma_base, esp_base, le_base;
95 target_phys_addr_t tcx_base, cs_base, apc_base, aux1_base, aux2_base;
96 target_phys_addr_t ecc_base;
97 uint32_t ecc_version;
98 target_phys_addr_t sun4c_intctl_base, sun4c_counter_base;
99 long vram_size, nvram_size;
100 // IRQ numbers are not PIL ones, but master interrupt controller
101 // register bit numbers
102 int intctl_g_intr, 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 int DMA_get_channel_mode (int nchan)
134 {
135 return 0;
136 }
137 int DMA_read_memory (int nchan, void *buf, int pos, int size)
138 {
139 return 0;
140 }
141 int DMA_write_memory (int nchan, void *buf, int pos, int size)
142 {
143 return 0;
144 }
145 void DMA_hold_DREQ (int nchan) {}
146 void DMA_release_DREQ (int nchan) {}
147 void DMA_schedule(int nchan) {}
148 void DMA_run (void) {}
149 void DMA_init (int high_page_enable) {}
150 void DMA_register_channel (int nchan,
151 DMA_transfer_handler transfer_handler,
152 void *opaque)
153 {
154 }
155
156 static int nvram_boot_set(void *opaque, const char *boot_device)
157 {
158 unsigned int i;
159 uint8_t image[sizeof(ohwcfg_v3_t)];
160 ohwcfg_v3_t *header = (ohwcfg_v3_t *)ℑ
161 m48t59_t *nvram = (m48t59_t *)opaque;
162
163 for (i = 0; i < sizeof(image); i++)
164 image[i] = m48t59_read(nvram, i) & 0xff;
165
166 pstrcpy((char *)header->boot_devices, sizeof(header->boot_devices),
167 boot_device);
168 header->nboot_devices = strlen(boot_device) & 0xff;
169 header->crc = cpu_to_be16(OHW_compute_crc(header, 0x00, 0xF8));
170
171 for (i = 0; i < sizeof(image); i++)
172 m48t59_write(nvram, i, image[i]);
173
174 return 0;
175 }
176
177 extern int nographic;
178
179 static void nvram_init(m48t59_t *nvram, uint8_t *macaddr, const char *cmdline,
180 const char *boot_devices, ram_addr_t RAM_size,
181 uint32_t kernel_size,
182 int width, int height, int depth,
183 int nvram_machine_id, const char *arch)
184 {
185 unsigned int i;
186 uint32_t start, end;
187 uint8_t image[0x1ff0];
188 ohwcfg_v3_t *header = (ohwcfg_v3_t *)&image;
189 struct sparc_arch_cfg *sparc_header;
190 struct OpenBIOS_nvpart_v1 *part_header;
191
192 memset(image, '\0', sizeof(image));
193
194 // Try to match PPC NVRAM
195 pstrcpy((char *)header->struct_ident, sizeof(header->struct_ident),
196 "QEMU_BIOS");
197 header->struct_version = cpu_to_be32(3); /* structure v3 */
198
199 header->nvram_size = cpu_to_be16(0x2000);
200 header->nvram_arch_ptr = cpu_to_be16(sizeof(ohwcfg_v3_t));
201 header->nvram_arch_size = cpu_to_be16(sizeof(struct sparc_arch_cfg));
202 pstrcpy((char *)header->arch, sizeof(header->arch), arch);
203 header->nb_cpus = smp_cpus & 0xff;
204 header->RAM0_base = 0;
205 header->RAM0_size = cpu_to_be64((uint64_t)RAM_size);
206 pstrcpy((char *)header->boot_devices, sizeof(header->boot_devices),
207 boot_devices);
208 header->nboot_devices = strlen(boot_devices) & 0xff;
209 header->kernel_image = cpu_to_be64((uint64_t)KERNEL_LOAD_ADDR);
210 header->kernel_size = cpu_to_be64((uint64_t)kernel_size);
211 if (cmdline) {
212 pstrcpy_targphys(CMDLINE_ADDR, TARGET_PAGE_SIZE, cmdline);
213 header->cmdline = cpu_to_be64((uint64_t)CMDLINE_ADDR);
214 header->cmdline_size = cpu_to_be64((uint64_t)strlen(cmdline));
215 }
216 // XXX add initrd_image, initrd_size
217 header->width = cpu_to_be16(width);
218 header->height = cpu_to_be16(height);
219 header->depth = cpu_to_be16(depth);
220 if (nographic)
221 header->graphic_flags = cpu_to_be16(OHW_GF_NOGRAPHICS);
222
223 header->crc = cpu_to_be16(OHW_compute_crc(header, 0x00, 0xF8));
224
225 // Architecture specific header
226 start = sizeof(ohwcfg_v3_t);
227 sparc_header = (struct sparc_arch_cfg *)&image[start];
228 sparc_header->valid = 0;
229 start += sizeof(struct sparc_arch_cfg);
230
231 // OpenBIOS nvram variables
232 // Variable partition
233 part_header = (struct OpenBIOS_nvpart_v1 *)&image[start];
234 part_header->signature = OPENBIOS_PART_SYSTEM;
235 pstrcpy(part_header->name, sizeof(part_header->name), "system");
236
237 end = start + sizeof(struct OpenBIOS_nvpart_v1);
238 for (i = 0; i < nb_prom_envs; i++)
239 end = OpenBIOS_set_var(image, end, prom_envs[i]);
240
241 // End marker
242 image[end++] = '\0';
243
244 end = start + ((end - start + 15) & ~15);
245 OpenBIOS_finish_partition(part_header, end - start);
246
247 // free partition
248 start = end;
249 part_header = (struct OpenBIOS_nvpart_v1 *)&image[start];
250 part_header->signature = OPENBIOS_PART_FREE;
251 pstrcpy(part_header->name, sizeof(part_header->name), "free");
252
253 end = 0x1fd0;
254 OpenBIOS_finish_partition(part_header, end - start);
255
256 Sun_init_header((struct Sun_nvram *)&image[0x1fd8], macaddr,
257 nvram_machine_id);
258
259 for (i = 0; i < sizeof(image); i++)
260 m48t59_write(nvram, i, image[i]);
261
262 qemu_register_boot_set(nvram_boot_set, nvram);
263 }
264
265 static void *slavio_intctl;
266
267 void pic_info(void)
268 {
269 if (slavio_intctl)
270 slavio_pic_info(slavio_intctl);
271 }
272
273 void irq_info(void)
274 {
275 if (slavio_intctl)
276 slavio_irq_info(slavio_intctl);
277 }
278
279 void cpu_check_irqs(CPUState *env)
280 {
281 if (env->pil_in && (env->interrupt_index == 0 ||
282 (env->interrupt_index & ~15) == TT_EXTINT)) {
283 unsigned int i;
284
285 for (i = 15; i > 0; i--) {
286 if (env->pil_in & (1 << i)) {
287 int old_interrupt = env->interrupt_index;
288
289 env->interrupt_index = TT_EXTINT | i;
290 if (old_interrupt != env->interrupt_index) {
291 DPRINTF("Set CPU IRQ %d\n", i);
292 cpu_interrupt(env, CPU_INTERRUPT_HARD);
293 }
294 break;
295 }
296 }
297 } else if (!env->pil_in && (env->interrupt_index & ~15) == TT_EXTINT) {
298 DPRINTF("Reset CPU IRQ %d\n", env->interrupt_index & 15);
299 env->interrupt_index = 0;
300 cpu_reset_interrupt(env, CPU_INTERRUPT_HARD);
301 }
302 }
303
304 static void cpu_set_irq(void *opaque, int irq, int level)
305 {
306 CPUState *env = opaque;
307
308 if (level) {
309 DPRINTF("Raise CPU IRQ %d\n", irq);
310 env->halted = 0;
311 env->pil_in |= 1 << irq;
312 cpu_check_irqs(env);
313 } else {
314 DPRINTF("Lower CPU IRQ %d\n", irq);
315 env->pil_in &= ~(1 << irq);
316 cpu_check_irqs(env);
317 }
318 }
319
320 static void dummy_cpu_set_irq(void *opaque, int irq, int level)
321 {
322 }
323
324 static void *slavio_misc;
325
326 void qemu_system_powerdown(void)
327 {
328 slavio_set_power_fail(slavio_misc, 1);
329 }
330
331 static void main_cpu_reset(void *opaque)
332 {
333 CPUState *env = opaque;
334
335 cpu_reset(env);
336 env->halted = 0;
337 }
338
339 static void secondary_cpu_reset(void *opaque)
340 {
341 CPUState *env = opaque;
342
343 cpu_reset(env);
344 env->halted = 1;
345 }
346
347 static unsigned long sun4m_load_kernel(const char *kernel_filename,
348 const char *initrd_filename,
349 ram_addr_t RAM_size)
350 {
351 int linux_boot;
352 unsigned int i;
353 long initrd_size, kernel_size;
354
355 linux_boot = (kernel_filename != NULL);
356
357 kernel_size = 0;
358 if (linux_boot) {
359 kernel_size = load_elf(kernel_filename, -0xf0000000ULL, NULL, NULL,
360 NULL);
361 if (kernel_size < 0)
362 kernel_size = load_aout(kernel_filename, KERNEL_LOAD_ADDR,
363 RAM_size - KERNEL_LOAD_ADDR);
364 if (kernel_size < 0)
365 kernel_size = load_image_targphys(kernel_filename,
366 KERNEL_LOAD_ADDR,
367 RAM_size - KERNEL_LOAD_ADDR);
368 if (kernel_size < 0) {
369 fprintf(stderr, "qemu: could not load kernel '%s'\n",
370 kernel_filename);
371 exit(1);
372 }
373
374 /* load initrd */
375 initrd_size = 0;
376 if (initrd_filename) {
377 initrd_size = load_image_targphys(initrd_filename,
378 INITRD_LOAD_ADDR,
379 RAM_size - INITRD_LOAD_ADDR);
380 if (initrd_size < 0) {
381 fprintf(stderr, "qemu: could not load initial ram disk '%s'\n",
382 initrd_filename);
383 exit(1);
384 }
385 }
386 if (initrd_size > 0) {
387 for (i = 0; i < 64 * TARGET_PAGE_SIZE; i += TARGET_PAGE_SIZE) {
388 if (ldl_phys(KERNEL_LOAD_ADDR + i) == 0x48647253) { // HdrS
389 stl_phys(KERNEL_LOAD_ADDR + i + 16, INITRD_LOAD_ADDR);
390 stl_phys(KERNEL_LOAD_ADDR + i + 20, initrd_size);
391 break;
392 }
393 }
394 }
395 }
396 return kernel_size;
397 }
398
399 static void sun4m_hw_init(const struct hwdef *hwdef, ram_addr_t RAM_size,
400 const char *boot_device,
401 DisplayState *ds, const char *kernel_filename,
402 const char *kernel_cmdline,
403 const char *initrd_filename, const char *cpu_model)
404
405 {
406 CPUState *env, *envs[MAX_CPUS];
407 unsigned int i;
408 void *iommu, *espdma, *ledma, *main_esp, *nvram;
409 qemu_irq *cpu_irqs[MAX_CPUS], *slavio_irq, *slavio_cpu_irq,
410 *espdma_irq, *ledma_irq;
411 qemu_irq *esp_reset, *le_reset;
412 qemu_irq *fdc_tc;
413 unsigned long prom_offset, kernel_size;
414 int ret;
415 char buf[1024];
416 BlockDriverState *fd[MAX_FD];
417 int drive_index;
418 void *fw_cfg;
419
420 /* init CPUs */
421 if (!cpu_model)
422 cpu_model = hwdef->default_cpu_model;
423
424 for(i = 0; i < smp_cpus; i++) {
425 env = cpu_init(cpu_model);
426 if (!env) {
427 fprintf(stderr, "qemu: Unable to find Sparc CPU definition\n");
428 exit(1);
429 }
430 cpu_sparc_set_id(env, i);
431 envs[i] = env;
432 if (i == 0) {
433 qemu_register_reset(main_cpu_reset, env);
434 } else {
435 qemu_register_reset(secondary_cpu_reset, env);
436 env->halted = 1;
437 }
438 cpu_irqs[i] = qemu_allocate_irqs(cpu_set_irq, envs[i], MAX_PILS);
439 env->prom_addr = hwdef->slavio_base;
440 }
441
442 for (i = smp_cpus; i < MAX_CPUS; i++)
443 cpu_irqs[i] = qemu_allocate_irqs(dummy_cpu_set_irq, NULL, MAX_PILS);
444
445
446 /* allocate RAM */
447 if ((uint64_t)RAM_size > hwdef->max_mem) {
448 fprintf(stderr,
449 "qemu: Too much memory for this machine: %d, maximum %d\n",
450 (unsigned int)(RAM_size / (1024 * 1024)),
451 (unsigned int)(hwdef->max_mem / (1024 * 1024)));
452 exit(1);
453 }
454 cpu_register_physical_memory(0, RAM_size, 0);
455
456 /* load boot prom */
457 prom_offset = RAM_size + hwdef->vram_size;
458 cpu_register_physical_memory(hwdef->slavio_base,
459 (PROM_SIZE_MAX + TARGET_PAGE_SIZE - 1) &
460 TARGET_PAGE_MASK,
461 prom_offset | IO_MEM_ROM);
462
463 if (bios_name == NULL)
464 bios_name = PROM_FILENAME;
465 snprintf(buf, sizeof(buf), "%s/%s", bios_dir, bios_name);
466 ret = load_elf(buf, hwdef->slavio_base - PROM_VADDR, NULL, NULL, NULL);
467 if (ret < 0 || ret > PROM_SIZE_MAX)
468 ret = load_image_targphys(buf, hwdef->slavio_base, PROM_SIZE_MAX);
469 if (ret < 0 || ret > PROM_SIZE_MAX) {
470 fprintf(stderr, "qemu: could not load prom '%s'\n",
471 buf);
472 exit(1);
473 }
474 prom_offset += (ret + TARGET_PAGE_SIZE - 1) & TARGET_PAGE_MASK;
475
476 /* set up devices */
477 slavio_intctl = slavio_intctl_init(hwdef->intctl_base,
478 hwdef->intctl_base + 0x10000ULL,
479 &hwdef->intbit_to_level[0],
480 &slavio_irq, &slavio_cpu_irq,
481 cpu_irqs,
482 hwdef->clock_irq);
483
484 if (hwdef->idreg_base != (target_phys_addr_t)-1) {
485 static const uint8_t idreg_data[] = { 0xfe, 0x81, 0x01, 0x03 };
486
487 cpu_register_physical_memory(hwdef->idreg_base, sizeof(idreg_data),
488 prom_offset | IO_MEM_ROM);
489 cpu_physical_memory_write_rom(hwdef->idreg_base, idreg_data,
490 sizeof(idreg_data));
491 }
492
493 iommu = iommu_init(hwdef->iommu_base, hwdef->iommu_version,
494 slavio_irq[hwdef->me_irq]);
495
496 espdma = sparc32_dma_init(hwdef->dma_base, slavio_irq[hwdef->esp_irq],
497 iommu, &espdma_irq, &esp_reset);
498
499 ledma = sparc32_dma_init(hwdef->dma_base + 16ULL,
500 slavio_irq[hwdef->le_irq], iommu, &ledma_irq,
501 &le_reset);
502
503 if (graphic_depth != 8 && graphic_depth != 24) {
504 fprintf(stderr, "qemu: Unsupported depth: %d\n", graphic_depth);
505 exit (1);
506 }
507 tcx_init(ds, hwdef->tcx_base, phys_ram_base + RAM_size, RAM_size,
508 hwdef->vram_size, graphic_width, graphic_height, graphic_depth);
509
510 if (nd_table[0].model == NULL
511 || strcmp(nd_table[0].model, "lance") == 0) {
512 lance_init(&nd_table[0], hwdef->le_base, ledma, *ledma_irq, le_reset);
513 } else if (strcmp(nd_table[0].model, "?") == 0) {
514 fprintf(stderr, "qemu: Supported NICs: lance\n");
515 exit (1);
516 } else {
517 fprintf(stderr, "qemu: Unsupported NIC: %s\n", nd_table[0].model);
518 exit (1);
519 }
520
521 nvram = m48t59_init(slavio_irq[0], hwdef->nvram_base, 0,
522 hwdef->nvram_size, 8);
523
524 slavio_timer_init_all(hwdef->counter_base, slavio_irq[hwdef->clock1_irq],
525 slavio_cpu_irq, smp_cpus);
526
527 slavio_serial_ms_kbd_init(hwdef->ms_kb_base, slavio_irq[hwdef->ms_kb_irq],
528 nographic);
529 // Slavio TTYA (base+4, Linux ttyS0) is the first Qemu serial device
530 // Slavio TTYB (base+0, Linux ttyS1) is the second Qemu serial device
531 slavio_serial_init(hwdef->serial_base, slavio_irq[hwdef->ser_irq],
532 serial_hds[1], serial_hds[0]);
533
534 slavio_misc = slavio_misc_init(hwdef->slavio_base, hwdef->apc_base,
535 hwdef->aux1_base, hwdef->aux2_base,
536 slavio_irq[hwdef->me_irq], envs[0],
537 &fdc_tc);
538
539 if (hwdef->fd_base != (target_phys_addr_t)-1) {
540 /* there is zero or one floppy drive */
541 memset(fd, 0, sizeof(fd));
542 drive_index = drive_get_index(IF_FLOPPY, 0, 0);
543 if (drive_index != -1)
544 fd[0] = drives_table[drive_index].bdrv;
545
546 sun4m_fdctrl_init(slavio_irq[hwdef->fd_irq], hwdef->fd_base, fd,
547 fdc_tc);
548 }
549
550 if (drive_get_max_bus(IF_SCSI) > 0) {
551 fprintf(stderr, "qemu: too many SCSI bus\n");
552 exit(1);
553 }
554
555 main_esp = esp_init(hwdef->esp_base, 2,
556 espdma_memory_read, espdma_memory_write,
557 espdma, *espdma_irq, esp_reset);
558
559 for (i = 0; i < ESP_MAX_DEVS; i++) {
560 drive_index = drive_get_index(IF_SCSI, 0, i);
561 if (drive_index == -1)
562 continue;
563 esp_scsi_attach(main_esp, drives_table[drive_index].bdrv, i);
564 }
565
566 if (hwdef->cs_base != (target_phys_addr_t)-1)
567 cs_init(hwdef->cs_base, hwdef->cs_irq, slavio_intctl);
568
569 kernel_size = sun4m_load_kernel(kernel_filename, initrd_filename,
570 RAM_size);
571
572 nvram_init(nvram, (uint8_t *)&nd_table[0].macaddr, kernel_cmdline,
573 boot_device, RAM_size, kernel_size, graphic_width,
574 graphic_height, graphic_depth, hwdef->nvram_machine_id,
575 "Sun4m");
576
577 if (hwdef->ecc_base != (target_phys_addr_t)-1)
578 ecc_init(hwdef->ecc_base, slavio_irq[hwdef->ecc_irq],
579 hwdef->ecc_version);
580
581 fw_cfg = fw_cfg_init(0, 0, CFG_ADDR, CFG_ADDR + 2);
582 fw_cfg_add_i32(fw_cfg, FW_CFG_ID, 1);
583 fw_cfg_add_i64(fw_cfg, FW_CFG_RAM_SIZE, (uint64_t)ram_size);
584 fw_cfg_add_i16(fw_cfg, FW_CFG_MACHINE_ID, hwdef->machine_id);
585 }
586
587 static void sun4c_hw_init(const struct hwdef *hwdef, ram_addr_t RAM_size,
588 const char *boot_device,
589 DisplayState *ds, const char *kernel_filename,
590 const char *kernel_cmdline,
591 const char *initrd_filename, const char *cpu_model)
592 {
593 CPUState *env;
594 unsigned int i;
595 void *iommu, *espdma, *ledma, *main_esp, *nvram;
596 qemu_irq *cpu_irqs, *slavio_irq, *espdma_irq, *ledma_irq;
597 qemu_irq *esp_reset, *le_reset;
598 qemu_irq *fdc_tc;
599 unsigned long prom_offset, kernel_size;
600 int ret;
601 char buf[1024];
602 BlockDriverState *fd[MAX_FD];
603 int drive_index;
604 void *fw_cfg;
605
606 /* init CPU */
607 if (!cpu_model)
608 cpu_model = hwdef->default_cpu_model;
609
610 env = cpu_init(cpu_model);
611 if (!env) {
612 fprintf(stderr, "qemu: Unable to find Sparc CPU definition\n");
613 exit(1);
614 }
615
616 cpu_sparc_set_id(env, 0);
617
618 qemu_register_reset(main_cpu_reset, env);
619 cpu_irqs = qemu_allocate_irqs(cpu_set_irq, env, MAX_PILS);
620 env->prom_addr = hwdef->slavio_base;
621
622 /* allocate RAM */
623 if ((uint64_t)RAM_size > hwdef->max_mem) {
624 fprintf(stderr,
625 "qemu: Too much memory for this machine: %d, maximum %d\n",
626 (unsigned int)(RAM_size / (1024 * 1024)),
627 (unsigned int)(hwdef->max_mem / (1024 * 1024)));
628 exit(1);
629 }
630 cpu_register_physical_memory(0, RAM_size, 0);
631
632 /* load boot prom */
633 prom_offset = RAM_size + hwdef->vram_size;
634 cpu_register_physical_memory(hwdef->slavio_base,
635 (PROM_SIZE_MAX + TARGET_PAGE_SIZE - 1) &
636 TARGET_PAGE_MASK,
637 prom_offset | IO_MEM_ROM);
638
639 if (bios_name == NULL)
640 bios_name = PROM_FILENAME;
641 snprintf(buf, sizeof(buf), "%s/%s", bios_dir, bios_name);
642 ret = load_elf(buf, hwdef->slavio_base - PROM_VADDR, NULL, NULL, NULL);
643 if (ret < 0 || ret > PROM_SIZE_MAX)
644 ret = load_image_targphys(buf, hwdef->slavio_base, PROM_SIZE_MAX);
645 if (ret < 0 || ret > PROM_SIZE_MAX) {
646 fprintf(stderr, "qemu: could not load prom '%s'\n",
647 buf);
648 exit(1);
649 }
650 prom_offset += (ret + TARGET_PAGE_SIZE - 1) & TARGET_PAGE_MASK;
651
652 /* set up devices */
653 slavio_intctl = sun4c_intctl_init(hwdef->sun4c_intctl_base,
654 &slavio_irq, cpu_irqs);
655
656 iommu = iommu_init(hwdef->iommu_base, hwdef->iommu_version,
657 slavio_irq[hwdef->me_irq]);
658
659 espdma = sparc32_dma_init(hwdef->dma_base, slavio_irq[hwdef->esp_irq],
660 iommu, &espdma_irq, &esp_reset);
661
662 ledma = sparc32_dma_init(hwdef->dma_base + 16ULL,
663 slavio_irq[hwdef->le_irq], iommu, &ledma_irq,
664 &le_reset);
665
666 if (graphic_depth != 8 && graphic_depth != 24) {
667 fprintf(stderr, "qemu: Unsupported depth: %d\n", graphic_depth);
668 exit (1);
669 }
670 tcx_init(ds, hwdef->tcx_base, phys_ram_base + RAM_size, RAM_size,
671 hwdef->vram_size, graphic_width, graphic_height, graphic_depth);
672
673 if (nd_table[0].model == NULL
674 || strcmp(nd_table[0].model, "lance") == 0) {
675 lance_init(&nd_table[0], hwdef->le_base, ledma, *ledma_irq, le_reset);
676 } else if (strcmp(nd_table[0].model, "?") == 0) {
677 fprintf(stderr, "qemu: Supported NICs: lance\n");
678 exit (1);
679 } else {
680 fprintf(stderr, "qemu: Unsupported NIC: %s\n", nd_table[0].model);
681 exit (1);
682 }
683
684 nvram = m48t59_init(slavio_irq[0], hwdef->nvram_base, 0,
685 hwdef->nvram_size, 2);
686
687 slavio_serial_ms_kbd_init(hwdef->ms_kb_base, slavio_irq[hwdef->ms_kb_irq],
688 nographic);
689 // Slavio TTYA (base+4, Linux ttyS0) is the first Qemu serial device
690 // Slavio TTYB (base+0, Linux ttyS1) is the second Qemu serial device
691 slavio_serial_init(hwdef->serial_base, slavio_irq[hwdef->ser_irq],
692 serial_hds[1], serial_hds[0]);
693
694 slavio_misc = slavio_misc_init(-1, hwdef->apc_base,
695 hwdef->aux1_base, hwdef->aux2_base,
696 slavio_irq[hwdef->me_irq], env, &fdc_tc);
697
698 if (hwdef->fd_base != (target_phys_addr_t)-1) {
699 /* there is zero or one floppy drive */
700 fd[1] = fd[0] = NULL;
701 drive_index = drive_get_index(IF_FLOPPY, 0, 0);
702 if (drive_index != -1)
703 fd[0] = drives_table[drive_index].bdrv;
704
705 sun4m_fdctrl_init(slavio_irq[hwdef->fd_irq], hwdef->fd_base, fd,
706 fdc_tc);
707 }
708
709 if (drive_get_max_bus(IF_SCSI) > 0) {
710 fprintf(stderr, "qemu: too many SCSI bus\n");
711 exit(1);
712 }
713
714 main_esp = esp_init(hwdef->esp_base, 2,
715 espdma_memory_read, espdma_memory_write,
716 espdma, *espdma_irq, esp_reset);
717
718 for (i = 0; i < ESP_MAX_DEVS; i++) {
719 drive_index = drive_get_index(IF_SCSI, 0, i);
720 if (drive_index == -1)
721 continue;
722 esp_scsi_attach(main_esp, drives_table[drive_index].bdrv, i);
723 }
724
725 kernel_size = sun4m_load_kernel(kernel_filename, initrd_filename,
726 RAM_size);
727
728 nvram_init(nvram, (uint8_t *)&nd_table[0].macaddr, kernel_cmdline,
729 boot_device, RAM_size, kernel_size, graphic_width,
730 graphic_height, graphic_depth, hwdef->nvram_machine_id,
731 "Sun4c");
732
733 fw_cfg = fw_cfg_init(0, 0, CFG_ADDR, CFG_ADDR + 2);
734 fw_cfg_add_i32(fw_cfg, FW_CFG_ID, 1);
735 fw_cfg_add_i64(fw_cfg, FW_CFG_RAM_SIZE, (uint64_t)ram_size);
736 fw_cfg_add_i16(fw_cfg, FW_CFG_MACHINE_ID, hwdef->machine_id);
737 }
738
739 enum {
740 ss2_id = 0,
741 ss5_id = 32,
742 vger_id,
743 lx_id,
744 ss4_id,
745 scls_id,
746 sbook_id,
747 ss10_id = 64,
748 ss20_id,
749 ss600mp_id,
750 ss1000_id = 96,
751 ss2000_id,
752 };
753
754 static const struct hwdef hwdefs[] = {
755 /* SS-5 */
756 {
757 .iommu_base = 0x10000000,
758 .tcx_base = 0x50000000,
759 .cs_base = 0x6c000000,
760 .slavio_base = 0x70000000,
761 .ms_kb_base = 0x71000000,
762 .serial_base = 0x71100000,
763 .nvram_base = 0x71200000,
764 .fd_base = 0x71400000,
765 .counter_base = 0x71d00000,
766 .intctl_base = 0x71e00000,
767 .idreg_base = 0x78000000,
768 .dma_base = 0x78400000,
769 .esp_base = 0x78800000,
770 .le_base = 0x78c00000,
771 .apc_base = 0x6a000000,
772 .aux1_base = 0x71900000,
773 .aux2_base = 0x71910000,
774 .ecc_base = -1,
775 .sun4c_intctl_base = -1,
776 .sun4c_counter_base = -1,
777 .vram_size = 0x00100000,
778 .nvram_size = 0x2000,
779 .esp_irq = 18,
780 .le_irq = 16,
781 .clock_irq = 7,
782 .clock1_irq = 19,
783 .ms_kb_irq = 14,
784 .ser_irq = 15,
785 .fd_irq = 22,
786 .me_irq = 30,
787 .cs_irq = 5,
788 .nvram_machine_id = 0x80,
789 .machine_id = ss5_id,
790 .iommu_version = 0x05000000,
791 .intbit_to_level = {
792 2, 3, 5, 7, 9, 11, 0, 14, 3, 5, 7, 9, 11, 13, 12, 12,
793 6, 0, 4, 10, 8, 0, 11, 0, 0, 0, 0, 0, 15, 0, 15, 0,
794 },
795 .max_mem = 0x10000000,
796 .default_cpu_model = "Fujitsu MB86904",
797 },
798 /* SS-10 */
799 {
800 .iommu_base = 0xfe0000000ULL,
801 .tcx_base = 0xe20000000ULL,
802 .cs_base = -1,
803 .slavio_base = 0xff0000000ULL,
804 .ms_kb_base = 0xff1000000ULL,
805 .serial_base = 0xff1100000ULL,
806 .nvram_base = 0xff1200000ULL,
807 .fd_base = 0xff1700000ULL,
808 .counter_base = 0xff1300000ULL,
809 .intctl_base = 0xff1400000ULL,
810 .idreg_base = 0xef0000000ULL,
811 .dma_base = 0xef0400000ULL,
812 .esp_base = 0xef0800000ULL,
813 .le_base = 0xef0c00000ULL,
814 .apc_base = 0xefa000000ULL, // XXX should not exist
815 .aux1_base = 0xff1800000ULL,
816 .aux2_base = 0xff1a01000ULL,
817 .ecc_base = 0xf00000000ULL,
818 .ecc_version = 0x10000000, // version 0, implementation 1
819 .sun4c_intctl_base = -1,
820 .sun4c_counter_base = -1,
821 .vram_size = 0x00100000,
822 .nvram_size = 0x2000,
823 .esp_irq = 18,
824 .le_irq = 16,
825 .clock_irq = 7,
826 .clock1_irq = 19,
827 .ms_kb_irq = 14,
828 .ser_irq = 15,
829 .fd_irq = 22,
830 .me_irq = 30,
831 .cs_irq = -1,
832 .ecc_irq = 28,
833 .nvram_machine_id = 0x72,
834 .machine_id = ss10_id,
835 .iommu_version = 0x03000000,
836 .intbit_to_level = {
837 2, 3, 5, 7, 9, 11, 0, 14, 3, 5, 7, 9, 11, 13, 12, 12,
838 6, 0, 4, 10, 8, 0, 11, 0, 0, 0, 0, 0, 15, 0, 15, 0,
839 },
840 .max_mem = 0xf00000000ULL,
841 .default_cpu_model = "TI SuperSparc II",
842 },
843 /* SS-600MP */
844 {
845 .iommu_base = 0xfe0000000ULL,
846 .tcx_base = 0xe20000000ULL,
847 .cs_base = -1,
848 .slavio_base = 0xff0000000ULL,
849 .ms_kb_base = 0xff1000000ULL,
850 .serial_base = 0xff1100000ULL,
851 .nvram_base = 0xff1200000ULL,
852 .fd_base = -1,
853 .counter_base = 0xff1300000ULL,
854 .intctl_base = 0xff1400000ULL,
855 .idreg_base = -1,
856 .dma_base = 0xef0081000ULL,
857 .esp_base = 0xef0080000ULL,
858 .le_base = 0xef0060000ULL,
859 .apc_base = 0xefa000000ULL, // XXX should not exist
860 .aux1_base = 0xff1800000ULL,
861 .aux2_base = 0xff1a01000ULL, // XXX should not exist
862 .ecc_base = 0xf00000000ULL,
863 .ecc_version = 0x00000000, // version 0, implementation 0
864 .sun4c_intctl_base = -1,
865 .sun4c_counter_base = -1,
866 .vram_size = 0x00100000,
867 .nvram_size = 0x2000,
868 .esp_irq = 18,
869 .le_irq = 16,
870 .clock_irq = 7,
871 .clock1_irq = 19,
872 .ms_kb_irq = 14,
873 .ser_irq = 15,
874 .fd_irq = 22,
875 .me_irq = 30,
876 .cs_irq = -1,
877 .ecc_irq = 28,
878 .nvram_machine_id = 0x71,
879 .machine_id = ss600mp_id,
880 .iommu_version = 0x01000000,
881 .intbit_to_level = {
882 2, 3, 5, 7, 9, 11, 0, 14, 3, 5, 7, 9, 11, 13, 12, 12,
883 6, 0, 4, 10, 8, 0, 11, 0, 0, 0, 0, 0, 15, 0, 15, 0,
884 },
885 .max_mem = 0xf00000000ULL,
886 .default_cpu_model = "TI SuperSparc II",
887 },
888 /* SS-20 */
889 {
890 .iommu_base = 0xfe0000000ULL,
891 .tcx_base = 0xe20000000ULL,
892 .cs_base = -1,
893 .slavio_base = 0xff0000000ULL,
894 .ms_kb_base = 0xff1000000ULL,
895 .serial_base = 0xff1100000ULL,
896 .nvram_base = 0xff1200000ULL,
897 .fd_base = 0xff1700000ULL,
898 .counter_base = 0xff1300000ULL,
899 .intctl_base = 0xff1400000ULL,
900 .idreg_base = 0xef0000000ULL,
901 .dma_base = 0xef0400000ULL,
902 .esp_base = 0xef0800000ULL,
903 .le_base = 0xef0c00000ULL,
904 .apc_base = 0xefa000000ULL, // XXX should not exist
905 .aux1_base = 0xff1800000ULL,
906 .aux2_base = 0xff1a01000ULL,
907 .ecc_base = 0xf00000000ULL,
908 .ecc_version = 0x20000000, // version 0, implementation 2
909 .sun4c_intctl_base = -1,
910 .sun4c_counter_base = -1,
911 .vram_size = 0x00100000,
912 .nvram_size = 0x2000,
913 .esp_irq = 18,
914 .le_irq = 16,
915 .clock_irq = 7,
916 .clock1_irq = 19,
917 .ms_kb_irq = 14,
918 .ser_irq = 15,
919 .fd_irq = 22,
920 .me_irq = 30,
921 .cs_irq = -1,
922 .ecc_irq = 28,
923 .nvram_machine_id = 0x72,
924 .machine_id = ss20_id,
925 .iommu_version = 0x13000000,
926 .intbit_to_level = {
927 2, 3, 5, 7, 9, 11, 0, 14, 3, 5, 7, 9, 11, 13, 12, 12,
928 6, 0, 4, 10, 8, 0, 11, 0, 0, 0, 0, 0, 15, 0, 15, 0,
929 },
930 .max_mem = 0xf00000000ULL,
931 .default_cpu_model = "TI SuperSparc II",
932 },
933 /* SS-2 */
934 {
935 .iommu_base = 0xf8000000,
936 .tcx_base = 0xfe000000,
937 .cs_base = -1,
938 .slavio_base = 0xf6000000,
939 .ms_kb_base = 0xf0000000,
940 .serial_base = 0xf1000000,
941 .nvram_base = 0xf2000000,
942 .fd_base = 0xf7200000,
943 .counter_base = -1,
944 .intctl_base = -1,
945 .dma_base = 0xf8400000,
946 .esp_base = 0xf8800000,
947 .le_base = 0xf8c00000,
948 .apc_base = -1,
949 .aux1_base = 0xf7400003,
950 .aux2_base = -1,
951 .sun4c_intctl_base = 0xf5000000,
952 .sun4c_counter_base = 0xf3000000,
953 .vram_size = 0x00100000,
954 .nvram_size = 0x800,
955 .esp_irq = 2,
956 .le_irq = 3,
957 .clock_irq = 5,
958 .clock1_irq = 7,
959 .ms_kb_irq = 1,
960 .ser_irq = 1,
961 .fd_irq = 1,
962 .me_irq = 1,
963 .cs_irq = -1,
964 .nvram_machine_id = 0x55,
965 .machine_id = ss2_id,
966 .max_mem = 0x10000000,
967 .default_cpu_model = "Cypress CY7C601",
968 },
969 /* Voyager */
970 {
971 .iommu_base = 0x10000000,
972 .tcx_base = 0x50000000,
973 .cs_base = -1,
974 .slavio_base = 0x70000000,
975 .ms_kb_base = 0x71000000,
976 .serial_base = 0x71100000,
977 .nvram_base = 0x71200000,
978 .fd_base = 0x71400000,
979 .counter_base = 0x71d00000,
980 .intctl_base = 0x71e00000,
981 .idreg_base = 0x78000000,
982 .dma_base = 0x78400000,
983 .esp_base = 0x78800000,
984 .le_base = 0x78c00000,
985 .apc_base = 0x71300000, // pmc
986 .aux1_base = 0x71900000,
987 .aux2_base = 0x71910000,
988 .ecc_base = -1,
989 .sun4c_intctl_base = -1,
990 .sun4c_counter_base = -1,
991 .vram_size = 0x00100000,
992 .nvram_size = 0x2000,
993 .esp_irq = 18,
994 .le_irq = 16,
995 .clock_irq = 7,
996 .clock1_irq = 19,
997 .ms_kb_irq = 14,
998 .ser_irq = 15,
999 .fd_irq = 22,
1000 .me_irq = 30,
1001 .cs_irq = -1,
1002 .nvram_machine_id = 0x80,
1003 .machine_id = vger_id,
1004 .iommu_version = 0x05000000,
1005 .intbit_to_level = {
1006 2, 3, 5, 7, 9, 11, 0, 14, 3, 5, 7, 9, 11, 13, 12, 12,
1007 6, 0, 4, 10, 8, 0, 11, 0, 0, 0, 0, 0, 15, 0, 15, 0,
1008 },
1009 .max_mem = 0x10000000,
1010 .default_cpu_model = "Fujitsu MB86904",
1011 },
1012 /* LX */
1013 {
1014 .iommu_base = 0x10000000,
1015 .tcx_base = 0x50000000,
1016 .cs_base = -1,
1017 .slavio_base = 0x70000000,
1018 .ms_kb_base = 0x71000000,
1019 .serial_base = 0x71100000,
1020 .nvram_base = 0x71200000,
1021 .fd_base = 0x71400000,
1022 .counter_base = 0x71d00000,
1023 .intctl_base = 0x71e00000,
1024 .idreg_base = 0x78000000,
1025 .dma_base = 0x78400000,
1026 .esp_base = 0x78800000,
1027 .le_base = 0x78c00000,
1028 .apc_base = -1,
1029 .aux1_base = 0x71900000,
1030 .aux2_base = 0x71910000,
1031 .ecc_base = -1,
1032 .sun4c_intctl_base = -1,
1033 .sun4c_counter_base = -1,
1034 .vram_size = 0x00100000,
1035 .nvram_size = 0x2000,
1036 .esp_irq = 18,
1037 .le_irq = 16,
1038 .clock_irq = 7,
1039 .clock1_irq = 19,
1040 .ms_kb_irq = 14,
1041 .ser_irq = 15,
1042 .fd_irq = 22,
1043 .me_irq = 30,
1044 .cs_irq = -1,
1045 .nvram_machine_id = 0x80,
1046 .machine_id = lx_id,
1047 .iommu_version = 0x04000000,
1048 .intbit_to_level = {
1049 2, 3, 5, 7, 9, 11, 0, 14, 3, 5, 7, 9, 11, 13, 12, 12,
1050 6, 0, 4, 10, 8, 0, 11, 0, 0, 0, 0, 0, 15, 0, 15, 0,
1051 },
1052 .max_mem = 0x10000000,
1053 .default_cpu_model = "TI MicroSparc I",
1054 },
1055 /* SS-4 */
1056 {
1057 .iommu_base = 0x10000000,
1058 .tcx_base = 0x50000000,
1059 .cs_base = 0x6c000000,
1060 .slavio_base = 0x70000000,
1061 .ms_kb_base = 0x71000000,
1062 .serial_base = 0x71100000,
1063 .nvram_base = 0x71200000,
1064 .fd_base = 0x71400000,
1065 .counter_base = 0x71d00000,
1066 .intctl_base = 0x71e00000,
1067 .idreg_base = 0x78000000,
1068 .dma_base = 0x78400000,
1069 .esp_base = 0x78800000,
1070 .le_base = 0x78c00000,
1071 .apc_base = 0x6a000000,
1072 .aux1_base = 0x71900000,
1073 .aux2_base = 0x71910000,
1074 .ecc_base = -1,
1075 .sun4c_intctl_base = -1,
1076 .sun4c_counter_base = -1,
1077 .vram_size = 0x00100000,
1078 .nvram_size = 0x2000,
1079 .esp_irq = 18,
1080 .le_irq = 16,
1081 .clock_irq = 7,
1082 .clock1_irq = 19,
1083 .ms_kb_irq = 14,
1084 .ser_irq = 15,
1085 .fd_irq = 22,
1086 .me_irq = 30,
1087 .cs_irq = 5,
1088 .nvram_machine_id = 0x80,
1089 .machine_id = ss4_id,
1090 .iommu_version = 0x05000000,
1091 .intbit_to_level = {
1092 2, 3, 5, 7, 9, 11, 0, 14, 3, 5, 7, 9, 11, 13, 12, 12,
1093 6, 0, 4, 10, 8, 0, 11, 0, 0, 0, 0, 0, 15, 0, 15, 0,
1094 },
1095 .max_mem = 0x10000000,
1096 .default_cpu_model = "Fujitsu MB86904",
1097 },
1098 /* SPARCClassic */
1099 {
1100 .iommu_base = 0x10000000,
1101 .tcx_base = 0x50000000,
1102 .cs_base = -1,
1103 .slavio_base = 0x70000000,
1104 .ms_kb_base = 0x71000000,
1105 .serial_base = 0x71100000,
1106 .nvram_base = 0x71200000,
1107 .fd_base = 0x71400000,
1108 .counter_base = 0x71d00000,
1109 .intctl_base = 0x71e00000,
1110 .idreg_base = 0x78000000,
1111 .dma_base = 0x78400000,
1112 .esp_base = 0x78800000,
1113 .le_base = 0x78c00000,
1114 .apc_base = 0x6a000000,
1115 .aux1_base = 0x71900000,
1116 .aux2_base = 0x71910000,
1117 .ecc_base = -1,
1118 .sun4c_intctl_base = -1,
1119 .sun4c_counter_base = -1,
1120 .vram_size = 0x00100000,
1121 .nvram_size = 0x2000,
1122 .esp_irq = 18,
1123 .le_irq = 16,
1124 .clock_irq = 7,
1125 .clock1_irq = 19,
1126 .ms_kb_irq = 14,
1127 .ser_irq = 15,
1128 .fd_irq = 22,
1129 .me_irq = 30,
1130 .cs_irq = -1,
1131 .nvram_machine_id = 0x80,
1132 .machine_id = scls_id,
1133 .iommu_version = 0x05000000,
1134 .intbit_to_level = {
1135 2, 3, 5, 7, 9, 11, 0, 14, 3, 5, 7, 9, 11, 13, 12, 12,
1136 6, 0, 4, 10, 8, 0, 11, 0, 0, 0, 0, 0, 15, 0, 15, 0,
1137 },
1138 .max_mem = 0x10000000,
1139 .default_cpu_model = "TI MicroSparc I",
1140 },
1141 /* SPARCbook */
1142 {
1143 .iommu_base = 0x10000000,
1144 .tcx_base = 0x50000000, // XXX
1145 .cs_base = -1,
1146 .slavio_base = 0x70000000,
1147 .ms_kb_base = 0x71000000,
1148 .serial_base = 0x71100000,
1149 .nvram_base = 0x71200000,
1150 .fd_base = 0x71400000,
1151 .counter_base = 0x71d00000,
1152 .intctl_base = 0x71e00000,
1153 .idreg_base = 0x78000000,
1154 .dma_base = 0x78400000,
1155 .esp_base = 0x78800000,
1156 .le_base = 0x78c00000,
1157 .apc_base = 0x6a000000,
1158 .aux1_base = 0x71900000,
1159 .aux2_base = 0x71910000,
1160 .ecc_base = -1,
1161 .sun4c_intctl_base = -1,
1162 .sun4c_counter_base = -1,
1163 .vram_size = 0x00100000,
1164 .nvram_size = 0x2000,
1165 .esp_irq = 18,
1166 .le_irq = 16,
1167 .clock_irq = 7,
1168 .clock1_irq = 19,
1169 .ms_kb_irq = 14,
1170 .ser_irq = 15,
1171 .fd_irq = 22,
1172 .me_irq = 30,
1173 .cs_irq = -1,
1174 .nvram_machine_id = 0x80,
1175 .machine_id = sbook_id,
1176 .iommu_version = 0x05000000,
1177 .intbit_to_level = {
1178 2, 3, 5, 7, 9, 11, 0, 14, 3, 5, 7, 9, 11, 13, 12, 12,
1179 6, 0, 4, 10, 8, 0, 11, 0, 0, 0, 0, 0, 15, 0, 15, 0,
1180 },
1181 .max_mem = 0x10000000,
1182 .default_cpu_model = "TI MicroSparc I",
1183 },
1184 };
1185
1186 /* SPARCstation 5 hardware initialisation */
1187 static void ss5_init(ram_addr_t RAM_size, int vga_ram_size,
1188 const char *boot_device, DisplayState *ds,
1189 const char *kernel_filename, const char *kernel_cmdline,
1190 const char *initrd_filename, const char *cpu_model)
1191 {
1192 sun4m_hw_init(&hwdefs[0], RAM_size, boot_device, ds, kernel_filename,
1193 kernel_cmdline, initrd_filename, cpu_model);
1194 }
1195
1196 /* SPARCstation 10 hardware initialisation */
1197 static void ss10_init(ram_addr_t RAM_size, int vga_ram_size,
1198 const char *boot_device, DisplayState *ds,
1199 const char *kernel_filename, const char *kernel_cmdline,
1200 const char *initrd_filename, const char *cpu_model)
1201 {
1202 sun4m_hw_init(&hwdefs[1], RAM_size, boot_device, ds, kernel_filename,
1203 kernel_cmdline, initrd_filename, cpu_model);
1204 }
1205
1206 /* SPARCserver 600MP hardware initialisation */
1207 static void ss600mp_init(ram_addr_t RAM_size, int vga_ram_size,
1208 const char *boot_device, DisplayState *ds,
1209 const char *kernel_filename,
1210 const char *kernel_cmdline,
1211 const char *initrd_filename, const char *cpu_model)
1212 {
1213 sun4m_hw_init(&hwdefs[2], RAM_size, boot_device, ds, kernel_filename,
1214 kernel_cmdline, initrd_filename, cpu_model);
1215 }
1216
1217 /* SPARCstation 20 hardware initialisation */
1218 static void ss20_init(ram_addr_t RAM_size, int vga_ram_size,
1219 const char *boot_device, DisplayState *ds,
1220 const char *kernel_filename, const char *kernel_cmdline,
1221 const char *initrd_filename, const char *cpu_model)
1222 {
1223 sun4m_hw_init(&hwdefs[3], RAM_size, boot_device, ds, kernel_filename,
1224 kernel_cmdline, initrd_filename, cpu_model);
1225 }
1226
1227 /* SPARCstation 2 hardware initialisation */
1228 static void ss2_init(ram_addr_t RAM_size, int vga_ram_size,
1229 const char *boot_device, DisplayState *ds,
1230 const char *kernel_filename, const char *kernel_cmdline,
1231 const char *initrd_filename, const char *cpu_model)
1232 {
1233 sun4c_hw_init(&hwdefs[4], RAM_size, boot_device, ds, kernel_filename,
1234 kernel_cmdline, initrd_filename, cpu_model);
1235 }
1236
1237 /* SPARCstation Voyager hardware initialisation */
1238 static void vger_init(ram_addr_t RAM_size, int vga_ram_size,
1239 const char *boot_device, DisplayState *ds,
1240 const char *kernel_filename, const char *kernel_cmdline,
1241 const char *initrd_filename, const char *cpu_model)
1242 {
1243 sun4m_hw_init(&hwdefs[5], RAM_size, boot_device, ds, kernel_filename,
1244 kernel_cmdline, initrd_filename, cpu_model);
1245 }
1246
1247 /* SPARCstation LX hardware initialisation */
1248 static void ss_lx_init(ram_addr_t RAM_size, int vga_ram_size,
1249 const char *boot_device, DisplayState *ds,
1250 const char *kernel_filename, const char *kernel_cmdline,
1251 const char *initrd_filename, const char *cpu_model)
1252 {
1253 sun4m_hw_init(&hwdefs[6], RAM_size, boot_device, ds, kernel_filename,
1254 kernel_cmdline, initrd_filename, cpu_model);
1255 }
1256
1257 /* SPARCstation 4 hardware initialisation */
1258 static void ss4_init(ram_addr_t RAM_size, int vga_ram_size,
1259 const char *boot_device, DisplayState *ds,
1260 const char *kernel_filename, const char *kernel_cmdline,
1261 const char *initrd_filename, const char *cpu_model)
1262 {
1263 sun4m_hw_init(&hwdefs[7], RAM_size, boot_device, ds, kernel_filename,
1264 kernel_cmdline, initrd_filename, cpu_model);
1265 }
1266
1267 /* SPARCClassic hardware initialisation */
1268 static void scls_init(ram_addr_t RAM_size, int vga_ram_size,
1269 const char *boot_device, DisplayState *ds,
1270 const char *kernel_filename, const char *kernel_cmdline,
1271 const char *initrd_filename, const char *cpu_model)
1272 {
1273 sun4m_hw_init(&hwdefs[8], RAM_size, boot_device, ds, kernel_filename,
1274 kernel_cmdline, initrd_filename, cpu_model);
1275 }
1276
1277 /* SPARCbook hardware initialisation */
1278 static void sbook_init(ram_addr_t RAM_size, int vga_ram_size,
1279 const char *boot_device, DisplayState *ds,
1280 const char *kernel_filename, const char *kernel_cmdline,
1281 const char *initrd_filename, const char *cpu_model)
1282 {
1283 sun4m_hw_init(&hwdefs[9], RAM_size, boot_device, ds, kernel_filename,
1284 kernel_cmdline, initrd_filename, cpu_model);
1285 }
1286
1287 QEMUMachine ss5_machine = {
1288 .name = "SS-5",
1289 .desc = "Sun4m platform, SPARCstation 5",
1290 .init = ss5_init,
1291 .ram_require = PROM_SIZE_MAX + TCX_SIZE,
1292 .nodisk_ok = 1,
1293 };
1294
1295 QEMUMachine ss10_machine = {
1296 .name = "SS-10",
1297 .desc = "Sun4m platform, SPARCstation 10",
1298 .init = ss10_init,
1299 .ram_require = PROM_SIZE_MAX + TCX_SIZE,
1300 .nodisk_ok = 1,
1301 };
1302
1303 QEMUMachine ss600mp_machine = {
1304 .name = "SS-600MP",
1305 .desc = "Sun4m platform, SPARCserver 600MP",
1306 .init = ss600mp_init,
1307 .ram_require = PROM_SIZE_MAX + TCX_SIZE,
1308 .nodisk_ok = 1,
1309 };
1310
1311 QEMUMachine ss20_machine = {
1312 .name = "SS-20",
1313 .desc = "Sun4m platform, SPARCstation 20",
1314 .init = ss20_init,
1315 .ram_require = PROM_SIZE_MAX + TCX_SIZE,
1316 .nodisk_ok = 1,
1317 };
1318
1319 QEMUMachine ss2_machine = {
1320 .name = "SS-2",
1321 .desc = "Sun4c platform, SPARCstation 2",
1322 .init = ss2_init,
1323 .ram_require = PROM_SIZE_MAX + TCX_SIZE,
1324 .nodisk_ok = 1,
1325 };
1326
1327 QEMUMachine voyager_machine = {
1328 .name = "Voyager",
1329 .desc = "Sun4m platform, SPARCstation Voyager",
1330 .init = vger_init,
1331 .ram_require = PROM_SIZE_MAX + TCX_SIZE,
1332 .nodisk_ok = 1,
1333 };
1334
1335 QEMUMachine ss_lx_machine = {
1336 .name = "LX",
1337 .desc = "Sun4m platform, SPARCstation LX",
1338 .init = ss_lx_init,
1339 .ram_require = PROM_SIZE_MAX + TCX_SIZE,
1340 .nodisk_ok = 1,
1341 };
1342
1343 QEMUMachine ss4_machine = {
1344 .name = "SS-4",
1345 .desc = "Sun4m platform, SPARCstation 4",
1346 .init = ss4_init,
1347 .ram_require = PROM_SIZE_MAX + TCX_SIZE,
1348 .nodisk_ok = 1,
1349 };
1350
1351 QEMUMachine scls_machine = {
1352 .name = "SPARCClassic",
1353 .desc = "Sun4m platform, SPARCClassic",
1354 .init = scls_init,
1355 .ram_require = PROM_SIZE_MAX + TCX_SIZE,
1356 .nodisk_ok = 1,
1357 };
1358
1359 QEMUMachine sbook_machine = {
1360 .name = "SPARCbook",
1361 .desc = "Sun4m platform, SPARCbook",
1362 .init = sbook_init,
1363 .ram_require = PROM_SIZE_MAX + TCX_SIZE,
1364 .nodisk_ok = 1,
1365 };
1366
1367 static const struct sun4d_hwdef sun4d_hwdefs[] = {
1368 /* SS-1000 */
1369 {
1370 .iounit_bases = {
1371 0xfe0200000ULL,
1372 0xfe1200000ULL,
1373 0xfe2200000ULL,
1374 0xfe3200000ULL,
1375 -1,
1376 },
1377 .tcx_base = 0x820000000ULL,
1378 .slavio_base = 0xf00000000ULL,
1379 .ms_kb_base = 0xf00240000ULL,
1380 .serial_base = 0xf00200000ULL,
1381 .nvram_base = 0xf00280000ULL,
1382 .counter_base = 0xf00300000ULL,
1383 .espdma_base = 0x800081000ULL,
1384 .esp_base = 0x800080000ULL,
1385 .ledma_base = 0x800040000ULL,
1386 .le_base = 0x800060000ULL,
1387 .sbi_base = 0xf02800000ULL,
1388 .vram_size = 0x00100000,
1389 .nvram_size = 0x2000,
1390 .esp_irq = 3,
1391 .le_irq = 4,
1392 .clock_irq = 14,
1393 .clock1_irq = 10,
1394 .ms_kb_irq = 12,
1395 .ser_irq = 12,
1396 .nvram_machine_id = 0x80,
1397 .machine_id = ss1000_id,
1398 .iounit_version = 0x03000000,
1399 .max_mem = 0xf00000000ULL,
1400 .default_cpu_model = "TI SuperSparc II",
1401 },
1402 /* SS-2000 */
1403 {
1404 .iounit_bases = {
1405 0xfe0200000ULL,
1406 0xfe1200000ULL,
1407 0xfe2200000ULL,
1408 0xfe3200000ULL,
1409 0xfe4200000ULL,
1410 },
1411 .tcx_base = 0x820000000ULL,
1412 .slavio_base = 0xf00000000ULL,
1413 .ms_kb_base = 0xf00240000ULL,
1414 .serial_base = 0xf00200000ULL,
1415 .nvram_base = 0xf00280000ULL,
1416 .counter_base = 0xf00300000ULL,
1417 .espdma_base = 0x800081000ULL,
1418 .esp_base = 0x800080000ULL,
1419 .ledma_base = 0x800040000ULL,
1420 .le_base = 0x800060000ULL,
1421 .sbi_base = 0xf02800000ULL,
1422 .vram_size = 0x00100000,
1423 .nvram_size = 0x2000,
1424 .esp_irq = 3,
1425 .le_irq = 4,
1426 .clock_irq = 14,
1427 .clock1_irq = 10,
1428 .ms_kb_irq = 12,
1429 .ser_irq = 12,
1430 .nvram_machine_id = 0x80,
1431 .machine_id = ss2000_id,
1432 .iounit_version = 0x03000000,
1433 .max_mem = 0xf00000000ULL,
1434 .default_cpu_model = "TI SuperSparc II",
1435 },
1436 };
1437
1438 static void sun4d_hw_init(const struct sun4d_hwdef *hwdef, ram_addr_t RAM_size,
1439 const char *boot_device,
1440 DisplayState *ds, const char *kernel_filename,
1441 const char *kernel_cmdline,
1442 const char *initrd_filename, const char *cpu_model)
1443 {
1444 CPUState *env, *envs[MAX_CPUS];
1445 unsigned int i;
1446 void *iounits[MAX_IOUNITS], *espdma, *ledma, *main_esp, *nvram, *sbi;
1447 qemu_irq *cpu_irqs[MAX_CPUS], *sbi_irq, *sbi_cpu_irq,
1448 *espdma_irq, *ledma_irq;
1449 qemu_irq *esp_reset, *le_reset;
1450 unsigned long prom_offset, kernel_size;
1451 int ret;
1452 char buf[1024];
1453 int drive_index;
1454 void *fw_cfg;
1455
1456 /* init CPUs */
1457 if (!cpu_model)
1458 cpu_model = hwdef->default_cpu_model;
1459
1460 for (i = 0; i < smp_cpus; i++) {
1461 env = cpu_init(cpu_model);
1462 if (!env) {
1463 fprintf(stderr, "qemu: Unable to find Sparc CPU definition\n");
1464 exit(1);
1465 }
1466 cpu_sparc_set_id(env, i);
1467 envs[i] = env;
1468 if (i == 0) {
1469 qemu_register_reset(main_cpu_reset, env);
1470 } else {
1471 qemu_register_reset(secondary_cpu_reset, env);
1472 env->halted = 1;
1473 }
1474 cpu_irqs[i] = qemu_allocate_irqs(cpu_set_irq, envs[i], MAX_PILS);
1475 env->prom_addr = hwdef->slavio_base;
1476 }
1477
1478 for (i = smp_cpus; i < MAX_CPUS; i++)
1479 cpu_irqs[i] = qemu_allocate_irqs(dummy_cpu_set_irq, NULL, MAX_PILS);
1480
1481 /* allocate RAM */
1482 if ((uint64_t)RAM_size > hwdef->max_mem) {
1483 fprintf(stderr,
1484 "qemu: Too much memory for this machine: %d, maximum %d\n",
1485 (unsigned int)(RAM_size / (1024 * 1024)),
1486 (unsigned int)(hwdef->max_mem / (1024 * 1024)));
1487 exit(1);
1488 }
1489 cpu_register_physical_memory(0, RAM_size, 0);
1490
1491 /* load boot prom */
1492 prom_offset = RAM_size + hwdef->vram_size;
1493 cpu_register_physical_memory(hwdef->slavio_base,
1494 (PROM_SIZE_MAX + TARGET_PAGE_SIZE - 1) &
1495 TARGET_PAGE_MASK,
1496 prom_offset | IO_MEM_ROM);
1497
1498 if (bios_name == NULL)
1499 bios_name = PROM_FILENAME;
1500 snprintf(buf, sizeof(buf), "%s/%s", bios_dir, bios_name);
1501 ret = load_elf(buf, hwdef->slavio_base - PROM_VADDR, NULL, NULL, NULL);
1502 if (ret < 0 || ret > PROM_SIZE_MAX)
1503 ret = load_image_targphys(buf, hwdef->slavio_base, PROM_SIZE_MAX);
1504 if (ret < 0 || ret > PROM_SIZE_MAX) {
1505 fprintf(stderr, "qemu: could not load prom '%s'\n",
1506 buf);
1507 exit(1);
1508 }
1509
1510 /* set up devices */
1511 sbi = sbi_init(hwdef->sbi_base, &sbi_irq, &sbi_cpu_irq, cpu_irqs);
1512
1513 for (i = 0; i < MAX_IOUNITS; i++)
1514 if (hwdef->iounit_bases[i] != (target_phys_addr_t)-1)
1515 iounits[i] = iommu_init(hwdef->iounit_bases[i],
1516 hwdef->iounit_version,
1517 sbi_irq[hwdef->me_irq]);
1518
1519 espdma = sparc32_dma_init(hwdef->espdma_base, sbi_irq[hwdef->esp_irq],
1520 iounits[0], &espdma_irq, &esp_reset);
1521
1522 ledma = sparc32_dma_init(hwdef->ledma_base, sbi_irq[hwdef->le_irq],
1523 iounits[0], &ledma_irq, &le_reset);
1524
1525 if (graphic_depth != 8 && graphic_depth != 24) {
1526 fprintf(stderr, "qemu: Unsupported depth: %d\n", graphic_depth);
1527 exit (1);
1528 }
1529 tcx_init(ds, hwdef->tcx_base, phys_ram_base + RAM_size, RAM_size,
1530 hwdef->vram_size, graphic_width, graphic_height, graphic_depth);
1531
1532 if (nd_table[0].model == NULL
1533 || strcmp(nd_table[0].model, "lance") == 0) {
1534 lance_init(&nd_table[0], hwdef->le_base, ledma, *ledma_irq, le_reset);
1535 } else if (strcmp(nd_table[0].model, "?") == 0) {
1536 fprintf(stderr, "qemu: Supported NICs: lance\n");
1537 exit (1);
1538 } else {
1539 fprintf(stderr, "qemu: Unsupported NIC: %s\n", nd_table[0].model);
1540 exit (1);
1541 }
1542
1543 nvram = m48t59_init(sbi_irq[0], hwdef->nvram_base, 0,
1544 hwdef->nvram_size, 8);
1545
1546 slavio_timer_init_all(hwdef->counter_base, sbi_irq[hwdef->clock1_irq],
1547 sbi_cpu_irq, smp_cpus);
1548
1549 slavio_serial_ms_kbd_init(hwdef->ms_kb_base, sbi_irq[hwdef->ms_kb_irq],
1550 nographic);
1551 // Slavio TTYA (base+4, Linux ttyS0) is the first Qemu serial device
1552 // Slavio TTYB (base+0, Linux ttyS1) is the second Qemu serial device
1553 slavio_serial_init(hwdef->serial_base, sbi_irq[hwdef->ser_irq],
1554 serial_hds[1], serial_hds[0]);
1555
1556 if (drive_get_max_bus(IF_SCSI) > 0) {
1557 fprintf(stderr, "qemu: too many SCSI bus\n");
1558 exit(1);
1559 }
1560
1561 main_esp = esp_init(hwdef->esp_base, 2,
1562 espdma_memory_read, espdma_memory_write,
1563 espdma, *espdma_irq, esp_reset);
1564
1565 for (i = 0; i < ESP_MAX_DEVS; i++) {
1566 drive_index = drive_get_index(IF_SCSI, 0, i);
1567 if (drive_index == -1)
1568 continue;
1569 esp_scsi_attach(main_esp, drives_table[drive_index].bdrv, i);
1570 }
1571
1572 kernel_size = sun4m_load_kernel(kernel_filename, initrd_filename,
1573 RAM_size);
1574
1575 nvram_init(nvram, (uint8_t *)&nd_table[0].macaddr, kernel_cmdline,
1576 boot_device, RAM_size, kernel_size, graphic_width,
1577 graphic_height, graphic_depth, hwdef->nvram_machine_id,
1578 "Sun4d");
1579
1580 fw_cfg = fw_cfg_init(0, 0, CFG_ADDR, CFG_ADDR + 2);
1581 fw_cfg_add_i32(fw_cfg, FW_CFG_ID, 1);
1582 fw_cfg_add_i64(fw_cfg, FW_CFG_RAM_SIZE, (uint64_t)ram_size);
1583 fw_cfg_add_i16(fw_cfg, FW_CFG_MACHINE_ID, hwdef->machine_id);
1584 }
1585
1586 /* SPARCserver 1000 hardware initialisation */
1587 static void ss1000_init(ram_addr_t RAM_size, int vga_ram_size,
1588 const char *boot_device, DisplayState *ds,
1589 const char *kernel_filename, const char *kernel_cmdline,
1590 const char *initrd_filename, const char *cpu_model)
1591 {
1592 sun4d_hw_init(&sun4d_hwdefs[0], RAM_size, boot_device, ds, kernel_filename,
1593 kernel_cmdline, initrd_filename, cpu_model);
1594 }
1595
1596 /* SPARCcenter 2000 hardware initialisation */
1597 static void ss2000_init(ram_addr_t RAM_size, int vga_ram_size,
1598 const char *boot_device, DisplayState *ds,
1599 const char *kernel_filename, const char *kernel_cmdline,
1600 const char *initrd_filename, const char *cpu_model)
1601 {
1602 sun4d_hw_init(&sun4d_hwdefs[1], RAM_size, boot_device, ds, kernel_filename,
1603 kernel_cmdline, initrd_filename, cpu_model);
1604 }
1605
1606 QEMUMachine ss1000_machine = {
1607 .name = "SS-1000",
1608 .desc = "Sun4d platform, SPARCserver 1000",
1609 .init = ss1000_init,
1610 .ram_require = PROM_SIZE_MAX + TCX_SIZE,
1611 .nodisk_ok = 1,
1612 };
1613
1614 QEMUMachine ss2000_machine = {
1615 .name = "SS-2000",
1616 .desc = "Sun4d platform, SPARCcenter 2000",
1617 .init = ss2000_init,
1618 .ram_require = PROM_SIZE_MAX + TCX_SIZE,
1619 .nodisk_ok = 1,
1620 };