1
2
3#ifndef _VKMS_DRV_H_
4#define _VKMS_DRV_H_
5
6#include <linux/hrtimer.h>
7
8#include <drm/drm.h>
9#include <drm/drm_gem.h>
10#include <drm/drm_encoder.h>
11#include <drm/drm_writeback.h>
12
13#define XRES_MIN 20
14#define YRES_MIN 20
15
16#define XRES_DEF 1024
17#define YRES_DEF 768
18
19#define XRES_MAX 8192
20#define YRES_MAX 8192
21
22struct vkms_composer {
23 struct drm_framebuffer fb;
24 struct drm_rect src, dst;
25 unsigned int offset;
26 unsigned int pitch;
27 unsigned int cpp;
28};
29
30
31
32
33
34
35struct vkms_plane_state {
36 struct drm_plane_state base;
37 struct vkms_composer *composer;
38};
39
40
41
42
43
44
45
46
47struct vkms_crtc_state {
48 struct drm_crtc_state base;
49 struct work_struct composer_work;
50
51 int num_active_planes;
52
53 struct vkms_plane_state **active_planes;
54 void *active_writeback;
55
56
57 bool crc_pending;
58 bool wb_pending;
59 u64 frame_start;
60 u64 frame_end;
61};
62
63struct vkms_output {
64 struct drm_crtc crtc;
65 struct drm_encoder encoder;
66 struct drm_connector connector;
67 struct drm_writeback_connector wb_connector;
68 struct hrtimer vblank_hrtimer;
69 ktime_t period_ns;
70 struct drm_pending_vblank_event *event;
71
72 struct workqueue_struct *composer_workq;
73
74 spinlock_t lock;
75
76
77 bool composer_enabled;
78 struct vkms_crtc_state *composer_state;
79
80 spinlock_t composer_lock;
81};
82
83struct vkms_device;
84
85struct vkms_config {
86 bool writeback;
87 bool cursor;
88
89 struct vkms_device *dev;
90};
91
92struct vkms_device {
93 struct drm_device drm;
94 struct platform_device *platform;
95 struct vkms_output output;
96 const struct vkms_config *config;
97};
98
99#define drm_crtc_to_vkms_output(target) \
100 container_of(target, struct vkms_output, crtc)
101
102#define drm_device_to_vkms_device(target) \
103 container_of(target, struct vkms_device, drm)
104
105#define to_vkms_crtc_state(target)\
106 container_of(target, struct vkms_crtc_state, base)
107
108#define to_vkms_plane_state(target)\
109 container_of(target, struct vkms_plane_state, base)
110
111
112int vkms_crtc_init(struct drm_device *dev, struct drm_crtc *crtc,
113 struct drm_plane *primary, struct drm_plane *cursor);
114
115int vkms_output_init(struct vkms_device *vkmsdev, int index);
116
117struct drm_plane *vkms_plane_init(struct vkms_device *vkmsdev,
118 enum drm_plane_type type, int index);
119
120
121const char *const *vkms_get_crc_sources(struct drm_crtc *crtc,
122 size_t *count);
123int vkms_set_crc_source(struct drm_crtc *crtc, const char *src_name);
124int vkms_verify_crc_source(struct drm_crtc *crtc, const char *source_name,
125 size_t *values_cnt);
126
127
128void vkms_composer_worker(struct work_struct *work);
129void vkms_set_composer(struct vkms_output *out, bool enabled);
130
131
132int vkms_enable_writeback_connector(struct vkms_device *vkmsdev);
133
134#endif
135