bus_alloc_resource(9)
NAME
- bus_alloc_resource, bus_alloc_resource_any - allocate re
- sources from a
parent bus
SYNOPSIS
#include <sys/param.h>
#include <sys/bus.h>
#include <machine/bus.h>
#include <sys/rman.h>
#include <machine/resource.h>
struct resource *
bus_alloc_resource(device_t dev, int type, int *rid, u_long
start,
u_long end, u_long count, u_int flags);
struct resource *
bus_alloc_resource_any(device_t dev, int type, int *rid,
u_int flags);
DESCRIPTION
- This is an easy interface to the resource-management func
- tions. It hides
the indirection through the parent's method table. This
- function generally should be called in attach, but (except in some rare
- cases) never
earlier.
- The bus_alloc_resource_any() function is a convenience wrap
- per for
bus_alloc_resource(). It sets the values for start, end,
- and count to
the default resource (see description of start below).
- The arguments are as follows:
- dev is the device that requests ownership of the resource.
- Before allocation, the resource is owned by the parent bus.
- type is the type of resource you want to allocate. It is
- one of:
- SYS_RES_IRQ for IRQs
- SYS_RES_DRQ for ISA DMA lines
- SYS_RES_IOPORT for I/O ports
- SYS_RES_MEMORY for I/O memory
- rid points to a bus specific handle that identifies the re
- source being
allocated. For ISA this is an index into an array of re
- sources that have
been setup for this device by either the PnP mechanism, or
- via the hints
mechanism. For PCCARD, similar things are used as of writ
- ing, but that
may change in the future with newcard. For PCI it just hap
- pens to be the
offset into pci config space which has a word that describes
- the
resource. The bus methods are free to change the RIDs that
- they are
given as a parameter. You must not depend on the value you
- gave it earlier.
- start and end are the start/end addresses of the resource.
- If you specify values of 0ul for start and ~0ul for end and 1 for
- count, the default
values for the bus are calculated.
- count is the size of the resource. For example, the size of
- an I/O port
is usually 1 byte (but some devices override this). If you
- specified the
default values for start and end, then the default value of
- the bus is
used if count is smaller than the default value and count is
- used, if it
is bigger than the default value.
- flags sets the flags for the resource. You can set one or
- more of these
flags:
- RF_ALLOCATED resource has been reserved. The resource
- still needs to be
- activated with bus_activate_resource(9).
- RF_ACTIVE activate resource atomically.
- RF_SHAREABLE resource permits contemporaneous sharing. It
- should always
- be set unless you know that the resource can
- not be shared.
It is the bus driver's task to filter out the
- flag if the
bus does not support sharing. For example,
- pccard(4) cannot share IRQs while cardbus(4) can.
- RF_TIMESHARE resource permits time-division sharing.
RETURN VALUES
- A pointer to struct resource is returned on success, a null
- pointer otherwise.
EXAMPLES
- This is some example code that allocates a 32 byte I/O port
- range and an
IRQ. The values of portid and irqid should be saved in the
- softc of the
device after these calls.
struct resource *portres, irqres;
int portid, irqid;
- portid = 0;
irqid = 0;
portres = bus_alloc_resource(dev, SYS_RES_IOPORT,
- &portid,
0ul, ~0ul, 32, RF_ACTIVE);
- irqres = bus_alloc_resource_any(dev, SYS_RES_IRQ,
- &irqid,
RF_ACTIVE | RF_SHAREABLE);
SEE ALSO
- bus_activate_resource(9), bus_release_resource(9), de
- vice(9), driver(9)
AUTHORS
- This manual page was written by Alexander Langer
- <alex@big.endian.de>
with parts by Warner Losh <imp@FreeBSD.org>.
- BSD May 18, 2000