1 #ifndef _VKMS_DRV_H_ 2 #define _VKMS_DRV_H_ 3 4 #include <drm/drmP.h> 5 #include <drm/drm.h> 6 #include <drm/drm_gem.h> 7 #include <drm/drm_encoder.h> 8 #include <linux/hrtimer.h> 9 10 #define XRES_MIN 32 11 #define YRES_MIN 32 12 13 #define XRES_DEF 1024 14 #define YRES_DEF 768 15 16 #define XRES_MAX 8192 17 #define YRES_MAX 8192 18 19 static const u32 vkms_formats[] = { 20 DRM_FORMAT_XRGB8888, 21 }; 22 23 struct vkms_crc_data { 24 struct drm_rect src; 25 struct drm_framebuffer fb; 26 }; 27 28 /** 29 * vkms_plane_state - Driver specific plane state 30 * @base: base plane state 31 * @crc_data: data required for CRC computation 32 */ 33 struct vkms_plane_state { 34 struct drm_plane_state base; 35 struct vkms_crc_data *crc_data; 36 }; 37 38 /** 39 * vkms_crtc_state - Driver specific CRTC state 40 * @base: base CRTC state 41 * @crc_work: work struct to compute and add CRC entries 42 * @n_frame: frame number for computed CRC 43 */ 44 struct vkms_crtc_state { 45 struct drm_crtc_state base; 46 struct work_struct crc_work; 47 unsigned int n_frame; 48 }; 49 50 struct vkms_output { 51 struct drm_crtc crtc; 52 struct drm_encoder encoder; 53 struct drm_connector connector; 54 struct hrtimer vblank_hrtimer; 55 ktime_t period_ns; 56 struct drm_pending_vblank_event *event; 57 bool crc_enabled; 58 /* ordered wq for crc_work */ 59 struct workqueue_struct *crc_workq; 60 /* protects concurrent access to crc_data */ 61 spinlock_t lock; 62 }; 63 64 struct vkms_device { 65 struct drm_device drm; 66 struct platform_device *platform; 67 struct vkms_output output; 68 }; 69 70 struct vkms_gem_object { 71 struct drm_gem_object gem; 72 struct mutex pages_lock; /* Page lock used in page fault handler */ 73 struct page **pages; 74 unsigned int vmap_count; 75 void *vaddr; 76 }; 77 78 #define drm_crtc_to_vkms_output(target) \ 79 container_of(target, struct vkms_output, crtc) 80 81 #define drm_device_to_vkms_device(target) \ 82 container_of(target, struct vkms_device, drm) 83 84 #define drm_gem_to_vkms_gem(target)\ 85 container_of(target, struct vkms_gem_object, gem) 86 87 #define to_vkms_crtc_state(target)\ 88 container_of(target, struct vkms_crtc_state, base) 89 90 #define to_vkms_plane_state(target)\ 91 container_of(target, struct vkms_plane_state, base) 92 93 /* CRTC */ 94 int vkms_crtc_init(struct drm_device *dev, struct drm_crtc *crtc, 95 struct drm_plane *primary, struct drm_plane *cursor); 96 97 bool vkms_get_vblank_timestamp(struct drm_device *dev, unsigned int pipe, 98 int *max_error, ktime_t *vblank_time, 99 bool in_vblank_irq); 100 101 int vkms_output_init(struct vkms_device *vkmsdev); 102 103 struct drm_plane *vkms_plane_init(struct vkms_device *vkmsdev); 104 105 /* Gem stuff */ 106 struct drm_gem_object *vkms_gem_create(struct drm_device *dev, 107 struct drm_file *file, 108 u32 *handle, 109 u64 size); 110 111 vm_fault_t vkms_gem_fault(struct vm_fault *vmf); 112 113 int vkms_dumb_create(struct drm_file *file, struct drm_device *dev, 114 struct drm_mode_create_dumb *args); 115 116 int vkms_dumb_map(struct drm_file *file, struct drm_device *dev, 117 u32 handle, u64 *offset); 118 119 void vkms_gem_free_object(struct drm_gem_object *obj); 120 121 int vkms_gem_vmap(struct drm_gem_object *obj); 122 123 void vkms_gem_vunmap(struct drm_gem_object *obj); 124 125 /* CRC Support */ 126 int vkms_set_crc_source(struct drm_crtc *crtc, const char *src_name); 127 int vkms_verify_crc_source(struct drm_crtc *crtc, const char *source_name, 128 size_t *values_cnt); 129 void vkms_crc_work_handle(struct work_struct *work); 130 131 #endif /* _VKMS_DRV_H_ */ 132