6 #include <drm/drm_gem.h>
7 #include <drm/drm_encoder.h>
8 #include <linux/hrtimer.h>
19 extern bool enable_cursor;
21 static const u32 vkms_formats[] = {
25 static const u32 vkms_cursor_formats[] = {
29 struct vkms_crc_data {
30 struct drm_framebuffer fb;
31 struct drm_rect src, dst;
38 * vkms_plane_state - Driver specific plane state
39 * @base: base plane state
40 * @crc_data: data required for CRC computation
42 struct vkms_plane_state {
43 struct drm_plane_state base;
44 struct vkms_crc_data *crc_data;
48 * vkms_crtc_state - Driver specific CRTC state
49 * @base: base CRTC state
50 * @crc_work: work struct to compute and add CRC entries
51 * @n_frame_start: start frame number for computed CRC
52 * @n_frame_end: end frame number for computed CRC
54 struct vkms_crtc_state {
55 struct drm_crtc_state base;
56 struct work_struct crc_work;
63 struct drm_encoder encoder;
64 struct drm_connector connector;
65 struct hrtimer vblank_hrtimer;
67 struct drm_pending_vblank_event *event;
69 /* ordered wq for crc_work */
70 struct workqueue_struct *crc_workq;
71 /* protects concurrent access to crc_data */
73 /* protects concurrent access to crtc_state */
74 spinlock_t state_lock;
78 struct drm_device drm;
79 struct platform_device *platform;
80 struct vkms_output output;
83 struct vkms_gem_object {
84 struct drm_gem_object gem;
85 struct mutex pages_lock; /* Page lock used in page fault handler */
87 unsigned int vmap_count;
91 #define drm_crtc_to_vkms_output(target) \
92 container_of(target, struct vkms_output, crtc)
94 #define drm_device_to_vkms_device(target) \
95 container_of(target, struct vkms_device, drm)
97 #define drm_gem_to_vkms_gem(target)\
98 container_of(target, struct vkms_gem_object, gem)
100 #define to_vkms_crtc_state(target)\
101 container_of(target, struct vkms_crtc_state, base)
103 #define to_vkms_plane_state(target)\
104 container_of(target, struct vkms_plane_state, base)
107 int vkms_crtc_init(struct drm_device *dev, struct drm_crtc *crtc,
108 struct drm_plane *primary, struct drm_plane *cursor);
110 bool vkms_get_vblank_timestamp(struct drm_device *dev, unsigned int pipe,
111 int *max_error, ktime_t *vblank_time,
114 int vkms_output_init(struct vkms_device *vkmsdev);
116 struct drm_plane *vkms_plane_init(struct vkms_device *vkmsdev,
117 enum drm_plane_type type);
120 struct drm_gem_object *vkms_gem_create(struct drm_device *dev,
121 struct drm_file *file,
125 vm_fault_t vkms_gem_fault(struct vm_fault *vmf);
127 int vkms_dumb_create(struct drm_file *file, struct drm_device *dev,
128 struct drm_mode_create_dumb *args);
130 void vkms_gem_free_object(struct drm_gem_object *obj);
132 int vkms_gem_vmap(struct drm_gem_object *obj);
134 void vkms_gem_vunmap(struct drm_gem_object *obj);
137 int vkms_set_crc_source(struct drm_crtc *crtc, const char *src_name);
138 int vkms_verify_crc_source(struct drm_crtc *crtc, const char *source_name,
140 void vkms_crc_work_handle(struct work_struct *work);
142 #endif /* _VKMS_DRV_H_ */