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