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