xref: /openbmc/linux/include/drm/drm_ioctl.h (revision 03ab8e6297acd1bc0eedaa050e2a1635c576fd11)
17cfdf711SDaniel Vetter /*
27cfdf711SDaniel Vetter  * Internal Header for the Direct Rendering Manager
37cfdf711SDaniel Vetter  *
47cfdf711SDaniel Vetter  * Copyright 1999 Precision Insight, Inc., Cedar Park, Texas.
57cfdf711SDaniel Vetter  * Copyright 2000 VA Linux Systems, Inc., Sunnyvale, California.
67cfdf711SDaniel Vetter  * Copyright (c) 2009-2010, Code Aurora Forum.
77cfdf711SDaniel Vetter  * All rights reserved.
87cfdf711SDaniel Vetter  *
97cfdf711SDaniel Vetter  * Author: Rickard E. (Rik) Faith <faith@valinux.com>
107cfdf711SDaniel Vetter  * Author: Gareth Hughes <gareth@valinux.com>
117cfdf711SDaniel Vetter  *
127cfdf711SDaniel Vetter  * Permission is hereby granted, free of charge, to any person obtaining a
137cfdf711SDaniel Vetter  * copy of this software and associated documentation files (the "Software"),
147cfdf711SDaniel Vetter  * to deal in the Software without restriction, including without limitation
157cfdf711SDaniel Vetter  * the rights to use, copy, modify, merge, publish, distribute, sublicense,
167cfdf711SDaniel Vetter  * and/or sell copies of the Software, and to permit persons to whom the
177cfdf711SDaniel Vetter  * Software is furnished to do so, subject to the following conditions:
187cfdf711SDaniel Vetter  *
197cfdf711SDaniel Vetter  * The above copyright notice and this permission notice (including the next
207cfdf711SDaniel Vetter  * paragraph) shall be included in all copies or substantial portions of the
217cfdf711SDaniel Vetter  * Software.
227cfdf711SDaniel Vetter  *
237cfdf711SDaniel Vetter  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
247cfdf711SDaniel Vetter  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
257cfdf711SDaniel Vetter  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
267cfdf711SDaniel Vetter  * VA LINUX SYSTEMS AND/OR ITS SUPPLIERS BE LIABLE FOR ANY CLAIM, DAMAGES OR
277cfdf711SDaniel Vetter  * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
287cfdf711SDaniel Vetter  * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
297cfdf711SDaniel Vetter  * OTHER DEALINGS IN THE SOFTWARE.
307cfdf711SDaniel Vetter  */
317cfdf711SDaniel Vetter 
327cfdf711SDaniel Vetter #ifndef _DRM_IOCTL_H_
337cfdf711SDaniel Vetter #define _DRM_IOCTL_H_
347cfdf711SDaniel Vetter 
357cfdf711SDaniel Vetter #include <linux/types.h>
362640981fSDaniel Vetter #include <linux/bitops.h>
377cfdf711SDaniel Vetter 
387cfdf711SDaniel Vetter #include <asm/ioctl.h>
397cfdf711SDaniel Vetter 
407cfdf711SDaniel Vetter struct drm_device;
417cfdf711SDaniel Vetter struct drm_file;
427cfdf711SDaniel Vetter struct file;
437cfdf711SDaniel Vetter 
447cfdf711SDaniel Vetter /**
452640981fSDaniel Vetter  * drm_ioctl_t - DRM ioctl function type.
462640981fSDaniel Vetter  * @dev: DRM device inode
472640981fSDaniel Vetter  * @data: private pointer of the ioctl call
482640981fSDaniel Vetter  * @file_priv: DRM file this ioctl was made on
497cfdf711SDaniel Vetter  *
502640981fSDaniel Vetter  * This is the DRM ioctl typedef. Note that drm_ioctl() has alrady copied @data
512640981fSDaniel Vetter  * into kernel-space, and will also copy it back, depending upon the read/write
522640981fSDaniel Vetter  * settings in the ioctl command code.
537cfdf711SDaniel Vetter  */
547cfdf711SDaniel Vetter typedef int drm_ioctl_t(struct drm_device *dev, void *data,
557cfdf711SDaniel Vetter 			struct drm_file *file_priv);
567cfdf711SDaniel Vetter 
572640981fSDaniel Vetter /**
582640981fSDaniel Vetter  * drm_ioctl_compat_t - compatibility DRM ioctl function type.
592640981fSDaniel Vetter  * @filp: file pointer
602640981fSDaniel Vetter  * @cmd: ioctl command code
612640981fSDaniel Vetter  * @arg: DRM file this ioctl was made on
622640981fSDaniel Vetter  *
632640981fSDaniel Vetter  * Just a typedef to make declaring an array of compatibility handlers easier.
642640981fSDaniel Vetter  * New drivers shouldn't screw up the structure layout for their ioctl
652640981fSDaniel Vetter  * structures and hence never need this.
662640981fSDaniel Vetter  */
677cfdf711SDaniel Vetter typedef int drm_ioctl_compat_t(struct file *filp, unsigned int cmd,
687cfdf711SDaniel Vetter 			       unsigned long arg);
697cfdf711SDaniel Vetter 
707cfdf711SDaniel Vetter #define DRM_IOCTL_NR(n)                _IOC_NR(n)
71*3abab27cSCharles Baylis #define DRM_IOCTL_TYPE(n)              _IOC_TYPE(n)
727cfdf711SDaniel Vetter #define DRM_MAJOR       226
737cfdf711SDaniel Vetter 
742640981fSDaniel Vetter /**
752640981fSDaniel Vetter  * enum drm_ioctl_flags - DRM ioctl flags
762640981fSDaniel Vetter  *
772640981fSDaniel Vetter  * Various flags that can be set in &drm_ioctl_desc.flags to control how
782640981fSDaniel Vetter  * userspace can use a given ioctl.
792640981fSDaniel Vetter  */
802640981fSDaniel Vetter enum drm_ioctl_flags {
812640981fSDaniel Vetter 	/**
822640981fSDaniel Vetter 	 * @DRM_AUTH:
832640981fSDaniel Vetter 	 *
842640981fSDaniel Vetter 	 * This is for ioctl which are used for rendering, and require that the
852640981fSDaniel Vetter 	 * file descriptor is either for a render node, or if it's a
862640981fSDaniel Vetter 	 * legacy/primary node, then it must be authenticated.
872640981fSDaniel Vetter 	 */
882640981fSDaniel Vetter 	DRM_AUTH		= BIT(0),
892640981fSDaniel Vetter 	/**
902640981fSDaniel Vetter 	 * @DRM_MASTER:
912640981fSDaniel Vetter 	 *
922640981fSDaniel Vetter 	 * This must be set for any ioctl which can change the modeset or
932640981fSDaniel Vetter 	 * display state. Userspace must call the ioctl through a primary node,
942640981fSDaniel Vetter 	 * while it is the active master.
952640981fSDaniel Vetter 	 *
962640981fSDaniel Vetter 	 * Note that read-only modeset ioctl can also be called by
972640981fSDaniel Vetter 	 * unauthenticated clients, or when a master is not the currently active
982640981fSDaniel Vetter 	 * one.
992640981fSDaniel Vetter 	 */
1002640981fSDaniel Vetter 	DRM_MASTER		= BIT(1),
1012640981fSDaniel Vetter 	/**
1022640981fSDaniel Vetter 	 * @DRM_ROOT_ONLY:
1032640981fSDaniel Vetter 	 *
1042640981fSDaniel Vetter 	 * Anything that could potentially wreak a master file descriptor needs
1052640981fSDaniel Vetter 	 * to have this flag set. Current that's only for the SETMASTER and
1062640981fSDaniel Vetter 	 * DROPMASTER ioctl, which e.g. logind can call to force a non-behaving
1072640981fSDaniel Vetter 	 * master (display compositor) into compliance.
1082640981fSDaniel Vetter 	 *
1092640981fSDaniel Vetter 	 * This is equivalent to callers with the SYSADMIN capability.
1102640981fSDaniel Vetter 	 */
1112640981fSDaniel Vetter 	DRM_ROOT_ONLY		= BIT(2),
1122640981fSDaniel Vetter 	/**
1132640981fSDaniel Vetter 	 * @DRM_UNLOCKED:
1142640981fSDaniel Vetter 	 *
1152640981fSDaniel Vetter 	 * Whether &drm_ioctl_desc.func should be called with the DRM BKL held
1162640981fSDaniel Vetter 	 * or not. Enforced as the default for all modern drivers, hence there
1172640981fSDaniel Vetter 	 * should never be a need to set this flag.
11875426367SDaniel Vetter 	 *
11975426367SDaniel Vetter 	 * Do not use anywhere else than for the VBLANK_WAIT IOCTL, which is the
12075426367SDaniel Vetter 	 * only legacy IOCTL which needs this.
1212640981fSDaniel Vetter 	 */
1222640981fSDaniel Vetter 	DRM_UNLOCKED		= BIT(4),
1232640981fSDaniel Vetter 	/**
1242640981fSDaniel Vetter 	 * @DRM_RENDER_ALLOW:
1252640981fSDaniel Vetter 	 *
1262640981fSDaniel Vetter 	 * This is used for all ioctl needed for rendering only, for drivers
1272640981fSDaniel Vetter 	 * which support render nodes. This should be all new render drivers,
1282640981fSDaniel Vetter 	 * and hence it should be always set for any ioctl with DRM_AUTH set.
1292640981fSDaniel Vetter 	 * Note though that read-only query ioctl might have this set, but have
1302640981fSDaniel Vetter 	 * not set DRM_AUTH because they do not require authentication.
1312640981fSDaniel Vetter 	 */
1322640981fSDaniel Vetter 	DRM_RENDER_ALLOW	= BIT(5),
1332640981fSDaniel Vetter };
1347cfdf711SDaniel Vetter 
1352640981fSDaniel Vetter /**
1362640981fSDaniel Vetter  * struct drm_ioctl_desc - DRM driver ioctl entry
1372640981fSDaniel Vetter  * @cmd: ioctl command number, without flags
1382640981fSDaniel Vetter  * @flags: a bitmask of &enum drm_ioctl_flags
1392640981fSDaniel Vetter  * @func: handler for this ioctl
1402640981fSDaniel Vetter  * @name: user-readable name for debug output
1412640981fSDaniel Vetter  *
1422640981fSDaniel Vetter  * For convenience it's easier to create these using the DRM_IOCTL_DEF_DRV()
1432640981fSDaniel Vetter  * macro.
1442640981fSDaniel Vetter  */
1457cfdf711SDaniel Vetter struct drm_ioctl_desc {
1467cfdf711SDaniel Vetter 	unsigned int cmd;
1472640981fSDaniel Vetter 	enum drm_ioctl_flags flags;
1487cfdf711SDaniel Vetter 	drm_ioctl_t *func;
1497cfdf711SDaniel Vetter 	const char *name;
1507cfdf711SDaniel Vetter };
1517cfdf711SDaniel Vetter 
1527cfdf711SDaniel Vetter /**
1532640981fSDaniel Vetter  * DRM_IOCTL_DEF_DRV() - helper macro to fill out a &struct drm_ioctl_desc
1542640981fSDaniel Vetter  * @ioctl: ioctl command suffix
1552640981fSDaniel Vetter  * @_func: handler for the ioctl
1562640981fSDaniel Vetter  * @_flags: a bitmask of &enum drm_ioctl_flags
1572640981fSDaniel Vetter  *
1582640981fSDaniel Vetter  * Small helper macro to create a &struct drm_ioctl_desc entry. The ioctl
1592640981fSDaniel Vetter  * command number is constructed by prepending ``DRM_IOCTL\_`` and passing that
1602640981fSDaniel Vetter  * to DRM_IOCTL_NR().
1617cfdf711SDaniel Vetter  */
1627cfdf711SDaniel Vetter #define DRM_IOCTL_DEF_DRV(ioctl, _func, _flags)				\
1637cfdf711SDaniel Vetter 	[DRM_IOCTL_NR(DRM_IOCTL_##ioctl) - DRM_COMMAND_BASE] = {	\
1647cfdf711SDaniel Vetter 		.cmd = DRM_IOCTL_##ioctl,				\
1657cfdf711SDaniel Vetter 		.func = _func,						\
1667cfdf711SDaniel Vetter 		.flags = _flags,					\
1677cfdf711SDaniel Vetter 		.name = #ioctl						\
1687cfdf711SDaniel Vetter 	}
1697cfdf711SDaniel Vetter 
1707cfdf711SDaniel Vetter long drm_ioctl(struct file *filp, unsigned int cmd, unsigned long arg);
1717f0dfc16SAl Viro long drm_ioctl_kernel(struct file *, drm_ioctl_t, void *, u32);
1727cfdf711SDaniel Vetter #ifdef CONFIG_COMPAT
1737cfdf711SDaniel Vetter long drm_compat_ioctl(struct file *filp, unsigned int cmd, unsigned long arg);
1747cfdf711SDaniel Vetter #else
1757cfdf711SDaniel Vetter /* Let drm_compat_ioctl be assigned to .compat_ioctl unconditionally */
1767cfdf711SDaniel Vetter #define drm_compat_ioctl NULL
1777cfdf711SDaniel Vetter #endif
1787cfdf711SDaniel Vetter bool drm_ioctl_flags(unsigned int nr, unsigned int *flags);
1797cfdf711SDaniel Vetter 
1807cfdf711SDaniel Vetter int drm_noop(struct drm_device *dev, void *data,
1817cfdf711SDaniel Vetter 	     struct drm_file *file_priv);
1827cfdf711SDaniel Vetter int drm_invalid_op(struct drm_device *dev, void *data,
1837cfdf711SDaniel Vetter 		   struct drm_file *file_priv);
1847cfdf711SDaniel Vetter 
1857cfdf711SDaniel Vetter #endif /* _DRM_IOCTL_H_ */
186