Garrett D'Amore wrote:
> 1) The macros themselves that make use of _IOCPARM_MASK (_IOR, _IOW, 
> _IORW) are "private" to ON.  That is, external code shouldn't be 
> directly using them.

Are they?   I've been working to get our DRI/DRM (graphics direct
rendering, not media rights/restrictions) changes upstream - currently
the drm.h header exports the ioctl defintions as:

#define _IOC_NR(nr)     (((nr) >> _IOC_NRSHIFT) & _IOC_NRMASK)

#define _IOC_NRBITS     8
#define _IOC_TYPEBITS   8
#define _IOC_SIZEBITS   14
#define _IOC_DIRBITS    2

#define _IOC_NRMASK     ((1 << _IOC_NRBITS)-1)
#define _IOC_TYPEMASK   ((1 << _IOC_TYPEBITS)-1)
#define _IOC_SIZEMASK   ((1 << _IOC_SIZEBITS)-1)
#define _IOC_DIRMASK    ((1 << _IOC_DIRBITS)-1)

#define _IOC_NRSHIFT    0
#define _IOC_TYPESHIFT  (_IOC_NRSHIFT+_IOC_NRBITS)
#define _IOC_SIZESHIFT  (_IOC_TYPESHIFT+_IOC_TYPEBITS)
#define _IOC_DIRSHIFT   (_IOC_SIZESHIFT+_IOC_SIZEBITS)

#define _IOC_NONE       0U
#define _IOC_WRITE      1U
#define _IOC_READ       2U

#define _IOC(dir, type, nr, size) \
        (((dir)  << _IOC_DIRSHIFT) | \
        ((type) << _IOC_TYPESHIFT) | \
        ((nr)   << _IOC_NRSHIFT) | \
        ((size) << _IOC_SIZESHIFT))

(For the full ugly header, see
http://src.opensolaris.org/source/xref/onnv/onnv-gate/usr/src/uts/common/io/drm/drm.h
.)

For the upstream integration, I was going to simplify, use the system
provided definitions instead of making our own, and merge with
the existing BSD code:

#elif defined(__FreeBSD__) || defined(__FreeBSD_kernel__) || defined(__NetBSD__)
 || defined(__OpenBSD__) || defined(__DragonFly__) || defined(__sun)
#include <sys/ioccom.h>
#define DRM_IOCTL_NR(n)         ((n) & 0xff)
#define DRM_IOC_VOID            IOC_VOID
#define DRM_IOC_READ            IOC_OUT
#define DRM_IOC_WRITE           IOC_IN
#define DRM_IOC_READWRITE       IOC_INOUT
#define DRM_IOC(dir, group, nr, size) _IOC(dir, group, nr, size)
#endif

#if defined(__sun) && !defined(_IOC)
#define _IOC(dir, group, nr, size)                              \
    (dir == DRM_IOC_READWRITE ? _IOWRN(group, nr, size) :       \
      (dir == DRM_IOC_WRITE ? _IOWN(group, nr, size) :          \
       /* dir == DRM_IOC_READ */  _IORN(group, nr, size) ))
#endif

This is the interface between the DRM kernel modules in ON and the
user space consumers in the X consolidation, but since ON doesn't
deliver the drm.h header for some reason, X has a second copy that
we use instead.   (Unfortunately, the people who originally
integrated this to ON & X aren't around any more to ask why.)

If <sys/ioccom.h> added a _IOC like BSD, we'd not need any Solaris
specific code, but I haven't gotten around to filing that RFE yet,
and am not even sure what bug category to file against.

What should we be doing here?

-- 
        -Alan Coopersmith-           [EMAIL PROTECTED]
         Sun Microsystems, Inc. - X Window System Engineering

_______________________________________________
opensolaris-code mailing list
opensolaris-code@opensolaris.org
http://mail.opensolaris.org/mailman/listinfo/opensolaris-code

Reply via email to