PERFORCE change 191077 for review

John Baldwin jhb at FreeBSD.org
Tue Apr 5 19:43:06 UTC 2011


http://p4web.freebsd.org/@@191077?ac=10

Change 191077 by jhb at jhb_jhbbsd on 2011/04/05 19:42:58

	- Add some bootverbose printfs for debugging.
	- Compile.

Affected files ...

.. //depot/projects/pci/sys/amd64/pci/pci_bus.c#3 edit
.. //depot/projects/pci/sys/dev/acpica/acpi_pcib_acpi.c#3 edit
.. //depot/projects/pci/sys/dev/acpica/acpi_pcib_pci.c#2 edit
.. //depot/projects/pci/sys/dev/pci/pci_pci.c#8 edit
.. //depot/projects/pci/sys/dev/pci/pcib_private.h#6 edit
.. //depot/projects/pci/sys/i386/pci/pci_bus.c#3 edit
.. //depot/projects/pci/sys/sparc64/pci/apb.c#2 edit
.. //depot/projects/pci/sys/sparc64/pci/ofw_pcib.c#2 edit
.. //depot/projects/pci/sys/x86/pci/qpi.c#2 edit
.. //depot/projects/pci/sys/x86/x86/mptable_pci.c#3 edit

Differences ...

==== //depot/projects/pci/sys/amd64/pci/pci_bus.c#3 (text+ko) ====

@@ -35,6 +35,7 @@
 #include <sys/kernel.h>
 #include <sys/malloc.h>
 #include <sys/module.h>
+#include <sys/rman.h>
 #include <sys/sysctl.h>
 
 #include <dev/pci/pcivar.h>

==== //depot/projects/pci/sys/dev/acpica/acpi_pcib_acpi.c#3 (text+ko) ====

@@ -34,6 +34,7 @@
 #include <sys/kernel.h>
 #include <sys/malloc.h>
 #include <sys/module.h>
+#include <sys/rman.h>
 #include <sys/sysctl.h>
 
 #include <contrib/dev/acpica/include/acpi.h>

==== //depot/projects/pci/sys/dev/acpica/acpi_pcib_pci.c#2 (text+ko) ====

@@ -35,6 +35,7 @@
 #include <sys/kernel.h>
 #include <sys/malloc.h>
 #include <sys/module.h>
+#include <sys/rman.h>
 
 #include <contrib/dev/acpica/include/acpi.h>
 #include <contrib/dev/acpica/include/accommon.h>

==== //depot/projects/pci/sys/dev/pci/pci_pci.c#8 (text+ko) ====

@@ -36,14 +36,16 @@
  */
 
 #include <sys/param.h>
-#include <sys/systm.h>
+#include <sys/bus.h>
 #include <sys/kernel.h>
+#include <sys/libkern.h>
+#include <sys/malloc.h>
 #include <sys/module.h>
-#include <sys/bus.h>
-#include <machine/bus.h>
 #include <sys/rman.h>
 #include <sys/sysctl.h>
+#include <sys/systm.h>
 
+#include <machine/bus.h>
 #include <machine/resource.h>
 
 #include <dev/pci/pcivar.h>
@@ -118,13 +120,13 @@
 
 	switch (type) {
 	case SYS_RES_IOPORT:
-		return (rman_is_region_manager(r, &sc->io_rman));
+		return (rman_is_region_manager(r, &sc->io.rman));
 	case SYS_RES_MEMORY:
 		/* Prefetchable resources may live in either memory rman. */
 		if (rman_get_flags(r) & RF_PREFETCHABLE &&
-		    rman_is_region_manager(r, &sc->pmem_rman))
+		    rman_is_region_manager(r, &sc->pmem.rman))
 			return (1);
-		return (rman_is_region_manager(r, &sc->mem_rman));
+		return (rman_is_region_manager(r, &sc->mem.rman));
 	}
 	return (0);
 }
