130692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#ifndef _UAPI_ASM_GENERIC_IOCTL_H
230692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define _UAPI_ASM_GENERIC_IOCTL_H
330692c65c4174412c90e79489e98ab85c1a7412fBen Cheng
430692c65c4174412c90e79489e98ab85c1a7412fBen Cheng/* ioctl command encoding: 32 bits total, command in lower 16 bits,
530692c65c4174412c90e79489e98ab85c1a7412fBen Cheng * size of the parameter structure in the lower 14 bits of the
630692c65c4174412c90e79489e98ab85c1a7412fBen Cheng * upper 16 bits.
730692c65c4174412c90e79489e98ab85c1a7412fBen Cheng * Encoding the size of the parameter structure in the ioctl request
830692c65c4174412c90e79489e98ab85c1a7412fBen Cheng * is useful for catching programs compiled with old versions
930692c65c4174412c90e79489e98ab85c1a7412fBen Cheng * and to avoid overwriting user space outside the user buffer area.
1030692c65c4174412c90e79489e98ab85c1a7412fBen Cheng * The highest 2 bits are reserved for indicating the ``access mode''.
1130692c65c4174412c90e79489e98ab85c1a7412fBen Cheng * NOTE: This limits the max parameter size to 16kB -1 !
1230692c65c4174412c90e79489e98ab85c1a7412fBen Cheng */
1330692c65c4174412c90e79489e98ab85c1a7412fBen Cheng
1430692c65c4174412c90e79489e98ab85c1a7412fBen Cheng/*
1530692c65c4174412c90e79489e98ab85c1a7412fBen Cheng * The following is for compatibility across the various Linux
1630692c65c4174412c90e79489e98ab85c1a7412fBen Cheng * platforms.  The generic ioctl numbering scheme doesn't really enforce
1730692c65c4174412c90e79489e98ab85c1a7412fBen Cheng * a type field.  De facto, however, the top 8 bits of the lower 16
1830692c65c4174412c90e79489e98ab85c1a7412fBen Cheng * bits are indeed used as a type field, so we might just as well make
1930692c65c4174412c90e79489e98ab85c1a7412fBen Cheng * this explicit here.  Please be sure to use the decoding macros
2030692c65c4174412c90e79489e98ab85c1a7412fBen Cheng * below from now on.
2130692c65c4174412c90e79489e98ab85c1a7412fBen Cheng */
2230692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define _IOC_NRBITS	8
2330692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define _IOC_TYPEBITS	8
2430692c65c4174412c90e79489e98ab85c1a7412fBen Cheng
2530692c65c4174412c90e79489e98ab85c1a7412fBen Cheng/*
2630692c65c4174412c90e79489e98ab85c1a7412fBen Cheng * Let any architecture override either of the following before
2730692c65c4174412c90e79489e98ab85c1a7412fBen Cheng * including this file.
2830692c65c4174412c90e79489e98ab85c1a7412fBen Cheng */
2930692c65c4174412c90e79489e98ab85c1a7412fBen Cheng
3030692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#ifndef _IOC_SIZEBITS
3130692c65c4174412c90e79489e98ab85c1a7412fBen Cheng# define _IOC_SIZEBITS	14
3230692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#endif
3330692c65c4174412c90e79489e98ab85c1a7412fBen Cheng
3430692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#ifndef _IOC_DIRBITS
3530692c65c4174412c90e79489e98ab85c1a7412fBen Cheng# define _IOC_DIRBITS	2
3630692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#endif
3730692c65c4174412c90e79489e98ab85c1a7412fBen Cheng
3830692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define _IOC_NRMASK	((1 << _IOC_NRBITS)-1)
3930692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define _IOC_TYPEMASK	((1 << _IOC_TYPEBITS)-1)
4030692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define _IOC_SIZEMASK	((1 << _IOC_SIZEBITS)-1)
4130692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define _IOC_DIRMASK	((1 << _IOC_DIRBITS)-1)
4230692c65c4174412c90e79489e98ab85c1a7412fBen Cheng
4330692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define _IOC_NRSHIFT	0
4430692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define _IOC_TYPESHIFT	(_IOC_NRSHIFT+_IOC_NRBITS)
4530692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define _IOC_SIZESHIFT	(_IOC_TYPESHIFT+_IOC_TYPEBITS)
4630692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define _IOC_DIRSHIFT	(_IOC_SIZESHIFT+_IOC_SIZEBITS)
4730692c65c4174412c90e79489e98ab85c1a7412fBen Cheng
4830692c65c4174412c90e79489e98ab85c1a7412fBen Cheng/*
4930692c65c4174412c90e79489e98ab85c1a7412fBen Cheng * Direction bits, which any architecture can choose to override
5030692c65c4174412c90e79489e98ab85c1a7412fBen Cheng * before including this file.
5130692c65c4174412c90e79489e98ab85c1a7412fBen Cheng */
5230692c65c4174412c90e79489e98ab85c1a7412fBen Cheng
5330692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#ifndef _IOC_NONE
5430692c65c4174412c90e79489e98ab85c1a7412fBen Cheng# define _IOC_NONE	0U
5530692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#endif
5630692c65c4174412c90e79489e98ab85c1a7412fBen Cheng
5730692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#ifndef _IOC_WRITE
5830692c65c4174412c90e79489e98ab85c1a7412fBen Cheng# define _IOC_WRITE	1U
5930692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#endif
6030692c65c4174412c90e79489e98ab85c1a7412fBen Cheng
6130692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#ifndef _IOC_READ
6230692c65c4174412c90e79489e98ab85c1a7412fBen Cheng# define _IOC_READ	2U
6330692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#endif
6430692c65c4174412c90e79489e98ab85c1a7412fBen Cheng
6530692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define _IOC(dir,type,nr,size) \
6630692c65c4174412c90e79489e98ab85c1a7412fBen Cheng	(((dir)  << _IOC_DIRSHIFT) | \
6730692c65c4174412c90e79489e98ab85c1a7412fBen Cheng	 ((type) << _IOC_TYPESHIFT) | \
6830692c65c4174412c90e79489e98ab85c1a7412fBen Cheng	 ((nr)   << _IOC_NRSHIFT) | \
6930692c65c4174412c90e79489e98ab85c1a7412fBen Cheng	 ((size) << _IOC_SIZESHIFT))
7030692c65c4174412c90e79489e98ab85c1a7412fBen Cheng
7130692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#ifndef __KERNEL__
7230692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define _IOC_TYPECHECK(t) (sizeof(t))
7330692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#endif
7430692c65c4174412c90e79489e98ab85c1a7412fBen Cheng
7530692c65c4174412c90e79489e98ab85c1a7412fBen Cheng/* used to create numbers */
7630692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define _IO(type,nr)		_IOC(_IOC_NONE,(type),(nr),0)
7730692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define _IOR(type,nr,size)	_IOC(_IOC_READ,(type),(nr),(_IOC_TYPECHECK(size)))
7830692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define _IOW(type,nr,size)	_IOC(_IOC_WRITE,(type),(nr),(_IOC_TYPECHECK(size)))
7930692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define _IOWR(type,nr,size)	_IOC(_IOC_READ|_IOC_WRITE,(type),(nr),(_IOC_TYPECHECK(size)))
8030692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define _IOR_BAD(type,nr,size)	_IOC(_IOC_READ,(type),(nr),sizeof(size))
8130692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define _IOW_BAD(type,nr,size)	_IOC(_IOC_WRITE,(type),(nr),sizeof(size))
8230692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define _IOWR_BAD(type,nr,size)	_IOC(_IOC_READ|_IOC_WRITE,(type),(nr),sizeof(size))
8330692c65c4174412c90e79489e98ab85c1a7412fBen Cheng
8430692c65c4174412c90e79489e98ab85c1a7412fBen Cheng/* used to decode ioctl numbers.. */
8530692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define _IOC_DIR(nr)		(((nr) >> _IOC_DIRSHIFT) & _IOC_DIRMASK)
8630692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define _IOC_TYPE(nr)		(((nr) >> _IOC_TYPESHIFT) & _IOC_TYPEMASK)
8730692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define _IOC_NR(nr)		(((nr) >> _IOC_NRSHIFT) & _IOC_NRMASK)
8830692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define _IOC_SIZE(nr)		(((nr) >> _IOC_SIZESHIFT) & _IOC_SIZEMASK)
8930692c65c4174412c90e79489e98ab85c1a7412fBen Cheng
9030692c65c4174412c90e79489e98ab85c1a7412fBen Cheng/* ...and for the drivers/sound files... */
9130692c65c4174412c90e79489e98ab85c1a7412fBen Cheng
9230692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define IOC_IN		(_IOC_WRITE << _IOC_DIRSHIFT)
9330692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define IOC_OUT		(_IOC_READ << _IOC_DIRSHIFT)
9430692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define IOC_INOUT	((_IOC_WRITE|_IOC_READ) << _IOC_DIRSHIFT)
9530692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define IOCSIZE_MASK	(_IOC_SIZEMASK << _IOC_SIZESHIFT)
9630692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#define IOCSIZE_SHIFT	(_IOC_SIZESHIFT)
9730692c65c4174412c90e79489e98ab85c1a7412fBen Cheng
9830692c65c4174412c90e79489e98ab85c1a7412fBen Cheng#endif /* _UAPI_ASM_GENERIC_IOCTL_H */
99