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 | ||
9 | #include <drm/drm_hashtab.h> | |
10 | #include <drm/drm_mode_config.h> | |
11 | ||
12 | struct drm_driver; | |
13 | struct drm_minor; | |
14 | struct drm_master; | |
15 | struct drm_device_dma; | |
16 | struct drm_vblank_crtc; | |
17 | struct drm_sg_mem; | |
18 | struct drm_local_map; | |
19 | struct drm_vma_offset_manager; | |
59f5989a | 20 | struct drm_vram_mm; |
29ad20b2 | 21 | struct drm_fb_helper; |
e4672e55 DV |
22 | |
23 | struct inode; | |
24 | ||
25 | struct pci_dev; | |
26 | struct pci_controller; | |
27 | ||
7af78f40 SR |
28 | |
29 | /** | |
30 | * enum drm_switch_power - power state of drm device | |
31 | */ | |
32 | ||
33 | enum switch_power_state { | |
34 | /** @DRM_SWITCH_POWER_ON: Power state is ON */ | |
35 | DRM_SWITCH_POWER_ON = 0, | |
36 | ||
37 | /** @DRM_SWITCH_POWER_OFF: Power state is OFF */ | |
38 | DRM_SWITCH_POWER_OFF = 1, | |
39 | ||
40 | /** @DRM_SWITCH_POWER_CHANGING: Power state is changing */ | |
41 | DRM_SWITCH_POWER_CHANGING = 2, | |
42 | ||
43 | /** @DRM_SWITCH_POWER_DYNAMIC_OFF: Suspended */ | |
44 | DRM_SWITCH_POWER_DYNAMIC_OFF = 3, | |
45 | }; | |
46 | ||
e4672e55 | 47 | /** |
ac4f24c2 SR |
48 | * struct drm_device - DRM device structure |
49 | * | |
50 | * This structure represent a complete card that | |
e4672e55 DV |
51 | * may contain multiple heads. |
52 | */ | |
53 | struct drm_device { | |
ac4f24c2 SR |
54 | /** |
55 | * @legacy_dev_list: | |
56 | * | |
57 | * List of devices per driver for stealth attach cleanup | |
58 | */ | |
59 | struct list_head legacy_dev_list; | |
60 | ||
61 | /** @if_version: Highest interface version set */ | |
62 | int if_version; | |
63 | ||
64 | /** @ref: Object ref-count */ | |
65 | struct kref ref; | |
66 | ||
67 | /** @dev: Device structure of bus-device */ | |
68 | struct device *dev; | |
69 | ||
70 | /** @driver: DRM driver managing the device */ | |
71 | struct drm_driver *driver; | |
72 | ||
3214a166 DV |
73 | /** |
74 | * @dev_private: | |
75 | * | |
76 | * DRM driver private data. Instead of using this pointer it is | |
77 | * recommended that drivers use drm_dev_init() and embed struct | |
78 | * &drm_device in their larger per-device structure. | |
79 | */ | |
ac4f24c2 SR |
80 | void *dev_private; |
81 | ||
82 | /** @primary: Primary node */ | |
83 | struct drm_minor *primary; | |
84 | ||
85 | /** @render: Render node */ | |
86 | struct drm_minor *render; | |
87 | ||
3214a166 DV |
88 | /** |
89 | * @registered: | |
90 | * | |
91 | * Internally used by drm_dev_register() and drm_connector_register(). | |
92 | */ | |
e4672e55 DV |
93 | bool registered; |
94 | ||
ac4f24c2 SR |
95 | /** |
96 | * @master: | |
97 | * | |
98 | * Currently active master for this device. | |
99 | * Protected by &master_mutex | |
100 | */ | |
e4672e55 DV |
101 | struct drm_master *master; |
102 | ||
18ace11f VS |
103 | /** |
104 | * @driver_features: per-device driver features | |
105 | * | |
106 | * Drivers can clear specific flags here to disallow | |
107 | * certain features on a per-device basis while still | |
108 | * sharing a single &struct drm_driver instance across | |
109 | * all devices. | |
110 | */ | |
111 | u32 driver_features; | |
112 | ||
bee330f3 NT |
113 | /** |
114 | * @unplugged: | |
115 | * | |
116 | * Flag to tell if the device has been unplugged. | |
117 | * See drm_dev_enter() and drm_dev_is_unplugged(). | |
118 | */ | |
119 | bool unplugged; | |
120 | ||
ac4f24c2 SR |
121 | /** @anon_inode: inode for private address-space */ |
122 | struct inode *anon_inode; | |
123 | ||
124 | /** @unique: Unique name of the device */ | |
125 | char *unique; | |
126 | ||
127 | /** | |
128 | * @struct_mutex: | |
129 | * | |
130 | * Lock for others (not &drm_minor.master and &drm_file.is_master) | |
131 | */ | |
132 | struct mutex struct_mutex; | |
133 | ||
134 | /** | |
135 | * @master_mutex: | |
136 | * | |
137 | * Lock for &drm_minor.master and &drm_file.is_master | |
138 | */ | |
139 | struct mutex master_mutex; | |
140 | ||
141 | /** | |
142 | * @open_count: | |
143 | * | |
144 | * Usage counter for outstanding files open, | |
145 | * protected by drm_global_mutex | |
146 | */ | |
147 | int open_count; | |
148 | ||
3214a166 | 149 | /** @filelist_mutex: Protects @filelist. */ |
e4672e55 | 150 | struct mutex filelist_mutex; |
3214a166 DV |
151 | /** |
152 | * @filelist: | |
153 | * | |
154 | * List of userspace clients, linked through &drm_file.lhead. | |
155 | */ | |
e4672e55 DV |
156 | struct list_head filelist; |
157 | ||
c76f0f7c NT |
158 | /** |
159 | * @filelist_internal: | |
160 | * | |
ac4f24c2 SR |
161 | * List of open DRM files for in-kernel clients. |
162 | * Protected by &filelist_mutex. | |
c76f0f7c NT |
163 | */ |
164 | struct list_head filelist_internal; | |
165 | ||
166 | /** | |
167 | * @clientlist_mutex: | |
168 | * | |
ac4f24c2 | 169 | * Protects &clientlist access. |
c76f0f7c NT |
170 | */ |
171 | struct mutex clientlist_mutex; | |
172 | ||
173 | /** | |
174 | * @clientlist: | |
175 | * | |
ac4f24c2 | 176 | * List of in-kernel clients. Protected by &clientlist_mutex. |
c76f0f7c NT |
177 | */ |
178 | struct list_head clientlist; | |
179 | ||
e4672e55 DV |
180 | /** |
181 | * @irq_enabled: | |
182 | * | |
183 | * Indicates that interrupt handling is enabled, specifically vblank | |
184 | * handling. Drivers which don't use drm_irq_install() need to set this | |
185 | * to true manually. | |
186 | */ | |
187 | bool irq_enabled; | |
3214a166 DV |
188 | |
189 | /** | |
190 | * @irq: Used by the drm_irq_install() and drm_irq_unistall() helpers. | |
191 | */ | |
e4672e55 DV |
192 | int irq; |
193 | ||
194 | /** | |
195 | * @vblank_disable_immediate: | |
196 | * | |
197 | * If true, vblank interrupt will be disabled immediately when the | |
198 | * refcount drops to zero, as opposed to via the vblank disable | |
199 | * timer. | |
200 | * | |
201 | * This can be set to true it the hardware has a working vblank counter | |
202 | * with high-precision timestamping (otherwise there are races) and the | |
203 | * driver uses drm_crtc_vblank_on() and drm_crtc_vblank_off() | |
204 | * appropriately. See also @max_vblank_count and | |
205 | * &drm_crtc_funcs.get_vblank_counter. | |
206 | */ | |
207 | bool vblank_disable_immediate; | |
208 | ||
209 | /** | |
210 | * @vblank: | |
211 | * | |
212 | * Array of vblank tracking structures, one per &struct drm_crtc. For | |
213 | * historical reasons (vblank support predates kernel modesetting) this | |
214 | * is free-standing and not part of &struct drm_crtc itself. It must be | |
215 | * initialized explicitly by calling drm_vblank_init(). | |
216 | */ | |
217 | struct drm_vblank_crtc *vblank; | |
218 | ||
ac4f24c2 SR |
219 | /** |
220 | * @vblank_time_lock: | |
221 | * | |
222 | * Protects vblank count and time updates during vblank enable/disable | |
223 | */ | |
224 | spinlock_t vblank_time_lock; | |
3214a166 DV |
225 | /** |
226 | * @vbl_lock: Top-level vblank references lock, wraps the low-level | |
227 | * @vblank_time_lock. | |
228 | */ | |
e4672e55 DV |
229 | spinlock_t vbl_lock; |
230 | ||
231 | /** | |
232 | * @max_vblank_count: | |
233 | * | |
234 | * Maximum value of the vblank registers. This value +1 will result in a | |
235 | * wrap-around of the vblank register. It is used by the vblank core to | |
236 | * handle wrap-arounds. | |
237 | * | |
238 | * If set to zero the vblank core will try to guess the elapsed vblanks | |
239 | * between times when the vblank interrupt is disabled through | |
240 | * high-precision timestamps. That approach is suffering from small | |
241 | * races and imprecision over longer time periods, hence exposing a | |
242 | * hardware vblank counter is always recommended. | |
243 | * | |
ed20151a VS |
244 | * This is the statically configured device wide maximum. The driver |
245 | * can instead choose to use a runtime configurable per-crtc value | |
246 | * &drm_vblank_crtc.max_vblank_count, in which case @max_vblank_count | |
247 | * must be left at zero. See drm_crtc_set_max_vblank_count() on how | |
248 | * to use the per-crtc value. | |
249 | * | |
3214a166 | 250 | * If non-zero, &drm_crtc_funcs.get_vblank_counter must be set. |
e4672e55 | 251 | */ |
ac4f24c2 SR |
252 | u32 max_vblank_count; |
253 | ||
254 | /** @vblank_event_list: List of vblank events */ | |
e4672e55 | 255 | struct list_head vblank_event_list; |
3214a166 DV |
256 | |
257 | /** | |
258 | * @event_lock: | |
259 | * | |
260 | * Protects @vblank_event_list and event delivery in | |
261 | * general. See drm_send_event() and drm_send_event_locked(). | |
262 | */ | |
e4672e55 DV |
263 | spinlock_t event_lock; |
264 | ||
ac4f24c2 SR |
265 | /** @agp: AGP data */ |
266 | struct drm_agp_head *agp; | |
e4672e55 | 267 | |
ac4f24c2 SR |
268 | /** @pdev: PCI device structure */ |
269 | struct pci_dev *pdev; | |
e4672e55 | 270 | |
e4672e55 | 271 | #ifdef __alpha__ |
3214a166 | 272 | /** @hose: PCI hose, only used on ALPHA platforms. */ |
e4672e55 DV |
273 | struct pci_controller *hose; |
274 | #endif | |
ac4f24c2 SR |
275 | /** @num_crtcs: Number of CRTCs on this device */ |
276 | unsigned int num_crtcs; | |
e4672e55 | 277 | |
ac4f24c2 SR |
278 | /** @mode_config: Current mode config */ |
279 | struct drm_mode_config mode_config; | |
e4672e55 | 280 | |
ac4f24c2 | 281 | /** @object_name_lock: GEM information */ |
e4672e55 | 282 | struct mutex object_name_lock; |
ac4f24c2 SR |
283 | |
284 | /** @object_name_idr: GEM information */ | |
e4672e55 | 285 | struct idr object_name_idr; |
ac4f24c2 SR |
286 | |
287 | /** @vma_offset_manager: GEM information */ | |
e4672e55 | 288 | struct drm_vma_offset_manager *vma_offset_manager; |
ac4f24c2 | 289 | |
59f5989a TZ |
290 | /** @vram_mm: VRAM MM memory manager */ |
291 | struct drm_vram_mm *vram_mm; | |
292 | ||
7af78f40 SR |
293 | /** |
294 | * @switch_power_state: | |
295 | * | |
296 | * Power state of the client. | |
297 | * Used by drivers supporting the switcheroo driver. | |
298 | * The state is maintained in the | |
299 | * &vga_switcheroo_client_ops.set_gpu_state callback | |
300 | */ | |
301 | enum switch_power_state switch_power_state; | |
29ad20b2 NT |
302 | |
303 | /** | |
304 | * @fb_helper: | |
305 | * | |
306 | * Pointer to the fbdev emulation structure. | |
307 | * Set by drm_fb_helper_init() and cleared by drm_fb_helper_fini(). | |
308 | */ | |
309 | struct drm_fb_helper *fb_helper; | |
3214a166 DV |
310 | |
311 | /* Everything below here is for legacy driver, never use! */ | |
312 | /* private: */ | |
83c163f7 | 313 | #if IS_ENABLED(CONFIG_DRM_LEGACY) |
3214a166 DV |
314 | /* Context handle management - linked list of context handles */ |
315 | struct list_head ctxlist; | |
316 | ||
317 | /* Context handle management - mutex for &ctxlist */ | |
318 | struct mutex ctxlist_mutex; | |
319 | ||
320 | /* Context handle management */ | |
321 | struct idr ctx_idr; | |
322 | ||
323 | /* Memory management - linked list of regions */ | |
324 | struct list_head maplist; | |
325 | ||
326 | /* Memory management - user token hash table for maps */ | |
327 | struct drm_open_hash map_hash; | |
328 | ||
329 | /* Context handle management - list of vmas (for debugging) */ | |
330 | struct list_head vmalist; | |
331 | ||
332 | /* Optional pointer for DMA support */ | |
333 | struct drm_device_dma *dma; | |
334 | ||
335 | /* Context swapping flag */ | |
336 | __volatile__ long context_flag; | |
337 | ||
338 | /* Last current context */ | |
339 | int last_context; | |
340 | ||
341 | /* Lock for &buf_use and a few other things. */ | |
342 | spinlock_t buf_lock; | |
343 | ||
344 | /* Usage counter for buffers in use -- cannot alloc */ | |
345 | int buf_use; | |
346 | ||
347 | /* Buffer allocation in progress */ | |
348 | atomic_t buf_alloc; | |
349 | ||
350 | struct { | |
351 | int context; | |
352 | struct drm_hw_lock *lock; | |
353 | } sigdata; | |
354 | ||
355 | struct drm_local_map *agp_buffer_map; | |
356 | unsigned int agp_buffer_token; | |
357 | ||
358 | /* Scatter gather memory */ | |
359 | struct drm_sg_mem *sg; | |
83c163f7 | 360 | #endif |
e4672e55 DV |
361 | }; |
362 | ||
363 | #endif |