LCOV - code coverage report
Current view: top level - include/drm - drm_gem.h (source / functions) Hit Total Coverage
Test: coverage.info Lines: 0 3 0.0 %
Date: 2022-12-09 01:23:36 Functions: 0 0 -

          Line data    Source code
       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             : 
      42             : struct iosys_map;
      43             : struct drm_gem_object;
      44             : 
      45             : /**
      46             :  * struct drm_gem_object_funcs - GEM object functions
      47             :  */
      48             : struct 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 iosys_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 iosys_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             :  */
     185             : struct 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             : 
     343             : void drm_gem_object_release(struct drm_gem_object *obj);
     344             : void drm_gem_object_free(struct kref *kref);
     345             : int drm_gem_object_init(struct drm_device *dev,
     346             :                         struct drm_gem_object *obj, size_t size);
     347             : void drm_gem_private_object_init(struct drm_device *dev,
     348             :                                  struct drm_gem_object *obj, size_t size);
     349             : void drm_gem_vm_open(struct vm_area_struct *vma);
     350             : void drm_gem_vm_close(struct vm_area_struct *vma);
     351             : int drm_gem_mmap_obj(struct drm_gem_object *obj, unsigned long obj_size,
     352             :                      struct vm_area_struct *vma);
     353             : int 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             :  */
     362             : static inline void drm_gem_object_get(struct drm_gem_object *obj)
     363             : {
     364           0 :         kref_get(&obj->refcount);
     365             : }
     366             : 
     367             : __attribute__((nonnull))
     368             : static inline void
     369             : __drm_gem_object_put(struct drm_gem_object *obj)
     370             : {
     371           0 :         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             :  */
     380             : static inline void
     381             : drm_gem_object_put(struct drm_gem_object *obj)
     382             : {
     383           0 :         if (obj)
     384             :                 __drm_gem_object_put(obj);
     385             : }
     386             : 
     387             : int drm_gem_handle_create(struct drm_file *file_priv,
     388             :                           struct drm_gem_object *obj,
     389             :                           u32 *handlep);
     390             : int drm_gem_handle_delete(struct drm_file *filp, u32 handle);
     391             : 
     392             : 
     393             : void drm_gem_free_mmap_offset(struct drm_gem_object *obj);
     394             : int drm_gem_create_mmap_offset(struct drm_gem_object *obj);
     395             : int drm_gem_create_mmap_offset_size(struct drm_gem_object *obj, size_t size);
     396             : 
     397             : struct page **drm_gem_get_pages(struct drm_gem_object *obj);
     398             : void drm_gem_put_pages(struct drm_gem_object *obj, struct page **pages,
     399             :                 bool dirty, bool accessed);
     400             : 
     401             : int drm_gem_objects_lookup(struct drm_file *filp, void __user *bo_handles,
     402             :                            int count, struct drm_gem_object ***objs_out);
     403             : struct drm_gem_object *drm_gem_object_lookup(struct drm_file *filp, u32 handle);
     404             : long drm_gem_dma_resv_wait(struct drm_file *filep, u32 handle,
     405             :                                     bool wait_all, unsigned long timeout);
     406             : int drm_gem_lock_reservations(struct drm_gem_object **objs, int count,
     407             :                               struct ww_acquire_ctx *acquire_ctx);
     408             : void drm_gem_unlock_reservations(struct drm_gem_object **objs, int count,
     409             :                                  struct ww_acquire_ctx *acquire_ctx);
     410             : int drm_gem_dumb_map_offset(struct drm_file *file, struct drm_device *dev,
     411             :                             u32 handle, u64 *offset);
     412             : 
     413             : #endif /* __DRM_GEM_H__ */

Generated by: LCOV version 1.14