On Fri, Nov 08, 2002 at 05:45:00PM -0500, Matthew N. Dodd wrote the words in effect of:
> On Fri, 8 Nov 2002, Terry Lambert wrote:
> > "Matthew N. Dodd" wrote:
> > > Recompile your kernel with
> > >
> > > options PCI_ALLOW_UNSUPPORTED_IO_RANGE
> >
> > Given the number of times that this comes up, can we change that to
> > "PCI_ALLOW_ACTUALLY_SUPPORTED_IO_RANGE_WHICH_IS_NON_DEFAULT_TO_BE_ANNOYING"
> > ?
>
> I think the plan is to make this option a loader tunable and make the
> conditional in the pci code "bitchy" and then fix the larger problem with
> IO ranges.
Hi there.
I have made a basic patch, which took me about 10 minutes to do so.
Basically, it removes the option PCI_ALLOW_UNSUPPORTED_IO_RANGE, and
replaces it with a loader tunable. This is no different from imp's
change to make PCI_ENABLE_IO_MODES a l-tunable. But this time, I do not
have a sysctl to show the _readonly_ value, this is because the hw.pci
node leaves in pci.c and I am unsure of how to tackle that. I have not
tested this patch, so consider it experimental.
Also. If this patch works, then we will have to remove the
PCI_ALLOW_UNSUPPORTED_I0_RANGE from ``options'' files and add entries
for hw.pci.enable_io_modes and this loader tunable to the loader(8)
manual page or some such.
Patch also available at:
http://www.unixdaemons.com/~hiten/work/diffs/pci_pci.patch
Cheers.
P.S. hw.pci should moved somewhere global, but donno how this can be
done or even if it is possible to do.
--
Hiten Pandya
[EMAIL PROTECTED], [EMAIL PROTECTED], [EMAIL PROTECTED]
--- /home/hiten/pci_pci.c Fri Nov 8 17:25:52 2002
+++ /sys/dev/pci/pci_pci.c Fri Nov 8 19:11:03 2002
@@ -38,6 +38,9 @@
#include <sys/systm.h>
#include <sys/kernel.h>
#include <sys/bus.h>
+#if 0
+#include <sys/sysctl.h>
+#endif
#include <machine/resource.h>
@@ -90,6 +93,18 @@
DRIVER_MODULE(pcib, pci, pcib_driver, pcib_devclass, 0, 0);
/*
+ * sysctl and tunable vars
+ */
+int pci_allow_unsupported_io_range = 1;
+TUNABLE_INT("hw.pci.allow_unsupported_io_range",
+ (int *)&pci_allow_unsupported_io_range);
+#if 0
+SYSCTL_INT(_hw_pci, OID_AUTO, allow_unsupported_io_range, CTLFLAG_RD,
+ &pci_allow_unsupported_io_range, 1,
+ "Allows the PCI Bridge to pass through an unsupported memory range"
+ "assigned by the BIOS.");
+#endif
+/*
* Generic device interface
*/
static int
@@ -288,21 +303,23 @@
switch (type) {
case SYS_RES_IOPORT:
if (!pcib_is_isa_io(start)) {
-#ifndef PCI_ALLOW_UNSUPPORTED_IO_RANGE
- if (start < sc->iobase)
- start = sc->iobase;
- if (end > sc->iolimit)
- end = sc->iolimit;
- if (end < start)
- start = 0;
-#else
- if (start < sc->iobase)
- printf("start (%lx) < sc->iobase (%x)\n", start, sc->iobase);
- if (end > sc->iolimit)
- printf("end (%lx) > sc->iolimit (%x)\n", end, sc->iolimit);
- if (end < start)
- printf("end (%lx) < start (%lx)\n", end, start);
-#endif
+ if (!pci_allow_unsupported_io_range) {
+ if (start < sc->iobase)
+ start = sc->iobase;
+ if (end > sc->iolimit)
+ end = sc->iolimit;
+ if (end < start)
+ start = 0;
+ } else {
+ if (start < sc->iobase)
+ printf("start (%lx) < sc->iobase (%x)\n", start,
+ sc->iobase);
+ if (end > sc->iolimit)
+ printf("end (%lx) > sc->iolimit (%x)\n",
+ end, sc->iolimit);
+ if (end < start)
+ printf("end (%lx) < start (%lx)\n", end, start);
+ }
}
if (!pcib_is_isa_io(start) &&
((start < sc->iobase) || (end > sc->iolimit))) {
@@ -325,21 +342,23 @@
*/
case SYS_RES_MEMORY:
if (!pcib_is_isa_mem(start)) {
-#ifndef PCI_ALLOW_UNSUPPORTED_IO_RANGE
- if (start < sc->membase && end >= sc->membase)
- start = sc->membase;
- if (end > sc->memlimit)
- end = sc->memlimit;
- if (end < start)
- start = 0;
-#else
- if (start < sc->membase && end > sc->membase)
- printf("start (%lx) < sc->membase (%x)\n", start, sc->membase);
- if (end > sc->memlimit)
- printf("end (%lx) > sc->memlimit (%x)\n", end, sc->memlimit);
- if (end < start)
- printf("end (%lx) < start (%lx)\n", end, start);
-#endif
+ if (!pci_allow_unsupported_io_range) {
+ if (start < sc->membase && end >= sc->membase)
+ start = sc->membase;
+ if (end > sc->memlimit)
+ end = sc->memlimit;
+ if (end < start)
+ start = 0;
+ } else {
+ if (start < sc->membase && end > sc->membase)
+ printf("start (%lx) < sc->membase (%x)\n",
+ start, sc->membase);
+ if (end > sc->memlimit)
+ printf("end (%lx) > sc->memlimit (%x)\n",
+ end, sc->memlimit);
+ if (end < start)
+ printf("end (%lx) < start (%lx)\n", end, start);
+ }
}
if (!pcib_is_isa_mem(start) &&
(((start < sc->membase) || (end > sc->memlimit)) &&
@@ -351,9 +370,8 @@
device_get_name(child), device_get_unit(child), start,
end, sc->membase, sc->memlimit, sc->pmembase,
sc->pmemlimit);
-#ifndef PCI_ALLOW_UNSUPPORTED_IO_RANGE
- return(NULL);
-#endif
+ if (!pci_allow_unsupported_io_range)
+ return (NULL);
}
if (bootverbose)
device_printf(sc->dev, "device %s%d requested decoded memory range
0x%lx-0x%lx\n",