1*53ee8cc1Swenshuai.xi /* 2*53ee8cc1Swenshuai.xi * This file is subject to the terms and conditions of the GNU General Public 3*53ee8cc1Swenshuai.xi * License. See the file "COPYING" in the main directory of this archive 4*53ee8cc1Swenshuai.xi * for more details. 5*53ee8cc1Swenshuai.xi * 6*53ee8cc1Swenshuai.xi * Copyright (C) 1995, 96, 99, 2001 Ralf Baechle 7*53ee8cc1Swenshuai.xi */ 8*53ee8cc1Swenshuai.xi #ifndef _ASM_IOCTL_H 9*53ee8cc1Swenshuai.xi #define _ASM_IOCTL_H 10*53ee8cc1Swenshuai.xi 11*53ee8cc1Swenshuai.xi /* 12*53ee8cc1Swenshuai.xi * The original linux ioctl numbering scheme was just a general 13*53ee8cc1Swenshuai.xi * "anything goes" setup, where more or less random numbers were 14*53ee8cc1Swenshuai.xi * assigned. Sorry, I was clueless when I started out on this. 15*53ee8cc1Swenshuai.xi * 16*53ee8cc1Swenshuai.xi * On the alpha, we'll try to clean it up a bit, using a more sane 17*53ee8cc1Swenshuai.xi * ioctl numbering, and also trying to be compatible with OSF/1 in 18*53ee8cc1Swenshuai.xi * the process. I'd like to clean it up for the i386 as well, but 19*53ee8cc1Swenshuai.xi * it's so painful recognizing both the new and the old numbers.. 20*53ee8cc1Swenshuai.xi * 21*53ee8cc1Swenshuai.xi * The same applies for for the MIPS ABI; in fact even the macros 22*53ee8cc1Swenshuai.xi * from Linux/Alpha fit almost perfectly. 23*53ee8cc1Swenshuai.xi */ 24*53ee8cc1Swenshuai.xi 25*53ee8cc1Swenshuai.xi #define _IOC_NRBITS 8 26*53ee8cc1Swenshuai.xi #define _IOC_TYPEBITS 8 27*53ee8cc1Swenshuai.xi #define _IOC_SIZEBITS 13 28*53ee8cc1Swenshuai.xi #define _IOC_DIRBITS 3 29*53ee8cc1Swenshuai.xi 30*53ee8cc1Swenshuai.xi #define _IOC_NRMASK ((1 << _IOC_NRBITS)-1) 31*53ee8cc1Swenshuai.xi #define _IOC_TYPEMASK ((1 << _IOC_TYPEBITS)-1) 32*53ee8cc1Swenshuai.xi #define _IOC_SIZEMASK ((1 << _IOC_SIZEBITS)-1) 33*53ee8cc1Swenshuai.xi #define _IOC_DIRMASK ((1 << _IOC_DIRBITS)-1) 34*53ee8cc1Swenshuai.xi 35*53ee8cc1Swenshuai.xi #define _IOC_NRSHIFT 0 36*53ee8cc1Swenshuai.xi #define _IOC_TYPESHIFT (_IOC_NRSHIFT+_IOC_NRBITS) 37*53ee8cc1Swenshuai.xi #define _IOC_SIZESHIFT (_IOC_TYPESHIFT+_IOC_TYPEBITS) 38*53ee8cc1Swenshuai.xi #define _IOC_DIRSHIFT (_IOC_SIZESHIFT+_IOC_SIZEBITS) 39*53ee8cc1Swenshuai.xi 40*53ee8cc1Swenshuai.xi /* 41*53ee8cc1Swenshuai.xi * Direction bits _IOC_NONE could be 0, but OSF/1 gives it a bit. 42*53ee8cc1Swenshuai.xi * And this turns out useful to catch old ioctl numbers in header 43*53ee8cc1Swenshuai.xi * files for us. 44*53ee8cc1Swenshuai.xi */ 45*53ee8cc1Swenshuai.xi #define _IOC_NONE 1U 46*53ee8cc1Swenshuai.xi #define _IOC_READ 2U 47*53ee8cc1Swenshuai.xi #define _IOC_WRITE 4U 48*53ee8cc1Swenshuai.xi 49*53ee8cc1Swenshuai.xi /* 50*53ee8cc1Swenshuai.xi * The following are included for compatibility 51*53ee8cc1Swenshuai.xi */ 52*53ee8cc1Swenshuai.xi #define _IOC_VOID 0x20000000 53*53ee8cc1Swenshuai.xi #define _IOC_OUT 0x40000000 54*53ee8cc1Swenshuai.xi #define _IOC_IN 0x80000000 55*53ee8cc1Swenshuai.xi #define _IOC_INOUT (IOC_IN|IOC_OUT) 56*53ee8cc1Swenshuai.xi 57*53ee8cc1Swenshuai.xi #define _IOC(dir, type, nr, size) \ 58*53ee8cc1Swenshuai.xi (((dir) << _IOC_DIRSHIFT) | \ 59*53ee8cc1Swenshuai.xi ((type) << _IOC_TYPESHIFT) | \ 60*53ee8cc1Swenshuai.xi ((nr) << _IOC_NRSHIFT) | \ 61*53ee8cc1Swenshuai.xi ((size) << _IOC_SIZESHIFT)) 62*53ee8cc1Swenshuai.xi 63*53ee8cc1Swenshuai.xi /* provoke compile error for invalid uses of size argument */ 64*53ee8cc1Swenshuai.xi extern unsigned int __invalid_size_argument_for_IOC; 65*53ee8cc1Swenshuai.xi #define _IOC_TYPECHECK(t) \ 66*53ee8cc1Swenshuai.xi ((sizeof(t) == sizeof(t[1]) && \ 67*53ee8cc1Swenshuai.xi sizeof(t) < (1 << _IOC_SIZEBITS)) ? \ 68*53ee8cc1Swenshuai.xi sizeof(t) : __invalid_size_argument_for_IOC) 69*53ee8cc1Swenshuai.xi 70*53ee8cc1Swenshuai.xi /* used to create numbers */ 71*53ee8cc1Swenshuai.xi #define _IO(type, nr) _IOC(_IOC_NONE, (type), (nr), 0) 72*53ee8cc1Swenshuai.xi #define _IOR(type, nr, size) _IOC(_IOC_READ, (type), (nr), (_IOC_TYPECHECK(size))) 73*53ee8cc1Swenshuai.xi #define _IOW(type, nr, size) _IOC(_IOC_WRITE, (type), (nr), (_IOC_TYPECHECK(size))) 74*53ee8cc1Swenshuai.xi #define _IOWR(type, nr, size) _IOC(_IOC_READ|_IOC_WRITE, (type), (nr), (_IOC_TYPECHECK(size))) 75*53ee8cc1Swenshuai.xi #define _IOR_BAD(type, nr, size) _IOC(_IOC_READ, (type), (nr), sizeof(size)) 76*53ee8cc1Swenshuai.xi #define _IOW_BAD(type, nr, size) _IOC(_IOC_WRITE, (type), (nr), sizeof(size)) 77*53ee8cc1Swenshuai.xi #define _IOWR_BAD(type, nr, size) _IOC(_IOC_READ|_IOC_WRITE, (type), (nr), sizeof(size)) 78*53ee8cc1Swenshuai.xi 79*53ee8cc1Swenshuai.xi 80*53ee8cc1Swenshuai.xi /* used to decode them.. */ 81*53ee8cc1Swenshuai.xi #define _IOC_DIR(nr) (((nr) >> _IOC_DIRSHIFT) & _IOC_DIRMASK) 82*53ee8cc1Swenshuai.xi #define _IOC_TYPE(nr) (((nr) >> _IOC_TYPESHIFT) & _IOC_TYPEMASK) 83*53ee8cc1Swenshuai.xi #define _IOC_NR(nr) (((nr) >> _IOC_NRSHIFT) & _IOC_NRMASK) 84*53ee8cc1Swenshuai.xi #define _IOC_SIZE(nr) (((nr) >> _IOC_SIZESHIFT) & _IOC_SIZEMASK) 85*53ee8cc1Swenshuai.xi 86*53ee8cc1Swenshuai.xi /* ...and for the drivers/sound files... */ 87*53ee8cc1Swenshuai.xi 88*53ee8cc1Swenshuai.xi #define IOC_IN (_IOC_WRITE << _IOC_DIRSHIFT) 89*53ee8cc1Swenshuai.xi #define IOC_OUT (_IOC_READ << _IOC_DIRSHIFT) 90*53ee8cc1Swenshuai.xi #define IOC_INOUT ((_IOC_WRITE|_IOC_READ) << _IOC_DIRSHIFT) 91*53ee8cc1Swenshuai.xi #define IOCSIZE_MASK (_IOC_SIZEMASK << _IOC_SIZESHIFT) 92*53ee8cc1Swenshuai.xi #define IOCSIZE_SHIFT (_IOC_SIZESHIFT) 93*53ee8cc1Swenshuai.xi 94*53ee8cc1Swenshuai.xi #endif /* _ASM_IOCTL_H */ 95