@@ -138,8 +140,9 @@
 
 static void
 pcib_alloc_window(struct pcib_softc *sc, struct pcib_window *w, int type,
-    int flags, const char *name, pci_addr_t max_address)
+    int flags, pci_addr_t max_address)
 {
+	char buf[64];
 	int error, rid;
 
 	if (max_address != (u_long)max_address)
@@ -147,20 +150,20 @@
 	w->rman.rm_start = 0;
 	w->rman.rm_end = max_address;
 	w->rman.rm_type = RMAN_ARRAY;
-	w->rman.rm_descr = malloc(64, M_DEVBUF, M_WAITOK);
-	snprintf(w->rman.rm_descr, 64, "%s %s window",
-	    device_get_nameunit(sc->dev), name);
+	snprintf(buf, sizeof(buf), "%s %s window",
+	    device_get_nameunit(sc->dev), w->name);
+	w->rman.rm_descr = strdup(buf, M_DEVBUF);
 	error = rman_init(&w->rman);
 	if (error)
 		panic("Failed to initialize %s %s rman",
-		    device_get_nameunit(sc->dev), name);
+		    device_get_nameunit(sc->dev), w->name);
 
 	if (!pcib_is_window_open(w))
 		return;
 
 	if (w->base > max_address || w->limit > max_address) {
 		device_printf(sc->dev,
-		    "initial %s window has too many bits, ignoring\n", name);
+		    "initial %s window has too many bits, ignoring\n", w->name);
 		return;
 	}
 	rid = w->reg;
@@ -168,15 +171,15 @@
 	    w->limit - w->base + 1, flags);
 	if (w->res == NULL) {
 		device_printf(sc->dev,
-		    "failed to allocate initial %s window: %jx - %jx\n",
-		    name, (uintmax_t)w->base, (uintmax_t)w->limit);
+		    "failed to allocate initial %s window: %#jx-%#jx\n",
+		    w->name, (uintmax_t)w->base, (uintmax_t)w->limit);
 		return;
 	}
 
 	error = rman_manage_region(&w->rman, rman_get_start(w->res),
 	    rman_get_end(w->res));
 	if (error)
-		panic("Failed to initialize rman with resource");	
+		panic("Failed to initialize rman with resource");
 }
 
 /*
@@ -188,7 +191,6 @@
 	pci_addr_t max;
 	device_t dev;
 	uint32_t val;
-	int rid;
 
 	dev = sc->dev;
 
@@ -212,6 +214,7 @@
 		sc->io.reg = PCIR_IOBASEL_1;
 		sc->io.step = 12;
 		sc->io.mask = WIN_IO;
+		sc->io.name = "I/O port";
 		if ((val & PCIM_BRIO_MASK) == PCIM_BRIO_32) {
 			sc->io.base = PCI_PPBIOBASE(
 			    pci_read_config(dev, PCIR_IOBASEH_1, 2), val);
@@ -225,8 +228,7 @@
 			    pci_read_config(dev, PCIR_IOLIMITL_1, 1));
 			max = 0xffff;
 		}
-		pcib_alloc_window(sc, &sc->io, SYS_RES_IOPORT, 0, "I/O port",
-		    max);
+		pcib_alloc_window(sc, &sc->io, SYS_RES_IOPORT, 0, max);
 	}
 
 	/* Read the existing memory window. */
@@ -234,12 +236,12 @@
 	sc->mem.reg = PCIR_MEMBASE_1;
 	sc->mem.step = 20;
 	sc->mem.mask = WIN_MEM;
+	sc->mem.name = "memory";
 	sc->mem.base = PCI_PPBMEMBASE(0,
 	    pci_read_config(dev, PCIR_MEMBASE_1, 2));
 	sc->mem.limit = PCI_PPBMEMLIMIT(0,
 	    pci_read_config(dev, PCIR_MEMLIMIT_1, 2));
-	pcib_alloc_window(sc, &sc->mem, SYS_RES_MEMORY, 0, "memory",
-	    0xffffffff);
+	pcib_alloc_window(sc, &sc->mem, SYS_RES_MEMORY, 0, 0xffffffff);
 
 	/* Determine if the prefetchable memory window is implemented. */
 	val = pci_read_config(dev, PCIR_PMBASEL_1, 2);
