Lines Matching +full:device +full:- +full:unique
52 * - GET_UNIQUE ioctl, implemented by drm_getunique is wrapped up in libdrm
54 * - The libdrm drmSetBusid function is backed by the SET_UNIQUE ioctl. All
56 * - The internal set_busid kernel functions and driver callbacks are
59 * - Other ioctls and functions involved are named consistently.
66 * Now the actual horror story of how device lookup in drm works. At large,
67 * there's 2 different ways, either by busid, or by device driver name.
72 * side-effect this fills out the unique name in the master structure.
73 * 2. Call GET_UNIQUE to read out the unique name from the master structure,
75 * the next device node.
81 * means the the unique name for the master node just opening is _not_ filled
82 * out. This despite that with current drm device nodes are always bound to
83 * one device, and can't be runtime assigned like with drm 1.0.
84 * 2. Match driver name. If it mismatches, proceed to the next device node.
85 * 3. Call GET_UNIQUE, and check whether the unique name has length zero (by
87 * libdrm skips and proceeds to the next device node. Probably this is just
88 * copypasta from drm 1.0 times where a set unique name meant that the driver
92 * _not_ return a unique string when SET_VERSION hasn't been called yet,
93 * otherwise libdrm breaks. Even when that unique string can't ever change, and
94 * is totally irrelevant for actually opening the device because runtime
95 * assignable device instances were only support in drm 1.0, which is long dead.
103 * \param inode device inode.
109 * Copies the bus id from drm_device::unique into user space.
115 struct drm_master *master = file_priv->master; in drm_getunique()
117 mutex_lock(&master->dev->master_mutex); in drm_getunique()
118 if (u->unique_len >= master->unique_len) { in drm_getunique()
119 if (copy_to_user(u->unique, master->unique, master->unique_len)) { in drm_getunique()
120 mutex_unlock(&master->dev->master_mutex); in drm_getunique()
121 return -EFAULT; in drm_getunique()
124 u->unique_len = master->unique_len; in drm_getunique()
125 mutex_unlock(&master->dev->master_mutex); in drm_getunique()
134 kfree(master->unique); in drm_unset_busid()
135 master->unique = NULL; in drm_unset_busid()
136 master->unique_len = 0; in drm_unset_busid()
141 struct drm_master *master = file_priv->master; in drm_set_busid()
144 if (master->unique != NULL) in drm_set_busid()
147 if (dev->dev && dev_is_pci(dev->dev)) { in drm_set_busid()
154 WARN_ON(!dev->unique); in drm_set_busid()
155 master->unique = kstrdup(dev->unique, GFP_KERNEL); in drm_set_busid()
156 if (master->unique) in drm_set_busid()
157 master->unique_len = strlen(dev->unique); in drm_set_busid()
166 * \param inode device inode.
182 * Hollowed-out getclient ioctl to keep some dead old drm tests/tools in drm_getclient()
184 * get -EINVAL, hence this is the return value we need to hand back for in drm_getclient()
192 if (client->idx == 0) { in drm_getclient()
193 client->auth = file_priv->authenticated; in drm_getclient()
194 client->pid = task_pid_vnr(current); in drm_getclient()
195 client->uid = overflowuid; in drm_getclient()
196 client->magic = 0; in drm_getclient()
197 client->iocs = 0; in drm_getclient()
201 return -EINVAL; in drm_getclient()
208 * \param inode device inode.
227 * Get device/driver capabilities
234 req->value = 0; in drm_getcap()
236 /* Only some caps make sense with UMS/render-only drivers. */ in drm_getcap()
237 switch (req->capability) { in drm_getcap()
239 req->value = 1; in drm_getcap()
242 req->value |= dev->driver->prime_fd_to_handle ? DRM_PRIME_CAP_IMPORT : 0; in drm_getcap()
243 req->value |= dev->driver->prime_handle_to_fd ? DRM_PRIME_CAP_EXPORT : 0; in drm_getcap()
246 req->value = drm_core_check_feature(dev, DRIVER_SYNCOBJ); in drm_getcap()
252 return -ENOTSUPP; in drm_getcap()
254 switch (req->capability) { in drm_getcap()
256 if (dev->driver->dumb_create) in drm_getcap()
257 req->value = 1; in drm_getcap()
260 req->value = 1; in drm_getcap()
263 req->value = dev->mode_config.preferred_depth; in drm_getcap()
266 req->value = dev->mode_config.prefer_shadow; in drm_getcap()
269 req->value = dev->mode_config.async_page_flip; in drm_getcap()
272 req->value = 1; in drm_getcap()
274 if (!crtc->funcs->page_flip_target) in drm_getcap()
275 req->value = 0; in drm_getcap()
279 if (dev->mode_config.cursor_width) in drm_getcap()
280 req->value = dev->mode_config.cursor_width; in drm_getcap()
282 req->value = 64; in drm_getcap()
285 if (dev->mode_config.cursor_height) in drm_getcap()
286 req->value = dev->mode_config.cursor_height; in drm_getcap()
288 req->value = 64; in drm_getcap()
291 req->value = dev->mode_config.allow_fb_modifiers; in drm_getcap()
294 req->value = 1; in drm_getcap()
297 return -EINVAL; in drm_getcap()
303 * Set device/driver capabilities
310 switch (req->capability) { in drm_setclientcap()
312 if (req->value > 1) in drm_setclientcap()
313 return -EINVAL; in drm_setclientcap()
314 file_priv->stereo_allowed = req->value; in drm_setclientcap()
317 if (req->value > 1) in drm_setclientcap()
318 return -EINVAL; in drm_setclientcap()
319 file_priv->universal_planes = req->value; in drm_setclientcap()
323 return -EINVAL; in drm_setclientcap()
325 if (current->comm[0] == 'X' && req->value == 1) { in drm_setclientcap()
327 return -EOPNOTSUPP; in drm_setclientcap()
329 if (req->value > 2) in drm_setclientcap()
330 return -EINVAL; in drm_setclientcap()
331 file_priv->atomic = req->value; in drm_setclientcap()
332 file_priv->universal_planes = req->value; in drm_setclientcap()
334 * No atomic user-space blows up on aspect ratio mode bits. in drm_setclientcap()
336 file_priv->aspect_ratio_allowed = req->value; in drm_setclientcap()
339 if (req->value > 1) in drm_setclientcap()
340 return -EINVAL; in drm_setclientcap()
341 file_priv->aspect_ratio_allowed = req->value; in drm_setclientcap()
344 if (!file_priv->atomic) in drm_setclientcap()
345 return -EINVAL; in drm_setclientcap()
346 if (req->value > 1) in drm_setclientcap()
347 return -EINVAL; in drm_setclientcap()
348 file_priv->writeback_connectors = req->value; in drm_setclientcap()
351 return -EINVAL; in drm_setclientcap()
360 * \param inode device inode.
373 mutex_lock(&dev->master_mutex); in drm_setversion()
374 if (sv->drm_di_major != -1) { in drm_setversion()
375 if (sv->drm_di_major != DRM_IF_MAJOR || in drm_setversion()
376 sv->drm_di_minor < 0 || sv->drm_di_minor > DRM_IF_MINOR) { in drm_setversion()
377 retcode = -EINVAL; in drm_setversion()
380 if_version = DRM_IF_VERSION(sv->drm_di_major, in drm_setversion()
381 sv->drm_di_minor); in drm_setversion()
382 dev->if_version = max(if_version, dev->if_version); in drm_setversion()
383 if (sv->drm_di_minor >= 1) { in drm_setversion()
385 * Version 1.1 includes tying of DRM to specific device in drm_setversion()
394 if (sv->drm_dd_major != -1) { in drm_setversion()
395 if (sv->drm_dd_major != dev->driver->major || in drm_setversion()
396 sv->drm_dd_minor < 0 || sv->drm_dd_minor > in drm_setversion()
397 dev->driver->minor) { in drm_setversion()
398 retcode = -EINVAL; in drm_setversion()
404 sv->drm_di_major = DRM_IF_MAJOR; in drm_setversion()
405 sv->drm_di_minor = DRM_IF_MINOR; in drm_setversion()
406 sv->drm_dd_major = dev->driver->major; in drm_setversion()
407 sv->drm_dd_minor = dev->driver->minor; in drm_setversion()
408 mutex_unlock(&dev->master_mutex); in drm_setversion()
414 * drm_noop - DRM no-op ioctl implemntation
415 * @dev: DRM device for the ioctl
419 * This no-op implementation for drm ioctls is useful for deprecated
434 * drm_invalid_op - DRM invalid ioctl implemntation
435 * @dev: DRM device for the ioctl
439 * This no-op implementation for drm ioctls is useful for deprecated
446 * Always fails with a return value of -EINVAL.
451 return -EINVAL; in drm_invalid_op()
468 * larger than the userspace-supplied buffer) */ in drm_copy_field()
474 return -EFAULT; in drm_copy_field()
481 * \param inode device inode.
495 version->version_major = dev->driver->major; in drm_version()
496 version->version_minor = dev->driver->minor; in drm_version()
497 version->version_patchlevel = dev->driver->patchlevel; in drm_version()
498 err = drm_copy_field(version->name, &version->name_len, in drm_version()
499 dev->driver->name); in drm_version()
501 err = drm_copy_field(version->date, &version->date_len, in drm_version()
502 dev->driver->date); in drm_version()
504 err = drm_copy_field(version->desc, &version->desc_len, in drm_version()
505 dev->driver->desc); in drm_version()
511 * drm_ioctl_permit - Check ioctl permissions against caller
520 * Zero if allowed, -EACCES otherwise.
526 return -EACCES; in drm_ioctl_permit()
530 !file_priv->authenticated)) in drm_ioctl_permit()
531 return -EACCES; in drm_ioctl_permit()
536 return -EACCES; in drm_ioctl_permit()
541 return -EACCES; in drm_ioctl_permit()
714 * ``Documentation/ioctl/botching-up-ioctls.txt``. Note that drm_ioctl()
715 * automatically zero-extends structures, hence make sure you can add more stuff
737 * the driver-specific IOCTLs are wired up.
743 struct drm_file *file_priv = file->private_data; in drm_ioctl_kernel()
744 struct drm_device *dev = file_priv->minor->dev; in drm_ioctl_kernel()
748 return -ENODEV; in drm_ioctl_kernel()
768 * drm_ioctl - ioctl callback implementation for DRM drivers
783 struct drm_file *file_priv = filp->private_data; in drm_ioctl()
788 int retcode = -EINVAL; in drm_ioctl()
794 dev = file_priv->minor->dev; in drm_ioctl()
797 return -ENODEV; in drm_ioctl()
803 unsigned int index = nr - DRM_COMMAND_BASE; in drm_ioctl()
805 if (index >= dev->driver->num_ioctls) in drm_ioctl()
807 index = array_index_nospec(index, dev->driver->num_ioctls); in drm_ioctl()
808 ioctl = &dev->driver->ioctls[index]; in drm_ioctl()
817 drv_size = _IOC_SIZE(ioctl->cmd); in drm_ioctl()
819 if ((cmd & ioctl->cmd & IOC_IN) == 0) in drm_ioctl()
821 if ((cmd & ioctl->cmd & IOC_OUT) == 0) in drm_ioctl()
827 (long)old_encode_dev(file_priv->minor->kdev->devt), in drm_ioctl()
828 file_priv->authenticated, ioctl->name); in drm_ioctl()
831 func = ioctl->func; in drm_ioctl()
835 retcode = -EINVAL; in drm_ioctl()
844 retcode = -ENOMEM; in drm_ioctl()
850 retcode = -EFAULT; in drm_ioctl()
855 memset(kdata + in_size, 0, ksize - in_size); in drm_ioctl()
857 retcode = drm_ioctl_kernel(filp, func, kdata, ioctl->flags); in drm_ioctl()
859 retcode = -EFAULT; in drm_ioctl()
865 (long)old_encode_dev(file_priv->minor->kdev->devt), in drm_ioctl()
866 file_priv->authenticated, cmd, nr); in drm_ioctl()
877 * drm_ioctl_flags - Check for core ioctl and return ioctl permission flags