134
static qemu_irq *vpb_sic_init(uint32_t base, qemu_irq *parent, int irq)
129
static vpb_sic_state *vpb_sic_init(uint32_t base, void *parent, int irq)
136
131
vpb_sic_state *s;
140
134
s = (vpb_sic_state *)qemu_mallocz(sizeof(vpb_sic_state));
143
qi = qemu_allocate_irqs(vpb_sic_set_irq, s, 32);
137
s->handler = vpb_sic_set_irq;
145
139
s->parent = parent;
147
141
iomemtype = cpu_register_io_memory(0, vpb_sic_readfn,
148
142
vpb_sic_writefn, s);
149
cpu_register_physical_memory(base, 0x00001000, iomemtype);
143
cpu_register_physical_memory(base, 0x00000fff, iomemtype);
150
144
/* ??? Save/restore. */
154
148
/* Board init. */
157
151
peripherans and expansion busses. For now we emulate a subset of the
158
152
PB peripherals and just change the board ID. */
160
static struct arm_boot_info versatile_binfo;
162
static void versatile_init(ram_addr_t ram_size, int vga_ram_size,
163
const char *boot_device, DisplayState *ds,
154
static void versatile_init(int ram_size, int vga_ram_size, int boot_device,
155
DisplayState *ds, const char **fd_filename, int snapshot,
164
156
const char *kernel_filename, const char *kernel_cmdline,
165
const char *initrd_filename, const char *cpu_model,
157
const char *initrd_filename, int board_id)
175
166
int done_smc = 0;
179
cpu_model = "arm926";
180
env = cpu_init(cpu_model);
182
fprintf(stderr, "Unable to find CPU definition\n");
185
/* ??? RAM should repeat to fill physical memory space. */
169
cpu_arm_set_model(env, ARM_CPUID_ARM926);
170
/* ??? RAM shoud repeat to fill physical memory space. */
186
171
/* SDRAM at address zero. */
187
172
cpu_register_physical_memory(0, ram_size, IO_MEM_RAM);
189
174
arm_sysctl_init(0x10000000, 0x41007004);
190
175
pic = arm_pic_init_cpu(env);
191
pic = pl190_init(0x10140000, pic[0], pic[1]);
176
pic = pl190_init(0x10140000, pic, ARM_PIC_CPU_IRQ, ARM_PIC_CPU_FIQ);
192
177
sic = vpb_sic_init(0x10003000, pic, 31);
193
pl050_init(0x10006000, sic[3], 0);
194
pl050_init(0x10007000, sic[4], 1);
178
pl050_init(0x10006000, sic, 3, 0);
179
pl050_init(0x10007000, sic, 4, 1);
196
181
pci_bus = pci_vpb_init(sic, 27, 0);
197
182
/* The Versatile PCI bridge does not provide access to PCI IO space,
202
187
nd->model = done_smc ? "rtl8139" : "smc91c111";
203
188
if (strcmp(nd->model, "smc91c111") == 0) {
204
smc91c111_init(nd, 0x10010000, sic[25]);
189
smc91c111_init(nd, 0x10010000, sic, 25);
206
pci_nic_init(pci_bus, nd, -1);
191
pci_nic_init(pci_bus, nd);
209
194
if (usb_enabled) {
210
usb_ohci_init_pci(pci_bus, 3, -1);
212
if (drive_get_max_bus(IF_SCSI) > 0) {
213
fprintf(stderr, "qemu: too many SCSI bus\n");
195
usb_ohci_init(pci_bus, 3, -1);
216
197
scsi_hba = lsi_scsi_init(pci_bus, -1);
217
for (n = 0; n < LSI_MAX_DEVS; n++) {
218
index = drive_get_index(IF_SCSI, 0, n);
221
lsi_scsi_attach(scsi_hba, drives_table[index].bdrv, n);
198
for (n = 0; n < MAX_DISKS; n++) {
200
lsi_scsi_attach(scsi_hba, bs_table[n], n);
224
pl011_init(0x101f1000, pic[12], serial_hds[0], PL011_ARM);
225
pl011_init(0x101f2000, pic[13], serial_hds[1], PL011_ARM);
226
pl011_init(0x101f3000, pic[14], serial_hds[2], PL011_ARM);
227
pl011_init(0x10009000, sic[6], serial_hds[3], PL011_ARM);
204
pl011_init(0x101f1000, pic, 12, serial_hds[0]);
205
pl011_init(0x101f2000, pic, 13, serial_hds[1]);
206
pl011_init(0x101f3000, pic, 14, serial_hds[2]);
207
pl011_init(0x10009000, sic, 6, serial_hds[3]);
229
pl080_init(0x10130000, pic[17], 8);
230
sp804_init(0x101e2000, pic[4]);
231
sp804_init(0x101e3000, pic[5]);
209
pl080_init(0x10130000, pic, 17, 8);
210
sp804_init(0x101e2000, pic, 4);
211
sp804_init(0x101e3000, pic, 5);
233
213
/* The versatile/PB actually has a modified Color LCD controller
234
214
that includes hardware cursor support from the PL111. */
235
pl110_init(ds, 0x10120000, pic[16], 1);
237
index = drive_get_index(IF_SD, 0, 0);
239
fprintf(stderr, "qemu: missing SecureDigital card\n");
243
pl181_init(0x10005000, drives_table[index].bdrv, sic[22], sic[1]);
245
/* Disabled because there's no way of specifying a block device. */
246
pl181_init(0x1000b000, NULL, sic, 23, 2);
249
/* Add PL031 Real Time Clock. */
250
pl031_init(0x101e8000,pic[10]);
215
pl110_init(ds, 0x10120000, pic, 16, 1);
252
217
/* Memory map for Versatile/PB: */
253
218
/* 0x10000000 System registers. */
285
250
/* 0x101f3000 UART2. */
286
251
/* 0x101f4000 SSPI. */
288
versatile_binfo.ram_size = ram_size;
289
versatile_binfo.kernel_filename = kernel_filename;
290
versatile_binfo.kernel_cmdline = kernel_cmdline;
291
versatile_binfo.initrd_filename = initrd_filename;
292
versatile_binfo.board_id = board_id;
293
arm_load_kernel(env, &versatile_binfo);
296
static void vpb_init(ram_addr_t ram_size, int vga_ram_size,
297
const char *boot_device, DisplayState *ds,
298
const char *kernel_filename, const char *kernel_cmdline,
299
const char *initrd_filename, const char *cpu_model)
301
versatile_init(ram_size, vga_ram_size,
303
kernel_filename, kernel_cmdline,
304
initrd_filename, cpu_model, 0x183);
307
static void vab_init(ram_addr_t ram_size, int vga_ram_size,
308
const char *boot_device, DisplayState *ds,
309
const char *kernel_filename, const char *kernel_cmdline,
310
const char *initrd_filename, const char *cpu_model)
312
versatile_init(ram_size, vga_ram_size,
314
kernel_filename, kernel_cmdline,
315
initrd_filename, cpu_model, 0x25e);
253
arm_load_kernel(ram_size, kernel_filename, kernel_cmdline,
254
initrd_filename, board_id);
257
static void vpb_init(int ram_size, int vga_ram_size, int boot_device,
258
DisplayState *ds, const char **fd_filename, int snapshot,
259
const char *kernel_filename, const char *kernel_cmdline,
260
const char *initrd_filename)
262
versatile_init(ram_size, vga_ram_size, boot_device,
263
ds, fd_filename, snapshot,
264
kernel_filename, kernel_cmdline,
265
initrd_filename, 0x183);
268
static void vab_init(int ram_size, int vga_ram_size, int boot_device,
269
DisplayState *ds, const char **fd_filename, int snapshot,
270
const char *kernel_filename, const char *kernel_cmdline,
271
const char *initrd_filename)
273
versatile_init(ram_size, vga_ram_size, boot_device,
274
ds, fd_filename, snapshot,
275
kernel_filename, kernel_cmdline,
276
initrd_filename, 0x25e);
318
279
QEMUMachine versatilepb_machine = {