PERFORCE change 230215 for review
John Baldwin
jhb at FreeBSD.org
Thu Jun 27 02:23:21 UTC 2013
http://p4web.freebsd.org/@@230215?ac=10
Change 230215 by jhb at jhb_pipkin on 2013/06/27 02:22:25
- Give the PCI bus driver its own release_resource method
so it can free resources for PCI-PCI bridge windows.
- Fix a few bugs with walking the ISA non-alias ranges.
With these changes a system with a bridge with ISA enabled set
is able to boot ok and appears to DTRT with allocating the little
subranges instead of the big I/O port range.
Affected files ...
.. //depot/projects/pci/sys/dev/pci/pci.c#40 edit
.. //depot/projects/pci/sys/dev/pci/pci_pci.c#33 edit
.. //depot/projects/pci/sys/dev/pci/pci_private.h#14 edit
Differences ...
==== //depot/projects/pci/sys/dev/pci/pci.c#40 (text+ko) ====
@@ -156,7 +156,7 @@
DEVMETHOD(bus_delete_resource, pci_delete_resource),
DEVMETHOD(bus_alloc_resource, pci_alloc_resource),
DEVMETHOD(bus_adjust_resource, bus_generic_adjust_resource),
- DEVMETHOD(bus_release_resource, bus_generic_rl_release_resource),
+ DEVMETHOD(bus_release_resource, pci_release_resource),
DEVMETHOD(bus_activate_resource, pci_activate_resource),
DEVMETHOD(bus_deactivate_resource, pci_deactivate_resource),
DEVMETHOD(bus_child_detached, pci_child_detached),
@@ -4248,11 +4248,11 @@
pci_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 pci_devinfo *dinfo = device_get_ivars(child);
- struct resource_list *rl = &dinfo->resources;
+ struct pci_devinfo *dinfo;
+ struct resource_list *rl;
struct resource_list_entry *rle;
struct resource *res;
- pcicfgregs *cfg = &dinfo->cfg;
+ pcicfgregs *cfg;
if (device_get_parent(child) != dev)
return (BUS_ALLOC_RESOURCE(device_get_parent(dev), child,
@@ -4261,6 +4261,9 @@
/*
* Perform lazy resource allocation
*/
+ dinfo = device_get_ivars(child);
+ rl = &dinfo->resources;
+ cfg = &dinfo->cfg;
switch (type) {
case SYS_RES_IRQ:
/*
@@ -4316,6 +4319,41 @@
}
int
+pci_release_resource(device_t dev, device_t child, int type, int rid,
+ struct resource *r)
+{
+ struct pci_devinfo *dinfo;
+ struct resource_list *rl;
+ pcicfgregs *cfg;
+
+ if (device_get_parent(child) != dev)
+ return (BUS_RELEASE_RESOURCE(device_get_parent(dev), child,
+ type, rid, r));
+
+ dinfo = device_get_ivars(child);
+ cfg = &dinfo->cfg;
+#ifdef NEW_PCIB
+ /*
+ * PCI-PCI bridge I/O window resources are not BARs. For
+ * those allocations just pass the request up the tree.
+ */
+ if (cfg->hdrtype == PCIM_HDRTYPE_BRIDGE &&
+ (type == SYS_RES_IOPORT || type == SYS_RES_MEMORY)) {
+ switch (rid) {
+ case PCIR_IOBASEL_1:
+ case PCIR_MEMBASE_1:
+ case PCIR_PMBASEL_1:
+ return (bus_generic_release_resource(dev, child, type,
+ rid, r));
+ }
+ }
+#endif
+
+ rl = &dinfo->resources;
+ return (resource_list_release(rl, dev, child, type, rid, r));
+}
+
+int
pci_activate_resource(device_t dev, device_t child, int type, int rid,
struct resource *r)
{
==== //depot/projects/pci/sys/dev/pci/pci_pci.c#33 (text+ko) ====
@@ -272,22 +272,25 @@
{
u_long next_end;
- /* ISA aliases are only in the lower 64KB of I/O space. */
- while (start <= MIN(end, 65535)) {
- /*
- * If start is within an ISA alias range, move up to
- * the start of the next non-alias range. As a
- * special case, addresses in the range 0x000 - 0x0ff
- * should also be skipped since those are used for
- * various system I/O devices in ISA systems.
- */
+ /*
+ * If start is within an ISA alias range, move up to the start
+ * of the next non-alias range. As a special case, addresses
+ * in the range 0x000 - 0x0ff should also be skipped since
+ * those are used for various system I/O devices in ISA
+ * systems.
+ */
+ if (start <= 65535) {
if (start < 0x100 || (start & 0x300) != 0) {
- start &= ~0x3fful;
+ start &= ~0x3ff;
start += 0x400;
}
+ }
+
+ /* ISA aliases are only in the lower 64KB of I/O space. */
+ while (start <= MIN(end, 65535)) {
next_end = MIN(start | 0xff, end);
- cb(start, end, arg);
- start = next_end + 1;
+ cb(start, next_end, arg);
+ start += 0x400;
}
if (start <= end)
==== //depot/projects/pci/sys/dev/pci/pci_private.h#14 (text+ko) ====
@@ -98,6 +98,8 @@
struct resource *pci_alloc_resource(device_t dev, device_t child,
int type, int *rid, u_long start, u_long end, u_long count,
u_int flags);
+int pci_release_resource(device_t dev, device_t child, int type,
+ int rid, struct resource *r);
int pci_activate_resource(device_t dev, device_t child, int type,
int rid, struct resource *r);
int pci_deactivate_resource(device_t dev, device_t child, int type,
More information about the p4-projects
mailing list