1  #ifndef _DRM_DEVICE_H_
2  #define _DRM_DEVICE_H_
3  
4  #include <linux/list.h>
5  #include <linux/kref.h>
6  #include <linux/mutex.h>
7  #include <linux/idr.h>
8  
9  #include <drm/drm_mode_config.h>
10  
11  struct drm_driver;
12  struct drm_minor;
13  struct drm_master;
14  struct drm_vblank_crtc;
15  struct drm_vma_offset_manager;
16  struct drm_vram_mm;
17  struct drm_fb_helper;
18  
19  struct inode;
20  
21  struct pci_dev;
22  struct pci_controller;
23  
24  
25  /**
26   * enum switch_power_state - power state of drm device
27   */
28  
29  enum switch_power_state {
30  	/** @DRM_SWITCH_POWER_ON: Power state is ON */
31  	DRM_SWITCH_POWER_ON = 0,
32  
33  	/** @DRM_SWITCH_POWER_OFF: Power state is OFF */
34  	DRM_SWITCH_POWER_OFF = 1,
35  
36  	/** @DRM_SWITCH_POWER_CHANGING: Power state is changing */
37  	DRM_SWITCH_POWER_CHANGING = 2,
38  
39  	/** @DRM_SWITCH_POWER_DYNAMIC_OFF: Suspended */
40  	DRM_SWITCH_POWER_DYNAMIC_OFF = 3,
41  };
42  
43  /**
44   * struct drm_device - DRM device structure
45   *
46   * This structure represent a complete card that
47   * may contain multiple heads.
48   */
49  struct drm_device {
50  	/** @if_version: Highest interface version set */
51  	int if_version;
52  
53  	/** @ref: Object ref-count */
54  	struct kref ref;
55  
56  	/** @dev: Device structure of bus-device */
57  	struct device *dev;
58  
59  	/**
60  	 * @managed:
61  	 *
62  	 * Managed resources linked to the lifetime of this &drm_device as
63  	 * tracked by @ref.
64  	 */
65  	struct {
66  		/** @managed.resources: managed resources list */
67  		struct list_head resources;
68  		/** @managed.final_kfree: pointer for final kfree() call */
69  		void *final_kfree;
70  		/** @managed.lock: protects @managed.resources */
71  		spinlock_t lock;
72  	} managed;
73  
74  	/** @driver: DRM driver managing the device */
75  	const struct drm_driver *driver;
76  
77  	/**
78  	 * @dev_private:
79  	 *
80  	 * DRM driver private data. This is deprecated and should be left set to
81  	 * NULL.
82  	 *
83  	 * Instead of using this pointer it is recommended that drivers use
84  	 * devm_drm_dev_alloc() and embed struct &drm_device in their larger
85  	 * per-device structure.
86  	 */
87  	void *dev_private;
88  
89  	/**
90  	 * @primary:
91  	 *
92  	 * Primary node. Drivers should not interact with this
93  	 * directly. debugfs interfaces can be registered with
94  	 * drm_debugfs_add_file(), and sysfs should be directly added on the
95  	 * hardware (and not character device node) struct device @dev.
96  	 */
97  	struct drm_minor *primary;
98  
99  	/**
100  	 * @render:
101  	 *
102  	 * Render node. Drivers should not interact with this directly ever.
103  	 * Drivers should not expose any additional interfaces in debugfs or
104  	 * sysfs on this node.
105  	 */
106  	struct drm_minor *render;
107  
108  	/** @accel: Compute Acceleration node */
109  	struct drm_minor *accel;
110  
111  	/**
112  	 * @registered:
113  	 *
114  	 * Internally used by drm_dev_register() and drm_connector_register().
115  	 */
116  	bool registered;
117  
118  	/**
119  	 * @master:
120  	 *
121  	 * Currently active master for this device.
122  	 * Protected by &master_mutex
123  	 */
124  	struct drm_master *master;
125  
126  	/**
127  	 * @driver_features: per-device driver features
128  	 *
129  	 * Drivers can clear specific flags here to disallow
130  	 * certain features on a per-device basis while still
131  	 * sharing a single &struct drm_driver instance across
132  	 * all devices.
133  	 */
134  	u32 driver_features;
135  
136  	/**
137  	 * @unplugged:
138  	 *
139  	 * Flag to tell if the device has been unplugged.
140  	 * See drm_dev_enter() and drm_dev_is_unplugged().
141  	 */
142  	bool unplugged;
143  
144  	/** @anon_inode: inode for private address-space */
145  	struct inode *anon_inode;
146  
147  	/** @unique: Unique name of the device */
148  	char *unique;
149  
150  	/**
151  	 * @struct_mutex:
152  	 *
153  	 * Lock for others (not &drm_minor.master and &drm_file.is_master)
154  	 *
155  	 * TODO: This lock used to be the BKL of the DRM subsystem. Move the
156  	 *       lock into i915, which is the only remaining user.
157  	 */
158  	struct mutex struct_mutex;
159  
160  	/**
161  	 * @master_mutex:
162  	 *
163  	 * Lock for &drm_minor.master and &drm_file.is_master
164  	 */
165  	struct mutex master_mutex;
166  
167  	/**
168  	 * @open_count:
169  	 *
170  	 * Usage counter for outstanding files open,
171  	 * protected by drm_global_mutex
172  	 */
173  	atomic_t open_count;
174  
175  	/** @filelist_mutex: Protects @filelist. */
176  	struct mutex filelist_mutex;
177  	/**
178  	 * @filelist:
179  	 *
180  	 * List of userspace clients, linked through &drm_file.lhead.
181  	 */
182  	struct list_head filelist;
183  
184  	/**
185  	 * @filelist_internal:
186  	 *
187  	 * List of open DRM files for in-kernel clients.
188  	 * Protected by &filelist_mutex.
189  	 */
190  	struct list_head filelist_internal;
191  
192  	/**
193  	 * @clientlist_mutex:
194  	 *
195  	 * Protects &clientlist access.
196  	 */
197  	struct mutex clientlist_mutex;
198  
199  	/**
200  	 * @clientlist:
201  	 *
202  	 * List of in-kernel clients. Protected by &clientlist_mutex.
203  	 */
204  	struct list_head clientlist;
205  
206  	/**
207  	 * @vblank_disable_immediate:
208  	 *
209  	 * If true, vblank interrupt will be disabled immediately when the
210  	 * refcount drops to zero, as opposed to via the vblank disable
211  	 * timer.
212  	 *
213  	 * This can be set to true it the hardware has a working vblank counter
214  	 * with high-precision timestamping (otherwise there are races) and the
215  	 * driver uses drm_crtc_vblank_on() and drm_crtc_vblank_off()
216  	 * appropriately. Also, see @max_vblank_count,
217  	 * &drm_crtc_funcs.get_vblank_counter and
218  	 * &drm_vblank_crtc_config.disable_immediate.
219  	 */
220  	bool vblank_disable_immediate;
221  
222  	/**
223  	 * @vblank:
224  	 *
225  	 * Array of vblank tracking structures, one per &struct drm_crtc. For
226  	 * historical reasons (vblank support predates kernel modesetting) this
227  	 * is free-standing and not part of &struct drm_crtc itself. It must be
228  	 * initialized explicitly by calling drm_vblank_init().
229  	 */
230  	struct drm_vblank_crtc *vblank;
231  
232  	/**
233  	 * @vblank_time_lock:
234  	 *
235  	 *  Protects vblank count and time updates during vblank enable/disable
236  	 */
237  	spinlock_t vblank_time_lock;
238  	/**
239  	 * @vbl_lock: Top-level vblank references lock, wraps the low-level
240  	 * @vblank_time_lock.
241  	 */
242  	spinlock_t vbl_lock;
243  
244  	/**
245  	 * @max_vblank_count:
246  	 *
247  	 * Maximum value of the vblank registers. This value +1 will result in a
248  	 * wrap-around of the vblank register. It is used by the vblank core to
249  	 * handle wrap-arounds.
250  	 *
251  	 * If set to zero the vblank core will try to guess the elapsed vblanks
252  	 * between times when the vblank interrupt is disabled through
253  	 * high-precision timestamps. That approach is suffering from small
254  	 * races and imprecision over longer time periods, hence exposing a
255  	 * hardware vblank counter is always recommended.
256  	 *
257  	 * This is the statically configured device wide maximum. The driver
258  	 * can instead choose to use a runtime configurable per-crtc value
259  	 * &drm_vblank_crtc.max_vblank_count, in which case @max_vblank_count
260  	 * must be left at zero. See drm_crtc_set_max_vblank_count() on how
261  	 * to use the per-crtc value.
262  	 *
263  	 * If non-zero, &drm_crtc_funcs.get_vblank_counter must be set.
264  	 */
265  	u32 max_vblank_count;
266  
267  	/** @vblank_event_list: List of vblank events */
268  	struct list_head vblank_event_list;
269  
270  	/**
271  	 * @event_lock:
272  	 *
273  	 * Protects @vblank_event_list and event delivery in
274  	 * general. See drm_send_event() and drm_send_event_locked().
275  	 */
276  	spinlock_t event_lock;
277  
278  	/** @num_crtcs: Number of CRTCs on this device */
279  	unsigned int num_crtcs;
280  
281  	/** @mode_config: Current mode config */
282  	struct drm_mode_config mode_config;
283  
284  	/** @object_name_lock: GEM information */
285  	struct mutex object_name_lock;
286  
287  	/** @object_name_idr: GEM information */
288  	struct idr object_name_idr;
289  
290  	/** @vma_offset_manager: GEM information */
291  	struct drm_vma_offset_manager *vma_offset_manager;
292  
293  	/** @vram_mm: VRAM MM memory manager */
294  	struct drm_vram_mm *vram_mm;
295  
296  	/**
297  	 * @switch_power_state:
298  	 *
299  	 * Power state of the client.
300  	 * Used by drivers supporting the switcheroo driver.
301  	 * The state is maintained in the
302  	 * &vga_switcheroo_client_ops.set_gpu_state callback
303  	 */
304  	enum switch_power_state switch_power_state;
305  
306  	/**
307  	 * @fb_helper:
308  	 *
309  	 * Pointer to the fbdev emulation structure.
310  	 * Set by drm_fb_helper_init() and cleared by drm_fb_helper_fini().
311  	 */
312  	struct drm_fb_helper *fb_helper;
313  
314  	/**
315  	 * @debugfs_root:
316  	 *
317  	 * Root directory for debugfs files.
318  	 */
319  	struct dentry *debugfs_root;
320  };
321  
322  #endif
323