PERFORCE change 192548 for review
John Baldwin
jhb at FreeBSD.org
Tue May 3 19:51:55 UTC 2011
http://p4web.freebsd.org/@@192548?ac=10
Change 192548 by jhb at jhb_jhbbsd on 2011/05/03 19:50:58
At least one BIOS enumerates all I/O ports as being decoded by
the Host-PCI bridge (which is actually correct), but we can't
handle that since we have ACPI devices that aren't treated as
children of pcib0. Add a hack for this case to punt on using
the I/O ports at all in that case.
Affected files ...
.. //depot/projects/pci/sys/dev/acpica/acpi_pcib_acpi.c#13 edit
Differences ...
==== //depot/projects/pci/sys/dev/acpica/acpi_pcib_acpi.c#13 (text+ko) ====
@@ -64,6 +64,7 @@
ACPI_BUFFER ap_prt; /* interrupt routing table */
#ifdef NEW_PCIB
struct pcib_host_resources ap_host_res;
+ int ap_ignore_ioports;
#endif
};
@@ -230,6 +231,16 @@
return (AE_OK);
}
+ if (type == SYS_RES_IOPORT) {
+ if (min == 0) {
+ device_printf(sc->ap_dev,
+ "Ignoring I/O port ranges\n");
+ sc->ap_ignore_ioports = 1;
+ }
+ if (sc->ap_ignore_ioports)
+ break;
+ }
+
/* XXX: Not sure this is correct? */
if (res->Data.Address.Decode != ACPI_POS_DECODE) {
device_printf(sc->ap_dev,
@@ -538,32 +549,27 @@
struct acpi_hpcib_softc *sc;
struct resource *r;
int error;
+#endif
+
+ /*
+ * If this is not a request for a specific resource range,
+ * exclude low resource ranges that are not generally suitable
+ * for PCI BARs, etc.
+ */
+ if (start + count - 1 != end) {
+ if (type == SYS_RES_MEMORY && start < acpi_host_mem_start)
+ start = acpi_host_mem_start;
+ if (type == SYS_RES_IOPORT && start < 0x1000)
+ start = 0x1000;
+ }
+#ifdef NEW_PCIB
sc = device_get_softc(dev);
error = pcib_host_res_alloc(&sc->ap_host_res, child, type, rid, start, end,
count, flags, &r);
if (error == 0)
return (r);
#endif
- /*
- * If no memory preference is given, use upper 32MB slot most
- * bioses use for their memory window. Typically other bridges
- * before us get in the way to assert their preferences on memory.
- * Hardcoding like this sucks, so a more MD/MI way needs to be
- * found to do it. This is typically only used on older laptops
- * that don't have pci busses behind pci bridge, so assuming > 32MB
- * is likely OK.
- *
- * PCI-PCI bridges may allocate smaller ranges for their windows,
- * but the heuristics here should apply to those, so we allow
- * several different end addresses.
- */
- if (type == SYS_RES_MEMORY && start == 0UL && (end == ~0UL ||
- end == 0xffffffff))
- start = acpi_host_mem_start;
- if (type == SYS_RES_IOPORT && start == 0UL && (end == ~0UL ||
- end == 0xffff || end == 0xffffffff))
- start = 0x1000;
return (bus_generic_alloc_resource(dev, child, type, rid, start, end,
count, flags));
}
More information about the p4-projects
mailing list