@@ -260,22 +262,23 @@
 	if (sc->pmem.valid) {
 		sc->pmem.reg = PCIR_PMBASEL_1;
 		sc->pmem.step = 20;
-		sc->omem.mask = WIN_PMEM;
+		sc->pmem.mask = WIN_PMEM;
+		sc->pmem.name = "prefetch";
 		if ((val & PCIM_BRPM_MASK) == PCIM_BRPM_64) {
 			sc->pmem.base = PCI_PPBMEMBASE(
-			    pci_read_config(dev, PCIR_PMBASEH_1, 4), pmemlow);
+			    pci_read_config(dev, PCIR_PMBASEH_1, 4), val);
 			sc->pmem.limit = PCI_PPBMEMLIMIT(
 			    pci_read_config(dev, PCIR_PMLIMITH_1, 4),
 			    pci_read_config(dev, PCIR_PMLIMITL_1, 2));
 			max = 0xffffffffffffffff;
 		} else {
-			sc->pmem.base = PCI_PPBMEMBASE(0, pmemlow);
+			sc->pmem.base = PCI_PPBMEMBASE(0, val);
 			sc->pmem.limit = PCI_PPBMEMLIMIT(0,
 			    pci_read_config(dev, PCIR_PMLIMITL_1, 2));
 			max = 0xffffffff;
 		}
 		pcib_alloc_window(sc, &sc->pmem, SYS_RES_MEMORY,
-		    RF_PREFETCHABLE, "prefetchable memory", max);
+		    RF_PREFETCHABLE, max);
 	}
 }
 
@@ -616,7 +619,7 @@
 	sc->flags |= PCIB_SUBTRACTIVE;
 
 #ifdef NEW_PCIB
-    pcib_probe_windows();
+    pcib_probe_windows(sc);
 #endif
     if (bootverbose) {
 	device_printf(dev, "  domain            %d\n", sc->domain);
@@ -745,6 +748,18 @@
 }
 
 #ifdef NEW_PCIB
+static const char *
+pcib_child_name(device_t child)
+{
+	static char buf[64];
+
+	if (device_get_nameunit(child) != NULL)
+		return (device_get_nameunit(child));
+	snprintf(buf, sizeof(buf), "pci%d:%d:%d:%d", pci_get_domain(child),
+	    pci_get_bus(child), pci_get_slot(child), pci_get_function(child));
+	return (buf);
+}
+
 /*
  * Attempt to allocate a resource from the existing resources assigned
  * to a window.
@@ -759,11 +774,16 @@
 	if (!pcib_is_window_open(w))
 		return (NULL);
 
-	res = rman_reserve_resource(&w->rm, start, end, count,
+	res = rman_reserve_resource(&w->rman, start, end, count,
 	    flags & ~RF_ACTIVE, child);
 	if (res == NULL)
 		return (NULL);
 
+	if (bootverbose)
+		device_printf(sc->dev,
+		    "allocated %s range (%#lx-%#lx) for rid %x of %s\n",
+		    w->name, rman_get_start(res), rman_get_end(res), *rid,
+		    pcib_child_name(child));
 	rman_set_rid(res, *rid);
 
 	/*
@@ -796,8 +816,10 @@
 	 * Clamp the desired resource range to the maximum address
 	 * this window supports.  Reject impossible requests.
 	 */
-	if (end > w->max_address)
-		end = w->max_address;
+	if (!w->valid)
+		return (EINVAL);
+	if (end > w->rman.rm_end)
+		end = w->rman.rm_end;
 	if (start + count > end || start + count < start)
 		return (EINVAL);
 
@@ -819,6 +841,11 @@
 		    count, flags);
 		if (w->res == NULL)
 			return (ENXIO);
+		if (bootverbose)
+			device_printf(sc->dev,
+			    "allocated initial %s window of %#lx-%#lx\n",
+			    w->name, rman_get_start(w->res),
+			    rman_get_end(w->res));
 		goto updatewin;
 	}
 
@@ -836,9 +863,13 @@
 	 * request size is larger than w->res, we should find the
 	 * optimal aligned buffer containing w->res and allocate that.
 	 */
