Statistics
| Branch: | Revision:

root / hw / sun4m.c @ 02eb84d0

History | View | Annotate | Download (52.9 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 9d07d757 Paul Brook
#include "sysbus.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 001faf32 Blue Swirl
#define DPRINTF(fmt, ...)                                       \
72 001faf32 Blue Swirl
    do { printf("CPUIRQ: " fmt , ## __VA_ARGS__); } while (0)
73 b3a23197 blueswir1
#else
74 001faf32 Blue Swirl
#define DPRINTF(fmt, ...)
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 9d07d757 Paul Brook
static void lance_init(NICInfo *nd, target_phys_addr_t leaddr,
368 9d07d757 Paul Brook
                       void *dma_opaque, qemu_irq irq, qemu_irq *reset)
369 9d07d757 Paul Brook
{
370 9d07d757 Paul Brook
    DeviceState *dev;
371 9d07d757 Paul Brook
    SysBusDevice *s;
372 9d07d757 Paul Brook
373 9d07d757 Paul Brook
    qemu_check_nic_model(&nd_table[0], "lance");
374 9d07d757 Paul Brook
375 9d07d757 Paul Brook
    dev = qdev_create(NULL, "lance");
376 9d07d757 Paul Brook
    qdev_set_netdev(dev, nd);
377 9d07d757 Paul Brook
    qdev_set_prop_ptr(dev, "dma", dma_opaque);
378 9d07d757 Paul Brook
    qdev_init(dev);
379 9d07d757 Paul Brook
    s = sysbus_from_qdev(dev);
380 9d07d757 Paul Brook
    sysbus_mmio_map(s, 0, leaddr);
381 9d07d757 Paul Brook
    sysbus_connect_irq(s, 0, irq);
382 067a3ddc Paul Brook
    *reset = qdev_get_gpio_in(dev, 0);
383 9d07d757 Paul Brook
}
384 9d07d757 Paul Brook
385 8137cde8 blueswir1
static void sun4m_hw_init(const struct sun4m_hwdef *hwdef, ram_addr_t RAM_size,
386 3ebf5aaf blueswir1
                          const char *boot_device,
387 3023f332 aliguori
                          const char *kernel_filename,
388 3ebf5aaf blueswir1
                          const char *kernel_cmdline,
389 3ebf5aaf blueswir1
                          const char *initrd_filename, const char *cpu_model)
390 36cd9210 blueswir1
391 420557e8 bellard
{
392 ba3c64fb bellard
    CPUState *env, *envs[MAX_CPUS];
393 713c45fa bellard
    unsigned int i;
394 cfb9de9c Paul Brook
    void *iommu, *espdma, *ledma, *nvram;
395 b3a23197 blueswir1
    qemu_irq *cpu_irqs[MAX_CPUS], *slavio_irq, *slavio_cpu_irq,
396 d7edfd27 blueswir1
        *espdma_irq, *ledma_irq;
397 2d069bab blueswir1
    qemu_irq *esp_reset, *le_reset;
398 2be17ebd blueswir1
    qemu_irq *fdc_tc;
399 6d0c293d blueswir1
    qemu_irq *cpu_halt;
400 dc828ca1 pbrook
    ram_addr_t ram_offset, prom_offset, idreg_offset;
401 5c6602c5 blueswir1
    unsigned long kernel_size;
402 3ebf5aaf blueswir1
    int ret;
403 5cea8590 Paul Brook
    char *filename;
404 e4bcb14c ths
    BlockDriverState *fd[MAX_FD];
405 22548760 blueswir1
    int drive_index;
406 3cce6243 blueswir1
    void *fw_cfg;
407 420557e8 bellard
408 ba3c64fb bellard
    /* init CPUs */
409 3ebf5aaf blueswir1
    if (!cpu_model)
410 3ebf5aaf blueswir1
        cpu_model = hwdef->default_cpu_model;
411 b3a23197 blueswir1
412 ba3c64fb bellard
    for(i = 0; i < smp_cpus; i++) {
413 aaed909a bellard
        env = cpu_init(cpu_model);
414 aaed909a bellard
        if (!env) {
415 8e82c6a8 blueswir1
            fprintf(stderr, "qemu: Unable to find Sparc CPU definition\n");
416 aaed909a bellard
            exit(1);
417 aaed909a bellard
        }
418 aaed909a bellard
        cpu_sparc_set_id(env, i);
419 ba3c64fb bellard
        envs[i] = env;
420 3d29fbef blueswir1
        if (i == 0) {
421 8217606e Jan Kiszka
            qemu_register_reset(main_cpu_reset, 0, env);
422 3d29fbef blueswir1
        } else {
423 8217606e Jan Kiszka
            qemu_register_reset(secondary_cpu_reset, 0, env);
424 ba3c64fb bellard
            env->halted = 1;
425 3d29fbef blueswir1
        }
426 b3a23197 blueswir1
        cpu_irqs[i] = qemu_allocate_irqs(cpu_set_irq, envs[i], MAX_PILS);
427 3ebf5aaf blueswir1
        env->prom_addr = hwdef->slavio_base;
428 ba3c64fb bellard
    }
429 b3a23197 blueswir1
430 b3a23197 blueswir1
    for (i = smp_cpus; i < MAX_CPUS; i++)
431 b3a23197 blueswir1
        cpu_irqs[i] = qemu_allocate_irqs(dummy_cpu_set_irq, NULL, MAX_PILS);
432 b3a23197 blueswir1
433 3ebf5aaf blueswir1
434 420557e8 bellard
    /* allocate RAM */
435 3ebf5aaf blueswir1
    if ((uint64_t)RAM_size > hwdef->max_mem) {
436 77f193da blueswir1
        fprintf(stderr,
437 77f193da blueswir1
                "qemu: Too much memory for this machine: %d, maximum %d\n",
438 6ef05b95 blueswir1
                (unsigned int)(RAM_size / (1024 * 1024)),
439 3ebf5aaf blueswir1
                (unsigned int)(hwdef->max_mem / (1024 * 1024)));
440 3ebf5aaf blueswir1
        exit(1);
441 3ebf5aaf blueswir1
    }
442 5c6602c5 blueswir1
    ram_offset = qemu_ram_alloc(RAM_size);
443 5c6602c5 blueswir1
    cpu_register_physical_memory(0, RAM_size, ram_offset);
444 420557e8 bellard
445 3ebf5aaf blueswir1
    /* load boot prom */
446 5c6602c5 blueswir1
    prom_offset = qemu_ram_alloc(PROM_SIZE_MAX);
447 3ebf5aaf blueswir1
    cpu_register_physical_memory(hwdef->slavio_base,
448 3ebf5aaf blueswir1
                                 (PROM_SIZE_MAX + TARGET_PAGE_SIZE - 1) &
449 3ebf5aaf blueswir1
                                 TARGET_PAGE_MASK,
450 3ebf5aaf blueswir1
                                 prom_offset | IO_MEM_ROM);
451 3ebf5aaf blueswir1
452 3ebf5aaf blueswir1
    if (bios_name == NULL)
453 3ebf5aaf blueswir1
        bios_name = PROM_FILENAME;
454 5cea8590 Paul Brook
    filename = qemu_find_file(QEMU_FILE_TYPE_BIOS, bios_name);
455 5cea8590 Paul Brook
    if (filename) {
456 5cea8590 Paul Brook
        ret = load_elf(filename, hwdef->slavio_base - PROM_VADDR,
457 5cea8590 Paul Brook
                       NULL, NULL, NULL);
458 5cea8590 Paul Brook
        if (ret < 0 || ret > PROM_SIZE_MAX)
459 5cea8590 Paul Brook
            ret = load_image_targphys(filename, hwdef->slavio_base,
460 5cea8590 Paul Brook
                                      PROM_SIZE_MAX);
461 5cea8590 Paul Brook
        qemu_free(filename);
462 5cea8590 Paul Brook
    } else {
463 5cea8590 Paul Brook
        ret = -1;
464 5cea8590 Paul Brook
    }
465 3ebf5aaf blueswir1
    if (ret < 0 || ret > PROM_SIZE_MAX) {
466 3ebf5aaf blueswir1
        fprintf(stderr, "qemu: could not load prom '%s'\n",
467 5cea8590 Paul Brook
                bios_name);
468 3ebf5aaf blueswir1
        exit(1);
469 3ebf5aaf blueswir1
    }
470 3ebf5aaf blueswir1
471 3ebf5aaf blueswir1
    /* set up devices */
472 36cd9210 blueswir1
    slavio_intctl = slavio_intctl_init(hwdef->intctl_base,
473 5dcb6b91 blueswir1
                                       hwdef->intctl_base + 0x10000ULL,
474 d537cf6c pbrook
                                       &hwdef->intbit_to_level[0],
475 d7edfd27 blueswir1
                                       &slavio_irq, &slavio_cpu_irq,
476 b3a23197 blueswir1
                                       cpu_irqs,
477 d7edfd27 blueswir1
                                       hwdef->clock_irq);
478 b3a23197 blueswir1
479 fe096129 blueswir1
    if (hwdef->idreg_base) {
480 293f78bc blueswir1
        static const uint8_t idreg_data[] = { 0xfe, 0x81, 0x01, 0x03 };
481 4c2485de blueswir1
482 5c6602c5 blueswir1
        idreg_offset = qemu_ram_alloc(sizeof(idreg_data));
483 293f78bc blueswir1
        cpu_register_physical_memory(hwdef->idreg_base, sizeof(idreg_data),
484 5c6602c5 blueswir1
                                     idreg_offset | IO_MEM_ROM);
485 293f78bc blueswir1
        cpu_physical_memory_write_rom(hwdef->idreg_base, idreg_data,
486 293f78bc blueswir1
                                      sizeof(idreg_data));
487 4c2485de blueswir1
    }
488 4c2485de blueswir1
489 ff403da6 blueswir1
    iommu = iommu_init(hwdef->iommu_base, hwdef->iommu_version,
490 ff403da6 blueswir1
                       slavio_irq[hwdef->me_irq]);
491 ff403da6 blueswir1
492 5aca8c3b blueswir1
    espdma = sparc32_dma_init(hwdef->dma_base, slavio_irq[hwdef->esp_irq],
493 2d069bab blueswir1
                              iommu, &espdma_irq, &esp_reset);
494 2d069bab blueswir1
495 5aca8c3b blueswir1
    ledma = sparc32_dma_init(hwdef->dma_base + 16ULL,
496 2d069bab blueswir1
                             slavio_irq[hwdef->le_irq], iommu, &ledma_irq,
497 2d069bab blueswir1
                             &le_reset);
498 ba3c64fb bellard
499 eee0b836 blueswir1
    if (graphic_depth != 8 && graphic_depth != 24) {
500 eee0b836 blueswir1
        fprintf(stderr, "qemu: Unsupported depth: %d\n", graphic_depth);
501 eee0b836 blueswir1
        exit (1);
502 eee0b836 blueswir1
    }
503 dc828ca1 pbrook
    tcx_init(hwdef->tcx_base, hwdef->vram_size, graphic_width, graphic_height,
504 dc828ca1 pbrook
             graphic_depth);
505 dbe06e18 blueswir1
506 0ae18cee aliguori
    lance_init(&nd_table[0], hwdef->le_base, ledma, *ledma_irq, le_reset);
507 dbe06e18 blueswir1
508 d537cf6c pbrook
    nvram = m48t59_init(slavio_irq[0], hwdef->nvram_base, 0,
509 d537cf6c pbrook
                        hwdef->nvram_size, 8);
510 81732d19 blueswir1
511 81732d19 blueswir1
    slavio_timer_init_all(hwdef->counter_base, slavio_irq[hwdef->clock1_irq],
512 19f8e5dd blueswir1
                          slavio_cpu_irq, smp_cpus);
513 81732d19 blueswir1
514 577390ff blueswir1
    slavio_serial_ms_kbd_init(hwdef->ms_kb_base, slavio_irq[hwdef->ms_kb_irq],
515 993fbfdb Anthony Liguori
                              display_type == DT_NOGRAPHIC, ESCC_CLOCK, 1);
516 b81b3b10 bellard
    // Slavio TTYA (base+4, Linux ttyS0) is the first Qemu serial device
517 b81b3b10 bellard
    // Slavio TTYB (base+0, Linux ttyS1) is the second Qemu serial device
518 aeeb69c7 aurel32
    escc_init(hwdef->serial_base, slavio_irq[hwdef->ser_irq], slavio_irq[hwdef->ser_irq],
519 aeeb69c7 aurel32
              serial_hds[0], serial_hds[1], ESCC_CLOCK, 1);
520 741402f9 blueswir1
521 6d0c293d blueswir1
    cpu_halt = qemu_allocate_irqs(cpu_halt_signal, NULL, 1);
522 2be17ebd blueswir1
    slavio_misc = slavio_misc_init(hwdef->slavio_base, hwdef->apc_base,
523 2be17ebd blueswir1
                                   hwdef->aux1_base, hwdef->aux2_base,
524 6d0c293d blueswir1
                                   slavio_irq[hwdef->me_irq], cpu_halt[0],
525 2be17ebd blueswir1
                                   &fdc_tc);
526 2be17ebd blueswir1
527 fe096129 blueswir1
    if (hwdef->fd_base) {
528 e4bcb14c ths
        /* there is zero or one floppy drive */
529 309e60bd blueswir1
        memset(fd, 0, sizeof(fd));
530 22548760 blueswir1
        drive_index = drive_get_index(IF_FLOPPY, 0, 0);
531 22548760 blueswir1
        if (drive_index != -1)
532 22548760 blueswir1
            fd[0] = drives_table[drive_index].bdrv;
533 2d069bab blueswir1
534 2be17ebd blueswir1
        sun4m_fdctrl_init(slavio_irq[hwdef->fd_irq], hwdef->fd_base, fd,
535 2be17ebd blueswir1
                          fdc_tc);
536 e4bcb14c ths
    }
537 e4bcb14c ths
538 e4bcb14c ths
    if (drive_get_max_bus(IF_SCSI) > 0) {
539 e4bcb14c ths
        fprintf(stderr, "qemu: too many SCSI bus\n");
540 e4bcb14c ths
        exit(1);
541 e4bcb14c ths
    }
542 e4bcb14c ths
543 cfb9de9c Paul Brook
    esp_init(hwdef->esp_base, 2,
544 cfb9de9c Paul Brook
             espdma_memory_read, espdma_memory_write,
545 cfb9de9c Paul Brook
             espdma, *espdma_irq, esp_reset);
546 f1587550 ths
547 fe096129 blueswir1
    if (hwdef->cs_base)
548 803b3c7b blueswir1
        cs_init(hwdef->cs_base, hwdef->cs_irq, slavio_intctl);
549 b3ceef24 blueswir1
550 293f78bc blueswir1
    kernel_size = sun4m_load_kernel(kernel_filename, initrd_filename,
551 293f78bc blueswir1
                                    RAM_size);
552 36cd9210 blueswir1
553 36cd9210 blueswir1
    nvram_init(nvram, (uint8_t *)&nd_table[0].macaddr, kernel_cmdline,
554 b3ceef24 blueswir1
               boot_device, RAM_size, kernel_size, graphic_width,
555 905fdcb5 blueswir1
               graphic_height, graphic_depth, hwdef->nvram_machine_id,
556 905fdcb5 blueswir1
               "Sun4m");
557 7eb0c8e8 blueswir1
558 fe096129 blueswir1
    if (hwdef->ecc_base)
559 e42c20b4 blueswir1
        ecc_init(hwdef->ecc_base, slavio_irq[hwdef->ecc_irq],
560 e42c20b4 blueswir1
                 hwdef->ecc_version);
561 3cce6243 blueswir1
562 3cce6243 blueswir1
    fw_cfg = fw_cfg_init(0, 0, CFG_ADDR, CFG_ADDR + 2);
563 3cce6243 blueswir1
    fw_cfg_add_i32(fw_cfg, FW_CFG_ID, 1);
564 905fdcb5 blueswir1
    fw_cfg_add_i64(fw_cfg, FW_CFG_RAM_SIZE, (uint64_t)ram_size);
565 905fdcb5 blueswir1
    fw_cfg_add_i16(fw_cfg, FW_CFG_MACHINE_ID, hwdef->machine_id);
566 fbfcf955 blueswir1
    fw_cfg_add_i16(fw_cfg, FW_CFG_SUN4M_DEPTH, graphic_depth);
567 513f789f blueswir1
    fw_cfg_add_i32(fw_cfg, FW_CFG_KERNEL_ADDR, KERNEL_LOAD_ADDR);
568 513f789f blueswir1
    fw_cfg_add_i32(fw_cfg, FW_CFG_KERNEL_SIZE, kernel_size);
569 513f789f blueswir1
    if (kernel_cmdline) {
570 513f789f blueswir1
        fw_cfg_add_i32(fw_cfg, FW_CFG_KERNEL_CMDLINE, CMDLINE_ADDR);
571 513f789f blueswir1
        pstrcpy_targphys(CMDLINE_ADDR, TARGET_PAGE_SIZE, kernel_cmdline);
572 513f789f blueswir1
    } else {
573 513f789f blueswir1
        fw_cfg_add_i32(fw_cfg, FW_CFG_KERNEL_CMDLINE, 0);
574 513f789f blueswir1
    }
575 513f789f blueswir1
    fw_cfg_add_i32(fw_cfg, FW_CFG_INITRD_ADDR, INITRD_LOAD_ADDR);
576 513f789f blueswir1
    fw_cfg_add_i32(fw_cfg, FW_CFG_INITRD_SIZE, 0); // not used
577 513f789f blueswir1
    fw_cfg_add_i16(fw_cfg, FW_CFG_BOOT_DEVICE, boot_device[0]);
578 513f789f blueswir1
    qemu_register_boot_set(fw_cfg_boot_set, fw_cfg);
579 36cd9210 blueswir1
}
580 36cd9210 blueswir1
581 905fdcb5 blueswir1
enum {
582 905fdcb5 blueswir1
    ss2_id = 0,
583 905fdcb5 blueswir1
    ss5_id = 32,
584 905fdcb5 blueswir1
    vger_id,
585 905fdcb5 blueswir1
    lx_id,
586 905fdcb5 blueswir1
    ss4_id,
587 905fdcb5 blueswir1
    scls_id,
588 905fdcb5 blueswir1
    sbook_id,
589 905fdcb5 blueswir1
    ss10_id = 64,
590 905fdcb5 blueswir1
    ss20_id,
591 905fdcb5 blueswir1
    ss600mp_id,
592 905fdcb5 blueswir1
    ss1000_id = 96,
593 905fdcb5 blueswir1
    ss2000_id,
594 905fdcb5 blueswir1
};
595 905fdcb5 blueswir1
596 8137cde8 blueswir1
static const struct sun4m_hwdef sun4m_hwdefs[] = {
597 36cd9210 blueswir1
    /* SS-5 */
598 36cd9210 blueswir1
    {
599 36cd9210 blueswir1
        .iommu_base   = 0x10000000,
600 36cd9210 blueswir1
        .tcx_base     = 0x50000000,
601 36cd9210 blueswir1
        .cs_base      = 0x6c000000,
602 384ccb5d blueswir1
        .slavio_base  = 0x70000000,
603 36cd9210 blueswir1
        .ms_kb_base   = 0x71000000,
604 36cd9210 blueswir1
        .serial_base  = 0x71100000,
605 36cd9210 blueswir1
        .nvram_base   = 0x71200000,
606 36cd9210 blueswir1
        .fd_base      = 0x71400000,
607 36cd9210 blueswir1
        .counter_base = 0x71d00000,
608 36cd9210 blueswir1
        .intctl_base  = 0x71e00000,
609 4c2485de blueswir1
        .idreg_base   = 0x78000000,
610 36cd9210 blueswir1
        .dma_base     = 0x78400000,
611 36cd9210 blueswir1
        .esp_base     = 0x78800000,
612 36cd9210 blueswir1
        .le_base      = 0x78c00000,
613 127fc407 blueswir1
        .apc_base     = 0x6a000000,
614 0019ad53 blueswir1
        .aux1_base    = 0x71900000,
615 0019ad53 blueswir1
        .aux2_base    = 0x71910000,
616 36cd9210 blueswir1
        .vram_size    = 0x00100000,
617 36cd9210 blueswir1
        .nvram_size   = 0x2000,
618 36cd9210 blueswir1
        .esp_irq = 18,
619 36cd9210 blueswir1
        .le_irq = 16,
620 e3a79bca blueswir1
        .clock_irq = 7,
621 36cd9210 blueswir1
        .clock1_irq = 19,
622 36cd9210 blueswir1
        .ms_kb_irq = 14,
623 36cd9210 blueswir1
        .ser_irq = 15,
624 36cd9210 blueswir1
        .fd_irq = 22,
625 36cd9210 blueswir1
        .me_irq = 30,
626 36cd9210 blueswir1
        .cs_irq = 5,
627 905fdcb5 blueswir1
        .nvram_machine_id = 0x80,
628 905fdcb5 blueswir1
        .machine_id = ss5_id,
629 cf3102ac blueswir1
        .iommu_version = 0x05000000,
630 e0353fe2 blueswir1
        .intbit_to_level = {
631 f930d07e blueswir1
            2, 3, 5, 7, 9, 11, 0, 14,   3, 5, 7, 9, 11, 13, 12, 12,
632 f930d07e blueswir1
            6, 0, 4, 10, 8, 0, 11, 0,   0, 0, 0, 0, 15, 0, 15, 0,
633 e0353fe2 blueswir1
        },
634 3ebf5aaf blueswir1
        .max_mem = 0x10000000,
635 3ebf5aaf blueswir1
        .default_cpu_model = "Fujitsu MB86904",
636 e0353fe2 blueswir1
    },
637 e0353fe2 blueswir1
    /* SS-10 */
638 e0353fe2 blueswir1
    {
639 5dcb6b91 blueswir1
        .iommu_base   = 0xfe0000000ULL,
640 5dcb6b91 blueswir1
        .tcx_base     = 0xe20000000ULL,
641 5dcb6b91 blueswir1
        .slavio_base  = 0xff0000000ULL,
642 5dcb6b91 blueswir1
        .ms_kb_base   = 0xff1000000ULL,
643 5dcb6b91 blueswir1
        .serial_base  = 0xff1100000ULL,
644 5dcb6b91 blueswir1
        .nvram_base   = 0xff1200000ULL,
645 5dcb6b91 blueswir1
        .fd_base      = 0xff1700000ULL,
646 5dcb6b91 blueswir1
        .counter_base = 0xff1300000ULL,
647 5dcb6b91 blueswir1
        .intctl_base  = 0xff1400000ULL,
648 4c2485de blueswir1
        .idreg_base   = 0xef0000000ULL,
649 5dcb6b91 blueswir1
        .dma_base     = 0xef0400000ULL,
650 5dcb6b91 blueswir1
        .esp_base     = 0xef0800000ULL,
651 5dcb6b91 blueswir1
        .le_base      = 0xef0c00000ULL,
652 0019ad53 blueswir1
        .apc_base     = 0xefa000000ULL, // XXX should not exist
653 127fc407 blueswir1
        .aux1_base    = 0xff1800000ULL,
654 127fc407 blueswir1
        .aux2_base    = 0xff1a01000ULL,
655 7eb0c8e8 blueswir1
        .ecc_base     = 0xf00000000ULL,
656 7eb0c8e8 blueswir1
        .ecc_version  = 0x10000000, // version 0, implementation 1
657 e0353fe2 blueswir1
        .vram_size    = 0x00100000,
658 e0353fe2 blueswir1
        .nvram_size   = 0x2000,
659 e0353fe2 blueswir1
        .esp_irq = 18,
660 e0353fe2 blueswir1
        .le_irq = 16,
661 e3a79bca blueswir1
        .clock_irq = 7,
662 e0353fe2 blueswir1
        .clock1_irq = 19,
663 e0353fe2 blueswir1
        .ms_kb_irq = 14,
664 e0353fe2 blueswir1
        .ser_irq = 15,
665 e0353fe2 blueswir1
        .fd_irq = 22,
666 e0353fe2 blueswir1
        .me_irq = 30,
667 e42c20b4 blueswir1
        .ecc_irq = 28,
668 905fdcb5 blueswir1
        .nvram_machine_id = 0x72,
669 905fdcb5 blueswir1
        .machine_id = ss10_id,
670 7fbfb139 blueswir1
        .iommu_version = 0x03000000,
671 e0353fe2 blueswir1
        .intbit_to_level = {
672 f930d07e blueswir1
            2, 3, 5, 7, 9, 11, 0, 14,   3, 5, 7, 9, 11, 13, 12, 12,
673 f930d07e blueswir1
            6, 0, 4, 10, 8, 0, 11, 0,   0, 0, 0, 0, 15, 0, 15, 0,
674 e0353fe2 blueswir1
        },
675 6ef05b95 blueswir1
        .max_mem = 0xf00000000ULL,
676 3ebf5aaf blueswir1
        .default_cpu_model = "TI SuperSparc II",
677 36cd9210 blueswir1
    },
678 6a3b9cc9 blueswir1
    /* SS-600MP */
679 6a3b9cc9 blueswir1
    {
680 6a3b9cc9 blueswir1
        .iommu_base   = 0xfe0000000ULL,
681 6a3b9cc9 blueswir1
        .tcx_base     = 0xe20000000ULL,
682 6a3b9cc9 blueswir1
        .slavio_base  = 0xff0000000ULL,
683 6a3b9cc9 blueswir1
        .ms_kb_base   = 0xff1000000ULL,
684 6a3b9cc9 blueswir1
        .serial_base  = 0xff1100000ULL,
685 6a3b9cc9 blueswir1
        .nvram_base   = 0xff1200000ULL,
686 6a3b9cc9 blueswir1
        .counter_base = 0xff1300000ULL,
687 6a3b9cc9 blueswir1
        .intctl_base  = 0xff1400000ULL,
688 6a3b9cc9 blueswir1
        .dma_base     = 0xef0081000ULL,
689 6a3b9cc9 blueswir1
        .esp_base     = 0xef0080000ULL,
690 6a3b9cc9 blueswir1
        .le_base      = 0xef0060000ULL,
691 0019ad53 blueswir1
        .apc_base     = 0xefa000000ULL, // XXX should not exist
692 127fc407 blueswir1
        .aux1_base    = 0xff1800000ULL,
693 127fc407 blueswir1
        .aux2_base    = 0xff1a01000ULL, // XXX should not exist
694 7eb0c8e8 blueswir1
        .ecc_base     = 0xf00000000ULL,
695 7eb0c8e8 blueswir1
        .ecc_version  = 0x00000000, // version 0, implementation 0
696 6a3b9cc9 blueswir1
        .vram_size    = 0x00100000,
697 6a3b9cc9 blueswir1
        .nvram_size   = 0x2000,
698 6a3b9cc9 blueswir1
        .esp_irq = 18,
699 6a3b9cc9 blueswir1
        .le_irq = 16,
700 e3a79bca blueswir1
        .clock_irq = 7,
701 6a3b9cc9 blueswir1
        .clock1_irq = 19,
702 6a3b9cc9 blueswir1
        .ms_kb_irq = 14,
703 6a3b9cc9 blueswir1
        .ser_irq = 15,
704 6a3b9cc9 blueswir1
        .fd_irq = 22,
705 6a3b9cc9 blueswir1
        .me_irq = 30,
706 e42c20b4 blueswir1
        .ecc_irq = 28,
707 905fdcb5 blueswir1
        .nvram_machine_id = 0x71,
708 905fdcb5 blueswir1
        .machine_id = ss600mp_id,
709 7fbfb139 blueswir1
        .iommu_version = 0x01000000,
710 6a3b9cc9 blueswir1
        .intbit_to_level = {
711 6a3b9cc9 blueswir1
            2, 3, 5, 7, 9, 11, 0, 14,   3, 5, 7, 9, 11, 13, 12, 12,
712 6a3b9cc9 blueswir1
            6, 0, 4, 10, 8, 0, 11, 0,   0, 0, 0, 0, 15, 0, 15, 0,
713 6a3b9cc9 blueswir1
        },
714 6ef05b95 blueswir1
        .max_mem = 0xf00000000ULL,
715 3ebf5aaf blueswir1
        .default_cpu_model = "TI SuperSparc II",
716 6a3b9cc9 blueswir1
    },
717 ae40972f blueswir1
    /* SS-20 */
718 ae40972f blueswir1
    {
719 ae40972f blueswir1
        .iommu_base   = 0xfe0000000ULL,
720 ae40972f blueswir1
        .tcx_base     = 0xe20000000ULL,
721 ae40972f blueswir1
        .slavio_base  = 0xff0000000ULL,
722 ae40972f blueswir1
        .ms_kb_base   = 0xff1000000ULL,
723 ae40972f blueswir1
        .serial_base  = 0xff1100000ULL,
724 ae40972f blueswir1
        .nvram_base   = 0xff1200000ULL,
725 ae40972f blueswir1
        .fd_base      = 0xff1700000ULL,
726 ae40972f blueswir1
        .counter_base = 0xff1300000ULL,
727 ae40972f blueswir1
        .intctl_base  = 0xff1400000ULL,
728 4c2485de blueswir1
        .idreg_base   = 0xef0000000ULL,
729 ae40972f blueswir1
        .dma_base     = 0xef0400000ULL,
730 ae40972f blueswir1
        .esp_base     = 0xef0800000ULL,
731 ae40972f blueswir1
        .le_base      = 0xef0c00000ULL,
732 0019ad53 blueswir1
        .apc_base     = 0xefa000000ULL, // XXX should not exist
733 577d8dd4 blueswir1
        .aux1_base    = 0xff1800000ULL,
734 577d8dd4 blueswir1
        .aux2_base    = 0xff1a01000ULL,
735 ae40972f blueswir1
        .ecc_base     = 0xf00000000ULL,
736 ae40972f blueswir1
        .ecc_version  = 0x20000000, // version 0, implementation 2
737 ae40972f blueswir1
        .vram_size    = 0x00100000,
738 ae40972f blueswir1
        .nvram_size   = 0x2000,
739 ae40972f blueswir1
        .esp_irq = 18,
740 ae40972f blueswir1
        .le_irq = 16,
741 e3a79bca blueswir1
        .clock_irq = 7,
742 ae40972f blueswir1
        .clock1_irq = 19,
743 ae40972f blueswir1
        .ms_kb_irq = 14,
744 ae40972f blueswir1
        .ser_irq = 15,
745 ae40972f blueswir1
        .fd_irq = 22,
746 ae40972f blueswir1
        .me_irq = 30,
747 e42c20b4 blueswir1
        .ecc_irq = 28,
748 905fdcb5 blueswir1
        .nvram_machine_id = 0x72,
749 905fdcb5 blueswir1
        .machine_id = ss20_id,
750 ae40972f blueswir1
        .iommu_version = 0x13000000,
751 ae40972f blueswir1
        .intbit_to_level = {
752 ae40972f blueswir1
            2, 3, 5, 7, 9, 11, 0, 14,   3, 5, 7, 9, 11, 13, 12, 12,
753 ae40972f blueswir1
            6, 0, 4, 10, 8, 0, 11, 0,   0, 0, 0, 0, 15, 0, 15, 0,
754 ae40972f blueswir1
        },
755 6ef05b95 blueswir1
        .max_mem = 0xf00000000ULL,
756 ae40972f blueswir1
        .default_cpu_model = "TI SuperSparc II",
757 ae40972f blueswir1
    },
758 a526a31c blueswir1
    /* Voyager */
759 a526a31c blueswir1
    {
760 a526a31c blueswir1
        .iommu_base   = 0x10000000,
761 a526a31c blueswir1
        .tcx_base     = 0x50000000,
762 a526a31c blueswir1
        .slavio_base  = 0x70000000,
763 a526a31c blueswir1
        .ms_kb_base   = 0x71000000,
764 a526a31c blueswir1
        .serial_base  = 0x71100000,
765 a526a31c blueswir1
        .nvram_base   = 0x71200000,
766 a526a31c blueswir1
        .fd_base      = 0x71400000,
767 a526a31c blueswir1
        .counter_base = 0x71d00000,
768 a526a31c blueswir1
        .intctl_base  = 0x71e00000,
769 a526a31c blueswir1
        .idreg_base   = 0x78000000,
770 a526a31c blueswir1
        .dma_base     = 0x78400000,
771 a526a31c blueswir1
        .esp_base     = 0x78800000,
772 a526a31c blueswir1
        .le_base      = 0x78c00000,
773 a526a31c blueswir1
        .apc_base     = 0x71300000, // pmc
774 a526a31c blueswir1
        .aux1_base    = 0x71900000,
775 a526a31c blueswir1
        .aux2_base    = 0x71910000,
776 a526a31c blueswir1
        .vram_size    = 0x00100000,
777 a526a31c blueswir1
        .nvram_size   = 0x2000,
778 a526a31c blueswir1
        .esp_irq = 18,
779 a526a31c blueswir1
        .le_irq = 16,
780 a526a31c blueswir1
        .clock_irq = 7,
781 a526a31c blueswir1
        .clock1_irq = 19,
782 a526a31c blueswir1
        .ms_kb_irq = 14,
783 a526a31c blueswir1
        .ser_irq = 15,
784 a526a31c blueswir1
        .fd_irq = 22,
785 a526a31c blueswir1
        .me_irq = 30,
786 905fdcb5 blueswir1
        .nvram_machine_id = 0x80,
787 905fdcb5 blueswir1
        .machine_id = vger_id,
788 a526a31c blueswir1
        .iommu_version = 0x05000000,
789 a526a31c blueswir1
        .intbit_to_level = {
790 a526a31c blueswir1
            2, 3, 5, 7, 9, 11, 0, 14,   3, 5, 7, 9, 11, 13, 12, 12,
791 a526a31c blueswir1
            6, 0, 4, 10, 8, 0, 11, 0,   0, 0, 0, 0, 15, 0, 15, 0,
792 a526a31c blueswir1
        },
793 a526a31c blueswir1
        .max_mem = 0x10000000,
794 a526a31c blueswir1
        .default_cpu_model = "Fujitsu MB86904",
795 a526a31c blueswir1
    },
796 a526a31c blueswir1
    /* LX */
797 a526a31c blueswir1
    {
798 a526a31c blueswir1
        .iommu_base   = 0x10000000,
799 a526a31c blueswir1
        .tcx_base     = 0x50000000,
800 a526a31c blueswir1
        .slavio_base  = 0x70000000,
801 a526a31c blueswir1
        .ms_kb_base   = 0x71000000,
802 a526a31c blueswir1
        .serial_base  = 0x71100000,
803 a526a31c blueswir1
        .nvram_base   = 0x71200000,
804 a526a31c blueswir1
        .fd_base      = 0x71400000,
805 a526a31c blueswir1
        .counter_base = 0x71d00000,
806 a526a31c blueswir1
        .intctl_base  = 0x71e00000,
807 a526a31c blueswir1
        .idreg_base   = 0x78000000,
808 a526a31c blueswir1
        .dma_base     = 0x78400000,
809 a526a31c blueswir1
        .esp_base     = 0x78800000,
810 a526a31c blueswir1
        .le_base      = 0x78c00000,
811 a526a31c blueswir1
        .aux1_base    = 0x71900000,
812 a526a31c blueswir1
        .aux2_base    = 0x71910000,
813 a526a31c blueswir1
        .vram_size    = 0x00100000,
814 a526a31c blueswir1
        .nvram_size   = 0x2000,
815 a526a31c blueswir1
        .esp_irq = 18,
816 a526a31c blueswir1
        .le_irq = 16,
817 a526a31c blueswir1
        .clock_irq = 7,
818 a526a31c blueswir1
        .clock1_irq = 19,
819 a526a31c blueswir1
        .ms_kb_irq = 14,
820 a526a31c blueswir1
        .ser_irq = 15,
821 a526a31c blueswir1
        .fd_irq = 22,
822 a526a31c blueswir1
        .me_irq = 30,
823 905fdcb5 blueswir1
        .nvram_machine_id = 0x80,
824 905fdcb5 blueswir1
        .machine_id = lx_id,
825 a526a31c blueswir1
        .iommu_version = 0x04000000,
826 a526a31c blueswir1
        .intbit_to_level = {
827 a526a31c blueswir1
            2, 3, 5, 7, 9, 11, 0, 14,   3, 5, 7, 9, 11, 13, 12, 12,
828 a526a31c blueswir1
            6, 0, 4, 10, 8, 0, 11, 0,   0, 0, 0, 0, 15, 0, 15, 0,
829 a526a31c blueswir1
        },
830 a526a31c blueswir1
        .max_mem = 0x10000000,
831 a526a31c blueswir1
        .default_cpu_model = "TI MicroSparc I",
832 a526a31c blueswir1
    },
833 a526a31c blueswir1
    /* SS-4 */
834 a526a31c blueswir1
    {
835 a526a31c blueswir1
        .iommu_base   = 0x10000000,
836 a526a31c blueswir1
        .tcx_base     = 0x50000000,
837 a526a31c blueswir1
        .cs_base      = 0x6c000000,
838 a526a31c blueswir1
        .slavio_base  = 0x70000000,
839 a526a31c blueswir1
        .ms_kb_base   = 0x71000000,
840 a526a31c blueswir1
        .serial_base  = 0x71100000,
841 a526a31c blueswir1
        .nvram_base   = 0x71200000,
842 a526a31c blueswir1
        .fd_base      = 0x71400000,
843 a526a31c blueswir1
        .counter_base = 0x71d00000,
844 a526a31c blueswir1
        .intctl_base  = 0x71e00000,
845 a526a31c blueswir1
        .idreg_base   = 0x78000000,
846 a526a31c blueswir1
        .dma_base     = 0x78400000,
847 a526a31c blueswir1
        .esp_base     = 0x78800000,
848 a526a31c blueswir1
        .le_base      = 0x78c00000,
849 a526a31c blueswir1
        .apc_base     = 0x6a000000,
850 a526a31c blueswir1
        .aux1_base    = 0x71900000,
851 a526a31c blueswir1
        .aux2_base    = 0x71910000,
852 a526a31c blueswir1
        .vram_size    = 0x00100000,
853 a526a31c blueswir1
        .nvram_size   = 0x2000,
854 a526a31c blueswir1
        .esp_irq = 18,
855 a526a31c blueswir1
        .le_irq = 16,
856 a526a31c blueswir1
        .clock_irq = 7,
857 a526a31c blueswir1
        .clock1_irq = 19,
858 a526a31c blueswir1
        .ms_kb_irq = 14,
859 a526a31c blueswir1
        .ser_irq = 15,
860 a526a31c blueswir1
        .fd_irq = 22,
861 a526a31c blueswir1
        .me_irq = 30,
862 a526a31c blueswir1
        .cs_irq = 5,
863 905fdcb5 blueswir1
        .nvram_machine_id = 0x80,
864 905fdcb5 blueswir1
        .machine_id = ss4_id,
865 a526a31c blueswir1
        .iommu_version = 0x05000000,
866 a526a31c blueswir1
        .intbit_to_level = {
867 a526a31c blueswir1
            2, 3, 5, 7, 9, 11, 0, 14,   3, 5, 7, 9, 11, 13, 12, 12,
868 a526a31c blueswir1
            6, 0, 4, 10, 8, 0, 11, 0,   0, 0, 0, 0, 15, 0, 15, 0,
869 a526a31c blueswir1
        },
870 a526a31c blueswir1
        .max_mem = 0x10000000,
871 a526a31c blueswir1
        .default_cpu_model = "Fujitsu MB86904",
872 a526a31c blueswir1
    },
873 a526a31c blueswir1
    /* SPARCClassic */
874 a526a31c blueswir1
    {
875 a526a31c blueswir1
        .iommu_base   = 0x10000000,
876 a526a31c blueswir1
        .tcx_base     = 0x50000000,
877 a526a31c blueswir1
        .slavio_base  = 0x70000000,
878 a526a31c blueswir1
        .ms_kb_base   = 0x71000000,
879 a526a31c blueswir1
        .serial_base  = 0x71100000,
880 a526a31c blueswir1
        .nvram_base   = 0x71200000,
881 a526a31c blueswir1
        .fd_base      = 0x71400000,
882 a526a31c blueswir1
        .counter_base = 0x71d00000,
883 a526a31c blueswir1
        .intctl_base  = 0x71e00000,
884 a526a31c blueswir1
        .idreg_base   = 0x78000000,
885 a526a31c blueswir1
        .dma_base     = 0x78400000,
886 a526a31c blueswir1
        .esp_base     = 0x78800000,
887 a526a31c blueswir1
        .le_base      = 0x78c00000,
888 a526a31c blueswir1
        .apc_base     = 0x6a000000,
889 a526a31c blueswir1
        .aux1_base    = 0x71900000,
890 a526a31c blueswir1
        .aux2_base    = 0x71910000,
891 a526a31c blueswir1
        .vram_size    = 0x00100000,
892 a526a31c blueswir1
        .nvram_size   = 0x2000,
893 a526a31c blueswir1
        .esp_irq = 18,
894 a526a31c blueswir1
        .le_irq = 16,
895 a526a31c blueswir1
        .clock_irq = 7,
896 a526a31c blueswir1
        .clock1_irq = 19,
897 a526a31c blueswir1
        .ms_kb_irq = 14,
898 a526a31c blueswir1
        .ser_irq = 15,
899 a526a31c blueswir1
        .fd_irq = 22,
900 a526a31c blueswir1
        .me_irq = 30,
901 905fdcb5 blueswir1
        .nvram_machine_id = 0x80,
902 905fdcb5 blueswir1
        .machine_id = scls_id,
903 a526a31c blueswir1
        .iommu_version = 0x05000000,
904 a526a31c blueswir1
        .intbit_to_level = {
905 a526a31c blueswir1
            2, 3, 5, 7, 9, 11, 0, 14,   3, 5, 7, 9, 11, 13, 12, 12,
906 a526a31c blueswir1
            6, 0, 4, 10, 8, 0, 11, 0,   0, 0, 0, 0, 15, 0, 15, 0,
907 a526a31c blueswir1
        },
908 a526a31c blueswir1
        .max_mem = 0x10000000,
909 a526a31c blueswir1
        .default_cpu_model = "TI MicroSparc I",
910 a526a31c blueswir1
    },
911 a526a31c blueswir1
    /* SPARCbook */
912 a526a31c blueswir1
    {
913 a526a31c blueswir1
        .iommu_base   = 0x10000000,
914 a526a31c blueswir1
        .tcx_base     = 0x50000000, // XXX
915 a526a31c blueswir1
        .slavio_base  = 0x70000000,
916 a526a31c blueswir1
        .ms_kb_base   = 0x71000000,
917 a526a31c blueswir1
        .serial_base  = 0x71100000,
918 a526a31c blueswir1
        .nvram_base   = 0x71200000,
919 a526a31c blueswir1
        .fd_base      = 0x71400000,
920 a526a31c blueswir1
        .counter_base = 0x71d00000,
921 a526a31c blueswir1
        .intctl_base  = 0x71e00000,
922 a526a31c blueswir1
        .idreg_base   = 0x78000000,
923 a526a31c blueswir1
        .dma_base     = 0x78400000,
924 a526a31c blueswir1
        .esp_base     = 0x78800000,
925 a526a31c blueswir1
        .le_base      = 0x78c00000,
926 a526a31c blueswir1
        .apc_base     = 0x6a000000,
927 a526a31c blueswir1
        .aux1_base    = 0x71900000,
928 a526a31c blueswir1
        .aux2_base    = 0x71910000,
929 a526a31c blueswir1
        .vram_size    = 0x00100000,
930 a526a31c blueswir1
        .nvram_size   = 0x2000,
931 a526a31c blueswir1
        .esp_irq = 18,
932 a526a31c blueswir1
        .le_irq = 16,
933 a526a31c blueswir1
        .clock_irq = 7,
934 a526a31c blueswir1
        .clock1_irq = 19,
935 a526a31c blueswir1
        .ms_kb_irq = 14,
936 a526a31c blueswir1
        .ser_irq = 15,
937 a526a31c blueswir1
        .fd_irq = 22,
938 a526a31c blueswir1
        .me_irq = 30,
939 905fdcb5 blueswir1
        .nvram_machine_id = 0x80,
940 905fdcb5 blueswir1
        .machine_id = sbook_id,
941 a526a31c blueswir1
        .iommu_version = 0x05000000,
942 a526a31c blueswir1
        .intbit_to_level = {
943 a526a31c blueswir1
            2, 3, 5, 7, 9, 11, 0, 14,   3, 5, 7, 9, 11, 13, 12, 12,
944 a526a31c blueswir1
            6, 0, 4, 10, 8, 0, 11, 0,   0, 0, 0, 0, 15, 0, 15, 0,
945 a526a31c blueswir1
        },
946 a526a31c blueswir1
        .max_mem = 0x10000000,
947 a526a31c blueswir1
        .default_cpu_model = "TI MicroSparc I",
948 a526a31c blueswir1
    },
949 36cd9210 blueswir1
};
950 36cd9210 blueswir1
951 36cd9210 blueswir1
/* SPARCstation 5 hardware initialisation */
952 fbe1b595 Paul Brook
static void ss5_init(ram_addr_t RAM_size,
953 3023f332 aliguori
                     const char *boot_device,
954 b881c2c6 blueswir1
                     const char *kernel_filename, const char *kernel_cmdline,
955 b881c2c6 blueswir1
                     const char *initrd_filename, const char *cpu_model)
956 36cd9210 blueswir1
{
957 3023f332 aliguori
    sun4m_hw_init(&sun4m_hwdefs[0], RAM_size, boot_device, kernel_filename,
958 3ebf5aaf blueswir1
                  kernel_cmdline, initrd_filename, cpu_model);
959 420557e8 bellard
}
960 c0e564d5 bellard
961 e0353fe2 blueswir1
/* SPARCstation 10 hardware initialisation */
962 fbe1b595 Paul Brook
static void ss10_init(ram_addr_t RAM_size,
963 3023f332 aliguori
                      const char *boot_device,
964 b881c2c6 blueswir1
                      const char *kernel_filename, const char *kernel_cmdline,
965 b881c2c6 blueswir1
                      const char *initrd_filename, const char *cpu_model)
966 e0353fe2 blueswir1
{
967 3023f332 aliguori
    sun4m_hw_init(&sun4m_hwdefs[1], RAM_size, boot_device, kernel_filename,
968 3ebf5aaf blueswir1
                  kernel_cmdline, initrd_filename, cpu_model);
969 e0353fe2 blueswir1
}
970 e0353fe2 blueswir1
971 6a3b9cc9 blueswir1
/* SPARCserver 600MP hardware initialisation */
972 fbe1b595 Paul Brook
static void ss600mp_init(ram_addr_t RAM_size,
973 3023f332 aliguori
                         const char *boot_device,
974 77f193da blueswir1
                         const char *kernel_filename,
975 77f193da blueswir1
                         const char *kernel_cmdline,
976 6a3b9cc9 blueswir1
                         const char *initrd_filename, const char *cpu_model)
977 6a3b9cc9 blueswir1
{
978 3023f332 aliguori
    sun4m_hw_init(&sun4m_hwdefs[2], RAM_size, boot_device, kernel_filename,
979 3ebf5aaf blueswir1
                  kernel_cmdline, initrd_filename, cpu_model);
980 6a3b9cc9 blueswir1
}
981 6a3b9cc9 blueswir1
982 ae40972f blueswir1
/* SPARCstation 20 hardware initialisation */
983 fbe1b595 Paul Brook
static void ss20_init(ram_addr_t RAM_size,
984 3023f332 aliguori
                      const char *boot_device,
985 ae40972f blueswir1
                      const char *kernel_filename, const char *kernel_cmdline,
986 ae40972f blueswir1
                      const char *initrd_filename, const char *cpu_model)
987 ae40972f blueswir1
{
988 3023f332 aliguori
    sun4m_hw_init(&sun4m_hwdefs[3], RAM_size, boot_device, kernel_filename,
989 ee76f82e blueswir1
                  kernel_cmdline, initrd_filename, cpu_model);
990 ee76f82e blueswir1
}
991 ee76f82e blueswir1
992 a526a31c blueswir1
/* SPARCstation Voyager hardware initialisation */
993 fbe1b595 Paul Brook
static void vger_init(ram_addr_t RAM_size,
994 3023f332 aliguori
                      const char *boot_device,
995 a526a31c blueswir1
                      const char *kernel_filename, const char *kernel_cmdline,
996 a526a31c blueswir1
                      const char *initrd_filename, const char *cpu_model)
997 a526a31c blueswir1
{
998 3023f332 aliguori
    sun4m_hw_init(&sun4m_hwdefs[4], RAM_size, boot_device, kernel_filename,
999 a526a31c blueswir1
                  kernel_cmdline, initrd_filename, cpu_model);
1000 a526a31c blueswir1
}
1001 a526a31c blueswir1
1002 a526a31c blueswir1
/* SPARCstation LX hardware initialisation */
1003 fbe1b595 Paul Brook
static void ss_lx_init(ram_addr_t RAM_size,
1004 3023f332 aliguori
                       const char *boot_device,
1005 a526a31c blueswir1
                       const char *kernel_filename, const char *kernel_cmdline,
1006 a526a31c blueswir1
                       const char *initrd_filename, const char *cpu_model)
1007 a526a31c blueswir1
{
1008 3023f332 aliguori
    sun4m_hw_init(&sun4m_hwdefs[5], RAM_size, boot_device, kernel_filename,
1009 a526a31c blueswir1
                  kernel_cmdline, initrd_filename, cpu_model);
1010 a526a31c blueswir1
}
1011 a526a31c blueswir1
1012 a526a31c blueswir1
/* SPARCstation 4 hardware initialisation */
1013 fbe1b595 Paul Brook
static void ss4_init(ram_addr_t RAM_size,
1014 3023f332 aliguori
                     const char *boot_device,
1015 a526a31c blueswir1
                     const char *kernel_filename, const char *kernel_cmdline,
1016 a526a31c blueswir1
                     const char *initrd_filename, const char *cpu_model)
1017 a526a31c blueswir1
{
1018 3023f332 aliguori
    sun4m_hw_init(&sun4m_hwdefs[6], RAM_size, boot_device, kernel_filename,
1019 a526a31c blueswir1
                  kernel_cmdline, initrd_filename, cpu_model);
1020 a526a31c blueswir1
}
1021 a526a31c blueswir1
1022 a526a31c blueswir1
/* SPARCClassic hardware initialisation */
1023 fbe1b595 Paul Brook
static void scls_init(ram_addr_t RAM_size,
1024 3023f332 aliguori
                      const char *boot_device,
1025 a526a31c blueswir1
                      const char *kernel_filename, const char *kernel_cmdline,
1026 a526a31c blueswir1
                      const char *initrd_filename, const char *cpu_model)
1027 a526a31c blueswir1
{
1028 3023f332 aliguori
    sun4m_hw_init(&sun4m_hwdefs[7], RAM_size, boot_device, kernel_filename,
1029 a526a31c blueswir1
                  kernel_cmdline, initrd_filename, cpu_model);
1030 a526a31c blueswir1
}
1031 a526a31c blueswir1
1032 a526a31c blueswir1
/* SPARCbook hardware initialisation */
1033 fbe1b595 Paul Brook
static void sbook_init(ram_addr_t RAM_size,
1034 3023f332 aliguori
                       const char *boot_device,
1035 a526a31c blueswir1
                       const char *kernel_filename, const char *kernel_cmdline,
1036 a526a31c blueswir1
                       const char *initrd_filename, const char *cpu_model)
1037 a526a31c blueswir1
{
1038 3023f332 aliguori
    sun4m_hw_init(&sun4m_hwdefs[8], RAM_size, boot_device, kernel_filename,
1039 a526a31c blueswir1
                  kernel_cmdline, initrd_filename, cpu_model);
1040 a526a31c blueswir1
}
1041 a526a31c blueswir1
1042 f80f9ec9 Anthony Liguori
static QEMUMachine ss5_machine = {
1043 66de733b blueswir1
    .name = "SS-5",
1044 66de733b blueswir1
    .desc = "Sun4m platform, SPARCstation 5",
1045 66de733b blueswir1
    .init = ss5_init,
1046 c9b1ae2c blueswir1
    .use_scsi = 1,
1047 0c257437 Anthony Liguori
    .is_default = 1,
1048 c0e564d5 bellard
};
1049 e0353fe2 blueswir1
1050 f80f9ec9 Anthony Liguori
static QEMUMachine ss10_machine = {
1051 66de733b blueswir1
    .name = "SS-10",
1052 66de733b blueswir1
    .desc = "Sun4m platform, SPARCstation 10",
1053 66de733b blueswir1
    .init = ss10_init,
1054 c9b1ae2c blueswir1
    .use_scsi = 1,
1055 1bcee014 blueswir1
    .max_cpus = 4,
1056 e0353fe2 blueswir1
};
1057 6a3b9cc9 blueswir1
1058 f80f9ec9 Anthony Liguori
static QEMUMachine ss600mp_machine = {
1059 66de733b blueswir1
    .name = "SS-600MP",
1060 66de733b blueswir1
    .desc = "Sun4m platform, SPARCserver 600MP",
1061 66de733b blueswir1
    .init = ss600mp_init,
1062 c9b1ae2c blueswir1
    .use_scsi = 1,
1063 1bcee014 blueswir1
    .max_cpus = 4,
1064 6a3b9cc9 blueswir1
};
1065 ae40972f blueswir1
1066 f80f9ec9 Anthony Liguori
static QEMUMachine ss20_machine = {
1067 66de733b blueswir1
    .name = "SS-20",
1068 66de733b blueswir1
    .desc = "Sun4m platform, SPARCstation 20",
1069 66de733b blueswir1
    .init = ss20_init,
1070 c9b1ae2c blueswir1
    .use_scsi = 1,
1071 1bcee014 blueswir1
    .max_cpus = 4,
1072 ae40972f blueswir1
};
1073 ae40972f blueswir1
1074 f80f9ec9 Anthony Liguori
static QEMUMachine voyager_machine = {
1075 66de733b blueswir1
    .name = "Voyager",
1076 66de733b blueswir1
    .desc = "Sun4m platform, SPARCstation Voyager",
1077 66de733b blueswir1
    .init = vger_init,
1078 c9b1ae2c blueswir1
    .use_scsi = 1,
1079 a526a31c blueswir1
};
1080 a526a31c blueswir1
1081 f80f9ec9 Anthony Liguori
static QEMUMachine ss_lx_machine = {
1082 66de733b blueswir1
    .name = "LX",
1083 66de733b blueswir1
    .desc = "Sun4m platform, SPARCstation LX",
1084 66de733b blueswir1
    .init = ss_lx_init,
1085 c9b1ae2c blueswir1
    .use_scsi = 1,
1086 a526a31c blueswir1
};
1087 a526a31c blueswir1
1088 f80f9ec9 Anthony Liguori
static QEMUMachine ss4_machine = {
1089 66de733b blueswir1
    .name = "SS-4",
1090 66de733b blueswir1
    .desc = "Sun4m platform, SPARCstation 4",
1091 66de733b blueswir1
    .init = ss4_init,
1092 c9b1ae2c blueswir1
    .use_scsi = 1,
1093 a526a31c blueswir1
};
1094 a526a31c blueswir1
1095 f80f9ec9 Anthony Liguori
static QEMUMachine scls_machine = {
1096 66de733b blueswir1
    .name = "SPARCClassic",
1097 66de733b blueswir1
    .desc = "Sun4m platform, SPARCClassic",
1098 66de733b blueswir1
    .init = scls_init,
1099 c9b1ae2c blueswir1
    .use_scsi = 1,
1100 a526a31c blueswir1
};
1101 a526a31c blueswir1
1102 f80f9ec9 Anthony Liguori
static QEMUMachine sbook_machine = {
1103 66de733b blueswir1
    .name = "SPARCbook",
1104 66de733b blueswir1
    .desc = "Sun4m platform, SPARCbook",
1105 66de733b blueswir1
    .init = sbook_init,
1106 c9b1ae2c blueswir1
    .use_scsi = 1,
1107 a526a31c blueswir1
};
1108 a526a31c blueswir1
1109 7d85892b blueswir1
static const struct sun4d_hwdef sun4d_hwdefs[] = {
1110 7d85892b blueswir1
    /* SS-1000 */
1111 7d85892b blueswir1
    {
1112 7d85892b blueswir1
        .iounit_bases   = {
1113 7d85892b blueswir1
            0xfe0200000ULL,
1114 7d85892b blueswir1
            0xfe1200000ULL,
1115 7d85892b blueswir1
            0xfe2200000ULL,
1116 7d85892b blueswir1
            0xfe3200000ULL,
1117 7d85892b blueswir1
            -1,
1118 7d85892b blueswir1
        },
1119 7d85892b blueswir1
        .tcx_base     = 0x820000000ULL,
1120 7d85892b blueswir1
        .slavio_base  = 0xf00000000ULL,
1121 7d85892b blueswir1
        .ms_kb_base   = 0xf00240000ULL,
1122 7d85892b blueswir1
        .serial_base  = 0xf00200000ULL,
1123 7d85892b blueswir1
        .nvram_base   = 0xf00280000ULL,
1124 7d85892b blueswir1
        .counter_base = 0xf00300000ULL,
1125 7d85892b blueswir1
        .espdma_base  = 0x800081000ULL,
1126 7d85892b blueswir1
        .esp_base     = 0x800080000ULL,
1127 7d85892b blueswir1
        .ledma_base   = 0x800040000ULL,
1128 7d85892b blueswir1
        .le_base      = 0x800060000ULL,
1129 7d85892b blueswir1
        .sbi_base     = 0xf02800000ULL,
1130 c1d00dc0 blueswir1
        .vram_size    = 0x00100000,
1131 7d85892b blueswir1
        .nvram_size   = 0x2000,
1132 7d85892b blueswir1
        .esp_irq = 3,
1133 7d85892b blueswir1
        .le_irq = 4,
1134 7d85892b blueswir1
        .clock_irq = 14,
1135 7d85892b blueswir1
        .clock1_irq = 10,
1136 7d85892b blueswir1
        .ms_kb_irq = 12,
1137 7d85892b blueswir1
        .ser_irq = 12,
1138 905fdcb5 blueswir1
        .nvram_machine_id = 0x80,
1139 905fdcb5 blueswir1
        .machine_id = ss1000_id,
1140 7d85892b blueswir1
        .iounit_version = 0x03000000,
1141 6ef05b95 blueswir1
        .max_mem = 0xf00000000ULL,
1142 7d85892b blueswir1
        .default_cpu_model = "TI SuperSparc II",
1143 7d85892b blueswir1
    },
1144 7d85892b blueswir1
    /* SS-2000 */
1145 7d85892b blueswir1
    {
1146 7d85892b blueswir1
        .iounit_bases   = {
1147 7d85892b blueswir1
            0xfe0200000ULL,
1148 7d85892b blueswir1
            0xfe1200000ULL,
1149 7d85892b blueswir1
            0xfe2200000ULL,
1150 7d85892b blueswir1
            0xfe3200000ULL,
1151 7d85892b blueswir1
            0xfe4200000ULL,
1152 7d85892b blueswir1
        },
1153 7d85892b blueswir1
        .tcx_base     = 0x820000000ULL,
1154 7d85892b blueswir1
        .slavio_base  = 0xf00000000ULL,
1155 7d85892b blueswir1
        .ms_kb_base   = 0xf00240000ULL,
1156 7d85892b blueswir1
        .serial_base  = 0xf00200000ULL,
1157 7d85892b blueswir1
        .nvram_base   = 0xf00280000ULL,
1158 7d85892b blueswir1
        .counter_base = 0xf00300000ULL,
1159 7d85892b blueswir1
        .espdma_base  = 0x800081000ULL,
1160 7d85892b blueswir1
        .esp_base     = 0x800080000ULL,
1161 7d85892b blueswir1
        .ledma_base   = 0x800040000ULL,
1162 7d85892b blueswir1
        .le_base      = 0x800060000ULL,
1163 7d85892b blueswir1
        .sbi_base     = 0xf02800000ULL,
1164 c1d00dc0 blueswir1
        .vram_size    = 0x00100000,
1165 7d85892b blueswir1
        .nvram_size   = 0x2000,
1166 7d85892b blueswir1
        .esp_irq = 3,
1167 7d85892b blueswir1
        .le_irq = 4,
1168 7d85892b blueswir1
        .clock_irq = 14,
1169 7d85892b blueswir1
        .clock1_irq = 10,
1170 7d85892b blueswir1
        .ms_kb_irq = 12,
1171 7d85892b blueswir1
        .ser_irq = 12,
1172 905fdcb5 blueswir1
        .nvram_machine_id = 0x80,
1173 905fdcb5 blueswir1
        .machine_id = ss2000_id,
1174 7d85892b blueswir1
        .iounit_version = 0x03000000,
1175 6ef05b95 blueswir1
        .max_mem = 0xf00000000ULL,
1176 7d85892b blueswir1
        .default_cpu_model = "TI SuperSparc II",
1177 7d85892b blueswir1
    },
1178 7d85892b blueswir1
};
1179 7d85892b blueswir1
1180 6ef05b95 blueswir1
static void sun4d_hw_init(const struct sun4d_hwdef *hwdef, ram_addr_t RAM_size,
1181 7d85892b blueswir1
                          const char *boot_device,
1182 3023f332 aliguori
                          const char *kernel_filename,
1183 7d85892b blueswir1
                          const char *kernel_cmdline,
1184 7d85892b blueswir1
                          const char *initrd_filename, const char *cpu_model)
1185 7d85892b blueswir1
{
1186 7d85892b blueswir1
    CPUState *env, *envs[MAX_CPUS];
1187 7d85892b blueswir1
    unsigned int i;
1188 cfb9de9c Paul Brook
    void *iounits[MAX_IOUNITS], *espdma, *ledma, *nvram, *sbi;
1189 7d85892b blueswir1
    qemu_irq *cpu_irqs[MAX_CPUS], *sbi_irq, *sbi_cpu_irq,
1190 7d85892b blueswir1
        *espdma_irq, *ledma_irq;
1191 7d85892b blueswir1
    qemu_irq *esp_reset, *le_reset;
1192 dc828ca1 pbrook
    ram_addr_t ram_offset, prom_offset;
1193 5c6602c5 blueswir1
    unsigned long kernel_size;
1194 7d85892b blueswir1
    int ret;
1195 5cea8590 Paul Brook
    char *filename;
1196 3cce6243 blueswir1
    void *fw_cfg;
1197 7d85892b blueswir1
1198 7d85892b blueswir1
    /* init CPUs */
1199 7d85892b blueswir1
    if (!cpu_model)
1200 7d85892b blueswir1
        cpu_model = hwdef->default_cpu_model;
1201 7d85892b blueswir1
1202 7d85892b blueswir1
    for (i = 0; i < smp_cpus; i++) {
1203 7d85892b blueswir1
        env = cpu_init(cpu_model);
1204 7d85892b blueswir1
        if (!env) {
1205 8e82c6a8 blueswir1
            fprintf(stderr, "qemu: Unable to find Sparc CPU definition\n");
1206 7d85892b blueswir1
            exit(1);
1207 7d85892b blueswir1
        }
1208 7d85892b blueswir1
        cpu_sparc_set_id(env, i);
1209 7d85892b blueswir1
        envs[i] = env;
1210 7d85892b blueswir1
        if (i == 0) {
1211 8217606e Jan Kiszka
            qemu_register_reset(main_cpu_reset, 0, env);
1212 7d85892b blueswir1
        } else {
1213 8217606e Jan Kiszka
            qemu_register_reset(secondary_cpu_reset, 0, env);
1214 7d85892b blueswir1
            env->halted = 1;
1215 7d85892b blueswir1
        }
1216 7d85892b blueswir1
        cpu_irqs[i] = qemu_allocate_irqs(cpu_set_irq, envs[i], MAX_PILS);
1217 7d85892b blueswir1
        env->prom_addr = hwdef->slavio_base;
1218 7d85892b blueswir1
    }
1219 7d85892b blueswir1
1220 7d85892b blueswir1
    for (i = smp_cpus; i < MAX_CPUS; i++)
1221 7d85892b blueswir1
        cpu_irqs[i] = qemu_allocate_irqs(dummy_cpu_set_irq, NULL, MAX_PILS);
1222 7d85892b blueswir1
1223 7d85892b blueswir1
    /* allocate RAM */
1224 7d85892b blueswir1
    if ((uint64_t)RAM_size > hwdef->max_mem) {
1225 77f193da blueswir1
        fprintf(stderr,
1226 77f193da blueswir1
                "qemu: Too much memory for this machine: %d, maximum %d\n",
1227 6ef05b95 blueswir1
                (unsigned int)(RAM_size / (1024 * 1024)),
1228 7d85892b blueswir1
                (unsigned int)(hwdef->max_mem / (1024 * 1024)));
1229 7d85892b blueswir1
        exit(1);
1230 7d85892b blueswir1
    }
1231 5c6602c5 blueswir1
    ram_offset = qemu_ram_alloc(RAM_size);
1232 5c6602c5 blueswir1
    cpu_register_physical_memory(0, RAM_size, ram_offset);
1233 7d85892b blueswir1
1234 7d85892b blueswir1
    /* load boot prom */
1235 5c6602c5 blueswir1
    prom_offset = qemu_ram_alloc(PROM_SIZE_MAX);
1236 7d85892b blueswir1
    cpu_register_physical_memory(hwdef->slavio_base,
1237 7d85892b blueswir1
                                 (PROM_SIZE_MAX + TARGET_PAGE_SIZE - 1) &
1238 7d85892b blueswir1
                                 TARGET_PAGE_MASK,
1239 7d85892b blueswir1
                                 prom_offset | IO_MEM_ROM);
1240 7d85892b blueswir1
1241 7d85892b blueswir1
    if (bios_name == NULL)
1242 7d85892b blueswir1
        bios_name = PROM_FILENAME;
1243 5cea8590 Paul Brook
    filename = qemu_find_file(QEMU_FILE_TYPE_BIOS, bios_name);
1244 5cea8590 Paul Brook
    if (filename) {
1245 5cea8590 Paul Brook
        ret = load_elf(filename, hwdef->slavio_base - PROM_VADDR,
1246 5cea8590 Paul Brook
                       NULL, NULL, NULL);
1247 5cea8590 Paul Brook
        if (ret < 0 || ret > PROM_SIZE_MAX)
1248 5cea8590 Paul Brook
            ret = load_image_targphys(filename, hwdef->slavio_base,
1249 5cea8590 Paul Brook
                                      PROM_SIZE_MAX);
1250 5cea8590 Paul Brook
        qemu_free(filename);
1251 5cea8590 Paul Brook
    } else {
1252 5cea8590 Paul Brook
        ret = -1;
1253 5cea8590 Paul Brook
    }
1254 7d85892b blueswir1
    if (ret < 0 || ret > PROM_SIZE_MAX) {
1255 7d85892b blueswir1
        fprintf(stderr, "qemu: could not load prom '%s'\n",
1256 5cea8590 Paul Brook
                bios_name);
1257 7d85892b blueswir1
        exit(1);
1258 7d85892b blueswir1
    }
1259 7d85892b blueswir1
1260 7d85892b blueswir1
    /* set up devices */
1261 7d85892b blueswir1
    sbi = sbi_init(hwdef->sbi_base, &sbi_irq, &sbi_cpu_irq, cpu_irqs);
1262 7d85892b blueswir1
1263 7d85892b blueswir1
    for (i = 0; i < MAX_IOUNITS; i++)
1264 7d85892b blueswir1
        if (hwdef->iounit_bases[i] != (target_phys_addr_t)-1)
1265 ff403da6 blueswir1
            iounits[i] = iommu_init(hwdef->iounit_bases[i],
1266 ff403da6 blueswir1
                                    hwdef->iounit_version,
1267 ff403da6 blueswir1
                                    sbi_irq[hwdef->me_irq]);
1268 7d85892b blueswir1
1269 7d85892b blueswir1
    espdma = sparc32_dma_init(hwdef->espdma_base, sbi_irq[hwdef->esp_irq],
1270 7d85892b blueswir1
                              iounits[0], &espdma_irq, &esp_reset);
1271 7d85892b blueswir1
1272 7d85892b blueswir1
    ledma = sparc32_dma_init(hwdef->ledma_base, sbi_irq[hwdef->le_irq],
1273 7d85892b blueswir1
                             iounits[0], &ledma_irq, &le_reset);
1274 7d85892b blueswir1
1275 7d85892b blueswir1
    if (graphic_depth != 8 && graphic_depth != 24) {
1276 7d85892b blueswir1
        fprintf(stderr, "qemu: Unsupported depth: %d\n", graphic_depth);
1277 7d85892b blueswir1
        exit (1);
1278 7d85892b blueswir1
    }
1279 dc828ca1 pbrook
    tcx_init(hwdef->tcx_base, hwdef->vram_size, graphic_width, graphic_height,
1280 dc828ca1 pbrook
             graphic_depth);
1281 7d85892b blueswir1
1282 0ae18cee aliguori
    lance_init(&nd_table[0], hwdef->le_base, ledma, *ledma_irq, le_reset);
1283 7d85892b blueswir1
1284 7d85892b blueswir1
    nvram = m48t59_init(sbi_irq[0], hwdef->nvram_base, 0,
1285 7d85892b blueswir1
                        hwdef->nvram_size, 8);
1286 7d85892b blueswir1
1287 7d85892b blueswir1
    slavio_timer_init_all(hwdef->counter_base, sbi_irq[hwdef->clock1_irq],
1288 7d85892b blueswir1
                          sbi_cpu_irq, smp_cpus);
1289 7d85892b blueswir1
1290 7d85892b blueswir1
    slavio_serial_ms_kbd_init(hwdef->ms_kb_base, sbi_irq[hwdef->ms_kb_irq],
1291 993fbfdb Anthony Liguori
                              display_type == DT_NOGRAPHIC, ESCC_CLOCK, 1);
1292 7d85892b blueswir1
    // Slavio TTYA (base+4, Linux ttyS0) is the first Qemu serial device
1293 7d85892b blueswir1
    // Slavio TTYB (base+0, Linux ttyS1) is the second Qemu serial device
1294 aeeb69c7 aurel32
    escc_init(hwdef->serial_base, sbi_irq[hwdef->ser_irq], sbi_irq[hwdef->ser_irq],
1295 aeeb69c7 aurel32
              serial_hds[0], serial_hds[1], ESCC_CLOCK, 1);
1296 7d85892b blueswir1
1297 7d85892b blueswir1
    if (drive_get_max_bus(IF_SCSI) > 0) {
1298 7d85892b blueswir1
        fprintf(stderr, "qemu: too many SCSI bus\n");
1299 7d85892b blueswir1
        exit(1);
1300 7d85892b blueswir1
    }
1301 7d85892b blueswir1
1302 cfb9de9c Paul Brook
    esp_init(hwdef->esp_base, 2,
1303 cfb9de9c Paul Brook
             espdma_memory_read, espdma_memory_write,
1304 cfb9de9c Paul Brook
             espdma, *espdma_irq, esp_reset);
1305 7d85892b blueswir1
1306 293f78bc blueswir1
    kernel_size = sun4m_load_kernel(kernel_filename, initrd_filename,
1307 293f78bc blueswir1
                                    RAM_size);
1308 7d85892b blueswir1
1309 7d85892b blueswir1
    nvram_init(nvram, (uint8_t *)&nd_table[0].macaddr, kernel_cmdline,
1310 7d85892b blueswir1
               boot_device, RAM_size, kernel_size, graphic_width,
1311 905fdcb5 blueswir1
               graphic_height, graphic_depth, hwdef->nvram_machine_id,
1312 905fdcb5 blueswir1
               "Sun4d");
1313 3cce6243 blueswir1
1314 3cce6243 blueswir1
    fw_cfg = fw_cfg_init(0, 0, CFG_ADDR, CFG_ADDR + 2);
1315 3cce6243 blueswir1
    fw_cfg_add_i32(fw_cfg, FW_CFG_ID, 1);
1316 905fdcb5 blueswir1
    fw_cfg_add_i64(fw_cfg, FW_CFG_RAM_SIZE, (uint64_t)ram_size);
1317 905fdcb5 blueswir1
    fw_cfg_add_i16(fw_cfg, FW_CFG_MACHINE_ID, hwdef->machine_id);
1318 513f789f blueswir1
    fw_cfg_add_i16(fw_cfg, FW_CFG_SUN4M_DEPTH, graphic_depth);
1319 513f789f blueswir1
    fw_cfg_add_i32(fw_cfg, FW_CFG_KERNEL_ADDR, KERNEL_LOAD_ADDR);
1320 513f789f blueswir1
    fw_cfg_add_i32(fw_cfg, FW_CFG_KERNEL_SIZE, kernel_size);
1321 513f789f blueswir1
    if (kernel_cmdline) {
1322 513f789f blueswir1
        fw_cfg_add_i32(fw_cfg, FW_CFG_KERNEL_CMDLINE, CMDLINE_ADDR);
1323 513f789f blueswir1
        pstrcpy_targphys(CMDLINE_ADDR, TARGET_PAGE_SIZE, kernel_cmdline);
1324 513f789f blueswir1
    } else {
1325 513f789f blueswir1
        fw_cfg_add_i32(fw_cfg, FW_CFG_KERNEL_CMDLINE, 0);
1326 513f789f blueswir1
    }
1327 513f789f blueswir1
    fw_cfg_add_i32(fw_cfg, FW_CFG_INITRD_ADDR, INITRD_LOAD_ADDR);
1328 513f789f blueswir1
    fw_cfg_add_i32(fw_cfg, FW_CFG_INITRD_SIZE, 0); // not used
1329 513f789f blueswir1
    fw_cfg_add_i16(fw_cfg, FW_CFG_BOOT_DEVICE, boot_device[0]);
1330 513f789f blueswir1
    qemu_register_boot_set(fw_cfg_boot_set, fw_cfg);
1331 7d85892b blueswir1
}
1332 7d85892b blueswir1
1333 7d85892b blueswir1
/* SPARCserver 1000 hardware initialisation */
1334 fbe1b595 Paul Brook
static void ss1000_init(ram_addr_t RAM_size,
1335 3023f332 aliguori
                        const char *boot_device,
1336 7d85892b blueswir1
                        const char *kernel_filename, const char *kernel_cmdline,
1337 7d85892b blueswir1
                        const char *initrd_filename, const char *cpu_model)
1338 7d85892b blueswir1
{
1339 3023f332 aliguori
    sun4d_hw_init(&sun4d_hwdefs[0], RAM_size, boot_device, kernel_filename,
1340 7d85892b blueswir1
                  kernel_cmdline, initrd_filename, cpu_model);
1341 7d85892b blueswir1
}
1342 7d85892b blueswir1
1343 7d85892b blueswir1
/* SPARCcenter 2000 hardware initialisation */
1344 fbe1b595 Paul Brook
static void ss2000_init(ram_addr_t RAM_size,
1345 3023f332 aliguori
                        const char *boot_device,
1346 7d85892b blueswir1
                        const char *kernel_filename, const char *kernel_cmdline,
1347 7d85892b blueswir1
                        const char *initrd_filename, const char *cpu_model)
1348 7d85892b blueswir1
{
1349 3023f332 aliguori
    sun4d_hw_init(&sun4d_hwdefs[1], RAM_size, boot_device, kernel_filename,
1350 7d85892b blueswir1
                  kernel_cmdline, initrd_filename, cpu_model);
1351 7d85892b blueswir1
}
1352 7d85892b blueswir1
1353 f80f9ec9 Anthony Liguori
static QEMUMachine ss1000_machine = {
1354 66de733b blueswir1
    .name = "SS-1000",
1355 66de733b blueswir1
    .desc = "Sun4d platform, SPARCserver 1000",
1356 66de733b blueswir1
    .init = ss1000_init,
1357 c9b1ae2c blueswir1
    .use_scsi = 1,
1358 1bcee014 blueswir1
    .max_cpus = 8,
1359 7d85892b blueswir1
};
1360 7d85892b blueswir1
1361 f80f9ec9 Anthony Liguori
static QEMUMachine ss2000_machine = {
1362 66de733b blueswir1
    .name = "SS-2000",
1363 66de733b blueswir1
    .desc = "Sun4d platform, SPARCcenter 2000",
1364 66de733b blueswir1
    .init = ss2000_init,
1365 c9b1ae2c blueswir1
    .use_scsi = 1,
1366 1bcee014 blueswir1
    .max_cpus = 20,
1367 7d85892b blueswir1
};
1368 8137cde8 blueswir1
1369 8137cde8 blueswir1
static const struct sun4c_hwdef sun4c_hwdefs[] = {
1370 8137cde8 blueswir1
    /* SS-2 */
1371 8137cde8 blueswir1
    {
1372 8137cde8 blueswir1
        .iommu_base   = 0xf8000000,
1373 8137cde8 blueswir1
        .tcx_base     = 0xfe000000,
1374 8137cde8 blueswir1
        .slavio_base  = 0xf6000000,
1375 8137cde8 blueswir1
        .intctl_base  = 0xf5000000,
1376 8137cde8 blueswir1
        .counter_base = 0xf3000000,
1377 8137cde8 blueswir1
        .ms_kb_base   = 0xf0000000,
1378 8137cde8 blueswir1
        .serial_base  = 0xf1000000,
1379 8137cde8 blueswir1
        .nvram_base   = 0xf2000000,
1380 8137cde8 blueswir1
        .fd_base      = 0xf7200000,
1381 8137cde8 blueswir1
        .dma_base     = 0xf8400000,
1382 8137cde8 blueswir1
        .esp_base     = 0xf8800000,
1383 8137cde8 blueswir1
        .le_base      = 0xf8c00000,
1384 8137cde8 blueswir1
        .aux1_base    = 0xf7400003,
1385 8137cde8 blueswir1
        .vram_size    = 0x00100000,
1386 8137cde8 blueswir1
        .nvram_size   = 0x800,
1387 8137cde8 blueswir1
        .esp_irq = 2,
1388 8137cde8 blueswir1
        .le_irq = 3,
1389 8137cde8 blueswir1
        .clock_irq = 5,
1390 8137cde8 blueswir1
        .clock1_irq = 7,
1391 8137cde8 blueswir1
        .ms_kb_irq = 1,
1392 8137cde8 blueswir1
        .ser_irq = 1,
1393 8137cde8 blueswir1
        .fd_irq = 1,
1394 8137cde8 blueswir1
        .me_irq = 1,
1395 8137cde8 blueswir1
        .nvram_machine_id = 0x55,
1396 8137cde8 blueswir1
        .machine_id = ss2_id,
1397 8137cde8 blueswir1
        .max_mem = 0x10000000,
1398 8137cde8 blueswir1
        .default_cpu_model = "Cypress CY7C601",
1399 8137cde8 blueswir1
    },
1400 8137cde8 blueswir1
};
1401 8137cde8 blueswir1
1402 8137cde8 blueswir1
static void sun4c_hw_init(const struct sun4c_hwdef *hwdef, ram_addr_t RAM_size,
1403 8137cde8 blueswir1
                          const char *boot_device,
1404 3023f332 aliguori
                          const char *kernel_filename,
1405 8137cde8 blueswir1
                          const char *kernel_cmdline,
1406 8137cde8 blueswir1
                          const char *initrd_filename, const char *cpu_model)
1407 8137cde8 blueswir1
{
1408 8137cde8 blueswir1
    CPUState *env;
1409 cfb9de9c Paul Brook
    void *iommu, *espdma, *ledma, *nvram;
1410 8137cde8 blueswir1
    qemu_irq *cpu_irqs, *slavio_irq, *espdma_irq, *ledma_irq;
1411 8137cde8 blueswir1
    qemu_irq *esp_reset, *le_reset;
1412 8137cde8 blueswir1
    qemu_irq *fdc_tc;
1413 dc828ca1 pbrook
    ram_addr_t ram_offset, prom_offset;
1414 5c6602c5 blueswir1
    unsigned long kernel_size;
1415 8137cde8 blueswir1
    int ret;
1416 5cea8590 Paul Brook
    char *filename;
1417 8137cde8 blueswir1
    BlockDriverState *fd[MAX_FD];
1418 8137cde8 blueswir1
    int drive_index;
1419 8137cde8 blueswir1
    void *fw_cfg;
1420 8137cde8 blueswir1
1421 8137cde8 blueswir1
    /* init CPU */
1422 8137cde8 blueswir1
    if (!cpu_model)
1423 8137cde8 blueswir1
        cpu_model = hwdef->default_cpu_model;
1424 8137cde8 blueswir1
1425 8137cde8 blueswir1
    env = cpu_init(cpu_model);
1426 8137cde8 blueswir1
    if (!env) {
1427 8137cde8 blueswir1
        fprintf(stderr, "qemu: Unable to find Sparc CPU definition\n");
1428 8137cde8 blueswir1
        exit(1);
1429 8137cde8 blueswir1
    }
1430 8137cde8 blueswir1
1431 8137cde8 blueswir1
    cpu_sparc_set_id(env, 0);
1432 8137cde8 blueswir1
1433 8217606e Jan Kiszka
    qemu_register_reset(main_cpu_reset, 0, env);
1434 8137cde8 blueswir1
    cpu_irqs = qemu_allocate_irqs(cpu_set_irq, env, MAX_PILS);
1435 8137cde8 blueswir1
    env->prom_addr = hwdef->slavio_base;
1436 8137cde8 blueswir1
1437 8137cde8 blueswir1
    /* allocate RAM */
1438 8137cde8 blueswir1
    if ((uint64_t)RAM_size > hwdef->max_mem) {
1439 8137cde8 blueswir1
        fprintf(stderr,
1440 8137cde8 blueswir1
                "qemu: Too much memory for this machine: %d, maximum %d\n",
1441 8137cde8 blueswir1
                (unsigned int)(RAM_size / (1024 * 1024)),
1442 8137cde8 blueswir1
                (unsigned int)(hwdef->max_mem / (1024 * 1024)));
1443 8137cde8 blueswir1
        exit(1);
1444 8137cde8 blueswir1
    }
1445 5c6602c5 blueswir1
    ram_offset = qemu_ram_alloc(RAM_size);
1446 5c6602c5 blueswir1
    cpu_register_physical_memory(0, RAM_size, ram_offset);
1447 8137cde8 blueswir1
1448 8137cde8 blueswir1
    /* load boot prom */
1449 5c6602c5 blueswir1
    prom_offset = qemu_ram_alloc(PROM_SIZE_MAX);
1450 8137cde8 blueswir1
    cpu_register_physical_memory(hwdef->slavio_base,
1451 8137cde8 blueswir1
                                 (PROM_SIZE_MAX + TARGET_PAGE_SIZE - 1) &
1452 8137cde8 blueswir1
                                 TARGET_PAGE_MASK,
1453 8137cde8 blueswir1
                                 prom_offset | IO_MEM_ROM);
1454 8137cde8 blueswir1
1455 8137cde8 blueswir1
    if (bios_name == NULL)
1456 8137cde8 blueswir1
        bios_name = PROM_FILENAME;
1457 5cea8590 Paul Brook
    filename = qemu_find_file(QEMU_FILE_TYPE_BIOS, bios_name);
1458 5cea8590 Paul Brook
    if (filename) {
1459 5cea8590 Paul Brook
        ret = load_elf(filename, hwdef->slavio_base - PROM_VADDR,
1460 5cea8590 Paul Brook
                       NULL, NULL, NULL);
1461 5cea8590 Paul Brook
        if (ret < 0 || ret > PROM_SIZE_MAX)
1462 5cea8590 Paul Brook
            ret = load_image_targphys(filename, hwdef->slavio_base,
1463 5cea8590 Paul Brook
                                      PROM_SIZE_MAX);
1464 5cea8590 Paul Brook
        qemu_free(filename);
1465 5cea8590 Paul Brook
    } else {
1466 5cea8590 Paul Brook
        ret = -1;
1467 5cea8590 Paul Brook
    }
1468 8137cde8 blueswir1
    if (ret < 0 || ret > PROM_SIZE_MAX) {
1469 8137cde8 blueswir1
        fprintf(stderr, "qemu: could not load prom '%s'\n",
1470 5cea8590 Paul Brook
                filename);
1471 8137cde8 blueswir1
        exit(1);
1472 8137cde8 blueswir1
    }
1473 8137cde8 blueswir1
1474 8137cde8 blueswir1
    /* set up devices */
1475 8137cde8 blueswir1
    slavio_intctl = sun4c_intctl_init(hwdef->intctl_base,
1476 8137cde8 blueswir1
                                      &slavio_irq, cpu_irqs);
1477 8137cde8 blueswir1
1478 8137cde8 blueswir1
    iommu = iommu_init(hwdef->iommu_base, hwdef->iommu_version,
1479 8137cde8 blueswir1
                       slavio_irq[hwdef->me_irq]);
1480 8137cde8 blueswir1
1481 8137cde8 blueswir1
    espdma = sparc32_dma_init(hwdef->dma_base, slavio_irq[hwdef->esp_irq],
1482 8137cde8 blueswir1
                              iommu, &espdma_irq, &esp_reset);
1483 8137cde8 blueswir1
1484 8137cde8 blueswir1
    ledma = sparc32_dma_init(hwdef->dma_base + 16ULL,
1485 8137cde8 blueswir1
                             slavio_irq[hwdef->le_irq], iommu, &ledma_irq,
1486 8137cde8 blueswir1
                             &le_reset);
1487 8137cde8 blueswir1
1488 8137cde8 blueswir1
    if (graphic_depth != 8 && graphic_depth != 24) {
1489 8137cde8 blueswir1
        fprintf(stderr, "qemu: Unsupported depth: %d\n", graphic_depth);
1490 8137cde8 blueswir1
        exit (1);
1491 8137cde8 blueswir1
    }
1492 dc828ca1 pbrook
    tcx_init(hwdef->tcx_base, hwdef->vram_size, graphic_width, graphic_height,
1493 dc828ca1 pbrook
             graphic_depth);
1494 8137cde8 blueswir1
1495 0ae18cee aliguori
    lance_init(&nd_table[0], hwdef->le_base, ledma, *ledma_irq, le_reset);
1496 8137cde8 blueswir1
1497 8137cde8 blueswir1
    nvram = m48t59_init(slavio_irq[0], hwdef->nvram_base, 0,
1498 8137cde8 blueswir1
                        hwdef->nvram_size, 2);
1499 8137cde8 blueswir1
1500 8137cde8 blueswir1
    slavio_serial_ms_kbd_init(hwdef->ms_kb_base, slavio_irq[hwdef->ms_kb_irq],
1501 993fbfdb Anthony Liguori
                              display_type == DT_NOGRAPHIC, ESCC_CLOCK, 1);
1502 8137cde8 blueswir1
    // Slavio TTYA (base+4, Linux ttyS0) is the first Qemu serial device
1503 8137cde8 blueswir1
    // Slavio TTYB (base+0, Linux ttyS1) is the second Qemu serial device
1504 aeeb69c7 aurel32
    escc_init(hwdef->serial_base, slavio_irq[hwdef->ser_irq],
1505 aeeb69c7 aurel32
              slavio_irq[hwdef->ser_irq], serial_hds[0], serial_hds[1],
1506 aeeb69c7 aurel32
              ESCC_CLOCK, 1);
1507 8137cde8 blueswir1
1508 fe096129 blueswir1
    slavio_misc = slavio_misc_init(0, 0, hwdef->aux1_base, 0,
1509 6d0c293d blueswir1
                                   slavio_irq[hwdef->me_irq], NULL, &fdc_tc);
1510 8137cde8 blueswir1
1511 8137cde8 blueswir1
    if (hwdef->fd_base != (target_phys_addr_t)-1) {
1512 8137cde8 blueswir1
        /* there is zero or one floppy drive */
1513 ce802585 blueswir1
        memset(fd, 0, sizeof(fd));
1514 8137cde8 blueswir1
        drive_index = drive_get_index(IF_FLOPPY, 0, 0);
1515 8137cde8 blueswir1
        if (drive_index != -1)
1516 8137cde8 blueswir1
            fd[0] = drives_table[drive_index].bdrv;
1517 8137cde8 blueswir1
1518 8137cde8 blueswir1
        sun4m_fdctrl_init(slavio_irq[hwdef->fd_irq], hwdef->fd_base, fd,
1519 8137cde8 blueswir1
                          fdc_tc);
1520 8137cde8 blueswir1
    }
1521 8137cde8 blueswir1
1522 8137cde8 blueswir1
    if (drive_get_max_bus(IF_SCSI) > 0) {
1523 8137cde8 blueswir1
        fprintf(stderr, "qemu: too many SCSI bus\n");
1524 8137cde8 blueswir1
        exit(1);
1525 8137cde8 blueswir1
    }
1526 8137cde8 blueswir1
1527 cfb9de9c Paul Brook
    esp_init(hwdef->esp_base, 2,
1528 cfb9de9c Paul Brook
             espdma_memory_read, espdma_memory_write,
1529 cfb9de9c Paul Brook
             espdma, *espdma_irq, esp_reset);
1530 8137cde8 blueswir1
1531 8137cde8 blueswir1
    kernel_size = sun4m_load_kernel(kernel_filename, initrd_filename,
1532 8137cde8 blueswir1
                                    RAM_size);
1533 8137cde8 blueswir1
1534 8137cde8 blueswir1
    nvram_init(nvram, (uint8_t *)&nd_table[0].macaddr, kernel_cmdline,
1535 8137cde8 blueswir1
               boot_device, RAM_size, kernel_size, graphic_width,
1536 8137cde8 blueswir1
               graphic_height, graphic_depth, hwdef->nvram_machine_id,
1537 8137cde8 blueswir1
               "Sun4c");
1538 8137cde8 blueswir1
1539 8137cde8 blueswir1
    fw_cfg = fw_cfg_init(0, 0, CFG_ADDR, CFG_ADDR + 2);
1540 8137cde8 blueswir1
    fw_cfg_add_i32(fw_cfg, FW_CFG_ID, 1);
1541 8137cde8 blueswir1
    fw_cfg_add_i64(fw_cfg, FW_CFG_RAM_SIZE, (uint64_t)ram_size);
1542 8137cde8 blueswir1
    fw_cfg_add_i16(fw_cfg, FW_CFG_MACHINE_ID, hwdef->machine_id);
1543 513f789f blueswir1
    fw_cfg_add_i16(fw_cfg, FW_CFG_SUN4M_DEPTH, graphic_depth);
1544 513f789f blueswir1
    fw_cfg_add_i32(fw_cfg, FW_CFG_KERNEL_ADDR, KERNEL_LOAD_ADDR);
1545 513f789f blueswir1
    fw_cfg_add_i32(fw_cfg, FW_CFG_KERNEL_SIZE, kernel_size);
1546 513f789f blueswir1
    if (kernel_cmdline) {
1547 513f789f blueswir1
        fw_cfg_add_i32(fw_cfg, FW_CFG_KERNEL_CMDLINE, CMDLINE_ADDR);
1548 513f789f blueswir1
        pstrcpy_targphys(CMDLINE_ADDR, TARGET_PAGE_SIZE, kernel_cmdline);
1549 513f789f blueswir1
    } else {
1550 513f789f blueswir1
        fw_cfg_add_i32(fw_cfg, FW_CFG_KERNEL_CMDLINE, 0);
1551 513f789f blueswir1
    }
1552 513f789f blueswir1
    fw_cfg_add_i32(fw_cfg, FW_CFG_INITRD_ADDR, INITRD_LOAD_ADDR);
1553 513f789f blueswir1
    fw_cfg_add_i32(fw_cfg, FW_CFG_INITRD_SIZE, 0); // not used
1554 513f789f blueswir1
    fw_cfg_add_i16(fw_cfg, FW_CFG_BOOT_DEVICE, boot_device[0]);
1555 513f789f blueswir1
    qemu_register_boot_set(fw_cfg_boot_set, fw_cfg);
1556 8137cde8 blueswir1
}
1557 8137cde8 blueswir1
1558 8137cde8 blueswir1
/* SPARCstation 2 hardware initialisation */
1559 fbe1b595 Paul Brook
static void ss2_init(ram_addr_t RAM_size,
1560 3023f332 aliguori
                     const char *boot_device,
1561 8137cde8 blueswir1
                     const char *kernel_filename, const char *kernel_cmdline,
1562 8137cde8 blueswir1
                     const char *initrd_filename, const char *cpu_model)
1563 8137cde8 blueswir1
{
1564 3023f332 aliguori
    sun4c_hw_init(&sun4c_hwdefs[0], RAM_size, boot_device, kernel_filename,
1565 8137cde8 blueswir1
                  kernel_cmdline, initrd_filename, cpu_model);
1566 8137cde8 blueswir1
}
1567 8137cde8 blueswir1
1568 f80f9ec9 Anthony Liguori
static QEMUMachine ss2_machine = {
1569 8137cde8 blueswir1
    .name = "SS-2",
1570 8137cde8 blueswir1
    .desc = "Sun4c platform, SPARCstation 2",
1571 8137cde8 blueswir1
    .init = ss2_init,
1572 8137cde8 blueswir1
    .use_scsi = 1,
1573 8137cde8 blueswir1
};
1574 f80f9ec9 Anthony Liguori
1575 f80f9ec9 Anthony Liguori
static void ss2_machine_init(void)
1576 f80f9ec9 Anthony Liguori
{
1577 f80f9ec9 Anthony Liguori
    qemu_register_machine(&ss5_machine);
1578 f80f9ec9 Anthony Liguori
    qemu_register_machine(&ss10_machine);
1579 f80f9ec9 Anthony Liguori
    qemu_register_machine(&ss600mp_machine);
1580 f80f9ec9 Anthony Liguori
    qemu_register_machine(&ss20_machine);
1581 f80f9ec9 Anthony Liguori
    qemu_register_machine(&voyager_machine);
1582 f80f9ec9 Anthony Liguori
    qemu_register_machine(&ss_lx_machine);
1583 f80f9ec9 Anthony Liguori
    qemu_register_machine(&ss4_machine);
1584 f80f9ec9 Anthony Liguori
    qemu_register_machine(&scls_machine);
1585 f80f9ec9 Anthony Liguori
    qemu_register_machine(&sbook_machine);
1586 f80f9ec9 Anthony Liguori
    qemu_register_machine(&ss1000_machine);
1587 f80f9ec9 Anthony Liguori
    qemu_register_machine(&ss2000_machine);
1588 f80f9ec9 Anthony Liguori
    qemu_register_machine(&ss2_machine);
1589 f80f9ec9 Anthony Liguori
}
1590 f80f9ec9 Anthony Liguori
1591 f80f9ec9 Anthony Liguori
machine_init(ss2_machine_init);