Revision c988bfad hw/realview.c

b/hw/realview.c
35 35
  env->regs[15] = 0x80000000;
36 36
}
37 37

  
38
enum realview_board_type {
39
    BOARD_EB,
40
    BOARD_EB_MPCORE
41
};
42

  
38 43
static void realview_init(ram_addr_t ram_size,
39 44
                     const char *boot_device,
40 45
                     const char *kernel_filename, const char *kernel_cmdline,
41
                     const char *initrd_filename, const char *cpu_model)
46
                     const char *initrd_filename, const char *cpu_model,
47
                     enum realview_board_type board_type)
42 48
{
43
    CPUState *env;
49
    CPUState *env = NULL;
44 50
    ram_addr_t ram_offset;
45 51
    DeviceState *dev;
52
    SysBusDevice *busdev;
46 53
    qemu_irq *irqp;
47 54
    qemu_irq pic[64];
48 55
    PCIBus *pci_bus;
......
50 57
    int n;
51 58
    int done_smc = 0;
52 59
    qemu_irq cpu_irq[4];
53
    int ncpu;
60
    int is_mpcore = (board_type == BOARD_EB_MPCORE);
54 61
    uint32_t proc_id = 0;
55 62

  
56
    if (!cpu_model)
57
        cpu_model = "arm926";
58
    /* FIXME: obey smp_cpus.  */
59
    if (strcmp(cpu_model, "arm11mpcore") == 0) {
60
        ncpu = 4;
61
    } else {
62
        ncpu = 1;
63
    }
64

  
65
    for (n = 0; n < ncpu; n++) {
63
    for (n = 0; n < smp_cpus; n++) {
66 64
        env = cpu_init(cpu_model);
67 65
        if (!env) {
68 66
            fprintf(stderr, "Unable to find CPU definition\n");
......
91 89

  
92 90
    arm_sysctl_init(0x10000000, 0xc1400400, proc_id);
93 91

  
94
    if (ncpu == 1) {
95
        /* ??? The documentation says GIC1 is nFIQ and either GIC2 or GIC3
96
           is nIRQ (there are inconsistencies).  However Linux 2.6.17 expects
97
           GIC1 to be nIRQ and ignores all the others, so do that for now.  */
98
        dev = sysbus_create_simple("realview_gic", 0x10040000, cpu_irq[0]);
92
    if (is_mpcore) {
93
        dev = qdev_create(NULL, "realview_mpcore");
94
        qdev_prop_set_uint32(dev, "num-cpu", smp_cpus);
95
        qdev_init_nofail(dev);
96
        busdev = sysbus_from_qdev(dev);
97
        for (n = 0; n < smp_cpus; n++) {
98
            sysbus_connect_irq(busdev, n, cpu_irq[n]);
99
        }
99 100
    } else {
100
        dev = sysbus_create_varargs("realview_mpcore", -1,
101
                                    cpu_irq[0], cpu_irq[1], cpu_irq[2],
102
                                    cpu_irq[3], NULL);
101
        dev = sysbus_create_simple("realview_gic", 0x10040000, cpu_irq[0]);
103 102
    }
104 103
    for (n = 0; n < 64; n++) {
105 104
        pic[n] = qdev_get_gpio_in(dev, n);
......
210 209
    realview_binfo.kernel_filename = kernel_filename;
211 210
    realview_binfo.kernel_cmdline = kernel_cmdline;
212 211
    realview_binfo.initrd_filename = initrd_filename;
213
    realview_binfo.nb_cpus = ncpu;
212
    realview_binfo.nb_cpus = smp_cpus;
214 213
    arm_load_kernel(first_cpu, &realview_binfo);
215 214
}
216 215

  
217
static QEMUMachine realview_machine = {
218
    .name = "realview",
216
static void realview_eb_init(ram_addr_t ram_size,
217
                     const char *boot_device,
218
                     const char *kernel_filename, const char *kernel_cmdline,
219
                     const char *initrd_filename, const char *cpu_model)
220
{
221
    if (!cpu_model) {
222
        cpu_model = "arm926";
223
    }
224
    realview_init(ram_size, boot_device, kernel_filename, kernel_cmdline,
225
                  initrd_filename, cpu_model, BOARD_EB);
226
}
227

  
228
static void realview_eb_mpcore_init(ram_addr_t ram_size,
229
                     const char *boot_device,
230
                     const char *kernel_filename, const char *kernel_cmdline,
231
                     const char *initrd_filename, const char *cpu_model)
232
{
233
    if (!cpu_model) {
234
        cpu_model = "arm11mpcore";
235
    }
236
    realview_init(ram_size, boot_device, kernel_filename, kernel_cmdline,
237
                  initrd_filename, cpu_model, BOARD_EB_MPCORE);
238
}
239

  
240
static QEMUMachine realview_eb_machine = {
241
    .name = "realview-eb",
219 242
    .desc = "ARM RealView Emulation Baseboard (ARM926EJ-S)",
220
    .init = realview_init,
243
    .init = realview_eb_init,
244
    .use_scsi = 1,
245
};
246

  
247
static QEMUMachine realview_eb_mpcore_machine = {
248
    .name = "realview-eb-mpcore",
249
    .desc = "ARM RealView Emulation Baseboard (ARM11MPCore)",
250
    .init = realview_eb_mpcore_init,
221 251
    .use_scsi = 1,
252
    .max_cpus = 4,
222 253
};
223 254

  
224 255
static void realview_machine_init(void)
225 256
{
226
    qemu_register_machine(&realview_machine);
257
    qemu_register_machine(&realview_eb_machine);
258
    qemu_register_machine(&realview_eb_mpcore_machine);
227 259
}
228 260

  
229 261
machine_init(realview_machine_init);

Also available in: Unified diff