Annotation of qemu/hw/sun4m.c, revision 1.1.1.10

1.1       root        1: /*
1.1.1.6   root        2:  * QEMU Sun4m & Sun4d & Sun4c System Emulator
                      3:  *
1.1       root        4:  * Copyright (c) 2003-2005 Fabrice Bellard
1.1.1.6   root        5:  *
1.1       root        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:  */
1.1.1.8   root       24: #include "sysbus.h"
1.1.1.6   root       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"
1.1.1.10! root       34: #include "esp.h"
1.1.1.7   root       35: #include "pc.h"
                     36: #include "isa.h"
                     37: #include "fw_cfg.h"
                     38: #include "escc.h"
1.1.1.10! root       39: #include "qdev-addr.h"
        !            40: #include "loader.h"
        !            41: #include "elf.h"
1.1.1.6   root       42: 
                     43: //#define DEBUG_IRQ
                     44: 
                     45: /*
                     46:  * Sun4m architecture was used in the following machines:
                     47:  *
                     48:  * SPARCserver 6xxMP/xx
1.1.1.7   root       49:  * SPARCclassic (SPARCclassic Server)(SPARCstation LC) (4/15),
                     50:  * SPARCclassic X (4/10)
1.1.1.6   root       51:  * SPARCstation LX/ZX (4/30)
                     52:  * SPARCstation Voyager
                     53:  * SPARCstation 10/xx, SPARCserver 10/xx
                     54:  * SPARCstation 5, SPARCserver 5
                     55:  * SPARCstation 20/xx, SPARCserver 20
                     56:  * SPARCstation 4
                     57:  *
                     58:  * Sun4d architecture was used in the following machines:
                     59:  *
                     60:  * SPARCcenter 2000
                     61:  * SPARCserver 1000
                     62:  *
                     63:  * Sun4c architecture was used in the following machines:
                     64:  * SPARCstation 1/1+, SPARCserver 1/1+
                     65:  * SPARCstation SLC
                     66:  * SPARCstation IPC
                     67:  * SPARCstation ELC
                     68:  * SPARCstation IPX
                     69:  *
                     70:  * See for example: http://www.sunhelp.org/faq/sunref1.html
                     71:  */
                     72: 
                     73: #ifdef DEBUG_IRQ
