1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31#include <drm/drm_ioctl.h>
32#include <drm/drmP.h>
33#include <drm/drm_auth.h>
34#include "drm_legacy.h"
35#include "drm_internal.h"
36#include "drm_crtc_internal.h"
37
38#include <linux/pci.h>
39#include <linux/export.h>
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110int drm_getunique(struct drm_device *dev, void *data,
111 struct drm_file *file_priv)
112{
113 struct drm_unique *u = data;
114 struct drm_master *master = file_priv->master;
115
116 mutex_lock(&master->dev->master_mutex);
117 if (u->unique_len >= master->unique_len) {
118 if (copy_to_user(u->unique, master->unique, master->unique_len)) {
119 mutex_unlock(&master->dev->master_mutex);
120 return -EFAULT;
121 }
122 }
123 u->unique_len = master->unique_len;
124 mutex_unlock(&master->dev->master_mutex);
125
126 return 0;
127}
128
129static void
130drm_unset_busid(struct drm_device *dev,
131 struct drm_master *master)
132{
133 kfree(master->unique);
134 master->unique = NULL;
135 master->unique_len = 0;
136}
137
138static int drm_set_busid(struct drm_device *dev, struct drm_file *file_priv)
139{
140 struct drm_master *master = file_priv->master;
141 int ret;
142
143 if (master->unique != NULL)
144 drm_unset_busid(dev, master);
145
146 if (dev->dev && dev_is_pci(dev->dev)) {
147 ret = drm_pci_set_busid(dev, master);
148 if (ret) {
149 drm_unset_busid(dev, master);
150 return ret;
151 }
152 } else {
153 WARN_ON(!dev->unique);
154 master->unique = kstrdup(dev->unique, GFP_KERNEL);
155 if (master->unique)
156 master->unique_len = strlen(dev->unique);
157 }
158
159 return 0;
160}
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175int drm_getclient(struct drm_device *dev, void *data,
176 struct drm_file *file_priv)
177{
178 struct drm_client *client = data;
179
180
181
182
183
184
185
186
187
188
189
190
191 if (client->idx == 0) {
192 client->auth = file_priv->authenticated;
193 client->pid = task_pid_vnr(current);
194 client->uid = overflowuid;
195 client->magic = 0;
196 client->iocs = 0;
197
198 return 0;
199 } else {
200 return -EINVAL;
201 }
202}
203
204
205
206
207
208
209
210
211
212
213
214static int drm_getstats(struct drm_device *dev, void *data,
215 struct drm_file *file_priv)
216{
217 struct drm_stats *stats = data;
218
219
220 memset(stats, 0, sizeof(*stats));
221
222 return 0;
223}
224
225
226
227
228static int drm_getcap(struct drm_device *dev, void *data, struct drm_file *file_priv)
229{
230 struct drm_get_cap *req = data;
231 struct drm_crtc *crtc;
232
233 req->value = 0;
234
235
236 switch (req->capability) {
237 case DRM_CAP_TIMESTAMP_MONOTONIC:
238 req->value = drm_timestamp_monotonic;
239 return 0;
240 case DRM_CAP_PRIME:
241 req->value |= dev->driver->prime_fd_to_handle ? DRM_PRIME_CAP_IMPORT : 0;
242 req->value |= dev->driver->prime_handle_to_fd ? DRM_PRIME_CAP_EXPORT : 0;
243 return 0;
244 case DRM_CAP_SYNCOBJ:
245 req->value = drm_core_check_feature(dev, DRIVER_SYNCOBJ);
246 return 0;
247 }
248
249
250 if (!drm_core_check_feature(dev, DRIVER_MODESET))
251 return -ENOTSUPP;
252
253 switch (req->capability) {
254 case DRM_CAP_DUMB_BUFFER:
255 if (dev->driver->dumb_create)
256 req->value = 1;
257 break;
258 case DRM_CAP_VBLANK_HIGH_CRTC:
259 req->value = 1;
260 break;
261 case DRM_CAP_DUMB_PREFERRED_DEPTH:
262 req->value = dev->mode_config.preferred_depth;
263 break;
264 case DRM_CAP_DUMB_PREFER_SHADOW:
265 req->value = dev->mode_config.prefer_shadow;
266 break;
267 case DRM_CAP_ASYNC_PAGE_FLIP:
268 req->value = dev->mode_config.async_page_flip;
269 break;
270 case DRM_CAP_PAGE_FLIP_TARGET:
271 req->value = 1;
272 drm_for_each_crtc(crtc, dev) {
273 if (!crtc->funcs->page_flip_target)
274 req->value = 0;
275 }
276 break;
277 case DRM_CAP_CURSOR_WIDTH:
278 if (dev->mode_config.cursor_width)
279 req->value = dev->mode_config.cursor_width;
280 else
281 req->value = 64;
282 break;
283 case DRM_CAP_CURSOR_HEIGHT:
284 if (dev->mode_config.cursor_height)
285 req->value = dev->mode_config.cursor_height;
286 else
287 req->value = 64;
288 break;
289 case DRM_CAP_ADDFB2_MODIFIERS:
290 req->value = dev->mode_config.allow_fb_modifiers;
291 break;
292 case DRM_CAP_CRTC_IN_VBLANK_EVENT:
293 req->value = 1;
294 break;
295 default:
296 return -EINVAL;
297 }
298 return 0;
299}
300
301
302
303
304static int
305drm_setclientcap(struct drm_device *dev, void *data, struct drm_file *file_priv)
306{
307 struct drm_set_client_cap *req = data;
308
309 switch (req->capability) {
310 case DRM_CLIENT_CAP_STEREO_3D:
311 if (req->value > 1)
312 return -EINVAL;
313 file_priv->stereo_allowed = req->value;
314 break;
315 case DRM_CLIENT_CAP_UNIVERSAL_PLANES:
316 if (req->value > 1)
317 return -EINVAL;
318 file_priv->universal_planes = req->value;
319 break;
320 case DRM_CLIENT_CAP_ATOMIC:
321 if (!drm_core_check_feature(dev, DRIVER_ATOMIC))
322 return -EINVAL;
323 if (req->value > 1)
324 return -EINVAL;
325 file_priv->atomic = req->value;
326 file_priv->universal_planes = req->value;
327 break;
328 default:
329 return -EINVAL;
330 }
331
332 return 0;
333}
334
335
336
337
338
339
340
341
342
343
344
345
346static int drm_setversion(struct drm_device *dev, void *data, struct drm_file *file_priv)
347{
348 struct drm_set_version *sv = data;
349 int if_version, retcode = 0;
350
351 mutex_lock(&dev->master_mutex);
352 if (sv->drm_di_major != -1) {
353 if (sv->drm_di_major != DRM_IF_MAJOR ||
354 sv->drm_di_minor < 0 || sv->drm_di_minor > DRM_IF_MINOR) {
355 retcode = -EINVAL;
356 goto done;
357 }
358 if_version = DRM_IF_VERSION(sv->drm_di_major,
359 sv->drm_di_minor);
360 dev->if_version = max(if_version, dev->if_version);
361 if (sv->drm_di_minor >= 1) {
362
363
364
365
366 retcode = drm_set_busid(dev, file_priv);
367 if (retcode)
368 goto done;
369 }
370 }
371
372 if (sv->drm_dd_major != -1) {
373 if (sv->drm_dd_major != dev->driver->major ||
374 sv->drm_dd_minor < 0 || sv->drm_dd_minor >
375 dev->driver->minor) {
376 retcode = -EINVAL;
377 goto done;
378 }
379 }
380
381done:
382 sv->drm_di_major = DRM_IF_MAJOR;
383 sv->drm_di_minor = DRM_IF_MINOR;
384 sv->drm_dd_major = dev->driver->major;
385 sv->drm_dd_minor = dev->driver->minor;
386 mutex_unlock(&dev->master_mutex);
387
388 return retcode;
389}
390
391
392
393
394
395
396
397
398
399
400
401
402
403int drm_noop(struct drm_device *dev, void *data,
404 struct drm_file *file_priv)
405{
406 DRM_DEBUG("\n");
407 return 0;
408}
409EXPORT_SYMBOL(drm_noop);
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426int drm_invalid_op(struct drm_device *dev, void *data,
427 struct drm_file *file_priv)
428{
429 return -EINVAL;
430}
431EXPORT_SYMBOL(drm_invalid_op);
432
433
434
435
436static int drm_copy_field(char __user *buf, size_t *buf_len, const char *value)
437{
438 int len;
439
440
441 len = strlen(value);
442 if (len > *buf_len)
443 len = *buf_len;
444
445
446
447 *buf_len = strlen(value);
448
449
450 if (len && buf)
451 if (copy_to_user(buf, value, len))
452 return -EFAULT;
453 return 0;
454}
455
456
457
458
459
460
461
462
463
464
465
466
467int drm_version(struct drm_device *dev, void *data,
468 struct drm_file *file_priv)
469{
470 struct drm_version *version = data;
471 int err;
472
473 version->version_major = dev->driver->major;
474 version->version_minor = dev->driver->minor;
475 version->version_patchlevel = dev->driver->patchlevel;
476 err = drm_copy_field(version->name, &version->name_len,
477 dev->driver->name);
478 if (!err)
479 err = drm_copy_field(version->date, &version->date_len,
480 dev->driver->date);
481 if (!err)
482 err = drm_copy_field(version->desc, &version->desc_len,
483 dev->driver->desc);
484
485 return err;
486}
487
488
489
490
491
492
493
494
495
496
497
498
499
500int drm_ioctl_permit(u32 flags, struct drm_file *file_priv)
501{
502
503 if (unlikely((flags & DRM_ROOT_ONLY) && !capable(CAP_SYS_ADMIN)))
504 return -EACCES;
505
506
507 if (unlikely((flags & DRM_AUTH) && !drm_is_render_client(file_priv) &&
508 !file_priv->authenticated))
509 return -EACCES;
510
511
512 if (unlikely((flags & DRM_MASTER) &&
513 !drm_is_current_master(file_priv) &&
514 !drm_is_control_client(file_priv)))
515 return -EACCES;
516
517
518 if (unlikely(!(flags & DRM_CONTROL_ALLOW) &&
519 drm_is_control_client(file_priv)))
520 return -EACCES;
521
522
523 if (unlikely(!(flags & DRM_RENDER_ALLOW) &&
524 drm_is_render_client(file_priv)))
525 return -EACCES;
526
527 return 0;
528}
529EXPORT_SYMBOL(drm_ioctl_permit);
530
531#define DRM_IOCTL_DEF(ioctl, _func, _flags) \
532 [DRM_IOCTL_NR(ioctl)] = { \
533 .cmd = ioctl, \
534 .func = _func, \
535 .flags = _flags, \
536 .name = #ioctl \
537 }
538
539
540static const struct drm_ioctl_desc drm_ioctls[] = {
541 DRM_IOCTL_DEF(DRM_IOCTL_VERSION, drm_version,
542 DRM_UNLOCKED|DRM_RENDER_ALLOW|DRM_CONTROL_ALLOW),
543 DRM_IOCTL_DEF(DRM_IOCTL_GET_UNIQUE, drm_getunique, DRM_UNLOCKED),
544 DRM_IOCTL_DEF(DRM_IOCTL_GET_MAGIC, drm_getmagic, DRM_UNLOCKED),
545 DRM_IOCTL_DEF(DRM_IOCTL_IRQ_BUSID, drm_irq_by_busid, DRM_MASTER|DRM_ROOT_ONLY),
546 DRM_IOCTL_DEF(DRM_IOCTL_GET_MAP, drm_legacy_getmap_ioctl, DRM_UNLOCKED),
547 DRM_IOCTL_DEF(DRM_IOCTL_GET_CLIENT, drm_getclient, DRM_UNLOCKED),
548 DRM_IOCTL_DEF(DRM_IOCTL_GET_STATS, drm_getstats, DRM_UNLOCKED),
549 DRM_IOCTL_DEF(DRM_IOCTL_GET_CAP, drm_getcap, DRM_UNLOCKED|DRM_RENDER_ALLOW),
550 DRM_IOCTL_DEF(DRM_IOCTL_SET_CLIENT_CAP, drm_setclientcap, DRM_UNLOCKED),
551 DRM_IOCTL_DEF(DRM_IOCTL_SET_VERSION, drm_setversion, DRM_UNLOCKED | DRM_MASTER),
552
553 DRM_IOCTL_DEF(DRM_IOCTL_SET_UNIQUE, drm_invalid_op, DRM_AUTH|DRM_MASTER|DRM_ROOT_ONLY),
554 DRM_IOCTL_DEF(DRM_IOCTL_BLOCK, drm_noop, DRM_AUTH|DRM_MASTER|DRM_ROOT_ONLY),
555 DRM_IOCTL_DEF(DRM_IOCTL_UNBLOCK, drm_noop, DRM_AUTH|DRM_MASTER|DRM_ROOT_ONLY),
556 DRM_IOCTL_DEF(DRM_IOCTL_AUTH_MAGIC, drm_authmagic, DRM_AUTH|DRM_UNLOCKED|DRM_MASTER),
557
558 DRM_IOCTL_DEF(DRM_IOCTL_ADD_MAP, drm_legacy_addmap_ioctl, DRM_AUTH|DRM_MASTER|DRM_ROOT_ONLY),
559 DRM_IOCTL_DEF(DRM_IOCTL_RM_MAP, drm_legacy_rmmap_ioctl, DRM_AUTH),
560
561 DRM_IOCTL_DEF(DRM_IOCTL_SET_SAREA_CTX, drm_legacy_setsareactx, DRM_AUTH|DRM_MASTER|DRM_ROOT_ONLY),
562 DRM_IOCTL_DEF(DRM_IOCTL_GET_SAREA_CTX, drm_legacy_getsareactx, DRM_AUTH),
563
564 DRM_IOCTL_DEF(DRM_IOCTL_SET_MASTER, drm_setmaster_ioctl, DRM_UNLOCKED|DRM_ROOT_ONLY),
565 DRM_IOCTL_DEF(DRM_IOCTL_DROP_MASTER, drm_dropmaster_ioctl, DRM_UNLOCKED|DRM_ROOT_ONLY),
566
567 DRM_IOCTL_DEF(DRM_IOCTL_ADD_CTX, drm_legacy_addctx, DRM_AUTH|DRM_ROOT_ONLY),
568 DRM_IOCTL_DEF(DRM_IOCTL_RM_CTX, drm_legacy_rmctx, DRM_AUTH|DRM_MASTER|DRM_ROOT_ONLY),
569 DRM_IOCTL_DEF(DRM_IOCTL_MOD_CTX, drm_noop, DRM_AUTH|DRM_MASTER|DRM_ROOT_ONLY),
570 DRM_IOCTL_DEF(DRM_IOCTL_GET_CTX, drm_legacy_getctx, DRM_AUTH),
571 DRM_IOCTL_DEF(DRM_IOCTL_SWITCH_CTX, drm_legacy_switchctx, DRM_AUTH|DRM_MASTER|DRM_ROOT_ONLY),
572 DRM_IOCTL_DEF(DRM_IOCTL_NEW_CTX, drm_legacy_newctx, DRM_AUTH|DRM_MASTER|DRM_ROOT_ONLY),
573 DRM_IOCTL_DEF(DRM_IOCTL_RES_CTX, drm_legacy_resctx, DRM_AUTH),
574
575 DRM_IOCTL_DEF(DRM_IOCTL_ADD_DRAW, drm_noop, DRM_AUTH|DRM_MASTER|DRM_ROOT_ONLY),
576 DRM_IOCTL_DEF(DRM_IOCTL_RM_DRAW, drm_noop, DRM_AUTH|DRM_MASTER|DRM_ROOT_ONLY),
577
578 DRM_IOCTL_DEF(DRM_IOCTL_LOCK, drm_legacy_lock, DRM_AUTH),
579 DRM_IOCTL_DEF(DRM_IOCTL_UNLOCK, drm_legacy_unlock, DRM_AUTH),
580
581 DRM_IOCTL_DEF(DRM_IOCTL_FINISH, drm_noop, DRM_AUTH),
582
583 DRM_IOCTL_DEF(DRM_IOCTL_ADD_BUFS, drm_legacy_addbufs, DRM_AUTH|DRM_MASTER|DRM_ROOT_ONLY),
584 DRM_IOCTL_DEF(DRM_IOCTL_MARK_BUFS, drm_legacy_markbufs, DRM_AUTH|DRM_MASTER|DRM_ROOT_ONLY),
585 DRM_IOCTL_DEF(DRM_IOCTL_INFO_BUFS, drm_legacy_infobufs, DRM_AUTH),
586 DRM_IOCTL_DEF(DRM_IOCTL_MAP_BUFS, drm_legacy_mapbufs, DRM_AUTH),
587 DRM_IOCTL_DEF(DRM_IOCTL_FREE_BUFS, drm_legacy_freebufs, DRM_AUTH),
588 DRM_IOCTL_DEF(DRM_IOCTL_DMA, drm_legacy_dma_ioctl, DRM_AUTH),
589
590 DRM_IOCTL_DEF(DRM_IOCTL_CONTROL, drm_legacy_irq_control, DRM_AUTH|DRM_MASTER|DRM_ROOT_ONLY),
591
592#if IS_ENABLED(CONFIG_AGP)
593 DRM_IOCTL_DEF(DRM_IOCTL_AGP_ACQUIRE, drm_agp_acquire_ioctl, DRM_AUTH|DRM_MASTER|DRM_ROOT_ONLY),
594 DRM_IOCTL_DEF(DRM_IOCTL_AGP_RELEASE, drm_agp_release_ioctl, DRM_AUTH|DRM_MASTER|DRM_ROOT_ONLY),
595 DRM_IOCTL_DEF(DRM_IOCTL_AGP_ENABLE, drm_agp_enable_ioctl, DRM_AUTH|DRM_MASTER|DRM_ROOT_ONLY),
596 DRM_IOCTL_DEF(DRM_IOCTL_AGP_INFO, drm_agp_info_ioctl, DRM_AUTH),
597 DRM_IOCTL_DEF(DRM_IOCTL_AGP_ALLOC, drm_agp_alloc_ioctl, DRM_AUTH|DRM_MASTER|DRM_ROOT_ONLY),
598 DRM_IOCTL_DEF(DRM_IOCTL_AGP_FREE, drm_agp_free_ioctl, DRM_AUTH|DRM_MASTER|DRM_ROOT_ONLY),
599 DRM_IOCTL_DEF(DRM_IOCTL_AGP_BIND, drm_agp_bind_ioctl, DRM_AUTH|DRM_MASTER|DRM_ROOT_ONLY),
600 DRM_IOCTL_DEF(DRM_IOCTL_AGP_UNBIND, drm_agp_unbind_ioctl, DRM_AUTH|DRM_MASTER|DRM_ROOT_ONLY),
601#endif
602
603 DRM_IOCTL_DEF(DRM_IOCTL_SG_ALLOC, drm_legacy_sg_alloc, DRM_AUTH|DRM_MASTER|DRM_ROOT_ONLY),
604 DRM_IOCTL_DEF(DRM_IOCTL_SG_FREE, drm_legacy_sg_free, DRM_AUTH|DRM_MASTER|DRM_ROOT_ONLY),
605
606 DRM_IOCTL_DEF(DRM_IOCTL_WAIT_VBLANK, drm_wait_vblank_ioctl, DRM_UNLOCKED),
607
608 DRM_IOCTL_DEF(DRM_IOCTL_MODESET_CTL, drm_legacy_modeset_ctl_ioctl, 0),
609
610 DRM_IOCTL_DEF(DRM_IOCTL_UPDATE_DRAW, drm_noop, DRM_AUTH|DRM_MASTER|DRM_ROOT_ONLY),
611
612 DRM_IOCTL_DEF(DRM_IOCTL_GEM_CLOSE, drm_gem_close_ioctl, DRM_UNLOCKED|DRM_RENDER_ALLOW),
613 DRM_IOCTL_DEF(DRM_IOCTL_GEM_FLINK, drm_gem_flink_ioctl, DRM_AUTH|DRM_UNLOCKED),
614 DRM_IOCTL_DEF(DRM_IOCTL_GEM_OPEN, drm_gem_open_ioctl, DRM_AUTH|DRM_UNLOCKED),
615
616 DRM_IOCTL_DEF(DRM_IOCTL_MODE_GETRESOURCES, drm_mode_getresources, DRM_CONTROL_ALLOW|DRM_UNLOCKED),
617
618 DRM_IOCTL_DEF(DRM_IOCTL_PRIME_HANDLE_TO_FD, drm_prime_handle_to_fd_ioctl, DRM_AUTH|DRM_UNLOCKED|DRM_RENDER_ALLOW),
619 DRM_IOCTL_DEF(DRM_IOCTL_PRIME_FD_TO_HANDLE, drm_prime_fd_to_handle_ioctl, DRM_AUTH|DRM_UNLOCKED|DRM_RENDER_ALLOW),
620
621 DRM_IOCTL_DEF(DRM_IOCTL_MODE_GETPLANERESOURCES, drm_mode_getplane_res, DRM_CONTROL_ALLOW|DRM_UNLOCKED),
622 DRM_IOCTL_DEF(DRM_IOCTL_MODE_GETCRTC, drm_mode_getcrtc, DRM_CONTROL_ALLOW|DRM_UNLOCKED),
623 DRM_IOCTL_DEF(DRM_IOCTL_MODE_SETCRTC, drm_mode_setcrtc, DRM_MASTER|DRM_CONTROL_ALLOW|DRM_UNLOCKED),
624 DRM_IOCTL_DEF(DRM_IOCTL_MODE_GETPLANE, drm_mode_getplane, DRM_CONTROL_ALLOW|DRM_UNLOCKED),
625 DRM_IOCTL_DEF(DRM_IOCTL_MODE_SETPLANE, drm_mode_setplane, DRM_MASTER|DRM_CONTROL_ALLOW|DRM_UNLOCKED),
626 DRM_IOCTL_DEF(DRM_IOCTL_MODE_CURSOR, drm_mode_cursor_ioctl, DRM_MASTER|DRM_CONTROL_ALLOW|DRM_UNLOCKED),
627 DRM_IOCTL_DEF(DRM_IOCTL_MODE_GETGAMMA, drm_mode_gamma_get_ioctl, DRM_UNLOCKED),
628 DRM_IOCTL_DEF(DRM_IOCTL_MODE_SETGAMMA, drm_mode_gamma_set_ioctl, DRM_MASTER|DRM_UNLOCKED),
629 DRM_IOCTL_DEF(DRM_IOCTL_MODE_GETENCODER, drm_mode_getencoder, DRM_CONTROL_ALLOW|DRM_UNLOCKED),
630 DRM_IOCTL_DEF(DRM_IOCTL_MODE_GETCONNECTOR, drm_mode_getconnector, DRM_CONTROL_ALLOW|DRM_UNLOCKED),
631 DRM_IOCTL_DEF(DRM_IOCTL_MODE_ATTACHMODE, drm_noop, DRM_MASTER|DRM_CONTROL_ALLOW|DRM_UNLOCKED),
632 DRM_IOCTL_DEF(DRM_IOCTL_MODE_DETACHMODE, drm_noop, DRM_MASTER|DRM_CONTROL_ALLOW|DRM_UNLOCKED),
633 DRM_IOCTL_DEF(DRM_IOCTL_MODE_GETPROPERTY, drm_mode_getproperty_ioctl, DRM_CONTROL_ALLOW|DRM_UNLOCKED),
634 DRM_IOCTL_DEF(DRM_IOCTL_MODE_SETPROPERTY, drm_mode_connector_property_set_ioctl, DRM_MASTER|DRM_CONTROL_ALLOW|DRM_UNLOCKED),
635 DRM_IOCTL_DEF(DRM_IOCTL_MODE_GETPROPBLOB, drm_mode_getblob_ioctl, DRM_CONTROL_ALLOW|DRM_UNLOCKED),
636 DRM_IOCTL_DEF(DRM_IOCTL_MODE_GETFB, drm_mode_getfb, DRM_CONTROL_ALLOW|DRM_UNLOCKED),
637 DRM_IOCTL_DEF(DRM_IOCTL_MODE_ADDFB, drm_mode_addfb, DRM_CONTROL_ALLOW|DRM_UNLOCKED),
638 DRM_IOCTL_DEF(DRM_IOCTL_MODE_ADDFB2, drm_mode_addfb2, DRM_CONTROL_ALLOW|DRM_UNLOCKED),
639 DRM_IOCTL_DEF(DRM_IOCTL_MODE_RMFB, drm_mode_rmfb, DRM_CONTROL_ALLOW|DRM_UNLOCKED),
640 DRM_IOCTL_DEF(DRM_IOCTL_MODE_PAGE_FLIP, drm_mode_page_flip_ioctl, DRM_MASTER|DRM_CONTROL_ALLOW|DRM_UNLOCKED),
641 DRM_IOCTL_DEF(DRM_IOCTL_MODE_DIRTYFB, drm_mode_dirtyfb_ioctl, DRM_MASTER|DRM_CONTROL_ALLOW|DRM_UNLOCKED),
642 DRM_IOCTL_DEF(DRM_IOCTL_MODE_CREATE_DUMB, drm_mode_create_dumb_ioctl, DRM_CONTROL_ALLOW|DRM_UNLOCKED),
643 DRM_IOCTL_DEF(DRM_IOCTL_MODE_MAP_DUMB, drm_mode_mmap_dumb_ioctl, DRM_CONTROL_ALLOW|DRM_UNLOCKED),
644 DRM_IOCTL_DEF(DRM_IOCTL_MODE_DESTROY_DUMB, drm_mode_destroy_dumb_ioctl, DRM_CONTROL_ALLOW|DRM_UNLOCKED),
645 DRM_IOCTL_DEF(DRM_IOCTL_MODE_OBJ_GETPROPERTIES, drm_mode_obj_get_properties_ioctl, DRM_CONTROL_ALLOW|DRM_UNLOCKED),
646 DRM_IOCTL_DEF(DRM_IOCTL_MODE_OBJ_SETPROPERTY, drm_mode_obj_set_property_ioctl, DRM_MASTER|DRM_CONTROL_ALLOW|DRM_UNLOCKED),
647 DRM_IOCTL_DEF(DRM_IOCTL_MODE_CURSOR2, drm_mode_cursor2_ioctl, DRM_MASTER|DRM_CONTROL_ALLOW|DRM_UNLOCKED),
648 DRM_IOCTL_DEF(DRM_IOCTL_MODE_ATOMIC, drm_mode_atomic_ioctl, DRM_MASTER|DRM_CONTROL_ALLOW|DRM_UNLOCKED),
649 DRM_IOCTL_DEF(DRM_IOCTL_MODE_CREATEPROPBLOB, drm_mode_createblob_ioctl, DRM_CONTROL_ALLOW|DRM_UNLOCKED),
650 DRM_IOCTL_DEF(DRM_IOCTL_MODE_DESTROYPROPBLOB, drm_mode_destroyblob_ioctl, DRM_CONTROL_ALLOW|DRM_UNLOCKED),
651
652 DRM_IOCTL_DEF(DRM_IOCTL_SYNCOBJ_CREATE, drm_syncobj_create_ioctl,
653 DRM_UNLOCKED|DRM_RENDER_ALLOW),
654 DRM_IOCTL_DEF(DRM_IOCTL_SYNCOBJ_DESTROY, drm_syncobj_destroy_ioctl,
655 DRM_UNLOCKED|DRM_RENDER_ALLOW),
656 DRM_IOCTL_DEF(DRM_IOCTL_SYNCOBJ_HANDLE_TO_FD, drm_syncobj_handle_to_fd_ioctl,
657 DRM_UNLOCKED|DRM_RENDER_ALLOW),
658 DRM_IOCTL_DEF(DRM_IOCTL_SYNCOBJ_FD_TO_HANDLE, drm_syncobj_fd_to_handle_ioctl,
659 DRM_UNLOCKED|DRM_RENDER_ALLOW),
660 DRM_IOCTL_DEF(DRM_IOCTL_SYNCOBJ_WAIT, drm_syncobj_wait_ioctl,
661 DRM_UNLOCKED|DRM_RENDER_ALLOW),
662 DRM_IOCTL_DEF(DRM_IOCTL_SYNCOBJ_RESET, drm_syncobj_reset_ioctl,
663 DRM_UNLOCKED|DRM_RENDER_ALLOW),
664 DRM_IOCTL_DEF(DRM_IOCTL_SYNCOBJ_SIGNAL, drm_syncobj_signal_ioctl,
665 DRM_UNLOCKED|DRM_RENDER_ALLOW),
666};
667
668#define DRM_CORE_IOCTL_COUNT ARRAY_SIZE( drm_ioctls )
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718long drm_ioctl_kernel(struct file *file, drm_ioctl_t *func, void *kdata,
719 u32 flags)
720{
721 struct drm_file *file_priv = file->private_data;
722 struct drm_device *dev = file_priv->minor->dev;
723 int retcode;
724
725 if (drm_dev_is_unplugged(dev))
726 return -ENODEV;
727
728 retcode = drm_ioctl_permit(flags, file_priv);
729 if (unlikely(retcode))
730 return retcode;
731
732
733 if (!drm_core_check_feature(dev, DRIVER_LEGACY) ||
734 (flags & DRM_UNLOCKED))
735 retcode = func(dev, kdata, file_priv);
736 else {
737 mutex_lock(&drm_global_mutex);
738 retcode = func(dev, kdata, file_priv);
739 mutex_unlock(&drm_global_mutex);
740 }
741 return retcode;
742}
743EXPORT_SYMBOL(drm_ioctl_kernel);
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758long drm_ioctl(struct file *filp,
759 unsigned int cmd, unsigned long arg)
760{
761 struct drm_file *file_priv = filp->private_data;
762 struct drm_device *dev;
763 const struct drm_ioctl_desc *ioctl = NULL;
764 drm_ioctl_t *func;
765 unsigned int nr = DRM_IOCTL_NR(cmd);
766 int retcode = -EINVAL;
767 char stack_kdata[128];
768 char *kdata = NULL;
769 unsigned int in_size, out_size, drv_size, ksize;
770 bool is_driver_ioctl;
771
772 dev = file_priv->minor->dev;
773
774 if (drm_dev_is_unplugged(dev))
775 return -ENODEV;
776
777 is_driver_ioctl = nr >= DRM_COMMAND_BASE && nr < DRM_COMMAND_END;
778
779 if (is_driver_ioctl) {
780
781 if (nr - DRM_COMMAND_BASE >= dev->driver->num_ioctls)
782 goto err_i1;
783 ioctl = &dev->driver->ioctls[nr - DRM_COMMAND_BASE];
784 } else {
785
786 if (nr >= DRM_CORE_IOCTL_COUNT)
787 goto err_i1;
788 ioctl = &drm_ioctls[nr];
789 }
790
791 drv_size = _IOC_SIZE(ioctl->cmd);
792 out_size = in_size = _IOC_SIZE(cmd);
793 if ((cmd & ioctl->cmd & IOC_IN) == 0)
794 in_size = 0;
795 if ((cmd & ioctl->cmd & IOC_OUT) == 0)
796 out_size = 0;
797 ksize = max(max(in_size, out_size), drv_size);
798
799 DRM_DEBUG("pid=%d, dev=0x%lx, auth=%d, %s\n",
800 task_pid_nr(current),
801 (long)old_encode_dev(file_priv->minor->kdev->devt),
802 file_priv->authenticated, ioctl->name);
803
804
805 func = ioctl->func;
806
807 if (unlikely(!func)) {
808 DRM_DEBUG("no function\n");
809 retcode = -EINVAL;
810 goto err_i1;
811 }
812
813 if (ksize <= sizeof(stack_kdata)) {
814 kdata = stack_kdata;
815 } else {
816 kdata = kmalloc(ksize, GFP_KERNEL);
817 if (!kdata) {
818 retcode = -ENOMEM;
819 goto err_i1;
820 }
821 }
822
823 if (copy_from_user(kdata, (void __user *)arg, in_size) != 0) {
824 retcode = -EFAULT;
825 goto err_i1;
826 }
827
828 if (ksize > in_size)
829 memset(kdata + in_size, 0, ksize - in_size);
830
831 retcode = drm_ioctl_kernel(filp, func, kdata, ioctl->flags);
832 if (copy_to_user((void __user *)arg, kdata, out_size) != 0)
833 retcode = -EFAULT;
834
835 err_i1:
836 if (!ioctl)
837 DRM_DEBUG("invalid ioctl: pid=%d, dev=0x%lx, auth=%d, cmd=0x%02x, nr=0x%02x\n",
838 task_pid_nr(current),
839 (long)old_encode_dev(file_priv->minor->kdev->devt),
840 file_priv->authenticated, cmd, nr);
841
842 if (kdata != stack_kdata)
843 kfree(kdata);
844 if (retcode)
845 DRM_DEBUG("ret = %d\n", retcode);
846 return retcode;
847}
848EXPORT_SYMBOL(drm_ioctl);
849
850
851
852
853
854
855
856
857
858
859
860
861
862bool drm_ioctl_flags(unsigned int nr, unsigned int *flags)
863{
864 if (nr >= DRM_COMMAND_BASE && nr < DRM_COMMAND_END)
865 return false;
866
867 if (nr >= DRM_CORE_IOCTL_COUNT)
868 return false;
869
870 *flags = drm_ioctls[nr].flags;
871 return true;
872}
873EXPORT_SYMBOL(drm_ioctl_flags);
874