PERFORCE change 128940 for review
Oleksandr Tymoshenko
gonzo at FreeBSD.org
Sun Nov 11 11:34:27 PST 2007
http://perforce.freebsd.org/chv.cgi?CH=128940
Change 128940 by gonzo at gonzo_jeeves on 2007/11/11 19:33:55
o Use all four windows (two memory, two IO) for resource
allocation, otherwise korina BARs content exhaust
IO window and vr devices fail to allocate resources.
Affected files ...
.. //depot/projects/mips2/src/sys/mips/mips32/idt/idtpci.c#5 edit
Differences ...
==== //depot/projects/mips2/src/sys/mips/mips32/idt/idtpci.c#5 (text+ko) ====
@@ -122,8 +122,8 @@
device_t sc_dev;
int sc_busno;
- struct rman sc_mem_rman;
- struct rman sc_io_rman;
+ struct rman sc_mem_rman[2];
+ struct rman sc_io_rman[2];
struct rman sc_irq_rman;
uint32_t sc_mem;
uint32_t sc_io;
@@ -241,20 +241,36 @@
/* Use KSEG1 to access IO ports for it is uncached */
sc->sc_io = 0;
- sc->sc_io_rman.rm_type = RMAN_ARRAY;
- sc->sc_io_rman.rm_descr = "IDTPCI I/O Ports";
- if (rman_init(&sc->sc_io_rman) != 0 ||
- rman_manage_region(&sc->sc_io_rman,
+ sc->sc_io_rman[0].rm_type = RMAN_ARRAY;
+ sc->sc_io_rman[0].rm_descr = "IDTPCI I/O Ports window 1";
+ if (rman_init(&sc->sc_io_rman[0]) != 0 ||
+ rman_manage_region(&sc->sc_io_rman[0],
+ IDT_PCIMEM2_BASE, IDT_PCIMEM2_BASE + IDT_PCIMEM2_SIZE - 1) != 0) {
+ panic("idtpci_attach: failed to set up I/O rman");
+ }
+
+ sc->sc_io_rman[1].rm_type = RMAN_ARRAY;
+ sc->sc_io_rman[1].rm_descr = "IDTPCI I/O Ports window 2";
+ if (rman_init(&sc->sc_io_rman[1]) != 0 ||
+ rman_manage_region(&sc->sc_io_rman[1],
IDT_PCIMEM3_BASE, IDT_PCIMEM3_BASE + IDT_PCIMEM3_SIZE - 1) != 0) {
panic("idtpci_attach: failed to set up I/O rman");
}
/* Use KSEG1 to access PCI memory for it is uncached */
sc->sc_mem = 0;
- sc->sc_mem_rman.rm_type = RMAN_ARRAY;
- sc->sc_mem_rman.rm_descr = "IDTPCI PCI Memory";
- if (rman_init(&sc->sc_mem_rman) != 0 ||
- rman_manage_region(&sc->sc_mem_rman,
+ sc->sc_mem_rman[0].rm_type = RMAN_ARRAY;
+ sc->sc_mem_rman[0].rm_descr = "IDTPCI PCI Memory window 1";
+ if (rman_init(&sc->sc_mem_rman[0]) != 0 ||
+ rman_manage_region(&sc->sc_mem_rman[0],
+ IDT_PCIMEM0_BASE, IDT_PCIMEM0_BASE + IDT_PCIMEM0_SIZE) != 0) {
+ panic("idtpci_attach: failed to set up memory rman");
+ }
+
+ sc->sc_mem_rman[1].rm_type = RMAN_ARRAY;
+ sc->sc_mem_rman[1].rm_descr = "IDTPCI PCI Memory window 2";
+ if (rman_init(&sc->sc_mem_rman[1]) != 0 ||
+ rman_manage_region(&sc->sc_mem_rman[1],
IDT_PCIMEM1_BASE, IDT_PCIMEM1_BASE + IDT_PCIMEM1_SIZE) != 0) {
panic("idtpci_attach: failed to set up memory rman");
}
@@ -458,25 +474,34 @@
struct idtpci_softc *sc = device_get_softc(bus);
struct resource *rv = NULL;
- struct rman *rm;
+ struct rman *rm1, *rm2;
bus_space_handle_t bh = 0;
void *vaddr;
+
switch (type) {
case SYS_RES_IRQ:
- rm = &sc->sc_irq_rman;
+ rm1 = &sc->sc_irq_rman;
+ rm2 = NULL;
break;
case SYS_RES_MEMORY:
- rm = &sc->sc_mem_rman;
+ rm1 = &sc->sc_mem_rman[0];
+ rm2 = &sc->sc_mem_rman[1];
break;
case SYS_RES_IOPORT:
- rm = &sc->sc_io_rman;
+ rm1 = &sc->sc_io_rman[0];
+ rm2 = &sc->sc_io_rman[1];
break;
default:
return (NULL);
}
- rv = rman_reserve_resource(rm, start, end, count, flags, child);
+ rv = rman_reserve_resource(rm1, start, end, count, flags, child);
+
+ /* Try second window if it exists */
+ if ((rv == NULL) && (rm2 != NULL))
+ rv = rman_reserve_resource(rm2, start, end, count, flags,
+ child);
if (rv == NULL)
return (NULL);
More information about the p4-projects
mailing list