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