DEVMAP_DEVMEM_SETUP(9F) Kernel Functions for Drivers
NAME
devmap_devmem_setup, devmap_umem_setup - set driver memory mapping
parameters
SYNOPSIS
#include <sys/ddi.h>
#include <sys/sunddi.h>
int devmap_devmem_setup(
devmap_cookie_t dhp,
dev_info_t *dip,
struct devmap_callback_ctl *callbackops,
uint_t rnumber,
offset_t roff,
size_t len,
uint_t maxprot,
uint_t flags,
const ddi_device_acc_attr_t *accattrp);
int devmap_umem_setup(
devmap_cookie_t dhp,
dev_info_t *dip,
struct devmap_callback_ctl *callbackops,
ddi_umem_cookie_t cookie,
offset_t koff,
size_t len,
uint_t maxprot,
uint_t flags,
const ddi_device_acc_attr_t *accattrp);
INTERFACE LEVEL
illumos DDI specific (illumos DDI).
PARAMETERS
devmap_devmem_setup() parameters:
dhp An opaque mapping handle that the system uses to
describe the mapping.
dip Pointer to the device's
dev_info structure.
callbackops Pointer to a
devmap_callback_ctl(9S) structure. The
structure contains pointers to device driver-supplied
functions that manage events on the device mapping.
The framework will copy the structure to the system
private memory.
rnumber Index number to the register address space set.
roff Offset into the register address space.
len Length (in bytes) of the mapping to be mapped.
maxprot Maximum protection flag possible for attempted
mapping. Some combinations of possible settings are:
PROT_READ Read access is allowed.
PROT_WRITE Write access is allowed.
PROT_EXEC Execute access is allowed.
PROT_USER User-level access is allowed. The
mapping is done as a result of a
mmap(2) system call.
PROT_ALL All access is allowed.
flags Used to determine the cache attribute.
Possible values of the cache attribute are:
IOMEM_DATA_CACHED The CPU can cache the data
it fetches and push it to
memory at a later time.
This is the default
attribute that is used if
no cache attributes are
specified.
IOMEM_DATA_UC_WR_COMBINE The CPU never caches the
data, but writes can occur
out of order or can be
combined. Reordering is
implied.
If
IOMEM_DATA_UC_WR_COMBINE is specified but not
supported,
IOMEM_DATA_UNCACHED is
used instead.
IOMEM_DATA_UNCACHED The CPU never caches data,
but has uncacheable access
to memory. Strict ordering
is implied.
The cache attributes are mutually exclusive. Any
combination of the values leads to a failure. On the
SPARC architecture, only
IOMEM_DATA_CACHED is
meaningful. Others lead to a failure.
accattrp Pointer to a
ddi_device_acc_attr() structure of the
device. See
ddi_device_acc_attr(9S). The value in
devacc_attr_dataorder is ignored in the current
release. The value in
devacc_attr_endian_flags is
meaningful on the SPARC architecture only.
devmap_umem_setup() parameters:
dhp An opaque data structure that the system uses to
describe the mapping.
dip Pointer to the device's
dev_info structure.
callbackops Pointer to a
devmap_callback_ctl(9S) structure. The
structure contains pointers to device driver-supplied
functions that manage events on the device mapping.
cookie A kernel memory
cookie (see
ddi_umem_alloc(9F)).
koff Offset into the kernel memory defined by
cookie.
len Length (in bytes) of the mapping to be mapped.
maxprot Maximum protection flag possible for attempted
mapping. Some combinations of possible settings are:
PROT_READ Read access is allowed.
PROT_WRITE Write access is allowed.
PROT_EXEC Execute access is allowed.
PROT_USER User-level access is allowed (the
mapping is being done as a result of a
mmap(2) system call).
PROT_ALL All access is allowed.
flags Must be set to
0.
accattrp Pointer to a
ddi_device_acc_attr(9S) structure.
Ignored in the current release. Reserved for future
use.
DESCRIPTION
The
devmap_devmem_setup() and
devmap_umem_setup() functions are used
in the
devmap(9E) entry point to pass mapping parameters from the
driver to the system.
The
dhp argument specifies a device mapping handle that the system
uses to store all mapping parameters of a physical contiguous memory.
The system copies the data pointed to by
callbackops to a system
private memory. This allows the driver to free the data after
returning from either
devmap_devmem_setup() or
devmap_umem_setup().
The driver is notified of user events on the mappings via the entry
points defined by
devmap_callback_ctl(9S). The driver is notified of
the following user events:
Mapping Setup User has called
mmap(2) to create a mapping to the
device memory.
Access User has accessed an address in the mapping that has
no translations.
Duplication User has duplicated the mapping. Mappings are
duplicated when the process calls
fork(2).
Unmapping User has called
munmap(2) on the mapping or is
exiting,
exit(2).
See
devmap_map(9E),
devmap_access(9E),
devmap_dup(9E), and
devmap_unmap(9E) for details on these entry points.
By specifying a valid
callbackops to the system, device drivers can
manage events on a device mapping. For example, the
devmap_access(9E) entry point allows the drivers to perform context switching by
unloading the mappings of other processes and to load the mapping of
the calling process. Device drivers may specify
NULL to
callbackops which means the drivers do not want to be notified by the system.
The maximum protection allowed for the mapping is specified in
maxprot.
accattrp defines the device access attributes. See
ddi_device_acc_attr(9S) for more details.
devmap_devmem_setup() is used for device memory to map in the
register set given by
rnumber and the offset into the register
address space given by
roff. The system uses
rnumber and
roff to go
up the device tree to get the physical address that corresponds to
roff. The range to be affected is defined by
len and
roff. The range
from
roff to
roff + len must be a physical contiguous memory and page
aligned.
Drivers use
devmap_umem_setup() for kernel memory to map in the
kernel memory described by
cookie and the offset into the kernel
memory space given by
koff.
cookie is a kernel memory pointer
obtained from
ddi_umem_alloc(9F). If
cookie is
NULL, devmap_umem_setup() returns
-1. The range to be affected is defined
by
len and
koff. The range from
koff to
koff + len must be within the
limits of the kernel memory described by
koff + len and must be page
aligned.
Drivers use
devmap_umem_setup() to export the kernel memory allocated
by
ddi_umem_alloc(9F) to user space. The system selects a user
virtual address that is aligned with the kernel virtual address being
mapped to avoid cache incoherence if the mapping is not
MAP_FIXED.RETURN VALUES
0 Successful completion.
-1 An error occurred.
CONTEXT
devmap_devmem_setup() and
devmap_umem_setup() can be called from
user, kernel, and interrupt context.
SEE ALSO
exit(2),
fork(2),
mmap(2),
munmap(2),
devmap(9E),
ddi_umem_alloc(9F),
ddi_device_acc_attr(9S),
devmap_callback_ctl(9S) Writing Device Drivers July 13, 2024 DEVMAP_DEVMEM_SETUP(9F)