summaryrefslogtreecommitdiffstats
path: root/sys
diff options
context:
space:
mode:
authormsmith <msmith@FreeBSD.org>2000-10-28 23:07:13 +0000
committermsmith <msmith@FreeBSD.org>2000-10-28 23:07:13 +0000
commit0d5903ca0dac4df6988fe677e4aa25979fff036d (patch)
tree8a4bbfc06a86dff23c07c0731f41818dcb0de6e4 /sys
parent37fb3925f347ba163a545489363c145a68805b66 (diff)
downloadFreeBSD-src-0d5903ca0dac4df6988fe677e4aa25979fff036d.zip
FreeBSD-src-0d5903ca0dac4df6988fe677e4aa25979fff036d.tar.gz
Unconditionally turning on the I/O and memory enable bits in the PCI
command register is too aggressive. Revert to the previous behaviour, but leave the new behaviour available as an undocumented option. It's not clear what the Right, Right Thing is to do here, but the more conservative approach is safer.
Diffstat (limited to 'sys')
-rw-r--r--sys/dev/pci/pci.c15
-rw-r--r--sys/pci/pci.c15
2 files changed, 28 insertions, 2 deletions
diff --git a/sys/dev/pci/pci.c b/sys/dev/pci/pci.c
index 255cc2e..5bf9b37 100644
--- a/sys/dev/pci/pci.c
+++ b/sys/dev/pci/pci.c
@@ -985,7 +985,14 @@ pci_add_map(device_t pcib, int b, int s, int f, int reg,
else
printf(", enabled\n");
}
-
+
+ /*
+ * This code theoretically does the right thing, but has
+ * undesirable side effects in some cases where
+ * peripherals respond oddly to having these bits
+ * enabled. Leave them alone by default.
+ */
+#ifdef PCI_ENABLE_IO_MODES
/* Turn on resources that have been left off by a lazy BIOS */
if (type == SYS_RES_IOPORT && !pci_porten(pcib, b, s, f)) {
cmd = PCIB_READ_CONFIG(pcib, b, s, f, PCIR_COMMAND, 2);
@@ -997,6 +1004,12 @@ pci_add_map(device_t pcib, int b, int s, int f, int reg,
cmd |= PCIM_CMD_MEMEN;
PCIB_WRITE_CONFIG(pcib, b, s, f, PCIR_COMMAND, cmd, 2);
}
+#else
+ if (type == SYS_RES_IOPORT && !pci_porten(cfg))
+ return 1;
+ if (type == SYS_RES_MEMORY && !pci_memen(cfg))
+ return 1;
+#endif
resource_list_add(rl, type, reg,
base, base + (1 << ln2size) - 1,
diff --git a/sys/pci/pci.c b/sys/pci/pci.c
index 255cc2e..5bf9b37 100644
--- a/sys/pci/pci.c
+++ b/sys/pci/pci.c
@@ -985,7 +985,14 @@ pci_add_map(device_t pcib, int b, int s, int f, int reg,
else
printf(", enabled\n");
}
-
+
+ /*
+ * This code theoretically does the right thing, but has
+ * undesirable side effects in some cases where
+ * peripherals respond oddly to having these bits
+ * enabled. Leave them alone by default.
+ */
+#ifdef PCI_ENABLE_IO_MODES
/* Turn on resources that have been left off by a lazy BIOS */
if (type == SYS_RES_IOPORT && !pci_porten(pcib, b, s, f)) {
cmd = PCIB_READ_CONFIG(pcib, b, s, f, PCIR_COMMAND, 2);
@@ -997,6 +1004,12 @@ pci_add_map(device_t pcib, int b, int s, int f, int reg,
cmd |= PCIM_CMD_MEMEN;
PCIB_WRITE_CONFIG(pcib, b, s, f, PCIR_COMMAND, cmd, 2);
}
+#else
+ if (type == SYS_RES_IOPORT && !pci_porten(cfg))
+ return 1;
+ if (type == SYS_RES_MEMORY && !pci_memen(cfg))
+ return 1;
+#endif
resource_list_add(rl, type, reg,
base, base + (1 << ln2size) - 1,
OpenPOWER on IntegriCloud