linux/include/drm/drm_gem.h
<<
>>
Prefs
   1#ifndef __DRM_GEM_H__
   2#define __DRM_GEM_H__
   3
   4/*
   5 * GEM Graphics Execution Manager Driver Interfaces
   6 *
   7 * Copyright 1999 Precision Insight, Inc., Cedar Park, Texas.
   8 * Copyright 2000 VA Linux Systems, Inc., Sunnyvale, California.
   9 * Copyright (c) 2009-2010, Code Aurora Forum.
  10 * All rights reserved.
  11 * Copyright © 2014 Intel Corporation
  12 *   Daniel Vetter <daniel.vetter@ffwll.ch>
  13 *
  14 * Author: Rickard E. (Rik) Faith <faith@valinux.com>
  15 * Author: Gareth Hughes <gareth@valinux.com>
  16 *
  17 * Permission is hereby granted, free of charge, to any person obtaining a
  18 * copy of this software and associated documentation files (the "Software"),
  19 * to deal in the Software without restriction, including without limitation
  20 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
  21 * and/or sell copies of the Software, and to permit persons to whom the
  22 * Software is furnished to do so, subject to the following conditions:
  23 *
  24 * The above copyright notice and this permission notice (including the next
  25 * paragraph) shall be included in all copies or substantial portions of the
  26 * Software.
  27 *
  28 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
  29 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
  30 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
  31 * VA LINUX SYSTEMS AND/OR ITS SUPPLIERS BE LIABLE FOR ANY CLAIM, DAMAGES OR
  32 * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
  33 * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
  34 * OTHER DEALINGS IN THE SOFTWARE.
  35 */
  36
  37#include <linux/kref.h>
  38#include <linux/dma-resv.h>
  39
  40#include <drm/drm_vma_manager.h>
  41
  42struct dma_buf_map;
  43struct drm_gem_object;
  44
  45/**
  46 * struct drm_gem_object_funcs - GEM object functions
  47 */
  48struct drm_gem_object_funcs {
  49        /**
  50         * @free:
  51         *
  52         * Deconstructor for drm_gem_objects.
  53         *
  54         * This callback is mandatory.
  55         */
  56        void (*free)(struct drm_gem_object *obj);
  57
  58        /**
  59         * @open:
  60         *
  61         * Called upon GEM handle creation.
  62         *
  63         * This callback is optional.
  64         */
  65        int (*open)(struct drm_gem_object *obj, struct drm_file *file);
  66
  67        /**
  68         * @close:
  69         *
  70         * Called upon GEM handle release.
  71         *
  72         * This callback is optional.
  73         */
  74        void (*close)(struct drm_gem_object *obj, struct drm_file *file);
  75
  76        /**
  77         * @print_info:
  78         *
  79         * If driver subclasses struct &drm_gem_object, it can implement this
  80         * optional hook for printing additional driver specific info.
  81         *
  82         * drm_printf_indent() should be used in the callback passing it the
  83         * indent argument.
  84         *
  85         * This callback is called from drm_gem_print_info().
  86         *
  87         * This callback is optional.
  88         */
  89        void (*print_info)(struct drm_printer *p, unsigned int indent,
  90                           const struct drm_gem_object *obj);
  91
  92        /**
  93         * @export:
  94         *
  95         * Export backing buffer as a &dma_buf.
  96         * If this is not set drm_gem_prime_export() is used.
  97         *
  98         * This callback is optional.
  99         */
 100        struct dma_buf *(*export)(struct drm_gem_object *obj, int flags);
 101
 102        /**
 103         * @pin:
 104         *
 105         * Pin backing buffer in memory. Used by the drm_gem_map_attach() helper.
 106         *
 107         * This callback is optional.
 108         */
 109        int (*pin)(struct drm_gem_object *obj);
 110
 111        /**
 112         * @unpin:
 113         *
 114         * Unpin backing buffer. Used by the drm_gem_map_detach() helper.
 115         *
 116         * This callback is optional.
 117         */
 118        void (*unpin)(struct drm_gem_object *obj);
 119
 120        /**
 121         * @get_sg_table:
 122         *
 123         * Returns a Scatter-Gather table representation of the buffer.
 124         * Used when exporting a buffer by the drm_gem_map_dma_buf() helper.
 125         * Releasing is done by calling dma_unmap_sg_attrs() and sg_free_table()
 126         * in drm_gem_unmap_buf(), therefore these helpers and this callback
 127         * here cannot be used for sg tables pointing at driver private memory
 128         * ranges.
 129         *
 130         * See also drm_prime_pages_to_sg().
 131         */
 132        struct sg_table *(*get_sg_table)(struct drm_gem_object *obj);
 133
 134        /**
 135         * @vmap:
 136         *
 137         * Returns a virtual address for the buffer. Used by the
 138         * drm_gem_dmabuf_vmap() helper.
 139         *
 140         * This callback is optional.
 141         */
 142        int (*vmap)(struct drm_gem_object *obj, struct dma_buf_map *map);
 143
 144        /**
 145         * @vunmap:
 146         *
 147         * Releases the address previously returned by @vmap. Used by the
 148         * drm_gem_dmabuf_vunmap() helper.
 149         *
 150         * This callback is optional.
 151         */
 152        void (*vunmap)(struct drm_gem_object *obj, struct dma_buf_map *map);
 153
 154        /**
 155         * @mmap:
 156         *
 157         * Handle mmap() of the gem object, setup vma accordingly.
 158         *
 159         * This callback is optional.
 160         *
 161         * The callback is used by both drm_gem_mmap_obj() and
 162         * drm_gem_prime_mmap().  When @mmap is present @vm_ops is not
 163         * used, the @mmap callback must set vma->vm_ops instead.
 164         */
 165        int (*mmap)(struct drm_gem_object *obj, struct vm_area_struct *vma);
 166
 167        /**
 168         * @vm_ops:
 169         *
 170         * Virtual memory operations used with mmap.
 171         *
 172         * This is optional but necessary for mmap support.
 173         */
 174        const struct vm_operations_struct *vm_ops;
 175};
 176
 177/**
 178 * struct drm_gem_object - GEM buffer object
 179 *
 180 * This structure defines the generic parts for GEM buffer objects, which are
 181 * mostly around handling mmap and userspace handles.
 182 *
 183 * Buffer objects are often abbreviated to BO.
 184 */
 185struct drm_gem_object {
 186        /**
 187         * @refcount:
 188         *
 189         * Reference count of this object
 190         *
 191         * Please use drm_gem_object_get() to acquire and drm_gem_object_put_locked()
 192         * or drm_gem_object_put() to release a reference to a GEM
 193         * buffer object.
 194         */
 195        struct kref refcount;
 196
 197        /**
 198         * @handle_count:
 199         *
 200         * This is the GEM file_priv handle count of this object.
 201         *
 202         * Each handle also holds a reference. Note that when the handle_count
 203         * drops to 0 any global names (e.g. the id in the flink namespace) will
 204         * be cleared.
 205         *
 206         * Protected by &drm_device.object_name_lock.
 207         */
 208        unsigned handle_count;
 209
 210        /**
 211         * @dev: DRM dev this object belongs to.
 212         */
 213        struct drm_device *dev;
 214
 215        /**
 216         * @filp:
 217         *
 218         * SHMEM file node used as backing storage for swappable buffer objects.
 219         * GEM also supports driver private objects with driver-specific backing
 220         * storage (contiguous CMA memory, special reserved blocks). In this
 221         * case @filp is NULL.
 222         */
 223        struct file *filp;
 224
 225        /**
 226         * @vma_node:
 227         *
 228         * Mapping info for this object to support mmap. Drivers are supposed to
 229         * allocate the mmap offset using drm_gem_create_mmap_offset(). The
 230         * offset itself can be retrieved using drm_vma_node_offset_addr().
 231         *
 232         * Memory mapping itself is handled by drm_gem_mmap(), which also checks
 233         * that userspace is allowed to access the object.
 234         */
 235        struct drm_vma_offset_node vma_node;
 236
 237        /**
 238         * @size:
 239         *
 240         * Size of the object, in bytes.  Immutable over the object's
 241         * lifetime.
 242         */
 243        size_t size;
 244
 245        /**
 246         * @name:
 247         *
 248         * Global name for this object, starts at 1. 0 means unnamed.
 249         * Access is covered by &drm_device.object_name_lock. This is used by
 250         * the GEM_FLINK and GEM_OPEN ioctls.
 251         */
 252        int name;
 253
 254        /**
 255         * @dma_buf:
 256         *
 257         * dma-buf associated with this GEM object.
 258         *
 259         * Pointer to the dma-buf associated with this gem object (either
 260         * through importing or exporting). We break the resulting reference
 261         * loop when the last gem handle for this object is released.
 262         *
 263         * Protected by &drm_device.object_name_lock.
 264         */
 265        struct dma_buf *dma_buf;
 266
 267        /**
 268         * @import_attach:
 269         *
 270         * dma-buf attachment backing this object.
 271         *
 272         * Any foreign dma_buf imported as a gem object has this set to the
 273         * attachment point for the device. This is invariant over the lifetime
 274         * of a gem object.
 275         *
 276         * The &drm_gem_object_funcs.free callback is responsible for
 277         * cleaning up the dma_buf attachment and references acquired at import
 278         * time.
 279         *
 280         * Note that the drm gem/prime core does not depend upon drivers setting
 281         * this field any more. So for drivers where this doesn't make sense
 282         * (e.g. virtual devices or a displaylink behind an usb bus) they can
 283         * simply leave it as NULL.
 284         */
 285        struct dma_buf_attachment *import_attach;
 286
 287        /**
 288         * @resv:
 289         *
 290         * Pointer to reservation object associated with the this GEM object.
 291         *
 292         * Normally (@resv == &@_resv) except for imported GEM objects.
 293         */
 294        struct dma_resv *resv;
 295
 296        /**
 297         * @_resv:
 298         *
 299         * A reservation object for this GEM object.
 300         *
 301         * This is unused for imported GEM objects.
 302         */
 303        struct dma_resv _resv;
 304
 305        /**
 306         * @funcs:
 307         *
 308         * Optional GEM object functions. If this is set, it will be used instead of the
 309         * corresponding &drm_driver GEM callbacks.
 310         *
 311         * New drivers should use this.
 312         *
 313         */
 314        const struct drm_gem_object_funcs *funcs;
 315};
 316
 317/**
 318 * DEFINE_DRM_GEM_FOPS() - macro to generate file operations for GEM drivers
 319 * @name: name for the generated structure
 320 *
 321 * This macro autogenerates a suitable &struct file_operations for GEM based
 322 * drivers, which can be assigned to &drm_driver.fops. Note that this structure
 323 * cannot be shared between drivers, because it contains a reference to the
 324 * current module using THIS_MODULE.
 325 *
 326 * Note that the declaration is already marked as static - if you need a
 327 * non-static version of this you're probably doing it wrong and will break the
 328 * THIS_MODULE reference by accident.
 329 */
 330#define DEFINE_DRM_GEM_FOPS(name) \
 331        static const struct file_operations name = {\
 332                .owner          = THIS_MODULE,\
 333                .open           = drm_open,\
 334                .release        = drm_release,\
 335                .unlocked_ioctl = drm_ioctl,\
 336                .compat_ioctl   = drm_compat_ioctl,\
 337                .poll           = drm_poll,\
 338                .read           = drm_read,\
 339                .llseek         = noop_llseek,\
 340                .mmap           = drm_gem_mmap,\
 341        }
 342
 343void drm_gem_object_release(struct drm_gem_object *obj);
 344void drm_gem_object_free(struct kref *kref);
 345int drm_gem_object_init(struct drm_device *dev,
 346                        struct drm_gem_object *obj, size_t size);
 347void drm_gem_private_object_init(struct drm_device *dev,
 348                                 struct drm_gem_object *obj, size_t size);
 349void drm_gem_vm_open(struct vm_area_struct *vma);
 350void drm_gem_vm_close(struct vm_area_struct *vma);
 351int drm_gem_mmap_obj(struct drm_gem_object *obj, unsigned long obj_size,
 352                     struct vm_area_struct *vma);
 353int drm_gem_mmap(struct file *filp, struct vm_area_struct *vma);
 354
 355/**
 356 * drm_gem_object_get - acquire a GEM buffer object reference
 357 * @obj: GEM buffer object
 358 *
 359 * This function acquires an additional reference to @obj. It is illegal to
 360 * call this without already holding a reference. No locks required.
 361 */
 362static inline void drm_gem_object_get(struct drm_gem_object *obj)
 363{
 364        kref_get(&obj->refcount);
 365}
 366
 367__attribute__((nonnull))
 368static inline void
 369__drm_gem_object_put(struct drm_gem_object *obj)
 370{
 371        kref_put(&obj->refcount, drm_gem_object_free);
 372}
 373
 374/**
 375 * drm_gem_object_put - drop a GEM buffer object reference
 376 * @obj: GEM buffer object
 377 *
 378 * This releases a reference to @obj.
 379 */
 380static inline void
 381drm_gem_object_put(struct drm_gem_object *obj)
 382{
 383        if (obj)
 384                __drm_gem_object_put(obj);
 385}
 386
 387int drm_gem_handle_create(struct drm_file *file_priv,
 388                          struct drm_gem_object *obj,
 389                          u32 *handlep);
 390int drm_gem_handle_delete(struct drm_file *filp, u32 handle);
 391
 392
 393void drm_gem_free_mmap_offset(struct drm_gem_object *obj);
 394int drm_gem_create_mmap_offset(struct drm_gem_object *obj);
 395int drm_gem_create_mmap_offset_size(struct drm_gem_object *obj, size_t size);
 396
 397struct page **drm_gem_get_pages(struct drm_gem_object *obj);
 398void drm_gem_put_pages(struct drm_gem_object *obj, struct page **pages,
 399                bool dirty, bool accessed);
 400
 401int drm_gem_objects_lookup(struct drm_file *filp, void __user *bo_handles,
 402                           int count, struct drm_gem_object ***objs_out);
 403struct drm_gem_object *drm_gem_object_lookup(struct drm_file *filp, u32 handle);
 404long drm_gem_dma_resv_wait(struct drm_file *filep, u32 handle,
 405                                    bool wait_all, unsigned long timeout);
 406int drm_gem_lock_reservations(struct drm_gem_object **objs, int count,
 407                              struct ww_acquire_ctx *acquire_ctx);
 408void drm_gem_unlock_reservations(struct drm_gem_object **objs, int count,
 409                                 struct ww_acquire_ctx *acquire_ctx);
 410int drm_gem_fence_array_add(struct xarray *fence_array,
 411                            struct dma_fence *fence);
 412int drm_gem_fence_array_add_implicit(struct xarray *fence_array,
 413                                     struct drm_gem_object *obj,
 414                                     bool write);
 415int drm_gem_dumb_map_offset(struct drm_file *file, struct drm_device *dev,
 416                            u32 handle, u64 *offset);
 417
 418#endif /* __DRM_GEM_H__ */
 419