Commit 6a3b9cc9c5c52808435402a0b422e67f2ea9875c

Authored by blueswir1
1 parent 29fa23e7

Add SPARCserver 600MP emulation (original patch by Robert Reif)


git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@3604 c046a42c-6fe2-441c-8c8c-71466251a162
hw/slavio_misc.c
@@ -46,11 +46,14 @@ typedef struct MiscState { @@ -46,11 +46,14 @@ typedef struct MiscState {
46 uint8_t aux1, aux2; 46 uint8_t aux1, aux2;
47 uint8_t diag, mctrl; 47 uint8_t diag, mctrl;
48 uint32_t sysctrl; 48 uint32_t sysctrl;
  49 + uint16_t leds;
49 } MiscState; 50 } MiscState;
50 51
51 #define MISC_SIZE 1 52 #define MISC_SIZE 1
52 #define SYSCTRL_MAXADDR 3 53 #define SYSCTRL_MAXADDR 3
53 #define SYSCTRL_SIZE (SYSCTRL_MAXADDR + 1) 54 #define SYSCTRL_SIZE (SYSCTRL_MAXADDR + 1)
  55 +#define LED_MAXADDR 2
  56 +#define LED_SIZE (LED_MAXADDR + 1)
54 57
55 static void slavio_misc_update_irq(void *opaque) 58 static void slavio_misc_update_irq(void *opaque)
56 { 59 {
@@ -223,6 +226,54 @@ static CPUWriteMemoryFunc *slavio_sysctrl_mem_write[3] = { @@ -223,6 +226,54 @@ static CPUWriteMemoryFunc *slavio_sysctrl_mem_write[3] = {
223 slavio_sysctrl_mem_writel, 226 slavio_sysctrl_mem_writel,
224 }; 227 };
225 228
  229 +static uint32_t slavio_led_mem_reads(void *opaque, target_phys_addr_t addr)
  230 +{
  231 + MiscState *s = opaque;
  232 + uint32_t ret = 0, saddr;
  233 +
  234 + saddr = addr & LED_MAXADDR;
  235 + switch (saddr) {
  236 + case 0:
  237 + ret = s->leds;
  238 + break;
  239 + default:
  240 + break;
  241 + }
  242 + MISC_DPRINTF("Read diagnostic LED reg 0x" TARGET_FMT_plx " = %x\n", addr,
  243 + ret);
  244 + return ret;
  245 +}
  246 +
  247 +static void slavio_led_mem_writes(void *opaque, target_phys_addr_t addr,
  248 + uint32_t val)
  249 +{
  250 + MiscState *s = opaque;
  251 + uint32_t saddr;
  252 +
  253 + saddr = addr & LED_MAXADDR;
  254 + MISC_DPRINTF("Write diagnostic LED reg 0x" TARGET_FMT_plx " = %x\n", addr,
  255 + val);
  256 + switch (saddr) {
  257 + case 0:
  258 + s->sysctrl = val;
  259 + break;
  260 + default:
  261 + break;
  262 + }
  263 +}
  264 +
  265 +static CPUReadMemoryFunc *slavio_led_mem_read[3] = {
  266 + slavio_led_mem_reads,
  267 + slavio_led_mem_reads,
  268 + slavio_led_mem_reads,
  269 +};
  270 +
  271 +static CPUWriteMemoryFunc *slavio_led_mem_write[3] = {
  272 + slavio_led_mem_writes,
  273 + slavio_led_mem_writes,
  274 + slavio_led_mem_writes,
  275 +};
  276 +
226 static void slavio_misc_save(QEMUFile *f, void *opaque) 277 static void slavio_misc_save(QEMUFile *f, void *opaque)
227 { 278 {
228 MiscState *s = opaque; 279 MiscState *s = opaque;
@@ -291,6 +342,13 @@ void *slavio_misc_init(target_phys_addr_t base, target_phys_addr_t power_base, @@ -291,6 +342,13 @@ void *slavio_misc_init(target_phys_addr_t base, target_phys_addr_t power_base,
291 // Power management 342 // Power management
292 cpu_register_physical_memory(power_base, MISC_SIZE, slavio_misc_io_memory); 343 cpu_register_physical_memory(power_base, MISC_SIZE, slavio_misc_io_memory);
293 344
  345 + /* 16 bit registers */
  346 + slavio_misc_io_memory = cpu_register_io_memory(0, slavio_led_mem_read,
  347 + slavio_led_mem_write, s);
  348 + /* ss600mp diag LEDs */
  349 + cpu_register_physical_memory(base + 0x1600000, MISC_SIZE,
  350 + slavio_misc_io_memory);
  351 +
294 /* 32 bit registers */ 352 /* 32 bit registers */
295 slavio_misc_io_memory = cpu_register_io_memory(0, slavio_sysctrl_mem_read, 353 slavio_misc_io_memory = cpu_register_io_memory(0, slavio_sysctrl_mem_read,
296 slavio_sysctrl_mem_write, 354 slavio_sysctrl_mem_write,
hw/sun4m.c
@@ -388,7 +388,8 @@ static void *sun4m_hw_init(const struct hwdef *hwdef, int RAM_size, @@ -388,7 +388,8 @@ static void *sun4m_hw_init(const struct hwdef *hwdef, int RAM_size,
388 slavio_serial_init(hwdef->serial_base, slavio_irq[hwdef->ser_irq], 388 slavio_serial_init(hwdef->serial_base, slavio_irq[hwdef->ser_irq],
389 serial_hds[1], serial_hds[0]); 389 serial_hds[1], serial_hds[0]);
390 390
391 - sun4m_fdctrl_init(slavio_irq[hwdef->fd_irq], hwdef->fd_base, fd_table); 391 + if (hwdef->fd_base != (target_phys_addr_t)-1)
  392 + sun4m_fdctrl_init(slavio_irq[hwdef->fd_irq], hwdef->fd_base, fd_table);
392 393
393 main_esp = esp_init(bs_table, hwdef->esp_base, espdma, *espdma_irq, 394 main_esp = esp_init(bs_table, hwdef->esp_base, espdma, *espdma_irq,
394 esp_reset); 395 esp_reset);
@@ -546,6 +547,39 @@ static const struct hwdef hwdefs[] = { @@ -546,6 +547,39 @@ static const struct hwdef hwdefs[] = {
546 6, 0, 4, 10, 8, 0, 11, 0, 0, 0, 0, 0, 15, 0, 15, 0, 547 6, 0, 4, 10, 8, 0, 11, 0, 0, 0, 0, 0, 15, 0, 15, 0,
547 }, 548 },
548 }, 549 },
  550 + /* SS-600MP */
  551 + {
  552 + .iommu_base = 0xfe0000000ULL,
  553 + .tcx_base = 0xe20000000ULL,
  554 + .cs_base = -1,
  555 + .slavio_base = 0xff0000000ULL,
  556 + .ms_kb_base = 0xff1000000ULL,
  557 + .serial_base = 0xff1100000ULL,
  558 + .nvram_base = 0xff1200000ULL,
  559 + .fd_base = -1,
  560 + .counter_base = 0xff1300000ULL,
  561 + .intctl_base = 0xff1400000ULL,
  562 + .dma_base = 0xef0081000ULL,
  563 + .esp_base = 0xef0080000ULL,
  564 + .le_base = 0xef0060000ULL,
  565 + .power_base = 0xefa000000ULL,
  566 + .vram_size = 0x00100000,
  567 + .nvram_size = 0x2000,
  568 + .esp_irq = 18,
  569 + .le_irq = 16,
  570 + .clock_irq = 7,
  571 + .clock1_irq = 19,
  572 + .ms_kb_irq = 14,
  573 + .ser_irq = 15,
  574 + .fd_irq = 22,
  575 + .me_irq = 30,
  576 + .cs_irq = -1,
  577 + .machine_id = 0x71,
  578 + .intbit_to_level = {
  579 + 2, 3, 5, 7, 9, 11, 0, 14, 3, 5, 7, 9, 11, 13, 12, 12,
  580 + 6, 0, 4, 10, 8, 0, 11, 0, 0, 0, 0, 0, 15, 0, 15, 0,
  581 + },
  582 + },
549 }; 583 };
550 584
551 static void sun4m_common_init(int RAM_size, const char *boot_device, DisplayState *ds, 585 static void sun4m_common_init(int RAM_size, const char *boot_device, DisplayState *ds,
@@ -594,6 +628,19 @@ static void ss10_init(int RAM_size, int vga_ram_size, const char *boot_device, @@ -594,6 +628,19 @@ static void ss10_init(int RAM_size, int vga_ram_size, const char *boot_device,
594 1, 0xffffffff); // XXX actually first 62GB ok 628 1, 0xffffffff); // XXX actually first 62GB ok
595 } 629 }
596 630
  631 +/* SPARCserver 600MP hardware initialisation */
  632 +static void ss600mp_init(int RAM_size, int vga_ram_size, const char *boot_device,
  633 + DisplayState *ds, const char **fd_filename, int snapshot,
  634 + const char *kernel_filename, const char *kernel_cmdline,
  635 + const char *initrd_filename, const char *cpu_model)
  636 +{
  637 + if (cpu_model == NULL)
  638 + cpu_model = "TI SuperSparc II";
  639 + sun4m_common_init(RAM_size, boot_device, ds, kernel_filename,
  640 + kernel_cmdline, initrd_filename, cpu_model,
  641 + 2, 0xffffffff); // XXX actually first 62GB ok
  642 +}
  643 +
597 QEMUMachine ss5_machine = { 644 QEMUMachine ss5_machine = {
598 "SS-5", 645 "SS-5",
599 "Sun4m platform, SPARCstation 5", 646 "Sun4m platform, SPARCstation 5",
@@ -605,3 +652,9 @@ QEMUMachine ss10_machine = { @@ -605,3 +652,9 @@ QEMUMachine ss10_machine = {
605 "Sun4m platform, SPARCstation 10", 652 "Sun4m platform, SPARCstation 10",
606 ss10_init, 653 ss10_init,
607 }; 654 };
  655 +
  656 +QEMUMachine ss600mp_machine = {
  657 + "SS-600MP",
  658 + "Sun4m platform, SPARCserver 600MP",
  659 + ss600mp_init,
  660 +};
qemu-doc.texi
@@ -1949,10 +1949,10 @@ More information is available at @@ -1949,10 +1949,10 @@ More information is available at
1949 @node Sparc32 System emulator 1949 @node Sparc32 System emulator
1950 @section Sparc32 System emulator 1950 @section Sparc32 System emulator
1951 1951
1952 -Use the executable @file{qemu-system-sparc} to simulate a SparcStation 5  
1953 -or SparcStation 10 (sun4m architecture). The emulation is somewhat complete.  
1954 -SMP up to 16 CPUs is supported, but Linux limits the number of usable CPUs  
1955 -to 4. 1952 +Use the executable @file{qemu-system-sparc} to simulate a SPARCstation
  1953 +5, SPARCstation 10, or SPARCserver 600MP (sun4m architecture). The
  1954 +emulation is somewhat complete. SMP up to 16 CPUs is supported, but
  1955 +Linux limits the number of usable CPUs to 4.
1956 1956
1957 QEMU emulates the following sun4m peripherals: 1957 QEMU emulates the following sun4m peripherals:
1958 1958
@@ -1971,13 +1971,14 @@ and power/reset logic @@ -1971,13 +1971,14 @@ and power/reset logic
1971 @item 1971 @item
1972 ESP SCSI controller with hard disk and CD-ROM support 1972 ESP SCSI controller with hard disk and CD-ROM support
1973 @item 1973 @item
1974 -Floppy drive 1974 +Floppy drive (not on SS-600MP)
1975 @item 1975 @item
1976 CS4231 sound device (only on SS-5, not working yet) 1976 CS4231 sound device (only on SS-5, not working yet)
1977 @end itemize 1977 @end itemize
1978 1978
1979 -The number of peripherals is fixed in the architecture. Maximum memory size  
1980 -depends on the machine type, for SS-5 it is 256MB and for SS-10 2047MB. 1979 +The number of peripherals is fixed in the architecture. Maximum
  1980 +memory size depends on the machine type, for SS-5 it is 256MB and for
  1981 +SS-10 and SS-600MP 2047MB.
1981 1982
1982 Since version 0.8.2, QEMU uses OpenBIOS 1983 Since version 0.8.2, QEMU uses OpenBIOS
1983 @url{http://www.openbios.org/}. OpenBIOS is a free (GPL v2) portable 1984 @url{http://www.openbios.org/}. OpenBIOS is a free (GPL v2) portable
@@ -7421,6 +7421,7 @@ void register_machines(void) @@ -7421,6 +7421,7 @@ void register_machines(void)
7421 #else 7421 #else
7422 qemu_register_machine(&ss5_machine); 7422 qemu_register_machine(&ss5_machine);
7423 qemu_register_machine(&ss10_machine); 7423 qemu_register_machine(&ss10_machine);
  7424 + qemu_register_machine(&ss600mp_machine);
7424 #endif 7425 #endif
7425 #elif defined(TARGET_ARM) 7426 #elif defined(TARGET_ARM)
7426 qemu_register_machine(&integratorcp_machine); 7427 qemu_register_machine(&integratorcp_machine);
@@ -1048,7 +1048,7 @@ void PPC_debug_write (void *opaque, uint32_t addr, uint32_t val); @@ -1048,7 +1048,7 @@ void PPC_debug_write (void *opaque, uint32_t addr, uint32_t val);
1048 #endif 1048 #endif
1049 1049
1050 /* sun4m.c */ 1050 /* sun4m.c */
1051 -extern QEMUMachine ss5_machine, ss10_machine; 1051 +extern QEMUMachine ss5_machine, ss10_machine, ss600mp_machine;
1052 1052
1053 /* iommu.c */ 1053 /* iommu.c */
1054 void *iommu_init(target_phys_addr_t addr); 1054 void *iommu_init(target_phys_addr_t addr);