drm/vkms: Add cursor plane support
[linux-2.6-microblaze.git] / drivers / gpu / drm / vkms / vkms_drv.h
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    20
11 #define YRES_MIN    20
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 static const u32 vkms_cursor_formats[] = {
24         DRM_FORMAT_ARGB8888,
25 };
26
27 struct vkms_crc_data {
28         struct drm_rect src;
29         struct drm_framebuffer fb;
30 };
31
32 /**
33  * vkms_plane_state - Driver specific plane state
34  * @base: base plane state
35  * @crc_data: data required for CRC computation
36  */
37 struct vkms_plane_state {
38         struct drm_plane_state base;
39         struct vkms_crc_data *crc_data;
40 };
41
42 /**
43  * vkms_crtc_state - Driver specific CRTC state
44  * @base: base CRTC state
45  * @crc_work: work struct to compute and add CRC entries
46  * @n_frame_start: start frame number for computed CRC
47  * @n_frame_end: end frame number for computed CRC
48  */
49 struct vkms_crtc_state {
50         struct drm_crtc_state base;
51         struct work_struct crc_work;
52         u64 frame_start;
53         u64 frame_end;
54 };
55
56 struct vkms_output {
57         struct drm_crtc crtc;
58         struct drm_encoder encoder;
59         struct drm_connector connector;
60         struct hrtimer vblank_hrtimer;
61         ktime_t period_ns;
62         struct drm_pending_vblank_event *event;
63         bool crc_enabled;
64         /* ordered wq for crc_work */
65         struct workqueue_struct *crc_workq;
66         /* protects concurrent access to crc_data */
67         spinlock_t lock;
68         /* protects concurrent access to crtc_state */
69         spinlock_t state_lock;
70 };
71
72 struct vkms_device {
73         struct drm_device drm;
74         struct platform_device *platform;
75         struct vkms_output output;
76 };
77
78 struct vkms_gem_object {
79         struct drm_gem_object gem;
80         struct mutex pages_lock; /* Page lock used in page fault handler */
81         struct page **pages;
82         unsigned int vmap_count;
83         void *vaddr;
84 };
85
86 #define drm_crtc_to_vkms_output(target) \
87         container_of(target, struct vkms_output, crtc)
88
89 #define drm_device_to_vkms_device(target) \
90         container_of(target, struct vkms_device, drm)
91
92 #define drm_gem_to_vkms_gem(target)\
93         container_of(target, struct vkms_gem_object, gem)
94
95 #define to_vkms_crtc_state(target)\
96         container_of(target, struct vkms_crtc_state, base)
97
98 #define to_vkms_plane_state(target)\
99         container_of(target, struct vkms_plane_state, base)
100
101 /* CRTC */
102 int vkms_crtc_init(struct drm_device *dev, struct drm_crtc *crtc,
103                    struct drm_plane *primary, struct drm_plane *cursor);
104
105 bool vkms_get_vblank_timestamp(struct drm_device *dev, unsigned int pipe,
106                                int *max_error, ktime_t *vblank_time,
107                                bool in_vblank_irq);
108
109 int vkms_output_init(struct vkms_device *vkmsdev);
110
111 struct drm_plane *vkms_plane_init(struct vkms_device *vkmsdev,
112                                   enum drm_plane_type type);
113
114 /* Gem stuff */
115 struct drm_gem_object *vkms_gem_create(struct drm_device *dev,
116                                        struct drm_file *file,
117                                        u32 *handle,
118                                        u64 size);
119
120 vm_fault_t vkms_gem_fault(struct vm_fault *vmf);
121
122 int vkms_dumb_create(struct drm_file *file, struct drm_device *dev,
123                      struct drm_mode_create_dumb *args);
124
125 int vkms_dumb_map(struct drm_file *file, struct drm_device *dev,
126                   u32 handle, u64 *offset);
127
128 void vkms_gem_free_object(struct drm_gem_object *obj);
129
130 int vkms_gem_vmap(struct drm_gem_object *obj);
131
132 void vkms_gem_vunmap(struct drm_gem_object *obj);
133
134 /* CRC Support */
135 int vkms_set_crc_source(struct drm_crtc *crtc, const char *src_name);
136 int vkms_verify_crc_source(struct drm_crtc *crtc, const char *source_name,
137                            size_t *values_cnt);
138 void vkms_crc_work_handle(struct work_struct *work);
139
140 #endif /* _VKMS_DRV_H_ */