Commit c190ea07290c3973f4549d6e2ed9e8b2cddaf497

Authored by blueswir1
1 parent a94fd955

Add EBUS bridge

git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@6266 c046a42c-6fe2-441c-8c8c-71466251a162
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,