--- //depot/vendor/freebsd/src/sys/arm/arm/nexus.c +++ //depot/user/jhb/acpipci/arm/arm/nexus.c @@ -90,6 +90,8 @@ enum intr_polarity pol); static int nexus_deactivate_resource(device_t, device_t, int, int, struct resource *); +static int nexus_release_resource(device_t, device_t, int, int, + struct resource *); static int nexus_setup_intr(device_t dev, device_t child, struct resource *res, int flags, driver_filter_t *filt, driver_intr_t *intr, void *arg, void **cookiep); @@ -111,6 +113,7 @@ DEVMETHOD(bus_activate_resource, nexus_activate_resource), DEVMETHOD(bus_config_intr, nexus_config_intr), DEVMETHOD(bus_deactivate_resource, nexus_deactivate_resource), + DEVMETHOD(bus_release_resource, nexus_release_resource), DEVMETHOD(bus_setup_intr, nexus_setup_intr), DEVMETHOD(bus_teardown_intr, nexus_teardown_intr), #ifdef FDT @@ -200,6 +203,8 @@ struct rman *rm; int needactivate = flags & RF_ACTIVE; + flags &= ~RF_ACTIVE; + switch (type) { case SYS_RES_MEMORY: case SYS_RES_IOPORT: @@ -207,15 +212,14 @@ break; default: - return (0); + return (NULL); } rv = rman_reserve_resource(rm, start, end, count, flags, child); if (rv == 0) - return (0); + return (NULL); rman_set_rid(rv, *rid); - rman_set_bushandle(rv, rman_get_start(rv)); if (needactivate) { if (bus_activate_resource(child, type, *rid, rv)) { @@ -228,6 +232,20 @@ } static int +nexus_release_resource(device_t bus, device_t child, int type, int rid, + struct resource *res) +{ + int error; + + if (rman_get_flags(res) & RF_ACTIVE) { + error = bus_deactivate_resource(child, type, rid, res); + if (error) + return (error); + } + return (rman_release_resource(res)); +} + +static int nexus_config_intr(device_t dev, int irq, enum intr_trigger trig, enum intr_polarity pol) { --- //depot/vendor/freebsd/src/sys/arm/at91/at91.c +++ //depot/user/jhb/acpipci/arm/at91/at91.c @@ -333,12 +333,14 @@ struct resource_list_entry *rle; struct at91_ivar *ivar = device_get_ivars(child); struct resource_list *rl = &ivar->resources; - bus_space_handle_t bsh; + int needactivate = flags & RF_ACTIVE; if (device_get_parent(child) != dev) return (BUS_ALLOC_RESOURCE(device_get_parent(dev), child, type, rid, start, end, count, flags)); + flags &= ~RF_ACTIVE; + rle = resource_list_find(rl, type, *rid); if (rle == NULL) return (NULL); @@ -358,12 +360,6 @@ case SYS_RES_MEMORY: rle->res = rman_reserve_resource(&sc->sc_mem_rman, start, end, count, flags, child); - if (rle->res != NULL) { - bus_space_map(&at91_bs_tag, start, - rman_get_size(rle->res), 0, &bsh); - rman_set_bustag(rle->res, &at91_bs_tag); - rman_set_bushandle(rle->res, bsh); - } break; } if (rle->res) { @@ -371,6 +367,12 @@ rle->end = rman_get_end(rle->res); rle->count = count; rman_set_rid(rle->res, *rid); + if (needactivate) { + if (bus_activate_resource(child, type, *rid, rv)) { + rman_release_resource(rv); + return (NULL); + } + } } return (rle->res); } @@ -390,6 +392,7 @@ { struct resource_list *rl; struct resource_list_entry *rle; + int error; rl = at91_get_resource_list(dev, child); if (rl == NULL) @@ -397,9 +400,15 @@ rle = resource_list_find(rl, type, rid); if (rle == NULL) return (EINVAL); - rman_release_resource(r); - rle->res = NULL; - return (0); + if (rman_get_flags(r) & RF_ACTIVE) { + error = bus_deactivate_resource(child, type, rid, r); + if (error) + return (error); + } + error = rman_release_resource(r); + if (error == 0) + rle->res = NULL; + return (error); } static int @@ -434,19 +443,39 @@ at91_activate_resource(device_t bus, device_t child, int type, int rid, struct resource *r) { -#if 0 - u_long p; + bus_space_handle_t bsh; int error; - + + error = rman_activate_resource(r); + if (error) + return (error); if (type == SYS_RES_MEMORY) { - error = bus_space_map(rman_get_bustag(r), - rman_get_bushandle(r), rman_get_size(r), 0, &p); - if (error) + error = bus_space_map(&at91_bs_tag, rman_get_start(r), + rman_get_size(r), 0, &bsh); + if (error) { + rman_deactivate_resource(r); return (error); - rman_set_bushandle(r, p); + } + rman_set_bustag(r, &at91_bs_tag); + rman_set_bushandle(r, bsh); } -#endif - return (rman_activate_resource(r)); + return (0); +} + +static int +at91_deactivate_resource(device_t bus, device_t child, int type, int rid, + struct resource *r) +{ + bus_space_handle_t bsh; + int error; + + error = rman_deactivate_resource(r); + if (error) + return (error); + if (type == SYS_RES_MEMORY) + bus_space_unmap(&at91_bs_tag, rman_get_bushandle(r), + rman_get_size(r)); + return (0); } static int @@ -565,7 +594,7 @@ DEVMETHOD(bus_setup_intr, at91_setup_intr), DEVMETHOD(bus_teardown_intr, at91_teardown_intr), DEVMETHOD(bus_activate_resource, at91_activate_resource), - DEVMETHOD(bus_deactivate_resource, bus_generic_deactivate_resource), + DEVMETHOD(bus_deactivate_resource, at91_deactivate_resource), DEVMETHOD(bus_get_resource_list,at91_get_resource_list), DEVMETHOD(bus_set_resource, bus_generic_rl_set_resource), DEVMETHOD(bus_get_resource, bus_generic_rl_get_resource), --- //depot/vendor/freebsd/src/sys/arm/econa/econa.c +++ //depot/user/jhb/acpipci/arm/econa/econa.c @@ -521,11 +521,14 @@ struct resource_list_entry *rle; struct econa_ivar *ivar = device_get_ivars(child); struct resource_list *rl = &ivar->resources; + int needactivate; if (device_get_parent(child) != dev) return (BUS_ALLOC_RESOURCE(device_get_parent(dev), child, type, rid, start, end, count, flags)); + needactivate = flags & RF_ACTIVE; + flags &= ~RF_ACTIVE; rle = resource_list_find(rl, type, *rid); if (rle == NULL) { return (NULL); @@ -546,17 +549,20 @@ case SYS_RES_MEMORY: rle->res = rman_reserve_resource(&sc->ec_mem_rman, start, end, count, flags, child); - if (rle->res != NULL) { - rman_set_bustag(rle->res, &econa_bs_tag); - rman_set_bushandle(rle->res, start); - } break; } if (rle->res) { + rman_set_rid(rle->res, *rid); + if (needactivate) { + if (bus_activate_resource(child, type, *rid, + rle->res) != 0) { + rman_release_resource(rle->res); + return (NULL); + } + } rle->start = rman_get_start(rle->res); rle->end = rman_get_end(rle->res); rle->count = count; - rman_set_rid(rle->res, *rid); } return (rle->res); } @@ -575,6 +581,7 @@ { struct resource_list *rl; struct resource_list_entry *rle; + int error; rl = econa_get_resource_list(dev, child); if (rl == NULL) @@ -582,9 +589,15 @@ rle = resource_list_find(rl, type, rid); if (rle == NULL) return (EINVAL); - rman_release_resource(r); - rle->res = NULL; - return (0); + if (rman_get_flags(r) & RF_ACTIVE) { + error = bus_deactivate_resource(child, type, rid, r); + if (error) + return (error); + } + error = rman_release_resource(r); + if (error == 0) + rle->res = NULL; + return (error); } static int @@ -617,8 +630,28 @@ econa_activate_resource(device_t bus, device_t child, int type, int rid, struct resource *r) { + int error; + + if (device_get_parent(child) != bus) + return (bus_generic_activate_resource(bus, child, type, rid, + r)); + error = rman_activate_resource(r); + if (error == 0 && type == SYS_RES_MEMORY) { + rman_set_bustag(r, &econa_bs_tag); + rman_set_bushandle(r, rman_get_start(r)); + } + return (error); +} + +static int +econa_deactivate_resource(device_t bus, device_t child, int type, int rid, + struct resource *r) +{ - return (rman_activate_resource(r)); + if (device_get_parent(child) != bus) + return (bus_generic_deactivate_resource(bus, child, type, rid, + r)); + return (rman_deactivate_resource(r)); } static int @@ -740,7 +773,7 @@ DEVMETHOD(bus_setup_intr, econa_setup_intr), DEVMETHOD(bus_teardown_intr, econa_teardown_intr), DEVMETHOD(bus_activate_resource, econa_activate_resource), - DEVMETHOD(bus_deactivate_resource, bus_generic_deactivate_resource), + DEVMETHOD(bus_deactivate_resource, econa_deactivate_resource), DEVMETHOD(bus_get_resource_list, econa_get_resource_list), DEVMETHOD(bus_set_resource, bus_generic_rl_set_resource), DEVMETHOD(bus_get_resource, bus_generic_rl_get_resource), --- //depot/vendor/freebsd/src/sys/arm/mv/mv_localbus.c +++ //depot/user/jhb/acpipci/arm/mv/mv_localbus.c @@ -340,7 +340,8 @@ * Request for the default allocation with a given rid: use resource * list stored in the local device info. */ - if ((start == 0UL) && (end == ~0UL)) { + if ((start == 0UL) && (end == ~0UL) && + device_get_parent(child) == bus) { if ((di = device_get_ivars(child)) == NULL) return (NULL); --- //depot/vendor/freebsd/src/sys/arm/mv/mv_pci.c +++ //depot/user/jhb/acpipci/arm/mv/mv_pci.c @@ -336,6 +336,10 @@ u_long, u_long, u_long, u_int); static int mv_pcib_release_resource(device_t, device_t, int, int, struct resource *); +static int mv_pcib_activate_resource(device_t, device_t, int, int, + struct resource *); +static int mv_pcib_deactivate_resource(device_t, device_t, int, int, + struct resource *); static int mv_pcib_read_ivar(device_t, device_t, int, uintptr_t *); static int mv_pcib_write_ivar(device_t, device_t, int, uintptr_t); @@ -363,8 +367,8 @@ DEVMETHOD(bus_write_ivar, mv_pcib_write_ivar), DEVMETHOD(bus_alloc_resource, mv_pcib_alloc_resource), DEVMETHOD(bus_release_resource, mv_pcib_release_resource), - DEVMETHOD(bus_activate_resource, bus_generic_activate_resource), - DEVMETHOD(bus_deactivate_resource, bus_generic_deactivate_resource), + DEVMETHOD(bus_activate_resource, mv_pcib_activate_resource), + DEVMETHOD(bus_deactivate_resource, mv_pcib_deactivate_resource), DEVMETHOD(bus_setup_intr, bus_generic_setup_intr), DEVMETHOD(bus_teardown_intr, bus_generic_teardown_intr), @@ -859,13 +863,12 @@ (end > sc->sc_mem_base + sc->sc_mem_size - 1)) return (NULL); - res = rman_reserve_resource(rm, start, end, count, flags, child); + res = rman_reserve_resource(rm, start, end, count, flags & ~RF_ACTIVE, + child); if (res == NULL) return (NULL); rman_set_rid(res, *rid); - rman_set_bustag(res, fdtbus_bs_tag); - rman_set_bushandle(res, start); if (flags & RF_ACTIVE) if (bus_activate_resource(child, type, *rid, res)) { @@ -880,15 +883,51 @@ mv_pcib_release_resource(device_t dev, device_t child, int type, int rid, struct resource *res) { + int error; if (type != SYS_RES_IOPORT && type != SYS_RES_MEMORY) return (BUS_RELEASE_RESOURCE(device_get_parent(dev), child, type, rid, res)); + if (rman_get_flags(res) & RF_ACTIVE) { + error = bus_deactivate_resource(child, type, rid, res); + if (error) + return (error); + } return (rman_release_resource(res)); } static int +mv_pcib_activate_resource(device_t bus, device_t child, int type, int rid, + struct resource *r) +{ + int error; + + if (type != SYS_RES_IOPORT && type != SYS_RES_MEMORY) + return (bus_generic_activate_resource(bus, child, type, rid, + r)); + + error = rman_activate_resource(r); + if (error == 0) { + rman_set_bustag(r, fdtbus_bs_tag); + rman_set_bushandle(r, rman_get_start(r)); + } + return (error); +} + +static int +mv_pcib_deactivate_resource(device_t bus, device_t child, int type, int rid, + struct resource *r) +{ + + if (type != SYS_RES_IOPORT && type != SYS_RES_MEMORY) + return (bus_generic_deactivate_resource(bus, child, type, rid, + r)); + + return (rman_deactivate_resource(r)); +} + +static int mv_pcib_read_ivar(device_t dev, device_t child, int which, uintptr_t *result) { struct mv_pcib_softc *sc = device_get_softc(dev); --- //depot/vendor/freebsd/src/sys/arm/s3c2xx0/s3c24x0.c +++ //depot/user/jhb/acpipci/arm/s3c2xx0/s3c24x0.c @@ -124,6 +124,8 @@ u_long, u_long, u_long, u_int); static int s3c24x0_activate_resource(device_t, device_t, int, int, struct resource *); +static int s3c24x0_deactivate_resource(device_t, device_t, int, int, + struct resource *); static int s3c24x0_release_resource(device_t, device_t, int, int, struct resource *); static struct resource_list *s3c24x0_get_resource_list(device_t, device_t); @@ -139,6 +141,7 @@ DEVMETHOD(bus_config_intr, s3c24x0_config_intr), DEVMETHOD(bus_alloc_resource, s3c24x0_alloc_resource), DEVMETHOD(bus_activate_resource, s3c24x0_activate_resource), + DEVMETHOD(bus_deactivate_resource, s3c24x0_deactivate_resource), DEVMETHOD(bus_release_resource, s3c24x0_release_resource), DEVMETHOD(bus_get_resource_list,s3c24x0_get_resource_list), DEVMETHOD(bus_set_resource, bus_generic_rl_set_resource), @@ -343,13 +346,11 @@ case SYS_RES_MEMORY: res = rman_reserve_resource( &s3c2xx0_softc->s3c2xx0_mem_rman, - start, end, count, flags, child); + start, end, count, flags & ~RF_ACTIVE, child); if (res == NULL) panic("Unable to map address space %#lX-%#lX", start, end); - rman_set_bustag(res, &s3c2xx0_bs_tag); - rman_set_bushandle(res, start); if (flags & RF_ACTIVE) { if (bus_activate_resource(child, type, *rid, res)) { rman_release_resource(res); @@ -379,14 +380,42 @@ bus_space_handle_t p; int error; + if (device_get_parent(child) != bus) + return (bus_generic_activate_resource(bus, child, type, rid, + r)); + + error = rman_activate_resource(r); + if (error) + return (error); if (type == SYS_RES_MEMORY || type == SYS_RES_IOPORT) { - error = bus_space_map(rman_get_bustag(r), - rman_get_bushandle(r), rman_get_size(r), 0, &p); - if (error) + error = bus_space_map(&s3c2xx0_bs_tag, rman_get_start(r), + rman_get_size(r), 0, &p); + if (error) { + rman_deactivate_resource(r); return (error); + } + rman_set_bustag(r, &s3c2xx0_bs_tag); rman_set_bushandle(r, p); } - return (rman_activate_resource(r)); + return (0); +} + +static int +s3c24x0_deactivate_resource(device_t bus, device_t child, int type, int rid, + struct resource *r) +{ + int error; + + if (device_get_parent(child) != bus) + return (bus_generic_activate_resource(bus, child, type, rid, + r)); + error = rman_deactivate_resource(r); + if (error) + return (error); + if (type == SYS_RES_MEMORY || type == SYS_RES_IOPORT) { + bus_space_unmap(&s3c2xx0_bs_tag, rman_get_bushandle(r), + rman_get_size(r)); + return (0); } static int @@ -396,6 +425,7 @@ struct s3c2xx0_ivar *ivar = device_get_ivars(child); struct resource_list *rl = &ivar->resources; struct resource_list_entry *rle; + int error; if (rl == NULL) return (EINVAL); @@ -404,10 +434,17 @@ if (rle == NULL) return (EINVAL); - rman_release_resource(r); - rle->res = NULL; + if (rman_get_flags(r) & RF_ACTIVE) { + error = bus_deactivate_resource(child, type, rid, r); + if (error) + return (error); + } + + error = rman_release_resource(r); + if (error == 0) + rle->res = NULL; - return 0; + return (error); } static struct resource_list * --- //depot/vendor/freebsd/src/sys/arm/versatile/versatile_pci.c +++ //depot/user/jhb/acpipci/arm/versatile/versatile_pci.c @@ -326,7 +326,8 @@ return (NULL); } - rv = rman_reserve_resource(rm, start, end, count, flags, child); + rv = rman_reserve_resource(rm, start, end, count, flags & ~RF_ACTIVE, + child); if (rv == NULL) return (NULL); @@ -347,8 +348,11 @@ struct resource *r) { vm_offset_t vaddr; - int res; + int error; + error = rman_activate_resource(r); + if (error) + return (error); switch(type) { case SYS_RES_MEMORY: case SYS_RES_IOPORT: @@ -356,18 +360,42 @@ rman_get_size(r)); rman_set_bushandle(r, vaddr); rman_set_bustag(r, versatile_bus_space_pcimem); - res = rman_activate_resource(r); break; - case SYS_RES_IRQ: - res = (BUS_ACTIVATE_RESOURCE(device_get_parent(bus), - child, type, rid, r)); - break; - default: - res = ENXIO; - break; + } + + return (0); +} + +static int +versatile_pci_deactivate_resource(device_t bus, device_t child, int type, + int rid, struct resource *r) +{ + int error; + + error = rman_deactivate_resource(r); + if (error) + return (error); + switch (type) { + case SYS_RES_MEMORY: + case SYS_RES_IOPORT: + pmap_unmapdev((vm_offset_t)rman_get_bushandle(r), + rman_get_size(r)); } + return (0); +} - return (res); +static int +versatile_pci_release_resource(device_t bus, device_t child, int type, + int rid, struct resource *r) +{ + int error; + + if (rman_get_flags(r) & RF_ACTIVE) { + error = bus_deactivate_resource(child, type, rid, r); + if (error) + return (error); + } + return (rman_release_resource(r)); } static int @@ -493,9 +521,9 @@ DEVMETHOD(bus_read_ivar, versatile_pci_read_ivar), DEVMETHOD(bus_write_ivar, versatile_pci_write_ivar), DEVMETHOD(bus_alloc_resource, versatile_pci_alloc_resource), - DEVMETHOD(bus_release_resource, bus_generic_release_resource), + DEVMETHOD(bus_release_resource, versatile_pci_release_resource), DEVMETHOD(bus_activate_resource, versatile_pci_activate_resource), - DEVMETHOD(bus_deactivate_resource, bus_generic_deactivate_resource), + DEVMETHOD(bus_deactivate_resource, versatile_pci_deactivate_resource), DEVMETHOD(bus_setup_intr, versatile_pci_setup_intr), DEVMETHOD(bus_teardown_intr, versatile_pci_teardown_intr), --- //depot/vendor/freebsd/src/sys/arm/xscale/i80321/i80321_pci.c +++ //depot/user/jhb/acpipci/arm/xscale/i80321/i80321_pci.c @@ -282,8 +282,7 @@ struct i80321_pci_softc *sc = device_get_softc(bus); struct resource *rv; struct rman *rm; - bus_space_tag_t bt = NULL; - bus_space_handle_t bh = 0; + bus_handle_t bh = 0; switch (type) { case SYS_RES_IRQ: @@ -291,7 +290,6 @@ break; case SYS_RES_MEMORY: rm = &sc->sc_mem_rman; - bt = sc->sc_pcimem; bh = (start >= 0x80000000 && start < 0x84000000) ? 0x80000000 : sc->sc_mem; start &= (0x1000000 - 1); @@ -299,8 +297,6 @@ break; case SYS_RES_IOPORT: rm = &sc->sc_io_rman; - bt = sc->sc_pciio; - bh = sc->sc_io; if (start < sc->sc_io) { start = start - 0x90000000 + sc->sc_io; end = end - 0x90000000 + sc->sc_io; @@ -310,20 +306,21 @@ return (NULL); } - rv = rman_reserve_resource(rm, start, end, count, flags, child); + rv = rman_reserve_resource(rm, start, end, count, flags & ~RF_ACTIVE, + child); if (rv == NULL) return (NULL); rman_set_rid(rv, *rid); - if (type != SYS_RES_IRQ) { - if (type == SYS_RES_MEMORY) - bh += (rman_get_start(rv)); - rman_set_bustag(rv, bt); + if (type == SYS_RES_MEMORY) + /* + * XXX: This isn't quite right but we don't have a better way + * to pass this on to our activate_resource() routine. + */ rman_set_bushandle(rv, bh); - if (flags & RF_ACTIVE) { - if (bus_activate_resource(child, type, *rid, rv)) { - rman_release_resource(rv); - return (NULL); - } + if (flags & RF_ACTIVE) { + if (bus_activate_resource(child, type, *rid, rv)) { + rman_release_resource(rv); + return (NULL); } } return (rv); @@ -333,18 +330,64 @@ i80321_pci_activate_resource(device_t bus, device_t child, int type, int rid, struct resource *r) { + struct i80321_pci_softc *sc = device_get_softc(bus); u_long p; int error; - - if (type == SYS_RES_MEMORY) { - error = bus_space_map(rman_get_bustag(r), - rman_get_bushandle(r), rman_get_size(r), 0, &p); + + error = rman_activate_resource(r); + if (error) + return (error); + switch (type) { + case SYS_RES_MEMORY: + /* + * XXX: We rely on having the bushandle initially set to the + * start of the PCI memio window above. + */ +#ifdef NEW_PCIB +#error bushandle shuffling is incompatible with NEW_PCIB +#endif + error = bus_space_map(sc->sc_pcimem, rman_get_bushandle(r) + + rman_get_start(r), rman_get_size(r), 0, &p); if (error) return (error); + rman_set_bustag(r, sc->sc_pcimem); rman_set_bushandle(r, p); - + break; + case SYS_RES_IOPORT: + rman_set_bustag(r, sc->sc_pciio); + rman_set_bushandle(r, sc->sc_io); + break; + } + return (0); +} + +static int +i80321_pci_deactivate_resource(device_t bus, device_t child, int type, int rid, + struct resource *r) +{ + int error; + + error = rman_deactivate_resource(r); + if (error) + return (error); + if (type == SYS_RES_MEMORY) + bus_space_unmap(sc->sc_pcimem, rman_get_bushandle(r), + rman_get_size(r)); + return (0); +} + +static int +i80321_pci_release_resource(device_t bus, device_t child, int type, int rid, + struct resource *res) +{ + int error; + + if (rman_get_flags(res) & RF_ACTIVE) { + error = bus_deactivate_resource(child, type, rid, res); + if (error) + return (error); } - return (rman_activate_resource(r)); + return (rman_release_resource(res)); } static int @@ -375,9 +418,9 @@ DEVMETHOD(bus_read_ivar, i80321_read_ivar), DEVMETHOD(bus_write_ivar, i80321_write_ivar), DEVMETHOD(bus_alloc_resource, i80321_pci_alloc_resource), - DEVMETHOD(bus_release_resource, bus_generic_release_resource), + DEVMETHOD(bus_release_resource, i80321_pci_release_resource), DEVMETHOD(bus_activate_resource, i80321_pci_activate_resource), - DEVMETHOD(bus_deactivate_resource, bus_generic_deactivate_resource), + DEVMETHOD(bus_deactivate_resource, i80321_pci_deactivate_resource), DEVMETHOD(bus_setup_intr, i80321_pci_setup_intr), DEVMETHOD(bus_teardown_intr, i80321_pci_teardown_intr), --- //depot/vendor/freebsd/src/sys/arm/xscale/i80321/obio.c +++ //depot/user/jhb/acpipci/arm/xscale/i80321/obio.c @@ -98,8 +98,6 @@ { struct resource *rv; struct rman *rm; - bus_space_tag_t bt = NULL; - bus_space_handle_t bh = 0; struct obio_softc *sc = device_get_softc(bus); switch (type) { @@ -110,24 +108,24 @@ return (NULL); case SYS_RES_IOPORT: rm = &sc->oba_rman; - bt = sc->oba_st; - bh = sc->oba_addr; - start = bh; + start = sc->oba_addr; break; default: return (NULL); } - - rv = rman_reserve_resource(rm, start, end, count, flags, child); + rv = rman_reserve_resource(rm, start, end, count, flags & ~RF_ACTIVE, + child); if (rv == NULL) return (NULL); - if (type == SYS_RES_IRQ) - return (rv); rman_set_rid(rv, *rid); - rman_set_bustag(rv, bt); - rman_set_bushandle(rv, bh); + if (flags & RF_ACTIVE) { + if (bus_activate_resource(child, type, *rid, rv)) { + rman_release_resource(rv); + return (NULL); + } + } return (rv); } @@ -136,8 +134,15 @@ obio_activate_resource(device_t bus, device_t child, int type, int rid, struct resource *r) { - return (0); + struct obio_softc *sc = device_get_softc(bus); + + if (type == SYS_RES_IOPORT) { + rman_set_bustag(r, sc->oba_st); + rman_set_bushandle(r, sc->oba_addr); + } + return (rman_activate_resource(r)); } + static device_method_t obio_methods[] = { DEVMETHOD(device_probe, obio_probe), DEVMETHOD(device_attach, obio_attach), --- //depot/vendor/freebsd/src/sys/arm/xscale/i8134x/i81342_pci.c +++ //depot/user/jhb/acpipci/arm/xscale/i8134x/i81342_pci.c @@ -333,8 +333,7 @@ struct i81342_pci_softc *sc = device_get_softc(bus); struct resource *rv; struct rman *rm; - bus_space_tag_t bt = NULL; - bus_space_handle_t bh = 0; + u_long off; switch (type) { case SYS_RES_IRQ: @@ -342,41 +341,30 @@ break; case SYS_RES_MEMORY: rm = &sc->sc_mem_rman; - bt = &sc->sc_pcimem; - bh = 0; break; case SYS_RES_IOPORT: rm = &sc->sc_io_rman; - bt = &sc->sc_pciio; - bh = sc->sc_is_atux ? IOP34X_PCIX_OIOBAR_VADDR : + off = sc->sc_is_atux ? IOP34X_PCIX_OIOBAR_VADDR : IOP34X_PCIE_OIOBAR_VADDR; - start += bh; - end += bh; + start += off; + end += off; break; default: return (NULL); } - rv = rman_reserve_resource(rm, start, end, count, flags, child); + rv = rman_reserve_resource(rm, start, end, count, flags & ~RF_ACTIVE, + child); if (rv == NULL) return (NULL); rman_set_rid(rv, *rid); - if (type != SYS_RES_IRQ) { - if (type == SYS_RES_MEMORY) - bh += (rman_get_start(rv)); - rman_set_bustag(rv, bt); - rman_set_bushandle(rv, bh); - if (flags & RF_ACTIVE) { - if (bus_activate_resource(child, type, *rid, rv)) { - rman_release_resource(rv); - return (NULL); - } + if (flags & RF_ACTIVE) { + if (bus_activate_resource(child, type, *rid, rv)) { + rman_release_resource(rv); + return (NULL); } } return (rv); - - - return (NULL); } static int @@ -385,16 +373,57 @@ { u_long p; int error; - - if (type == SYS_RES_MEMORY) { - error = bus_space_map(rman_get_bustag(r), - rman_get_bushandle(r), rman_get_size(r), 0, &p); + + error = rman_activate_resource(r); + if (error) + return (error); + switch (type) { + case SYS_RES_MEMORY: + error = bus_space_map(&sc->sc_pcimem, rman_get_start(r), + rman_get_size(r), 0, &p); if (error) return (error); + rman_set_bustag(r, &sc->sc_pcimem); rman_set_bushandle(r, p); - + break; + case SYS_RES_IOPORT: + rman_set_bus_tag(r, &sc->sc_pciio); + if (sc->sc_is_atux) + rman_set_bushandle(r, IOP34X_PCIX_OIOBAR_VADDR); + else + rman_set_bushandle(r, IOP34X_PCIE_OIOBAR_VADDR); + break; + } + return (0); +} + +static int +i81342_pci_deactivate_resource(device_t bus, device_t child, int type, int rid, + struct resource *r) +{ + int error; + + error = rman_deactivate_resource(r); + if (error) + return (error); + if (type == SYS_RES_MEMORY) + bus_space_unmap(&sc->sc_pcimem, rman_get_bushandle(r), + rman_get_size(r)); + return (0); +} + +static int +i81342_pci_release_resource(device_t bus, device_t child, int type, int rid, + struct resource *res) +{ + int error; + + if (rman_get_flags(res) & RF_ACTIVE) { + error = bus_deactivate_resource(child, type, rid, res); + if (error) + return (error); } - return (rman_activate_resource(r)); + return (rman_release_resource(res)); } static int @@ -486,7 +515,6 @@ case PCIB_IVAR_BUS: *result = sc->sc_busno; return (0); - } return (ENOENT); } @@ -518,9 +546,9 @@ DEVMETHOD(bus_read_ivar, i81342_read_ivar), DEVMETHOD(bus_write_ivar, i81342_write_ivar), DEVMETHOD(bus_alloc_resource, i81342_pci_alloc_resource), - DEVMETHOD(bus_release_resource, bus_generic_release_resource), + DEVMETHOD(bus_release_resource, i81342_pci_release_resource), DEVMETHOD(bus_activate_resource, i81342_pci_activate_resource), - DEVMETHOD(bus_deactivate_resource, bus_generic_deactivate_resource), + DEVMETHOD(bus_deactivate_resource, i81342_pci_deactivate_resource), DEVMETHOD(bus_setup_intr, i81342_pci_setup_intr), DEVMETHOD(bus_teardown_intr, i81342_pci_teardown_intr), --- //depot/vendor/freebsd/src/sys/arm/xscale/i8134x/obio.c +++ //depot/user/jhb/acpipci/arm/xscale/i8134x/obio.c @@ -93,8 +93,6 @@ { struct resource *rv; struct rman *rm; - bus_space_tag_t bt = NULL; - bus_space_handle_t bh = 0; struct obio_softc *sc = device_get_softc(bus); int unit = device_get_unit(child); @@ -110,14 +108,11 @@ return (NULL); case SYS_RES_IOPORT: rm = &sc->oba_rman; - bt = sc->oba_st; if (unit == 0) { - bh = IOP34X_UART0_VADDR; - start = bh; + start = IOP34X_UART0_VADDR; end = IOP34X_UART1_VADDR; } else { - bh = IOP34X_UART1_VADDR; - start = bh; + start = IOP34X_UART1_VADDR; end = start + 0x40; } break; @@ -126,15 +121,18 @@ } - rv = rman_reserve_resource(rm, start, end, count, flags, child); + rv = rman_reserve_resource(rm, start, end, count, flags & ~RF_ACTIVE, + child); if (rv == NULL) return (NULL); - if (type == SYS_RES_IRQ) - return (rv); rman_set_rid(rv, *rid); - rman_set_bustag(rv, bt); - rman_set_bushandle(rv, bh); - + if (flags & RF_ACTIVE) { + if (bus_activate_resource(child, type, *rid, rv)) { + rman_release_resource(rv); + return (NULL); + } + } + return (rv); } @@ -143,8 +141,20 @@ obio_activate_resource(device_t bus, device_t child, int type, int rid, struct resource *r) { + int error; + + error = rman_activate_resource(r); + if (error) + return (error); + switch (type) { + case SYS_RES_IOPORT: + rman_set_bustag(r, sc->oba_st); + rman_set_bushandle(r, rman_get_start(r)); + break; + } return (0); } + static device_method_t obio_methods[] = { DEVMETHOD(device_probe, obio_probe), DEVMETHOD(device_attach, obio_attach), --- //depot/vendor/freebsd/src/sys/arm/xscale/ixp425/ixp425_pci.c +++ //depot/user/jhb/acpipci/arm/xscale/ixp425/ixp425_pci.c @@ -319,9 +319,12 @@ ixppcib_activate_resource(device_t bus, device_t child, int type, int rid, struct resource *r) { - struct ixppcib_softc *sc = device_get_softc(bus); + int error; + error = rman_activate_resource(r); + if (error) + return (error); switch (type) { case SYS_RES_IOPORT: rman_set_bustag(r, &sc->sc_pci_iot); @@ -334,7 +337,7 @@ break; } - return (rman_activate_resource(r)); + return (0); } static int --- //depot/vendor/freebsd/src/sys/arm/xscale/pxa/pxa_obio.c +++ //depot/user/jhb/acpipci/arm/xscale/pxa/pxa_obio.c @@ -292,6 +292,7 @@ struct obio_device *od; struct resource_list *rl; struct resource_list_entry *rle; + int error; od = (struct obio_device *)device_get_ivars(child); rl = &od->od_resources; @@ -306,18 +307,42 @@ if (!rle->res) panic("pxa_release_resource: resource entry is not busy"); - rman_release_resource(rle->res); - rle->res = NULL; + if (rman_get_flags(res) & RF_ACTIVE) { + error = bus_deactivate_resource(dev, child, type, rid, r); + if (error) + return (error); + } + error = rman_release_resource(rle->res); + if (error == 0) + rle->res = NULL; + + return (error); +} + +static int +pxa_activate_resource(device_t dev, device_t child, int type, int rid, + struct resource *r) +{ + struct obio_softc *sc; + int error; + sc = device_get_softc(dev); + error = rman_activate_resource(r); + if (error) + return (error); + if (type == SYS_RES_MEMORY) { + rman_set_bustag(r, sc->obio_bst); + rman_set_bushandle(r, rman_get_start(r)); + } return (0); } static int -pxa_activate_resource(device_t dev, device_t child, int type, int rid, +pxa_deactivate_resource(device_t dev, device_t child, int type, int rid, struct resource *r) { - return (rman_activate_resource(r)); + return (rman_deactivate_resource(r)); } static device_method_t pxa_methods[] = { @@ -335,6 +360,7 @@ DEVMETHOD(bus_alloc_resource, pxa_alloc_resource), DEVMETHOD(bus_release_resource, pxa_release_resource), DEVMETHOD(bus_activate_resource, pxa_activate_resource), + DEVMETHOD(bus_deactivate_resource, pxa_deactivate_resource), {0, 0} }; --- //depot/vendor/freebsd/src/sys/arm/xscale/pxa/pxa_smi.c +++ //depot/user/jhb/acpipci/arm/xscale/pxa/pxa_smi.c @@ -183,7 +183,6 @@ struct resource *rv; struct resource_list *rl; struct resource_list_entry *rle; - int needactivate; sc = (struct pxa_smi_softc *)device_get_softc(dev); smid = (struct smi_ivars *)device_get_ivars(child); @@ -198,20 +197,15 @@ if (rle->res != NULL) panic("pxa_smi_alloc_resource: resource is busy"); - needactivate = flags & RF_ACTIVE; - flags &= ~RF_ACTIVE; - switch (type) { case SYS_RES_MEMORY: rv = rman_reserve_resource(&sc->ps_mem, rle->start, rle->end, - rle->count, flags, child); + rle->count, flags & ~RF_ACTIVE, child); if (rv == NULL) return (NULL); rle->res = rv; rman_set_rid(rv, *rid); - rman_set_bustag(rv, sc->ps_bst); - rman_set_bushandle(rv, rle->start); - if (needactivate) { + if (flags & RF_ACTIVE) { if (bus_activate_resource(child, type, *rid, rv) != 0) { rman_release_resource(rv); return (NULL); @@ -225,12 +219,6 @@ rle->count, flags); if (rv == NULL) return (NULL); - if (needactivate) { - if (bus_activate_resource(child, type, *rid, rv) != 0) { - bus_release_resource(dev, type, *rid, rv); - return (NULL); - } - } break; @@ -248,6 +236,7 @@ struct smi_ivars *smid; struct resource_list *rl; struct resource_list_entry *rle; + int error; if (type == SYS_RES_IRQ) return (bus_release_resource(dev, SYS_RES_IRQ, rid, r)); @@ -264,10 +253,16 @@ if (rle->res == NULL) panic("pxa_smi_release_resource: resource entry not busy"); - rman_release_resource(rle->res); - rle->res = NULL; + if (rman_get_flags(res) & RF_ACTIVE) { + error = bus_deactivate_resource(child, type, rid, res); + if (error) + return (error); + } + error = rman_release_resource(rle->res); + if (error == 0) + rle->res = NULL; - return (0); + return (error); } static int @@ -275,17 +270,39 @@ struct resource *r) { struct pxa_smi_softc *sc; + vm_offset_t vaddr; + int error; sc = (struct pxa_smi_softc *)device_get_softc(dev); if (type == SYS_RES_IRQ) return (bus_activate_resource(dev, SYS_RES_IRQ, rid, r)); - rman_set_bushandle(r, (bus_space_handle_t)pmap_mapdev(rman_get_start(r), - rman_get_size(r))); + error = rman_activate_resource(r); + if (error == 0) { + vaddr = (vm_offset_t)pmap_mapdev(rman_get_start(r), + rman_get_size(r)); + rman_set_bustag(r, sc->ps_bst); + rman_set_bushandle(r, vaddr); + } return (rman_activate_resource(r)); } +static int +pxa_smi_deactivate_resource(device_t dev, device_t child, int type, int rid, + struct resource *r) +{ + int error; + + if (type == SYS_RES_IRQ) + return (bus_deactivate_resource(dev, SYS_RES_IRQ, rid, r)); + error = rman_deactivate_resource(r); + if (error == 0) + pmap_unmapdev((vm_offset_t)rman_get_bushandle(r), + rman_get_size(r)); + return (error); +} + static device_method_t pxa_smi_methods[] = { DEVMETHOD(device_probe, pxa_smi_probe), DEVMETHOD(device_attach, pxa_smi_attach), @@ -299,6 +316,7 @@ DEVMETHOD(bus_alloc_resource, pxa_smi_alloc_resource), DEVMETHOD(bus_release_resource, pxa_smi_release_resource), DEVMETHOD(bus_activate_resource, pxa_smi_activate_resource), + DEVMETHOD(bus_deactivate_resource, pxa_smi_deactivate_resource), {0, 0} };