Commit 8137cde8f95ebb6bb0fa1934c01575c410ccebbb

Authored by blueswir1
1 parent 43d7ac4e

Move sun4c to its own hwdef (Robert Reif)

git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@5549 c046a42c-6fe2-441c-8c8c-71466251a162
Showing 1 changed file with 241 additions and 239 deletions
hw/sun4m.c
... ... @@ -88,7 +88,7 @@
88 88 #define MAX_CPUS 16
89 89 #define MAX_PILS 16
90 90  
91   -struct hwdef {
  91 +struct sun4m_hwdef {
92 92 target_phys_addr_t iommu_base, slavio_base;
93 93 target_phys_addr_t intctl_base, counter_base, nvram_base, ms_kb_base;
94 94 target_phys_addr_t serial_base, fd_base;
... ... @@ -96,7 +96,6 @@ struct hwdef {
96 96 target_phys_addr_t tcx_base, cs_base, apc_base, aux1_base, aux2_base;
97 97 target_phys_addr_t ecc_base;
98 98 uint32_t ecc_version;
99   - target_phys_addr_t sun4c_intctl_base, sun4c_counter_base;
100 99 long vram_size, nvram_size;
101 100 // IRQ numbers are not PIL ones, but master interrupt controller
102 101 // register bit numbers
... ... @@ -131,6 +130,25 @@ struct sun4d_hwdef {
131 130 const char * const default_cpu_model;
132 131 };
133 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, cs_base, apc_base, aux1_base, aux2_base;
  139 + long vram_size, nvram_size;
  140 + // IRQ numbers are not PIL ones, but master interrupt controller
  141 + // register bit numbers
  142 + int intctl_g_intr, esp_irq, le_irq, clock_irq, clock1_irq;
  143 + int ser_irq, ms_kb_irq, fd_irq, me_irq, cs_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 +
134 152 int DMA_get_channel_mode (int nchan)
135 153 {
136 154 return 0;
... ... @@ -395,7 +413,7 @@ static unsigned long sun4m_load_kernel(const char *kernel_filename,
395 413 return kernel_size;
396 414 }
397 415  
398   -static void sun4m_hw_init(const struct hwdef *hwdef, ram_addr_t RAM_size,
  416 +static void sun4m_hw_init(const struct sun4m_hwdef *hwdef, ram_addr_t RAM_size,
399 417 const char *boot_device,
400 418 DisplayState *ds, const char *kernel_filename,
401 419 const char *kernel_cmdline,
... ... @@ -584,158 +602,6 @@ static void sun4m_hw_init(const struct hwdef *hwdef, ram_addr_t RAM_size,
584 602 fw_cfg_add_i16(fw_cfg, FW_CFG_SUN4M_DEPTH, graphic_depth);
585 603 }
586 604  
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(0, 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 605 enum {
740 606 ss2_id = 0,
741 607 ss5_id = 32,
... ... @@ -751,7 +617,7 @@ enum {
751 617 ss2000_id,
752 618 };
753 619  
754   -static const struct hwdef hwdefs[] = {
  620 +static const struct sun4m_hwdef sun4m_hwdefs[] = {
755 621 /* SS-5 */
756 622 {
757 623 .iommu_base = 0x10000000,
... ... @@ -772,8 +638,6 @@ static const struct hwdef hwdefs[] = {
772 638 .aux1_base = 0x71900000,
773 639 .aux2_base = 0x71910000,
774 640 .ecc_base = -1,
775   - .sun4c_intctl_base = -1,
776   - .sun4c_counter_base = -1,
777 641 .vram_size = 0x00100000,
778 642 .nvram_size = 0x2000,
779 643 .esp_irq = 18,
... ... @@ -816,8 +680,6 @@ static const struct hwdef hwdefs[] = {
816 680 .aux2_base = 0xff1a01000ULL,
817 681 .ecc_base = 0xf00000000ULL,
818 682 .ecc_version = 0x10000000, // version 0, implementation 1
819   - .sun4c_intctl_base = -1,
820   - .sun4c_counter_base = -1,
821 683 .vram_size = 0x00100000,
822 684 .nvram_size = 0x2000,
823 685 .esp_irq = 18,
... ... @@ -861,8 +723,6 @@ static const struct hwdef hwdefs[] = {
861 723 .aux2_base = 0xff1a01000ULL, // XXX should not exist
862 724 .ecc_base = 0xf00000000ULL,
863 725 .ecc_version = 0x00000000, // version 0, implementation 0
864   - .sun4c_intctl_base = -1,
865   - .sun4c_counter_base = -1,
866 726 .vram_size = 0x00100000,
867 727 .nvram_size = 0x2000,
868 728 .esp_irq = 18,
... ... @@ -906,8 +766,6 @@ static const struct hwdef hwdefs[] = {
906 766 .aux2_base = 0xff1a01000ULL,
907 767 .ecc_base = 0xf00000000ULL,
908 768 .ecc_version = 0x20000000, // version 0, implementation 2
909   - .sun4c_intctl_base = -1,
910   - .sun4c_counter_base = -1,
911 769 .vram_size = 0x00100000,
912 770 .nvram_size = 0x2000,
913 771 .esp_irq = 18,
... ... @@ -930,42 +788,6 @@ static const struct hwdef hwdefs[] = {
930 788 .max_mem = 0xf00000000ULL,
931 789 .default_cpu_model = "TI SuperSparc II",
932 790 },
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 791 /* Voyager */
970 792 {
971 793 .iommu_base = 0x10000000,
... ... @@ -986,8 +808,6 @@ static const struct hwdef hwdefs[] = {
986 808 .aux1_base = 0x71900000,
987 809 .aux2_base = 0x71910000,
988 810 .ecc_base = -1,
989   - .sun4c_intctl_base = -1,
990   - .sun4c_counter_base = -1,
991 811 .vram_size = 0x00100000,
992 812 .nvram_size = 0x2000,
993 813 .esp_irq = 18,
... ... @@ -1029,8 +849,6 @@ static const struct hwdef hwdefs[] = {
1029 849 .aux1_base = 0x71900000,
1030 850 .aux2_base = 0x71910000,
1031 851 .ecc_base = -1,
1032   - .sun4c_intctl_base = -1,
1033   - .sun4c_counter_base = -1,
1034 852 .vram_size = 0x00100000,
1035 853 .nvram_size = 0x2000,
1036 854 .esp_irq = 18,
... ... @@ -1072,8 +890,6 @@ static const struct hwdef hwdefs[] = {
1072 890 .aux1_base = 0x71900000,
1073 891 .aux2_base = 0x71910000,
1074 892 .ecc_base = -1,
1075   - .sun4c_intctl_base = -1,
1076   - .sun4c_counter_base = -1,
1077 893 .vram_size = 0x00100000,
1078 894 .nvram_size = 0x2000,
1079 895 .esp_irq = 18,
... ... @@ -1115,8 +931,6 @@ static const struct hwdef hwdefs[] = {
1115 931 .aux1_base = 0x71900000,
1116 932 .aux2_base = 0x71910000,
1117 933 .ecc_base = -1,
1118   - .sun4c_intctl_base = -1,
1119   - .sun4c_counter_base = -1,
1120 934 .vram_size = 0x00100000,
1121 935 .nvram_size = 0x2000,
1122 936 .esp_irq = 18,
... ... @@ -1158,8 +972,6 @@ static const struct hwdef hwdefs[] = {
1158 972 .aux1_base = 0x71900000,
1159 973 .aux2_base = 0x71910000,
1160 974 .ecc_base = -1,
1161   - .sun4c_intctl_base = -1,
1162   - .sun4c_counter_base = -1,
1163 975 .vram_size = 0x00100000,
1164 976 .nvram_size = 0x2000,
1165 977 .esp_irq = 18,
... ... @@ -1189,7 +1001,7 @@ static void ss5_init(ram_addr_t RAM_size, int vga_ram_size,
1189 1001 const char *kernel_filename, const char *kernel_cmdline,
1190 1002 const char *initrd_filename, const char *cpu_model)
1191 1003 {
1192   - sun4m_hw_init(&hwdefs[0], RAM_size, boot_device, ds, kernel_filename,
  1004 + sun4m_hw_init(&sun4m_hwdefs[0], RAM_size, boot_device, ds, kernel_filename,
1193 1005 kernel_cmdline, initrd_filename, cpu_model);
1194 1006 }
1195 1007  
... ... @@ -1199,7 +1011,7 @@ static void ss10_init(ram_addr_t RAM_size, int vga_ram_size,
1199 1011 const char *kernel_filename, const char *kernel_cmdline,
1200 1012 const char *initrd_filename, const char *cpu_model)
1201 1013 {
1202   - sun4m_hw_init(&hwdefs[1], RAM_size, boot_device, ds, kernel_filename,
  1014 + sun4m_hw_init(&sun4m_hwdefs[1], RAM_size, boot_device, ds, kernel_filename,
1203 1015 kernel_cmdline, initrd_filename, cpu_model);
1204 1016 }
1205 1017  
... ... @@ -1210,7 +1022,7 @@ static void ss600mp_init(ram_addr_t RAM_size, int vga_ram_size,
1210 1022 const char *kernel_cmdline,
1211 1023 const char *initrd_filename, const char *cpu_model)
1212 1024 {
1213   - sun4m_hw_init(&hwdefs[2], RAM_size, boot_device, ds, kernel_filename,
  1025 + sun4m_hw_init(&sun4m_hwdefs[2], RAM_size, boot_device, ds, kernel_filename,
1214 1026 kernel_cmdline, initrd_filename, cpu_model);
1215 1027 }
1216 1028  
... ... @@ -1220,17 +1032,7 @@ static void ss20_init(ram_addr_t RAM_size, int vga_ram_size,
1220 1032 const char *kernel_filename, const char *kernel_cmdline,
1221 1033 const char *initrd_filename, const char *cpu_model)
1222 1034 {
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,
  1035 + sun4m_hw_init(&sun4m_hwdefs[3], RAM_size, boot_device, ds, kernel_filename,
1234 1036 kernel_cmdline, initrd_filename, cpu_model);
1235 1037 }
1236 1038  
... ... @@ -1240,7 +1042,7 @@ static void vger_init(ram_addr_t RAM_size, int vga_ram_size,
1240 1042 const char *kernel_filename, const char *kernel_cmdline,
1241 1043 const char *initrd_filename, const char *cpu_model)
1242 1044 {
1243   - sun4m_hw_init(&hwdefs[5], RAM_size, boot_device, ds, kernel_filename,
  1045 + sun4m_hw_init(&sun4m_hwdefs[4], RAM_size, boot_device, ds, kernel_filename,
1244 1046 kernel_cmdline, initrd_filename, cpu_model);
1245 1047 }
1246 1048  
... ... @@ -1250,7 +1052,7 @@ static void ss_lx_init(ram_addr_t RAM_size, int vga_ram_size,
1250 1052 const char *kernel_filename, const char *kernel_cmdline,
1251 1053 const char *initrd_filename, const char *cpu_model)
1252 1054 {
1253   - sun4m_hw_init(&hwdefs[6], RAM_size, boot_device, ds, kernel_filename,
  1055 + sun4m_hw_init(&sun4m_hwdefs[5], RAM_size, boot_device, ds, kernel_filename,
1254 1056 kernel_cmdline, initrd_filename, cpu_model);
1255 1057 }
1256 1058  
... ... @@ -1260,7 +1062,7 @@ static void ss4_init(ram_addr_t RAM_size, int vga_ram_size,
1260 1062 const char *kernel_filename, const char *kernel_cmdline,
1261 1063 const char *initrd_filename, const char *cpu_model)
1262 1064 {
1263   - sun4m_hw_init(&hwdefs[7], RAM_size, boot_device, ds, kernel_filename,
  1065 + sun4m_hw_init(&sun4m_hwdefs[6], RAM_size, boot_device, ds, kernel_filename,
1264 1066 kernel_cmdline, initrd_filename, cpu_model);
1265 1067 }
1266 1068  
... ... @@ -1270,7 +1072,7 @@ static void scls_init(ram_addr_t RAM_size, int vga_ram_size,
1270 1072 const char *kernel_filename, const char *kernel_cmdline,
1271 1073 const char *initrd_filename, const char *cpu_model)
1272 1074 {
1273   - sun4m_hw_init(&hwdefs[8], RAM_size, boot_device, ds, kernel_filename,
  1075 + sun4m_hw_init(&sun4m_hwdefs[7], RAM_size, boot_device, ds, kernel_filename,
1274 1076 kernel_cmdline, initrd_filename, cpu_model);
1275 1077 }
1276 1078  
... ... @@ -1280,7 +1082,7 @@ static void sbook_init(ram_addr_t RAM_size, int vga_ram_size,
1280 1082 const char *kernel_filename, const char *kernel_cmdline,
1281 1083 const char *initrd_filename, const char *cpu_model)
1282 1084 {
1283   - sun4m_hw_init(&hwdefs[9], RAM_size, boot_device, ds, kernel_filename,
  1085 + sun4m_hw_init(&sun4m_hwdefs[8], RAM_size, boot_device, ds, kernel_filename,
1284 1086 kernel_cmdline, initrd_filename, cpu_model);
1285 1087 }
1286 1088  
... ... @@ -1324,16 +1126,6 @@ QEMUMachine ss20_machine = {
1324 1126 .max_cpus = 16,
1325 1127 };
1326 1128  
1327   -QEMUMachine ss2_machine = {
1328   - .name = "SS-2",
1329   - .desc = "Sun4c platform, SPARCstation 2",
1330   - .init = ss2_init,
1331   - .ram_require = PROM_SIZE_MAX + TCX_SIZE,
1332   - .nodisk_ok = 1,
1333   - .use_scsi = 1,
1334   - .max_cpus = 16,
1335   -};
1336   -
1337 1129 QEMUMachine voyager_machine = {
1338 1130 .name = "Voyager",
1339 1131 .desc = "Sun4m platform, SPARCstation Voyager",
... ... @@ -1642,3 +1434,213 @@ QEMUMachine ss2000_machine = {
1642 1434 .use_scsi = 1,
1643 1435 .max_cpus = 16,
1644 1436 };
  1437 +
  1438 +static const struct sun4c_hwdef sun4c_hwdefs[] = {
  1439 + /* SS-2 */
  1440 + {
  1441 + .iommu_base = 0xf8000000,
  1442 + .tcx_base = 0xfe000000,
  1443 + .cs_base = -1,
  1444 + .slavio_base = 0xf6000000,
  1445 + .intctl_base = 0xf5000000,
  1446 + .counter_base = 0xf3000000,
  1447 + .ms_kb_base = 0xf0000000,
  1448 + .serial_base = 0xf1000000,
  1449 + .nvram_base = 0xf2000000,
  1450 + .fd_base = 0xf7200000,
  1451 + .dma_base = 0xf8400000,
  1452 + .esp_base = 0xf8800000,
  1453 + .le_base = 0xf8c00000,
  1454 + .apc_base = -1,
  1455 + .aux1_base = 0xf7400003,
  1456 + .aux2_base = -1,
  1457 + .vram_size = 0x00100000,
  1458 + .nvram_size = 0x800,
  1459 + .esp_irq = 2,
  1460 + .le_irq = 3,
  1461 + .clock_irq = 5,
  1462 + .clock1_irq = 7,
  1463 + .ms_kb_irq = 1,
  1464 + .ser_irq = 1,
  1465 + .fd_irq = 1,
  1466 + .me_irq = 1,
  1467 + .cs_irq = -1,
  1468 + .nvram_machine_id = 0x55,
  1469 + .machine_id = ss2_id,
  1470 + .max_mem = 0x10000000,
  1471 + .default_cpu_model = "Cypress CY7C601",
  1472 + },
  1473 +};
  1474 +
  1475 +static void sun4c_hw_init(const struct sun4c_hwdef *hwdef, ram_addr_t RAM_size,
  1476 + const char *boot_device,
  1477 + DisplayState *ds, const char *kernel_filename,
  1478 + const char *kernel_cmdline,
  1479 + const char *initrd_filename, const char *cpu_model)
  1480 +{
  1481 + CPUState *env;
  1482 + unsigned int i;
  1483 + void *iommu, *espdma, *ledma, *main_esp, *nvram;
  1484 + qemu_irq *cpu_irqs, *slavio_irq, *espdma_irq, *ledma_irq;
  1485 + qemu_irq *esp_reset, *le_reset;
  1486 + qemu_irq *fdc_tc;
  1487 + unsigned long prom_offset, kernel_size;
  1488 + int ret;
  1489 + char buf[1024];
  1490 + BlockDriverState *fd[MAX_FD];
  1491 + int drive_index;
  1492 + void *fw_cfg;
  1493 +
  1494 + /* init CPU */
  1495 + if (!cpu_model)
  1496 + cpu_model = hwdef->default_cpu_model;
  1497 +
  1498 + env = cpu_init(cpu_model);
  1499 + if (!env) {
  1500 + fprintf(stderr, "qemu: Unable to find Sparc CPU definition\n");
  1501 + exit(1);
  1502 + }
  1503 +
  1504 + cpu_sparc_set_id(env, 0);
  1505 +
  1506 + qemu_register_reset(main_cpu_reset, env);
  1507 + cpu_irqs = qemu_allocate_irqs(cpu_set_irq, env, MAX_PILS);
  1508 + env->prom_addr = hwdef->slavio_base;
  1509 +
  1510 + /* allocate RAM */
  1511 + if ((uint64_t)RAM_size > hwdef->max_mem) {
  1512 + fprintf(stderr,
  1513 + "qemu: Too much memory for this machine: %d, maximum %d\n",
  1514 + (unsigned int)(RAM_size / (1024 * 1024)),
  1515 + (unsigned int)(hwdef->max_mem / (1024 * 1024)));
  1516 + exit(1);
  1517 + }
  1518 + cpu_register_physical_memory(0, RAM_size, 0);
  1519 +
  1520 + /* load boot prom */
  1521 + prom_offset = RAM_size + hwdef->vram_size;
  1522 + cpu_register_physical_memory(hwdef->slavio_base,
  1523 + (PROM_SIZE_MAX + TARGET_PAGE_SIZE - 1) &
  1524 + TARGET_PAGE_MASK,
  1525 + prom_offset | IO_MEM_ROM);
  1526 +
  1527 + if (bios_name == NULL)
  1528 + bios_name = PROM_FILENAME;
  1529 + snprintf(buf, sizeof(buf), "%s/%s", bios_dir, bios_name);
  1530 + ret = load_elf(buf, hwdef->slavio_base - PROM_VADDR, NULL, NULL, NULL);
  1531 + if (ret < 0 || ret > PROM_SIZE_MAX)
  1532 + ret = load_image_targphys(buf, hwdef->slavio_base, PROM_SIZE_MAX);
  1533 + if (ret < 0 || ret > PROM_SIZE_MAX) {
  1534 + fprintf(stderr, "qemu: could not load prom '%s'\n",
  1535 + buf);
  1536 + exit(1);
  1537 + }
  1538 + prom_offset += (ret + TARGET_PAGE_SIZE - 1) & TARGET_PAGE_MASK;
  1539 +
  1540 + /* set up devices */
  1541 + slavio_intctl = sun4c_intctl_init(hwdef->intctl_base,
  1542 + &slavio_irq, cpu_irqs);
  1543 +
  1544 + iommu = iommu_init(hwdef->iommu_base, hwdef->iommu_version,
  1545 + slavio_irq[hwdef->me_irq]);
  1546 +
  1547 + espdma = sparc32_dma_init(hwdef->dma_base, slavio_irq[hwdef->esp_irq],
  1548 + iommu, &espdma_irq, &esp_reset);
  1549 +
  1550 + ledma = sparc32_dma_init(hwdef->dma_base + 16ULL,
  1551 + slavio_irq[hwdef->le_irq], iommu, &ledma_irq,
  1552 + &le_reset);
  1553 +
  1554 + if (graphic_depth != 8 && graphic_depth != 24) {
  1555 + fprintf(stderr, "qemu: Unsupported depth: %d\n", graphic_depth);
  1556 + exit (1);
  1557 + }
  1558 + tcx_init(ds, hwdef->tcx_base, phys_ram_base + RAM_size, RAM_size,
  1559 + hwdef->vram_size, graphic_width, graphic_height, graphic_depth);
  1560 +
  1561 + if (nd_table[0].model == NULL
  1562 + || strcmp(nd_table[0].model, "lance") == 0) {
  1563 + lance_init(&nd_table[0], hwdef->le_base, ledma, *ledma_irq, le_reset);
  1564 + } else if (strcmp(nd_table[0].model, "?") == 0) {
  1565 + fprintf(stderr, "qemu: Supported NICs: lance\n");
  1566 + exit (1);
  1567 + } else {
  1568 + fprintf(stderr, "qemu: Unsupported NIC: %s\n", nd_table[0].model);
  1569 + exit (1);
  1570 + }
  1571 +
  1572 + nvram = m48t59_init(slavio_irq[0], hwdef->nvram_base, 0,
  1573 + hwdef->nvram_size, 2);
  1574 +
  1575 + slavio_serial_ms_kbd_init(hwdef->ms_kb_base, slavio_irq[hwdef->ms_kb_irq],
  1576 + nographic);
  1577 + // Slavio TTYA (base+4, Linux ttyS0) is the first Qemu serial device
  1578 + // Slavio TTYB (base+0, Linux ttyS1) is the second Qemu serial device
  1579 + slavio_serial_init(hwdef->serial_base, slavio_irq[hwdef->ser_irq],
  1580 + serial_hds[1], serial_hds[0]);
  1581 +
  1582 + slavio_misc = slavio_misc_init(0, hwdef->apc_base,
  1583 + hwdef->aux1_base, hwdef->aux2_base,
  1584 + slavio_irq[hwdef->me_irq], env, &fdc_tc);
  1585 +
  1586 + if (hwdef->fd_base != (target_phys_addr_t)-1) {
  1587 + /* there is zero or one floppy drive */
  1588 + fd[1] = fd[0] = NULL;
  1589 + drive_index = drive_get_index(IF_FLOPPY, 0, 0);
  1590 + if (drive_index != -1)
  1591 + fd[0] = drives_table[drive_index].bdrv;
  1592 +
  1593 + sun4m_fdctrl_init(slavio_irq[hwdef->fd_irq], hwdef->fd_base, fd,
  1594 + fdc_tc);
  1595 + }
  1596 +
  1597 + if (drive_get_max_bus(IF_SCSI) > 0) {
  1598 + fprintf(stderr, "qemu: too many SCSI bus\n");
  1599 + exit(1);
  1600 + }
  1601 +
  1602 + main_esp = esp_init(hwdef->esp_base, 2,
  1603 + espdma_memory_read, espdma_memory_write,
  1604 + espdma, *espdma_irq, esp_reset);
  1605 +
  1606 + for (i = 0; i < ESP_MAX_DEVS; i++) {
  1607 + drive_index = drive_get_index(IF_SCSI, 0, i);
  1608 + if (drive_index == -1)
  1609 + continue;
  1610 + esp_scsi_attach(main_esp, drives_table[drive_index].bdrv, i);
  1611 + }
  1612 +
  1613 + kernel_size = sun4m_load_kernel(kernel_filename, initrd_filename,
  1614 + RAM_size);
  1615 +
  1616 + nvram_init(nvram, (uint8_t *)&nd_table[0].macaddr, kernel_cmdline,
  1617 + boot_device, RAM_size, kernel_size, graphic_width,
  1618 + graphic_height, graphic_depth, hwdef->nvram_machine_id,
  1619 + "Sun4c");
  1620 +
  1621 + fw_cfg = fw_cfg_init(0, 0, CFG_ADDR, CFG_ADDR + 2);
  1622 + fw_cfg_add_i32(fw_cfg, FW_CFG_ID, 1);
  1623 + fw_cfg_add_i64(fw_cfg, FW_CFG_RAM_SIZE, (uint64_t)ram_size);
  1624 + fw_cfg_add_i16(fw_cfg, FW_CFG_MACHINE_ID, hwdef->machine_id);
  1625 +}
  1626 +
  1627 +/* SPARCstation 2 hardware initialisation */
  1628 +static void ss2_init(ram_addr_t RAM_size, int vga_ram_size,
  1629 + const char *boot_device, DisplayState *ds,
  1630 + const char *kernel_filename, const char *kernel_cmdline,
  1631 + const char *initrd_filename, const char *cpu_model)
  1632 +{
  1633 + sun4c_hw_init(&sun4c_hwdefs[0], RAM_size, boot_device, ds, kernel_filename,
  1634 + kernel_cmdline, initrd_filename, cpu_model);
  1635 +}
  1636 +
  1637 +QEMUMachine ss2_machine = {
  1638 + .name = "SS-2",
  1639 + .desc = "Sun4c platform, SPARCstation 2",
  1640 + .init = ss2_init,
  1641 + .ram_require = PROM_SIZE_MAX + TCX_SIZE,
  1642 + .nodisk_ok = 1,
  1643 + .use_scsi = 1,
  1644 + .max_cpus = 16,
  1645 +};
  1646 +
... ...