Lines Matching +full:render +full:- +full:max

76  * A DRM device can provide several char-dev interfaces on the DRM-Major. Each
78 * of the device-driver, different interfaces are registered.
80 * Minors can be accessed via dev->$minor_name. This pointer is either
82 * valid. This means, DRM minors have the same life-time as the underlying
84 * registered and unregistered dynamically according to device-state.
96 return ERR_PTR(-EOPNOTSUPP); in drm_minor_get_xa()
104 return &dev->primary; in drm_minor_get_slot()
106 return &dev->render; in drm_minor_get_slot()
108 return &dev->accel; in drm_minor_get_slot()
118 WARN_ON(dev != minor->dev); in drm_minor_alloc_release()
120 put_device(minor->kdev); in drm_minor_alloc_release()
122 xa_erase(drm_minor_get_xa(minor->type), minor->index); in drm_minor_alloc_release()
127 * minor allocation scheme where minors 0-63 are primary nodes, 64-127 are control nodes,
128 * and 128-191 are render nodes.
129 * After reaching the limit, we're allocating minors dynamically - first-come, first-serve.
130 * Accel nodes are using a distinct major, so the minors are allocated in continuous 0-MAX
137 #define DRM_EXTENDED_MINOR_LIMIT XA_LIMIT(192, (1 << MINORBITS) - 1)
146 return -ENOMEM; in drm_minor_alloc()
148 minor->type = type; in drm_minor_alloc()
149 minor->dev = dev; in drm_minor_alloc()
151 r = xa_alloc(drm_minor_get_xa(type), &minor->index, in drm_minor_alloc()
153 if (r == -EBUSY && (type == DRM_MINOR_PRIMARY || type == DRM_MINOR_RENDER)) in drm_minor_alloc()
154 r = xa_alloc(&drm_minors_xa, &minor->index, in drm_minor_alloc()
163 minor->kdev = drm_sysfs_minor_alloc(minor); in drm_minor_alloc()
164 if (IS_ERR(minor->kdev)) in drm_minor_alloc()
165 return PTR_ERR(minor->kdev); in drm_minor_alloc()
183 if (minor->type != DRM_MINOR_ACCEL) { in drm_minor_register()
184 ret = drm_debugfs_register(minor, minor->index, in drm_minor_register()
192 ret = device_add(minor->kdev); in drm_minor_register()
197 entry = xa_store(drm_minor_get_xa(type), minor->index, minor, GFP_KERNEL); in drm_minor_register()
204 DRM_DEBUG("new minor registered %d\n", minor->index); in drm_minor_register()
217 if (!minor || !device_is_registered(minor->kdev)) in drm_minor_unregister()
221 xa_store(drm_minor_get_xa(type), minor->index, NULL, GFP_KERNEL); in drm_minor_unregister()
223 device_del(minor->kdev); in drm_minor_unregister()
224 dev_set_drvdata(minor->kdev, NULL); /* safety belt */ in drm_minor_unregister()
229 * Looks up the given minor-ID and returns the respective DRM-minor object. The
230 * refence-count of the underlying device is increased so you must release this
234 * minor->dev pointer will stay valid! However, the device may get unplugged and
244 drm_dev_get(minor->dev); in drm_minor_acquire()
248 return ERR_PTR(-ENODEV); in drm_minor_acquire()
249 } else if (drm_dev_is_unplugged(minor->dev)) { in drm_minor_acquire()
250 drm_dev_put(minor->dev); in drm_minor_acquire()
251 return ERR_PTR(-ENODEV); in drm_minor_acquire()
259 drm_dev_put(minor->dev); in drm_minor_release()
267 * bus-specific ->probe() callbacks implemented by the driver. The driver then
275 * bus-specific helpers and the &drm_driver.load callback. But due to
276 * backwards-compatibility needs the device instance have to be published too
302 * .. code-block:: c
320 * priv = devm_drm_dev_alloc(&pdev->dev, &driver_drm_driver,
324 * drm = &priv->drm;
330 * priv->userspace_facing = drmm_kzalloc(..., GFP_KERNEL);
331 * if (!priv->userspace_facing)
332 * return -ENOMEM;
334 * priv->pclk = devm_clk_get(dev, "PCLK");
335 * if (IS_ERR(priv->pclk))
336 * return PTR_ERR(priv->pclk);
408 * drm_put_dev - Unregister and release a DRM device
436 * drm_dev_enter - Enter device critical section
451 if (dev->unplugged) { in drm_dev_enter()
461 * drm_dev_exit - Exit device critical section
474 * drm_dev_unplug - unplug a DRM device
478 * userspace operations. Entry-points can use drm_dev_enter() and
487 * the new value of ->unplugged, and any critical section which might in drm_dev_unplug()
488 * still have seen the old value of ->unplugged is guaranteed to have in drm_dev_unplug()
491 dev->unplugged = true; in drm_dev_unplug()
497 unmap_mapping_range(dev->anon_inode->i_mapping, 0, 0, 1); in drm_dev_unplug()
504 * memory-mappings in VRAM (or stolen RAM, ...). However, core MM does not allow
505 * stand-alone address_space objects, so we need an underlying inode. As there
507 * VFS mount-point.
513 * We use drm_fs_inode_*() to manage our internal VFS mount-point and share it
514 * between multiple inode-users. You could, technically, call
524 return init_pseudo(fc, 0x010203ff) ? 0 : -ENOMEM; in drm_fs_init_fs_context()
545 inode = alloc_anon_inode(drm_fs_mnt->mnt_sb); in drm_fs_inode_new()
568 * - The entire device initialization procedure should be run from the
573 * - The opaque pointer passed to all components through component_bind_all()
577 * - The component helper fills the niche where further standardization of
587 drm_fs_inode_free(dev->anon_inode); in drm_dev_init_release()
589 put_device(dev->dev); in drm_dev_init_release()
590 /* Prevent use-after-free in drm_managed_release when debugging is in drm_dev_init_release()
592 dev->dev = NULL; in drm_dev_init_release()
593 mutex_destroy(&dev->master_mutex); in drm_dev_init_release()
594 mutex_destroy(&dev->clientlist_mutex); in drm_dev_init_release()
595 mutex_destroy(&dev->filelist_mutex); in drm_dev_init_release()
596 mutex_destroy(&dev->struct_mutex); in drm_dev_init_release()
608 return -ENODEV; in drm_dev_init()
612 return -EINVAL; in drm_dev_init()
614 kref_init(&dev->ref); in drm_dev_init()
615 dev->dev = get_device(parent); in drm_dev_init()
616 dev->driver = driver; in drm_dev_init()
618 INIT_LIST_HEAD(&dev->managed.resources); in drm_dev_init()
619 spin_lock_init(&dev->managed.lock); in drm_dev_init()
621 /* no per-device feature limits by default */ in drm_dev_init()
622 dev->driver_features = ~0u; in drm_dev_init()
628 return -EINVAL; in drm_dev_init()
631 INIT_LIST_HEAD(&dev->filelist); in drm_dev_init()
632 INIT_LIST_HEAD(&dev->filelist_internal); in drm_dev_init()
633 INIT_LIST_HEAD(&dev->clientlist); in drm_dev_init()
634 INIT_LIST_HEAD(&dev->vblank_event_list); in drm_dev_init()
636 spin_lock_init(&dev->event_lock); in drm_dev_init()
637 mutex_init(&dev->struct_mutex); in drm_dev_init()
638 mutex_init(&dev->filelist_mutex); in drm_dev_init()
639 mutex_init(&dev->clientlist_mutex); in drm_dev_init()
640 mutex_init(&dev->master_mutex); in drm_dev_init()
641 raw_spin_lock_init(&dev->mode_config.panic_lock); in drm_dev_init()
654 dev->anon_inode = inode; in drm_dev_init()
680 dev->unique = drmm_kstrdup(dev, dev_name(parent), GFP_KERNEL); in drm_dev_init()
681 if (!dev->unique) { in drm_dev_init()
682 ret = -ENOMEM; in drm_dev_init()
728 return ERR_PTR(-ENOMEM); in __devm_drm_dev_alloc()
743 * drm_dev_alloc - Allocate new DRM device
762 return ERR_PTR(-ENOMEM); in drm_dev_alloc()
783 if (dev->driver->release) in drm_dev_release()
784 dev->driver->release(dev); in drm_dev_release()
788 kfree(dev->managed.final_kfree); in drm_dev_release()
792 * drm_dev_get - Take reference of a DRM device
795 * This increases the ref-count of @dev by one. You *must* already own a
806 kref_get(&dev->ref); in drm_dev_get()
811 * drm_dev_put - Drop reference of a DRM device
814 * This decreases the ref-count of @dev by one. The device is destroyed if the
815 * ref-count drops to zero.
820 kref_put(&dev->ref, drm_dev_release); in drm_dev_put()
830 * drmm_cgroup_register_region - Register a region of a DRM device to cgroups
835 * This decreases the ref-count of @dev by one. The device is destroyed if the
836 * ref-count drops to zero.
843 region = dmem_cgroup_register_region(size, "drm/%s/%s", dev->unique, region_name); in drmm_cgroup_register_region()
875 * 64-127. in create_compat_control_link()
877 name = kasprintf(GFP_KERNEL, "controlD%d", minor->index + 64); in create_compat_control_link()
879 return -ENOMEM; in create_compat_control_link()
881 ret = sysfs_create_link(minor->kdev->kobj.parent, in create_compat_control_link()
882 &minor->kdev->kobj, in create_compat_control_link()
902 name = kasprintf(GFP_KERNEL, "controlD%d", minor->index + 64); in remove_compat_control_link()
906 sysfs_remove_link(minor->kdev->kobj.parent, name); in remove_compat_control_link()
912 * drm_dev_register - Register DRM device
916 * Register the DRM device @dev with the system, advertise device to user-space
933 const struct drm_driver *driver = dev->driver; in drm_dev_register()
936 if (!driver->load) in drm_dev_register()
939 WARN_ON(!dev->managed.final_kfree); in drm_dev_register()
965 dev->registered = true; in drm_dev_register()
967 if (driver->load) { in drm_dev_register()
968 ret = driver->load(dev, flags); in drm_dev_register()
981 driver->name, driver->major, driver->minor, in drm_dev_register()
982 driver->patchlevel, in drm_dev_register()
983 dev->dev ? dev_name(dev->dev) : "virtual device", in drm_dev_register()
984 dev->primary ? dev->primary->index : dev->accel->index); in drm_dev_register()
989 if (dev->driver->unload) in drm_dev_register()
990 dev->driver->unload(dev); in drm_dev_register()
1004 * drm_dev_unregister - Unregister DRM device
1021 dev->registered = false; in drm_dev_unregister()
1030 if (dev->driver->unload) in drm_dev_unregister()
1031 dev->driver->unload(dev); in drm_dev_unregister()
1047 * - The "DRM-Global" key/value database
1048 * - Global ID management for connectors
1049 * - DRM major number allocation
1050 * - DRM minor management
1051 * - DRM sysfs class
1052 * - DRM debugfs root
1054 * Furthermore, the DRM core provides dynamic char-dev lookups. For each
1056 * core. DRM core takes care of major-number management and char-dev
1057 * registration. A stub ->open() callback forwards any open() requests to the
1073 new_fops = fops_get(minor->dev->driver->fops); in drm_stub_open()
1075 err = -ENODEV; in drm_stub_open()
1080 if (filp->f_op->open) in drm_stub_open()
1081 err = filp->f_op->open(inode, filp); in drm_stub_open()