brintos

brintos / linux-shallow public Read only

0
0
Text · 7.6 KiB · c91f87b Raw
323 lines · c
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 11struct drm_driver;12struct drm_minor;13struct drm_master;14struct drm_vblank_crtc;15struct drm_vma_offset_manager;16struct drm_vram_mm;17struct drm_fb_helper;18 19struct inode;20 21struct pci_dev;22struct pci_controller;23 24 25/**26 * enum switch_power_state - power state of drm device27 */28 29enum 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 structure45 *46 * This structure represent a complete card that47 * may contain multiple heads.48 */49struct 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 as63	 * 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 to81	 * NULL.82	 *83	 * Instead of using this pointer it is recommended that drivers use84	 * devm_drm_dev_alloc() and embed struct &drm_device in their larger85	 * per-device structure.86	 */87	void *dev_private;88 89	/**90	 * @primary:91	 *92	 * Primary node. Drivers should not interact with this93	 * directly. debugfs interfaces can be registered with94	 * drm_debugfs_add_file(), and sysfs should be directly added on the95	 * 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 or104	 * 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_mutex123	 */124	struct drm_master *master;125 126	/**127	 * @driver_features: per-device driver features128	 *129	 * Drivers can clear specific flags here to disallow130	 * certain features on a per-device basis while still131	 * sharing a single &struct drm_driver instance across132	 * 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 the156	 *       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_master164	 */165	struct mutex master_mutex;166 167	/**168	 * @open_count:169	 *170	 * Usage counter for outstanding files open,171	 * protected by drm_global_mutex172	 */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 the210	 * refcount drops to zero, as opposed to via the vblank disable211	 * timer.212	 *213	 * This can be set to true it the hardware has a working vblank counter214	 * with high-precision timestamping (otherwise there are races) and the215	 * 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 and218	 * &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. For226	 * historical reasons (vblank support predates kernel modesetting) this227	 * is free-standing and not part of &struct drm_crtc itself. It must be228	 * 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/disable236	 */237	spinlock_t vblank_time_lock;238	/**239	 * @vbl_lock: Top-level vblank references lock, wraps the low-level240	 * @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 a248	 * wrap-around of the vblank register. It is used by the vblank core to249	 * handle wrap-arounds.250	 *251	 * If set to zero the vblank core will try to guess the elapsed vblanks252	 * between times when the vblank interrupt is disabled through253	 * high-precision timestamps. That approach is suffering from small254	 * races and imprecision over longer time periods, hence exposing a255	 * hardware vblank counter is always recommended.256	 *257	 * This is the statically configured device wide maximum. The driver258	 * can instead choose to use a runtime configurable per-crtc value259	 * &drm_vblank_crtc.max_vblank_count, in which case @max_vblank_count260	 * must be left at zero. See drm_crtc_set_max_vblank_count() on how261	 * 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 in274	 * 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 the302	 * &vga_switcheroo_client_ops.set_gpu_state callback303	 */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#endif323