xref: /openbmc/linux/drivers/gpu/drm/vkms/vkms_drv.h (revision 2e7c04aec86758e0adfcad4a24c86593b45807a3)
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