xref: /OK3568_Linux_fs/kernel/drivers/gpu/drm/qxl/qxl_dev.h (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1*4882a593Smuzhiyun /*
2*4882a593Smuzhiyun    Copyright (C) 2009 Red Hat, Inc.
3*4882a593Smuzhiyun 
4*4882a593Smuzhiyun    Redistribution and use in source and binary forms, with or without
5*4882a593Smuzhiyun    modification, are permitted provided that the following conditions are
6*4882a593Smuzhiyun    met:
7*4882a593Smuzhiyun 
8*4882a593Smuzhiyun        * Redistributions of source code must retain the above copyright
9*4882a593Smuzhiyun 	 notice, this list of conditions and the following disclaimer.
10*4882a593Smuzhiyun        * Redistributions in binary form must reproduce the above copyright
11*4882a593Smuzhiyun 	 notice, this list of conditions and the following disclaimer in
12*4882a593Smuzhiyun 	 the documentation and/or other materials provided with the
13*4882a593Smuzhiyun 	 distribution.
14*4882a593Smuzhiyun        * Neither the name of the copyright holder nor the names of its
15*4882a593Smuzhiyun 	 contributors may be used to endorse or promote products derived
16*4882a593Smuzhiyun 	 from this software without specific prior written permission.
17*4882a593Smuzhiyun 
18*4882a593Smuzhiyun    THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDER AND CONTRIBUTORS "AS
19*4882a593Smuzhiyun    IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
20*4882a593Smuzhiyun    TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
21*4882a593Smuzhiyun    PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
22*4882a593Smuzhiyun    HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
23*4882a593Smuzhiyun    SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
24*4882a593Smuzhiyun    LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
25*4882a593Smuzhiyun    DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
26*4882a593Smuzhiyun    THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
27*4882a593Smuzhiyun    (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
28*4882a593Smuzhiyun    OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
29*4882a593Smuzhiyun */
30*4882a593Smuzhiyun 
31*4882a593Smuzhiyun #ifndef H_QXL_DEV
32*4882a593Smuzhiyun #define H_QXL_DEV
33*4882a593Smuzhiyun 
34*4882a593Smuzhiyun #include <linux/types.h>
35*4882a593Smuzhiyun 
36*4882a593Smuzhiyun /*
37*4882a593Smuzhiyun  * from spice-protocol
38*4882a593Smuzhiyun  * Release 0.10.0
39*4882a593Smuzhiyun  */
40*4882a593Smuzhiyun 
41*4882a593Smuzhiyun /* enums.h */
42*4882a593Smuzhiyun 
43*4882a593Smuzhiyun enum SpiceImageType {
44*4882a593Smuzhiyun 	SPICE_IMAGE_TYPE_BITMAP,
45*4882a593Smuzhiyun 	SPICE_IMAGE_TYPE_QUIC,
46*4882a593Smuzhiyun 	SPICE_IMAGE_TYPE_RESERVED,
47*4882a593Smuzhiyun 	SPICE_IMAGE_TYPE_LZ_PLT = 100,
48*4882a593Smuzhiyun 	SPICE_IMAGE_TYPE_LZ_RGB,
49*4882a593Smuzhiyun 	SPICE_IMAGE_TYPE_GLZ_RGB,
50*4882a593Smuzhiyun 	SPICE_IMAGE_TYPE_FROM_CACHE,
51*4882a593Smuzhiyun 	SPICE_IMAGE_TYPE_SURFACE,
52*4882a593Smuzhiyun 	SPICE_IMAGE_TYPE_JPEG,
53*4882a593Smuzhiyun 	SPICE_IMAGE_TYPE_FROM_CACHE_LOSSLESS,
54*4882a593Smuzhiyun 	SPICE_IMAGE_TYPE_ZLIB_GLZ_RGB,
55*4882a593Smuzhiyun 	SPICE_IMAGE_TYPE_JPEG_ALPHA,
56*4882a593Smuzhiyun 
57*4882a593Smuzhiyun 	SPICE_IMAGE_TYPE_ENUM_END
58*4882a593Smuzhiyun };
59*4882a593Smuzhiyun 
60*4882a593Smuzhiyun enum SpiceBitmapFmt {
61*4882a593Smuzhiyun 	SPICE_BITMAP_FMT_INVALID,
62*4882a593Smuzhiyun 	SPICE_BITMAP_FMT_1BIT_LE,
63*4882a593Smuzhiyun 	SPICE_BITMAP_FMT_1BIT_BE,
64*4882a593Smuzhiyun 	SPICE_BITMAP_FMT_4BIT_LE,
65*4882a593Smuzhiyun 	SPICE_BITMAP_FMT_4BIT_BE,
66*4882a593Smuzhiyun 	SPICE_BITMAP_FMT_8BIT,
67*4882a593Smuzhiyun 	SPICE_BITMAP_FMT_16BIT,
68*4882a593Smuzhiyun 	SPICE_BITMAP_FMT_24BIT,
69*4882a593Smuzhiyun 	SPICE_BITMAP_FMT_32BIT,
70*4882a593Smuzhiyun 	SPICE_BITMAP_FMT_RGBA,
71*4882a593Smuzhiyun 
72*4882a593Smuzhiyun 	SPICE_BITMAP_FMT_ENUM_END
73*4882a593Smuzhiyun };
74*4882a593Smuzhiyun 
75*4882a593Smuzhiyun enum SpiceSurfaceFmt {
76*4882a593Smuzhiyun 	SPICE_SURFACE_FMT_INVALID,
77*4882a593Smuzhiyun 	SPICE_SURFACE_FMT_1_A,
78*4882a593Smuzhiyun 	SPICE_SURFACE_FMT_8_A = 8,
79*4882a593Smuzhiyun 	SPICE_SURFACE_FMT_16_555 = 16,
80*4882a593Smuzhiyun 	SPICE_SURFACE_FMT_32_xRGB = 32,
81*4882a593Smuzhiyun 	SPICE_SURFACE_FMT_16_565 = 80,
82*4882a593Smuzhiyun 	SPICE_SURFACE_FMT_32_ARGB = 96,
83*4882a593Smuzhiyun 
84*4882a593Smuzhiyun 	SPICE_SURFACE_FMT_ENUM_END
85*4882a593Smuzhiyun };
86*4882a593Smuzhiyun 
87*4882a593Smuzhiyun enum SpiceClipType {
88*4882a593Smuzhiyun 	SPICE_CLIP_TYPE_NONE,
89*4882a593Smuzhiyun 	SPICE_CLIP_TYPE_RECTS,
90*4882a593Smuzhiyun 
91*4882a593Smuzhiyun 	SPICE_CLIP_TYPE_ENUM_END
92*4882a593Smuzhiyun };
93*4882a593Smuzhiyun 
94*4882a593Smuzhiyun enum SpiceRopd {
95*4882a593Smuzhiyun 	SPICE_ROPD_INVERS_SRC = (1 << 0),
96*4882a593Smuzhiyun 	SPICE_ROPD_INVERS_BRUSH = (1 << 1),
97*4882a593Smuzhiyun 	SPICE_ROPD_INVERS_DEST = (1 << 2),
98*4882a593Smuzhiyun 	SPICE_ROPD_OP_PUT = (1 << 3),
99*4882a593Smuzhiyun 	SPICE_ROPD_OP_OR = (1 << 4),
100*4882a593Smuzhiyun 	SPICE_ROPD_OP_AND = (1 << 5),
101*4882a593Smuzhiyun 	SPICE_ROPD_OP_XOR = (1 << 6),
102*4882a593Smuzhiyun 	SPICE_ROPD_OP_BLACKNESS = (1 << 7),
103*4882a593Smuzhiyun 	SPICE_ROPD_OP_WHITENESS = (1 << 8),
104*4882a593Smuzhiyun 	SPICE_ROPD_OP_INVERS = (1 << 9),
105*4882a593Smuzhiyun 	SPICE_ROPD_INVERS_RES = (1 << 10),
106*4882a593Smuzhiyun 
107*4882a593Smuzhiyun 	SPICE_ROPD_MASK = 0x7ff
108*4882a593Smuzhiyun };
109*4882a593Smuzhiyun 
110*4882a593Smuzhiyun enum SpiceBrushType {
111*4882a593Smuzhiyun 	SPICE_BRUSH_TYPE_NONE,
112*4882a593Smuzhiyun 	SPICE_BRUSH_TYPE_SOLID,
113*4882a593Smuzhiyun 	SPICE_BRUSH_TYPE_PATTERN,
114*4882a593Smuzhiyun 
115*4882a593Smuzhiyun 	SPICE_BRUSH_TYPE_ENUM_END
116*4882a593Smuzhiyun };
117*4882a593Smuzhiyun 
118*4882a593Smuzhiyun enum SpiceCursorType {
119*4882a593Smuzhiyun 	SPICE_CURSOR_TYPE_ALPHA,
120*4882a593Smuzhiyun 	SPICE_CURSOR_TYPE_MONO,
121*4882a593Smuzhiyun 	SPICE_CURSOR_TYPE_COLOR4,
122*4882a593Smuzhiyun 	SPICE_CURSOR_TYPE_COLOR8,
123*4882a593Smuzhiyun 	SPICE_CURSOR_TYPE_COLOR16,
124*4882a593Smuzhiyun 	SPICE_CURSOR_TYPE_COLOR24,
125*4882a593Smuzhiyun 	SPICE_CURSOR_TYPE_COLOR32,
126*4882a593Smuzhiyun 
127*4882a593Smuzhiyun 	SPICE_CURSOR_TYPE_ENUM_END
128*4882a593Smuzhiyun };
129*4882a593Smuzhiyun 
130*4882a593Smuzhiyun /* qxl_dev.h */
131*4882a593Smuzhiyun 
132*4882a593Smuzhiyun #pragma pack(push, 1)
133*4882a593Smuzhiyun 
134*4882a593Smuzhiyun /* 0x100-0x11f reserved for spice, 0x1ff used for unstable work */
135*4882a593Smuzhiyun #define QXL_DEVICE_ID_STABLE 0x0100
136*4882a593Smuzhiyun 
137*4882a593Smuzhiyun enum {
138*4882a593Smuzhiyun 	QXL_REVISION_STABLE_V04 = 0x01,
139*4882a593Smuzhiyun 	QXL_REVISION_STABLE_V06 = 0x02,
140*4882a593Smuzhiyun 	QXL_REVISION_STABLE_V10 = 0x03,
141*4882a593Smuzhiyun 	QXL_REVISION_STABLE_V12 = 0x04,
142*4882a593Smuzhiyun };
143*4882a593Smuzhiyun 
144*4882a593Smuzhiyun #define QXL_DEVICE_ID_DEVEL 0x01ff
145*4882a593Smuzhiyun #define QXL_REVISION_DEVEL 0x01
146*4882a593Smuzhiyun 
147*4882a593Smuzhiyun #define QXL_ROM_MAGIC (*(uint32_t *)"QXRO")
148*4882a593Smuzhiyun #define QXL_RAM_MAGIC (*(uint32_t *)"QXRA")
149*4882a593Smuzhiyun 
150*4882a593Smuzhiyun enum {
151*4882a593Smuzhiyun 	QXL_RAM_RANGE_INDEX,
152*4882a593Smuzhiyun 	QXL_VRAM_RANGE_INDEX,
153*4882a593Smuzhiyun 	QXL_ROM_RANGE_INDEX,
154*4882a593Smuzhiyun 	QXL_IO_RANGE_INDEX,
155*4882a593Smuzhiyun 
156*4882a593Smuzhiyun 	QXL_PCI_RANGES
157*4882a593Smuzhiyun };
158*4882a593Smuzhiyun 
159*4882a593Smuzhiyun /* qxl-1 compat: append only */
160*4882a593Smuzhiyun enum {
161*4882a593Smuzhiyun 	QXL_IO_NOTIFY_CMD,
162*4882a593Smuzhiyun 	QXL_IO_NOTIFY_CURSOR,
163*4882a593Smuzhiyun 	QXL_IO_UPDATE_AREA,
164*4882a593Smuzhiyun 	QXL_IO_UPDATE_IRQ,
165*4882a593Smuzhiyun 	QXL_IO_NOTIFY_OOM,
166*4882a593Smuzhiyun 	QXL_IO_RESET,
167*4882a593Smuzhiyun 	QXL_IO_SET_MODE,                  /* qxl-1 */
168*4882a593Smuzhiyun 	QXL_IO_LOG,
169*4882a593Smuzhiyun 	/* appended for qxl-2 */
170*4882a593Smuzhiyun 	QXL_IO_MEMSLOT_ADD,
171*4882a593Smuzhiyun 	QXL_IO_MEMSLOT_DEL,
172*4882a593Smuzhiyun 	QXL_IO_DETACH_PRIMARY,
173*4882a593Smuzhiyun 	QXL_IO_ATTACH_PRIMARY,
174*4882a593Smuzhiyun 	QXL_IO_CREATE_PRIMARY,
175*4882a593Smuzhiyun 	QXL_IO_DESTROY_PRIMARY,
176*4882a593Smuzhiyun 	QXL_IO_DESTROY_SURFACE_WAIT,
177*4882a593Smuzhiyun 	QXL_IO_DESTROY_ALL_SURFACES,
178*4882a593Smuzhiyun 	/* appended for qxl-3 */
179*4882a593Smuzhiyun 	QXL_IO_UPDATE_AREA_ASYNC,
180*4882a593Smuzhiyun 	QXL_IO_MEMSLOT_ADD_ASYNC,
181*4882a593Smuzhiyun 	QXL_IO_CREATE_PRIMARY_ASYNC,
182*4882a593Smuzhiyun 	QXL_IO_DESTROY_PRIMARY_ASYNC,
183*4882a593Smuzhiyun 	QXL_IO_DESTROY_SURFACE_ASYNC,
184*4882a593Smuzhiyun 	QXL_IO_DESTROY_ALL_SURFACES_ASYNC,
185*4882a593Smuzhiyun 	QXL_IO_FLUSH_SURFACES_ASYNC,
186*4882a593Smuzhiyun 	QXL_IO_FLUSH_RELEASE,
187*4882a593Smuzhiyun 	/* appended for qxl-4 */
188*4882a593Smuzhiyun 	QXL_IO_MONITORS_CONFIG_ASYNC,
189*4882a593Smuzhiyun 
190*4882a593Smuzhiyun 	QXL_IO_RANGE_SIZE
191*4882a593Smuzhiyun };
192*4882a593Smuzhiyun 
193*4882a593Smuzhiyun typedef uint64_t QXLPHYSICAL;
194*4882a593Smuzhiyun typedef int32_t QXLFIXED; /* fixed 28.4 */
195*4882a593Smuzhiyun 
196*4882a593Smuzhiyun struct qxl_point_fix {
197*4882a593Smuzhiyun 	QXLFIXED x;
198*4882a593Smuzhiyun 	QXLFIXED y;
199*4882a593Smuzhiyun };
200*4882a593Smuzhiyun 
201*4882a593Smuzhiyun struct qxl_point {
202*4882a593Smuzhiyun 	int32_t x;
203*4882a593Smuzhiyun 	int32_t y;
204*4882a593Smuzhiyun };
205*4882a593Smuzhiyun 
206*4882a593Smuzhiyun struct qxl_point_1_6 {
207*4882a593Smuzhiyun 	int16_t x;
208*4882a593Smuzhiyun 	int16_t y;
209*4882a593Smuzhiyun };
210*4882a593Smuzhiyun 
211*4882a593Smuzhiyun struct qxl_rect {
212*4882a593Smuzhiyun 	int32_t top;
213*4882a593Smuzhiyun 	int32_t left;
214*4882a593Smuzhiyun 	int32_t bottom;
215*4882a593Smuzhiyun 	int32_t right;
216*4882a593Smuzhiyun };
217*4882a593Smuzhiyun 
218*4882a593Smuzhiyun struct qxl_urect {
219*4882a593Smuzhiyun 	uint32_t top;
220*4882a593Smuzhiyun 	uint32_t left;
221*4882a593Smuzhiyun 	uint32_t bottom;
222*4882a593Smuzhiyun 	uint32_t right;
223*4882a593Smuzhiyun };
224*4882a593Smuzhiyun 
225*4882a593Smuzhiyun /* qxl-1 compat: append only */
226*4882a593Smuzhiyun struct qxl_rom {
227*4882a593Smuzhiyun 	uint32_t magic;
228*4882a593Smuzhiyun 	uint32_t id;
229*4882a593Smuzhiyun 	uint32_t update_id;
230*4882a593Smuzhiyun 	uint32_t compression_level;
231*4882a593Smuzhiyun 	uint32_t log_level;
232*4882a593Smuzhiyun 	uint32_t mode;			  /* qxl-1 */
233*4882a593Smuzhiyun 	uint32_t modes_offset;
234*4882a593Smuzhiyun 	uint32_t num_io_pages;
235*4882a593Smuzhiyun 	uint32_t pages_offset;		  /* qxl-1 */
236*4882a593Smuzhiyun 	uint32_t draw_area_offset;	  /* qxl-1 */
237*4882a593Smuzhiyun 	uint32_t surface0_area_size;	  /* qxl-1 name: draw_area_size */
238*4882a593Smuzhiyun 	uint32_t ram_header_offset;
239*4882a593Smuzhiyun 	uint32_t mm_clock;
240*4882a593Smuzhiyun 	/* appended for qxl-2 */
241*4882a593Smuzhiyun 	uint32_t n_surfaces;
242*4882a593Smuzhiyun 	uint64_t flags;
243*4882a593Smuzhiyun 	uint8_t slots_start;
244*4882a593Smuzhiyun 	uint8_t slots_end;
245*4882a593Smuzhiyun 	uint8_t slot_gen_bits;
246*4882a593Smuzhiyun 	uint8_t slot_id_bits;
247*4882a593Smuzhiyun 	uint8_t slot_generation;
248*4882a593Smuzhiyun 	/* appended for qxl-4 */
249*4882a593Smuzhiyun 	uint8_t client_present;
250*4882a593Smuzhiyun 	uint8_t client_capabilities[58];
251*4882a593Smuzhiyun 	uint32_t client_monitors_config_crc;
252*4882a593Smuzhiyun 	struct {
253*4882a593Smuzhiyun 		uint16_t count;
254*4882a593Smuzhiyun 	uint16_t padding;
255*4882a593Smuzhiyun 		struct qxl_urect heads[64];
256*4882a593Smuzhiyun 	} client_monitors_config;
257*4882a593Smuzhiyun };
258*4882a593Smuzhiyun 
259*4882a593Smuzhiyun /* qxl-1 compat: fixed */
260*4882a593Smuzhiyun struct qxl_mode {
261*4882a593Smuzhiyun 	uint32_t id;
262*4882a593Smuzhiyun 	uint32_t x_res;
263*4882a593Smuzhiyun 	uint32_t y_res;
264*4882a593Smuzhiyun 	uint32_t bits;
265*4882a593Smuzhiyun 	uint32_t stride;
266*4882a593Smuzhiyun 	uint32_t x_mili;
267*4882a593Smuzhiyun 	uint32_t y_mili;
268*4882a593Smuzhiyun 	uint32_t orientation;
269*4882a593Smuzhiyun };
270*4882a593Smuzhiyun 
271*4882a593Smuzhiyun /* qxl-1 compat: fixed */
272*4882a593Smuzhiyun struct qxl_modes {
273*4882a593Smuzhiyun 	uint32_t n_modes;
274*4882a593Smuzhiyun 	struct qxl_mode modes[0];
275*4882a593Smuzhiyun };
276*4882a593Smuzhiyun 
277*4882a593Smuzhiyun /* qxl-1 compat: append only */
278*4882a593Smuzhiyun enum qxl_cmd_type {
279*4882a593Smuzhiyun 	QXL_CMD_NOP,
280*4882a593Smuzhiyun 	QXL_CMD_DRAW,
281*4882a593Smuzhiyun 	QXL_CMD_UPDATE,
282*4882a593Smuzhiyun 	QXL_CMD_CURSOR,
283*4882a593Smuzhiyun 	QXL_CMD_MESSAGE,
284*4882a593Smuzhiyun 	QXL_CMD_SURFACE,
285*4882a593Smuzhiyun };
286*4882a593Smuzhiyun 
287*4882a593Smuzhiyun /* qxl-1 compat: fixed */
288*4882a593Smuzhiyun struct qxl_command {
289*4882a593Smuzhiyun 	QXLPHYSICAL data;
290*4882a593Smuzhiyun 	uint32_t type;
291*4882a593Smuzhiyun 	uint32_t padding;
292*4882a593Smuzhiyun };
293*4882a593Smuzhiyun 
294*4882a593Smuzhiyun #define QXL_COMMAND_FLAG_COMPAT		(1<<0)
295*4882a593Smuzhiyun #define QXL_COMMAND_FLAG_COMPAT_16BPP	(2<<0)
296*4882a593Smuzhiyun 
297*4882a593Smuzhiyun struct qxl_command_ext {
298*4882a593Smuzhiyun 	struct qxl_command cmd;
299*4882a593Smuzhiyun 	uint32_t group_id;
300*4882a593Smuzhiyun 	uint32_t flags;
301*4882a593Smuzhiyun };
302*4882a593Smuzhiyun 
303*4882a593Smuzhiyun struct qxl_mem_slot {
304*4882a593Smuzhiyun 	uint64_t mem_start;
305*4882a593Smuzhiyun 	uint64_t mem_end;
306*4882a593Smuzhiyun };
307*4882a593Smuzhiyun 
308*4882a593Smuzhiyun #define QXL_SURF_TYPE_PRIMARY	   0
309*4882a593Smuzhiyun 
310*4882a593Smuzhiyun #define QXL_SURF_FLAG_KEEP_DATA	   (1 << 0)
311*4882a593Smuzhiyun 
312*4882a593Smuzhiyun struct qxl_surface_create {
313*4882a593Smuzhiyun 	uint32_t width;
314*4882a593Smuzhiyun 	uint32_t height;
315*4882a593Smuzhiyun 	int32_t stride;
316*4882a593Smuzhiyun 	uint32_t format;
317*4882a593Smuzhiyun 	uint32_t position;
318*4882a593Smuzhiyun 	uint32_t mouse_mode;
319*4882a593Smuzhiyun 	uint32_t flags;
320*4882a593Smuzhiyun 	uint32_t type;
321*4882a593Smuzhiyun 	QXLPHYSICAL mem;
322*4882a593Smuzhiyun };
323*4882a593Smuzhiyun 
324*4882a593Smuzhiyun #define QXL_COMMAND_RING_SIZE 32
325*4882a593Smuzhiyun #define QXL_CURSOR_RING_SIZE 32
326*4882a593Smuzhiyun #define QXL_RELEASE_RING_SIZE 8
327*4882a593Smuzhiyun 
328*4882a593Smuzhiyun #define QXL_LOG_BUF_SIZE 4096
329*4882a593Smuzhiyun 
330*4882a593Smuzhiyun #define QXL_INTERRUPT_DISPLAY (1 << 0)
331*4882a593Smuzhiyun #define QXL_INTERRUPT_CURSOR (1 << 1)
332*4882a593Smuzhiyun #define QXL_INTERRUPT_IO_CMD (1 << 2)
333*4882a593Smuzhiyun #define QXL_INTERRUPT_ERROR  (1 << 3)
334*4882a593Smuzhiyun #define QXL_INTERRUPT_CLIENT (1 << 4)
335*4882a593Smuzhiyun #define QXL_INTERRUPT_CLIENT_MONITORS_CONFIG  (1 << 5)
336*4882a593Smuzhiyun 
337*4882a593Smuzhiyun struct qxl_ring_header {
338*4882a593Smuzhiyun 	uint32_t num_items;
339*4882a593Smuzhiyun 	uint32_t prod;
340*4882a593Smuzhiyun 	uint32_t notify_on_prod;
341*4882a593Smuzhiyun 	uint32_t cons;
342*4882a593Smuzhiyun 	uint32_t notify_on_cons;
343*4882a593Smuzhiyun };
344*4882a593Smuzhiyun 
345*4882a593Smuzhiyun /* qxl-1 compat: append only */
346*4882a593Smuzhiyun struct qxl_ram_header {
347*4882a593Smuzhiyun 	uint32_t magic;
348*4882a593Smuzhiyun 	uint32_t int_pending;
349*4882a593Smuzhiyun 	uint32_t int_mask;
350*4882a593Smuzhiyun 	uint8_t log_buf[QXL_LOG_BUF_SIZE];
351*4882a593Smuzhiyun 	struct qxl_ring_header  cmd_ring_hdr;
352*4882a593Smuzhiyun 	struct qxl_command	cmd_ring[QXL_COMMAND_RING_SIZE];
353*4882a593Smuzhiyun 	struct qxl_ring_header  cursor_ring_hdr;
354*4882a593Smuzhiyun 	struct qxl_command	cursor_ring[QXL_CURSOR_RING_SIZE];
355*4882a593Smuzhiyun 	struct qxl_ring_header  release_ring_hdr;
356*4882a593Smuzhiyun 	uint64_t		release_ring[QXL_RELEASE_RING_SIZE];
357*4882a593Smuzhiyun 	struct qxl_rect update_area;
358*4882a593Smuzhiyun 	/* appended for qxl-2 */
359*4882a593Smuzhiyun 	uint32_t update_surface;
360*4882a593Smuzhiyun 	struct qxl_mem_slot mem_slot;
361*4882a593Smuzhiyun 	struct qxl_surface_create create_surface;
362*4882a593Smuzhiyun 	uint64_t flags;
363*4882a593Smuzhiyun 
364*4882a593Smuzhiyun 	/* appended for qxl-4 */
365*4882a593Smuzhiyun 
366*4882a593Smuzhiyun 	/* used by QXL_IO_MONITORS_CONFIG_ASYNC */
367*4882a593Smuzhiyun 	QXLPHYSICAL monitors_config;
368*4882a593Smuzhiyun 	uint8_t guest_capabilities[64];
369*4882a593Smuzhiyun };
370*4882a593Smuzhiyun 
371*4882a593Smuzhiyun union qxl_release_info {
372*4882a593Smuzhiyun 	uint64_t id;	  /* in  */
373*4882a593Smuzhiyun 	uint64_t next;	  /* out */
374*4882a593Smuzhiyun };
375*4882a593Smuzhiyun 
376*4882a593Smuzhiyun struct qxl_release_info_ext {
377*4882a593Smuzhiyun 	union qxl_release_info *info;
378*4882a593Smuzhiyun 	uint32_t group_id;
379*4882a593Smuzhiyun };
380*4882a593Smuzhiyun 
381*4882a593Smuzhiyun struct qxl_data_chunk {
382*4882a593Smuzhiyun 	uint32_t data_size;
383*4882a593Smuzhiyun 	QXLPHYSICAL prev_chunk;
384*4882a593Smuzhiyun 	QXLPHYSICAL next_chunk;
385*4882a593Smuzhiyun 	uint8_t data[0];
386*4882a593Smuzhiyun };
387*4882a593Smuzhiyun 
388*4882a593Smuzhiyun struct qxl_message {
389*4882a593Smuzhiyun 	union qxl_release_info release_info;
390*4882a593Smuzhiyun 	uint8_t data[0];
391*4882a593Smuzhiyun };
392*4882a593Smuzhiyun 
393*4882a593Smuzhiyun struct qxl_compat_update_cmd {
394*4882a593Smuzhiyun 	union qxl_release_info release_info;
395*4882a593Smuzhiyun 	struct qxl_rect area;
396*4882a593Smuzhiyun 	uint32_t update_id;
397*4882a593Smuzhiyun };
398*4882a593Smuzhiyun 
399*4882a593Smuzhiyun struct qxl_update_cmd {
400*4882a593Smuzhiyun 	union qxl_release_info release_info;
401*4882a593Smuzhiyun 	struct qxl_rect area;
402*4882a593Smuzhiyun 	uint32_t update_id;
403*4882a593Smuzhiyun 	uint32_t surface_id;
404*4882a593Smuzhiyun };
405*4882a593Smuzhiyun 
406*4882a593Smuzhiyun struct qxl_cursor_header {
407*4882a593Smuzhiyun 	uint64_t unique;
408*4882a593Smuzhiyun 	uint16_t type;
409*4882a593Smuzhiyun 	uint16_t width;
410*4882a593Smuzhiyun 	uint16_t height;
411*4882a593Smuzhiyun 	uint16_t hot_spot_x;
412*4882a593Smuzhiyun 	uint16_t hot_spot_y;
413*4882a593Smuzhiyun };
414*4882a593Smuzhiyun 
415*4882a593Smuzhiyun struct qxl_cursor {
416*4882a593Smuzhiyun 	struct qxl_cursor_header header;
417*4882a593Smuzhiyun 	uint32_t data_size;
418*4882a593Smuzhiyun 	struct qxl_data_chunk chunk;
419*4882a593Smuzhiyun };
420*4882a593Smuzhiyun 
421*4882a593Smuzhiyun enum {
422*4882a593Smuzhiyun 	QXL_CURSOR_SET,
423*4882a593Smuzhiyun 	QXL_CURSOR_MOVE,
424*4882a593Smuzhiyun 	QXL_CURSOR_HIDE,
425*4882a593Smuzhiyun 	QXL_CURSOR_TRAIL,
426*4882a593Smuzhiyun };
427*4882a593Smuzhiyun 
428*4882a593Smuzhiyun #define QXL_CURSOR_DEVICE_DATA_SIZE 128
429*4882a593Smuzhiyun 
430*4882a593Smuzhiyun struct qxl_cursor_cmd {
431*4882a593Smuzhiyun 	union qxl_release_info release_info;
432*4882a593Smuzhiyun 	uint8_t type;
433*4882a593Smuzhiyun 	union {
434*4882a593Smuzhiyun 		struct {
435*4882a593Smuzhiyun 			struct qxl_point_1_6 position;
436*4882a593Smuzhiyun 			uint8_t visible;
437*4882a593Smuzhiyun 			QXLPHYSICAL shape;
438*4882a593Smuzhiyun 		} set;
439*4882a593Smuzhiyun 		struct {
440*4882a593Smuzhiyun 			uint16_t length;
441*4882a593Smuzhiyun 			uint16_t frequency;
442*4882a593Smuzhiyun 		} trail;
443*4882a593Smuzhiyun 		struct qxl_point_1_6 position;
444*4882a593Smuzhiyun 	} u;
445*4882a593Smuzhiyun 	/* todo: dynamic size from rom */
446*4882a593Smuzhiyun 	uint8_t device_data[QXL_CURSOR_DEVICE_DATA_SIZE];
447*4882a593Smuzhiyun };
448*4882a593Smuzhiyun 
449*4882a593Smuzhiyun enum {
450*4882a593Smuzhiyun 	QXL_DRAW_NOP,
451*4882a593Smuzhiyun 	QXL_DRAW_FILL,
452*4882a593Smuzhiyun 	QXL_DRAW_OPAQUE,
453*4882a593Smuzhiyun 	QXL_DRAW_COPY,
454*4882a593Smuzhiyun 	QXL_COPY_BITS,
455*4882a593Smuzhiyun 	QXL_DRAW_BLEND,
456*4882a593Smuzhiyun 	QXL_DRAW_BLACKNESS,
457*4882a593Smuzhiyun 	QXL_DRAW_WHITENESS,
458*4882a593Smuzhiyun 	QXL_DRAW_INVERS,
459*4882a593Smuzhiyun 	QXL_DRAW_ROP3,
460*4882a593Smuzhiyun 	QXL_DRAW_STROKE,
461*4882a593Smuzhiyun 	QXL_DRAW_TEXT,
462*4882a593Smuzhiyun 	QXL_DRAW_TRANSPARENT,
463*4882a593Smuzhiyun 	QXL_DRAW_ALPHA_BLEND,
464*4882a593Smuzhiyun 	QXL_DRAW_COMPOSITE
465*4882a593Smuzhiyun };
466*4882a593Smuzhiyun 
467*4882a593Smuzhiyun struct qxl_raster_glyph {
468*4882a593Smuzhiyun 	struct qxl_point render_pos;
469*4882a593Smuzhiyun 	struct qxl_point glyph_origin;
470*4882a593Smuzhiyun 	uint16_t width;
471*4882a593Smuzhiyun 	uint16_t height;
472*4882a593Smuzhiyun 	uint8_t data[0];
473*4882a593Smuzhiyun };
474*4882a593Smuzhiyun 
475*4882a593Smuzhiyun struct qxl_string {
476*4882a593Smuzhiyun 	uint32_t data_size;
477*4882a593Smuzhiyun 	uint16_t length;
478*4882a593Smuzhiyun 	uint16_t flags;
479*4882a593Smuzhiyun 	struct qxl_data_chunk chunk;
480*4882a593Smuzhiyun };
481*4882a593Smuzhiyun 
482*4882a593Smuzhiyun struct qxl_copy_bits {
483*4882a593Smuzhiyun 	struct qxl_point src_pos;
484*4882a593Smuzhiyun };
485*4882a593Smuzhiyun 
486*4882a593Smuzhiyun enum qxl_effect_type {
487*4882a593Smuzhiyun 	QXL_EFFECT_BLEND = 0,
488*4882a593Smuzhiyun 	QXL_EFFECT_OPAQUE = 1,
489*4882a593Smuzhiyun 	QXL_EFFECT_REVERT_ON_DUP = 2,
490*4882a593Smuzhiyun 	QXL_EFFECT_BLACKNESS_ON_DUP = 3,
491*4882a593Smuzhiyun 	QXL_EFFECT_WHITENESS_ON_DUP = 4,
492*4882a593Smuzhiyun 	QXL_EFFECT_NOP_ON_DUP = 5,
493*4882a593Smuzhiyun 	QXL_EFFECT_NOP = 6,
494*4882a593Smuzhiyun 	QXL_EFFECT_OPAQUE_BRUSH = 7
495*4882a593Smuzhiyun };
496*4882a593Smuzhiyun 
497*4882a593Smuzhiyun struct qxl_pattern {
498*4882a593Smuzhiyun 	QXLPHYSICAL pat;
499*4882a593Smuzhiyun 	struct qxl_point pos;
500*4882a593Smuzhiyun };
501*4882a593Smuzhiyun 
502*4882a593Smuzhiyun struct qxl_brush {
503*4882a593Smuzhiyun 	uint32_t type;
504*4882a593Smuzhiyun 	union {
505*4882a593Smuzhiyun 		uint32_t color;
506*4882a593Smuzhiyun 		struct qxl_pattern pattern;
507*4882a593Smuzhiyun 	} u;
508*4882a593Smuzhiyun };
509*4882a593Smuzhiyun 
510*4882a593Smuzhiyun struct qxl_q_mask {
511*4882a593Smuzhiyun 	uint8_t flags;
512*4882a593Smuzhiyun 	struct qxl_point pos;
513*4882a593Smuzhiyun 	QXLPHYSICAL bitmap;
514*4882a593Smuzhiyun };
515*4882a593Smuzhiyun 
516*4882a593Smuzhiyun struct qxl_fill {
517*4882a593Smuzhiyun 	struct qxl_brush brush;
518*4882a593Smuzhiyun 	uint16_t rop_descriptor;
519*4882a593Smuzhiyun 	struct qxl_q_mask mask;
520*4882a593Smuzhiyun };
521*4882a593Smuzhiyun 
522*4882a593Smuzhiyun struct qxl_opaque {
523*4882a593Smuzhiyun 	QXLPHYSICAL src_bitmap;
524*4882a593Smuzhiyun 	struct qxl_rect src_area;
525*4882a593Smuzhiyun 	struct qxl_brush brush;
526*4882a593Smuzhiyun 	uint16_t rop_descriptor;
527*4882a593Smuzhiyun 	uint8_t scale_mode;
528*4882a593Smuzhiyun 	struct qxl_q_mask mask;
529*4882a593Smuzhiyun };
530*4882a593Smuzhiyun 
531*4882a593Smuzhiyun struct qxl_copy {
532*4882a593Smuzhiyun 	QXLPHYSICAL src_bitmap;
533*4882a593Smuzhiyun 	struct qxl_rect src_area;
534*4882a593Smuzhiyun 	uint16_t rop_descriptor;
535*4882a593Smuzhiyun 	uint8_t scale_mode;
536*4882a593Smuzhiyun 	struct qxl_q_mask mask;
537*4882a593Smuzhiyun };
538*4882a593Smuzhiyun 
539*4882a593Smuzhiyun struct qxl_transparent {
540*4882a593Smuzhiyun 	QXLPHYSICAL src_bitmap;
541*4882a593Smuzhiyun 	struct qxl_rect src_area;
542*4882a593Smuzhiyun 	uint32_t src_color;
543*4882a593Smuzhiyun 	uint32_t true_color;
544*4882a593Smuzhiyun };
545*4882a593Smuzhiyun 
546*4882a593Smuzhiyun struct qxl_alpha_blend {
547*4882a593Smuzhiyun 	uint16_t alpha_flags;
548*4882a593Smuzhiyun 	uint8_t alpha;
549*4882a593Smuzhiyun 	QXLPHYSICAL src_bitmap;
550*4882a593Smuzhiyun 	struct qxl_rect src_area;
551*4882a593Smuzhiyun };
552*4882a593Smuzhiyun 
553*4882a593Smuzhiyun struct qxl_compat_alpha_blend {
554*4882a593Smuzhiyun 	uint8_t alpha;
555*4882a593Smuzhiyun 	QXLPHYSICAL src_bitmap;
556*4882a593Smuzhiyun 	struct qxl_rect src_area;
557*4882a593Smuzhiyun };
558*4882a593Smuzhiyun 
559*4882a593Smuzhiyun struct qxl_rop_3 {
560*4882a593Smuzhiyun 	QXLPHYSICAL src_bitmap;
561*4882a593Smuzhiyun 	struct qxl_rect src_area;
562*4882a593Smuzhiyun 	struct qxl_brush brush;
563*4882a593Smuzhiyun 	uint8_t rop3;
564*4882a593Smuzhiyun 	uint8_t scale_mode;
565*4882a593Smuzhiyun 	struct qxl_q_mask mask;
566*4882a593Smuzhiyun };
567*4882a593Smuzhiyun 
568*4882a593Smuzhiyun struct qxl_line_attr {
569*4882a593Smuzhiyun 	uint8_t flags;
570*4882a593Smuzhiyun 	uint8_t join_style;
571*4882a593Smuzhiyun 	uint8_t end_style;
572*4882a593Smuzhiyun 	uint8_t style_nseg;
573*4882a593Smuzhiyun 	QXLFIXED width;
574*4882a593Smuzhiyun 	QXLFIXED miter_limit;
575*4882a593Smuzhiyun 	QXLPHYSICAL style;
576*4882a593Smuzhiyun };
577*4882a593Smuzhiyun 
578*4882a593Smuzhiyun struct qxl_stroke {
579*4882a593Smuzhiyun 	QXLPHYSICAL path;
580*4882a593Smuzhiyun 	struct qxl_line_attr attr;
581*4882a593Smuzhiyun 	struct qxl_brush brush;
582*4882a593Smuzhiyun 	uint16_t fore_mode;
583*4882a593Smuzhiyun 	uint16_t back_mode;
584*4882a593Smuzhiyun };
585*4882a593Smuzhiyun 
586*4882a593Smuzhiyun struct qxl_text {
587*4882a593Smuzhiyun 	QXLPHYSICAL str;
588*4882a593Smuzhiyun 	struct qxl_rect back_area;
589*4882a593Smuzhiyun 	struct qxl_brush fore_brush;
590*4882a593Smuzhiyun 	struct qxl_brush back_brush;
591*4882a593Smuzhiyun 	uint16_t fore_mode;
592*4882a593Smuzhiyun 	uint16_t back_mode;
593*4882a593Smuzhiyun };
594*4882a593Smuzhiyun 
595*4882a593Smuzhiyun struct qxl_mask {
596*4882a593Smuzhiyun 	struct qxl_q_mask mask;
597*4882a593Smuzhiyun };
598*4882a593Smuzhiyun 
599*4882a593Smuzhiyun struct qxl_clip {
600*4882a593Smuzhiyun 	uint32_t type;
601*4882a593Smuzhiyun 	QXLPHYSICAL data;
602*4882a593Smuzhiyun };
603*4882a593Smuzhiyun 
604*4882a593Smuzhiyun enum qxl_operator {
605*4882a593Smuzhiyun 	QXL_OP_CLEAR			 = 0x00,
606*4882a593Smuzhiyun 	QXL_OP_SOURCE			 = 0x01,
607*4882a593Smuzhiyun 	QXL_OP_DST			 = 0x02,
608*4882a593Smuzhiyun 	QXL_OP_OVER			 = 0x03,
609*4882a593Smuzhiyun 	QXL_OP_OVER_REVERSE		 = 0x04,
610*4882a593Smuzhiyun 	QXL_OP_IN			 = 0x05,
611*4882a593Smuzhiyun 	QXL_OP_IN_REVERSE		 = 0x06,
612*4882a593Smuzhiyun 	QXL_OP_OUT			 = 0x07,
613*4882a593Smuzhiyun 	QXL_OP_OUT_REVERSE		 = 0x08,
614*4882a593Smuzhiyun 	QXL_OP_ATOP			 = 0x09,
615*4882a593Smuzhiyun 	QXL_OP_ATOP_REVERSE		 = 0x0a,
616*4882a593Smuzhiyun 	QXL_OP_XOR			 = 0x0b,
617*4882a593Smuzhiyun 	QXL_OP_ADD			 = 0x0c,
618*4882a593Smuzhiyun 	QXL_OP_SATURATE			 = 0x0d,
619*4882a593Smuzhiyun 	/* Note the jump here from 0x0d to 0x30 */
620*4882a593Smuzhiyun 	QXL_OP_MULTIPLY			 = 0x30,
621*4882a593Smuzhiyun 	QXL_OP_SCREEN			 = 0x31,
622*4882a593Smuzhiyun 	QXL_OP_OVERLAY			 = 0x32,
623*4882a593Smuzhiyun 	QXL_OP_DARKEN			 = 0x33,
624*4882a593Smuzhiyun 	QXL_OP_LIGHTEN			 = 0x34,
625*4882a593Smuzhiyun 	QXL_OP_COLOR_DODGE		 = 0x35,
626*4882a593Smuzhiyun 	QXL_OP_COLOR_BURN		 = 0x36,
627*4882a593Smuzhiyun 	QXL_OP_HARD_LIGHT		 = 0x37,
628*4882a593Smuzhiyun 	QXL_OP_SOFT_LIGHT		 = 0x38,
629*4882a593Smuzhiyun 	QXL_OP_DIFFERENCE		 = 0x39,
630*4882a593Smuzhiyun 	QXL_OP_EXCLUSION		 = 0x3a,
631*4882a593Smuzhiyun 	QXL_OP_HSL_HUE			 = 0x3b,
632*4882a593Smuzhiyun 	QXL_OP_HSL_SATURATION		 = 0x3c,
633*4882a593Smuzhiyun 	QXL_OP_HSL_COLOR		 = 0x3d,
634*4882a593Smuzhiyun 	QXL_OP_HSL_LUMINOSITY		 = 0x3e
635*4882a593Smuzhiyun };
636*4882a593Smuzhiyun 
637*4882a593Smuzhiyun struct qxl_transform {
638*4882a593Smuzhiyun 	uint32_t	t00;
639*4882a593Smuzhiyun 	uint32_t	t01;
640*4882a593Smuzhiyun 	uint32_t	t02;
641*4882a593Smuzhiyun 	uint32_t	t10;
642*4882a593Smuzhiyun 	uint32_t	t11;
643*4882a593Smuzhiyun 	uint32_t	t12;
644*4882a593Smuzhiyun };
645*4882a593Smuzhiyun 
646*4882a593Smuzhiyun /* The flags field has the following bit fields:
647*4882a593Smuzhiyun  *
648*4882a593Smuzhiyun  *     operator:		[  0 -  7 ]
649*4882a593Smuzhiyun  *     src_filter:		[  8 - 10 ]
650*4882a593Smuzhiyun  *     mask_filter:		[ 11 - 13 ]
651*4882a593Smuzhiyun  *     src_repeat:		[ 14 - 15 ]
652*4882a593Smuzhiyun  *     mask_repeat:		[ 16 - 17 ]
653*4882a593Smuzhiyun  *     component_alpha:		[ 18 - 18 ]
654*4882a593Smuzhiyun  *     reserved:		[ 19 - 31 ]
655*4882a593Smuzhiyun  *
656*4882a593Smuzhiyun  * The repeat and filter values are those of pixman:
657*4882a593Smuzhiyun  *		REPEAT_NONE =		0
658*4882a593Smuzhiyun  *              REPEAT_NORMAL =		1
659*4882a593Smuzhiyun  *		REPEAT_PAD =		2
660*4882a593Smuzhiyun  *		REPEAT_REFLECT =	3
661*4882a593Smuzhiyun  *
662*4882a593Smuzhiyun  * The filter values are:
663*4882a593Smuzhiyun  *		FILTER_NEAREST =	0
664*4882a593Smuzhiyun  *		FILTER_BILINEAR	=	1
665*4882a593Smuzhiyun  */
666*4882a593Smuzhiyun struct qxl_composite {
667*4882a593Smuzhiyun 	uint32_t		flags;
668*4882a593Smuzhiyun 
669*4882a593Smuzhiyun 	QXLPHYSICAL			src;
670*4882a593Smuzhiyun 	QXLPHYSICAL			src_transform;	/* May be NULL */
671*4882a593Smuzhiyun 	QXLPHYSICAL			mask;		/* May be NULL */
672*4882a593Smuzhiyun 	QXLPHYSICAL			mask_transform;	/* May be NULL */
673*4882a593Smuzhiyun 	struct qxl_point_1_6	src_origin;
674*4882a593Smuzhiyun 	struct qxl_point_1_6	mask_origin;
675*4882a593Smuzhiyun };
676*4882a593Smuzhiyun 
677*4882a593Smuzhiyun struct qxl_compat_drawable {
678*4882a593Smuzhiyun 	union qxl_release_info release_info;
679*4882a593Smuzhiyun 	uint8_t effect;
680*4882a593Smuzhiyun 	uint8_t type;
681*4882a593Smuzhiyun 	uint16_t bitmap_offset;
682*4882a593Smuzhiyun 	struct qxl_rect bitmap_area;
683*4882a593Smuzhiyun 	struct qxl_rect bbox;
684*4882a593Smuzhiyun 	struct qxl_clip clip;
685*4882a593Smuzhiyun 	uint32_t mm_time;
686*4882a593Smuzhiyun 	union {
687*4882a593Smuzhiyun 		struct qxl_fill fill;
688*4882a593Smuzhiyun 		struct qxl_opaque opaque;
689*4882a593Smuzhiyun 		struct qxl_copy copy;
690*4882a593Smuzhiyun 		struct qxl_transparent transparent;
691*4882a593Smuzhiyun 		struct qxl_compat_alpha_blend alpha_blend;
692*4882a593Smuzhiyun 		struct qxl_copy_bits copy_bits;
693*4882a593Smuzhiyun 		struct qxl_copy blend;
694*4882a593Smuzhiyun 		struct qxl_rop_3 rop3;
695*4882a593Smuzhiyun 		struct qxl_stroke stroke;
696*4882a593Smuzhiyun 		struct qxl_text text;
697*4882a593Smuzhiyun 		struct qxl_mask blackness;
698*4882a593Smuzhiyun 		struct qxl_mask invers;
699*4882a593Smuzhiyun 		struct qxl_mask whiteness;
700*4882a593Smuzhiyun 	} u;
701*4882a593Smuzhiyun };
702*4882a593Smuzhiyun 
703*4882a593Smuzhiyun struct qxl_drawable {
704*4882a593Smuzhiyun 	union qxl_release_info release_info;
705*4882a593Smuzhiyun 	uint32_t surface_id;
706*4882a593Smuzhiyun 	uint8_t effect;
707*4882a593Smuzhiyun 	uint8_t type;
708*4882a593Smuzhiyun 	uint8_t self_bitmap;
709*4882a593Smuzhiyun 	struct qxl_rect self_bitmap_area;
710*4882a593Smuzhiyun 	struct qxl_rect bbox;
711*4882a593Smuzhiyun 	struct qxl_clip clip;
712*4882a593Smuzhiyun 	uint32_t mm_time;
713*4882a593Smuzhiyun 	int32_t surfaces_dest[3];
714*4882a593Smuzhiyun 	struct qxl_rect surfaces_rects[3];
715*4882a593Smuzhiyun 	union {
716*4882a593Smuzhiyun 		struct qxl_fill fill;
717*4882a593Smuzhiyun 		struct qxl_opaque opaque;
718*4882a593Smuzhiyun 		struct qxl_copy copy;
719*4882a593Smuzhiyun 		struct qxl_transparent transparent;
720*4882a593Smuzhiyun 		struct qxl_alpha_blend alpha_blend;
721*4882a593Smuzhiyun 		struct qxl_copy_bits copy_bits;
722*4882a593Smuzhiyun 		struct qxl_copy blend;
723*4882a593Smuzhiyun 		struct qxl_rop_3 rop3;
724*4882a593Smuzhiyun 		struct qxl_stroke stroke;
725*4882a593Smuzhiyun 		struct qxl_text text;
726*4882a593Smuzhiyun 		struct qxl_mask blackness;
727*4882a593Smuzhiyun 		struct qxl_mask invers;
728*4882a593Smuzhiyun 		struct qxl_mask whiteness;
729*4882a593Smuzhiyun 		struct qxl_composite composite;
730*4882a593Smuzhiyun 	} u;
731*4882a593Smuzhiyun };
732*4882a593Smuzhiyun 
733*4882a593Smuzhiyun enum qxl_surface_cmd_type {
734*4882a593Smuzhiyun 	QXL_SURFACE_CMD_CREATE,
735*4882a593Smuzhiyun 	QXL_SURFACE_CMD_DESTROY,
736*4882a593Smuzhiyun };
737*4882a593Smuzhiyun 
738*4882a593Smuzhiyun struct qxl_surface {
739*4882a593Smuzhiyun 	uint32_t format;
740*4882a593Smuzhiyun 	uint32_t width;
741*4882a593Smuzhiyun 	uint32_t height;
742*4882a593Smuzhiyun 	int32_t stride;
743*4882a593Smuzhiyun 	QXLPHYSICAL data;
744*4882a593Smuzhiyun };
745*4882a593Smuzhiyun 
746*4882a593Smuzhiyun struct qxl_surface_cmd {
747*4882a593Smuzhiyun 	union qxl_release_info release_info;
748*4882a593Smuzhiyun 	uint32_t surface_id;
749*4882a593Smuzhiyun 	uint8_t type;
750*4882a593Smuzhiyun 	uint32_t flags;
751*4882a593Smuzhiyun 	union {
752*4882a593Smuzhiyun 		struct qxl_surface surface_create;
753*4882a593Smuzhiyun 	} u;
754*4882a593Smuzhiyun };
755*4882a593Smuzhiyun 
756*4882a593Smuzhiyun struct qxl_clip_rects {
757*4882a593Smuzhiyun 	uint32_t num_rects;
758*4882a593Smuzhiyun 	struct qxl_data_chunk chunk;
759*4882a593Smuzhiyun };
760*4882a593Smuzhiyun 
761*4882a593Smuzhiyun enum {
762*4882a593Smuzhiyun 	QXL_PATH_BEGIN = (1 << 0),
763*4882a593Smuzhiyun 	QXL_PATH_END = (1 << 1),
764*4882a593Smuzhiyun 	QXL_PATH_CLOSE = (1 << 3),
765*4882a593Smuzhiyun 	QXL_PATH_BEZIER = (1 << 4),
766*4882a593Smuzhiyun };
767*4882a593Smuzhiyun 
768*4882a593Smuzhiyun struct qxl_path_seg {
769*4882a593Smuzhiyun 	uint32_t flags;
770*4882a593Smuzhiyun 	uint32_t count;
771*4882a593Smuzhiyun 	struct qxl_point_fix points[0];
772*4882a593Smuzhiyun };
773*4882a593Smuzhiyun 
774*4882a593Smuzhiyun struct qxl_path {
775*4882a593Smuzhiyun 	uint32_t data_size;
776*4882a593Smuzhiyun 	struct qxl_data_chunk chunk;
777*4882a593Smuzhiyun };
778*4882a593Smuzhiyun 
779*4882a593Smuzhiyun enum {
780*4882a593Smuzhiyun 	QXL_IMAGE_GROUP_DRIVER,
781*4882a593Smuzhiyun 	QXL_IMAGE_GROUP_DEVICE,
782*4882a593Smuzhiyun 	QXL_IMAGE_GROUP_RED,
783*4882a593Smuzhiyun 	QXL_IMAGE_GROUP_DRIVER_DONT_CACHE,
784*4882a593Smuzhiyun };
785*4882a593Smuzhiyun 
786*4882a593Smuzhiyun struct qxl_image_id {
787*4882a593Smuzhiyun 	uint32_t group;
788*4882a593Smuzhiyun 	uint32_t unique;
789*4882a593Smuzhiyun };
790*4882a593Smuzhiyun 
791*4882a593Smuzhiyun union qxl_image_id_union {
792*4882a593Smuzhiyun 	struct qxl_image_id id;
793*4882a593Smuzhiyun 	uint64_t value;
794*4882a593Smuzhiyun };
795*4882a593Smuzhiyun 
796*4882a593Smuzhiyun enum qxl_image_flags {
797*4882a593Smuzhiyun 	QXL_IMAGE_CACHE = (1 << 0),
798*4882a593Smuzhiyun 	QXL_IMAGE_HIGH_BITS_SET = (1 << 1),
799*4882a593Smuzhiyun };
800*4882a593Smuzhiyun 
801*4882a593Smuzhiyun enum qxl_bitmap_flags {
802*4882a593Smuzhiyun 	QXL_BITMAP_DIRECT = (1 << 0),
803*4882a593Smuzhiyun 	QXL_BITMAP_UNSTABLE = (1 << 1),
804*4882a593Smuzhiyun 	QXL_BITMAP_TOP_DOWN = (1 << 2), /* == SPICE_BITMAP_FLAGS_TOP_DOWN */
805*4882a593Smuzhiyun };
806*4882a593Smuzhiyun 
807*4882a593Smuzhiyun #define QXL_SET_IMAGE_ID(image, _group, _unique) {              \
808*4882a593Smuzhiyun 	(image)->descriptor.id = (((uint64_t)_unique) << 32) | _group;	\
809*4882a593Smuzhiyun }
810*4882a593Smuzhiyun 
811*4882a593Smuzhiyun struct qxl_image_descriptor {
812*4882a593Smuzhiyun 	uint64_t id;
813*4882a593Smuzhiyun 	uint8_t type;
814*4882a593Smuzhiyun 	uint8_t flags;
815*4882a593Smuzhiyun 	uint32_t width;
816*4882a593Smuzhiyun 	uint32_t height;
817*4882a593Smuzhiyun };
818*4882a593Smuzhiyun 
819*4882a593Smuzhiyun struct qxl_palette {
820*4882a593Smuzhiyun 	uint64_t unique;
821*4882a593Smuzhiyun 	uint16_t num_ents;
822*4882a593Smuzhiyun 	uint32_t ents[0];
823*4882a593Smuzhiyun };
824*4882a593Smuzhiyun 
825*4882a593Smuzhiyun struct qxl_bitmap {
826*4882a593Smuzhiyun 	uint8_t format;
827*4882a593Smuzhiyun 	uint8_t flags;
828*4882a593Smuzhiyun 	uint32_t x;
829*4882a593Smuzhiyun 	uint32_t y;
830*4882a593Smuzhiyun 	uint32_t stride;
831*4882a593Smuzhiyun 	QXLPHYSICAL palette;
832*4882a593Smuzhiyun 	QXLPHYSICAL data; /* data[0] ? */
833*4882a593Smuzhiyun };
834*4882a593Smuzhiyun 
835*4882a593Smuzhiyun struct qxl_surface_id {
836*4882a593Smuzhiyun 	uint32_t surface_id;
837*4882a593Smuzhiyun };
838*4882a593Smuzhiyun 
839*4882a593Smuzhiyun struct qxl_encoder_data {
840*4882a593Smuzhiyun 	uint32_t data_size;
841*4882a593Smuzhiyun 	uint8_t data[0];
842*4882a593Smuzhiyun };
843*4882a593Smuzhiyun 
844*4882a593Smuzhiyun struct qxl_image {
845*4882a593Smuzhiyun 	struct qxl_image_descriptor descriptor;
846*4882a593Smuzhiyun 	union { /* variable length */
847*4882a593Smuzhiyun 		struct qxl_bitmap bitmap;
848*4882a593Smuzhiyun 		struct qxl_encoder_data quic;
849*4882a593Smuzhiyun 		struct qxl_surface_id surface_image;
850*4882a593Smuzhiyun 	} u;
851*4882a593Smuzhiyun };
852*4882a593Smuzhiyun 
853*4882a593Smuzhiyun /* A QXLHead is a single monitor output backed by a QXLSurface.
854*4882a593Smuzhiyun  * x and y offsets are unsigned since they are used in relation to
855*4882a593Smuzhiyun  * the given surface, not the same as the x, y coordinates in the guest
856*4882a593Smuzhiyun  * screen reference frame. */
857*4882a593Smuzhiyun struct qxl_head {
858*4882a593Smuzhiyun 	uint32_t id;
859*4882a593Smuzhiyun 	uint32_t surface_id;
860*4882a593Smuzhiyun 	uint32_t width;
861*4882a593Smuzhiyun 	uint32_t height;
862*4882a593Smuzhiyun 	uint32_t x;
863*4882a593Smuzhiyun 	uint32_t y;
864*4882a593Smuzhiyun 	uint32_t flags;
865*4882a593Smuzhiyun };
866*4882a593Smuzhiyun 
867*4882a593Smuzhiyun struct qxl_monitors_config {
868*4882a593Smuzhiyun 	uint16_t count;
869*4882a593Smuzhiyun 	uint16_t max_allowed; /* If it is 0 no fixed limit is given by the
870*4882a593Smuzhiyun 				 driver */
871*4882a593Smuzhiyun 	struct qxl_head heads[0];
872*4882a593Smuzhiyun };
873*4882a593Smuzhiyun 
874*4882a593Smuzhiyun #pragma pack(pop)
875*4882a593Smuzhiyun 
876*4882a593Smuzhiyun #endif /* _H_QXL_DEV */
877