Statistics
| Branch: | Revision:

root / hw / sun4m.c @ e7151f83

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