Commit | Line | Data |
---|---|---|
e4672e55 DV |
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 | ||
e4672e55 DV |
9 | #include <drm/drm_mode_config.h> |
10 | ||
11 | struct drm_driver; | |
12 | struct drm_minor; | |
13 | struct drm_master; | |
e4672e55 | 14 | struct drm_vblank_crtc; |
e4672e55 | 15 | struct drm_vma_offset_manager; |
59f5989a | 16 | struct drm_vram_mm; |
29ad20b2 | 17 | struct drm_fb_helper; |
e4672e55 DV |
18 | |
19 | struct inode; | |
20 | ||
21 | struct pci_dev; | |
22 | struct pci_controller; | |
23 | ||
7af78f40 SR |
24 | |
25 | /** | |
e9d2871f | 26 | * enum switch_power_state - power state of drm device |
7af78f40 SR |
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 | ||
e4672e55 | 43 | /** |
ac4f24c2 SR |
44 | * struct drm_device - DRM device structure |
45 | * | |
46 | * This structure represent a complete card that | |
e4672e55 DV |
47 | * may contain multiple heads. |
48 | */ | |
49 | struct drm_device { | |
ac4f24c2 SR |
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 | ||
c6603c74 DV |
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 | ||
ac4f24c2 | 74 | /** @driver: DRM driver managing the device */ |
8f5c7aa0 | 75 | const struct drm_driver *driver; |
ac4f24c2 | 76 | |
3214a166 DV |
77 | /** |
78 | * @dev_private: | |
79 | * | |
74aae1c4 DV |
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 | |
4c8e84b8 | 84 | * devm_drm_dev_alloc() and embed struct &drm_device in their larger |
74aae1c4 | 85 | * per-device structure. |
3214a166 | 86 | */ |
ac4f24c2 SR |
87 | void *dev_private; |
88 | ||
99845faa DV |
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 | */ | |
ac4f24c2 SR |
97 | struct drm_minor *primary; |
98 | ||
99845faa DV |
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 | */ | |
ac4f24c2 SR |
106 | struct drm_minor *render; |
107 | ||
2c204f3d OG |
108 | /** @accel: Compute Acceleration node */ |
109 | struct drm_minor *accel; | |
110 | ||
3214a166 DV |
111 | /** |
112 | * @registered: | |
113 | * | |
114 | * Internally used by drm_dev_register() and drm_connector_register(). | |
115 | */ | |
e4672e55 DV |
116 | bool registered; |
117 | ||
ac4f24c2 SR |
118 | /** |
119 | * @master: | |
120 | * | |
121 | * Currently active master for this device. | |
122 | * Protected by &master_mutex | |
123 | */ | |
e4672e55 DV |
124 | struct drm_master *master; |
125 | ||
18ace11f VS |
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 | ||
bee330f3 NT |
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 | ||
ac4f24c2 SR |
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) | |
e33f4234 | 154 | * |
2504c7ec TZ |
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. | |
ac4f24c2 SR |
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 | */ | |
7e13ad89 | 173 | atomic_t open_count; |
ac4f24c2 | 174 | |
3214a166 | 175 | /** @filelist_mutex: Protects @filelist. */ |
e4672e55 | 176 | struct mutex filelist_mutex; |
3214a166 DV |
177 | /** |
178 | * @filelist: | |
179 | * | |
180 | * List of userspace clients, linked through &drm_file.lhead. | |
181 | */ | |
e4672e55 DV |
182 | struct list_head filelist; |
183 | ||
c76f0f7c NT |
184 | /** |
185 | * @filelist_internal: | |
186 | * | |
ac4f24c2 SR |
187 | * List of open DRM files for in-kernel clients. |
188 | * Protected by &filelist_mutex. | |
c76f0f7c NT |
189 | */ |
190 | struct list_head filelist_internal; | |
191 | ||
192 | /** | |
193 | * @clientlist_mutex: | |
194 | * | |
ac4f24c2 | 195 | * Protects &clientlist access. |
c76f0f7c NT |
196 | */ |
197 | struct mutex clientlist_mutex; | |
198 | ||
199 | /** | |
200 | * @clientlist: | |
201 | * | |
ac4f24c2 | 202 | * List of in-kernel clients. Protected by &clientlist_mutex. |
c76f0f7c NT |
203 | */ |
204 | struct list_head clientlist; | |
205 | ||
e4672e55 DV |
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() | |
0d5040e4 HM |
216 | * appropriately. Also, see @max_vblank_count, |
217 | * &drm_crtc_funcs.get_vblank_counter and | |
218 | * &drm_vblank_crtc_config.disable_immediate. | |
e4672e55 DV |
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 | ||
ac4f24c2 SR |
232 | /** |
233 | * @vblank_time_lock: | |
234 | * | |
235 | * Protects vblank count and time updates during vblank enable/disable | |
236 | */ | |
237 | spinlock_t vblank_time_lock; | |
3214a166 DV |
238 | /** |
239 | * @vbl_lock: Top-level vblank references lock, wraps the low-level | |
240 | * @vblank_time_lock. | |
241 | */ | |
e4672e55 DV |
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 | * | |
ed20151a VS |
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 | * | |
3214a166 | 263 | * If non-zero, &drm_crtc_funcs.get_vblank_counter must be set. |
e4672e55 | 264 | */ |
ac4f24c2 SR |
265 | u32 max_vblank_count; |
266 | ||
267 | /** @vblank_event_list: List of vblank events */ | |
e4672e55 | 268 | struct list_head vblank_event_list; |
3214a166 DV |
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 | */ | |
e4672e55 DV |
276 | spinlock_t event_lock; |
277 | ||
ac4f24c2 SR |
278 | /** @num_crtcs: Number of CRTCs on this device */ |
279 | unsigned int num_crtcs; | |
e4672e55 | 280 | |
ac4f24c2 SR |
281 | /** @mode_config: Current mode config */ |
282 | struct drm_mode_config mode_config; | |
e4672e55 | 283 | |
ac4f24c2 | 284 | /** @object_name_lock: GEM information */ |
e4672e55 | 285 | struct mutex object_name_lock; |
ac4f24c2 SR |
286 | |
287 | /** @object_name_idr: GEM information */ | |
e4672e55 | 288 | struct idr object_name_idr; |
ac4f24c2 SR |
289 | |
290 | /** @vma_offset_manager: GEM information */ | |
e4672e55 | 291 | struct drm_vma_offset_manager *vma_offset_manager; |
ac4f24c2 | 292 | |
59f5989a TZ |
293 | /** @vram_mm: VRAM MM memory manager */ |
294 | struct drm_vram_mm *vram_mm; | |
295 | ||
7af78f40 SR |
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; | |
29ad20b2 NT |
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; | |
3214a166 | 313 | |
0b30d57a CK |
314 | /** |
315 | * @debugfs_root: | |
316 | * | |
317 | * Root directory for debugfs files. | |
318 | */ | |
319 | struct dentry *debugfs_root; | |
e4672e55 DV |
320 | }; |
321 | ||
322 | #endif |