Skip site navigation (1)Skip section navigation (2)
Date:      Sun, 04 Jul 1999 14:03:29 -0600
From:      Warner Losh <imp@harmony.village.org>
To:        Doug Rabson <dfr@nlsystems.com>
Cc:        hackers@freebsd.org
Subject:   Re: The busspace modernization initiative. 
Message-ID:  <199907042003.OAA43735@harmony.village.org>
In-Reply-To: Your message of "Sun, 04 Jul 1999 11:05:14 BST." <Pine.BSF.4.10.9907041101200.15087-100000@salmon.nlsystems.com> 
References:  <Pine.BSF.4.10.9907041101200.15087-100000@salmon.nlsystems.com>  

next in thread | previous in thread | raw e-mail | index | archive | help
In message <Pine.BSF.4.10.9907041101200.15087-100000@salmon.nlsystems.com> Doug Rabson writes:
: I think you are on the right lines here. Where does the resource come
: from? Are you going to support bus_space_map() and if so, how are you
: planning to call BUS_ALLOC_RESOURCE?

In i386/i386/resource.c :-).  Here's what is there now.  It looks like 
it currently bypasses BUS_ALLOC_RESOURCE, going to the resource
manager (rman) directly.  Do you have any comments on this code?  Or
would you rather I send you a complete patch/diff to comment on?

int
bus_space_alloc(t, rstart, rend, size, alignment, boundary, flags,
    bpap, bshp)
    bus_space_tag_t t;
    bus_addr_t rstart, rend;
    bus_size_t size, alignment, boundary;
    int flags;
    bus_addr_t *bpap;
    bus_space_handle_t *bshp;
{
    struct resource *rv;
    struct rman *ex;
    unsigned long bpa;
    int error;
    /*
     * Pick the appropriate resource.
     */
    if (t == I386_BUS_SPACE_IO) {
	if (flags & BUS_SPACE_MAP_LINEAR)
	    return EOPNOTSUPP;
	ex = &ioport_rman;
    } else if (t == I386_BUS_SPACE_MEM)
	ex = &iomem_rman;
    else
	panic("bus_space_alloc: bad bus space tag");

    /*
     * Sanity check the allocation against the resource's boundaries.
     */
    if (rstart < ex->rm_start || rend > ex->rm_end)
	panic("bus_space_alloc: bad region start/end");
    /*
     * Do the requested allocation.
     */
 retry:
/*
    printf("bus_space_alloc %lx,%lx,%lx,%lx\n",
	   (u_long)rstart, (u_long)rend, (u_long)size, (u_long)alignment);
*/
    rv = rman_reserve_resource(ex, rstart, rend, size, flags, NULL); /* XXX NULL? */
    if (!rv) {
	return EAGAIN;
    }
    if ( rv->r_start != EXTENT_ALIGN (rv->r_start, alignment, 0) ) {
	rstart = EXTENT_ALIGN (rv->r_start, alignment, 0);
	rman_release_resource (rv);
	goto retry;
    }
    bpa = rv->r_start;
    rman_activate_resource (rv);
    /*
     * For I/O space, that's all she wrote.
     */
    if (t == I386_BUS_SPACE_IO) {
	bshp->addr = *bpap = bpa;
	bshp->resource = rv;
	return 0;
    }

    /*
     * For memory space, map the bus physical address to
     * a kernel virtual address.
     */
    if (bpa >= ISA_HOLE_START && 
	(bpa + size) <= ISA_HOLE_START + ISA_HOLE_LENGTH) { /* ISA hole */
	bshp->addr = (u_int)ISA_HOLE_VADDR(bpa);
    } else { /* General */
	if((error = i386_mem_alloc_and_map (bpa, size, (vm_offset_t*)(&bshp->addr)))) {
	    rman_release_resource (rv);
	    return 1;
	}
    }
    *bpap = bpa;
    bshp->resource = rv;
    return 0;
}

: I assume that you will update the alpha version of bus.h too.

Of course.

Warner



To Unsubscribe: send mail to majordomo@FreeBSD.org
with "unsubscribe freebsd-hackers" in the body of the message




Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?199907042003.OAA43735>