BUS_MAP_RESOURCE(9) | Kernel Developer's Manual | BUS_MAP_RESOURCE(9) |
bus_map_resource
,
bus_unmap_resource
,
resource_init_map_request
—
map or unmap an active resource
#include
<sys/param.h>
#include <sys/bus.h>
#include <machine/bus.h>
#include <sys/rman.h>
#include
<machine/resource.h>
int
bus_map_resource
(device_t dev,
int type, struct resource *r,
struct resource_map_request *args,
struct resource_map *map);
int
bus_unmap_resource
(device_t dev,
int type, struct resource *r,
struct resource_map *map);
void
resource_init_map_request
(struct
resource_map_request *args);
These functions create or destroy a mapping of a previously activated resource. Mappings permit CPU access to the resource via the bus_space(9) API.
The arguments are as follows:
SYS_RES_IOPORT
SYS_RES_MEMORY
NULL
to request a mapping
of the entire resource with the default properties.Resource mappings are described by a struct resource_map object. This structure contains a bus_space(9) tag and handle in the r_bustag and r_bushandle members that can be used for CPU access to the mapping. The structure also contains a r_vaddr member which contains the virtual address of the mapping if one exists.
The wrapper API for struct
resource objects described in
bus_activate_resource(9) can also be used with
struct resource_map. For example, a pointer to a
mapping object can be passed as the first argument to
bus_read_4
().
This wrapper API is preferred over using the r_bustag
and r_bushandle members directly.
The struct resource_map_request object
passed in args can be used to specify optional
properties of a mapping. The structure must be initialized by invoking
resource_init_map_request
().
Properties are then specified by setting one or more of these members:
VM_MEMATTR_UNCACHEABLE
attribute.Zero is returned on success, otherwise an error is returned.
This maps a PCI memory BAR with the write-combining memory attribute and reads the first 32-bit word:
struct resource *r; struct resource_map map; struct resource_map_request req; uint32_t val; int rid; rid = PCIR_BAR(0); r = bus_alloc_resource_any(dev, SYS_RES_MEMORY, &rid, RF_ACTIVE | RF_UNMAPPED); resource_init_map_request(&req); req.memattr = VM_MEMATTR_WRITE_COMBINING; bus_map_resource(dev, SYS_RES_MEMORY, r, &req, &map); val = bus_read_4(&map, 0);
bus_activate_resource(9), bus_alloc_resource(9), bus_space(9), device(9), driver(9)
This manual page was written by John Baldwin <jhb@FreeBSD.org>.
February 5, 2018 | Debian |