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