bus_alloc_resource question
Jake Burkholder
jake at locore.ca
Tue Jul 27 05:29:53 PDT 2004
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
More information about the freebsd-hackers
mailing list