18c2ecf20Sopenharmony_ci/*
28c2ecf20Sopenharmony_ci * Copyright 1999 Precision Insight, Inc., Cedar Park, Texas.
38c2ecf20Sopenharmony_ci * Copyright 2000 VA Linux Systems, Inc., Sunnyvale, California.
48c2ecf20Sopenharmony_ci * Copyright (c) 2009-2010, Code Aurora Forum.
58c2ecf20Sopenharmony_ci * All rights reserved.
68c2ecf20Sopenharmony_ci *
78c2ecf20Sopenharmony_ci * Author: Rickard E. (Rik) Faith <faith@valinux.com>
88c2ecf20Sopenharmony_ci * Author: Gareth Hughes <gareth@valinux.com>
98c2ecf20Sopenharmony_ci *
108c2ecf20Sopenharmony_ci * Permission is hereby granted, free of charge, to any person obtaining a
118c2ecf20Sopenharmony_ci * copy of this software and associated documentation files (the "Software"),
128c2ecf20Sopenharmony_ci * to deal in the Software without restriction, including without limitation
138c2ecf20Sopenharmony_ci * the rights to use, copy, modify, merge, publish, distribute, sublicense,
148c2ecf20Sopenharmony_ci * and/or sell copies of the Software, and to permit persons to whom the
158c2ecf20Sopenharmony_ci * Software is furnished to do so, subject to the following conditions:
168c2ecf20Sopenharmony_ci *
178c2ecf20Sopenharmony_ci * The above copyright notice and this permission notice (including the next
188c2ecf20Sopenharmony_ci * paragraph) shall be included in all copies or substantial portions of the
198c2ecf20Sopenharmony_ci * Software.
208c2ecf20Sopenharmony_ci *
218c2ecf20Sopenharmony_ci * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
228c2ecf20Sopenharmony_ci * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
238c2ecf20Sopenharmony_ci * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
248c2ecf20Sopenharmony_ci * VA LINUX SYSTEMS AND/OR ITS SUPPLIERS BE LIABLE FOR ANY CLAIM, DAMAGES OR
258c2ecf20Sopenharmony_ci * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
268c2ecf20Sopenharmony_ci * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
278c2ecf20Sopenharmony_ci * OTHER DEALINGS IN THE SOFTWARE.
288c2ecf20Sopenharmony_ci */
298c2ecf20Sopenharmony_ci
308c2ecf20Sopenharmony_ci#ifndef _DRM_FILE_H_
318c2ecf20Sopenharmony_ci#define _DRM_FILE_H_
328c2ecf20Sopenharmony_ci
338c2ecf20Sopenharmony_ci#include <linux/types.h>
348c2ecf20Sopenharmony_ci#include <linux/completion.h>
358c2ecf20Sopenharmony_ci#include <linux/idr.h>
368c2ecf20Sopenharmony_ci
378c2ecf20Sopenharmony_ci#include <uapi/drm/drm.h>
388c2ecf20Sopenharmony_ci
398c2ecf20Sopenharmony_ci#include <drm/drm_prime.h>
408c2ecf20Sopenharmony_ci
418c2ecf20Sopenharmony_cistruct dma_fence;
428c2ecf20Sopenharmony_cistruct drm_file;
438c2ecf20Sopenharmony_cistruct drm_device;
448c2ecf20Sopenharmony_cistruct device;
458c2ecf20Sopenharmony_cistruct file;
468c2ecf20Sopenharmony_ci
478c2ecf20Sopenharmony_ci/*
488c2ecf20Sopenharmony_ci * FIXME: Not sure we want to have drm_minor here in the end, but to avoid
498c2ecf20Sopenharmony_ci * header include loops we need it here for now.
508c2ecf20Sopenharmony_ci */
518c2ecf20Sopenharmony_ci
528c2ecf20Sopenharmony_ci/* Note that the order of this enum is ABI (it determines
538c2ecf20Sopenharmony_ci * /dev/dri/renderD* numbers).
548c2ecf20Sopenharmony_ci */
558c2ecf20Sopenharmony_cienum drm_minor_type {
568c2ecf20Sopenharmony_ci	DRM_MINOR_PRIMARY,
578c2ecf20Sopenharmony_ci	DRM_MINOR_CONTROL,
588c2ecf20Sopenharmony_ci	DRM_MINOR_RENDER,
598c2ecf20Sopenharmony_ci};
608c2ecf20Sopenharmony_ci
618c2ecf20Sopenharmony_ci/**
628c2ecf20Sopenharmony_ci * struct drm_minor - DRM device minor structure
638c2ecf20Sopenharmony_ci *
648c2ecf20Sopenharmony_ci * This structure represents a DRM minor number for device nodes in /dev.
658c2ecf20Sopenharmony_ci * Entirely opaque to drivers and should never be inspected directly by drivers.
668c2ecf20Sopenharmony_ci * Drivers instead should only interact with &struct drm_file and of course
678c2ecf20Sopenharmony_ci * &struct drm_device, which is also where driver-private data and resources can
688c2ecf20Sopenharmony_ci * be attached to.
698c2ecf20Sopenharmony_ci */
708c2ecf20Sopenharmony_cistruct drm_minor {
718c2ecf20Sopenharmony_ci	/* private: */
728c2ecf20Sopenharmony_ci	int index;			/* Minor device number */
738c2ecf20Sopenharmony_ci	int type;                       /* Control or render */
748c2ecf20Sopenharmony_ci	struct device *kdev;		/* Linux device */
758c2ecf20Sopenharmony_ci	struct drm_device *dev;
768c2ecf20Sopenharmony_ci
778c2ecf20Sopenharmony_ci	struct dentry *debugfs_root;
788c2ecf20Sopenharmony_ci
798c2ecf20Sopenharmony_ci	struct list_head debugfs_list;
808c2ecf20Sopenharmony_ci	struct mutex debugfs_lock; /* Protects debugfs_list. */
818c2ecf20Sopenharmony_ci};
828c2ecf20Sopenharmony_ci
838c2ecf20Sopenharmony_ci/**
848c2ecf20Sopenharmony_ci * struct drm_pending_event - Event queued up for userspace to read
858c2ecf20Sopenharmony_ci *
868c2ecf20Sopenharmony_ci * This represents a DRM event. Drivers can use this as a generic completion
878c2ecf20Sopenharmony_ci * mechanism, which supports kernel-internal &struct completion, &struct dma_fence
888c2ecf20Sopenharmony_ci * and also the DRM-specific &struct drm_event delivery mechanism.
898c2ecf20Sopenharmony_ci */
908c2ecf20Sopenharmony_cistruct drm_pending_event {
918c2ecf20Sopenharmony_ci	/**
928c2ecf20Sopenharmony_ci	 * @completion:
938c2ecf20Sopenharmony_ci	 *
948c2ecf20Sopenharmony_ci	 * Optional pointer to a kernel internal completion signalled when
958c2ecf20Sopenharmony_ci	 * drm_send_event() is called, useful to internally synchronize with
968c2ecf20Sopenharmony_ci	 * nonblocking operations.
978c2ecf20Sopenharmony_ci	 */
988c2ecf20Sopenharmony_ci	struct completion *completion;
998c2ecf20Sopenharmony_ci
1008c2ecf20Sopenharmony_ci	/**
1018c2ecf20Sopenharmony_ci	 * @completion_release:
1028c2ecf20Sopenharmony_ci	 *
1038c2ecf20Sopenharmony_ci	 * Optional callback currently only used by the atomic modeset helpers
1048c2ecf20Sopenharmony_ci	 * to clean up the reference count for the structure @completion is
1058c2ecf20Sopenharmony_ci	 * stored in.
1068c2ecf20Sopenharmony_ci	 */
1078c2ecf20Sopenharmony_ci	void (*completion_release)(struct completion *completion);
1088c2ecf20Sopenharmony_ci
1098c2ecf20Sopenharmony_ci	/**
1108c2ecf20Sopenharmony_ci	 * @event:
1118c2ecf20Sopenharmony_ci	 *
1128c2ecf20Sopenharmony_ci	 * Pointer to the actual event that should be sent to userspace to be
1138c2ecf20Sopenharmony_ci	 * read using drm_read(). Can be optional, since nowadays events are
1148c2ecf20Sopenharmony_ci	 * also used to signal kernel internal threads with @completion or DMA
1158c2ecf20Sopenharmony_ci	 * transactions using @fence.
1168c2ecf20Sopenharmony_ci	 */
1178c2ecf20Sopenharmony_ci	struct drm_event *event;
1188c2ecf20Sopenharmony_ci
1198c2ecf20Sopenharmony_ci	/**
1208c2ecf20Sopenharmony_ci	 * @fence:
1218c2ecf20Sopenharmony_ci	 *
1228c2ecf20Sopenharmony_ci	 * Optional DMA fence to unblock other hardware transactions which
1238c2ecf20Sopenharmony_ci	 * depend upon the nonblocking DRM operation this event represents.
1248c2ecf20Sopenharmony_ci	 */
1258c2ecf20Sopenharmony_ci	struct dma_fence *fence;
1268c2ecf20Sopenharmony_ci
1278c2ecf20Sopenharmony_ci	/**
1288c2ecf20Sopenharmony_ci	 * @file_priv:
1298c2ecf20Sopenharmony_ci	 *
1308c2ecf20Sopenharmony_ci	 * &struct drm_file where @event should be delivered to. Only set when
1318c2ecf20Sopenharmony_ci	 * @event is set.
1328c2ecf20Sopenharmony_ci	 */
1338c2ecf20Sopenharmony_ci	struct drm_file *file_priv;
1348c2ecf20Sopenharmony_ci
1358c2ecf20Sopenharmony_ci	/**
1368c2ecf20Sopenharmony_ci	 * @link:
1378c2ecf20Sopenharmony_ci	 *
1388c2ecf20Sopenharmony_ci	 * Double-linked list to keep track of this event. Can be used by the
1398c2ecf20Sopenharmony_ci	 * driver up to the point when it calls drm_send_event(), after that
1408c2ecf20Sopenharmony_ci	 * this list entry is owned by the core for its own book-keeping.
1418c2ecf20Sopenharmony_ci	 */
1428c2ecf20Sopenharmony_ci	struct list_head link;
1438c2ecf20Sopenharmony_ci
1448c2ecf20Sopenharmony_ci	/**
1458c2ecf20Sopenharmony_ci	 * @pending_link:
1468c2ecf20Sopenharmony_ci	 *
1478c2ecf20Sopenharmony_ci	 * Entry on &drm_file.pending_event_list, to keep track of all pending
1488c2ecf20Sopenharmony_ci	 * events for @file_priv, to allow correct unwinding of them when
1498c2ecf20Sopenharmony_ci	 * userspace closes the file before the event is delivered.
1508c2ecf20Sopenharmony_ci	 */
1518c2ecf20Sopenharmony_ci	struct list_head pending_link;
1528c2ecf20Sopenharmony_ci};
1538c2ecf20Sopenharmony_ci
1548c2ecf20Sopenharmony_ci/**
1558c2ecf20Sopenharmony_ci * struct drm_file - DRM file private data
1568c2ecf20Sopenharmony_ci *
1578c2ecf20Sopenharmony_ci * This structure tracks DRM state per open file descriptor.
1588c2ecf20Sopenharmony_ci */
1598c2ecf20Sopenharmony_cistruct drm_file {
1608c2ecf20Sopenharmony_ci	/**
1618c2ecf20Sopenharmony_ci	 * @authenticated:
1628c2ecf20Sopenharmony_ci	 *
1638c2ecf20Sopenharmony_ci	 * Whether the client is allowed to submit rendering, which for legacy
1648c2ecf20Sopenharmony_ci	 * nodes means it must be authenticated.
1658c2ecf20Sopenharmony_ci	 *
1668c2ecf20Sopenharmony_ci	 * See also the :ref:`section on primary nodes and authentication
1678c2ecf20Sopenharmony_ci	 * <drm_primary_node>`.
1688c2ecf20Sopenharmony_ci	 */
1698c2ecf20Sopenharmony_ci	bool authenticated;
1708c2ecf20Sopenharmony_ci
1718c2ecf20Sopenharmony_ci	/**
1728c2ecf20Sopenharmony_ci	 * @stereo_allowed:
1738c2ecf20Sopenharmony_ci	 *
1748c2ecf20Sopenharmony_ci	 * True when the client has asked us to expose stereo 3D mode flags.
1758c2ecf20Sopenharmony_ci	 */
1768c2ecf20Sopenharmony_ci	bool stereo_allowed;
1778c2ecf20Sopenharmony_ci
1788c2ecf20Sopenharmony_ci	/**
1798c2ecf20Sopenharmony_ci	 * @universal_planes:
1808c2ecf20Sopenharmony_ci	 *
1818c2ecf20Sopenharmony_ci	 * True if client understands CRTC primary planes and cursor planes
1828c2ecf20Sopenharmony_ci	 * in the plane list. Automatically set when @atomic is set.
1838c2ecf20Sopenharmony_ci	 */
1848c2ecf20Sopenharmony_ci	bool universal_planes;
1858c2ecf20Sopenharmony_ci
1868c2ecf20Sopenharmony_ci	/** @atomic: True if client understands atomic properties. */
1878c2ecf20Sopenharmony_ci	bool atomic;
1888c2ecf20Sopenharmony_ci
1898c2ecf20Sopenharmony_ci	/**
1908c2ecf20Sopenharmony_ci	 * @aspect_ratio_allowed:
1918c2ecf20Sopenharmony_ci	 *
1928c2ecf20Sopenharmony_ci	 * True, if client can handle picture aspect ratios, and has requested
1938c2ecf20Sopenharmony_ci	 * to pass this information along with the mode.
1948c2ecf20Sopenharmony_ci	 */
1958c2ecf20Sopenharmony_ci	bool aspect_ratio_allowed;
1968c2ecf20Sopenharmony_ci
1978c2ecf20Sopenharmony_ci	/**
1988c2ecf20Sopenharmony_ci	 * @writeback_connectors:
1998c2ecf20Sopenharmony_ci	 *
2008c2ecf20Sopenharmony_ci	 * True if client understands writeback connectors
2018c2ecf20Sopenharmony_ci	 */
2028c2ecf20Sopenharmony_ci	bool writeback_connectors;
2038c2ecf20Sopenharmony_ci
2048c2ecf20Sopenharmony_ci	/**
2058c2ecf20Sopenharmony_ci	 * @was_master:
2068c2ecf20Sopenharmony_ci	 *
2078c2ecf20Sopenharmony_ci	 * This client has or had, master capability. Protected by struct
2088c2ecf20Sopenharmony_ci	 * &drm_device.master_mutex.
2098c2ecf20Sopenharmony_ci	 *
2108c2ecf20Sopenharmony_ci	 * This is used to ensure that CAP_SYS_ADMIN is not enforced, if the
2118c2ecf20Sopenharmony_ci	 * client is or was master in the past.
2128c2ecf20Sopenharmony_ci	 */
2138c2ecf20Sopenharmony_ci	bool was_master;
2148c2ecf20Sopenharmony_ci
2158c2ecf20Sopenharmony_ci	/**
2168c2ecf20Sopenharmony_ci	 * @is_master:
2178c2ecf20Sopenharmony_ci	 *
2188c2ecf20Sopenharmony_ci	 * This client is the creator of @master. Protected by struct
2198c2ecf20Sopenharmony_ci	 * &drm_device.master_mutex.
2208c2ecf20Sopenharmony_ci	 *
2218c2ecf20Sopenharmony_ci	 * See also the :ref:`section on primary nodes and authentication
2228c2ecf20Sopenharmony_ci	 * <drm_primary_node>`.
2238c2ecf20Sopenharmony_ci	 */
2248c2ecf20Sopenharmony_ci	bool is_master;
2258c2ecf20Sopenharmony_ci
2268c2ecf20Sopenharmony_ci	/**
2278c2ecf20Sopenharmony_ci	 * @master:
2288c2ecf20Sopenharmony_ci	 *
2298c2ecf20Sopenharmony_ci	 * Master this node is currently associated with. Protected by struct
2308c2ecf20Sopenharmony_ci	 * &drm_device.master_mutex, and serialized by @master_lookup_lock.
2318c2ecf20Sopenharmony_ci	 *
2328c2ecf20Sopenharmony_ci	 * Only relevant if drm_is_primary_client() returns true. Note that
2338c2ecf20Sopenharmony_ci	 * this only matches &drm_device.master if the master is the currently
2348c2ecf20Sopenharmony_ci	 * active one.
2358c2ecf20Sopenharmony_ci	 *
2368c2ecf20Sopenharmony_ci	 * When dereferencing this pointer, either hold struct
2378c2ecf20Sopenharmony_ci	 * &drm_device.master_mutex for the duration of the pointer's use, or
2388c2ecf20Sopenharmony_ci	 * use drm_file_get_master() if struct &drm_device.master_mutex is not
2398c2ecf20Sopenharmony_ci	 * currently held and there is no other need to hold it. This prevents
2408c2ecf20Sopenharmony_ci	 * @master from being freed during use.
2418c2ecf20Sopenharmony_ci	 *
2428c2ecf20Sopenharmony_ci	 * See also @authentication and @is_master and the :ref:`section on
2438c2ecf20Sopenharmony_ci	 * primary nodes and authentication <drm_primary_node>`.
2448c2ecf20Sopenharmony_ci	 */
2458c2ecf20Sopenharmony_ci	struct drm_master *master;
2468c2ecf20Sopenharmony_ci
2478c2ecf20Sopenharmony_ci	/** @master_lock: Serializes @master. */
2488c2ecf20Sopenharmony_ci	spinlock_t master_lookup_lock;
2498c2ecf20Sopenharmony_ci
2508c2ecf20Sopenharmony_ci	/** @pid: Process that opened this file. */
2518c2ecf20Sopenharmony_ci	struct pid *pid;
2528c2ecf20Sopenharmony_ci
2538c2ecf20Sopenharmony_ci	/** @magic: Authentication magic, see @authenticated. */
2548c2ecf20Sopenharmony_ci	drm_magic_t magic;
2558c2ecf20Sopenharmony_ci
2568c2ecf20Sopenharmony_ci	/**
2578c2ecf20Sopenharmony_ci	 * @lhead:
2588c2ecf20Sopenharmony_ci	 *
2598c2ecf20Sopenharmony_ci	 * List of all open files of a DRM device, linked into
2608c2ecf20Sopenharmony_ci	 * &drm_device.filelist. Protected by &drm_device.filelist_mutex.
2618c2ecf20Sopenharmony_ci	 */
2628c2ecf20Sopenharmony_ci	struct list_head lhead;
2638c2ecf20Sopenharmony_ci
2648c2ecf20Sopenharmony_ci	/** @minor: &struct drm_minor for this file. */
2658c2ecf20Sopenharmony_ci	struct drm_minor *minor;
2668c2ecf20Sopenharmony_ci
2678c2ecf20Sopenharmony_ci	/**
2688c2ecf20Sopenharmony_ci	 * @object_idr:
2698c2ecf20Sopenharmony_ci	 *
2708c2ecf20Sopenharmony_ci	 * Mapping of mm object handles to object pointers. Used by the GEM
2718c2ecf20Sopenharmony_ci	 * subsystem. Protected by @table_lock.
2728c2ecf20Sopenharmony_ci	 */
2738c2ecf20Sopenharmony_ci	struct idr object_idr;
2748c2ecf20Sopenharmony_ci
2758c2ecf20Sopenharmony_ci	/** @table_lock: Protects @object_idr. */
2768c2ecf20Sopenharmony_ci	spinlock_t table_lock;
2778c2ecf20Sopenharmony_ci
2788c2ecf20Sopenharmony_ci	/** @syncobj_idr: Mapping of sync object handles to object pointers. */
2798c2ecf20Sopenharmony_ci	struct idr syncobj_idr;
2808c2ecf20Sopenharmony_ci	/** @syncobj_table_lock: Protects @syncobj_idr. */
2818c2ecf20Sopenharmony_ci	spinlock_t syncobj_table_lock;
2828c2ecf20Sopenharmony_ci
2838c2ecf20Sopenharmony_ci	/** @filp: Pointer to the core file structure. */
2848c2ecf20Sopenharmony_ci	struct file *filp;
2858c2ecf20Sopenharmony_ci
2868c2ecf20Sopenharmony_ci	/**
2878c2ecf20Sopenharmony_ci	 * @driver_priv:
2888c2ecf20Sopenharmony_ci	 *
2898c2ecf20Sopenharmony_ci	 * Optional pointer for driver private data. Can be allocated in
2908c2ecf20Sopenharmony_ci	 * &drm_driver.open and should be freed in &drm_driver.postclose.
2918c2ecf20Sopenharmony_ci	 */
2928c2ecf20Sopenharmony_ci	void *driver_priv;
2938c2ecf20Sopenharmony_ci
2948c2ecf20Sopenharmony_ci	/**
2958c2ecf20Sopenharmony_ci	 * @fbs:
2968c2ecf20Sopenharmony_ci	 *
2978c2ecf20Sopenharmony_ci	 * List of &struct drm_framebuffer associated with this file, using the
2988c2ecf20Sopenharmony_ci	 * &drm_framebuffer.filp_head entry.
2998c2ecf20Sopenharmony_ci	 *
3008c2ecf20Sopenharmony_ci	 * Protected by @fbs_lock. Note that the @fbs list holds a reference on
3018c2ecf20Sopenharmony_ci	 * the framebuffer object to prevent it from untimely disappearing.
3028c2ecf20Sopenharmony_ci	 */
3038c2ecf20Sopenharmony_ci	struct list_head fbs;
3048c2ecf20Sopenharmony_ci
3058c2ecf20Sopenharmony_ci	/** @fbs_lock: Protects @fbs. */
3068c2ecf20Sopenharmony_ci	struct mutex fbs_lock;
3078c2ecf20Sopenharmony_ci
3088c2ecf20Sopenharmony_ci	/**
3098c2ecf20Sopenharmony_ci	 * @blobs:
3108c2ecf20Sopenharmony_ci	 *
3118c2ecf20Sopenharmony_ci	 * User-created blob properties; this retains a reference on the
3128c2ecf20Sopenharmony_ci	 * property.
3138c2ecf20Sopenharmony_ci	 *
3148c2ecf20Sopenharmony_ci	 * Protected by @drm_mode_config.blob_lock;
3158c2ecf20Sopenharmony_ci	 */
3168c2ecf20Sopenharmony_ci	struct list_head blobs;
3178c2ecf20Sopenharmony_ci
3188c2ecf20Sopenharmony_ci	/** @event_wait: Waitqueue for new events added to @event_list. */
3198c2ecf20Sopenharmony_ci	wait_queue_head_t event_wait;
3208c2ecf20Sopenharmony_ci
3218c2ecf20Sopenharmony_ci	/**
3228c2ecf20Sopenharmony_ci	 * @pending_event_list:
3238c2ecf20Sopenharmony_ci	 *
3248c2ecf20Sopenharmony_ci	 * List of pending &struct drm_pending_event, used to clean up pending
3258c2ecf20Sopenharmony_ci	 * events in case this file gets closed before the event is signalled.
3268c2ecf20Sopenharmony_ci	 * Uses the &drm_pending_event.pending_link entry.
3278c2ecf20Sopenharmony_ci	 *
3288c2ecf20Sopenharmony_ci	 * Protect by &drm_device.event_lock.
3298c2ecf20Sopenharmony_ci	 */
3308c2ecf20Sopenharmony_ci	struct list_head pending_event_list;
3318c2ecf20Sopenharmony_ci
3328c2ecf20Sopenharmony_ci	/**
3338c2ecf20Sopenharmony_ci	 * @event_list:
3348c2ecf20Sopenharmony_ci	 *
3358c2ecf20Sopenharmony_ci	 * List of &struct drm_pending_event, ready for delivery to userspace
3368c2ecf20Sopenharmony_ci	 * through drm_read(). Uses the &drm_pending_event.link entry.
3378c2ecf20Sopenharmony_ci	 *
3388c2ecf20Sopenharmony_ci	 * Protect by &drm_device.event_lock.
3398c2ecf20Sopenharmony_ci	 */
3408c2ecf20Sopenharmony_ci	struct list_head event_list;
3418c2ecf20Sopenharmony_ci
3428c2ecf20Sopenharmony_ci	/**
3438c2ecf20Sopenharmony_ci	 * @event_space:
3448c2ecf20Sopenharmony_ci	 *
3458c2ecf20Sopenharmony_ci	 * Available event space to prevent userspace from
3468c2ecf20Sopenharmony_ci	 * exhausting kernel memory. Currently limited to the fairly arbitrary
3478c2ecf20Sopenharmony_ci	 * value of 4KB.
3488c2ecf20Sopenharmony_ci	 */
3498c2ecf20Sopenharmony_ci	int event_space;
3508c2ecf20Sopenharmony_ci
3518c2ecf20Sopenharmony_ci	/** @event_read_lock: Serializes drm_read(). */
3528c2ecf20Sopenharmony_ci	struct mutex event_read_lock;
3538c2ecf20Sopenharmony_ci
3548c2ecf20Sopenharmony_ci	/**
3558c2ecf20Sopenharmony_ci	 * @prime:
3568c2ecf20Sopenharmony_ci	 *
3578c2ecf20Sopenharmony_ci	 * Per-file buffer caches used by the PRIME buffer sharing code.
3588c2ecf20Sopenharmony_ci	 */
3598c2ecf20Sopenharmony_ci	struct drm_prime_file_private prime;
3608c2ecf20Sopenharmony_ci
3618c2ecf20Sopenharmony_ci	/* private: */
3628c2ecf20Sopenharmony_ci#if IS_ENABLED(CONFIG_DRM_LEGACY)
3638c2ecf20Sopenharmony_ci	unsigned long lock_count; /* DRI1 legacy lock count */
3648c2ecf20Sopenharmony_ci#endif
3658c2ecf20Sopenharmony_ci};
3668c2ecf20Sopenharmony_ci
3678c2ecf20Sopenharmony_ci/**
3688c2ecf20Sopenharmony_ci * drm_is_primary_client - is this an open file of the primary node
3698c2ecf20Sopenharmony_ci * @file_priv: DRM file
3708c2ecf20Sopenharmony_ci *
3718c2ecf20Sopenharmony_ci * Returns true if this is an open file of the primary node, i.e.
3728c2ecf20Sopenharmony_ci * &drm_file.minor of @file_priv is a primary minor.
3738c2ecf20Sopenharmony_ci *
3748c2ecf20Sopenharmony_ci * See also the :ref:`section on primary nodes and authentication
3758c2ecf20Sopenharmony_ci * <drm_primary_node>`.
3768c2ecf20Sopenharmony_ci */
3778c2ecf20Sopenharmony_cistatic inline bool drm_is_primary_client(const struct drm_file *file_priv)
3788c2ecf20Sopenharmony_ci{
3798c2ecf20Sopenharmony_ci	return file_priv->minor->type == DRM_MINOR_PRIMARY;
3808c2ecf20Sopenharmony_ci}
3818c2ecf20Sopenharmony_ci
3828c2ecf20Sopenharmony_ci/**
3838c2ecf20Sopenharmony_ci * drm_is_render_client - is this an open file of the render node
3848c2ecf20Sopenharmony_ci * @file_priv: DRM file
3858c2ecf20Sopenharmony_ci *
3868c2ecf20Sopenharmony_ci * Returns true if this is an open file of the render node, i.e.
3878c2ecf20Sopenharmony_ci * &drm_file.minor of @file_priv is a render minor.
3888c2ecf20Sopenharmony_ci *
3898c2ecf20Sopenharmony_ci * See also the :ref:`section on render nodes <drm_render_node>`.
3908c2ecf20Sopenharmony_ci */
3918c2ecf20Sopenharmony_cistatic inline bool drm_is_render_client(const struct drm_file *file_priv)
3928c2ecf20Sopenharmony_ci{
3938c2ecf20Sopenharmony_ci	return file_priv->minor->type == DRM_MINOR_RENDER;
3948c2ecf20Sopenharmony_ci}
3958c2ecf20Sopenharmony_ci
3968c2ecf20Sopenharmony_ciint drm_open(struct inode *inode, struct file *filp);
3978c2ecf20Sopenharmony_cissize_t drm_read(struct file *filp, char __user *buffer,
3988c2ecf20Sopenharmony_ci		 size_t count, loff_t *offset);
3998c2ecf20Sopenharmony_ciint drm_release(struct inode *inode, struct file *filp);
4008c2ecf20Sopenharmony_ciint drm_release_noglobal(struct inode *inode, struct file *filp);
4018c2ecf20Sopenharmony_ci__poll_t drm_poll(struct file *filp, struct poll_table_struct *wait);
4028c2ecf20Sopenharmony_ciint drm_event_reserve_init_locked(struct drm_device *dev,
4038c2ecf20Sopenharmony_ci				  struct drm_file *file_priv,
4048c2ecf20Sopenharmony_ci				  struct drm_pending_event *p,
4058c2ecf20Sopenharmony_ci				  struct drm_event *e);
4068c2ecf20Sopenharmony_ciint drm_event_reserve_init(struct drm_device *dev,
4078c2ecf20Sopenharmony_ci			   struct drm_file *file_priv,
4088c2ecf20Sopenharmony_ci			   struct drm_pending_event *p,
4098c2ecf20Sopenharmony_ci			   struct drm_event *e);
4108c2ecf20Sopenharmony_civoid drm_event_cancel_free(struct drm_device *dev,
4118c2ecf20Sopenharmony_ci			   struct drm_pending_event *p);
4128c2ecf20Sopenharmony_civoid drm_send_event_locked(struct drm_device *dev, struct drm_pending_event *e);
4138c2ecf20Sopenharmony_civoid drm_send_event(struct drm_device *dev, struct drm_pending_event *e);
4148c2ecf20Sopenharmony_ci
4158c2ecf20Sopenharmony_cistruct file *mock_drm_getfile(struct drm_minor *minor, unsigned int flags);
4168c2ecf20Sopenharmony_ci
4178c2ecf20Sopenharmony_ci#ifdef CONFIG_MMU
4188c2ecf20Sopenharmony_cistruct drm_vma_offset_manager;
4198c2ecf20Sopenharmony_ciunsigned long drm_get_unmapped_area(struct file *file,
4208c2ecf20Sopenharmony_ci				    unsigned long uaddr, unsigned long len,
4218c2ecf20Sopenharmony_ci				    unsigned long pgoff, unsigned long flags,
4228c2ecf20Sopenharmony_ci				    struct drm_vma_offset_manager *mgr);
4238c2ecf20Sopenharmony_ci#endif /* CONFIG_MMU */
4248c2ecf20Sopenharmony_ci
4258c2ecf20Sopenharmony_ci
4268c2ecf20Sopenharmony_ci#endif /* _DRM_FILE_H_ */
427