1/* 2 * BK Id: SCCS/s.ioctl.h 1.5 05/17/01 18:14:24 cort 3 */ 4#ifndef _PPC_IOCTL_H 5#define _PPC_IOCTL_H 6 7 8/* 9 * this was copied from the alpha as it's a bit cleaner there. 10 * -- Cort 11 */ 12 13#define _IOC_NRBITS 8 14#define _IOC_TYPEBITS 8 15#define _IOC_SIZEBITS 13 16#define _IOC_DIRBITS 3 17 18#define _IOC_NRMASK ((1 << _IOC_NRBITS)-1) 19#define _IOC_TYPEMASK ((1 << _IOC_TYPEBITS)-1) 20#define _IOC_SIZEMASK ((1 << _IOC_SIZEBITS)-1) 21#define _IOC_DIRMASK ((1 << _IOC_DIRBITS)-1) 22 23#define _IOC_NRSHIFT 0 24#define _IOC_TYPESHIFT (_IOC_NRSHIFT+_IOC_NRBITS) 25#define _IOC_SIZESHIFT (_IOC_TYPESHIFT+_IOC_TYPEBITS) 26#define _IOC_DIRSHIFT (_IOC_SIZESHIFT+_IOC_SIZEBITS) 27 28/* 29 * Direction bits _IOC_NONE could be 0, but OSF/1 gives it a bit. 30 * And this turns out useful to catch old ioctl numbers in header 31 * files for us. 32 */ 33#define _IOC_NONE 1U 34#define _IOC_READ 2U 35#define _IOC_WRITE 4U 36 37#define _IOC(dir,type,nr,size) \ 38 (((dir) << _IOC_DIRSHIFT) | \ 39 ((type) << _IOC_TYPESHIFT) | \ 40 ((nr) << _IOC_NRSHIFT) | \ 41 ((size) << _IOC_SIZESHIFT)) 42 43/* used to create numbers */ 44#define _IO(type,nr) _IOC(_IOC_NONE,(type),(nr),0) 45#define _IOR(type,nr,size) _IOC(_IOC_READ,(type),(nr),sizeof(size)) 46#define _IOW(type,nr,size) _IOC(_IOC_WRITE,(type),(nr),sizeof(size)) 47#define _IOWR(type,nr,size) _IOC(_IOC_READ|_IOC_WRITE,(type),(nr),sizeof(size)) 48 49/* used to decode them.. */ 50#define _IOC_DIR(nr) (((nr) >> _IOC_DIRSHIFT) & _IOC_DIRMASK) 51#define _IOC_TYPE(nr) (((nr) >> _IOC_TYPESHIFT) & _IOC_TYPEMASK) 52#define _IOC_NR(nr) (((nr) >> _IOC_NRSHIFT) & _IOC_NRMASK) 53#define _IOC_SIZE(nr) (((nr) >> _IOC_SIZESHIFT) & _IOC_SIZEMASK) 54 55/* various drivers, such as the pcmcia stuff, need these... */ 56#define IOC_IN (_IOC_WRITE << _IOC_DIRSHIFT) 57#define IOC_OUT (_IOC_READ << _IOC_DIRSHIFT) 58#define IOC_INOUT ((_IOC_WRITE|_IOC_READ) << _IOC_DIRSHIFT) 59#define IOCSIZE_MASK (_IOC_SIZEMASK << _IOC_SIZESHIFT) 60#define IOCSIZE_SHIFT (_IOC_SIZESHIFT) 61 62#endif 63