Skip site navigation (1)Skip section navigation (2)
Date:      Tue, 27 Jul 2004 08:29:52 -0400
From:      Jake Burkholder <jake@locore.ca>
To:        Chuck Tuffli <chuck_tuffli@agilent.com>
Cc:        hackers@freebsd.org
Subject:   Re: bus_alloc_resource question
Message-ID:  <20040727122952.GC18793@locore.ca>
In-Reply-To: <20040727015923.GA63284@cre85086tuf.rose.agilent.com>
References:  <20040727015923.GA63284@cre85086tuf.rose.agilent.com>

next in thread | previous in thread | raw e-mail | index | archive | help
Apparently, On Mon, Jul 26, 2004 at 06:59:24PM -0700,
	Chuck Tuffli said words to the effect of;

> I'm having some trouble adding a bus resource and am hoping someone
> can point out where I goofed.
> 
> The host bus to a new x86 chipset has a memory mapped region in PCI
> space that provides access to status and control registers. For a
> driver to get access to this region, I figured it should call
> bus_alloc_resource() the same as for any other memory mapped region.
> This currently doesn't "just work" as the region is not a part of any
> device's BARs. To add this region as a resource, I used
> bus_set_resource()
> 
>     device_t dev;
>     uint32_t e_mem = 0xe0000000;
>     struct resource *ecfg_res;
> 
>     dev = pci_find_device(PCI_VENDOR_INTEL, ...);
>     bus_set_resource(dev, SYS_RES_MEMORY, e_mem, 0xe0000000, 0x10000000);
> 
> but a subsequent call to bus_alloc_resource() returns NULL
> 
>     ecfg_res = bus_alloc_resource(dev, SYS_RES_MEMORY, &e_mem,
>             0, ~0, 1, RF_ACTIVE | RF_SHAREABLE);
> 
> A call to bus_get_resource() shows that the resource did get set as
> the call returns the correct starting address and count. Is there
> something else that needs to happen between the set and the alloc? Is
> this even the correct approach? Thanks in advance!

If this is anything like the soekris board where 0xe0000000 is just a
physical address that you want to map in and read or write you can use
pmap_mapdev as a quick way to do it, eg,
	volatile void *ptr = pmap_mapdev(0xe0000000, ...);

Be warned that this, as well as bus_alloc_resource(SYS_RES_MEMORY), will
allocate virtual address space for the mapping, so you should only map in
exactly what you need, I imagine its just a page or 2.  0x10000000 is way
too much, you will not be able to allocate that much virtual address space.

Jake



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