1.1.1.8   root       74: #define DPRINTF(fmt, ...)                                       \
                     75:     do { printf("CPUIRQ: " fmt , ## __VA_ARGS__); } while (0)
1.1.1.6   root       76: #else
1.1.1.8   root       77: #define DPRINTF(fmt, ...)
1.1.1.6   root       78: #endif
1.1       root       79: 
                     80: #define KERNEL_LOAD_ADDR     0x00004000
                     81: #define CMDLINE_ADDR         0x007ff000
                     82: #define INITRD_LOAD_ADDR     0x00800000
1.1.1.7   root       83: #define PROM_SIZE_MAX        (1024 * 1024)
1.1.1.6   root       84: #define PROM_VADDR           0xffd00000
                     85: #define PROM_FILENAME        "openbios-sparc32"
1.1.1.7   root       86: #define CFG_ADDR             0xd00000510ULL
                     87: #define FW_CFG_SUN4M_DEPTH   (FW_CFG_ARCH_LOCAL + 0x00)
                     88: 
1.1.1.2   root       89: #define MAX_CPUS 16
1.1.1.6   root       90: #define MAX_PILS 16
                     91: 
1.1.1.7   root       92: #define ESCC_CLOCK 4915200
                     93: 
                     94: struct sun4m_hwdef {
1.1.1.6   root       95:     target_phys_addr_t iommu_base, slavio_base;
                     96:     target_phys_addr_t intctl_base, counter_base, nvram_base, ms_kb_base;
                     97:     target_phys_addr_t serial_base, fd_base;
                     98:     target_phys_addr_t idreg_base, dma_base, esp_base, le_base;
1.1.1.7   root       99:     target_phys_addr_t tcx_base, cs_base, apc_base, aux1_base, aux2_base;
1.1.1.6   root      100:     target_phys_addr_t ecc_base;
                    101:     uint32_t ecc_version;
1.1.1.7   root      102:     uint8_t nvram_machine_id;
                    103:     uint16_t machine_id;
1.1.1.6   root      104:     uint32_t iommu_version;
                    105:     uint64_t max_mem;
                    106:     const char * const default_cpu_model;
                    107: };
                    108: 
                    109: #define MAX_IOUNITS 5
                    110: 
                    111: struct sun4d_hwdef {
                    112:     target_phys_addr_t iounit_bases[MAX_IOUNITS], slavio_base;
                    113:     target_phys_addr_t counter_base, nvram_base, ms_kb_base;
                    114:     target_phys_addr_t serial_base;
                    115:     target_phys_addr_t espdma_base, esp_base;
                    116:     target_phys_addr_t ledma_base, le_base;
                    117:     target_phys_addr_t tcx_base;
                    118:     target_phys_addr_t sbi_base;
1.1.1.7   root      119:     uint8_t nvram_machine_id;
                    120:     uint16_t machine_id;
1.1.1.6   root      121:     uint32_t iounit_version;
                    122:     uint64_t max_mem;
                    123:     const char * const default_cpu_model;
                    124: };
1.1       root      125: 
1.1.1.7   root      126: struct sun4c_hwdef {
                    127:     target_phys_addr_t iommu_base, slavio_base;
                    128:     target_phys_addr_t intctl_base, counter_base, nvram_base, ms_kb_base;
                    129:     target_phys_addr_t serial_base, fd_base;
                    130:     target_phys_addr_t idreg_base, dma_base, esp_base, le_base;
                    131:     target_phys_addr_t tcx_base, aux1_base;
                    132:     uint8_t nvram_machine_id;
                    133:     uint16_t machine_id;
                    134:     uint32_t iommu_version;
                    135:     uint64_t max_mem;
                    136:     const char * const default_cpu_model;
                    137: };
1.1       root      138: 
                    139: int DMA_get_channel_mode (int nchan)
                    140: {
                    141:     return 0;
                    142: }
                    143: int DMA_read_memory (int nchan, void *buf, int pos, int size)
                    144: {
                    145:     return 0;
                    146: }
                    147: int DMA_write_memory (int nchan, void *buf, int pos, int size)
                    148: {
                    149:     return 0;
                    150: }
                    151: void DMA_hold_DREQ (int nchan) {}
                    152: void DMA_release_DREQ (int nchan) {}
                    153: void DMA_schedule(int nchan) {}
                    154: void DMA_init (int high_page_enable) {}
                    155: void DMA_register_channel (int nchan,
                    156:                            DMA_transfer_handler transfer_handler,
                    157:                            void *opaque)
                    158: {
                    159: }
                    160: 
1.1.1.8   root      161: static int fw_cfg_boot_set(void *opaque, const char *boot_device)
1.1.1.7   root      162: {
1.1.1.8   root      163:     fw_cfg_add_i16(opaque, FW_CFG_BOOT_DEVICE, boot_device[0]);
1.1.1.7   root      164:     return 0;
                    165: }
1.1       root      166: 
1.1.1.2   root      167: static void nvram_init(m48t59_t *nvram, uint8_t *macaddr, const char *cmdline,
1.1.1.7   root      168:                        const char *boot_devices, ram_addr_t RAM_size,
1.1.1.6   root      169:                        uint32_t kernel_size,
                    170:                        int width, int height, int depth,
1.1.1.7   root      171:                        int nvram_machine_id, const char *arch)
1.1       root      172: {
1.1.1.6   root      173:     unsigned int i;
                    174:     uint32_t start, end;
                    175:     uint8_t image[0x1ff0];
                    176:     struct OpenBIOS_nvpart_v1 *part_header;
                    177: 
                    178:     memset(image, '\0', sizeof(image));
1.1       root      179: 
1.1.1.8   root      180:     start = 0;
1.1.1.6   root      181: 
                    182:     // OpenBIOS nvram variables
                    183:     // Variable partition
                    184:     part_header = (struct OpenBIOS_nvpart_v1 *)&image[start];
                    185:     part_header->signature = OPENBIOS_PART_SYSTEM;
1.1.1.7   root      186:     pstrcpy(part_header->name, sizeof(part_header->name), "system");
1.1.1.6   root      187: 
                    188:     end = start + sizeof(struct OpenBIOS_nvpart_v1);
                    189:     for (i = 0; i < nb_prom_envs; i++)
                    190:         end = OpenBIOS_set_var(image, end, prom_envs[i]);
                    191: 
                    192:     // End marker
                    193:     image[end++] = '\0';
                    194: 
                    195:     end = start + ((end - start + 15) & ~15);
                    196:     OpenBIOS_finish_partition(part_header, end - start);
                    197: 
                    198:     // free partition
                    199:     start = end;
                    200:     part_header = (struct OpenBIOS_nvpart_v1 *)&image[start];
                    201:     part_header->signature = OPENBIOS_PART_FREE;
1.1.1.7   root      202:     pstrcpy(part_header->name, sizeof(part_header->name), "free");
1.1.1.6   root      203: 
                    204:     end = 0x1fd0;
                    205:     OpenBIOS_finish_partition(part_header, end - start);
                    206: 
1.1.1.7   root      207:     Sun_init_header((struct Sun_nvram *)&image[0x1fd8], macaddr,
                    208:                     nvram_machine_id);
1.1.1.6   root      209: 
                    210:     for (i = 0; i < sizeof(image); i++)
                    211:         m48t59_write(nvram, i, image[i]);
1.1       root      212: }
                    213: 
1.1.1.10! root      214: static DeviceState *slavio_intctl;
1.1       root      215: 
1.1.1.8   root      216: void pic_info(Monitor *mon)
1.1       root      217: {
1.1.1.6   root      218:     if (slavio_intctl)
1.1.1.8   root      219:         slavio_pic_info(mon, slavio_intctl);
1.1       root      220: }
                    221: 
1.1.1.8   root      222: void irq_info(Monitor *mon)
1.1       root      223: {
1.1.1.6   root      224:     if (slavio_intctl)
1.1.1.8   root      225:         slavio_irq_info(mon, slavio_intctl);
1.1       root      226: }
                    227: 
1.1.1.6   root      228: void cpu_check_irqs(CPUState *env)
1.1       root      229: {
1.1.1.6   root      230:     if (env->pil_in && (env->interrupt_index == 0 ||
                    231:                         (env->interrupt_index & ~15) == TT_EXTINT)) {
                    232:         unsigned int i;
                    233: 
                    234:         for (i = 15; i > 0; i--) {
                    235:             if (env->pil_in & (1 << i)) {
                    236:                 int old_interrupt = env->interrupt_index;
                    237: 
                    238:                 env->interrupt_index = TT_EXTINT | i;
1.1.1.7   root      239:                 if (old_interrupt != env->interrupt_index) {
                    240:                     DPRINTF("Set CPU IRQ %d\n", i);
1.1.1.6   root      241:                     cpu_interrupt(env, CPU_INTERRUPT_HARD);
1.1.1.7   root      242:                 }
1.1.1.6   root      243:                 break;
                    244:             }
                    245:         }
                    246:     } else if (!env->pil_in && (env->interrupt_index & ~15) == TT_EXTINT) {
1.1.1.7   root      247:         DPRINTF("Reset CPU IRQ %d\n", env->interrupt_index & 15);
1.1.1.6   root      248:         env->interrupt_index = 0;
                    249:         cpu_reset_interrupt(env, CPU_INTERRUPT_HARD);
                    250:     }
1.1       root      251: }
                    252: 
1.1.1.6   root      253: static void cpu_set_irq(void *opaque, int irq, int level)
1.1.1.4   root      254: {
1.1.1.6   root      255:     CPUState *env = opaque;
                    256: 
                    257:     if (level) {
                    258:         DPRINTF("Raise CPU IRQ %d\n", irq);
                    259:         env->halted = 0;
                    260:         env->pil_in |= 1 << irq;
                    261:         cpu_check_irqs(env);
                    262:     } else {
                    263:         DPRINTF("Lower CPU IRQ %d\n", irq);
                    264:         env->pil_in &= ~(1 << irq);
                    265:         cpu_check_irqs(env);
                    266:     }
1.1.1.4   root      267: }
                    268: 
1.1.1.6   root      269: static void dummy_cpu_set_irq(void *opaque, int irq, int level)
1.1.1.2   root      270: {
                    271: }
                    272: 
                    273: static void main_cpu_reset(void *opaque)
                    274: {
                    275:     CPUState *env = opaque;
1.1.1.6   root      276: 
1.1.1.2   root      277:     cpu_reset(env);
1.1.1.6   root      278:     env->halted = 0;
1.1.1.2   root      279: }
                    280: 
1.1.1.6   root      281: static void secondary_cpu_reset(void *opaque)
1.1       root      282: {
1.1.1.6   root      283:     CPUState *env = opaque;
                    284: 
                    285:     cpu_reset(env);
                    286:     env->halted = 1;
                    287: }
                    288: 
1.1.1.7   root      289: static void cpu_halt_signal(void *opaque, int irq, int level)
                    290: {
                    291:     if (level && cpu_single_env)
                    292:         cpu_interrupt(cpu_single_env, CPU_INTERRUPT_HALT);
                    293: }
                    294: 
1.1.1.6   root      295: static unsigned long sun4m_load_kernel(const char *kernel_filename,
1.1.1.7   root      296:                                        const char *initrd_filename,
                    297:                                        ram_addr_t RAM_size)
1.1.1.6   root      298: {
                    299:     int linux_boot;
1.1       root      300:     unsigned int i;
1.1.1.6   root      301:     long initrd_size, kernel_size;
1.1.1.10! root      302:     uint8_t *ptr;
1.1       root      303: 
                    304:     linux_boot = (kernel_filename != NULL);
                    305: 
1.1.1.6   root      306:     kernel_size = 0;
                    307:     if (linux_boot) {
1.1.1.10! root      308:         int bswap_needed;
        !           309: 
        !           310: #ifdef BSWAP_NEEDED
        !           311:         bswap_needed = 1;
        !           312: #else
        !           313:         bswap_needed = 0;
        !           314: #endif
1.1.1.6   root      315:         kernel_size = load_elf(kernel_filename, -0xf0000000ULL, NULL, NULL,
1.1.1.10! root      316:                                NULL, 1, ELF_MACHINE, 0);
1.1.1.6   root      317:         if (kernel_size < 0)
1.1.1.7   root      318:             kernel_size = load_aout(kernel_filename, KERNEL_LOAD_ADDR,
1.1.1.10! root      319:                                     RAM_size - KERNEL_LOAD_ADDR, bswap_needed,
        !           320:                                     TARGET_PAGE_SIZE);
1.1.1.6   root      321:         if (kernel_size < 0)
1.1.1.7   root      322:             kernel_size = load_image_targphys(kernel_filename,
                    323:                                               KERNEL_LOAD_ADDR,
                    324:                                               RAM_size - KERNEL_LOAD_ADDR);
1.1.1.6   root      325:         if (kernel_size < 0) {
                    326:             fprintf(stderr, "qemu: could not load kernel '%s'\n",
                    327:                     kernel_filename);
                    328:             exit(1);
                    329:         }
                    330: 
                    331:         /* load initrd */
                    332:         initrd_size = 0;
                    333:         if (initrd_filename) {
1.1.1.7   root      334:             initrd_size = load_image_targphys(initrd_filename,
                    335:                                               INITRD_LOAD_ADDR,
                    336:                                               RAM_size - INITRD_LOAD_ADDR);
1.1.1.6   root      337:             if (initrd_size < 0) {
                    338:                 fprintf(stderr, "qemu: could not load initial ram disk '%s'\n",
                    339:                         initrd_filename);
                    340:                 exit(1);
                    341:             }
                    342:         }
                    343:         if (initrd_size > 0) {
                    344:             for (i = 0; i < 64 * TARGET_PAGE_SIZE; i += TARGET_PAGE_SIZE) {
1.1.1.10! root      345:                 ptr = rom_ptr(KERNEL_LOAD_ADDR + i);
        !           346:                 if (ldl_p(ptr) == 0x48647253) { // HdrS
        !           347:                     stl_p(ptr + 16, INITRD_LOAD_ADDR);
        !           348:                     stl_p(ptr + 20, initrd_size);
1.1.1.6   root      349:                     break;
                    350:                 }
                    351:             }
                    352:         }
                    353:     }
                    354:     return kernel_size;
                    355: }
                    356: 
1.1.1.10! root      357: static void *iommu_init(target_phys_addr_t addr, uint32_t version, qemu_irq irq)
        !           358: {
        !           359:     DeviceState *dev;
        !           360:     SysBusDevice *s;
        !           361: 
        !           362:     dev = qdev_create(NULL, "iommu");
        !           363:     qdev_prop_set_uint32(dev, "version", version);
        !           364:     qdev_init_nofail(dev);
        !           365:     s = sysbus_from_qdev(dev);
        !           366:     sysbus_connect_irq(s, 0, irq);
        !           367:     sysbus_mmio_map(s, 0, addr);
        !           368: 
        !           369:     return s;
        !           370: }
        !           371: 
        !           372: static void *sparc32_dma_init(target_phys_addr_t daddr, qemu_irq parent_irq,
        !           373:                               void *iommu, qemu_irq *dev_irq)
        !           374: {
        !           375:     DeviceState *dev;
        !           376:     SysBusDevice *s;
        !           377: 
        !           378:     dev = qdev_create(NULL, "sparc32_dma");
        !           379:     qdev_prop_set_ptr(dev, "iommu_opaque", iommu);
        !           380:     qdev_init_nofail(dev);
        !           381:     s = sysbus_from_qdev(dev);
        !           382:     sysbus_connect_irq(s, 0, parent_irq);
        !           383:     *dev_irq = qdev_get_gpio_in(dev, 0);
        !           384:     sysbus_mmio_map(s, 0, daddr);
        !           385: 
        !           386:     return s;
        !           387: }
        !           388: 
1.1.1.8   root      389: static void lance_init(NICInfo *nd, target_phys_addr_t leaddr,
1.1.1.10! root      390:                        void *dma_opaque, qemu_irq irq)
1.1.1.8   root      391: {
                    392:     DeviceState *dev;
                    393:     SysBusDevice *s;
1.1.1.10! root      394:     qemu_irq reset;
1.1.1.8   root      395: 
                    396:     qemu_check_nic_model(&nd_table[0], "lance");
                    397: 
                    398:     dev = qdev_create(NULL, "lance");
1.1.1.10! root      399:     qdev_set_nic_properties(dev, nd);
1.1.1.9   root      400:     qdev_prop_set_ptr(dev, "dma", dma_opaque);
1.1.1.10! root      401:     qdev_init_nofail(dev);
1.1.1.8   root      402:     s = sysbus_from_qdev(dev);
                    403:     sysbus_mmio_map(s, 0, leaddr);
                    404:     sysbus_connect_irq(s, 0, irq);
1.1.1.10! root      405:     reset = qdev_get_gpio_in(dev, 0);
        !           406:     qdev_connect_gpio_out(dma_opaque, 0, reset);
        !           407: }
        !           408: 
        !           409: static DeviceState *slavio_intctl_init(target_phys_addr_t addr,
        !           410:                                        target_phys_addr_t addrg,
        !           411:                                        qemu_irq **parent_irq)
        !           412: {
        !           413:     DeviceState *dev;
        !           414:     SysBusDevice *s;
        !           415:     unsigned int i, j;
        !           416: 
        !           417:     dev = qdev_create(NULL, "slavio_intctl");
        !           418:     qdev_init_nofail(dev);
        !           419: 
        !           420:     s = sysbus_from_qdev(dev);
        !           421: 
        !           422:     for (i = 0; i < MAX_CPUS; i++) {
        !           423:         for (j = 0; j < MAX_PILS; j++) {
        !           424:             sysbus_connect_irq(s, i * MAX_PILS + j, parent_irq[i][j]);
        !           425:         }
        !           426:     }
        !           427:     sysbus_mmio_map(s, 0, addrg);
        !           428:     for (i = 0; i < MAX_CPUS; i++) {
        !           429:         sysbus_mmio_map(s, i + 1, addr + i * TARGET_PAGE_SIZE);
        !           430:     }
        !           431: 
        !           432:     return dev;
        !           433: }
        !           434: 
        !           435: #define SYS_TIMER_OFFSET      0x10000ULL
        !           436: #define CPU_TIMER_OFFSET(cpu) (0x1000ULL * cpu)
        !           437: 
        !           438: static void slavio_timer_init_all(target_phys_addr_t addr, qemu_irq master_irq,
        !           439:                                   qemu_irq *cpu_irqs, unsigned int num_cpus)
        !           440: {
        !           441:     DeviceState *dev;
        !           442:     SysBusDevice *s;
        !           443:     unsigned int i;
        !           444: 
        !           445:     dev = qdev_create(NULL, "slavio_timer");
        !           446:     qdev_prop_set_uint32(dev, "num_cpus", num_cpus);
        !           447:     qdev_init_nofail(dev);
        !           448:     s = sysbus_from_qdev(dev);
        !           449:     sysbus_connect_irq(s, 0, master_irq);
        !           450:     sysbus_mmio_map(s, 0, addr + SYS_TIMER_OFFSET);
        !           451: 
        !           452:     for (i = 0; i < MAX_CPUS; i++) {
        !           453:         sysbus_mmio_map(s, i + 1, addr + (target_phys_addr_t)CPU_TIMER_OFFSET(i));
        !           454:         sysbus_connect_irq(s, i + 1, cpu_irqs[i]);
        !           455:     }
        !           456: }
        !           457: 
        !           458: #define MISC_LEDS 0x01600000
        !           459: #define MISC_CFG  0x01800000
        !           460: #define MISC_DIAG 0x01a00000
        !           461: #define MISC_MDM  0x01b00000
        !           462: #define MISC_SYS  0x01f00000
        !           463: 
        !           464: static void slavio_misc_init(target_phys_addr_t base,
        !           465:                              target_phys_addr_t aux1_base,
        !           466:                              target_phys_addr_t aux2_base, qemu_irq irq,
        !           467:                              qemu_irq fdc_tc)
        !           468: {
        !           469:     DeviceState *dev;
        !           470:     SysBusDevice *s;
        !           471: 
        !           472:     dev = qdev_create(NULL, "slavio_misc");
        !           473:     qdev_init_nofail(dev);
        !           474:     s = sysbus_from_qdev(dev);
        !           475:     if (base) {
        !           476:         /* 8 bit registers */
        !           477:         /* Slavio control */
        !           478:         sysbus_mmio_map(s, 0, base + MISC_CFG);
        !           479:         /* Diagnostics */
        !           480:         sysbus_mmio_map(s, 1, base + MISC_DIAG);
        !           481:         /* Modem control */
        !           482:         sysbus_mmio_map(s, 2, base + MISC_MDM);
        !           483:         /* 16 bit registers */
        !           484:         /* ss600mp diag LEDs */
        !           485:         sysbus_mmio_map(s, 3, base + MISC_LEDS);
        !           486:         /* 32 bit registers */
        !           487:         /* System control */
        !           488:         sysbus_mmio_map(s, 4, base + MISC_SYS);
        !           489:     }
        !           490:     if (aux1_base) {
        !           491:         /* AUX 1 (Misc System Functions) */
        !           492:         sysbus_mmio_map(s, 5, aux1_base);
        !           493:     }
        !           494:     if (aux2_base) {
        !           495:         /* AUX 2 (Software Powerdown Control) */
        !           496:         sysbus_mmio_map(s, 6, aux2_base);
        !           497:     }
        !           498:     sysbus_connect_irq(s, 0, irq);
        !           499:     sysbus_connect_irq(s, 1, fdc_tc);
        !           500:     qemu_system_powerdown = qdev_get_gpio_in(dev, 0);
        !           501: }
        !           502: 
        !           503: static void ecc_init(target_phys_addr_t base, qemu_irq irq, uint32_t version)
        !           504: {
        !           505:     DeviceState *dev;
        !           506:     SysBusDevice *s;
        !           507: 
        !           508:     dev = qdev_create(NULL, "eccmemctl");
        !           509:     qdev_prop_set_uint32(dev, "version", version);
        !           510:     qdev_init_nofail(dev);
        !           511:     s = sysbus_from_qdev(dev);
        !           512:     sysbus_connect_irq(s, 0, irq);
        !           513:     sysbus_mmio_map(s, 0, base);
        !           514:     if (version == 0) { // SS-600MP only
        !           515:         sysbus_mmio_map(s, 1, base + 0x1000);
        !           516:     }
        !           517: }
        !           518: 
        !           519: static void apc_init(target_phys_addr_t power_base, qemu_irq cpu_halt)
        !           520: {
        !           521:     DeviceState *dev;
        !           522:     SysBusDevice *s;
        !           523: 
        !           524:     dev = qdev_create(NULL, "apc");
        !           525:     qdev_init_nofail(dev);
        !           526:     s = sysbus_from_qdev(dev);
        !           527:     /* Power management (APC) XXX: not a Slavio device */
        !           528:     sysbus_mmio_map(s, 0, power_base);
        !           529:     sysbus_connect_irq(s, 0, cpu_halt);
        !           530: }
        !           531: 
        !           532: static void tcx_init(target_phys_addr_t addr, int vram_size, int width,
        !           533:                      int height, int depth)
        !           534: {
        !           535:     DeviceState *dev;
        !           536:     SysBusDevice *s;
        !           537: 
        !           538:     dev = qdev_create(NULL, "SUNW,tcx");
        !           539:     qdev_prop_set_taddr(dev, "addr", addr);
        !           540:     qdev_prop_set_uint32(dev, "vram_size", vram_size);
        !           541:     qdev_prop_set_uint16(dev, "width", width);
        !           542:     qdev_prop_set_uint16(dev, "height", height);
        !           543:     qdev_prop_set_uint16(dev, "depth", depth);
        !           544:     qdev_init_nofail(dev);
        !           545:     s = sysbus_from_qdev(dev);
        !           546:     /* 8-bit plane */
        !           547:     sysbus_mmio_map(s, 0, addr + 0x00800000ULL);
        !           548:     /* DAC */
        !           549:     sysbus_mmio_map(s, 1, addr + 0x00200000ULL);
        !           550:     /* TEC (dummy) */
        !           551:     sysbus_mmio_map(s, 2, addr + 0x00700000ULL);
        !           552:     /* THC 24 bit: NetBSD writes here even with 8-bit display: dummy */
        !           553:     sysbus_mmio_map(s, 3, addr + 0x00301000ULL);
        !           554:     if (depth == 24) {
        !           555:         /* 24-bit plane */
        !           556:         sysbus_mmio_map(s, 4, addr + 0x02000000ULL);
        !           557:         /* Control plane */
        !           558:         sysbus_mmio_map(s, 5, addr + 0x0a000000ULL);
        !           559:     } else {
        !           560:         /* THC 8 bit (dummy) */
        !           561:         sysbus_mmio_map(s, 4, addr + 0x00300000ULL);
        !           562:     }
1.1.1.8   root      563: }
                    564: 
                    565: /* NCR89C100/MACIO Internal ID register */
                    566: static const uint8_t idreg_data[] = { 0xfe, 0x81, 0x01, 0x03 };
                    567: 
                    568: static void idreg_init(target_phys_addr_t addr)
                    569: {
                    570:     DeviceState *dev;
                    571:     SysBusDevice *s;
                    572: 
                    573:     dev = qdev_create(NULL, "macio_idreg");
1.1.1.10! root      574:     qdev_init_nofail(dev);
1.1.1.8   root      575:     s = sysbus_from_qdev(dev);
                    576: 
                    577:     sysbus_mmio_map(s, 0, addr);
                    578:     cpu_physical_memory_write_rom(addr, idreg_data, sizeof(idreg_data));
                    579: }
                    580: 
1.1.1.10! root      581: static int idreg_init1(SysBusDevice *dev)
1.1.1.8   root      582: {
                    583:     ram_addr_t idreg_offset;
                    584: 
                    585:     idreg_offset = qemu_ram_alloc(sizeof(idreg_data));
                    586:     sysbus_init_mmio(dev, sizeof(idreg_data), idreg_offset | IO_MEM_ROM);
1.1.1.10! root      587:     return 0;
1.1.1.8   root      588: }
                    589: 
                    590: static SysBusDeviceInfo idreg_info = {
                    591:     .init = idreg_init1,
                    592:     .qdev.name  = "macio_idreg",
                    593:     .qdev.size  = sizeof(SysBusDevice),
                    594: };
                    595: 
                    596: static void idreg_register_devices(void)
                    597: {
                    598:     sysbus_register_withprop(&idreg_info);
                    599: }
                    600: 
                    601: device_init(idreg_register_devices);
                    602: 
                    603: /* Boot PROM (OpenBIOS) */
                    604: static void prom_init(target_phys_addr_t addr, const char *bios_name)
                    605: {
                    606:     DeviceState *dev;
                    607:     SysBusDevice *s;
                    608:     char *filename;
                    609:     int ret;
                    610: 
                    611:     dev = qdev_create(NULL, "openprom");
1.1.1.10! root      612:     qdev_init_nofail(dev);
1.1.1.8   root      613:     s = sysbus_from_qdev(dev);
                    614: 
                    615:     sysbus_mmio_map(s, 0, addr);
                    616: 
                    617:     /* load boot prom */
                    618:     if (bios_name == NULL) {
                    619:         bios_name = PROM_FILENAME;
                    620:     }
                    621:     filename = qemu_find_file(QEMU_FILE_TYPE_BIOS, bios_name);
                    622:     if (filename) {
1.1.1.10! root      623:         ret = load_elf(filename, addr - PROM_VADDR, NULL, NULL, NULL,
        !           624:                        1, ELF_MACHINE, 0);
1.1.1.8   root      625:         if (ret < 0 || ret > PROM_SIZE_MAX) {
                    626:             ret = load_image_targphys(filename, addr, PROM_SIZE_MAX);
                    627:         }
                    628:         qemu_free(filename);
                    629:     } else {
                    630:         ret = -1;
                    631:     }
                    632:     if (ret < 0 || ret > PROM_SIZE_MAX) {
                    633:         fprintf(stderr, "qemu: could not load prom '%s'\n", bios_name);
                    634:         exit(1);
                    635:     }
                    636: }
                    637: 
1.1.1.10! root      638: static int prom_init1(SysBusDevice *dev)
1.1.1.8   root      639: {
                    640:     ram_addr_t prom_offset;
                    641: 
                    642:     prom_offset = qemu_ram_alloc(PROM_SIZE_MAX);
                    643:     sysbus_init_mmio(dev, PROM_SIZE_MAX, prom_offset | IO_MEM_ROM);
1.1.1.10! root      644:     return 0;
1.1.1.8   root      645: }
                    646: 
                    647: static SysBusDeviceInfo prom_info = {
                    648:     .init = prom_init1,
                    649:     .qdev.name  = "openprom",
                    650:     .qdev.size  = sizeof(SysBusDevice),
                    651:     .qdev.props = (Property[]) {
                    652:         {/* end of property list */}
                    653:     }
                    654: };
                    655: 
                    656: static void prom_register_devices(void)
                    657: {
                    658:     sysbus_register_withprop(&prom_info);
                    659: }
                    660: 
                    661: device_init(prom_register_devices);
                    662: 
                    663: typedef struct RamDevice
                    664: {
                    665:     SysBusDevice busdev;
1.1.1.10! root      666:     uint64_t size;
1.1.1.8   root      667: } RamDevice;
                    668: 
                    669: /* System RAM */
1.1.1.10! root      670: static int ram_init1(SysBusDevice *dev)
1.1.1.8   root      671: {
                    672:     ram_addr_t RAM_size, ram_offset;
                    673:     RamDevice *d = FROM_SYSBUS(RamDevice, dev);
                    674: 
                    675:     RAM_size = d->size;
                    676: 
                    677:     ram_offset = qemu_ram_alloc(RAM_size);
                    678:     sysbus_init_mmio(dev, RAM_size, ram_offset);
1.1.1.10! root      679:     return 0;
1.1.1.8   root      680: }
                    681: 
                    682: static void ram_init(target_phys_addr_t addr, ram_addr_t RAM_size,
                    683:                      uint64_t max_mem)
                    684: {
                    685:     DeviceState *dev;
                    686:     SysBusDevice *s;
                    687:     RamDevice *d;
                    688: 
                    689:     /* allocate RAM */
                    690:     if ((uint64_t)RAM_size > max_mem) {
                    691:         fprintf(stderr,
                    692:                 "qemu: Too much memory for this machine: %d, maximum %d\n",
                    693:                 (unsigned int)(RAM_size / (1024 * 1024)),
                    694:                 (unsigned int)(max_mem / (1024 * 1024)));
                    695:         exit(1);
                    696:     }
                    697:     dev = qdev_create(NULL, "memory");
                    698:     s = sysbus_from_qdev(dev);
                    699: 
                    700:     d = FROM_SYSBUS(RamDevice, s);
                    701:     d->size = RAM_size;
1.1.1.10! root      702:     qdev_init_nofail(dev);
1.1.1.8   root      703: 
                    704:     sysbus_mmio_map(s, 0, addr);
                    705: }
                    706: 
                    707: static SysBusDeviceInfo ram_info = {
                    708:     .init = ram_init1,
                    709:     .qdev.name  = "memory",
                    710:     .qdev.size  = sizeof(RamDevice),
                    711:     .qdev.props = (Property[]) {
1.1.1.10! root      712:         DEFINE_PROP_UINT64("size", RamDevice, size, 0),
        !           713:         DEFINE_PROP_END_OF_LIST(),
1.1.1.8   root      714:     }
                    715: };
                    716: 
                    717: static void ram_register_devices(void)
                    718: {
                    719:     sysbus_register_withprop(&ram_info);
                    720: }
                    721: 
                    722: device_init(ram_register_devices);
                    723: 
                    724: static CPUState *cpu_devinit(const char *cpu_model, unsigned int id,
                    725:                              uint64_t prom_addr, qemu_irq **cpu_irqs)
                    726: {
                    727:     CPUState *env;
                    728: 
                    729:     env = cpu_init(cpu_model);
                    730:     if (!env) {
                    731:         fprintf(stderr, "qemu: Unable to find Sparc CPU definition\n");
                    732:         exit(1);
                    733:     }
                    734: 
                    735:     cpu_sparc_set_id(env, id);
                    736:     if (id == 0) {
                    737:         qemu_register_reset(main_cpu_reset, env);
                    738:     } else {
                    739:         qemu_register_reset(secondary_cpu_reset, env);
                    740:         env->halted = 1;
                    741:     }
                    742:     *cpu_irqs = qemu_allocate_irqs(cpu_set_irq, env, MAX_PILS);
                    743:     env->prom_addr = prom_addr;
                    744: 
                    745:     return env;
                    746: }
                    747: 
1.1.1.7   root      748: static void sun4m_hw_init(const struct sun4m_hwdef *hwdef, ram_addr_t RAM_size,
1.1.1.6   root      749:                           const char *boot_device,
1.1.1.7   root      750:                           const char *kernel_filename,
1.1.1.6   root      751:                           const char *kernel_cmdline,
                    752:                           const char *initrd_filename, const char *cpu_model)
                    753: {
1.1.1.8   root      754:     CPUState *envs[MAX_CPUS];
1.1.1.6   root      755:     unsigned int i;
1.1.1.8   root      756:     void *iommu, *espdma, *ledma, *nvram;
                    757:     qemu_irq *cpu_irqs[MAX_CPUS], slavio_irq[32], slavio_cpu_irq[MAX_CPUS],
                    758:         espdma_irq, ledma_irq;
1.1.1.10! root      759:     qemu_irq esp_reset;
1.1.1.8   root      760:     qemu_irq fdc_tc;
1.1.1.7   root      761:     qemu_irq *cpu_halt;
                    762:     unsigned long kernel_size;
1.1.1.10! root      763:     DriveInfo *fd[MAX_FD];
1.1.1.7   root      764:     void *fw_cfg;
1.1.1.6   root      765: 
1.1.1.2   root      766:     /* init CPUs */
1.1.1.6   root      767:     if (!cpu_model)
                    768:         cpu_model = hwdef->default_cpu_model;
                    769: 
1.1.1.2   root      770:     for(i = 0; i < smp_cpus; i++) {
1.1.1.8   root      771:         envs[i] = cpu_devinit(cpu_model, i, hwdef->slavio_base, &cpu_irqs[i]);
1.1.1.2   root      772:     }
1.1.1.6   root      773: 
                    774:     for (i = smp_cpus; i < MAX_CPUS; i++)
                    775:         cpu_irqs[i] = qemu_allocate_irqs(dummy_cpu_set_irq, NULL, MAX_PILS);
                    776: 
                    777: 
1.1.1.8   root      778:     /* set up devices */
                    779:     ram_init(0, RAM_size, hwdef->max_mem);
1.1       root      780: 
1.1.1.8   root      781:     prom_init(hwdef->slavio_base, bios_name);
1.1.1.6   root      782: 
1.1.1.10! root      783:     slavio_intctl = slavio_intctl_init(hwdef->intctl_base,
        !           784:                                        hwdef->intctl_base + 0x10000ULL,
        !           785:                                        cpu_irqs);
1.1.1.2   root      786: 
1.1.1.8   root      787:     for (i = 0; i < 32; i++) {
1.1.1.10! root      788:         slavio_irq[i] = qdev_get_gpio_in(slavio_intctl, i);
1.1.1.8   root      789:     }
                    790:     for (i = 0; i < MAX_CPUS; i++) {
1.1.1.10! root      791:         slavio_cpu_irq[i] = qdev_get_gpio_in(slavio_intctl, 32 + i);
1.1.1.8   root      792:     }
1.1.1.6   root      793: 
1.1.1.7   root      794:     if (hwdef->idreg_base) {
1.1.1.8   root      795:         idreg_init(hwdef->idreg_base);
1.1.1.3   root      796:     }
1.1.1.6   root      797: 
                    798:     iommu = iommu_init(hwdef->iommu_base, hwdef->iommu_version,
1.1.1.10! root      799:                        slavio_irq[30]);
1.1.1.6   root      800: 
1.1.1.10! root      801:     espdma = sparc32_dma_init(hwdef->dma_base, slavio_irq[18],
        !           802:                               iommu, &espdma_irq);
1.1.1.6   root      803: 
                    804:     ledma = sparc32_dma_init(hwdef->dma_base + 16ULL,
1.1.1.10! root      805:                              slavio_irq[16], iommu, &ledma_irq);
1.1.1.6   root      806: 
                    807:     if (graphic_depth != 8 && graphic_depth != 24) {
                    808:         fprintf(stderr, "qemu: Unsupported depth: %d\n", graphic_depth);
                    809:         exit (1);
                    810:     }
1.1.1.10! root      811:     tcx_init(hwdef->tcx_base, 0x00100000, graphic_width, graphic_height,
1.1.1.8   root      812:              graphic_depth);
1.1.1.6   root      813: 
1.1.1.10! root      814:     lance_init(&nd_table[0], hwdef->le_base, ledma, ledma_irq);
1.1.1.6   root      815: 
1.1.1.10! root      816:     nvram = m48t59_init(slavio_irq[0], hwdef->nvram_base, 0, 0x2000, 8);
1.1.1.6   root      817: 
1.1.1.10! root      818:     slavio_timer_init_all(hwdef->counter_base, slavio_irq[19], slavio_cpu_irq, smp_cpus);
1.1.1.6   root      819: 
1.1.1.10! root      820:     slavio_serial_ms_kbd_init(hwdef->ms_kb_base, slavio_irq[14],
1.1.1.8   root      821:                               display_type == DT_NOGRAPHIC, ESCC_CLOCK, 1);
1.1       root      822:     // Slavio TTYA (base+4, Linux ttyS0) is the first Qemu serial device
                    823:     // Slavio TTYB (base+0, Linux ttyS1) is the second Qemu serial device
1.1.1.10! root      824:     escc_init(hwdef->serial_base, slavio_irq[15], slavio_irq[15],
1.1.1.7   root      825:               serial_hds[0], serial_hds[1], ESCC_CLOCK, 1);
1.1.1.6   root      826: 
1.1.1.7   root      827:     cpu_halt = qemu_allocate_irqs(cpu_halt_signal, NULL, 1);
1.1.1.10! root      828:     slavio_misc_init(hwdef->slavio_base, hwdef->aux1_base, hwdef->aux2_base,
        !           829:                      slavio_irq[30], fdc_tc);
        !           830: 
1.1.1.8   root      831:     if (hwdef->apc_base) {
                    832:         apc_init(hwdef->apc_base, cpu_halt[0]);
                    833:     }
1.1.1.7   root      834: 
                    835:     if (hwdef->fd_base) {
1.1.1.6   root      836:         /* there is zero or one floppy drive */
1.1.1.7   root      837:         memset(fd, 0, sizeof(fd));
1.1.1.10! root      838:         fd[0] = drive_get(IF_FLOPPY, 0, 0);
        !           839:         sun4m_fdctrl_init(slavio_irq[22], hwdef->fd_base, fd,
1.1.1.8   root      840:                           &fdc_tc);
1.1.1.6   root      841:     }
                    842: 
                    843:     if (drive_get_max_bus(IF_SCSI) > 0) {
                    844:         fprintf(stderr, "qemu: too many SCSI bus\n");
                    845:         exit(1);
                    846:     }
                    847: 
1.1.1.10! root      848:     esp_reset = qdev_get_gpio_in(espdma, 0);
1.1.1.8   root      849:     esp_init(hwdef->esp_base, 2,
                    850:              espdma_memory_read, espdma_memory_write,
1.1.1.10! root      851:              espdma, espdma_irq, &esp_reset);
        !           852: 
1.1.1.8   root      853: 
                    854:     if (hwdef->cs_base) {
                    855:         sysbus_create_simple("SUNW,CS4231", hwdef->cs_base,
1.1.1.10! root      856:                              slavio_irq[5]);
1.1.1.6   root      857:     }
                    858: 
1.1.1.7   root      859:     kernel_size = sun4m_load_kernel(kernel_filename, initrd_filename,
                    860:                                     RAM_size);
1.1.1.6   root      861: 
                    862:     nvram_init(nvram, (uint8_t *)&nd_table[0].macaddr, kernel_cmdline,
                    863:                boot_device, RAM_size, kernel_size, graphic_width,
1.1.1.7   root      864:                graphic_height, graphic_depth, hwdef->nvram_machine_id,
                    865:                "Sun4m");
1.1.1.6   root      866: 
1.1.1.7   root      867:     if (hwdef->ecc_base)
1.1.1.10! root      868:         ecc_init(hwdef->ecc_base, slavio_irq[28],
1.1.1.7   root      869:                  hwdef->ecc_version);
                    870: 
                    871:     fw_cfg = fw_cfg_init(0, 0, CFG_ADDR, CFG_ADDR + 2);
                    872:     fw_cfg_add_i32(fw_cfg, FW_CFG_ID, 1);
                    873:     fw_cfg_add_i64(fw_cfg, FW_CFG_RAM_SIZE, (uint64_t)ram_size);
                    874:     fw_cfg_add_i16(fw_cfg, FW_CFG_MACHINE_ID, hwdef->machine_id);
                    875:     fw_cfg_add_i16(fw_cfg, FW_CFG_SUN4M_DEPTH, graphic_depth);
1.1.1.8   root      876:     fw_cfg_add_i32(fw_cfg, FW_CFG_KERNEL_ADDR, KERNEL_LOAD_ADDR);
                    877:     fw_cfg_add_i32(fw_cfg, FW_CFG_KERNEL_SIZE, kernel_size);
                    878:     if (kernel_cmdline) {
                    879:         fw_cfg_add_i32(fw_cfg, FW_CFG_KERNEL_CMDLINE, CMDLINE_ADDR);
1.1.1.10! root      880:         pstrcpy_targphys("cmdline", CMDLINE_ADDR, TARGET_PAGE_SIZE, kernel_cmdline);
1.1.1.8   root      881:     } else {
                    882:         fw_cfg_add_i32(fw_cfg, FW_CFG_KERNEL_CMDLINE, 0);
                    883:     }
                    884:     fw_cfg_add_i32(fw_cfg, FW_CFG_INITRD_ADDR, INITRD_LOAD_ADDR);
                    885:     fw_cfg_add_i32(fw_cfg, FW_CFG_INITRD_SIZE, 0); // not used
                    886:     fw_cfg_add_i16(fw_cfg, FW_CFG_BOOT_DEVICE, boot_device[0]);
                    887:     qemu_register_boot_set(fw_cfg_boot_set, fw_cfg);
1.1.1.7   root      888: }
                    889: 
                    890: enum {
                    891:     ss2_id = 0,
                    892:     ss5_id = 32,
                    893:     vger_id,
                    894:     lx_id,
                    895:     ss4_id,
                    896:     scls_id,
                    897:     sbook_id,
                    898:     ss10_id = 64,
                    899:     ss20_id,
                    900:     ss600mp_id,
                    901:     ss1000_id = 96,
                    902:     ss2000_id,
                    903: };
1.1.1.6   root      904: 
1.1.1.7   root      905: static const struct sun4m_hwdef sun4m_hwdefs[] = {
1.1.1.6   root      906:     /* SS-5 */
                    907:     {
                    908:         .iommu_base   = 0x10000000,
                    909:         .tcx_base     = 0x50000000,
                    910:         .cs_base      = 0x6c000000,
                    911:         .slavio_base  = 0x70000000,
                    912:         .ms_kb_base   = 0x71000000,
                    913:         .serial_base  = 0x71100000,
                    914:         .nvram_base   = 0x71200000,
                    915:         .fd_base      = 0x71400000,
                    916:         .counter_base = 0x71d00000,
                    917:         .intctl_base  = 0x71e00000,
                    918:         .idreg_base   = 0x78000000,
                    919:         .dma_base     = 0x78400000,
                    920:         .esp_base     = 0x78800000,
                    921:         .le_base      = 0x78c00000,
1.1.1.7   root      922:         .apc_base     = 0x6a000000,
                    923:         .aux1_base    = 0x71900000,
                    924:         .aux2_base    = 0x71910000,
                    925:         .nvram_machine_id = 0x80,
                    926:         .machine_id = ss5_id,
1.1.1.6   root      927:         .iommu_version = 0x05000000,
                    928:         .max_mem = 0x10000000,
                    929:         .default_cpu_model = "Fujitsu MB86904",
                    930:     },
                    931:     /* SS-10 */
                    932:     {
                    933:         .iommu_base   = 0xfe0000000ULL,
                    934:         .tcx_base     = 0xe20000000ULL,
                    935:         .slavio_base  = 0xff0000000ULL,
                    936:         .ms_kb_base   = 0xff1000000ULL,
                    937:         .serial_base  = 0xff1100000ULL,
                    938:         .nvram_base   = 0xff1200000ULL,
                    939:         .fd_base      = 0xff1700000ULL,
                    940:         .counter_base = 0xff1300000ULL,
                    941:         .intctl_base  = 0xff1400000ULL,
                    942:         .idreg_base   = 0xef0000000ULL,
                    943:         .dma_base     = 0xef0400000ULL,
                    944:         .esp_base     = 0xef0800000ULL,
                    945:         .le_base      = 0xef0c00000ULL,
1.1.1.7   root      946:         .apc_base     = 0xefa000000ULL, // XXX should not exist
                    947:         .aux1_base    = 0xff1800000ULL,
                    948:         .aux2_base    = 0xff1a01000ULL,
1.1.1.6   root      949:         .ecc_base     = 0xf00000000ULL,
                    950:         .ecc_version  = 0x10000000, // version 0, implementation 1
1.1.1.7   root      951:         .nvram_machine_id = 0x72,
                    952:         .machine_id = ss10_id,
1.1.1.6   root      953:         .iommu_version = 0x03000000,
1.1.1.7   root      954:         .max_mem = 0xf00000000ULL,
1.1.1.6   root      955:         .default_cpu_model = "TI SuperSparc II",
                    956:     },
                    957:     /* SS-600MP */
                    958:     {
                    959:         .iommu_base   = 0xfe0000000ULL,
                    960:         .tcx_base     = 0xe20000000ULL,
                    961:         .slavio_base  = 0xff0000000ULL,
                    962:         .ms_kb_base   = 0xff1000000ULL,
                    963:         .serial_base  = 0xff1100000ULL,
                    964:         .nvram_base   = 0xff1200000ULL,
                    965:         .counter_base = 0xff1300000ULL,
                    966:         .intctl_base  = 0xff1400000ULL,
                    967:         .dma_base     = 0xef0081000ULL,
                    968:         .esp_base     = 0xef0080000ULL,
                    969:         .le_base      = 0xef0060000ULL,
1.1.1.7   root      970:         .apc_base     = 0xefa000000ULL, // XXX should not exist
                    971:         .aux1_base    = 0xff1800000ULL,
                    972:         .aux2_base    = 0xff1a01000ULL, // XXX should not exist
1.1.1.6   root      973:         .ecc_base     = 0xf00000000ULL,
                    974:         .ecc_version  = 0x00000000, // version 0, implementation 0
1.1.1.7   root      975:         .nvram_machine_id = 0x71,
                    976:         .machine_id = ss600mp_id,
1.1.1.6   root      977:         .iommu_version = 0x01000000,
1.1.1.7   root      978:         .max_mem = 0xf00000000ULL,
1.1.1.6   root      979:         .default_cpu_model = "TI SuperSparc II",
                    980:     },
                    981:     /* SS-20 */
                    982:     {
                    983:         .iommu_base   = 0xfe0000000ULL,
                    984:         .tcx_base     = 0xe20000000ULL,
                    985:         .slavio_base  = 0xff0000000ULL,
                    986:         .ms_kb_base   = 0xff1000000ULL,
                    987:         .serial_base  = 0xff1100000ULL,
                    988:         .nvram_base   = 0xff1200000ULL,
                    989:         .fd_base      = 0xff1700000ULL,
                    990:         .counter_base = 0xff1300000ULL,
                    991:         .intctl_base  = 0xff1400000ULL,
                    992:         .idreg_base   = 0xef0000000ULL,
                    993:         .dma_base     = 0xef0400000ULL,
                    994:         .esp_base     = 0xef0800000ULL,
                    995:         .le_base      = 0xef0c00000ULL,
1.1.1.7   root      996:         .apc_base     = 0xefa000000ULL, // XXX should not exist
                    997:         .aux1_base    = 0xff1800000ULL,
                    998:         .aux2_base    = 0xff1a01000ULL,
1.1.1.6   root      999:         .ecc_base     = 0xf00000000ULL,
                   1000:         .ecc_version  = 0x20000000, // version 0, implementation 2
1.1.1.7   root     1001:         .nvram_machine_id = 0x72,
                   1002:         .machine_id = ss20_id,
1.1.1.6   root     1003:         .iommu_version = 0x13000000,
1.1.1.7   root     1004:         .max_mem = 0xf00000000ULL,
1.1.1.6   root     1005:         .default_cpu_model = "TI SuperSparc II",
                   1006:     },
1.1.1.7   root     1007:     /* Voyager */
1.1.1.6   root     1008:     {
1.1.1.7   root     1009:         .iommu_base   = 0x10000000,
                   1010:         .tcx_base     = 0x50000000,
                   1011:         .slavio_base  = 0x70000000,
                   1012:         .ms_kb_base   = 0x71000000,
                   1013:         .serial_base  = 0x71100000,
                   1014:         .nvram_base   = 0x71200000,
                   1015:         .fd_base      = 0x71400000,
                   1016:         .counter_base = 0x71d00000,
                   1017:         .intctl_base  = 0x71e00000,
                   1018:         .idreg_base   = 0x78000000,
                   1019:         .dma_base     = 0x78400000,
                   1020:         .esp_base     = 0x78800000,
                   1021:         .le_base      = 0x78c00000,
                   1022:         .apc_base     = 0x71300000, // pmc
                   1023:         .aux1_base    = 0x71900000,
                   1024:         .aux2_base    = 0x71910000,
                   1025:         .nvram_machine_id = 0x80,
                   1026:         .machine_id = vger_id,
                   1027:         .iommu_version = 0x05000000,
1.1.1.6   root     1028:         .max_mem = 0x10000000,
1.1.1.7   root     1029:         .default_cpu_model = "Fujitsu MB86904",
                   1030:     },
                   1031:     /* LX */
                   1032:     {
                   1033:         .iommu_base   = 0x10000000,
                   1034:         .tcx_base     = 0x50000000,
                   1035:         .slavio_base  = 0x70000000,
                   1036:         .ms_kb_base   = 0x71000000,
                   1037:         .serial_base  = 0x71100000,
                   1038:         .nvram_base   = 0x71200000,
                   1039:         .fd_base      = 0x71400000,
                   1040:         .counter_base = 0x71d00000,
                   1041:         .intctl_base  = 0x71e00000,
                   1042:         .idreg_base   = 0x78000000,
                   1043:         .dma_base     = 0x78400000,
                   1044:         .esp_base     = 0x78800000,
                   1045:         .le_base      = 0x78c00000,
                   1046:         .aux1_base    = 0x71900000,
                   1047:         .aux2_base    = 0x71910000,
                   1048:         .nvram_machine_id = 0x80,
                   1049:         .machine_id = lx_id,
                   1050:         .iommu_version = 0x04000000,
                   1051:         .max_mem = 0x10000000,
                   1052:         .default_cpu_model = "TI MicroSparc I",
                   1053:     },
                   1054:     /* SS-4 */
                   1055:     {
                   1056:         .iommu_base   = 0x10000000,
                   1057:         .tcx_base     = 0x50000000,
                   1058:         .cs_base      = 0x6c000000,
                   1059:         .slavio_base  = 0x70000000,
                   1060:         .ms_kb_base   = 0x71000000,
                   1061:         .serial_base  = 0x71100000,
                   1062:         .nvram_base   = 0x71200000,
                   1063:         .fd_base      = 0x71400000,
                   1064:         .counter_base = 0x71d00000,
                   1065:         .intctl_base  = 0x71e00000,
                   1066:         .idreg_base   = 0x78000000,
                   1067:         .dma_base     = 0x78400000,
                   1068:         .esp_base     = 0x78800000,
                   1069:         .le_base      = 0x78c00000,
                   1070:         .apc_base     = 0x6a000000,
                   1071:         .aux1_base    = 0x71900000,
                   1072:         .aux2_base    = 0x71910000,
                   1073:         .nvram_machine_id = 0x80,
                   1074:         .machine_id = ss4_id,
                   1075:         .iommu_version = 0x05000000,
                   1076:         .max_mem = 0x10000000,
                   1077:         .default_cpu_model = "Fujitsu MB86904",
                   1078:     },
                   1079:     /* SPARCClassic */
                   1080:     {
                   1081:         .iommu_base   = 0x10000000,
                   1082:         .tcx_base     = 0x50000000,
                   1083:         .slavio_base  = 0x70000000,
                   1084:         .ms_kb_base   = 0x71000000,
                   1085:         .serial_base  = 0x71100000,
                   1086:         .nvram_base   = 0x71200000,
                   1087:         .fd_base      = 0x71400000,
                   1088:         .counter_base = 0x71d00000,
                   1089:         .intctl_base  = 0x71e00000,
                   1090:         .idreg_base   = 0x78000000,
                   1091:         .dma_base     = 0x78400000,
                   1092:         .esp_base     = 0x78800000,
                   1093:         .le_base      = 0x78c00000,
                   1094:         .apc_base     = 0x6a000000,
                   1095:         .aux1_base    = 0x71900000,
                   1096:         .aux2_base    = 0x71910000,
                   1097:         .nvram_machine_id = 0x80,
                   1098:         .machine_id = scls_id,
                   1099:         .iommu_version = 0x05000000,
                   1100:         .max_mem = 0x10000000,
                   1101:         .default_cpu_model = "TI MicroSparc I",
                   1102:     },
                   1103:     /* SPARCbook */
                   1104:     {
                   1105:         .iommu_base   = 0x10000000,
                   1106:         .tcx_base     = 0x50000000, // XXX
                   1107:         .slavio_base  = 0x70000000,
                   1108:         .ms_kb_base   = 0x71000000,
                   1109:         .serial_base  = 0x71100000,
                   1110:         .nvram_base   = 0x71200000,
                   1111:         .fd_base      = 0x71400000,
                   1112:         .counter_base = 0x71d00000,
                   1113:         .intctl_base  = 0x71e00000,
                   1114:         .idreg_base   = 0x78000000,
                   1115:         .dma_base     = 0x78400000,
                   1116:         .esp_base     = 0x78800000,
                   1117:         .le_base      = 0x78c00000,
                   1118:         .apc_base     = 0x6a000000,
                   1119:         .aux1_base    = 0x71900000,
                   1120:         .aux2_base    = 0x71910000,
                   1121:         .nvram_machine_id = 0x80,
                   1122:         .machine_id = sbook_id,
                   1123:         .iommu_version = 0x05000000,
                   1124:         .max_mem = 0x10000000,
                   1125:         .default_cpu_model = "TI MicroSparc I",
1.1.1.6   root     1126:     },
                   1127: };
                   1128: 
                   1129: /* SPARCstation 5 hardware initialisation */
1.1.1.8   root     1130: static void ss5_init(ram_addr_t RAM_size,
1.1.1.7   root     1131:                      const char *boot_device,
1.1.1.6   root     1132:                      const char *kernel_filename, const char *kernel_cmdline,
                   1133:                      const char *initrd_filename, const char *cpu_model)
                   1134: {
1.1.1.7   root     1135:     sun4m_hw_init(&sun4m_hwdefs[0], RAM_size, boot_device, kernel_filename,
1.1.1.6   root     1136:                   kernel_cmdline, initrd_filename, cpu_model);
                   1137: }
                   1138: 
                   1139: /* SPARCstation 10 hardware initialisation */
1.1.1.8   root     1140: static void ss10_init(ram_addr_t RAM_size,
1.1.1.7   root     1141:                       const char *boot_device,
1.1.1.6   root     1142:                       const char *kernel_filename, const char *kernel_cmdline,
                   1143:                       const char *initrd_filename, const char *cpu_model)
                   1144: {
1.1.1.7   root     1145:     sun4m_hw_init(&sun4m_hwdefs[1], RAM_size, boot_device, kernel_filename,
1.1.1.6   root     1146:                   kernel_cmdline, initrd_filename, cpu_model);
                   1147: }
                   1148: 
                   1149: /* SPARCserver 600MP hardware initialisation */
1.1.1.8   root     1150: static void ss600mp_init(ram_addr_t RAM_size,
1.1.1.7   root     1151:                          const char *boot_device,
                   1152:                          const char *kernel_filename,
                   1153:                          const char *kernel_cmdline,
1.1.1.6   root     1154:                          const char *initrd_filename, const char *cpu_model)
                   1155: {
1.1.1.7   root     1156:     sun4m_hw_init(&sun4m_hwdefs[2], RAM_size, boot_device, kernel_filename,
1.1.1.6   root     1157:                   kernel_cmdline, initrd_filename, cpu_model);
                   1158: }
                   1159: 
                   1160: /* SPARCstation 20 hardware initialisation */
1.1.1.8   root     1161: static void ss20_init(ram_addr_t RAM_size,
1.1.1.7   root     1162:                       const char *boot_device,
1.1.1.6   root     1163:                       const char *kernel_filename, const char *kernel_cmdline,
                   1164:                       const char *initrd_filename, const char *cpu_model)
                   1165: {
1.1.1.7   root     1166:     sun4m_hw_init(&sun4m_hwdefs[3], RAM_size, boot_device, kernel_filename,
1.1.1.6   root     1167:                   kernel_cmdline, initrd_filename, cpu_model);
                   1168: }
                   1169: 
1.1.1.7   root     1170: /* SPARCstation Voyager hardware initialisation */
1.1.1.8   root     1171: static void vger_init(ram_addr_t RAM_size,
1.1.1.7   root     1172:                       const char *boot_device,
                   1173:                       const char *kernel_filename, const char *kernel_cmdline,
                   1174:                       const char *initrd_filename, const char *cpu_model)
                   1175: {
                   1176:     sun4m_hw_init(&sun4m_hwdefs[4], RAM_size, boot_device, kernel_filename,
                   1177:                   kernel_cmdline, initrd_filename, cpu_model);
                   1178: }
                   1179: 
                   1180: /* SPARCstation LX hardware initialisation */
1.1.1.8   root     1181: static void ss_lx_init(ram_addr_t RAM_size,
1.1.1.7   root     1182:                        const char *boot_device,
                   1183:                        const char *kernel_filename, const char *kernel_cmdline,
                   1184:                        const char *initrd_filename, const char *cpu_model)
                   1185: {
                   1186:     sun4m_hw_init(&sun4m_hwdefs[5], RAM_size, boot_device, kernel_filename,
                   1187:                   kernel_cmdline, initrd_filename, cpu_model);
                   1188: }
                   1189: 
                   1190: /* SPARCstation 4 hardware initialisation */
1.1.1.8   root     1191: static void ss4_init(ram_addr_t RAM_size,
1.1.1.7   root     1192:                      const char *boot_device,
1.1.1.6   root     1193:                      const char *kernel_filename, const char *kernel_cmdline,
                   1194:                      const char *initrd_filename, const char *cpu_model)
                   1195: {
1.1.1.7   root     1196:     sun4m_hw_init(&sun4m_hwdefs[6], RAM_size, boot_device, kernel_filename,
                   1197:                   kernel_cmdline, initrd_filename, cpu_model);
                   1198: }
                   1199: 
                   1200: /* SPARCClassic hardware initialisation */
1.1.1.8   root     1201: static void scls_init(ram_addr_t RAM_size,
1.1.1.7   root     1202:                       const char *boot_device,
                   1203:                       const char *kernel_filename, const char *kernel_cmdline,
                   1204:                       const char *initrd_filename, const char *cpu_model)
                   1205: {
                   1206:     sun4m_hw_init(&sun4m_hwdefs[7], RAM_size, boot_device, kernel_filename,
                   1207:                   kernel_cmdline, initrd_filename, cpu_model);
                   1208: }
                   1209: 
                   1210: /* SPARCbook hardware initialisation */
1.1.1.8   root     1211: static void sbook_init(ram_addr_t RAM_size,
1.1.1.7   root     1212:                        const char *boot_device,
                   1213:                        const char *kernel_filename, const char *kernel_cmdline,
                   1214:                        const char *initrd_filename, const char *cpu_model)
                   1215: {
                   1216:     sun4m_hw_init(&sun4m_hwdefs[8], RAM_size, boot_device, kernel_filename,
1.1.1.6   root     1217:                   kernel_cmdline, initrd_filename, cpu_model);
                   1218: }
                   1219: 
1.1.1.8   root     1220: static QEMUMachine ss5_machine = {
1.1.1.7   root     1221:     .name = "SS-5",
                   1222:     .desc = "Sun4m platform, SPARCstation 5",
                   1223:     .init = ss5_init,
                   1224:     .use_scsi = 1,
1.1.1.8   root     1225:     .is_default = 1,
1.1.1.6   root     1226: };
                   1227: 
1.1.1.8   root     1228: static QEMUMachine ss10_machine = {
1.1.1.7   root     1229:     .name = "SS-10",
                   1230:     .desc = "Sun4m platform, SPARCstation 10",
                   1231:     .init = ss10_init,
                   1232:     .use_scsi = 1,
                   1233:     .max_cpus = 4,
1.1.1.6   root     1234: };
                   1235: 
1.1.1.8   root     1236: static QEMUMachine ss600mp_machine = {
1.1.1.7   root     1237:     .name = "SS-600MP",
                   1238:     .desc = "Sun4m platform, SPARCserver 600MP",
                   1239:     .init = ss600mp_init,
                   1240:     .use_scsi = 1,
                   1241:     .max_cpus = 4,
1.1.1.6   root     1242: };
                   1243: 
1.1.1.8   root     1244: static QEMUMachine ss20_machine = {
1.1.1.7   root     1245:     .name = "SS-20",
                   1246:     .desc = "Sun4m platform, SPARCstation 20",
                   1247:     .init = ss20_init,
                   1248:     .use_scsi = 1,
                   1249:     .max_cpus = 4,
1.1.1.6   root     1250: };
                   1251: 
1.1.1.8   root     1252: static QEMUMachine voyager_machine = {
1.1.1.7   root     1253:     .name = "Voyager",
                   1254:     .desc = "Sun4m platform, SPARCstation Voyager",
                   1255:     .init = vger_init,
                   1256:     .use_scsi = 1,
                   1257: };
                   1258: 
1.1.1.8   root     1259: static QEMUMachine ss_lx_machine = {
1.1.1.7   root     1260:     .name = "LX",
                   1261:     .desc = "Sun4m platform, SPARCstation LX",
                   1262:     .init = ss_lx_init,
                   1263:     .use_scsi = 1,
                   1264: };
                   1265: 
1.1.1.8   root     1266: static QEMUMachine ss4_machine = {
1.1.1.7   root     1267:     .name = "SS-4",
                   1268:     .desc = "Sun4m platform, SPARCstation 4",
                   1269:     .init = ss4_init,
                   1270:     .use_scsi = 1,
                   1271: };
                   1272: 
1.1.1.8   root     1273: static QEMUMachine scls_machine = {
1.1.1.7   root     1274:     .name = "SPARCClassic",
                   1275:     .desc = "Sun4m platform, SPARCClassic",
                   1276:     .init = scls_init,
                   1277:     .use_scsi = 1,
                   1278: };
                   1279: 
1.1.1.8   root     1280: static QEMUMachine sbook_machine = {
1.1.1.7   root     1281:     .name = "SPARCbook",
                   1282:     .desc = "Sun4m platform, SPARCbook",
                   1283:     .init = sbook_init,
                   1284:     .use_scsi = 1,
1.1.1.6   root     1285: };
                   1286: 
                   1287: static const struct sun4d_hwdef sun4d_hwdefs[] = {
                   1288:     /* SS-1000 */
                   1289:     {
                   1290:         .iounit_bases   = {
                   1291:             0xfe0200000ULL,
                   1292:             0xfe1200000ULL,
                   1293:             0xfe2200000ULL,
                   1294:             0xfe3200000ULL,
                   1295:             -1,
                   1296:         },
                   1297:         .tcx_base     = 0x820000000ULL,
                   1298:         .slavio_base  = 0xf00000000ULL,
                   1299:         .ms_kb_base   = 0xf00240000ULL,
                   1300:         .serial_base  = 0xf00200000ULL,
                   1301:         .nvram_base   = 0xf00280000ULL,
                   1302:         .counter_base = 0xf00300000ULL,
                   1303:         .espdma_base  = 0x800081000ULL,
                   1304:         .esp_base     = 0x800080000ULL,
                   1305:         .ledma_base   = 0x800040000ULL,
                   1306:         .le_base      = 0x800060000ULL,
                   1307:         .sbi_base     = 0xf02800000ULL,
1.1.1.7   root     1308:         .nvram_machine_id = 0x80,
                   1309:         .machine_id = ss1000_id,
1.1.1.6   root     1310:         .iounit_version = 0x03000000,
1.1.1.7   root     1311:         .max_mem = 0xf00000000ULL,
1.1.1.6   root     1312:         .default_cpu_model = "TI SuperSparc II",
                   1313:     },
                   1314:     /* SS-2000 */
                   1315:     {
                   1316:         .iounit_bases   = {
                   1317:             0xfe0200000ULL,
                   1318:             0xfe1200000ULL,
                   1319:             0xfe2200000ULL,
                   1320:             0xfe3200000ULL,
                   1321:             0xfe4200000ULL,
                   1322:         },
                   1323:         .tcx_base     = 0x820000000ULL,
                   1324:         .slavio_base  = 0xf00000000ULL,
                   1325:         .ms_kb_base   = 0xf00240000ULL,
                   1326:         .serial_base  = 0xf00200000ULL,
                   1327:         .nvram_base   = 0xf00280000ULL,
                   1328:         .counter_base = 0xf00300000ULL,
                   1329:         .espdma_base  = 0x800081000ULL,
                   1330:         .esp_base     = 0x800080000ULL,
                   1331:         .ledma_base   = 0x800040000ULL,
                   1332:         .le_base      = 0x800060000ULL,
                   1333:         .sbi_base     = 0xf02800000ULL,
1.1.1.7   root     1334:         .nvram_machine_id = 0x80,
                   1335:         .machine_id = ss2000_id,
1.1.1.6   root     1336:         .iounit_version = 0x03000000,
1.1.1.7   root     1337:         .max_mem = 0xf00000000ULL,
1.1.1.6   root     1338:         .default_cpu_model = "TI SuperSparc II",
                   1339:     },
                   1340: };
                   1341: 
1.1.1.10! root     1342: static DeviceState *sbi_init(target_phys_addr_t addr, qemu_irq **parent_irq)
        !          1343: {
        !          1344:     DeviceState *dev;
        !          1345:     SysBusDevice *s;
        !          1346:     unsigned int i;
        !          1347: 
        !          1348:     dev = qdev_create(NULL, "sbi");
        !          1349:     qdev_init_nofail(dev);
        !          1350: 
        !          1351:     s = sysbus_from_qdev(dev);
        !          1352: 
        !          1353:     for (i = 0; i < MAX_CPUS; i++) {
        !          1354:         sysbus_connect_irq(s, i, *parent_irq[i]);
        !          1355:     }
        !          1356: 
        !          1357:     sysbus_mmio_map(s, 0, addr);
        !          1358: 
        !          1359:     return dev;
        !          1360: }
        !          1361: 
1.1.1.7   root     1362: static void sun4d_hw_init(const struct sun4d_hwdef *hwdef, ram_addr_t RAM_size,
1.1.1.6   root     1363:                           const char *boot_device,
1.1.1.7   root     1364:                           const char *kernel_filename,
1.1.1.6   root     1365:                           const char *kernel_cmdline,
                   1366:                           const char *initrd_filename, const char *cpu_model)
                   1367: {
1.1.1.8   root     1368:     CPUState *envs[MAX_CPUS];
1.1.1.6   root     1369:     unsigned int i;
1.1.1.10! root     1370:     void *iounits[MAX_IOUNITS], *espdma, *ledma, *nvram;
        !          1371:     qemu_irq *cpu_irqs[MAX_CPUS], sbi_irq[32], sbi_cpu_irq[MAX_CPUS],
1.1.1.8   root     1372:         espdma_irq, ledma_irq;
1.1.1.10! root     1373:     qemu_irq esp_reset;
1.1.1.7   root     1374:     unsigned long kernel_size;
                   1375:     void *fw_cfg;
1.1.1.10! root     1376:     DeviceState *dev;
1.1.1.6   root     1377: 
                   1378:     /* init CPUs */
                   1379:     if (!cpu_model)
                   1380:         cpu_model = hwdef->default_cpu_model;
                   1381: 
1.1.1.8   root     1382:     for(i = 0; i < smp_cpus; i++) {
                   1383:         envs[i] = cpu_devinit(cpu_model, i, hwdef->slavio_base, &cpu_irqs[i]);
1.1.1.6   root     1384:     }
                   1385: 
                   1386:     for (i = smp_cpus; i < MAX_CPUS; i++)
                   1387:         cpu_irqs[i] = qemu_allocate_irqs(dummy_cpu_set_irq, NULL, MAX_PILS);
                   1388: 
1.1.1.8   root     1389:     /* set up devices */
                   1390:     ram_init(0, RAM_size, hwdef->max_mem);
1.1.1.6   root     1391: 
1.1.1.8   root     1392:     prom_init(hwdef->slavio_base, bios_name);
1.1.1.6   root     1393: 
1.1.1.10! root     1394:     dev = sbi_init(hwdef->sbi_base, cpu_irqs);
        !          1395: 
        !          1396:     for (i = 0; i < 32; i++) {
        !          1397:         sbi_irq[i] = qdev_get_gpio_in(dev, i);
        !          1398:     }
        !          1399:     for (i = 0; i < MAX_CPUS; i++) {
        !          1400:         sbi_cpu_irq[i] = qdev_get_gpio_in(dev, 32 + i);
        !          1401:     }
1.1.1.6   root     1402: 
                   1403:     for (i = 0; i < MAX_IOUNITS; i++)
                   1404:         if (hwdef->iounit_bases[i] != (target_phys_addr_t)-1)
                   1405:             iounits[i] = iommu_init(hwdef->iounit_bases[i],
                   1406:                                     hwdef->iounit_version,
1.1.1.10! root     1407:                                     sbi_irq[0]);
1.1.1.6   root     1408: 
1.1.1.10! root     1409:     espdma = sparc32_dma_init(hwdef->espdma_base, sbi_irq[3],
        !          1410:                               iounits[0], &espdma_irq);
1.1.1.6   root     1411: 
1.1.1.10! root     1412:     ledma = sparc32_dma_init(hwdef->ledma_base, sbi_irq[4],
        !          1413:                              iounits[0], &ledma_irq);
1.1.1.6   root     1414: 
                   1415:     if (graphic_depth != 8 && graphic_depth != 24) {
                   1416:         fprintf(stderr, "qemu: Unsupported depth: %d\n", graphic_depth);
                   1417:         exit (1);
                   1418:     }
1.1.1.10! root     1419:     tcx_init(hwdef->tcx_base, 0x00100000, graphic_width, graphic_height,
1.1.1.8   root     1420:              graphic_depth);
1.1.1.6   root     1421: 
1.1.1.10! root     1422:     lance_init(&nd_table[0], hwdef->le_base, ledma, ledma_irq);
1.1.1.6   root     1423: 
1.1.1.10! root     1424:     nvram = m48t59_init(sbi_irq[0], hwdef->nvram_base, 0, 0x2000, 8);
1.1.1.6   root     1425: 
1.1.1.10! root     1426:     slavio_timer_init_all(hwdef->counter_base, sbi_irq[10], sbi_cpu_irq, smp_cpus);
1.1.1.6   root     1427: 
1.1.1.10! root     1428:     slavio_serial_ms_kbd_init(hwdef->ms_kb_base, sbi_irq[12],
1.1.1.8   root     1429:                               display_type == DT_NOGRAPHIC, ESCC_CLOCK, 1);
1.1.1.6   root     1430:     // Slavio TTYA (base+4, Linux ttyS0) is the first Qemu serial device
                   1431:     // Slavio TTYB (base+0, Linux ttyS1) is the second Qemu serial device
1.1.1.10! root     1432:     escc_init(hwdef->serial_base, sbi_irq[12], sbi_irq[12],
1.1.1.7   root     1433:               serial_hds[0], serial_hds[1], ESCC_CLOCK, 1);
1.1.1.6   root     1434: 
                   1435:     if (drive_get_max_bus(IF_SCSI) > 0) {
                   1436:         fprintf(stderr, "qemu: too many SCSI bus\n");
                   1437:         exit(1);
                   1438:     }
                   1439: 
1.1.1.10! root     1440:     esp_reset = qdev_get_gpio_in(espdma, 0);
1.1.1.8   root     1441:     esp_init(hwdef->esp_base, 2,
                   1442:              espdma_memory_read, espdma_memory_write,
1.1.1.10! root     1443:              espdma, espdma_irq, &esp_reset);
1.1.1.6   root     1444: 
1.1.1.7   root     1445:     kernel_size = sun4m_load_kernel(kernel_filename, initrd_filename,
                   1446:                                     RAM_size);
1.1.1.6   root     1447: 
                   1448:     nvram_init(nvram, (uint8_t *)&nd_table[0].macaddr, kernel_cmdline,
                   1449:                boot_device, RAM_size, kernel_size, graphic_width,
1.1.1.7   root     1450:                graphic_height, graphic_depth, hwdef->nvram_machine_id,
                   1451:                "Sun4d");
                   1452: 
                   1453:     fw_cfg = fw_cfg_init(0, 0, CFG_ADDR, CFG_ADDR + 2);
                   1454:     fw_cfg_add_i32(fw_cfg, FW_CFG_ID, 1);
                   1455:     fw_cfg_add_i64(fw_cfg, FW_CFG_RAM_SIZE, (uint64_t)ram_size);
                   1456:     fw_cfg_add_i16(fw_cfg, FW_CFG_MACHINE_ID, hwdef->machine_id);
1.1.1.8   root     1457:     fw_cfg_add_i16(fw_cfg, FW_CFG_SUN4M_DEPTH, graphic_depth);
                   1458:     fw_cfg_add_i32(fw_cfg, FW_CFG_KERNEL_ADDR, KERNEL_LOAD_ADDR);
                   1459:     fw_cfg_add_i32(fw_cfg, FW_CFG_KERNEL_SIZE, kernel_size);
                   1460:     if (kernel_cmdline) {
                   1461:         fw_cfg_add_i32(fw_cfg, FW_CFG_KERNEL_CMDLINE, CMDLINE_ADDR);
1.1.1.10! root     1462:         pstrcpy_targphys("cmdline", CMDLINE_ADDR, TARGET_PAGE_SIZE, kernel_cmdline);
1.1.1.8   root     1463:     } else {
                   1464:         fw_cfg_add_i32(fw_cfg, FW_CFG_KERNEL_CMDLINE, 0);
                   1465:     }
                   1466:     fw_cfg_add_i32(fw_cfg, FW_CFG_INITRD_ADDR, INITRD_LOAD_ADDR);
                   1467:     fw_cfg_add_i32(fw_cfg, FW_CFG_INITRD_SIZE, 0); // not used
                   1468:     fw_cfg_add_i16(fw_cfg, FW_CFG_BOOT_DEVICE, boot_device[0]);
                   1469:     qemu_register_boot_set(fw_cfg_boot_set, fw_cfg);
1.1.1.6   root     1470: }
                   1471: 
                   1472: /* SPARCserver 1000 hardware initialisation */
1.1.1.8   root     1473: static void ss1000_init(ram_addr_t RAM_size,
1.1.1.7   root     1474:                         const char *boot_device,
1.1.1.6   root     1475:                         const char *kernel_filename, const char *kernel_cmdline,
                   1476:                         const char *initrd_filename, const char *cpu_model)
                   1477: {
1.1.1.7   root     1478:     sun4d_hw_init(&sun4d_hwdefs[0], RAM_size, boot_device, kernel_filename,
1.1.1.6   root     1479:                   kernel_cmdline, initrd_filename, cpu_model);
1.1       root     1480: }
                   1481: 
1.1.1.6   root     1482: /* SPARCcenter 2000 hardware initialisation */
1.1.1.8   root     1483: static void ss2000_init(ram_addr_t RAM_size,
1.1.1.7   root     1484:                         const char *boot_device,
1.1.1.6   root     1485:                         const char *kernel_filename, const char *kernel_cmdline,
                   1486:                         const char *initrd_filename, const char *cpu_model)
                   1487: {
1.1.1.7   root     1488:     sun4d_hw_init(&sun4d_hwdefs[1], RAM_size, boot_device, kernel_filename,
1.1.1.6   root     1489:                   kernel_cmdline, initrd_filename, cpu_model);
                   1490: }
                   1491: 
1.1.1.8   root     1492: static QEMUMachine ss1000_machine = {
1.1.1.7   root     1493:     .name = "SS-1000",
                   1494:     .desc = "Sun4d platform, SPARCserver 1000",
                   1495:     .init = ss1000_init,
                   1496:     .use_scsi = 1,
                   1497:     .max_cpus = 8,
1.1.1.6   root     1498: };
                   1499: 
1.1.1.8   root     1500: static QEMUMachine ss2000_machine = {
1.1.1.7   root     1501:     .name = "SS-2000",
                   1502:     .desc = "Sun4d platform, SPARCcenter 2000",
                   1503:     .init = ss2000_init,
                   1504:     .use_scsi = 1,
                   1505:     .max_cpus = 20,
                   1506: };
                   1507: 
                   1508: static const struct sun4c_hwdef sun4c_hwdefs[] = {
                   1509:     /* SS-2 */
                   1510:     {
                   1511:         .iommu_base   = 0xf8000000,
                   1512:         .tcx_base     = 0xfe000000,
                   1513:         .slavio_base  = 0xf6000000,
                   1514:         .intctl_base  = 0xf5000000,
                   1515:         .counter_base = 0xf3000000,
                   1516:         .ms_kb_base   = 0xf0000000,
                   1517:         .serial_base  = 0xf1000000,
                   1518:         .nvram_base   = 0xf2000000,
                   1519:         .fd_base      = 0xf7200000,
                   1520:         .dma_base     = 0xf8400000,
                   1521:         .esp_base     = 0xf8800000,
                   1522:         .le_base      = 0xf8c00000,
                   1523:         .aux1_base    = 0xf7400003,
                   1524:         .nvram_machine_id = 0x55,
                   1525:         .machine_id = ss2_id,
                   1526:         .max_mem = 0x10000000,
                   1527:         .default_cpu_model = "Cypress CY7C601",
                   1528:     },
                   1529: };
                   1530: 
1.1.1.10! root     1531: static DeviceState *sun4c_intctl_init(target_phys_addr_t addr,
        !          1532:                                       qemu_irq *parent_irq)
        !          1533: {
        !          1534:     DeviceState *dev;
        !          1535:     SysBusDevice *s;
        !          1536:     unsigned int i;
        !          1537: 
        !          1538:     dev = qdev_create(NULL, "sun4c_intctl");
        !          1539:     qdev_init_nofail(dev);
        !          1540: 
        !          1541:     s = sysbus_from_qdev(dev);
        !          1542: 
        !          1543:     for (i = 0; i < MAX_PILS; i++) {
        !          1544:         sysbus_connect_irq(s, i, parent_irq[i]);
        !          1545:     }
        !          1546:     sysbus_mmio_map(s, 0, addr);
        !          1547: 
        !          1548:     return dev;
        !          1549: }
        !          1550: 
1.1.1.7   root     1551: static void sun4c_hw_init(const struct sun4c_hwdef *hwdef, ram_addr_t RAM_size,
                   1552:                           const char *boot_device,
                   1553:                           const char *kernel_filename,
                   1554:                           const char *kernel_cmdline,
                   1555:                           const char *initrd_filename, const char *cpu_model)
                   1556: {
                   1557:     CPUState *env;
1.1.1.8   root     1558:     void *iommu, *espdma, *ledma, *nvram;
1.1.1.10! root     1559:     qemu_irq *cpu_irqs, slavio_irq[8], espdma_irq, ledma_irq;
        !          1560:     qemu_irq esp_reset;
1.1.1.8   root     1561:     qemu_irq fdc_tc;
1.1.1.7   root     1562:     unsigned long kernel_size;
1.1.1.10! root     1563:     DriveInfo *fd[MAX_FD];
1.1.1.7   root     1564:     void *fw_cfg;
1.1.1.10! root     1565:     DeviceState *dev;
        !          1566:     unsigned int i;
1.1.1.7   root     1567: 
                   1568:     /* init CPU */
                   1569:     if (!cpu_model)
                   1570:         cpu_model = hwdef->default_cpu_model;
                   1571: 
1.1.1.8   root     1572:     env = cpu_devinit(cpu_model, 0, hwdef->slavio_base, &cpu_irqs);
1.1.1.7   root     1573: 
1.1.1.8   root     1574:     /* set up devices */
                   1575:     ram_init(0, RAM_size, hwdef->max_mem);
1.1.1.7   root     1576: 
1.1.1.8   root     1577:     prom_init(hwdef->slavio_base, bios_name);
1.1.1.7   root     1578: 
1.1.1.10! root     1579:     dev = sun4c_intctl_init(hwdef->intctl_base, cpu_irqs);
        !          1580: 
        !          1581:     for (i = 0; i < 8; i++) {
        !          1582:         slavio_irq[i] = qdev_get_gpio_in(dev, i);
        !          1583:     }
1.1.1.7   root     1584: 
                   1585:     iommu = iommu_init(hwdef->iommu_base, hwdef->iommu_version,
1.1.1.10! root     1586:                        slavio_irq[1]);
1.1.1.7   root     1587: 
1.1.1.10! root     1588:     espdma = sparc32_dma_init(hwdef->dma_base, slavio_irq[2],
        !          1589:                               iommu, &espdma_irq);
1.1.1.7   root     1590: 
                   1591:     ledma = sparc32_dma_init(hwdef->dma_base + 16ULL,
1.1.1.10! root     1592:                              slavio_irq[3], iommu, &ledma_irq);
1.1.1.7   root     1593: 
                   1594:     if (graphic_depth != 8 && graphic_depth != 24) {
                   1595:         fprintf(stderr, "qemu: Unsupported depth: %d\n", graphic_depth);
                   1596:         exit (1);
                   1597:     }
1.1.1.10! root     1598:     tcx_init(hwdef->tcx_base, 0x00100000, graphic_width, graphic_height,
1.1.1.8   root     1599:              graphic_depth);
1.1.1.7   root     1600: 
1.1.1.10! root     1601:     lance_init(&nd_table[0], hwdef->le_base, ledma, ledma_irq);
1.1.1.7   root     1602: 
1.1.1.10! root     1603:     nvram = m48t59_init(slavio_irq[0], hwdef->nvram_base, 0, 0x800, 2);
1.1.1.7   root     1604: 
1.1.1.10! root     1605:     slavio_serial_ms_kbd_init(hwdef->ms_kb_base, slavio_irq[1],
1.1.1.8   root     1606:                               display_type == DT_NOGRAPHIC, ESCC_CLOCK, 1);
1.1.1.7   root     1607:     // Slavio TTYA (base+4, Linux ttyS0) is the first Qemu serial device
                   1608:     // Slavio TTYB (base+0, Linux ttyS1) is the second Qemu serial device
1.1.1.10! root     1609:     escc_init(hwdef->serial_base, slavio_irq[1],
        !          1610:               slavio_irq[1], serial_hds[0], serial_hds[1],
1.1.1.7   root     1611:               ESCC_CLOCK, 1);
                   1612: 
1.1.1.10! root     1613:     slavio_misc_init(0, hwdef->aux1_base, 0, slavio_irq[1], fdc_tc);
1.1.1.7   root     1614: 
                   1615:     if (hwdef->fd_base != (target_phys_addr_t)-1) {
                   1616:         /* there is zero or one floppy drive */
                   1617:         memset(fd, 0, sizeof(fd));
1.1.1.10! root     1618:         fd[0] = drive_get(IF_FLOPPY, 0, 0);
        !          1619:         sun4m_fdctrl_init(slavio_irq[1], hwdef->fd_base, fd,
1.1.1.8   root     1620:                           &fdc_tc);
1.1.1.7   root     1621:     }
                   1622: 
                   1623:     if (drive_get_max_bus(IF_SCSI) > 0) {
                   1624:         fprintf(stderr, "qemu: too many SCSI bus\n");
                   1625:         exit(1);
                   1626:     }
                   1627: 
1.1.1.10! root     1628:     esp_reset = qdev_get_gpio_in(espdma, 0);
1.1.1.8   root     1629:     esp_init(hwdef->esp_base, 2,
                   1630:              espdma_memory_read, espdma_memory_write,
1.1.1.10! root     1631:              espdma, espdma_irq, &esp_reset);
1.1.1.7   root     1632: 
                   1633:     kernel_size = sun4m_load_kernel(kernel_filename, initrd_filename,
                   1634:                                     RAM_size);
                   1635: 
                   1636:     nvram_init(nvram, (uint8_t *)&nd_table[0].macaddr, kernel_cmdline,
                   1637:                boot_device, RAM_size, kernel_size, graphic_width,
                   1638:                graphic_height, graphic_depth, hwdef->nvram_machine_id,
                   1639:                "Sun4c");
                   1640: 
                   1641:     fw_cfg = fw_cfg_init(0, 0, CFG_ADDR, CFG_ADDR + 2);
                   1642:     fw_cfg_add_i32(fw_cfg, FW_CFG_ID, 1);
                   1643:     fw_cfg_add_i64(fw_cfg, FW_CFG_RAM_SIZE, (uint64_t)ram_size);
                   1644:     fw_cfg_add_i16(fw_cfg, FW_CFG_MACHINE_ID, hwdef->machine_id);
1.1.1.8   root     1645:     fw_cfg_add_i16(fw_cfg, FW_CFG_SUN4M_DEPTH, graphic_depth);
                   1646:     fw_cfg_add_i32(fw_cfg, FW_CFG_KERNEL_ADDR, KERNEL_LOAD_ADDR);
                   1647:     fw_cfg_add_i32(fw_cfg, FW_CFG_KERNEL_SIZE, kernel_size);
                   1648:     if (kernel_cmdline) {
                   1649:         fw_cfg_add_i32(fw_cfg, FW_CFG_KERNEL_CMDLINE, CMDLINE_ADDR);
1.1.1.10! root     1650:         pstrcpy_targphys("cmdline", CMDLINE_ADDR, TARGET_PAGE_SIZE, kernel_cmdline);
1.1.1.8   root     1651:     } else {
                   1652:         fw_cfg_add_i32(fw_cfg, FW_CFG_KERNEL_CMDLINE, 0);
                   1653:     }
                   1654:     fw_cfg_add_i32(fw_cfg, FW_CFG_INITRD_ADDR, INITRD_LOAD_ADDR);
                   1655:     fw_cfg_add_i32(fw_cfg, FW_CFG_INITRD_SIZE, 0); // not used
                   1656:     fw_cfg_add_i16(fw_cfg, FW_CFG_BOOT_DEVICE, boot_device[0]);
                   1657:     qemu_register_boot_set(fw_cfg_boot_set, fw_cfg);
1.1.1.7   root     1658: }
                   1659: 
                   1660: /* SPARCstation 2 hardware initialisation */
1.1.1.8   root     1661: static void ss2_init(ram_addr_t RAM_size,
1.1.1.7   root     1662:                      const char *boot_device,
                   1663:                      const char *kernel_filename, const char *kernel_cmdline,
                   1664:                      const char *initrd_filename, const char *cpu_model)
                   1665: {
                   1666:     sun4c_hw_init(&sun4c_hwdefs[0], RAM_size, boot_device, kernel_filename,
                   1667:                   kernel_cmdline, initrd_filename, cpu_model);
                   1668: }
                   1669: 
1.1.1.8   root     1670: static QEMUMachine ss2_machine = {
1.1.1.7   root     1671:     .name = "SS-2",
                   1672:     .desc = "Sun4c platform, SPARCstation 2",
                   1673:     .init = ss2_init,
                   1674:     .use_scsi = 1,
1.1       root     1675: };
1.1.1.8   root     1676: 
                   1677: static void ss2_machine_init(void)
                   1678: {
                   1679:     qemu_register_machine(&ss5_machine);
                   1680:     qemu_register_machine(&ss10_machine);
                   1681:     qemu_register_machine(&ss600mp_machine);
                   1682:     qemu_register_machine(&ss20_machine);
                   1683:     qemu_register_machine(&voyager_machine);
                   1684:     qemu_register_machine(&ss_lx_machine);
                   1685:     qemu_register_machine(&ss4_machine);
                   1686:     qemu_register_machine(&scls_machine);
                   1687:     qemu_register_machine(&sbook_machine);
                   1688:     qemu_register_machine(&ss1000_machine);
                   1689:     qemu_register_machine(&ss2000_machine);
                   1690:     qemu_register_machine(&ss2_machine);
                   1691: }
                   1692: 
                   1693: machine_init(ss2_machine_init);

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.