From owner-svn-src-head@FreeBSD.ORG Tue Mar 10 16:42:50 2009 Return-Path: Delivered-To: svn-src-head@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id 081C0106566B; Tue, 10 Mar 2009 16:42:50 +0000 (UTC) (envelope-from sam@FreeBSD.org) Received: from svn.freebsd.org (svn.freebsd.org [IPv6:2001:4f8:fff6::2c]) by mx1.freebsd.org (Postfix) with ESMTP id EAAD58FC2B; Tue, 10 Mar 2009 16:42:49 +0000 (UTC) (envelope-from sam@FreeBSD.org) Received: from svn.freebsd.org (localhost [127.0.0.1]) by svn.freebsd.org (8.14.3/8.14.3) with ESMTP id n2AGgnnN067660; Tue, 10 Mar 2009 16:42:49 GMT (envelope-from sam@svn.freebsd.org) Received: (from sam@localhost) by svn.freebsd.org (8.14.3/8.14.3/Submit) id n2AGgntw067658; Tue, 10 Mar 2009 16:42:49 GMT (envelope-from sam@svn.freebsd.org) Message-Id: <200903101642.n2AGgntw067658@svn.freebsd.org> From: Sam Leffler Date: Tue, 10 Mar 2009 16:42:49 +0000 (UTC) To: src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org X-SVN-Group: head MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Cc: Subject: svn commit: r189630 - head/sys/arm/xscale/ixp425 X-BeenThere: svn-src-head@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: SVN commit messages for the src tree for head/-current List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Tue, 10 Mar 2009 16:42:50 -0000 Author: sam Date: Tue Mar 10 16:42:49 2009 New Revision: 189630 URL: http://svn.freebsd.org/changeset/base/189630 Log: catch up with r189306; handle delayed activation of resources Submitted by: jhb Modified: head/sys/arm/xscale/ixp425/ixp425.c head/sys/arm/xscale/ixp425/ixp425_pci.c Modified: head/sys/arm/xscale/ixp425/ixp425.c ============================================================================== --- head/sys/arm/xscale/ixp425/ixp425.c Tue Mar 10 15:54:37 2009 (r189629) +++ head/sys/arm/xscale/ixp425/ixp425.c Tue Mar 10 16:42:49 2009 (r189630) @@ -362,8 +362,10 @@ ixp425_alloc_resource(device_t dev, devi struct rman *rmanp; struct resource *rv; uint32_t vbase, addr; + int needactivate = flags & RF_ACTIVE; int irq; + flags &= ~RF_ACTIVE; switch (type) { case SYS_RES_IRQ: rmanp = &sc->sc_irq_rman; @@ -382,6 +384,7 @@ ixp425_alloc_resource(device_t dev, devi if (BUS_READ_IVAR(dev, child, IXP425_IVAR_ADDR, &addr) == 0) { start = addr; end = start + 0x1000; /* XXX */ + count = end - start; } if (getvbase(start, end - start, &vbase) != 0) { /* likely means above table needs to be updated */ @@ -391,20 +394,41 @@ ixp425_alloc_resource(device_t dev, devi } rv = rman_reserve_resource(rmanp, start, end, count, flags, child); - if (rv != NULL) { + if (rv != NULL) rman_set_rid(rv, *rid); - if (strcmp(device_get_name(child), "uart") == 0) - rman_set_bustag(rv, &ixp425_a4x_bs_tag); - else - rman_set_bustag(rv, sc->sc_iot); - rman_set_bushandle(rv, vbase); - } break; default: rv = NULL; break; } - return rv; + if (rv != NULL && needactivate) { + if (bus_activate_resource(child, type, *rid, rv)) { + rman_release_resource(rv); + return (NULL); + } + } + return (rv); +} + +static int +ixp425_activate_resource(device_t dev, device_t child, int type, int rid, + struct resource *r) +{ + struct ixp425_softc *sc = device_get_softc(dev); + int error; + uint32_t vbase; + + if (type == SYS_RES_MEMORY) { + error = getvbase(rman_get_start(r), rman_get_size(r), &vbase); + if (error) + return (error); + if (strcmp(device_get_name(child), "uart") == 0) + rman_set_bustag(r, &ixp425_a4x_bs_tag); + else + rman_set_bustag(r, sc->sc_iot); + rman_set_bushandle(r, vbase); + } + return (rman_activate_resource(r)); } static __inline void @@ -472,6 +496,7 @@ static device_method_t ixp425_methods[] DEVMETHOD(bus_read_ivar, ixp425_read_ivar), DEVMETHOD(bus_alloc_resource, ixp425_alloc_resource), + DEVMETHOD(bus_activate_resource, ixp425_activate_resource), DEVMETHOD(bus_setup_intr, ixp425_setup_intr), DEVMETHOD(bus_teardown_intr, ixp425_teardown_intr), Modified: head/sys/arm/xscale/ixp425/ixp425_pci.c ============================================================================== --- head/sys/arm/xscale/ixp425/ixp425_pci.c Tue Mar 10 15:54:37 2009 (r189629) +++ head/sys/arm/xscale/ixp425/ixp425_pci.c Tue Mar 10 16:42:49 2009 (r189630) @@ -276,12 +276,10 @@ static struct resource * ixppcib_alloc_resource(device_t bus, device_t child, int type, int *rid, u_long start, u_long end, u_long count, u_int flags) { - bus_space_tag_t tag; struct ixppcib_softc *sc = device_get_softc(bus); struct rman *rmanp; struct resource *rv; - tag = NULL; /* shut up stupid gcc */ rv = NULL; switch (type) { case SYS_RES_IRQ: @@ -290,28 +288,25 @@ ixppcib_alloc_resource(device_t bus, dev case SYS_RES_IOPORT: rmanp = &sc->sc_io_rman; - tag = &sc->sc_pci_iot; break; case SYS_RES_MEMORY: rmanp = &sc->sc_mem_rman; - tag = &sc->sc_pci_memt; break; default: return (rv); } - rv = rman_reserve_resource(rmanp, start, end, count, flags, child); - if (rv != NULL) { - rman_set_rid(rv, *rid); - if (type == SYS_RES_IOPORT) { - rman_set_bustag(rv, tag); - rman_set_bushandle(rv, rman_get_start(rv)); - } else if (type == SYS_RES_MEMORY) { - rman_set_bustag(rv, tag); - rman_set_bushandle(rv, rman_get_bushandle(sc->sc_mem) + - (rman_get_start(rv) - IXP425_PCI_MEM_HWBASE)); + rv = rman_reserve_resource(rmanp, start, end, count, flags & ~RF_ACTIVE, + child); + if (rv == NULL) + return (NULL); + rman_set_rid(rv, *rid); + if (flags & RF_ACTIVE) { + if (bus_activate_resource(child, type, *rid, rv)) { + rman_release_resource(rv); + return (NULL); } } @@ -323,9 +318,21 @@ ixppcib_activate_resource(device_t bus, struct resource *r) { - device_printf(bus, "%s called activate_resource (unexpected)\n", - device_get_nameunit(child)); - return (ENXIO); + struct ixppcib_softc *sc = device_get_softc(bus); + + switch (type) { + case SYS_RES_IOPORT: + rman_set_bustag(r, &sc->sc_pci_iot); + rman_set_bushandle(r, rman_get_start(r)); + break; + case SYS_RES_MEMORY: + rman_set_bustag(r, &sc->sc_pci_memt); + rman_set_bushandle(r, rman_get_bushandle(sc->sc_mem) + + (rman_get_start(r) - IXP425_PCI_MEM_HWBASE)); + break; + } + + return (rman_activate_resource(r)); } static int