-	align = 1ul << RF_ALIGNMENT_MASK(flags);
+	if (bootverbose)
+		device_printf(sc->dev,
+		    "attempting to grow %s window for (%#lx-%#lx,%#lx)\n",
+		    w->name, start, end, count);
+	align = 1ul << RF_ALIGNMENT(flags);
 	if (start < rman_get_start(w->res)) {
-		if (rman_first_free_region(&w->rm, &start_free, &end_free) !=
+		if (rman_first_free_region(&w->rman, &start_free, &end_free) !=
 		    0 || start_free != rman_get_start(w->res))
 			end_free = rman_get_start(w->res) - 1;
 		if (end_free > end)
@@ -855,6 +886,9 @@
 		 * ok, ensure it is properly aligned for this window.
 		 */
 		if (front >= start) {
+			if (bootverbose)
+				printf("\tfront candidate range: %#lx-%#lx\n",
+				    front, end_free);
 			front &= (1ul << w->step) - 1;
 			front = rman_get_start(w->res) - front;
 		} else
@@ -862,12 +896,12 @@
 	} else
 		front = 0;
 	if (end > rman_get_end(w->res)) {
-		if (rman_last_free_region(&w->rm, &start_free, &end_free) !=
+		if (rman_last_free_region(&w->rman, &start_free, &end_free) !=
 		    0 || end_free != rman_get_end(w->res))
 			start_free = rman_get_end(w->res) + 1;
 		if (start_free < start)
 			start_free = start;
-		
+
 		/* Move start_free up until it is properly aligned. */
 		start_free = roundup2(start_free, align);
 		back = start_free + count;
@@ -879,6 +913,9 @@
 		 * ok, ensure it is properly aligned for this window.
 		 */
 		if (back <= end) {
+			if (bootverbose)
+				printf("\tback candidate range: %#lx-%#lx\n",
+				    start_free, back);
 			back = roundup2(back, w->step) - 1;
 			back -= rman_get_end(w->res);
 		} else
@@ -893,14 +930,14 @@
 	error = ENOSPC;
 	while (front != 0 || back != 0) {
 		if (front != 0 && (front <= back || back == 0)) {
-			error = bus_adjust_resource(sc->dev, w->type, w->res,
+			error = bus_adjust_resource(sc->dev, type, w->res,
 			    rman_get_start(w->res) - front,
 			    rman_get_end(w->res));
 			if (error == 0)
 				break;
 			front = 0;
 		} else {
-			error = bus_adjust_resource(sc->dev, w->type, w->res,
+			error = bus_adjust_resource(sc->dev, type, w->res,
 			    rman_get_start(w->res),
 			    rman_get_end(w->res) + back);
 			if (error == 0)
@@ -911,6 +948,9 @@
 
 	if (error)
 		return (error);
+	if (bootverbose)
+		device_printf(sc->dev, "grew %s window to %#lx-%#lx\n",
+		    w->name, rman_get_start(w->res), rman_get_end(w->res));
 
 updatewin:
 	/* Save the new window. */
@@ -918,7 +958,7 @@
 	w->limit = rman_get_end(w->res);
 	KASSERT((w->base & ((1ul << w->step) - 1)) == 0,
 	    ("start address is not aligned"));
-	KASSERT((w->end & ((1ul << w->step) - 1)) == (1ul << w->step) - 1,
+	KASSERT((w->limit & ((1ul << w->step) - 1)) == (1ul << w->step) - 1,
 	    ("end address is not aligned"));
 	pcib_write_windows(sc, w->mask);
 	return (0);
@@ -929,7 +969,7 @@
  * is set up to, or capable of handling them.
  */
 struct resource *
-pcib_alloc_resource(device_t dev, device_t child, int type, int *rid, 
+pcib_alloc_resource(device_t dev, device_t child, int type, int *rid,
     u_long start, u_long end, u_long count, u_int flags)
 {
 	struct pcib_softc *sc;
@@ -942,8 +982,8 @@
 	 * the bridge control register.  VGA resources do not fall into
 	 * the resource windows and are passed up to the parent.
 	 */
-	if (type == SYS_RES_IOPORT && pci_is_vga_ioport_range(start, end) ||
-	    type == SYS_RES_MEMORY && pci_is_vga_memory_range(start, end)) {
+	if ((type == SYS_RES_IOPORT && pci_is_vga_ioport_range(start, end)) ||
+	    (type == SYS_RES_MEMORY && pci_is_vga_memory_range(start, end))) {
 		if (sc->bridgectl & PCIB_BCR_VGA_ENABLE)
 			return (bus_generic_alloc_resource(dev, child, type,
 			    rid, start, end, count, flags));
@@ -956,8 +996,8 @@
 	 * ISA enable bit.
 	 */
 #ifdef notyet
-	if (type == SYS_RES_IOPORT && pci_is_isa_ioport_range(start, end) ||
-	    type == SYS_RES_MEMORY && pci_is_isa_memory_range(start, end)) {
+	if ((type == SYS_RES_IOPORT && pci_is_isa_ioport_range(start, end)) ||
+	    (type == SYS_RES_MEMORY && pci_is_isa_memory_range(start, end))) {
 		if (sc->bridgectl & PCIB_BCR_ISA_ENABLE)
 			return (bus_generic_alloc_resource(dev, child, type,
 			    rid, start, end, count, flags));
@@ -972,7 +1012,7 @@
 	 */
 	if (sc->flags & PCIB_SUBTRACTIVE)
 		return (bus_generic_alloc_resource(dev, child, type, rid,
-		    stat, end, count, flags));
+		    start, end, count, flags));
 #endif
 
 	switch (type) {
@@ -983,7 +1023,8 @@
 			break;
 #ifdef SUBTRACTIVE_WITH_WINDOWS
 		if (sc->flags & PCIB_SUBTRACTIVE)
-			break;
+			return (bus_generic_alloc_resource(dev, child, type,
+			    rid, start, end, count, flags));
 #endif
 		if (pcib_grow_window(sc, &sc->io, type, start, end, count,
 		    flags) == 0)
@@ -1011,7 +1052,8 @@
 			break;
 #ifdef SUBTRACTIVE_WITH_WINDOWS
 		if (sc->flags & PCIB_SUBTRACTIVE)
-			break;
+			return (bus_generic_alloc_resource(dev, child, type,
+			    rid, start, end, count, flags));
 #endif
 		if (flags & RF_PREFETCHABLE) {
 			if (pcib_grow_window(sc, &sc->pmem, type, start, end,
@@ -1029,7 +1071,7 @@
 		break;
 	default:
 		return (bus_generic_alloc_resource(dev, child, type, rid,
-		    stat, end, count, flags));
+		    start, end, count, flags));
 	}
 	return (r);
 }

==== //depot/projects/pci/sys/dev/pci/pcib_private.h#6 (text+ko) ====

@@ -53,6 +53,7 @@
     int		valid;
     int		mask;		/* WIN_* bitmask of this window */
     int		step;		/* log_2 of window granularity */
+    const char	*name;
 };
 #endif
 

==== //depot/projects/pci/sys/i386/pci/pci_bus.c#3 (text+ko) ====

@@ -35,6 +35,7 @@
 #include <sys/kernel.h>
 #include <sys/malloc.h>
 #include <sys/module.h>
+#include <sys/rman.h>
 #include <sys/sysctl.h>
 
 #include <dev/pci/pcivar.h>

==== //depot/projects/pci/sys/sparc64/pci/apb.c#2 (text+ko) ====

@@ -48,6 +48,7 @@
 #include <sys/kernel.h>
 #include <sys/module.h>
 #include <sys/bus.h>
+#include <sys/rman.h>
 
 #include <dev/ofw/ofw_bus.h>
 #include <dev/ofw/openfirm.h>

==== //depot/projects/pci/sys/sparc64/pci/ofw_pcib.c#2 (text+ko) ====

@@ -42,6 +42,7 @@
 #include <sys/kernel.h>
 #include <sys/libkern.h>
 #include <sys/module.h>
+#include <sys/rman.h>
 
 #include <dev/ofw/ofw_bus.h>
 #include <dev/ofw/openfirm.h>

==== //depot/projects/pci/sys/x86/pci/qpi.c#2 (text+ko) ====

@@ -40,6 +40,7 @@
 #include <sys/kernel.h>
 #include <sys/malloc.h>
 #include <sys/module.h>
+#include <sys/rman.h>
 #include <sys/systm.h>
 
 #include <machine/cputypes.h>

==== //depot/projects/pci/sys/x86/x86/mptable_pci.c#3 (text+ko) ====

@@ -40,6 +40,7 @@
 #include <sys/bus.h>
 #include <sys/kernel.h>
 #include <sys/module.h>
+#include <sys/rman.h>
 
 #include <dev/pci/pcireg.h>
 #include <dev/pci/pcivar.h>


More information about the p4-projects mailing list