#ifndef _SYS_IOCCOM_H #define _SYS_IOCCOM_H // Linux-compatible ioctl command encoding constants — supplements the // base _IOC / _IO / _IOR / _IOW / _IOWR macros from with // the bitfield widths, masks, shifts, decoders, and IOC direction // macros that Linux UAPI headers (DRM, V4L2, etc.) expect. // // DRM headers include as the BSD-naming path for ioctl // command encoding; relibc's provides the basic macros // but not these constants. This header unifies them so DRM and other // Linux UAPI consumers build without a Mesa-side stub. #include #ifndef _IOC_NRBITS #define _IOC_NRBITS 8 #endif #ifndef _IOC_TYPEBITS #define _IOC_TYPEBITS 8 #endif #ifndef _IOC_SIZEBITS #define _IOC_SIZEBITS 14 #endif #ifndef _IOC_DIRBITS #define _IOC_DIRBITS 2 #endif #ifndef _IOC_NRMASK #define _IOC_NRMASK ((1 << _IOC_NRBITS) - 1) #endif #ifndef _IOC_TYPEMASK #define _IOC_TYPEMASK ((1 << _IOC_TYPEBITS) - 1) #endif #ifndef _IOC_SIZEMASK #define _IOC_SIZEMASK ((1 << _IOC_SIZEBITS) - 1) #endif #ifndef _IOC_DIRMASK #define _IOC_DIRMASK ((1 << _IOC_DIRBITS) - 1) #endif #ifndef _IOC_NRSHIFT #define _IOC_NRSHIFT 0 #endif #ifndef _IOC_TYPESHIFT #define _IOC_TYPESHIFT (_IOC_NRSHIFT + _IOC_NRBITS) #endif #ifndef _IOC_SIZESHIFT #define _IOC_SIZESHIFT (_IOC_TYPESHIFT + _IOC_TYPEBITS) #endif #ifndef _IOC_DIRSHIFT #define _IOC_DIRSHIFT (_IOC_SIZESHIFT + _IOC_SIZEBITS) #endif // _IOC_TYPECHECK wraps the ioctl size argument in a sizeof() for type // safety. The musl/relibc _IOW / _IOR / _IOWR macros already call // sizeof internally on the third argument; this macro is provided for // callers that compose ioctl numbers directly (e.g. DRM). #ifndef _IOC_TYPECHECK #define _IOC_TYPECHECK(t) (sizeof(t)) #endif // _IOC_DIR / _IOC_TYPE / _IOC_NR / _IOC_SIZE decode the fields of an // ioctl number. Linux UAPI callers use these to inspect ioctls. #ifndef _IOC_DIR #define _IOC_DIR(nr) (((nr) >> _IOC_DIRSHIFT) & _IOC_DIRMASK) #endif #ifndef _IOC_TYPE #define _IOC_TYPE(nr) (((nr) >> _IOC_TYPESHIFT) & _IOC_TYPEMASK) #endif #ifndef _IOC_NR #define _IOC_NR(nr) (((nr) >> _IOC_NRSHIFT) & _IOC_NRMASK) #endif #ifndef _IOC_SIZE #define _IOC_SIZE(nr) (((nr) >> _IOC_SIZESHIFT) & _IOC_SIZEMASK) #endif // IOC_IN / IOC_OUT / IOC_INOUT are the values stored in the direction // field of an ioctl number when constructing one without _IO / _IOR / // _IOW / _IOWR. #ifndef IOC_IN #define IOC_IN (_IOC_WRITE << _IOC_DIRSHIFT) #endif #ifndef IOC_OUT #define IOC_OUT (_IOC_READ << _IOC_DIRSHIFT) #endif #ifndef IOC_INOUT #define IOC_INOUT ((_IOC_WRITE | _IOC_READ) << _IOC_DIRSHIFT) #endif #ifndef IOCSIZE_MASK #define IOCSIZE_MASK (_IOC_SIZEMASK << _IOC_SIZESHIFT) #endif #ifndef IOCSIZE_SHIFT #define IOCSIZE_SHIFT (_IOC_SIZESHIFT) #endif #endif /* _SYS_IOCCOM_H */