LCOV - code coverage report
Current view: top level - include/drm - drm_file.h (source / functions) Hit Total Coverage
Test: coverage.info Lines: 0 2 0.0 %
Date: 2023-08-24 13:40:31 Functions: 0 0 -

          Line data    Source code
       1             : /*
       2             :  * Copyright 1999 Precision Insight, Inc., Cedar Park, Texas.
       3             :  * Copyright 2000 VA Linux Systems, Inc., Sunnyvale, California.
       4             :  * Copyright (c) 2009-2010, Code Aurora Forum.
       5             :  * All rights reserved.
       6             :  *
       7             :  * Author: Rickard E. (Rik) Faith <faith@valinux.com>
       8             :  * Author: Gareth Hughes <gareth@valinux.com>
       9             :  *
      10             :  * Permission is hereby granted, free of charge, to any person obtaining a
      11             :  * copy of this software and associated documentation files (the "Software"),
      12             :  * to deal in the Software without restriction, including without limitation
      13             :  * the rights to use, copy, modify, merge, publish, distribute, sublicense,
      14             :  * and/or sell copies of the Software, and to permit persons to whom the
      15             :  * Software is furnished to do so, subject to the following conditions:
      16             :  *
      17             :  * The above copyright notice and this permission notice (including the next
      18             :  * paragraph) shall be included in all copies or substantial portions of the
      19             :  * Software.
      20             :  *
      21             :  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
      22             :  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
      23             :  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
      24             :  * VA LINUX SYSTEMS AND/OR ITS SUPPLIERS BE LIABLE FOR ANY CLAIM, DAMAGES OR
      25             :  * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
      26             :  * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
      27             :  * OTHER DEALINGS IN THE SOFTWARE.
      28             :  */
      29             : 
      30             : #ifndef _DRM_FILE_H_
      31             : #define _DRM_FILE_H_
      32             : 
      33             : #include <linux/types.h>
      34             : #include <linux/completion.h>
      35             : #include <linux/idr.h>
      36             : 
      37             : #include <uapi/drm/drm.h>
      38             : 
      39             : #include <drm/drm_prime.h>
      40             : 
      41             : struct dma_fence;
      42             : struct drm_file;
      43             : struct drm_device;
      44             : struct drm_printer;
      45             : struct device;
      46             : struct file;
      47             : 
      48             : /*
      49             :  * FIXME: Not sure we want to have drm_minor here in the end, but to avoid
      50             :  * header include loops we need it here for now.
      51             :  */
      52             : 
      53             : /* Note that the values of this enum are ABI (it determines
      54             :  * /dev/dri/renderD* numbers).
      55             :  *
      56             :  * Setting DRM_MINOR_ACCEL to 32 gives enough space for more drm minors to
      57             :  * be implemented before we hit any future
      58             :  */
      59             : enum drm_minor_type {
      60             :         DRM_MINOR_PRIMARY = 0,
      61             :         DRM_MINOR_CONTROL = 1,
      62             :         DRM_MINOR_RENDER = 2,
      63             :         DRM_MINOR_ACCEL = 32,
      64             : };
      65             : 
      66             : /**
      67             :  * struct drm_minor - DRM device minor structure
      68             :  *
      69             :  * This structure represents a DRM minor number for device nodes in /dev.
      70             :  * Entirely opaque to drivers and should never be inspected directly by drivers.
      71             :  * Drivers instead should only interact with &struct drm_file and of course
      72             :  * &struct drm_device, which is also where driver-private data and resources can
      73             :  * be attached to.
      74             :  */
      75             : struct drm_minor {
      76             :         /* private: */
      77             :         int index;                      /* Minor device number */
      78             :         int type;                       /* Control or render or accel */
      79             :         struct device *kdev;            /* Linux device */
      80             :         struct drm_device *dev;
      81             : 
      82             :         struct dentry *debugfs_root;
      83             : 
      84             :         struct list_head debugfs_list;
      85             :         struct mutex debugfs_lock; /* Protects debugfs_list. */
      86             : };
      87             : 
      88             : /**
      89             :  * struct drm_pending_event - Event queued up for userspace to read
      90             :  *
      91             :  * This represents a DRM event. Drivers can use this as a generic completion
      92             :  * mechanism, which supports kernel-internal &struct completion, &struct dma_fence
      93             :  * and also the DRM-specific &struct drm_event delivery mechanism.
      94             :  */
      95             : struct drm_pending_event {
      96             :         /**
      97             :          * @completion:
      98             :          *
      99             :          * Optional pointer to a kernel internal completion signalled when
     100             :          * drm_send_event() is called, useful to internally synchronize with
     101             :          * nonblocking operations.
     102             :          */
     103             :         struct completion *completion;
     104             : 
     105             :         /**
     106             :          * @completion_release:
     107             :          *
     108             :          * Optional callback currently only used by the atomic modeset helpers
     109             :          * to clean up the reference count for the structure @completion is
     110             :          * stored in.
     111             :          */
     112             :         void (*completion_release)(struct completion *completion);
     113             : 
     114             :         /**
     115             :          * @event:
     116             :          *
     117             :          * Pointer to the actual event that should be sent to userspace to be
     118             :          * read using drm_read(). Can be optional, since nowadays events are
     119             :          * also used to signal kernel internal threads with @completion or DMA
     120             :          * transactions using @fence.
     121             :          */
     122             :         struct drm_event *event;
     123             : 
     124             :         /**
     125             :          * @fence:
     126             :          *
     127             :          * Optional DMA fence to unblock other hardware transactions which
     128             :          * depend upon the nonblocking DRM operation this event represents.
     129             :          */
     130             :         struct dma_fence *fence;
     131             : 
     132             :         /**
     133             :          * @file_priv:
     134             :          *
     135             :          * &struct drm_file where @event should be delivered to. Only set when
     136             :          * @event is set.
     137             :          */
     138             :         struct drm_file *file_priv;
     139             : 
     140             :         /**
     141             :          * @link:
     142             :          *
     143             :          * Double-linked list to keep track of this event. Can be used by the
     144             :          * driver up to the point when it calls drm_send_event(), after that
     145             :          * this list entry is owned by the core for its own book-keeping.
     146             :          */
     147             :         struct list_head link;
     148             : 
     149             :         /**
     150             :          * @pending_link:
     151             :          *
     152             :          * Entry on &drm_file.pending_event_list, to keep track of all pending
     153             :          * events for @file_priv, to allow correct unwinding of them when
     154             :          * userspace closes the file before the event is delivered.
     155             :          */
     156             :         struct list_head pending_link;
     157             : };
     158             : 
     159             : /**
     160             :  * struct drm_file - DRM file private data
     161             :  *
     162             :  * This structure tracks DRM state per open file descriptor.
     163             :  */
     164             : struct drm_file {
     165             :         /**
     166             :          * @authenticated:
     167             :          *
     168             :          * Whether the client is allowed to submit rendering, which for legacy
     169             :          * nodes means it must be authenticated.
     170             :          *
     171             :          * See also the :ref:`section on primary nodes and authentication
     172             :          * <drm_primary_node>`.
     173             :          */
     174             :         bool authenticated;
     175             : 
     176             :         /**
     177             :          * @stereo_allowed:
     178             :          *
     179             :          * True when the client has asked us to expose stereo 3D mode flags.
     180             :          */
     181             :         bool stereo_allowed;
     182             : 
     183             :         /**
     184             :          * @universal_planes:
     185             :          *
     186             :          * True if client understands CRTC primary planes and cursor planes
     187             :          * in the plane list. Automatically set when @atomic is set.
     188             :          */
     189             :         bool universal_planes;
     190             : 
     191             :         /** @atomic: True if client understands atomic properties. */
     192             :         bool atomic;
     193             : 
     194             :         /**
     195             :          * @aspect_ratio_allowed:
     196             :          *
     197             :          * True, if client can handle picture aspect ratios, and has requested
     198             :          * to pass this information along with the mode.
     199             :          */
     200             :         bool aspect_ratio_allowed;
     201             : 
     202             :         /**
     203             :          * @writeback_connectors:
     204             :          *
     205             :          * True if client understands writeback connectors
     206             :          */
     207             :         bool writeback_connectors;
     208             : 
     209             :         /**
     210             :          * @was_master:
     211             :          *
     212             :          * This client has or had, master capability. Protected by struct
     213             :          * &drm_device.master_mutex.
     214             :          *
     215             :          * This is used to ensure that CAP_SYS_ADMIN is not enforced, if the
     216             :          * client is or was master in the past.
     217             :          */
     218             :         bool was_master;
     219             : 
     220             :         /**
     221             :          * @is_master:
     222             :          *
     223             :          * This client is the creator of @master. Protected by struct
     224             :          * &drm_device.master_mutex.
     225             :          *
     226             :          * See also the :ref:`section on primary nodes and authentication
     227             :          * <drm_primary_node>`.
     228             :          */
     229             :         bool is_master;
     230             : 
     231             :         /**
     232             :          * @master:
     233             :          *
     234             :          * Master this node is currently associated with. Protected by struct
     235             :          * &drm_device.master_mutex, and serialized by @master_lookup_lock.
     236             :          *
     237             :          * Only relevant if drm_is_primary_client() returns true. Note that
     238             :          * this only matches &drm_device.master if the master is the currently
     239             :          * active one.
     240             :          *
     241             :          * To update @master, both &drm_device.master_mutex and
     242             :          * @master_lookup_lock need to be held, therefore holding either of
     243             :          * them is safe and enough for the read side.
     244             :          *
     245             :          * When dereferencing this pointer, either hold struct
     246             :          * &drm_device.master_mutex for the duration of the pointer's use, or
     247             :          * use drm_file_get_master() if struct &drm_device.master_mutex is not
     248             :          * currently held and there is no other need to hold it. This prevents
     249             :          * @master from being freed during use.
     250             :          *
     251             :          * See also @authentication and @is_master and the :ref:`section on
     252             :          * primary nodes and authentication <drm_primary_node>`.
     253             :          */
     254             :         struct drm_master *master;
     255             : 
     256             :         /** @master_lookup_lock: Serializes @master. */
     257             :         spinlock_t master_lookup_lock;
     258             : 
     259             :         /** @pid: Process that opened this file. */
     260             :         struct pid *pid;
     261             : 
     262             :         /** @client_id: A unique id for fdinfo */
     263             :         u64 client_id;
     264             : 
     265             :         /** @magic: Authentication magic, see @authenticated. */
     266             :         drm_magic_t magic;
     267             : 
     268             :         /**
     269             :          * @lhead:
     270             :          *
     271             :          * List of all open files of a DRM device, linked into
     272             :          * &drm_device.filelist. Protected by &drm_device.filelist_mutex.
     273             :          */
     274             :         struct list_head lhead;
     275             : 
     276             :         /** @minor: &struct drm_minor for this file. */
     277             :         struct drm_minor *minor;
     278             : 
     279             :         /**
     280             :          * @object_idr:
     281             :          *
     282             :          * Mapping of mm object handles to object pointers. Used by the GEM
     283             :          * subsystem. Protected by @table_lock.
     284             :          */
     285             :         struct idr object_idr;
     286             : 
     287             :         /** @table_lock: Protects @object_idr. */
     288             :         spinlock_t table_lock;
     289             : 
     290             :         /** @syncobj_idr: Mapping of sync object handles to object pointers. */
     291             :         struct idr syncobj_idr;
     292             :         /** @syncobj_table_lock: Protects @syncobj_idr. */
     293             :         spinlock_t syncobj_table_lock;
     294             : 
     295             :         /** @filp: Pointer to the core file structure. */
     296             :         struct file *filp;
     297             : 
     298             :         /**
     299             :          * @driver_priv:
     300             :          *
     301             :          * Optional pointer for driver private data. Can be allocated in
     302             :          * &drm_driver.open and should be freed in &drm_driver.postclose.
     303             :          */
     304             :         void *driver_priv;
     305             : 
     306             :         /**
     307             :          * @fbs:
     308             :          *
     309             :          * List of &struct drm_framebuffer associated with this file, using the
     310             :          * &drm_framebuffer.filp_head entry.
     311             :          *
     312             :          * Protected by @fbs_lock. Note that the @fbs list holds a reference on
     313             :          * the framebuffer object to prevent it from untimely disappearing.
     314             :          */
     315             :         struct list_head fbs;
     316             : 
     317             :         /** @fbs_lock: Protects @fbs. */
     318             :         struct mutex fbs_lock;
     319             : 
     320             :         /**
     321             :          * @blobs:
     322             :          *
     323             :          * User-created blob properties; this retains a reference on the
     324             :          * property.
     325             :          *
     326             :          * Protected by @drm_mode_config.blob_lock;
     327             :          */
     328             :         struct list_head blobs;
     329             : 
     330             :         /** @event_wait: Waitqueue for new events added to @event_list. */
     331             :         wait_queue_head_t event_wait;
     332             : 
     333             :         /**
     334             :          * @pending_event_list:
     335             :          *
     336             :          * List of pending &struct drm_pending_event, used to clean up pending
     337             :          * events in case this file gets closed before the event is signalled.
     338             :          * Uses the &drm_pending_event.pending_link entry.
     339             :          *
     340             :          * Protect by &drm_device.event_lock.
     341             :          */
     342             :         struct list_head pending_event_list;
     343             : 
     344             :         /**
     345             :          * @event_list:
     346             :          *
     347             :          * List of &struct drm_pending_event, ready for delivery to userspace
     348             :          * through drm_read(). Uses the &drm_pending_event.link entry.
     349             :          *
     350             :          * Protect by &drm_device.event_lock.
     351             :          */
     352             :         struct list_head event_list;
     353             : 
     354             :         /**
     355             :          * @event_space:
     356             :          *
     357             :          * Available event space to prevent userspace from
     358             :          * exhausting kernel memory. Currently limited to the fairly arbitrary
     359             :          * value of 4KB.
     360             :          */
     361             :         int event_space;
     362             : 
     363             :         /** @event_read_lock: Serializes drm_read(). */
     364             :         struct mutex event_read_lock;
     365             : 
     366             :         /**
     367             :          * @prime:
     368             :          *
     369             :          * Per-file buffer caches used by the PRIME buffer sharing code.
     370             :          */
     371             :         struct drm_prime_file_private prime;
     372             : 
     373             :         /* private: */
     374             : #if IS_ENABLED(CONFIG_DRM_LEGACY)
     375             :         unsigned long lock_count; /* DRI1 legacy lock count */
     376             : #endif
     377             : };
     378             : 
     379             : /**
     380             :  * drm_is_primary_client - is this an open file of the primary node
     381             :  * @file_priv: DRM file
     382             :  *
     383             :  * Returns true if this is an open file of the primary node, i.e.
     384             :  * &drm_file.minor of @file_priv is a primary minor.
     385             :  *
     386             :  * See also the :ref:`section on primary nodes and authentication
     387             :  * <drm_primary_node>`.
     388             :  */
     389             : static inline bool drm_is_primary_client(const struct drm_file *file_priv)
     390             : {
     391           0 :         return file_priv->minor->type == DRM_MINOR_PRIMARY;
     392             : }
     393             : 
     394             : /**
     395             :  * drm_is_render_client - is this an open file of the render node
     396             :  * @file_priv: DRM file
     397             :  *
     398             :  * Returns true if this is an open file of the render node, i.e.
     399             :  * &drm_file.minor of @file_priv is a render minor.
     400             :  *
     401             :  * See also the :ref:`section on render nodes <drm_render_node>`.
     402             :  */
     403             : static inline bool drm_is_render_client(const struct drm_file *file_priv)
     404             : {
     405           0 :         return file_priv->minor->type == DRM_MINOR_RENDER;
     406             : }
     407             : 
     408             : /**
     409             :  * drm_is_accel_client - is this an open file of the compute acceleration node
     410             :  * @file_priv: DRM file
     411             :  *
     412             :  * Returns true if this is an open file of the compute acceleration node, i.e.
     413             :  * &drm_file.minor of @file_priv is a accel minor.
     414             :  *
     415             :  * See also :doc:`Introduction to compute accelerators subsystem
     416             :  * </accel/introduction>`.
     417             :  */
     418             : static inline bool drm_is_accel_client(const struct drm_file *file_priv)
     419             : {
     420             :         return file_priv->minor->type == DRM_MINOR_ACCEL;
     421             : }
     422             : 
     423             : int drm_open(struct inode *inode, struct file *filp);
     424             : int drm_open_helper(struct file *filp, struct drm_minor *minor);
     425             : ssize_t drm_read(struct file *filp, char __user *buffer,
     426             :                  size_t count, loff_t *offset);
     427             : int drm_release(struct inode *inode, struct file *filp);
     428             : int drm_release_noglobal(struct inode *inode, struct file *filp);
     429             : __poll_t drm_poll(struct file *filp, struct poll_table_struct *wait);
     430             : int drm_event_reserve_init_locked(struct drm_device *dev,
     431             :                                   struct drm_file *file_priv,
     432             :                                   struct drm_pending_event *p,
     433             :                                   struct drm_event *e);
     434             : int drm_event_reserve_init(struct drm_device *dev,
     435             :                            struct drm_file *file_priv,
     436             :                            struct drm_pending_event *p,
     437             :                            struct drm_event *e);
     438             : void drm_event_cancel_free(struct drm_device *dev,
     439             :                            struct drm_pending_event *p);
     440             : void drm_send_event_locked(struct drm_device *dev, struct drm_pending_event *e);
     441             : void drm_send_event(struct drm_device *dev, struct drm_pending_event *e);
     442             : void drm_send_event_timestamp_locked(struct drm_device *dev,
     443             :                                      struct drm_pending_event *e,
     444             :                                      ktime_t timestamp);
     445             : 
     446             : /**
     447             :  * struct drm_memory_stats - GEM object stats associated
     448             :  * @shared: Total size of GEM objects shared between processes
     449             :  * @private: Total size of GEM objects
     450             :  * @resident: Total size of GEM objects backing pages
     451             :  * @purgeable: Total size of GEM objects that can be purged (resident and not active)
     452             :  * @active: Total size of GEM objects active on one or more engines
     453             :  *
     454             :  * Used by drm_print_memory_stats()
     455             :  */
     456             : struct drm_memory_stats {
     457             :         u64 shared;
     458             :         u64 private;
     459             :         u64 resident;
     460             :         u64 purgeable;
     461             :         u64 active;
     462             : };
     463             : 
     464             : enum drm_gem_object_status;
     465             : 
     466             : void drm_print_memory_stats(struct drm_printer *p,
     467             :                             const struct drm_memory_stats *stats,
     468             :                             enum drm_gem_object_status supported_status,
     469             :                             const char *region);
     470             : 
     471             : void drm_show_memory_stats(struct drm_printer *p, struct drm_file *file);
     472             : void drm_show_fdinfo(struct seq_file *m, struct file *f);
     473             : 
     474             : struct file *mock_drm_getfile(struct drm_minor *minor, unsigned int flags);
     475             : 
     476             : #endif /* _DRM_FILE_H_ */

Generated by: LCOV version 1.14