1*53ee8cc1Swenshuai.xi #ifndef _ASM_GENERIC_IOCTL_H 2*53ee8cc1Swenshuai.xi #define _ASM_GENERIC_IOCTL_H 3*53ee8cc1Swenshuai.xi 4*53ee8cc1Swenshuai.xi /* ioctl command encoding: 32 bits total, command in lower 16 bits, 5*53ee8cc1Swenshuai.xi * size of the parameter structure in the lower 14 bits of the 6*53ee8cc1Swenshuai.xi * upper 16 bits. 7*53ee8cc1Swenshuai.xi * Encoding the size of the parameter structure in the ioctl request 8*53ee8cc1Swenshuai.xi * is useful for catching programs compiled with old versions 9*53ee8cc1Swenshuai.xi * and to avoid overwriting user space outside the user buffer area. 10*53ee8cc1Swenshuai.xi * The highest 2 bits are reserved for indicating the ``access mode''. 11*53ee8cc1Swenshuai.xi * NOTE: This limits the max parameter size to 16kB -1 ! 12*53ee8cc1Swenshuai.xi */ 13*53ee8cc1Swenshuai.xi 14*53ee8cc1Swenshuai.xi /* 15*53ee8cc1Swenshuai.xi * The following is for compatibility across the various Linux 16*53ee8cc1Swenshuai.xi * platforms. The generic ioctl numbering scheme doesn't really enforce 17*53ee8cc1Swenshuai.xi * a type field. De facto, however, the top 8 bits of the lower 16 18*53ee8cc1Swenshuai.xi * bits are indeed used as a type field, so we might just as well make 19*53ee8cc1Swenshuai.xi * this explicit here. Please be sure to use the decoding macros 20*53ee8cc1Swenshuai.xi * below from now on. 21*53ee8cc1Swenshuai.xi */ 22*53ee8cc1Swenshuai.xi #define _IOC_NRBITS 8 23*53ee8cc1Swenshuai.xi #define _IOC_TYPEBITS 8 24*53ee8cc1Swenshuai.xi 25*53ee8cc1Swenshuai.xi /* 26*53ee8cc1Swenshuai.xi * Let any architecture override either of the following before 27*53ee8cc1Swenshuai.xi * including this file. 28*53ee8cc1Swenshuai.xi */ 29*53ee8cc1Swenshuai.xi 30*53ee8cc1Swenshuai.xi #ifndef _IOC_SIZEBITS 31*53ee8cc1Swenshuai.xi # define _IOC_SIZEBITS 14 32*53ee8cc1Swenshuai.xi #endif 33*53ee8cc1Swenshuai.xi 34*53ee8cc1Swenshuai.xi #ifndef _IOC_DIRBITS 35*53ee8cc1Swenshuai.xi # define _IOC_DIRBITS 2 36*53ee8cc1Swenshuai.xi #endif 37*53ee8cc1Swenshuai.xi 38*53ee8cc1Swenshuai.xi #define _IOC_NRMASK ((1 << _IOC_NRBITS)-1) 39*53ee8cc1Swenshuai.xi #define _IOC_TYPEMASK ((1 << _IOC_TYPEBITS)-1) 40*53ee8cc1Swenshuai.xi #define _IOC_SIZEMASK ((1 << _IOC_SIZEBITS)-1) 41*53ee8cc1Swenshuai.xi #define _IOC_DIRMASK ((1 << _IOC_DIRBITS)-1) 42*53ee8cc1Swenshuai.xi 43*53ee8cc1Swenshuai.xi #define _IOC_NRSHIFT 0 44*53ee8cc1Swenshuai.xi #define _IOC_TYPESHIFT (_IOC_NRSHIFT+_IOC_NRBITS) 45*53ee8cc1Swenshuai.xi #define _IOC_SIZESHIFT (_IOC_TYPESHIFT+_IOC_TYPEBITS) 46*53ee8cc1Swenshuai.xi #define _IOC_DIRSHIFT (_IOC_SIZESHIFT+_IOC_SIZEBITS) 47*53ee8cc1Swenshuai.xi 48*53ee8cc1Swenshuai.xi /* 49*53ee8cc1Swenshuai.xi * Direction bits, which any architecture can choose to override 50*53ee8cc1Swenshuai.xi * before including this file. 51*53ee8cc1Swenshuai.xi */ 52*53ee8cc1Swenshuai.xi 53*53ee8cc1Swenshuai.xi #ifndef _IOC_NONE 54*53ee8cc1Swenshuai.xi # define _IOC_NONE 0U 55*53ee8cc1Swenshuai.xi #endif 56*53ee8cc1Swenshuai.xi 57*53ee8cc1Swenshuai.xi #ifndef _IOC_WRITE 58*53ee8cc1Swenshuai.xi # define _IOC_WRITE 1U 59*53ee8cc1Swenshuai.xi #endif 60*53ee8cc1Swenshuai.xi 61*53ee8cc1Swenshuai.xi #ifndef _IOC_READ 62*53ee8cc1Swenshuai.xi # define _IOC_READ 2U 63*53ee8cc1Swenshuai.xi #endif 64*53ee8cc1Swenshuai.xi 65*53ee8cc1Swenshuai.xi #define _IOC(dir,type,nr,size) \ 66*53ee8cc1Swenshuai.xi (((dir) << _IOC_DIRSHIFT) | \ 67*53ee8cc1Swenshuai.xi ((type) << _IOC_TYPESHIFT) | \ 68*53ee8cc1Swenshuai.xi ((nr) << _IOC_NRSHIFT) | \ 69*53ee8cc1Swenshuai.xi ((size) << _IOC_SIZESHIFT)) 70*53ee8cc1Swenshuai.xi 71*53ee8cc1Swenshuai.xi /* provoke compile error for invalid uses of size argument */ 72*53ee8cc1Swenshuai.xi extern unsigned int __invalid_size_argument_for_IOC; 73*53ee8cc1Swenshuai.xi #define _IOC_TYPECHECK(t) \ 74*53ee8cc1Swenshuai.xi ((sizeof(t) == sizeof(t[1]) && \ 75*53ee8cc1Swenshuai.xi sizeof(t) < (1 << _IOC_SIZEBITS)) ? \ 76*53ee8cc1Swenshuai.xi sizeof(t) : __invalid_size_argument_for_IOC) 77*53ee8cc1Swenshuai.xi 78*53ee8cc1Swenshuai.xi /* used to create numbers */ 79*53ee8cc1Swenshuai.xi #define _IO(type,nr) _IOC(_IOC_NONE,(type),(nr),0) 80*53ee8cc1Swenshuai.xi #define _IOR(type,nr,size) _IOC(_IOC_READ,(type),(nr),(_IOC_TYPECHECK(size))) 81*53ee8cc1Swenshuai.xi #define _IOW(type,nr,size) _IOC(_IOC_WRITE,(type),(nr),(_IOC_TYPECHECK(size))) 82*53ee8cc1Swenshuai.xi #define _IOWR(type,nr,size) _IOC(_IOC_READ|_IOC_WRITE,(type),(nr),(_IOC_TYPECHECK(size))) 83*53ee8cc1Swenshuai.xi #define _IOR_BAD(type,nr,size) _IOC(_IOC_READ,(type),(nr),sizeof(size)) 84*53ee8cc1Swenshuai.xi #define _IOW_BAD(type,nr,size) _IOC(_IOC_WRITE,(type),(nr),sizeof(size)) 85*53ee8cc1Swenshuai.xi #define _IOWR_BAD(type,nr,size) _IOC(_IOC_READ|_IOC_WRITE,(type),(nr),sizeof(size)) 86*53ee8cc1Swenshuai.xi 87*53ee8cc1Swenshuai.xi /* used to decode ioctl numbers.. */ 88*53ee8cc1Swenshuai.xi #define _IOC_DIR(nr) (((nr) >> _IOC_DIRSHIFT) & _IOC_DIRMASK) 89*53ee8cc1Swenshuai.xi #define _IOC_TYPE(nr) (((nr) >> _IOC_TYPESHIFT) & _IOC_TYPEMASK) 90*53ee8cc1Swenshuai.xi #define _IOC_NR(nr) (((nr) >> _IOC_NRSHIFT) & _IOC_NRMASK) 91*53ee8cc1Swenshuai.xi #define _IOC_SIZE(nr) (((nr) >> _IOC_SIZESHIFT) & _IOC_SIZEMASK) 92*53ee8cc1Swenshuai.xi 93*53ee8cc1Swenshuai.xi /* ...and for the drivers/sound files... */ 94*53ee8cc1Swenshuai.xi 95*53ee8cc1Swenshuai.xi #define IOC_IN (_IOC_WRITE << _IOC_DIRSHIFT) 96*53ee8cc1Swenshuai.xi #define IOC_OUT (_IOC_READ << _IOC_DIRSHIFT) 97*53ee8cc1Swenshuai.xi #define IOC_INOUT ((_IOC_WRITE|_IOC_READ) << _IOC_DIRSHIFT) 98*53ee8cc1Swenshuai.xi #define IOCSIZE_MASK (_IOC_SIZEMASK << _IOC_SIZESHIFT) 99*53ee8cc1Swenshuai.xi #define IOCSIZE_SHIFT (_IOC_SIZESHIFT) 100*53ee8cc1Swenshuai.xi 101*53ee8cc1Swenshuai.xi #endif /* _ASM_GENERIC_IOCTL_H */ 102