xref: /openbmc/linux/include/drm/drm_file.h (revision a8f8b1d9b8701465f1309d551fba2ebda6760f49)
1*a8f8b1d9SDaniel Vetter /*
2*a8f8b1d9SDaniel Vetter  * Copyright 1999 Precision Insight, Inc., Cedar Park, Texas.
3*a8f8b1d9SDaniel Vetter  * Copyright 2000 VA Linux Systems, Inc., Sunnyvale, California.
4*a8f8b1d9SDaniel Vetter  * Copyright (c) 2009-2010, Code Aurora Forum.
5*a8f8b1d9SDaniel Vetter  * All rights reserved.
6*a8f8b1d9SDaniel Vetter  *
7*a8f8b1d9SDaniel Vetter  * Author: Rickard E. (Rik) Faith <faith@valinux.com>
8*a8f8b1d9SDaniel Vetter  * Author: Gareth Hughes <gareth@valinux.com>
9*a8f8b1d9SDaniel Vetter  *
10*a8f8b1d9SDaniel Vetter  * Permission is hereby granted, free of charge, to any person obtaining a
11*a8f8b1d9SDaniel Vetter  * copy of this software and associated documentation files (the "Software"),
12*a8f8b1d9SDaniel Vetter  * to deal in the Software without restriction, including without limitation
13*a8f8b1d9SDaniel Vetter  * the rights to use, copy, modify, merge, publish, distribute, sublicense,
14*a8f8b1d9SDaniel Vetter  * and/or sell copies of the Software, and to permit persons to whom the
15*a8f8b1d9SDaniel Vetter  * Software is furnished to do so, subject to the following conditions:
16*a8f8b1d9SDaniel Vetter  *
17*a8f8b1d9SDaniel Vetter  * The above copyright notice and this permission notice (including the next
18*a8f8b1d9SDaniel Vetter  * paragraph) shall be included in all copies or substantial portions of the
19*a8f8b1d9SDaniel Vetter  * Software.
20*a8f8b1d9SDaniel Vetter  *
21*a8f8b1d9SDaniel Vetter  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
22*a8f8b1d9SDaniel Vetter  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
23*a8f8b1d9SDaniel Vetter  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
24*a8f8b1d9SDaniel Vetter  * VA LINUX SYSTEMS AND/OR ITS SUPPLIERS BE LIABLE FOR ANY CLAIM, DAMAGES OR
25*a8f8b1d9SDaniel Vetter  * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
26*a8f8b1d9SDaniel Vetter  * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
27*a8f8b1d9SDaniel Vetter  * OTHER DEALINGS IN THE SOFTWARE.
28*a8f8b1d9SDaniel Vetter  */
29*a8f8b1d9SDaniel Vetter 
30*a8f8b1d9SDaniel Vetter #ifndef _DRM_FILE_H_
31*a8f8b1d9SDaniel Vetter #define _DRM_FILE_H_
32*a8f8b1d9SDaniel Vetter 
33*a8f8b1d9SDaniel Vetter #include <linux/types.h>
34*a8f8b1d9SDaniel Vetter #include <linux/completion.h>
35*a8f8b1d9SDaniel Vetter 
36*a8f8b1d9SDaniel Vetter #include <uapi/drm/drm.h>
37*a8f8b1d9SDaniel Vetter 
38*a8f8b1d9SDaniel Vetter #include <drm/drm_prime.h>
39*a8f8b1d9SDaniel Vetter 
40*a8f8b1d9SDaniel Vetter struct dma_fence;
41*a8f8b1d9SDaniel Vetter struct drm_file;
42*a8f8b1d9SDaniel Vetter struct drm_device;
43*a8f8b1d9SDaniel Vetter 
44*a8f8b1d9SDaniel Vetter /*
45*a8f8b1d9SDaniel Vetter  * FIXME: Not sure we want to have drm_minor here in the end, but to avoid
46*a8f8b1d9SDaniel Vetter  * header include loops we need it here for now.
47*a8f8b1d9SDaniel Vetter  */
48*a8f8b1d9SDaniel Vetter enum drm_minor_type {
49*a8f8b1d9SDaniel Vetter 	DRM_MINOR_PRIMARY,
50*a8f8b1d9SDaniel Vetter 	DRM_MINOR_CONTROL,
51*a8f8b1d9SDaniel Vetter 	DRM_MINOR_RENDER,
52*a8f8b1d9SDaniel Vetter };
53*a8f8b1d9SDaniel Vetter 
54*a8f8b1d9SDaniel Vetter /**
55*a8f8b1d9SDaniel Vetter  * DRM minor structure. This structure represents a drm minor number.
56*a8f8b1d9SDaniel Vetter  */
57*a8f8b1d9SDaniel Vetter struct drm_minor {
58*a8f8b1d9SDaniel Vetter 	int index;			/**< Minor device number */
59*a8f8b1d9SDaniel Vetter 	int type;                       /**< Control or render */
60*a8f8b1d9SDaniel Vetter 	struct device *kdev;		/**< Linux device */
61*a8f8b1d9SDaniel Vetter 	struct drm_device *dev;
62*a8f8b1d9SDaniel Vetter 
63*a8f8b1d9SDaniel Vetter 	struct dentry *debugfs_root;
64*a8f8b1d9SDaniel Vetter 
65*a8f8b1d9SDaniel Vetter 	struct list_head debugfs_list;
66*a8f8b1d9SDaniel Vetter 	struct mutex debugfs_lock; /* Protects debugfs_list. */
67*a8f8b1d9SDaniel Vetter };
68*a8f8b1d9SDaniel Vetter 
69*a8f8b1d9SDaniel Vetter /* Event queued up for userspace to read */
70*a8f8b1d9SDaniel Vetter struct drm_pending_event {
71*a8f8b1d9SDaniel Vetter 	struct completion *completion;
72*a8f8b1d9SDaniel Vetter 	void (*completion_release)(struct completion *completion);
73*a8f8b1d9SDaniel Vetter 	struct drm_event *event;
74*a8f8b1d9SDaniel Vetter 	struct dma_fence *fence;
75*a8f8b1d9SDaniel Vetter 	struct list_head link;
76*a8f8b1d9SDaniel Vetter 	struct list_head pending_link;
77*a8f8b1d9SDaniel Vetter 	struct drm_file *file_priv;
78*a8f8b1d9SDaniel Vetter 	pid_t pid; /* pid of requester, no guarantee it's valid by the time
79*a8f8b1d9SDaniel Vetter 		      we deliver the event, for tracing only */
80*a8f8b1d9SDaniel Vetter };
81*a8f8b1d9SDaniel Vetter 
82*a8f8b1d9SDaniel Vetter /** File private data */
83*a8f8b1d9SDaniel Vetter struct drm_file {
84*a8f8b1d9SDaniel Vetter 	unsigned authenticated :1;
85*a8f8b1d9SDaniel Vetter 	/* true when the client has asked us to expose stereo 3D mode flags */
86*a8f8b1d9SDaniel Vetter 	unsigned stereo_allowed :1;
87*a8f8b1d9SDaniel Vetter 	/*
88*a8f8b1d9SDaniel Vetter 	 * true if client understands CRTC primary planes and cursor planes
89*a8f8b1d9SDaniel Vetter 	 * in the plane list
90*a8f8b1d9SDaniel Vetter 	 */
91*a8f8b1d9SDaniel Vetter 	unsigned universal_planes:1;
92*a8f8b1d9SDaniel Vetter 	/* true if client understands atomic properties */
93*a8f8b1d9SDaniel Vetter 	unsigned atomic:1;
94*a8f8b1d9SDaniel Vetter 	/*
95*a8f8b1d9SDaniel Vetter 	 * This client is the creator of @master.
96*a8f8b1d9SDaniel Vetter 	 * Protected by struct drm_device::master_mutex.
97*a8f8b1d9SDaniel Vetter 	 */
98*a8f8b1d9SDaniel Vetter 	unsigned is_master:1;
99*a8f8b1d9SDaniel Vetter 
100*a8f8b1d9SDaniel Vetter 	struct pid *pid;
101*a8f8b1d9SDaniel Vetter 	drm_magic_t magic;
102*a8f8b1d9SDaniel Vetter 	struct list_head lhead;
103*a8f8b1d9SDaniel Vetter 	struct drm_minor *minor;
104*a8f8b1d9SDaniel Vetter 	unsigned long lock_count;
105*a8f8b1d9SDaniel Vetter 
106*a8f8b1d9SDaniel Vetter 	/** Mapping of mm object handles to object pointers. */
107*a8f8b1d9SDaniel Vetter 	struct idr object_idr;
108*a8f8b1d9SDaniel Vetter 	/** Lock for synchronization of access to object_idr. */
109*a8f8b1d9SDaniel Vetter 	spinlock_t table_lock;
110*a8f8b1d9SDaniel Vetter 
111*a8f8b1d9SDaniel Vetter 	struct file *filp;
112*a8f8b1d9SDaniel Vetter 	void *driver_priv;
113*a8f8b1d9SDaniel Vetter 
114*a8f8b1d9SDaniel Vetter 	struct drm_master *master; /* master this node is currently associated with
115*a8f8b1d9SDaniel Vetter 				      N.B. not always dev->master */
116*a8f8b1d9SDaniel Vetter 	/**
117*a8f8b1d9SDaniel Vetter 	 * fbs - List of framebuffers associated with this file.
118*a8f8b1d9SDaniel Vetter 	 *
119*a8f8b1d9SDaniel Vetter 	 * Protected by fbs_lock. Note that the fbs list holds a reference on
120*a8f8b1d9SDaniel Vetter 	 * the fb object to prevent it from untimely disappearing.
121*a8f8b1d9SDaniel Vetter 	 */
122*a8f8b1d9SDaniel Vetter 	struct list_head fbs;
123*a8f8b1d9SDaniel Vetter 	struct mutex fbs_lock;
124*a8f8b1d9SDaniel Vetter 
125*a8f8b1d9SDaniel Vetter 	/** User-created blob properties; this retains a reference on the
126*a8f8b1d9SDaniel Vetter 	 *  property. */
127*a8f8b1d9SDaniel Vetter 	struct list_head blobs;
128*a8f8b1d9SDaniel Vetter 
129*a8f8b1d9SDaniel Vetter 	wait_queue_head_t event_wait;
130*a8f8b1d9SDaniel Vetter 	struct list_head pending_event_list;
131*a8f8b1d9SDaniel Vetter 	struct list_head event_list;
132*a8f8b1d9SDaniel Vetter 	int event_space;
133*a8f8b1d9SDaniel Vetter 
134*a8f8b1d9SDaniel Vetter 	struct mutex event_read_lock;
135*a8f8b1d9SDaniel Vetter 
136*a8f8b1d9SDaniel Vetter 	struct drm_prime_file_private prime;
137*a8f8b1d9SDaniel Vetter };
138*a8f8b1d9SDaniel Vetter 
139*a8f8b1d9SDaniel Vetter static inline bool drm_is_render_client(const struct drm_file *file_priv)
140*a8f8b1d9SDaniel Vetter {
141*a8f8b1d9SDaniel Vetter 	return file_priv->minor->type == DRM_MINOR_RENDER;
142*a8f8b1d9SDaniel Vetter }
143*a8f8b1d9SDaniel Vetter 
144*a8f8b1d9SDaniel Vetter static inline bool drm_is_control_client(const struct drm_file *file_priv)
145*a8f8b1d9SDaniel Vetter {
146*a8f8b1d9SDaniel Vetter 	return file_priv->minor->type == DRM_MINOR_CONTROL;
147*a8f8b1d9SDaniel Vetter }
148*a8f8b1d9SDaniel Vetter 
149*a8f8b1d9SDaniel Vetter static inline bool drm_is_primary_client(const struct drm_file *file_priv)
150*a8f8b1d9SDaniel Vetter {
151*a8f8b1d9SDaniel Vetter 	return file_priv->minor->type == DRM_MINOR_PRIMARY;
152*a8f8b1d9SDaniel Vetter }
153*a8f8b1d9SDaniel Vetter 
154*a8f8b1d9SDaniel Vetter int drm_open(struct inode *inode, struct file *filp);
155*a8f8b1d9SDaniel Vetter ssize_t drm_read(struct file *filp, char __user *buffer,
156*a8f8b1d9SDaniel Vetter 		 size_t count, loff_t *offset);
157*a8f8b1d9SDaniel Vetter int drm_release(struct inode *inode, struct file *filp);
158*a8f8b1d9SDaniel Vetter unsigned int drm_poll(struct file *filp, struct poll_table_struct *wait);
159*a8f8b1d9SDaniel Vetter int drm_event_reserve_init_locked(struct drm_device *dev,
160*a8f8b1d9SDaniel Vetter 				  struct drm_file *file_priv,
161*a8f8b1d9SDaniel Vetter 				  struct drm_pending_event *p,
162*a8f8b1d9SDaniel Vetter 				  struct drm_event *e);
163*a8f8b1d9SDaniel Vetter int drm_event_reserve_init(struct drm_device *dev,
164*a8f8b1d9SDaniel Vetter 			   struct drm_file *file_priv,
165*a8f8b1d9SDaniel Vetter 			   struct drm_pending_event *p,
166*a8f8b1d9SDaniel Vetter 			   struct drm_event *e);
167*a8f8b1d9SDaniel Vetter void drm_event_cancel_free(struct drm_device *dev,
168*a8f8b1d9SDaniel Vetter 			   struct drm_pending_event *p);
169*a8f8b1d9SDaniel Vetter void drm_send_event_locked(struct drm_device *dev, struct drm_pending_event *e);
170*a8f8b1d9SDaniel Vetter void drm_send_event(struct drm_device *dev, struct drm_pending_event *e);
171*a8f8b1d9SDaniel Vetter 
172*a8f8b1d9SDaniel Vetter #endif /* _DRM_FILE_H_ */
173