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,12 +223,11 @@ static void pci_apb_set_irq(qemu_irq *pic, int irq_num, int level) | ||
| 223 | 223 | ||
| 224 | PCIBus *pci_apb_init(target_phys_addr_t special_base, | 224 | PCIBus *pci_apb_init(target_phys_addr_t special_base, |
| 225 | target_phys_addr_t mem_base, | 225 | target_phys_addr_t mem_base, |
| 226 | - qemu_irq *pic) | 226 | + qemu_irq *pic, PCIBus **bus2, PCIBus **bus3) |
| 227 | { | 227 | { |
| 228 | APBState *s; | 228 | APBState *s; |
| 229 | PCIDevice *d; | 229 | PCIDevice *d; |
| 230 | int pci_mem_config, pci_mem_data, apb_config, pci_ioport; | 230 | int pci_mem_config, pci_mem_data, apb_config, pci_ioport; |
| 231 | - PCIBus *secondary; | ||
| 232 | 231 | ||
| 233 | s = qemu_mallocz(sizeof(APBState)); | 232 | s = qemu_mallocz(sizeof(APBState)); |
| 234 | /* Ultrasparc PBM main bus */ | 233 | /* Ultrasparc PBM main bus */ |
| @@ -269,9 +268,9 @@ PCIBus *pci_apb_init(target_phys_addr_t special_base, | @@ -269,9 +268,9 @@ PCIBus *pci_apb_init(target_phys_addr_t special_base, | ||
| 269 | d->config[0x0E] = 0x00; // header_type | 268 | d->config[0x0E] = 0x00; // header_type |
| 270 | 269 | ||
| 271 | /* APB secondary busses */ | 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 | return s->bus; | 275 | return s->bus; |
| 277 | } | 276 | } |
hw/pci.h
| @@ -168,8 +168,9 @@ void pci_pcnet_init(PCIBus *bus, NICInfo *nd, int devfn); | @@ -168,8 +168,9 @@ void pci_pcnet_init(PCIBus *bus, NICInfo *nd, int devfn); | ||
| 168 | PCIBus *pci_prep_init(qemu_irq *pic); | 168 | PCIBus *pci_prep_init(qemu_irq *pic); |
| 169 | 169 | ||
| 170 | /* apb_pci.c */ | 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 | /* sh_pci.c */ | 175 | /* sh_pci.c */ |
| 175 | PCIBus *sh_pci_register_bus(pci_set_irq_fn set_irq, pci_map_irq_fn map_irq, | 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,6 +344,48 @@ static const int parallel_irq[MAX_PARALLEL_PORTS] = { 7, 7, 7 }; | ||
| 344 | 344 | ||
| 345 | static fdctrl_t *floppy_controller; | 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 | static void sun4uv_init(ram_addr_t RAM_size, int vga_ram_size, | 389 | static void sun4uv_init(ram_addr_t RAM_size, int vga_ram_size, |
| 348 | const char *boot_devices, DisplayState *ds, | 390 | const char *boot_devices, DisplayState *ds, |
| 349 | const char *kernel_filename, const char *kernel_cmdline, | 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,7 +399,7 @@ static void sun4uv_init(ram_addr_t RAM_size, int vga_ram_size, | ||
| 357 | unsigned int i; | 399 | unsigned int i; |
| 358 | ram_addr_t ram_offset, prom_offset, vga_ram_offset; | 400 | ram_addr_t ram_offset, prom_offset, vga_ram_offset; |
| 359 | long initrd_size, kernel_size; | 401 | long initrd_size, kernel_size; |
| 360 | - PCIBus *pci_bus; | 402 | + PCIBus *pci_bus, *pci_bus2, *pci_bus3; |
| 361 | QEMUBH *bh; | 403 | QEMUBH *bh; |
| 362 | qemu_irq *irq; | 404 | qemu_irq *irq; |
| 363 | int drive_index; | 405 | int drive_index; |
| @@ -462,13 +504,17 @@ static void sun4uv_init(ram_addr_t RAM_size, int vga_ram_size, | @@ -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 | isa_mem_base = VGA_BASE; | 509 | isa_mem_base = VGA_BASE; |
| 467 | vga_ram_offset = qemu_ram_alloc(vga_ram_size); | 510 | vga_ram_offset = qemu_ram_alloc(vga_ram_size); |
| 468 | pci_vga_init(pci_bus, ds, phys_ram_base + vga_ram_offset, | 511 | pci_vga_init(pci_bus, ds, phys_ram_base + vga_ram_offset, |
| 469 | vga_ram_offset, vga_ram_size, | 512 | vga_ram_offset, vga_ram_size, |
| 470 | 0, 0); | 513 | 0, 0); |
| 471 | 514 | ||
| 515 | + // XXX Should be pci_bus3 | ||
| 516 | + pci_ebus_init(pci_bus, -1); | ||
| 517 | + | ||
| 472 | i = 0; | 518 | i = 0; |
| 473 | if (hwdef->console_serial_base) { | 519 | if (hwdef->console_serial_base) { |
| 474 | serial_mm_init(hwdef->console_serial_base, 0, NULL, 115200, | 520 | serial_mm_init(hwdef->console_serial_base, 0, NULL, 115200, |