Alan Coopersmith wrote:
> 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?
>   

IMO, we should probably document these macros for real (with the fixed 
definitions).  For now, they are not documented on Solaris.  Perhaps 
"Sun Private" is appropriate for now.

    -- Garrett

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

Reply via email to