cachepc-linux

Fork of AMDESE/linux with modifications for CachePC side-channel attack
git clone https://git.sinitax.com/sinitax/cachepc-linux
Log | Files | Refs | README | LICENSE | sfeed.txt

drm_file.h (12414B)


      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
     41struct dma_fence;
     42struct drm_file;
     43struct drm_device;
     44struct device;
     45struct file;
     46
     47/*
     48 * FIXME: Not sure we want to have drm_minor here in the end, but to avoid
     49 * header include loops we need it here for now.
     50 */
     51
     52/* Note that the order of this enum is ABI (it determines
     53 * /dev/dri/renderD* numbers).
     54 */
     55enum drm_minor_type {
     56	DRM_MINOR_PRIMARY,
     57	DRM_MINOR_CONTROL,
     58	DRM_MINOR_RENDER,
     59};
     60
     61/**
     62 * struct drm_minor - DRM device minor structure
     63 *
     64 * This structure represents a DRM minor number for device nodes in /dev.
     65 * Entirely opaque to drivers and should never be inspected directly by drivers.
     66 * Drivers instead should only interact with &struct drm_file and of course
     67 * &struct drm_device, which is also where driver-private data and resources can
     68 * be attached to.
     69 */
     70struct drm_minor {
     71	/* private: */
     72	int index;			/* Minor device number */
     73	int type;                       /* Control or render */
     74	struct device *kdev;		/* Linux device */
     75	struct drm_device *dev;
     76
     77	struct dentry *debugfs_root;
     78
     79	struct list_head debugfs_list;
     80	struct mutex debugfs_lock; /* Protects debugfs_list. */
     81};
     82
     83/**
     84 * struct drm_pending_event - Event queued up for userspace to read
     85 *
     86 * This represents a DRM event. Drivers can use this as a generic completion
     87 * mechanism, which supports kernel-internal &struct completion, &struct dma_fence
     88 * and also the DRM-specific &struct drm_event delivery mechanism.
     89 */
     90struct drm_pending_event {
     91	/**
     92	 * @completion:
     93	 *
     94	 * Optional pointer to a kernel internal completion signalled when
     95	 * drm_send_event() is called, useful to internally synchronize with
     96	 * nonblocking operations.
     97	 */
     98	struct completion *completion;
     99
    100	/**
    101	 * @completion_release:
    102	 *
    103	 * Optional callback currently only used by the atomic modeset helpers
    104	 * to clean up the reference count for the structure @completion is
    105	 * stored in.
    106	 */
    107	void (*completion_release)(struct completion *completion);
    108
    109	/**
    110	 * @event:
    111	 *
    112	 * Pointer to the actual event that should be sent to userspace to be
    113	 * read using drm_read(). Can be optional, since nowadays events are
    114	 * also used to signal kernel internal threads with @completion or DMA
    115	 * transactions using @fence.
    116	 */
    117	struct drm_event *event;
    118
    119	/**
    120	 * @fence:
    121	 *
    122	 * Optional DMA fence to unblock other hardware transactions which
    123	 * depend upon the nonblocking DRM operation this event represents.
    124	 */
    125	struct dma_fence *fence;
    126
    127	/**
    128	 * @file_priv:
    129	 *
    130	 * &struct drm_file where @event should be delivered to. Only set when
    131	 * @event is set.
    132	 */
    133	struct drm_file *file_priv;
    134
    135	/**
    136	 * @link:
    137	 *
    138	 * Double-linked list to keep track of this event. Can be used by the
    139	 * driver up to the point when it calls drm_send_event(), after that
    140	 * this list entry is owned by the core for its own book-keeping.
    141	 */
    142	struct list_head link;
    143
    144	/**
    145	 * @pending_link:
    146	 *
    147	 * Entry on &drm_file.pending_event_list, to keep track of all pending
    148	 * events for @file_priv, to allow correct unwinding of them when
    149	 * userspace closes the file before the event is delivered.
    150	 */
    151	struct list_head pending_link;
    152};
    153
    154/**
    155 * struct drm_file - DRM file private data
    156 *
    157 * This structure tracks DRM state per open file descriptor.
    158 */
    159struct drm_file {
    160	/**
    161	 * @authenticated:
    162	 *
    163	 * Whether the client is allowed to submit rendering, which for legacy
    164	 * nodes means it must be authenticated.
    165	 *
    166	 * See also the :ref:`section on primary nodes and authentication
    167	 * <drm_primary_node>`.
    168	 */
    169	bool authenticated;
    170
    171	/**
    172	 * @stereo_allowed:
    173	 *
    174	 * True when the client has asked us to expose stereo 3D mode flags.
    175	 */
    176	bool stereo_allowed;
    177
    178	/**
    179	 * @universal_planes:
    180	 *
    181	 * True if client understands CRTC primary planes and cursor planes
    182	 * in the plane list. Automatically set when @atomic is set.
    183	 */
    184	bool universal_planes;
    185
    186	/** @atomic: True if client understands atomic properties. */
    187	bool atomic;
    188
    189	/**
    190	 * @aspect_ratio_allowed:
    191	 *
    192	 * True, if client can handle picture aspect ratios, and has requested
    193	 * to pass this information along with the mode.
    194	 */
    195	bool aspect_ratio_allowed;
    196
    197	/**
    198	 * @writeback_connectors:
    199	 *
    200	 * True if client understands writeback connectors
    201	 */
    202	bool writeback_connectors;
    203
    204	/**
    205	 * @was_master:
    206	 *
    207	 * This client has or had, master capability. Protected by struct
    208	 * &drm_device.master_mutex.
    209	 *
    210	 * This is used to ensure that CAP_SYS_ADMIN is not enforced, if the
    211	 * client is or was master in the past.
    212	 */
    213	bool was_master;
    214
    215	/**
    216	 * @is_master:
    217	 *
    218	 * This client is the creator of @master. Protected by struct
    219	 * &drm_device.master_mutex.
    220	 *
    221	 * See also the :ref:`section on primary nodes and authentication
    222	 * <drm_primary_node>`.
    223	 */
    224	bool is_master;
    225
    226	/**
    227	 * @master:
    228	 *
    229	 * Master this node is currently associated with. Protected by struct
    230	 * &drm_device.master_mutex, and serialized by @master_lookup_lock.
    231	 *
    232	 * Only relevant if drm_is_primary_client() returns true. Note that
    233	 * this only matches &drm_device.master if the master is the currently
    234	 * active one.
    235	 *
    236	 * To update @master, both &drm_device.master_mutex and
    237	 * @master_lookup_lock need to be held, therefore holding either of
    238	 * them is safe and enough for the read side.
    239	 *
    240	 * When dereferencing this pointer, either hold struct
    241	 * &drm_device.master_mutex for the duration of the pointer's use, or
    242	 * use drm_file_get_master() if struct &drm_device.master_mutex is not
    243	 * currently held and there is no other need to hold it. This prevents
    244	 * @master from being freed during use.
    245	 *
    246	 * See also @authentication and @is_master and the :ref:`section on
    247	 * primary nodes and authentication <drm_primary_node>`.
    248	 */
    249	struct drm_master *master;
    250
    251	/** @master_lookup_lock: Serializes @master. */
    252	spinlock_t master_lookup_lock;
    253
    254	/** @pid: Process that opened this file. */
    255	struct pid *pid;
    256
    257	/** @magic: Authentication magic, see @authenticated. */
    258	drm_magic_t magic;
    259
    260	/**
    261	 * @lhead:
    262	 *
    263	 * List of all open files of a DRM device, linked into
    264	 * &drm_device.filelist. Protected by &drm_device.filelist_mutex.
    265	 */
    266	struct list_head lhead;
    267
    268	/** @minor: &struct drm_minor for this file. */
    269	struct drm_minor *minor;
    270
    271	/**
    272	 * @object_idr:
    273	 *
    274	 * Mapping of mm object handles to object pointers. Used by the GEM
    275	 * subsystem. Protected by @table_lock.
    276	 */
    277	struct idr object_idr;
    278
    279	/** @table_lock: Protects @object_idr. */
    280	spinlock_t table_lock;
    281
    282	/** @syncobj_idr: Mapping of sync object handles to object pointers. */
    283	struct idr syncobj_idr;
    284	/** @syncobj_table_lock: Protects @syncobj_idr. */
    285	spinlock_t syncobj_table_lock;
    286
    287	/** @filp: Pointer to the core file structure. */
    288	struct file *filp;
    289
    290	/**
    291	 * @driver_priv:
    292	 *
    293	 * Optional pointer for driver private data. Can be allocated in
    294	 * &drm_driver.open and should be freed in &drm_driver.postclose.
    295	 */
    296	void *driver_priv;
    297
    298	/**
    299	 * @fbs:
    300	 *
    301	 * List of &struct drm_framebuffer associated with this file, using the
    302	 * &drm_framebuffer.filp_head entry.
    303	 *
    304	 * Protected by @fbs_lock. Note that the @fbs list holds a reference on
    305	 * the framebuffer object to prevent it from untimely disappearing.
    306	 */
    307	struct list_head fbs;
    308
    309	/** @fbs_lock: Protects @fbs. */
    310	struct mutex fbs_lock;
    311
    312	/**
    313	 * @blobs:
    314	 *
    315	 * User-created blob properties; this retains a reference on the
    316	 * property.
    317	 *
    318	 * Protected by @drm_mode_config.blob_lock;
    319	 */
    320	struct list_head blobs;
    321
    322	/** @event_wait: Waitqueue for new events added to @event_list. */
    323	wait_queue_head_t event_wait;
    324
    325	/**
    326	 * @pending_event_list:
    327	 *
    328	 * List of pending &struct drm_pending_event, used to clean up pending
    329	 * events in case this file gets closed before the event is signalled.
    330	 * Uses the &drm_pending_event.pending_link entry.
    331	 *
    332	 * Protect by &drm_device.event_lock.
    333	 */
    334	struct list_head pending_event_list;
    335
    336	/**
    337	 * @event_list:
    338	 *
    339	 * List of &struct drm_pending_event, ready for delivery to userspace
    340	 * through drm_read(). Uses the &drm_pending_event.link entry.
    341	 *
    342	 * Protect by &drm_device.event_lock.
    343	 */
    344	struct list_head event_list;
    345
    346	/**
    347	 * @event_space:
    348	 *
    349	 * Available event space to prevent userspace from
    350	 * exhausting kernel memory. Currently limited to the fairly arbitrary
    351	 * value of 4KB.
    352	 */
    353	int event_space;
    354
    355	/** @event_read_lock: Serializes drm_read(). */
    356	struct mutex event_read_lock;
    357
    358	/**
    359	 * @prime:
    360	 *
    361	 * Per-file buffer caches used by the PRIME buffer sharing code.
    362	 */
    363	struct drm_prime_file_private prime;
    364
    365	/* private: */
    366#if IS_ENABLED(CONFIG_DRM_LEGACY)
    367	unsigned long lock_count; /* DRI1 legacy lock count */
    368#endif
    369};
    370
    371/**
    372 * drm_is_primary_client - is this an open file of the primary node
    373 * @file_priv: DRM file
    374 *
    375 * Returns true if this is an open file of the primary node, i.e.
    376 * &drm_file.minor of @file_priv is a primary minor.
    377 *
    378 * See also the :ref:`section on primary nodes and authentication
    379 * <drm_primary_node>`.
    380 */
    381static inline bool drm_is_primary_client(const struct drm_file *file_priv)
    382{
    383	return file_priv->minor->type == DRM_MINOR_PRIMARY;
    384}
    385
    386/**
    387 * drm_is_render_client - is this an open file of the render node
    388 * @file_priv: DRM file
    389 *
    390 * Returns true if this is an open file of the render node, i.e.
    391 * &drm_file.minor of @file_priv is a render minor.
    392 *
    393 * See also the :ref:`section on render nodes <drm_render_node>`.
    394 */
    395static inline bool drm_is_render_client(const struct drm_file *file_priv)
    396{
    397	return file_priv->minor->type == DRM_MINOR_RENDER;
    398}
    399
    400int drm_open(struct inode *inode, struct file *filp);
    401ssize_t drm_read(struct file *filp, char __user *buffer,
    402		 size_t count, loff_t *offset);
    403int drm_release(struct inode *inode, struct file *filp);
    404int drm_release_noglobal(struct inode *inode, struct file *filp);
    405__poll_t drm_poll(struct file *filp, struct poll_table_struct *wait);
    406int drm_event_reserve_init_locked(struct drm_device *dev,
    407				  struct drm_file *file_priv,
    408				  struct drm_pending_event *p,
    409				  struct drm_event *e);
    410int drm_event_reserve_init(struct drm_device *dev,
    411			   struct drm_file *file_priv,
    412			   struct drm_pending_event *p,
    413			   struct drm_event *e);
    414void drm_event_cancel_free(struct drm_device *dev,
    415			   struct drm_pending_event *p);
    416void drm_send_event_locked(struct drm_device *dev, struct drm_pending_event *e);
    417void drm_send_event(struct drm_device *dev, struct drm_pending_event *e);
    418void drm_send_event_timestamp_locked(struct drm_device *dev,
    419				     struct drm_pending_event *e,
    420				     ktime_t timestamp);
    421
    422struct file *mock_drm_getfile(struct drm_minor *minor, unsigned int flags);
    423
    424#ifdef CONFIG_MMU
    425struct drm_vma_offset_manager;
    426unsigned long drm_get_unmapped_area(struct file *file,
    427				    unsigned long uaddr, unsigned long len,
    428				    unsigned long pgoff, unsigned long flags,
    429				    struct drm_vma_offset_manager *mgr);
    430#endif /* CONFIG_MMU */
    431
    432
    433#endif /* _DRM_FILE_H_ */