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: 2023-04-06 08:38:28 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             :          * @evict:
     169             :          *
     170             :          * Evicts gem object out from memory. Used by the drm_gem_object_evict()
     171             :          * helper. Returns 0 on success, -errno otherwise.
     172             :          *
     173             :          * This callback is optional.
     174             :          */
     175             :         int (*evict)(struct drm_gem_object *obj);
     176             : 
     177             :         /**
     178             :          * @vm_ops:
     179             :          *
     180             :          * Virtual memory operations used with mmap.
     181             :          *
     182             :          * This is optional but necessary for mmap support.
     183             :          */
     184             :         const struct vm_operations_struct *vm_ops;
     185             : };
     186             : 
     187             : /**
     188             :  * struct drm_gem_lru - A simple LRU helper
     189             :  *
     190             :  * A helper for tracking GEM objects in a given state, to aid in
     191             :  * driver's shrinker implementation.  Tracks the count of pages
     192             :  * for lockless &shrinker.count_objects, and provides
     193             :  * &drm_gem_lru_scan for driver's &shrinker.scan_objects
     194             :  * implementation.
     195             :  */
     196             : struct drm_gem_lru {
     197             :         /**
     198             :          * @lock:
     199             :          *
     200             :          * Lock protecting movement of GEM objects between LRUs.  All
     201             :          * LRUs that the object can move between should be protected
     202             :          * by the same lock.
     203             :          */
     204             :         struct mutex *lock;
     205             : 
     206             :         /**
     207             :          * @count:
     208             :          *
     209             :          * The total number of backing pages of the GEM objects in
     210             :          * this LRU.
     211             :          */
     212             :         long count;
     213             : 
     214             :         /**
     215             :          * @list:
     216             :          *
     217             :          * The LRU list.
     218             :          */
     219             :         struct list_head list;
     220             : };
     221             : 
     222             : /**
     223             :  * struct drm_gem_object - GEM buffer object
     224             :  *
     225             :  * This structure defines the generic parts for GEM buffer objects, which are
     226             :  * mostly around handling mmap and userspace handles.
     227             :  *
     228             :  * Buffer objects are often abbreviated to BO.
     229             :  */
     230             : struct drm_gem_object {
     231             :         /**
     232             :          * @refcount:
     233             :          *
     234             :          * Reference count of this object
     235             :          *
     236             :          * Please use drm_gem_object_get() to acquire and drm_gem_object_put_locked()
     237             :          * or drm_gem_object_put() to release a reference to a GEM
     238             :          * buffer object.
     239             :          */
     240             :         struct kref refcount;
     241             : 
     242             :         /**
     243             :          * @handle_count:
     244             :          *
     245             :          * This is the GEM file_priv handle count of this object.
     246             :          *
     247             :          * Each handle also holds a reference. Note that when the handle_count
     248             :          * drops to 0 any global names (e.g. the id in the flink namespace) will
     249             :          * be cleared.
     250             :          *
     251             :          * Protected by &drm_device.object_name_lock.
     252             :          */
     253             :         unsigned handle_count;
     254             : 
     255             :         /**
     256             :          * @dev: DRM dev this object belongs to.
     257             :          */
     258             :         struct drm_device *dev;
     259             : 
     260             :         /**
     261             :          * @filp:
     262             :          *
     263             :          * SHMEM file node used as backing storage for swappable buffer objects.
     264             :          * GEM also supports driver private objects with driver-specific backing
     265             :          * storage (contiguous DMA memory, special reserved blocks). In this
     266             :          * case @filp is NULL.
     267             :          */
     268             :         struct file *filp;
     269             : 
     270             :         /**
     271             :          * @vma_node:
     272             :          *
     273             :          * Mapping info for this object to support mmap. Drivers are supposed to
     274             :          * allocate the mmap offset using drm_gem_create_mmap_offset(). The
     275             :          * offset itself can be retrieved using drm_vma_node_offset_addr().
     276             :          *
     277             :          * Memory mapping itself is handled by drm_gem_mmap(), which also checks
     278             :          * that userspace is allowed to access the object.
     279             :          */
     280             :         struct drm_vma_offset_node vma_node;
     281             : 
     282             :         /**
     283             :          * @size:
     284             :          *
     285             :          * Size of the object, in bytes.  Immutable over the object's
     286             :          * lifetime.
     287             :          */
     288             :         size_t size;
     289             : 
     290             :         /**
     291             :          * @name:
     292             :          *
     293             :          * Global name for this object, starts at 1. 0 means unnamed.
     294             :          * Access is covered by &drm_device.object_name_lock. This is used by
     295             :          * the GEM_FLINK and GEM_OPEN ioctls.
     296             :          */
     297             :         int name;
     298             : 
     299             :         /**
     300             :          * @dma_buf:
     301             :          *
     302             :          * dma-buf associated with this GEM object.
     303             :          *
     304             :          * Pointer to the dma-buf associated with this gem object (either
     305             :          * through importing or exporting). We break the resulting reference
     306             :          * loop when the last gem handle for this object is released.
     307             :          *
     308             :          * Protected by &drm_device.object_name_lock.
     309             :          */
     310             :         struct dma_buf *dma_buf;
     311             : 
     312             :         /**
     313             :          * @import_attach:
     314             :          *
     315             :          * dma-buf attachment backing this object.
     316             :          *
     317             :          * Any foreign dma_buf imported as a gem object has this set to the
     318             :          * attachment point for the device. This is invariant over the lifetime
     319             :          * of a gem object.
     320             :          *
     321             :          * The &drm_gem_object_funcs.free callback is responsible for
     322             :          * cleaning up the dma_buf attachment and references acquired at import
     323             :          * time.
     324             :          *
     325             :          * Note that the drm gem/prime core does not depend upon drivers setting
     326             :          * this field any more. So for drivers where this doesn't make sense
     327             :          * (e.g. virtual devices or a displaylink behind an usb bus) they can
     328             :          * simply leave it as NULL.
     329             :          */
     330             :         struct dma_buf_attachment *import_attach;
     331             : 
     332             :         /**
     333             :          * @resv:
     334             :          *
     335             :          * Pointer to reservation object associated with the this GEM object.
     336             :          *
     337             :          * Normally (@resv == &@_resv) except for imported GEM objects.
     338             :          */
     339             :         struct dma_resv *resv;
     340             : 
     341             :         /**
     342             :          * @_resv:
     343             :          *
     344             :          * A reservation object for this GEM object.
     345             :          *
     346             :          * This is unused for imported GEM objects.
     347             :          */
     348             :         struct dma_resv _resv;
     349             : 
     350             :         /**
     351             :          * @funcs:
     352             :          *
     353             :          * Optional GEM object functions. If this is set, it will be used instead of the
     354             :          * corresponding &drm_driver GEM callbacks.
     355             :          *
     356             :          * New drivers should use this.
     357             :          *
     358             :          */
     359             :         const struct drm_gem_object_funcs *funcs;
     360             : 
     361             :         /**
     362             :          * @lru_node:
     363             :          *
     364             :          * List node in a &drm_gem_lru.
     365             :          */
     366             :         struct list_head lru_node;
     367             : 
     368             :         /**
     369             :          * @lru:
     370             :          *
     371             :          * The current LRU list that the GEM object is on.
     372             :          */
     373             :         struct drm_gem_lru *lru;
     374             : };
     375             : 
     376             : /**
     377             :  * DRM_GEM_FOPS - Default drm GEM file operations
     378             :  *
     379             :  * This macro provides a shorthand for setting the GEM file ops in the
     380             :  * &file_operations structure.  If all you need are the default ops, use
     381             :  * DEFINE_DRM_GEM_FOPS instead.
     382             :  */
     383             : #define DRM_GEM_FOPS \
     384             :         .open           = drm_open,\
     385             :         .release        = drm_release,\
     386             :         .unlocked_ioctl = drm_ioctl,\
     387             :         .compat_ioctl   = drm_compat_ioctl,\
     388             :         .poll           = drm_poll,\
     389             :         .read           = drm_read,\
     390             :         .llseek         = noop_llseek,\
     391             :         .mmap           = drm_gem_mmap
     392             : 
     393             : /**
     394             :  * DEFINE_DRM_GEM_FOPS() - macro to generate file operations for GEM drivers
     395             :  * @name: name for the generated structure
     396             :  *
     397             :  * This macro autogenerates a suitable &struct file_operations for GEM based
     398             :  * drivers, which can be assigned to &drm_driver.fops. Note that this structure
     399             :  * cannot be shared between drivers, because it contains a reference to the
     400             :  * current module using THIS_MODULE.
     401             :  *
     402             :  * Note that the declaration is already marked as static - if you need a
     403             :  * non-static version of this you're probably doing it wrong and will break the
     404             :  * THIS_MODULE reference by accident.
     405             :  */
     406             : #define DEFINE_DRM_GEM_FOPS(name) \
     407             :         static const struct file_operations name = {\
     408             :                 .owner          = THIS_MODULE,\
     409             :                 DRM_GEM_FOPS,\
     410             :         }
     411             : 
     412             : void drm_gem_object_release(struct drm_gem_object *obj);
     413             : void drm_gem_object_free(struct kref *kref);
     414             : int drm_gem_object_init(struct drm_device *dev,
     415             :                         struct drm_gem_object *obj, size_t size);
     416             : void drm_gem_private_object_init(struct drm_device *dev,
     417             :                                  struct drm_gem_object *obj, size_t size);
     418             : void drm_gem_private_object_fini(struct drm_gem_object *obj);
     419             : void drm_gem_vm_open(struct vm_area_struct *vma);
     420             : void drm_gem_vm_close(struct vm_area_struct *vma);
     421             : int drm_gem_mmap_obj(struct drm_gem_object *obj, unsigned long obj_size,
     422             :                      struct vm_area_struct *vma);
     423             : int drm_gem_mmap(struct file *filp, struct vm_area_struct *vma);
     424             : 
     425             : /**
     426             :  * drm_gem_object_get - acquire a GEM buffer object reference
     427             :  * @obj: GEM buffer object
     428             :  *
     429             :  * This function acquires an additional reference to @obj. It is illegal to
     430             :  * call this without already holding a reference. No locks required.
     431             :  */
     432             : static inline void drm_gem_object_get(struct drm_gem_object *obj)
     433             : {
     434           0 :         kref_get(&obj->refcount);
     435             : }
     436             : 
     437             : __attribute__((nonnull))
     438             : static inline void
     439             : __drm_gem_object_put(struct drm_gem_object *obj)
     440             : {
     441           0 :         kref_put(&obj->refcount, drm_gem_object_free);
     442             : }
     443             : 
     444             : /**
     445             :  * drm_gem_object_put - drop a GEM buffer object reference
     446             :  * @obj: GEM buffer object
     447             :  *
     448             :  * This releases a reference to @obj.
     449             :  */
     450             : static inline void
     451             : drm_gem_object_put(struct drm_gem_object *obj)
     452             : {
     453           0 :         if (obj)
     454             :                 __drm_gem_object_put(obj);
     455             : }
     456             : 
     457             : int drm_gem_handle_create(struct drm_file *file_priv,
     458             :                           struct drm_gem_object *obj,
     459             :                           u32 *handlep);
     460             : int drm_gem_handle_delete(struct drm_file *filp, u32 handle);
     461             : 
     462             : 
     463             : void drm_gem_free_mmap_offset(struct drm_gem_object *obj);
     464             : int drm_gem_create_mmap_offset(struct drm_gem_object *obj);
     465             : int drm_gem_create_mmap_offset_size(struct drm_gem_object *obj, size_t size);
     466             : 
     467             : struct page **drm_gem_get_pages(struct drm_gem_object *obj);
     468             : void drm_gem_put_pages(struct drm_gem_object *obj, struct page **pages,
     469             :                 bool dirty, bool accessed);
     470             : 
     471             : int drm_gem_vmap_unlocked(struct drm_gem_object *obj, struct iosys_map *map);
     472             : void drm_gem_vunmap_unlocked(struct drm_gem_object *obj, struct iosys_map *map);
     473             : 
     474             : int drm_gem_objects_lookup(struct drm_file *filp, void __user *bo_handles,
     475             :                            int count, struct drm_gem_object ***objs_out);
     476             : struct drm_gem_object *drm_gem_object_lookup(struct drm_file *filp, u32 handle);
     477             : long drm_gem_dma_resv_wait(struct drm_file *filep, u32 handle,
     478             :                                     bool wait_all, unsigned long timeout);
     479             : int drm_gem_lock_reservations(struct drm_gem_object **objs, int count,
     480             :                               struct ww_acquire_ctx *acquire_ctx);
     481             : void drm_gem_unlock_reservations(struct drm_gem_object **objs, int count,
     482             :                                  struct ww_acquire_ctx *acquire_ctx);
     483             : int drm_gem_dumb_map_offset(struct drm_file *file, struct drm_device *dev,
     484             :                             u32 handle, u64 *offset);
     485             : 
     486             : void drm_gem_lru_init(struct drm_gem_lru *lru, struct mutex *lock);
     487             : void drm_gem_lru_remove(struct drm_gem_object *obj);
     488             : void drm_gem_lru_move_tail(struct drm_gem_lru *lru, struct drm_gem_object *obj);
     489             : unsigned long drm_gem_lru_scan(struct drm_gem_lru *lru, unsigned nr_to_scan,
     490             :                                bool (*shrink)(struct drm_gem_object *obj));
     491             : 
     492             : int drm_gem_evict(struct drm_gem_object *obj);
     493             : 
     494             : #endif /* __DRM_GEM_H__ */

Generated by: LCOV version 1.14