Current File : //usr/man/man9e/devmap_contextmgt.9e
'\" te
.\"  Copyright (c) 1996, Sun Microsystems, Inc.  All Rights Reserved
.TH devmap_contextmgt 9E "16 Jan 1997" "SunOS 5.11" "Driver Entry Points"
.SH NAME
devmap_contextmgt \- driver callback function for context management
.SH SYNOPSIS
.LP
.nf
#include <sys/ddi.h>
#include <sys/sunddi.h>

\fBint\fR \fBdevmap_contextmgt\fR(\fBdevmap_cookie_t\fR \fIdhp\fR, \fBvoid *\fR\fIpvtp\fR, 
     \fBoffset_t\fR \fIoff\fR, \fBsize_t\fR \fIlen\fR, \fBuint_t\fR \fItype\fR, \fBuint_t\fR \fIrw\fR);
.fi

.SH INTERFACE LEVEL
.sp
.LP
Solaris DDI specific (Solaris DDI).
.SH ARGUMENTS
.sp
.ne 2
.mk
.na
\fB\fIdhp\fR \fR
.ad
.RS 9n
.rt  
An opaque mapping handle that the system uses to describe the mapping.
.RE

.sp
.ne 2
.mk
.na
\fB\fIpvtp\fR \fR
.ad
.RS 9n
.rt  
Driver private mapping data.
.RE

.sp
.ne 2
.mk
.na
\fB\fIoff\fR \fR
.ad
.RS 9n
.rt  
User offset within the logical device memory at which the access begins.
.RE

.sp
.ne 2
.mk
.na
\fB\fIlen\fR \fR
.ad
.RS 9n
.rt  
Length (in bytes) of the memory being accessed.
.RE

.sp
.ne 2
.mk
.na
\fB\fItype\fR \fR
.ad
.RS 9n
.rt  
Type of access operation. Possible values are: 
.sp
.ne 2
.mk
.na
\fB\fBDEVMAP_ACCESS\fR \fR
.ad
.RS 18n
.rt  
Memory access.
.RE

.sp
.ne 2
.mk
.na
\fB\fBDEVMAP_LOCK\fR \fR
.ad
.RS 18n
.rt  
Lock the memory being accessed.
.RE

.sp
.ne 2
.mk
.na
\fB\fBDEVMAP_UNLOCK\fR \fR
.ad
.RS 18n
.rt  
Unlock the memory being accessed.
.RE

.RE

.sp
.ne 2
.mk
.na
\fB\fIrw\fR \fR
.ad
.RS 9n
.rt  
Direction of access. Possible values are: 
.sp
.ne 2
.mk
.na
\fB\fBDEVMAP_READ\fR \fR
.ad
.RS 17n
.rt  
Read access attempted.
.RE

.sp
.ne 2
.mk
.na
\fB\fBDEVMAP_WRITE\fR \fR
.ad
.RS 17n
.rt  
Write access attempted.
.RE

.RE

.SH DESCRIPTION
.sp
.LP
\fBdevmap_contextmgt()\fR is a driver-supplied function that performs device context switching on a  mapping.  Device drivers pass \fBdevmap_contextmgt()\fR as an argument to \fBdevmap_do_ctxmgt\fR(9F) in the  \fBdevmap_access\fR(9E) entry point. The system will call \fBdevmap_contextmgt()\fR when memory is accessed. The system expects  \fBdevmap_contextmgt()\fR to load the memory address translations of the mapping by calling \fBdevmap_load\fR(9F) before returning.
.sp
.LP
\fIdhp\fR uniquely identifies the mapping and is used as an argument to  \fBdevmap_load\fR(9F) to validate the mapping. \fIoff\fR and \fIlen\fR define the range to be affected by the operations in \fBdevmap_contextmgt()\fR. 
.sp
.LP
The driver must check if there is already a mapping established at \fIoff\fR that needs to be unloaded. If a mapping exists at \fIoff\fR, \fBdevmap_contextmgt()\fR must call  \fBdevmap_unload\fR(9F) on the current mapping. \fBdevmap_unload\fR(9F) must be followed by \fBdevmap_load()\fR on the mapping that generated this call to \fBdevmap_contextmgt()\fR. \fBdevmap_unload\fR(9F) unloads the current mapping so that a call to \fBdevmap_access\fR(9E), which causes the system to call \fBdevmap_contextmgt()\fR, will be generated the next time the mapping is accessed. 
.sp
.LP
\fIpvtp\fR is a pointer to the driver's private mapping data that was allocated and initialized in the \fBdevmap_map\fR(9E) entry point. \fItype\fR defines the type of operation that device drivers should perform on the memory object.  If \fItype\fR is either \fBDEVMAP_LOCK\fR or \fBDEVMAP_UNLOCK\fR, the length passed to either \fBdevmap_unload\fR(9F) or \fBdevmap_load\fR(9F) must be same as \fIlen\fR. \fIrw\fR specifies the access direction on the memory object.
.sp
.LP
A non-zero return value from  \fBdevmap_contextmgt()\fR will be returned to  \fBdevmap_access\fR(9E) and will cause the corresponding operation to fail. The failure may result in a \fBSIGSEGV\fR or \fBSIGBUS\fR signal being delivered to the process.
.SH RETURN VALUES
.sp
.ne 2
.mk
.na
\fB\fB0\fR \fR
.ad
.RS 12n
.rt  
Successful completion.
.RE

.sp
.ne 2
.mk
.na
\fBNon-zero\fR
.ad
.RS 12n
.rt  
An error occurred.
.RE

.SH EXAMPLES
.LP
\fBExample 1 \fRmanaging a device context
.sp
.LP
The following shows an example of managing a device context.

.sp
.in +2
.nf
struct xxcontext cur_ctx;
static int
xxdevmap_contextmgt(devmap_cookie_t dhp, void *pvtp, offset_t off,
	size_t len, uint_t type, uint_t rw)
{
    devmap_cookie_t cur_dhp;
    struct xxpvtdata *p;
    struct xxpvtdata *pvp = (struct xxpvtdata *)pvtp;
    struct xx_softc  *softc = pvp->softc;
    int    err;

    mutex_enter(&softc->mutex);

    /*
     * invalidate the translations of current context before
     * switching context.
     */
    if (cur_ctx != NULL && cur_ctx != pvp->ctx) {
        p = cur_ctx->pvt;
        cur_dhp = p->dhp;
        if ((err = devmap_unload(cur_dhp, off, len)) != 0)
            return (err);
    }
    /* Switch device context - device dependent*/
    ...
    /* Make handle the new current mapping */
    cur_ctx = pvp->ctx;

    /*
     * Load the address translations of the calling context.
     */
    err = devmap_load(pvp->dhp, off, len, type, rw);

    mutex_exit(&softc->mutex);

    return (err);
}
.fi
.in -2

.SH SEE ALSO
.sp
.LP
\fBdevmap_access\fR(9E), \fBdevmap_do_ctxmgt\fR(9F) \fBdevmap_load\fR(9F), \fBdevmap_unload\fR(9F) 
.sp
.LP
\fIWriting Device Drivers for Oracle Solaris 11.2\fR