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 = 1;
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
328
329
330 file_priv->aspect_ratio_allowed = req->value;
331 break;
332 case DRM_CLIENT_CAP_ASPECT_RATIO:
333 if (req->value > 1)
334 return -EINVAL;
335 file_priv->aspect_ratio_allowed = req->value;
336 break;
337 default:
338 return -EINVAL;
339 }
340
341 return 0;
342}
343
344
345
346
347
348
349
350
351
352
353
354
355static int drm_setversion(struct drm_device *dev, void *data, struct drm_file *file_priv)
356{
357 struct drm_set_version *sv = data;
358 int if_version, retcode = 0;
359
360 mutex_lock(&dev->master_mutex);
361 if (sv->drm_di_major != -1) {
362 if (sv->drm_di_major != DRM_IF_MAJOR ||
363 sv->drm_di_minor < 0 || sv->drm_di_minor > DRM_IF_MINOR) {
364 retcode = -EINVAL;
365 goto done;
366 }
367 if_version = DRM_IF_VERSION(sv->drm_di_major,
368 sv->drm_di_minor);
369 dev->if_version = max(if_version, dev->if_version);
370 if (sv->drm_di_minor >= 1) {
371
372
373
374
375 retcode = drm_set_busid(dev, file_priv);
376 if (retcode)
377 goto done;
378 }
379 }
380
381 if (sv->drm_dd_major != -1) {
382 if (sv->drm_dd_major != dev->driver->major ||
383 sv->drm_dd_minor < 0 || sv->drm_dd_minor >
384 dev->driver->minor) {
385 retcode = -EINVAL;
386 goto done;
387 }
388 }
389
390done:
391 sv->drm_di_major = DRM_IF_MAJOR;
392 sv->drm_di_minor = DRM_IF_MINOR;
393 sv->drm_dd_major = dev->driver->major;
394 sv->drm_dd_minor = dev->driver->minor;
395 mutex_unlock(&dev->master_mutex);
396
397 return retcode;
398}
399
400
401
402
403
404
405
406
407
408
409
410
411
412int drm_noop(struct drm_device *dev, void *data,
413 struct drm_file *file_priv)
414{
415 DRM_DEBUG("\n");
416 return 0;
417}
418EXPORT_SYMBOL(drm_noop);
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435int drm_invalid_op(struct drm_device *dev, void *data,
436 struct drm_file *file_priv)
437{
438 return -EINVAL;
439}
440EXPORT_SYMBOL(drm_invalid_op);
441
442
443
444
445static int drm_copy_field(char __user *buf, size_t *buf_len, const char *value)
446{
447 int len;
448
449
450 len = strlen(value);
451 if (len > *buf_len)
452 len = *buf_len;
453
454
455
456 *buf_len = strlen(value);
457
458
459 if (len && buf)
460 if (copy_to_user(buf, value, len))
461 return -EFAULT;
462 return 0;
463}
464
465
466
467
468
469
470
471
472
473
474
475
476int drm_version(struct drm_device *dev, void *data,
477 struct drm_file *file_priv)
478{
479 struct drm_version *version = data;
480 int err;
481
482 version->version_major = dev->driver->major;
483 version->version_minor = dev->driver->minor;
484 version->version_patchlevel = dev->driver->patchlevel;
485 err = drm_copy_field(version->name, &version->name_len,
486 dev->driver->name);
487 if (!err)
488 err = drm_copy_field(version->date, &version->date_len,
489 dev->driver->date);
490 if (!err)
491 err = drm_copy_field(version->desc, &version->desc_len,
492 dev->driver->desc);
493
494 return err;
495}
496
497
498
499
500
501
502
503
504
505
506
507
508
509int drm_ioctl_permit(u32 flags, struct drm_file *file_priv)
510{
511
512 if (unlikely((flags & DRM_ROOT_ONLY) && !capable(CAP_SYS_ADMIN)))
513 return -EACCES;
514
515
516 if (unlikely((flags & DRM_AUTH) && !drm_is_render_client(file_priv) &&
517 !file_priv->authenticated))
518 return -EACCES;
519
520
521 if (unlikely((flags & DRM_MASTER) &&
522 !drm_is_current_master(file_priv)))
523 return -EACCES;
524
525
526 if (unlikely(!(flags & DRM_RENDER_ALLOW) &&
527 drm_is_render_client(file_priv)))
528 return -EACCES;
529
530 return 0;
531}
532EXPORT_SYMBOL(drm_ioctl_permit);
533
534#define DRM_IOCTL_DEF(ioctl, _func, _flags) \
535 [DRM_IOCTL_NR(ioctl)] = { \
536 .cmd = ioctl, \
537 .func = _func, \
538 .flags = _flags, \
539 .name = #ioctl \
540 }
541
542
543static const struct drm_ioctl_desc drm_ioctls[] = {
544 DRM_IOCTL_DEF(DRM_IOCTL_VERSION, drm_version,
545 DRM_UNLOCKED|DRM_RENDER_ALLOW),
546 DRM_IOCTL_DEF(DRM_IOCTL_GET_UNIQUE, drm_getunique, DRM_UNLOCKED),
547 DRM_IOCTL_DEF(DRM_IOCTL_GET_MAGIC, drm_getmagic, DRM_UNLOCKED),
548 DRM_IOCTL_DEF(DRM_IOCTL_IRQ_BUSID, drm_irq_by_busid, DRM_MASTER|DRM_ROOT_ONLY),
549 DRM_IOCTL_DEF(DRM_IOCTL_GET_MAP, drm_legacy_getmap_ioctl, DRM_UNLOCKED),
550 DRM_IOCTL_DEF(DRM_IOCTL_GET_CLIENT, drm_getclient, DRM_UNLOCKED),
551 DRM_IOCTL_DEF(DRM_IOCTL_GET_STATS, drm_getstats, DRM_UNLOCKED),
552 DRM_IOCTL_DEF(DRM_IOCTL_GET_CAP, drm_getcap, DRM_UNLOCKED|DRM_RENDER_ALLOW),
553 DRM_IOCTL_DEF(DRM_IOCTL_SET_CLIENT_CAP, drm_setclientcap, DRM_UNLOCKED),
554 DRM_IOCTL_DEF(DRM_IOCTL_SET_VERSION, drm_setversion, DRM_UNLOCKED | DRM_MASTER),
555
556 DRM_IOCTL_DEF(DRM_IOCTL_SET_UNIQUE, drm_invalid_op, DRM_AUTH|DRM_MASTER|DRM_ROOT_ONLY),
557 DRM_IOCTL_DEF(DRM_IOCTL_BLOCK, drm_noop, DRM_AUTH|DRM_MASTER|DRM_ROOT_ONLY),
558 DRM_IOCTL_DEF(DRM_IOCTL_UNBLOCK, drm_noop, DRM_AUTH|DRM_MASTER|DRM_ROOT_ONLY),
559 DRM_IOCTL_DEF(DRM_IOCTL_AUTH_MAGIC, drm_authmagic, DRM_AUTH|DRM_UNLOCKED|DRM_MASTER),
560
561 DRM_IOCTL_DEF(DRM_IOCTL_ADD_MAP, drm_legacy_addmap_ioctl, DRM_AUTH|DRM_MASTER|DRM_ROOT_ONLY),
562 DRM_IOCTL_DEF(DRM_IOCTL_RM_MAP, drm_legacy_rmmap_ioctl, DRM_AUTH),
563
564 DRM_IOCTL_DEF(DRM_IOCTL_SET_SAREA_CTX, drm_legacy_setsareactx, DRM_AUTH|DRM_MASTER|DRM_ROOT_ONLY),
565 DRM_IOCTL_DEF(DRM_IOCTL_GET_SAREA_CTX, drm_legacy_getsareactx, DRM_AUTH),
566
567 DRM_IOCTL_DEF(DRM_IOCTL_SET_MASTER, drm_setmaster_ioctl, DRM_UNLOCKED|DRM_ROOT_ONLY),
568 DRM_IOCTL_DEF(DRM_IOCTL_DROP_MASTER, drm_dropmaster_ioctl, DRM_UNLOCKED|DRM_ROOT_ONLY),
569
570 DRM_IOCTL_DEF(DRM_IOCTL_ADD_CTX, drm_legacy_addctx, DRM_AUTH|DRM_ROOT_ONLY),
571 DRM_IOCTL_DEF(DRM_IOCTL_RM_CTX, drm_legacy_rmctx, DRM_AUTH|DRM_MASTER|DRM_ROOT_ONLY),
572 DRM_IOCTL_DEF(DRM_IOCTL_MOD_CTX, drm_noop, DRM_AUTH|DRM_MASTER|DRM_ROOT_ONLY),
573 DRM_IOCTL_DEF(DRM_IOCTL_GET_CTX, drm_legacy_getctx, DRM_AUTH),
574 DRM_IOCTL_DEF(DRM_IOCTL_SWITCH_CTX, drm_legacy_switchctx, DRM_AUTH|DRM_MASTER|DRM_ROOT_ONLY),
575 DRM_IOCTL_DEF(DRM_IOCTL_NEW_CTX, drm_legacy_newctx, DRM_AUTH|DRM_MASTER|DRM_ROOT_ONLY),
576 DRM_IOCTL_DEF(DRM_IOCTL_RES_CTX, drm_legacy_resctx, DRM_AUTH),
577
578 DRM_IOCTL_DEF(DRM_IOCTL_ADD_DRAW, drm_noop, DRM_AUTH|DRM_MASTER|DRM_ROOT_ONLY),
579 DRM_IOCTL_DEF(DRM_IOCTL_RM_DRAW, drm_noop, DRM_AUTH|DRM_MASTER|DRM_ROOT_ONLY),
580
581 DRM_IOCTL_DEF(DRM_IOCTL_LOCK, drm_legacy_lock, DRM_AUTH),
582 DRM_IOCTL_DEF(DRM_IOCTL_UNLOCK, drm_legacy_unlock, DRM_AUTH),
583
584 DRM_IOCTL_DEF(DRM_IOCTL_FINISH, drm_noop, DRM_AUTH),
585
586 DRM_IOCTL_DEF(DRM_IOCTL_ADD_BUFS, drm_legacy_addbufs, DRM_AUTH|DRM_MASTER|DRM_ROOT_ONLY),
587 DRM_IOCTL_DEF(DRM_IOCTL_MARK_BUFS, drm_legacy_markbufs, DRM_AUTH|DRM_MASTER|DRM_ROOT_ONLY),
588 DRM_IOCTL_DEF(DRM_IOCTL_INFO_BUFS, drm_legacy_infobufs, DRM_AUTH),
589 DRM_IOCTL_DEF(DRM_IOCTL_MAP_BUFS, drm_legacy_mapbufs, DRM_AUTH),
590 DRM_IOCTL_DEF(DRM_IOCTL_FREE_BUFS, drm_legacy_freebufs, DRM_AUTH),
591 DRM_IOCTL_DEF(DRM_IOCTL_DMA, drm_legacy_dma_ioctl, DRM_AUTH),
592
593 DRM_IOCTL_DEF(DRM_IOCTL_CONTROL, drm_legacy_irq_control, DRM_AUTH|DRM_MASTER|DRM_ROOT_ONLY),
594
595#if IS_ENABLED(CONFIG_AGP)
596 DRM_IOCTL_DEF(DRM_IOCTL_AGP_ACQUIRE, drm_agp_acquire_ioctl, DRM_AUTH|DRM_MASTER|DRM_ROOT_ONLY),
597 DRM_IOCTL_DEF(DRM_IOCTL_AGP_RELEASE, drm_agp_release_ioctl, DRM_AUTH|DRM_MASTER|DRM_ROOT_ONLY),
598 DRM_IOCTL_DEF(DRM_IOCTL_AGP_ENABLE, drm_agp_enable_ioctl, DRM_AUTH|DRM_MASTER|DRM_ROOT_ONLY),
599 DRM_IOCTL_DEF(DRM_IOCTL_AGP_INFO, drm_agp_info_ioctl, DRM_AUTH),
600 DRM_IOCTL_DEF(DRM_IOCTL_AGP_ALLOC, drm_agp_alloc_ioctl, DRM_AUTH|DRM_MASTER|DRM_ROOT_ONLY),
601 DRM_IOCTL_DEF(DRM_IOCTL_AGP_FREE, drm_agp_free_ioctl, DRM_AUTH|DRM_MASTER|DRM_ROOT_ONLY),
602 DRM_IOCTL_DEF(DRM_IOCTL_AGP_BIND, drm_agp_bind_ioctl, DRM_AUTH|DRM_MASTER|DRM_ROOT_ONLY),
603 DRM_IOCTL_DEF(DRM_IOCTL_AGP_UNBIND, drm_agp_unbind_ioctl, DRM_AUTH|DRM_MASTER|DRM_ROOT_ONLY),
604#endif
605
606 DRM_IOCTL_DEF(DRM_IOCTL_SG_ALLOC, drm_legacy_sg_alloc, DRM_AUTH|DRM_MASTER|DRM_ROOT_ONLY),
607 DRM_IOCTL_DEF(DRM_IOCTL_SG_FREE, drm_legacy_sg_free, DRM_AUTH|DRM_MASTER|DRM_ROOT_ONLY),
608
609 DRM_IOCTL_DEF(DRM_IOCTL_WAIT_VBLANK, drm_wait_vblank_ioctl, DRM_UNLOCKED),
610
611 DRM_IOCTL_DEF(DRM_IOCTL_MODESET_CTL, drm_legacy_modeset_ctl_ioctl, 0),
612
613 DRM_IOCTL_DEF(DRM_IOCTL_UPDATE_DRAW, drm_noop, DRM_AUTH|DRM_MASTER|DRM_ROOT_ONLY),
614
615 DRM_IOCTL_DEF(DRM_IOCTL_GEM_CLOSE, drm_gem_close_ioctl, DRM_UNLOCKED|DRM_RENDER_ALLOW),
616 DRM_IOCTL_DEF(DRM_IOCTL_GEM_FLINK, drm_gem_flink_ioctl, DRM_AUTH|DRM_UNLOCKED),
617 DRM_IOCTL_DEF(DRM_IOCTL_GEM_OPEN, drm_gem_open_ioctl, DRM_AUTH|DRM_UNLOCKED),
618
619 DRM_IOCTL_DEF(DRM_IOCTL_MODE_GETRESOURCES, drm_mode_getresources, DRM_UNLOCKED),
620
621 DRM_IOCTL_DEF(DRM_IOCTL_PRIME_HANDLE_TO_FD, drm_prime_handle_to_fd_ioctl, DRM_AUTH|DRM_UNLOCKED|DRM_RENDER_ALLOW),
622 DRM_IOCTL_DEF(DRM_IOCTL_PRIME_FD_TO_HANDLE, drm_prime_fd_to_handle_ioctl, DRM_AUTH|DRM_UNLOCKED|DRM_RENDER_ALLOW),
623
624 DRM_IOCTL_DEF(DRM_IOCTL_MODE_GETPLANERESOURCES, drm_mode_getplane_res, DRM_UNLOCKED),
625 DRM_IOCTL_DEF(DRM_IOCTL_MODE_GETCRTC, drm_mode_getcrtc, DRM_UNLOCKED),
626 DRM_IOCTL_DEF(DRM_IOCTL_MODE_SETCRTC, drm_mode_setcrtc, DRM_MASTER|DRM_UNLOCKED),
627 DRM_IOCTL_DEF(DRM_IOCTL_MODE_GETPLANE, drm_mode_getplane, DRM_UNLOCKED),
628 DRM_IOCTL_DEF(DRM_IOCTL_MODE_SETPLANE, drm_mode_setplane, DRM_MASTER|DRM_UNLOCKED),
629 DRM_IOCTL_DEF(DRM_IOCTL_MODE_CURSOR, drm_mode_cursor_ioctl, DRM_MASTER|DRM_UNLOCKED),
630 DRM_IOCTL_DEF(DRM_IOCTL_MODE_GETGAMMA, drm_mode_gamma_get_ioctl, DRM_UNLOCKED),
631 DRM_IOCTL_DEF(DRM_IOCTL_MODE_SETGAMMA, drm_mode_gamma_set_ioctl, DRM_MASTER|DRM_UNLOCKED),
632 DRM_IOCTL_DEF(DRM_IOCTL_MODE_GETENCODER, drm_mode_getencoder, DRM_UNLOCKED),
633 DRM_IOCTL_DEF(DRM_IOCTL_MODE_GETCONNECTOR, drm_mode_getconnector, DRM_UNLOCKED),
634 DRM_IOCTL_DEF(DRM_IOCTL_MODE_ATTACHMODE, drm_noop, DRM_MASTER|DRM_UNLOCKED),
635 DRM_IOCTL_DEF(DRM_IOCTL_MODE_DETACHMODE, drm_noop, DRM_MASTER|DRM_UNLOCKED),
636 DRM_IOCTL_DEF(DRM_IOCTL_MODE_GETPROPERTY, drm_mode_getproperty_ioctl, DRM_UNLOCKED),
637 DRM_IOCTL_DEF(DRM_IOCTL_MODE_SETPROPERTY, drm_mode_connector_property_set_ioctl, DRM_MASTER|DRM_UNLOCKED),
638 DRM_IOCTL_DEF(DRM_IOCTL_MODE_GETPROPBLOB, drm_mode_getblob_ioctl, DRM_UNLOCKED),
639 DRM_IOCTL_DEF(DRM_IOCTL_MODE_GETFB, drm_mode_getfb, DRM_UNLOCKED),
640 DRM_IOCTL_DEF(DRM_IOCTL_MODE_ADDFB, drm_mode_addfb, DRM_UNLOCKED),
641 DRM_IOCTL_DEF(DRM_IOCTL_MODE_ADDFB2, drm_mode_addfb2, DRM_UNLOCKED),
642 DRM_IOCTL_DEF(DRM_IOCTL_MODE_RMFB, drm_mode_rmfb, DRM_UNLOCKED),
643 DRM_IOCTL_DEF(DRM_IOCTL_MODE_PAGE_FLIP, drm_mode_page_flip_ioctl, DRM_MASTER|DRM_UNLOCKED),
644 DRM_IOCTL_DEF(DRM_IOCTL_MODE_DIRTYFB, drm_mode_dirtyfb_ioctl, DRM_MASTER|DRM_UNLOCKED),
645 DRM_IOCTL_DEF(DRM_IOCTL_MODE_CREATE_DUMB, drm_mode_create_dumb_ioctl, DRM_UNLOCKED),
646 DRM_IOCTL_DEF(DRM_IOCTL_MODE_MAP_DUMB, drm_mode_mmap_dumb_ioctl, DRM_UNLOCKED),
647 DRM_IOCTL_DEF(DRM_IOCTL_MODE_DESTROY_DUMB, drm_mode_destroy_dumb_ioctl, DRM_UNLOCKED),
648 DRM_IOCTL_DEF(DRM_IOCTL_MODE_OBJ_GETPROPERTIES, drm_mode_obj_get_properties_ioctl, DRM_UNLOCKED),
649 DRM_IOCTL_DEF(DRM_IOCTL_MODE_OBJ_SETPROPERTY, drm_mode_obj_set_property_ioctl, DRM_MASTER|DRM_UNLOCKED),
650 DRM_IOCTL_DEF(DRM_IOCTL_MODE_CURSOR2, drm_mode_cursor2_ioctl, DRM_MASTER|DRM_UNLOCKED),
651 DRM_IOCTL_DEF(DRM_IOCTL_MODE_ATOMIC, drm_mode_atomic_ioctl, DRM_MASTER|DRM_UNLOCKED),
652 DRM_IOCTL_DEF(DRM_IOCTL_MODE_CREATEPROPBLOB, drm_mode_createblob_ioctl, DRM_UNLOCKED),
653 DRM_IOCTL_DEF(DRM_IOCTL_MODE_DESTROYPROPBLOB, drm_mode_destroyblob_ioctl, DRM_UNLOCKED),
654
655 DRM_IOCTL_DEF(DRM_IOCTL_SYNCOBJ_CREATE, drm_syncobj_create_ioctl,
656 DRM_UNLOCKED|DRM_RENDER_ALLOW),
657 DRM_IOCTL_DEF(DRM_IOCTL_SYNCOBJ_DESTROY, drm_syncobj_destroy_ioctl,
658 DRM_UNLOCKED|DRM_RENDER_ALLOW),
659 DRM_IOCTL_DEF(DRM_IOCTL_SYNCOBJ_HANDLE_TO_FD, drm_syncobj_handle_to_fd_ioctl,
660 DRM_UNLOCKED|DRM_RENDER_ALLOW),
661 DRM_IOCTL_DEF(DRM_IOCTL_SYNCOBJ_FD_TO_HANDLE, drm_syncobj_fd_to_handle_ioctl,
662 DRM_UNLOCKED|DRM_RENDER_ALLOW),
663 DRM_IOCTL_DEF(DRM_IOCTL_SYNCOBJ_WAIT, drm_syncobj_wait_ioctl,
664 DRM_UNLOCKED|DRM_RENDER_ALLOW),
665 DRM_IOCTL_DEF(DRM_IOCTL_SYNCOBJ_RESET, drm_syncobj_reset_ioctl,
666 DRM_UNLOCKED|DRM_RENDER_ALLOW),
667 DRM_IOCTL_DEF(DRM_IOCTL_SYNCOBJ_SIGNAL, drm_syncobj_signal_ioctl,
668 DRM_UNLOCKED|DRM_RENDER_ALLOW),
669 DRM_IOCTL_DEF(DRM_IOCTL_CRTC_GET_SEQUENCE, drm_crtc_get_sequence_ioctl, DRM_UNLOCKED),
670 DRM_IOCTL_DEF(DRM_IOCTL_CRTC_QUEUE_SEQUENCE, drm_crtc_queue_sequence_ioctl, DRM_UNLOCKED),
671 DRM_IOCTL_DEF(DRM_IOCTL_MODE_CREATE_LEASE, drm_mode_create_lease_ioctl, DRM_MASTER|DRM_UNLOCKED),
672 DRM_IOCTL_DEF(DRM_IOCTL_MODE_LIST_LESSEES, drm_mode_list_lessees_ioctl, DRM_MASTER|DRM_UNLOCKED),
673 DRM_IOCTL_DEF(DRM_IOCTL_MODE_GET_LEASE, drm_mode_get_lease_ioctl, DRM_MASTER|DRM_UNLOCKED),
674 DRM_IOCTL_DEF(DRM_IOCTL_MODE_REVOKE_LEASE, drm_mode_revoke_lease_ioctl, DRM_MASTER|DRM_UNLOCKED),
675};
676
677#define DRM_CORE_IOCTL_COUNT ARRAY_SIZE( drm_ioctls )
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
718
719
720
721
722
723
724
725
726
727long drm_ioctl_kernel(struct file *file, drm_ioctl_t *func, void *kdata,
728 u32 flags)
729{
730 struct drm_file *file_priv = file->private_data;
731 struct drm_device *dev = file_priv->minor->dev;
732 int retcode;
733
734 if (drm_dev_is_unplugged(dev))
735 return -ENODEV;
736
737 retcode = drm_ioctl_permit(flags, file_priv);
738 if (unlikely(retcode))
739 return retcode;
740
741
742 if (!drm_core_check_feature(dev, DRIVER_LEGACY) ||
743 (flags & DRM_UNLOCKED))
744 retcode = func(dev, kdata, file_priv);
745 else {
746 mutex_lock(&drm_global_mutex);
747 retcode = func(dev, kdata, file_priv);
748 mutex_unlock(&drm_global_mutex);
749 }
750 return retcode;
751}
752EXPORT_SYMBOL(drm_ioctl_kernel);
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767long drm_ioctl(struct file *filp,
768 unsigned int cmd, unsigned long arg)
769{
770 struct drm_file *file_priv = filp->private_data;
771 struct drm_device *dev;
772 const struct drm_ioctl_desc *ioctl = NULL;
773 drm_ioctl_t *func;
774 unsigned int nr = DRM_IOCTL_NR(cmd);
775 int retcode = -EINVAL;
776 char stack_kdata[128];
777 char *kdata = NULL;
778 unsigned int in_size, out_size, drv_size, ksize;
779 bool is_driver_ioctl;
780
781 dev = file_priv->minor->dev;
782
783 if (drm_dev_is_unplugged(dev))
784 return -ENODEV;
785
786 is_driver_ioctl = nr >= DRM_COMMAND_BASE && nr < DRM_COMMAND_END;
787
788 if (is_driver_ioctl) {
789
790 if (nr - DRM_COMMAND_BASE >= dev->driver->num_ioctls)
791 goto err_i1;
792 ioctl = &dev->driver->ioctls[nr - DRM_COMMAND_BASE];
793 } else {
794
795 if (nr >= DRM_CORE_IOCTL_COUNT)
796 goto err_i1;
797 ioctl = &drm_ioctls[nr];
798 }
799
800 drv_size = _IOC_SIZE(ioctl->cmd);
801 out_size = in_size = _IOC_SIZE(cmd);
802 if ((cmd & ioctl->cmd & IOC_IN) == 0)
803 in_size = 0;
804 if ((cmd & ioctl->cmd & IOC_OUT) == 0)
805 out_size = 0;
806 ksize = max(max(in_size, out_size), drv_size);
807
808 DRM_DEBUG("pid=%d, dev=0x%lx, auth=%d, %s\n",
809 task_pid_nr(current),
810 (long)old_encode_dev(file_priv->minor->kdev->devt),
811 file_priv->authenticated, ioctl->name);
812
813
814 func = ioctl->func;
815
816 if (unlikely(!func)) {
817 DRM_DEBUG("no function\n");
818 retcode = -EINVAL;
819 goto err_i1;
820 }
821
822 if (ksize <= sizeof(stack_kdata)) {
823 kdata = stack_kdata;
824 } else {
825 kdata = kmalloc(ksize, GFP_KERNEL);
826 if (!kdata) {
827 retcode = -ENOMEM;
828 goto err_i1;
829 }
830 }
831
832 if (copy_from_user(kdata, (void __user *)arg, in_size) != 0) {
833 retcode = -EFAULT;
834 goto err_i1;
835 }
836
837 if (ksize > in_size)
838 memset(kdata + in_size, 0, ksize - in_size);
839
840 retcode = drm_ioctl_kernel(filp, func, kdata, ioctl->flags);
841 if (copy_to_user((void __user *)arg, kdata, out_size) != 0)
842 retcode = -EFAULT;
843
844 err_i1:
845 if (!ioctl)
846 DRM_DEBUG("invalid ioctl: pid=%d, dev=0x%lx, auth=%d, cmd=0x%02x, nr=0x%02x\n",
847 task_pid_nr(current),
848 (long)old_encode_dev(file_priv->minor->kdev->devt),
849 file_priv->authenticated, cmd, nr);
850
851 if (kdata != stack_kdata)
852 kfree(kdata);
853 if (retcode)
854 DRM_DEBUG("pid=%d, ret = %d\n", task_pid_nr(current), retcode);
855 return retcode;
856}
857EXPORT_SYMBOL(drm_ioctl);
858
859
860
861
862
863
864
865
866
867
868
869
870
871bool drm_ioctl_flags(unsigned int nr, unsigned int *flags)
872{
873 if (nr >= DRM_COMMAND_BASE && nr < DRM_COMMAND_END)
874 return false;
875
876 if (nr >= DRM_CORE_IOCTL_COUNT)
877 return false;
878
879 *flags = drm_ioctls[nr].flags;
880 return true;
881}
882EXPORT_SYMBOL(drm_ioctl_flags);
883