Commit c190ea07290c3973f4549d6e2ed9e8b2cddaf497
1 parent
a94fd955
Add EBUS bridge
git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@6266 c046a42c-6fe2-441c-8c8c-71466251a162
Showing
3 changed files
with
56 additions
and
10 deletions
hw/apb_pci.c
| ... | ... | @@ -223,12 +223,11 @@ static void pci_apb_set_irq(qemu_irq *pic, int irq_num, int level) |
| 223 | 223 | |
| 224 | 224 | PCIBus *pci_apb_init(target_phys_addr_t special_base, |
| 225 | 225 | target_phys_addr_t mem_base, |
| 226 | - qemu_irq *pic) | |
| 226 | + qemu_irq *pic, PCIBus **bus2, PCIBus **bus3) | |
| 227 | 227 | { |
| 228 | 228 | APBState *s; |
| 229 | 229 | PCIDevice *d; |
| 230 | 230 | int pci_mem_config, pci_mem_data, apb_config, pci_ioport; |
| 231 | - PCIBus *secondary; | |
| 232 | 231 | |
| 233 | 232 | s = qemu_mallocz(sizeof(APBState)); |
| 234 | 233 | /* Ultrasparc PBM main bus */ |
| ... | ... | @@ -269,9 +268,9 @@ PCIBus *pci_apb_init(target_phys_addr_t special_base, |
| 269 | 268 | d->config[0x0E] = 0x00; // header_type |
| 270 | 269 | |
| 271 | 270 | /* APB secondary busses */ |
| 272 | - secondary = pci_bridge_init(s->bus, 8, 0x108e5000, pci_apb_map_irq, | |
| 273 | - "Advanced PCI Bus secondary bridge 1"); | |
| 274 | - pci_bridge_init(s->bus, 9, 0x108e5000, pci_apb_map_irq, | |
| 275 | - "Advanced PCI Bus secondary bridge 2"); | |
| 271 | + *bus2 = pci_bridge_init(s->bus, 8, 0x108e5000, pci_apb_map_irq, | |
| 272 | + "Advanced PCI Bus secondary bridge 1"); | |
| 273 | + *bus3 = pci_bridge_init(s->bus, 9, 0x108e5000, pci_apb_map_irq, | |
| 274 | + "Advanced PCI Bus secondary bridge 2"); | |
| 276 | 275 | return s->bus; |
| 277 | 276 | } | ... | ... |
hw/pci.h
| ... | ... | @@ -168,8 +168,9 @@ void pci_pcnet_init(PCIBus *bus, NICInfo *nd, int devfn); |
| 168 | 168 | PCIBus *pci_prep_init(qemu_irq *pic); |
| 169 | 169 | |
| 170 | 170 | /* apb_pci.c */ |
| 171 | -PCIBus *pci_apb_init(target_phys_addr_t special_base, target_phys_addr_t mem_base, | |
| 172 | - qemu_irq *pic); | |
| 171 | +PCIBus *pci_apb_init(target_phys_addr_t special_base, | |
| 172 | + target_phys_addr_t mem_base, | |
| 173 | + qemu_irq *pic, PCIBus **bus2, PCIBus **bus3); | |
| 173 | 174 | |
| 174 | 175 | /* sh_pci.c */ |
| 175 | 176 | PCIBus *sh_pci_register_bus(pci_set_irq_fn set_irq, pci_map_irq_fn map_irq, | ... | ... |
hw/sun4u.c
| ... | ... | @@ -344,6 +344,48 @@ static const int parallel_irq[MAX_PARALLEL_PORTS] = { 7, 7, 7 }; |
| 344 | 344 | |
| 345 | 345 | static fdctrl_t *floppy_controller; |
| 346 | 346 | |
| 347 | +static void ebus_mmio_mapfunc(PCIDevice *pci_dev, int region_num, | |
| 348 | + uint32_t addr, uint32_t size, int type) | |
| 349 | +{ | |
| 350 | + DPRINTF("Mapping region %d registers at %08x\n", region_num, addr); | |
| 351 | + switch (region_num) { | |
| 352 | + case 0: | |
| 353 | + isa_mmio_init(addr, 0x1000000); | |
| 354 | + break; | |
| 355 | + case 1: | |
| 356 | + isa_mmio_init(addr, 0x800000); | |
| 357 | + break; | |
| 358 | + } | |
| 359 | +} | |
| 360 | + | |
| 361 | +/* EBUS (Eight bit bus) bridge */ | |
| 362 | +static void | |
| 363 | +pci_ebus_init(PCIBus *bus, int devfn) | |
| 364 | +{ | |
| 365 | + PCIDevice *s; | |
| 366 | + | |
| 367 | + s = pci_register_device(bus, "EBUS", sizeof(*s), devfn, NULL, NULL); | |
| 368 | + s->config[0x00] = 0x8e; // vendor_id : Sun | |
| 369 | + s->config[0x01] = 0x10; | |
| 370 | + s->config[0x02] = 0x00; // device_id | |
| 371 | + s->config[0x03] = 0x10; | |
| 372 | + s->config[0x04] = 0x06; // command = bus master, pci mem | |
| 373 | + s->config[0x05] = 0x00; | |
| 374 | + s->config[0x06] = 0xa0; // status = fast back-to-back, 66MHz, no error | |
| 375 | + s->config[0x07] = 0x03; // status = medium devsel | |
| 376 | + s->config[0x08] = 0x01; // revision | |
| 377 | + s->config[0x09] = 0x00; // programming i/f | |
| 378 | + s->config[0x0A] = 0x80; // class_sub = misc bridge | |
| 379 | + s->config[0x0B] = 0x06; // class_base = PCI_bridge | |
| 380 | + s->config[0x0D] = 0x0a; // latency_timer | |
| 381 | + s->config[0x0E] = 0x00; // header_type | |
| 382 | + | |
| 383 | + pci_register_io_region(s, 0, 0x1000000, PCI_ADDRESS_SPACE_MEM, | |
| 384 | + ebus_mmio_mapfunc); | |
| 385 | + pci_register_io_region(s, 1, 0x800000, PCI_ADDRESS_SPACE_MEM, | |
| 386 | + ebus_mmio_mapfunc); | |
| 387 | +} | |
| 388 | + | |
| 347 | 389 | static void sun4uv_init(ram_addr_t RAM_size, int vga_ram_size, |
| 348 | 390 | const char *boot_devices, DisplayState *ds, |
| 349 | 391 | const char *kernel_filename, const char *kernel_cmdline, |
| ... | ... | @@ -357,7 +399,7 @@ static void sun4uv_init(ram_addr_t RAM_size, int vga_ram_size, |
| 357 | 399 | unsigned int i; |
| 358 | 400 | ram_addr_t ram_offset, prom_offset, vga_ram_offset; |
| 359 | 401 | long initrd_size, kernel_size; |
| 360 | - PCIBus *pci_bus; | |
| 402 | + PCIBus *pci_bus, *pci_bus2, *pci_bus3; | |
| 361 | 403 | QEMUBH *bh; |
| 362 | 404 | qemu_irq *irq; |
| 363 | 405 | int drive_index; |
| ... | ... | @@ -462,13 +504,17 @@ static void sun4uv_init(ram_addr_t RAM_size, int vga_ram_size, |
| 462 | 504 | } |
| 463 | 505 | } |
| 464 | 506 | } |
| 465 | - pci_bus = pci_apb_init(APB_SPECIAL_BASE, APB_MEM_BASE, NULL); | |
| 507 | + pci_bus = pci_apb_init(APB_SPECIAL_BASE, APB_MEM_BASE, NULL, &pci_bus2, | |
| 508 | + &pci_bus3); | |
| 466 | 509 | isa_mem_base = VGA_BASE; |
| 467 | 510 | vga_ram_offset = qemu_ram_alloc(vga_ram_size); |
| 468 | 511 | pci_vga_init(pci_bus, ds, phys_ram_base + vga_ram_offset, |
| 469 | 512 | vga_ram_offset, vga_ram_size, |
| 470 | 513 | 0, 0); |
| 471 | 514 | |
| 515 | + // XXX Should be pci_bus3 | |
| 516 | + pci_ebus_init(pci_bus, -1); | |
| 517 | + | |
| 472 | 518 | i = 0; |
| 473 | 519 | if (hwdef->console_serial_base) { |
| 474 | 520 | serial_mm_init(hwdef->console_serial_base, 0, NULL, 115200, | ... | ... |