1 /* SPDX-License-Identifier: GPL-2.0 OR MIT */
2
3 /*
4 * Xen para-virtual DRM device
5 *
6 * Copyright (C) 2016-2018 EPAM Systems Inc.
7 *
8 * Author: Oleksandr Andrushchenko <oleksandr_andrushchenko@epam.com>
9 */
10
11 #ifndef __XEN_DRM_FRONT_H_
12 #define __XEN_DRM_FRONT_H_
13
14 #include <linux/scatterlist.h>
15
16 #include <drm/drm_connector.h>
17 #include <drm/drm_simple_kms_helper.h>
18
19 #include "xen_drm_front_cfg.h"
20
21 struct drm_device;
22 struct drm_framebuffer;
23 struct drm_gem_object;
24 struct drm_pending_vblank_event;
25
26 /**
27 * DOC: Driver modes of operation in terms of display buffers used
28 *
29 * Depending on the requirements for the para-virtualized environment, namely
30 * requirements dictated by the accompanying DRM/(v)GPU drivers running in both
31 * host and guest environments, display buffers can be allocated by either
32 * frontend driver or backend.
33 */
34
35 /**
36 * DOC: Buffers allocated by the frontend driver
37 *
38 * In this mode of operation driver allocates buffers from system memory.
39 *
40 * Note! If used with accompanying DRM/(v)GPU drivers this mode of operation
41 * may require IOMMU support on the platform, so accompanying DRM/vGPU
42 * hardware can still reach display buffer memory while importing PRIME
43 * buffers from the frontend driver.
44 */
45
46 /**
47 * DOC: Buffers allocated by the backend
48 *
49 * This mode of operation is run-time configured via guest domain configuration
50 * through XenStore entries.
51 *
52 * For systems which do not provide IOMMU support, but having specific
53 * requirements for display buffers it is possible to allocate such buffers
54 * at backend side and share those with the frontend.
55 * For example, if host domain is 1:1 mapped and has DRM/GPU hardware expecting
56 * physically contiguous memory, this allows implementing zero-copying
57 * use-cases.
58 *
59 * Note, while using this scenario the following should be considered:
60 *
61 * #. If guest domain dies then pages/grants received from the backend
62 * cannot be claimed back
63 *
64 * #. Misbehaving guest may send too many requests to the
65 * backend exhausting its grant references and memory
66 * (consider this from security POV)
67 */
68
69 /**
70 * DOC: Driver limitations
71 *
72 * #. Only primary plane without additional properties is supported.
73 *
74 * #. Only one video mode per connector supported which is configured
75 * via XenStore.
76 *
77 * #. All CRTCs operate at fixed frequency of 60Hz.
78 */
79
80 /* timeout in ms to wait for backend to respond */
81 #define XEN_DRM_FRONT_WAIT_BACK_MS 3000
82
83 struct xen_drm_front_info {
84 struct xenbus_device *xb_dev;
85 struct xen_drm_front_drm_info *drm_info;
86
87 /* to protect data between backend IO code and interrupt handler */
88 spinlock_t io_lock;
89
90 int num_evt_pairs;
91 struct xen_drm_front_evtchnl_pair *evt_pairs;
92 struct xen_drm_front_cfg cfg;
93
94 /* display buffers */
95 struct list_head dbuf_list;
96 };
97
98 struct xen_drm_front_drm_pipeline {
99 struct xen_drm_front_drm_info *drm_info;
100
101 int index;
102
103 struct drm_simple_display_pipe pipe;
104
105 struct drm_connector conn;
106 /* These are only for connector mode checking */
107 int width, height;
108
109 struct drm_pending_vblank_event *pending_event;
110
111 struct delayed_work pflip_to_worker;
112
113 bool conn_connected;
114 };
115
116 struct xen_drm_front_drm_info {
117 struct xen_drm_front_info *front_info;
118 struct drm_device *drm_dev;
119
120 struct xen_drm_front_drm_pipeline pipeline[XEN_DRM_FRONT_MAX_CRTCS];
121 };
122
xen_drm_front_fb_to_cookie(struct drm_framebuffer * fb)123 static inline u64 xen_drm_front_fb_to_cookie(struct drm_framebuffer *fb)
124 {
125 return (uintptr_t)fb;
126 }
127
xen_drm_front_dbuf_to_cookie(struct drm_gem_object * gem_obj)128 static inline u64 xen_drm_front_dbuf_to_cookie(struct drm_gem_object *gem_obj)
129 {
130 return (uintptr_t)gem_obj;
131 }
132
133 int xen_drm_front_mode_set(struct xen_drm_front_drm_pipeline *pipeline,
134 u32 x, u32 y, u32 width, u32 height,
135 u32 bpp, u64 fb_cookie);
136
137 int xen_drm_front_dbuf_create(struct xen_drm_front_info *front_info,
138 u64 dbuf_cookie, u32 width, u32 height,
139 u32 bpp, u64 size, u32 offset, struct page **pages);
140
141 int xen_drm_front_fb_attach(struct xen_drm_front_info *front_info,
142 u64 dbuf_cookie, u64 fb_cookie, u32 width,
143 u32 height, u32 pixel_format);
144
145 int xen_drm_front_fb_detach(struct xen_drm_front_info *front_info,
146 u64 fb_cookie);
147
148 int xen_drm_front_page_flip(struct xen_drm_front_info *front_info,
149 int conn_idx, u64 fb_cookie);
150
151 void xen_drm_front_on_frame_done(struct xen_drm_front_info *front_info,
152 int conn_idx, u64 fb_cookie);
153
154 void xen_drm_front_gem_object_free(struct drm_gem_object *obj);
155
156 #endif /* __XEN_DRM_FRONT_H_ */
157