Statistics
| Branch: | Revision:

root / hw / sun4m.c @ 1a14026e

History | View | Annotate | Download (51.5 kB)

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