Statistics
| Branch: | Revision:

root / hw / sun4m.c @ 746d6de7

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