1 | /* |
2 | * Internal Header for the Direct Rendering Manager |
3 | * |
4 | * Copyright 1999 Precision Insight, Inc., Cedar Park, Texas. |
5 | * Copyright 2000 VA Linux Systems, Inc., Sunnyvale, California. |
6 | * Copyright (c) 2009-2010, Code Aurora Forum. |
7 | * All rights reserved. |
8 | * |
9 | * Author: Rickard E. (Rik) Faith <faith@valinux.com> |
10 | * Author: Gareth Hughes <gareth@valinux.com> |
11 | * |
12 | * Permission is hereby granted, free of charge, to any person obtaining a |
13 | * copy of this software and associated documentation files (the "Software"), |
14 | * to deal in the Software without restriction, including without limitation |
15 | * the rights to use, copy, modify, merge, publish, distribute, sublicense, |
16 | * and/or sell copies of the Software, and to permit persons to whom the |
17 | * Software is furnished to do so, subject to the following conditions: |
18 | * |
19 | * The above copyright notice and this permission notice (including the next |
20 | * paragraph) shall be included in all copies or substantial portions of the |
21 | * Software. |
22 | * |
23 | * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR |
24 | * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, |
25 | * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL |
26 | * VA LINUX SYSTEMS AND/OR ITS SUPPLIERS BE LIABLE FOR ANY CLAIM, DAMAGES OR |
27 | * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, |
28 | * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR |
29 | * OTHER DEALINGS IN THE SOFTWARE. |
30 | */ |
31 | |
32 | #ifndef _DRM_IOCTL_H_ |
33 | #define _DRM_IOCTL_H_ |
34 | |
35 | #include <linux/types.h> |
36 | #include <linux/bitops.h> |
37 | |
38 | #include <asm/ioctl.h> |
39 | |
40 | struct drm_device; |
41 | struct drm_file; |
42 | struct file; |
43 | |
44 | /** |
45 | * drm_ioctl_t - DRM ioctl function type. |
46 | * @dev: DRM device inode |
47 | * @data: private pointer of the ioctl call |
48 | * @file_priv: DRM file this ioctl was made on |
49 | * |
50 | * This is the DRM ioctl typedef. Note that drm_ioctl() has alrady copied @data |
51 | * into kernel-space, and will also copy it back, depending upon the read/write |
52 | * settings in the ioctl command code. |
53 | */ |
54 | typedef int drm_ioctl_t(struct drm_device *dev, void *data, |
55 | struct drm_file *file_priv); |
56 | |
57 | /** |
58 | * drm_ioctl_compat_t - compatibility DRM ioctl function type. |
59 | * @filp: file pointer |
60 | * @cmd: ioctl command code |
61 | * @arg: DRM file this ioctl was made on |
62 | * |
63 | * Just a typedef to make declaring an array of compatibility handlers easier. |
64 | * New drivers shouldn't screw up the structure layout for their ioctl |
65 | * structures and hence never need this. |
66 | */ |
67 | typedef int drm_ioctl_compat_t(struct file *filp, unsigned int cmd, |
68 | unsigned long arg); |
69 | |
70 | #define DRM_IOCTL_NR(n) _IOC_NR(n) |
71 | #define DRM_IOCTL_TYPE(n) _IOC_TYPE(n) |
72 | #define DRM_MAJOR 226 |
73 | |
74 | /** |
75 | * enum drm_ioctl_flags - DRM ioctl flags |
76 | * |
77 | * Various flags that can be set in &drm_ioctl_desc.flags to control how |
78 | * userspace can use a given ioctl. |
79 | */ |
80 | enum drm_ioctl_flags { |
81 | /** |
82 | * @DRM_AUTH: |
83 | * |
84 | * This is for ioctl which are used for rendering, and require that the |
85 | * file descriptor is either for a render node, or if it's a |
86 | * legacy/primary node, then it must be authenticated. |
87 | */ |
88 | DRM_AUTH = BIT(0), |
89 | /** |
90 | * @DRM_MASTER: |
91 | * |
92 | * This must be set for any ioctl which can change the modeset or |
93 | * display state. Userspace must call the ioctl through a primary node, |
94 | * while it is the active master. |
95 | * |
96 | * Note that read-only modeset ioctl can also be called by |
97 | * unauthenticated clients, or when a master is not the currently active |
98 | * one. |
99 | */ |
100 | DRM_MASTER = BIT(1), |
101 | /** |
102 | * @DRM_ROOT_ONLY: |
103 | * |
104 | * Anything that could potentially wreak a master file descriptor needs |
105 | * to have this flag set. Current that's only for the SETMASTER and |
106 | * DROPMASTER ioctl, which e.g. logind can call to force a non-behaving |
107 | * master (display compositor) into compliance. |
108 | * |
109 | * This is equivalent to callers with the SYSADMIN capability. |
110 | */ |
111 | DRM_ROOT_ONLY = BIT(2), |
112 | /** |
113 | * @DRM_UNLOCKED: |
114 | * |
115 | * Whether &drm_ioctl_desc.func should be called with the DRM BKL held |
116 | * or not. Enforced as the default for all modern drivers, hence there |
117 | * should never be a need to set this flag. |
118 | * |
119 | * Do not use anywhere else than for the VBLANK_WAIT IOCTL, which is the |
120 | * only legacy IOCTL which needs this. |
121 | */ |
122 | DRM_UNLOCKED = BIT(4), |
123 | /** |
124 | * @DRM_RENDER_ALLOW: |
125 | * |
126 | * This is used for all ioctl needed for rendering only, for drivers |
127 | * which support render nodes. This should be all new render drivers, |
128 | * and hence it should be always set for any ioctl with DRM_AUTH set. |
129 | * Note though that read-only query ioctl might have this set, but have |
130 | * not set DRM_AUTH because they do not require authentication. |
131 | */ |
132 | DRM_RENDER_ALLOW = BIT(5), |
133 | }; |
134 | |
135 | /** |
136 | * struct drm_ioctl_desc - DRM driver ioctl entry |
137 | * @cmd: ioctl command number, without flags |
138 | * @flags: a bitmask of &enum drm_ioctl_flags |
139 | * @func: handler for this ioctl |
140 | * @name: user-readable name for debug output |
141 | * |
142 | * For convenience it's easier to create these using the DRM_IOCTL_DEF_DRV() |
143 | * macro. |
144 | */ |
145 | struct drm_ioctl_desc { |
146 | unsigned int cmd; |
147 | enum drm_ioctl_flags flags; |
148 | drm_ioctl_t *func; |
149 | const char *name; |
150 | }; |
151 | |
152 | /** |
153 | * DRM_IOCTL_DEF_DRV() - helper macro to fill out a &struct drm_ioctl_desc |
154 | * @ioctl: ioctl command suffix |
155 | * @_func: handler for the ioctl |
156 | * @_flags: a bitmask of &enum drm_ioctl_flags |
157 | * |
158 | * Small helper macro to create a &struct drm_ioctl_desc entry. The ioctl |
159 | * command number is constructed by prepending ``DRM_IOCTL\_`` and passing that |
160 | * to DRM_IOCTL_NR(). |
161 | */ |
162 | #define DRM_IOCTL_DEF_DRV(ioctl, _func, _flags) \ |
163 | [DRM_IOCTL_NR(DRM_IOCTL_##ioctl) - DRM_COMMAND_BASE] = { \ |
164 | .cmd = DRM_IOCTL_##ioctl, \ |
165 | .func = _func, \ |
166 | .flags = _flags, \ |
167 | .name = #ioctl \ |
168 | } |
169 | |
170 | long drm_ioctl(struct file *filp, unsigned int cmd, unsigned long arg); |
171 | long drm_ioctl_kernel(struct file *, drm_ioctl_t, void *, u32); |
172 | #ifdef CONFIG_COMPAT |
173 | long drm_compat_ioctl(struct file *filp, unsigned int cmd, unsigned long arg); |
174 | #else |
175 | /* Let drm_compat_ioctl be assigned to .compat_ioctl unconditionally */ |
176 | #define drm_compat_ioctl NULL |
177 | #endif |
178 | bool drm_ioctl_flags(unsigned int nr, unsigned int *flags); |
179 | |
180 | int drm_noop(struct drm_device *dev, void *data, |
181 | struct drm_file *file_priv); |
182 | int drm_invalid_op(struct drm_device *dev, void *data, |
183 | struct drm_file *file_priv); |
184 | |
185 | #endif /* _DRM_IOCTL_H_ */ |
186 | |