18c2ecf20Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */
28c2ecf20Sopenharmony_ci#ifndef _SPARC_IOCTL_H
38c2ecf20Sopenharmony_ci#define _SPARC_IOCTL_H
48c2ecf20Sopenharmony_ci
58c2ecf20Sopenharmony_ci/*
68c2ecf20Sopenharmony_ci * Our DIR and SIZE overlap in order to simulteneously provide
78c2ecf20Sopenharmony_ci * a non-zero _IOC_NONE (for binary compatibility) and
88c2ecf20Sopenharmony_ci * 14 bits of size as on i386. Here's the layout:
98c2ecf20Sopenharmony_ci *
108c2ecf20Sopenharmony_ci *   0xE0000000   DIR
118c2ecf20Sopenharmony_ci *   0x80000000     DIR = WRITE
128c2ecf20Sopenharmony_ci *   0x40000000     DIR = READ
138c2ecf20Sopenharmony_ci *   0x20000000     DIR = NONE
148c2ecf20Sopenharmony_ci *   0x3FFF0000   SIZE (overlaps NONE bit)
158c2ecf20Sopenharmony_ci *   0x0000FF00   TYPE
168c2ecf20Sopenharmony_ci *   0x000000FF   NR (CMD)
178c2ecf20Sopenharmony_ci */
188c2ecf20Sopenharmony_ci
198c2ecf20Sopenharmony_ci#define _IOC_NRBITS      8
208c2ecf20Sopenharmony_ci#define _IOC_TYPEBITS    8
218c2ecf20Sopenharmony_ci#define _IOC_SIZEBITS   13	/* Actually 14, see below. */
228c2ecf20Sopenharmony_ci#define _IOC_DIRBITS     3
238c2ecf20Sopenharmony_ci
248c2ecf20Sopenharmony_ci#define _IOC_NRMASK      ((1 << _IOC_NRBITS)-1)
258c2ecf20Sopenharmony_ci#define _IOC_TYPEMASK    ((1 << _IOC_TYPEBITS)-1)
268c2ecf20Sopenharmony_ci#define _IOC_SIZEMASK    ((1 << _IOC_SIZEBITS)-1)
278c2ecf20Sopenharmony_ci#define _IOC_XSIZEMASK   ((1 << (_IOC_SIZEBITS+1))-1)
288c2ecf20Sopenharmony_ci#define _IOC_DIRMASK     ((1 << _IOC_DIRBITS)-1)
298c2ecf20Sopenharmony_ci
308c2ecf20Sopenharmony_ci#define _IOC_NRSHIFT     0
318c2ecf20Sopenharmony_ci#define _IOC_TYPESHIFT   (_IOC_NRSHIFT + _IOC_NRBITS)
328c2ecf20Sopenharmony_ci#define _IOC_SIZESHIFT   (_IOC_TYPESHIFT + _IOC_TYPEBITS)
338c2ecf20Sopenharmony_ci#define _IOC_DIRSHIFT    (_IOC_SIZESHIFT + _IOC_SIZEBITS)
348c2ecf20Sopenharmony_ci
358c2ecf20Sopenharmony_ci#define _IOC_NONE        1U
368c2ecf20Sopenharmony_ci#define _IOC_READ        2U
378c2ecf20Sopenharmony_ci#define _IOC_WRITE       4U
388c2ecf20Sopenharmony_ci
398c2ecf20Sopenharmony_ci#define _IOC(dir,type,nr,size) \
408c2ecf20Sopenharmony_ci        (((dir)  << _IOC_DIRSHIFT) | \
418c2ecf20Sopenharmony_ci         ((type) << _IOC_TYPESHIFT) | \
428c2ecf20Sopenharmony_ci         ((nr)   << _IOC_NRSHIFT) | \
438c2ecf20Sopenharmony_ci         ((size) << _IOC_SIZESHIFT))
448c2ecf20Sopenharmony_ci
458c2ecf20Sopenharmony_ci#define _IO(type,nr)        _IOC(_IOC_NONE,(type),(nr),0)
468c2ecf20Sopenharmony_ci#define _IOR(type,nr,size)  _IOC(_IOC_READ,(type),(nr),sizeof(size))
478c2ecf20Sopenharmony_ci#define _IOW(type,nr,size)  _IOC(_IOC_WRITE,(type),(nr),sizeof(size))
488c2ecf20Sopenharmony_ci#define _IOWR(type,nr,size) _IOC(_IOC_READ|_IOC_WRITE,(type),(nr),sizeof(size))
498c2ecf20Sopenharmony_ci
508c2ecf20Sopenharmony_ci/* Used to decode ioctl numbers in drivers despite the leading underscore... */
518c2ecf20Sopenharmony_ci#define _IOC_DIR(nr)    \
528c2ecf20Sopenharmony_ci ( (((((nr) >> _IOC_DIRSHIFT) & _IOC_DIRMASK) & (_IOC_WRITE|_IOC_READ)) != 0)?   \
538c2ecf20Sopenharmony_ci                            (((nr) >> _IOC_DIRSHIFT) & (_IOC_WRITE|_IOC_READ)):  \
548c2ecf20Sopenharmony_ci                            (((nr) >> _IOC_DIRSHIFT) & _IOC_DIRMASK) )
558c2ecf20Sopenharmony_ci#define _IOC_TYPE(nr)       (((nr) >> _IOC_TYPESHIFT) & _IOC_TYPEMASK)
568c2ecf20Sopenharmony_ci#define _IOC_NR(nr)         (((nr) >> _IOC_NRSHIFT) & _IOC_NRMASK)
578c2ecf20Sopenharmony_ci#define _IOC_SIZE(nr)   \
588c2ecf20Sopenharmony_ci ((((((nr) >> _IOC_DIRSHIFT) & _IOC_DIRMASK) & (_IOC_WRITE|_IOC_READ)) == 0)?    \
598c2ecf20Sopenharmony_ci                         0: (((nr) >> _IOC_SIZESHIFT) & _IOC_XSIZEMASK))
608c2ecf20Sopenharmony_ci
618c2ecf20Sopenharmony_ci/* ...and for the PCMCIA and sound. */
628c2ecf20Sopenharmony_ci#define IOC_IN          (_IOC_WRITE << _IOC_DIRSHIFT)
638c2ecf20Sopenharmony_ci#define IOC_OUT         (_IOC_READ << _IOC_DIRSHIFT)
648c2ecf20Sopenharmony_ci#define IOC_INOUT       ((_IOC_WRITE|_IOC_READ) << _IOC_DIRSHIFT)
658c2ecf20Sopenharmony_ci#define IOCSIZE_MASK    (_IOC_XSIZEMASK << _IOC_SIZESHIFT)
668c2ecf20Sopenharmony_ci#define IOCSIZE_SHIFT   (_IOC_SIZESHIFT)
678c2ecf20Sopenharmony_ci
688c2ecf20Sopenharmony_ci#endif /* !(_SPARC_IOCTL_H) */
69