Driver Entry Points segmap(9E)
NAME
segmap - map device memory into user space
SYNOPSIS
#include
#include
#include
#include
#include
#include
int prefixsegmap(devt dev, offt off, struct as *asp, caddrt *addrp,
offt len, unsigned int prot, unsigned int maxprot, unsigned int flags,
credt *credp);
INTERFACE LEVEL
Architecture independent level 2 (DKI only).
ARGUMENTS
dev Device whose memory is to be mapped.
off Offset within device memory at which mapping
begins.
asp Pointer to the address space into which the dev-
ice memory should be mapped.
addrp Pointer to the address in the address space to
which the device memory should be mapped.
len Length (in bytes) of the memory to be mapped.
prot A bit field that specifies the protections. Pos-
sible settings are:
PROTREAD Read access is desired.
PROTWRITE Write access is desired.
PROTEXEC Execute access is desired.
SunOS 5.11 Last change: 14 Jan 1997 1
Driver Entry Points segmap(9E)
PROTUSER User-level access is desired (the
mapping is being done as a
result of a mmap(2) system
call).
PROTAL All access is desired.
maxprot Maximum protection flag possible for attempted
mapping; the PROTWRITE bit may be masked out if
the user opened the special file read-only.
flags Flags indicating type of mapping. Possible
values are (other bits may be set):
MAPSHARED Changes should be shared.
MAPRIVATE Changes are private.
credp Pointer to the user credentials structure.
DESCRIPTION
The segmap() entry point is an optional routine for charac-
ter drivers that support memory mapping. The mmap(2) sys-
tem call, when applied to a character special file, allows
device memory to be mapped into user space for direct access
by the user application.
Typically, a character driver that needs to support the
mmap(2) system call supplies either an devmap(9E) entry
point, or both an devmap(9E) and a segmap() entry point
routine (see the devmap(9E) reference page). If no segmap()
entry point is provided for the driver, devmapsetup(9F) is
used as a default.
A driver for a memory-mapped device would provide a seg-
map() entry point if it:
o needs to maintain a separate context for each user
mapping. See devmapsetup(9F) for details.
o needs to assign device access attributes to the
user mapping.
SunOS 5.11 Last change: 14 Jan 1997 2
Driver Entry Points segmap(9E)
The responsibilities of a segmap() entry point are:
o Verify that the range, defined by offset and len,
to be mapped is valid for the device. Typically,
this task is performed by calling the devmap(9E)
entry point. Note that if you are using
ddidevmapsegmap(9F) or devmapsetup(9F) to set up
the mapping, it will call your devmap(9E) entry
point for you to validate the range to be mapped.
o Assign device access attributes to the mapping.
See ddidevmapsegmap(9F), and
ddideviceaccattr(9S) for details.
o Set up device contexts for the user mapping if your
device requires context switching. See
devmapsetup(9F) for details.
o Perform the mapping with ddidevmapsegmap(9F), or
devmapsetup(9F) and return the status if it fails.
RETURN VALUES
The segmap() routine should return 0 if the driver is suc-
cessful in performing the memory map of its device address
space into the specified address space.
The segmap() must return an error number on failure. For
example, valid error numbers would be ENXIO if the
offset/length pair specified exceeds the limits of the dev-
ice memory, or EINVAL if the driver detects an invalid type
of mapping attempted.
If one of the mapping routines ddidevmapsegmap() or
devmapsetup()fails, you must return the error number
returned by the respective routine.
SEE ALSO
mmap(2), devmap(9E), devmapsetup(9F),
ddidevmapsegmap(9F), ddideviceaccattr(9S)
Writing Device Drivers
SunOS 5.11 Last change: 14 Jan 1997 3
|