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>