xref: /freebsd-src/sys/dev/virtio/gpu/virtio_gpu.h (revision 02f2706606e1a4364d10a313dade29a9d4cfffe1)
1*02f27066SAndrew Turner /*
2*02f27066SAndrew Turner  * Virtio GPU Device
3*02f27066SAndrew Turner  *
4*02f27066SAndrew Turner  * Copyright Red Hat, Inc. 2013-2014
5*02f27066SAndrew Turner  *
6*02f27066SAndrew Turner  * Authors:
7*02f27066SAndrew Turner  *     Dave Airlie <airlied@redhat.com>
8*02f27066SAndrew Turner  *     Gerd Hoffmann <kraxel@redhat.com>
9*02f27066SAndrew Turner  *
10*02f27066SAndrew Turner  * This header is BSD licensed so anyone can use the definitions
11*02f27066SAndrew Turner  * to implement compatible drivers/servers:
12*02f27066SAndrew Turner  *
13*02f27066SAndrew Turner  * Redistribution and use in source and binary forms, with or without
14*02f27066SAndrew Turner  * modification, are permitted provided that the following conditions
15*02f27066SAndrew Turner  * are met:
16*02f27066SAndrew Turner  * 1. Redistributions of source code must retain the above copyright
17*02f27066SAndrew Turner  *    notice, this list of conditions and the following disclaimer.
18*02f27066SAndrew Turner  * 2. Redistributions in binary form must reproduce the above copyright
19*02f27066SAndrew Turner  *    notice, this list of conditions and the following disclaimer in the
20*02f27066SAndrew Turner  *    documentation and/or other materials provided with the distribution.
21*02f27066SAndrew Turner  * 3. Neither the name of IBM nor the names of its contributors
22*02f27066SAndrew Turner  *    may be used to endorse or promote products derived from this software
23*02f27066SAndrew Turner  *    without specific prior written permission.
24*02f27066SAndrew Turner  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
25*02f27066SAndrew Turner  * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
26*02f27066SAndrew Turner  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
27*02f27066SAndrew Turner  * FOR A PARTICULAR PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL IBM OR
28*02f27066SAndrew Turner  * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
29*02f27066SAndrew Turner  * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
30*02f27066SAndrew Turner  * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
31*02f27066SAndrew Turner  * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
32*02f27066SAndrew Turner  * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
33*02f27066SAndrew Turner  * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
34*02f27066SAndrew Turner  * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
35*02f27066SAndrew Turner  * SUCH DAMAGE.
36*02f27066SAndrew Turner  */
37*02f27066SAndrew Turner 
38*02f27066SAndrew Turner #ifndef VIRTIO_GPU_HW_H
39*02f27066SAndrew Turner #define VIRTIO_GPU_HW_H
40*02f27066SAndrew Turner 
41*02f27066SAndrew Turner /*
42*02f27066SAndrew Turner  * VIRTIO_GPU_CMD_CTX_*
43*02f27066SAndrew Turner  * VIRTIO_GPU_CMD_*_3D
44*02f27066SAndrew Turner  */
45*02f27066SAndrew Turner #define VIRTIO_GPU_F_VIRGL               0
46*02f27066SAndrew Turner 
47*02f27066SAndrew Turner /*
48*02f27066SAndrew Turner  * VIRTIO_GPU_CMD_GET_EDID
49*02f27066SAndrew Turner  */
50*02f27066SAndrew Turner #define VIRTIO_GPU_F_EDID                1
51*02f27066SAndrew Turner /*
52*02f27066SAndrew Turner  * VIRTIO_GPU_CMD_RESOURCE_ASSIGN_UUID
53*02f27066SAndrew Turner  */
54*02f27066SAndrew Turner #define VIRTIO_GPU_F_RESOURCE_UUID       2
55*02f27066SAndrew Turner 
56*02f27066SAndrew Turner /*
57*02f27066SAndrew Turner  * VIRTIO_GPU_CMD_RESOURCE_CREATE_BLOB
58*02f27066SAndrew Turner  */
59*02f27066SAndrew Turner #define VIRTIO_GPU_F_RESOURCE_BLOB       3
60*02f27066SAndrew Turner /*
61*02f27066SAndrew Turner  * VIRTIO_GPU_CMD_CREATE_CONTEXT with
62*02f27066SAndrew Turner  * context_init and multiple timelines
63*02f27066SAndrew Turner  */
64*02f27066SAndrew Turner #define VIRTIO_GPU_F_CONTEXT_INIT        4
65*02f27066SAndrew Turner 
66*02f27066SAndrew Turner enum virtio_gpu_ctrl_type {
67*02f27066SAndrew Turner 	VIRTIO_GPU_UNDEFINED = 0,
68*02f27066SAndrew Turner 
69*02f27066SAndrew Turner 	/* 2d commands */
70*02f27066SAndrew Turner 	VIRTIO_GPU_CMD_GET_DISPLAY_INFO = 0x0100,
71*02f27066SAndrew Turner 	VIRTIO_GPU_CMD_RESOURCE_CREATE_2D,
72*02f27066SAndrew Turner 	VIRTIO_GPU_CMD_RESOURCE_UNREF,
73*02f27066SAndrew Turner 	VIRTIO_GPU_CMD_SET_SCANOUT,
74*02f27066SAndrew Turner 	VIRTIO_GPU_CMD_RESOURCE_FLUSH,
75*02f27066SAndrew Turner 	VIRTIO_GPU_CMD_TRANSFER_TO_HOST_2D,
76*02f27066SAndrew Turner 	VIRTIO_GPU_CMD_RESOURCE_ATTACH_BACKING,
77*02f27066SAndrew Turner 	VIRTIO_GPU_CMD_RESOURCE_DETACH_BACKING,
78*02f27066SAndrew Turner 	VIRTIO_GPU_CMD_GET_CAPSET_INFO,
79*02f27066SAndrew Turner 	VIRTIO_GPU_CMD_GET_CAPSET,
80*02f27066SAndrew Turner 	VIRTIO_GPU_CMD_GET_EDID,
81*02f27066SAndrew Turner 	VIRTIO_GPU_CMD_RESOURCE_ASSIGN_UUID,
82*02f27066SAndrew Turner 	VIRTIO_GPU_CMD_RESOURCE_CREATE_BLOB,
83*02f27066SAndrew Turner 	VIRTIO_GPU_CMD_SET_SCANOUT_BLOB,
84*02f27066SAndrew Turner 
85*02f27066SAndrew Turner 	/* 3d commands */
86*02f27066SAndrew Turner 	VIRTIO_GPU_CMD_CTX_CREATE = 0x0200,
87*02f27066SAndrew Turner 	VIRTIO_GPU_CMD_CTX_DESTROY,
88*02f27066SAndrew Turner 	VIRTIO_GPU_CMD_CTX_ATTACH_RESOURCE,
89*02f27066SAndrew Turner 	VIRTIO_GPU_CMD_CTX_DETACH_RESOURCE,
90*02f27066SAndrew Turner 	VIRTIO_GPU_CMD_RESOURCE_CREATE_3D,
91*02f27066SAndrew Turner 	VIRTIO_GPU_CMD_TRANSFER_TO_HOST_3D,
92*02f27066SAndrew Turner 	VIRTIO_GPU_CMD_TRANSFER_FROM_HOST_3D,
93*02f27066SAndrew Turner 	VIRTIO_GPU_CMD_SUBMIT_3D,
94*02f27066SAndrew Turner 	VIRTIO_GPU_CMD_RESOURCE_MAP_BLOB,
95*02f27066SAndrew Turner 	VIRTIO_GPU_CMD_RESOURCE_UNMAP_BLOB,
96*02f27066SAndrew Turner 
97*02f27066SAndrew Turner 	/* cursor commands */
98*02f27066SAndrew Turner 	VIRTIO_GPU_CMD_UPDATE_CURSOR = 0x0300,
99*02f27066SAndrew Turner 	VIRTIO_GPU_CMD_MOVE_CURSOR,
100*02f27066SAndrew Turner 
101*02f27066SAndrew Turner 	/* success responses */
102*02f27066SAndrew Turner 	VIRTIO_GPU_RESP_OK_NODATA = 0x1100,
103*02f27066SAndrew Turner 	VIRTIO_GPU_RESP_OK_DISPLAY_INFO,
104*02f27066SAndrew Turner 	VIRTIO_GPU_RESP_OK_CAPSET_INFO,
105*02f27066SAndrew Turner 	VIRTIO_GPU_RESP_OK_CAPSET,
106*02f27066SAndrew Turner 	VIRTIO_GPU_RESP_OK_EDID,
107*02f27066SAndrew Turner 	VIRTIO_GPU_RESP_OK_RESOURCE_UUID,
108*02f27066SAndrew Turner 	VIRTIO_GPU_RESP_OK_MAP_INFO,
109*02f27066SAndrew Turner 
110*02f27066SAndrew Turner 	/* error responses */
111*02f27066SAndrew Turner 	VIRTIO_GPU_RESP_ERR_UNSPEC = 0x1200,
112*02f27066SAndrew Turner 	VIRTIO_GPU_RESP_ERR_OUT_OF_MEMORY,
113*02f27066SAndrew Turner 	VIRTIO_GPU_RESP_ERR_INVALID_SCANOUT_ID,
114*02f27066SAndrew Turner 	VIRTIO_GPU_RESP_ERR_INVALID_RESOURCE_ID,
115*02f27066SAndrew Turner 	VIRTIO_GPU_RESP_ERR_INVALID_CONTEXT_ID,
116*02f27066SAndrew Turner 	VIRTIO_GPU_RESP_ERR_INVALID_PARAMETER,
117*02f27066SAndrew Turner };
118*02f27066SAndrew Turner 
119*02f27066SAndrew Turner enum virtio_gpu_shm_id {
120*02f27066SAndrew Turner 	VIRTIO_GPU_SHM_ID_UNDEFINED = 0,
121*02f27066SAndrew Turner 	/*
122*02f27066SAndrew Turner 	 * VIRTIO_GPU_CMD_RESOURCE_MAP_BLOB
123*02f27066SAndrew Turner 	 * VIRTIO_GPU_CMD_RESOURCE_UNMAP_BLOB
124*02f27066SAndrew Turner 	 */
125*02f27066SAndrew Turner 	VIRTIO_GPU_SHM_ID_HOST_VISIBLE = 1
126*02f27066SAndrew Turner };
127*02f27066SAndrew Turner 
128*02f27066SAndrew Turner #define VIRTIO_GPU_FLAG_FENCE         (1 << 0)
129*02f27066SAndrew Turner /*
130*02f27066SAndrew Turner  * If the following flag is set, then ring_idx contains the index
131*02f27066SAndrew Turner  * of the command ring that needs to used when creating the fence
132*02f27066SAndrew Turner  */
133*02f27066SAndrew Turner #define VIRTIO_GPU_FLAG_INFO_RING_IDX (1 << 1)
134*02f27066SAndrew Turner 
135*02f27066SAndrew Turner struct virtio_gpu_ctrl_hdr {
136*02f27066SAndrew Turner 	uint32_t type;
137*02f27066SAndrew Turner 	uint32_t flags;
138*02f27066SAndrew Turner 	uint64_t fence_id;
139*02f27066SAndrew Turner 	uint32_t ctx_id;
140*02f27066SAndrew Turner 	uint8_t ring_idx;
141*02f27066SAndrew Turner 	uint8_t padding[3];
142*02f27066SAndrew Turner };
143*02f27066SAndrew Turner 
144*02f27066SAndrew Turner /* data passed in the cursor vq */
145*02f27066SAndrew Turner 
146*02f27066SAndrew Turner struct virtio_gpu_cursor_pos {
147*02f27066SAndrew Turner 	uint32_t scanout_id;
148*02f27066SAndrew Turner 	uint32_t x;
149*02f27066SAndrew Turner 	uint32_t y;
150*02f27066SAndrew Turner 	uint32_t padding;
151*02f27066SAndrew Turner };
152*02f27066SAndrew Turner 
153*02f27066SAndrew Turner /* VIRTIO_GPU_CMD_UPDATE_CURSOR, VIRTIO_GPU_CMD_MOVE_CURSOR */
154*02f27066SAndrew Turner struct virtio_gpu_update_cursor {
155*02f27066SAndrew Turner 	struct virtio_gpu_ctrl_hdr hdr;
156*02f27066SAndrew Turner 	struct virtio_gpu_cursor_pos pos;  /* update & move */
157*02f27066SAndrew Turner 	uint32_t resource_id;           /* update only */
158*02f27066SAndrew Turner 	uint32_t hot_x;                 /* update only */
159*02f27066SAndrew Turner 	uint32_t hot_y;                 /* update only */
160*02f27066SAndrew Turner 	uint32_t padding;
161*02f27066SAndrew Turner };
162*02f27066SAndrew Turner 
163*02f27066SAndrew Turner /* data passed in the control vq, 2d related */
164*02f27066SAndrew Turner 
165*02f27066SAndrew Turner struct virtio_gpu_rect {
166*02f27066SAndrew Turner 	uint32_t x;
167*02f27066SAndrew Turner 	uint32_t y;
168*02f27066SAndrew Turner 	uint32_t width;
169*02f27066SAndrew Turner 	uint32_t height;
170*02f27066SAndrew Turner };
171*02f27066SAndrew Turner 
172*02f27066SAndrew Turner /* VIRTIO_GPU_CMD_RESOURCE_UNREF */
173*02f27066SAndrew Turner struct virtio_gpu_resource_unref {
174*02f27066SAndrew Turner 	struct virtio_gpu_ctrl_hdr hdr;
175*02f27066SAndrew Turner 	uint32_t resource_id;
176*02f27066SAndrew Turner 	uint32_t padding;
177*02f27066SAndrew Turner };
178*02f27066SAndrew Turner 
179*02f27066SAndrew Turner /* VIRTIO_GPU_CMD_RESOURCE_CREATE_2D: create a 2d resource with a format */
180*02f27066SAndrew Turner struct virtio_gpu_resource_create_2d {
181*02f27066SAndrew Turner 	struct virtio_gpu_ctrl_hdr hdr;
182*02f27066SAndrew Turner 	uint32_t resource_id;
183*02f27066SAndrew Turner 	uint32_t format;
184*02f27066SAndrew Turner 	uint32_t width;
185*02f27066SAndrew Turner 	uint32_t height;
186*02f27066SAndrew Turner };
187*02f27066SAndrew Turner 
188*02f27066SAndrew Turner /* VIRTIO_GPU_CMD_SET_SCANOUT */
189*02f27066SAndrew Turner struct virtio_gpu_set_scanout {
190*02f27066SAndrew Turner 	struct virtio_gpu_ctrl_hdr hdr;
191*02f27066SAndrew Turner 	struct virtio_gpu_rect r;
192*02f27066SAndrew Turner 	uint32_t scanout_id;
193*02f27066SAndrew Turner 	uint32_t resource_id;
194*02f27066SAndrew Turner };
195*02f27066SAndrew Turner 
196*02f27066SAndrew Turner /* VIRTIO_GPU_CMD_RESOURCE_FLUSH */
197*02f27066SAndrew Turner struct virtio_gpu_resource_flush {
198*02f27066SAndrew Turner 	struct virtio_gpu_ctrl_hdr hdr;
199*02f27066SAndrew Turner 	struct virtio_gpu_rect r;
200*02f27066SAndrew Turner 	uint32_t resource_id;
201*02f27066SAndrew Turner 	uint32_t padding;
202*02f27066SAndrew Turner };
203*02f27066SAndrew Turner 
204*02f27066SAndrew Turner /* VIRTIO_GPU_CMD_TRANSFER_TO_HOST_2D: simple transfer to_host */
205*02f27066SAndrew Turner struct virtio_gpu_transfer_to_host_2d {
206*02f27066SAndrew Turner 	struct virtio_gpu_ctrl_hdr hdr;
207*02f27066SAndrew Turner 	struct virtio_gpu_rect r;
208*02f27066SAndrew Turner 	uint64_t offset;
209*02f27066SAndrew Turner 	uint32_t resource_id;
210*02f27066SAndrew Turner 	uint32_t padding;
211*02f27066SAndrew Turner };
212*02f27066SAndrew Turner 
213*02f27066SAndrew Turner struct virtio_gpu_mem_entry {
214*02f27066SAndrew Turner 	uint64_t addr;
215*02f27066SAndrew Turner 	uint32_t length;
216*02f27066SAndrew Turner 	uint32_t padding;
217*02f27066SAndrew Turner };
218*02f27066SAndrew Turner 
219*02f27066SAndrew Turner /* VIRTIO_GPU_CMD_RESOURCE_ATTACH_BACKING */
220*02f27066SAndrew Turner struct virtio_gpu_resource_attach_backing {
221*02f27066SAndrew Turner 	struct virtio_gpu_ctrl_hdr hdr;
222*02f27066SAndrew Turner 	uint32_t resource_id;
223*02f27066SAndrew Turner 	uint32_t nr_entries;
224*02f27066SAndrew Turner };
225*02f27066SAndrew Turner 
226*02f27066SAndrew Turner /* VIRTIO_GPU_CMD_RESOURCE_DETACH_BACKING */
227*02f27066SAndrew Turner struct virtio_gpu_resource_detach_backing {
228*02f27066SAndrew Turner 	struct virtio_gpu_ctrl_hdr hdr;
229*02f27066SAndrew Turner 	uint32_t resource_id;
230*02f27066SAndrew Turner 	uint32_t padding;
231*02f27066SAndrew Turner };
232*02f27066SAndrew Turner 
233*02f27066SAndrew Turner /* VIRTIO_GPU_RESP_OK_DISPLAY_INFO */
234*02f27066SAndrew Turner #define VIRTIO_GPU_MAX_SCANOUTS 16
235*02f27066SAndrew Turner struct virtio_gpu_resp_display_info {
236*02f27066SAndrew Turner 	struct virtio_gpu_ctrl_hdr hdr;
237*02f27066SAndrew Turner 	struct virtio_gpu_display_one {
238*02f27066SAndrew Turner 		struct virtio_gpu_rect r;
239*02f27066SAndrew Turner 		uint32_t enabled;
240*02f27066SAndrew Turner 		uint32_t flags;
241*02f27066SAndrew Turner 	} pmodes[VIRTIO_GPU_MAX_SCANOUTS];
242*02f27066SAndrew Turner };
243*02f27066SAndrew Turner 
244*02f27066SAndrew Turner /* data passed in the control vq, 3d related */
245*02f27066SAndrew Turner 
246*02f27066SAndrew Turner struct virtio_gpu_box {
247*02f27066SAndrew Turner 	uint32_t x, y, z;
248*02f27066SAndrew Turner 	uint32_t w, h, d;
249*02f27066SAndrew Turner };
250*02f27066SAndrew Turner 
251*02f27066SAndrew Turner /* VIRTIO_GPU_CMD_TRANSFER_TO_HOST_3D, VIRTIO_GPU_CMD_TRANSFER_FROM_HOST_3D */
252*02f27066SAndrew Turner struct virtio_gpu_transfer_host_3d {
253*02f27066SAndrew Turner 	struct virtio_gpu_ctrl_hdr hdr;
254*02f27066SAndrew Turner 	struct virtio_gpu_box box;
255*02f27066SAndrew Turner 	uint64_t offset;
256*02f27066SAndrew Turner 	uint32_t resource_id;
257*02f27066SAndrew Turner 	uint32_t level;
258*02f27066SAndrew Turner 	uint32_t stride;
259*02f27066SAndrew Turner 	uint32_t layer_stride;
260*02f27066SAndrew Turner };
261*02f27066SAndrew Turner 
262*02f27066SAndrew Turner /* VIRTIO_GPU_CMD_RESOURCE_CREATE_3D */
263*02f27066SAndrew Turner #define VIRTIO_GPU_RESOURCE_FLAG_Y_0_TOP (1 << 0)
264*02f27066SAndrew Turner struct virtio_gpu_resource_create_3d {
265*02f27066SAndrew Turner 	struct virtio_gpu_ctrl_hdr hdr;
266*02f27066SAndrew Turner 	uint32_t resource_id;
267*02f27066SAndrew Turner 	uint32_t target;
268*02f27066SAndrew Turner 	uint32_t format;
269*02f27066SAndrew Turner 	uint32_t bind;
270*02f27066SAndrew Turner 	uint32_t width;
271*02f27066SAndrew Turner 	uint32_t height;
272*02f27066SAndrew Turner 	uint32_t depth;
273*02f27066SAndrew Turner 	uint32_t array_size;
274*02f27066SAndrew Turner 	uint32_t last_level;
275*02f27066SAndrew Turner 	uint32_t nr_samples;
276*02f27066SAndrew Turner 	uint32_t flags;
277*02f27066SAndrew Turner 	uint32_t padding;
278*02f27066SAndrew Turner };
279*02f27066SAndrew Turner 
280*02f27066SAndrew Turner /* VIRTIO_GPU_CMD_CTX_CREATE */
281*02f27066SAndrew Turner #define VIRTIO_GPU_CONTEXT_INIT_CAPSET_ID_MASK 0x000000ff
282*02f27066SAndrew Turner struct virtio_gpu_ctx_create {
283*02f27066SAndrew Turner 	struct virtio_gpu_ctrl_hdr hdr;
284*02f27066SAndrew Turner 	uint32_t nlen;
285*02f27066SAndrew Turner 	uint32_t context_init;
286*02f27066SAndrew Turner 	char debug_name[64];
287*02f27066SAndrew Turner };
288*02f27066SAndrew Turner 
289*02f27066SAndrew Turner /* VIRTIO_GPU_CMD_CTX_DESTROY */
290*02f27066SAndrew Turner struct virtio_gpu_ctx_destroy {
291*02f27066SAndrew Turner 	struct virtio_gpu_ctrl_hdr hdr;
292*02f27066SAndrew Turner };
293*02f27066SAndrew Turner 
294*02f27066SAndrew Turner /* VIRTIO_GPU_CMD_CTX_ATTACH_RESOURCE, VIRTIO_GPU_CMD_CTX_DETACH_RESOURCE */
295*02f27066SAndrew Turner struct virtio_gpu_ctx_resource {
296*02f27066SAndrew Turner 	struct virtio_gpu_ctrl_hdr hdr;
297*02f27066SAndrew Turner 	uint32_t resource_id;
298*02f27066SAndrew Turner 	uint32_t padding;
299*02f27066SAndrew Turner };
300*02f27066SAndrew Turner 
301*02f27066SAndrew Turner /* VIRTIO_GPU_CMD_SUBMIT_3D */
302*02f27066SAndrew Turner struct virtio_gpu_cmd_submit {
303*02f27066SAndrew Turner 	struct virtio_gpu_ctrl_hdr hdr;
304*02f27066SAndrew Turner 	uint32_t size;
305*02f27066SAndrew Turner 	uint32_t padding;
306*02f27066SAndrew Turner };
307*02f27066SAndrew Turner 
308*02f27066SAndrew Turner #define VIRTIO_GPU_CAPSET_VIRGL 1
309*02f27066SAndrew Turner #define VIRTIO_GPU_CAPSET_VIRGL2 2
310*02f27066SAndrew Turner 
311*02f27066SAndrew Turner /* VIRTIO_GPU_CMD_GET_CAPSET_INFO */
312*02f27066SAndrew Turner struct virtio_gpu_get_capset_info {
313*02f27066SAndrew Turner 	struct virtio_gpu_ctrl_hdr hdr;
314*02f27066SAndrew Turner 	uint32_t capset_index;
315*02f27066SAndrew Turner 	uint32_t padding;
316*02f27066SAndrew Turner };
317*02f27066SAndrew Turner 
318*02f27066SAndrew Turner /* VIRTIO_GPU_RESP_OK_CAPSET_INFO */
319*02f27066SAndrew Turner struct virtio_gpu_resp_capset_info {
320*02f27066SAndrew Turner 	struct virtio_gpu_ctrl_hdr hdr;
321*02f27066SAndrew Turner 	uint32_t capset_id;
322*02f27066SAndrew Turner 	uint32_t capset_max_version;
323*02f27066SAndrew Turner 	uint32_t capset_max_size;
324*02f27066SAndrew Turner 	uint32_t padding;
325*02f27066SAndrew Turner };
326*02f27066SAndrew Turner 
327*02f27066SAndrew Turner /* VIRTIO_GPU_CMD_GET_CAPSET */
328*02f27066SAndrew Turner struct virtio_gpu_get_capset {
329*02f27066SAndrew Turner 	struct virtio_gpu_ctrl_hdr hdr;
330*02f27066SAndrew Turner 	uint32_t capset_id;
331*02f27066SAndrew Turner 	uint32_t capset_version;
332*02f27066SAndrew Turner };
333*02f27066SAndrew Turner 
334*02f27066SAndrew Turner /* VIRTIO_GPU_RESP_OK_CAPSET */
335*02f27066SAndrew Turner struct virtio_gpu_resp_capset {
336*02f27066SAndrew Turner 	struct virtio_gpu_ctrl_hdr hdr;
337*02f27066SAndrew Turner 	uint8_t capset_data[];
338*02f27066SAndrew Turner };
339*02f27066SAndrew Turner 
340*02f27066SAndrew Turner /* VIRTIO_GPU_CMD_GET_EDID */
341*02f27066SAndrew Turner struct virtio_gpu_cmd_get_edid {
342*02f27066SAndrew Turner 	struct virtio_gpu_ctrl_hdr hdr;
343*02f27066SAndrew Turner 	uint32_t scanout;
344*02f27066SAndrew Turner 	uint32_t padding;
345*02f27066SAndrew Turner };
346*02f27066SAndrew Turner 
347*02f27066SAndrew Turner /* VIRTIO_GPU_RESP_OK_EDID */
348*02f27066SAndrew Turner struct virtio_gpu_resp_edid {
349*02f27066SAndrew Turner 	struct virtio_gpu_ctrl_hdr hdr;
350*02f27066SAndrew Turner 	uint32_t size;
351*02f27066SAndrew Turner 	uint32_t padding;
352*02f27066SAndrew Turner 	uint8_t edid[1024];
353*02f27066SAndrew Turner };
354*02f27066SAndrew Turner 
355*02f27066SAndrew Turner #define VIRTIO_GPU_EVENT_DISPLAY (1 << 0)
356*02f27066SAndrew Turner 
357*02f27066SAndrew Turner struct virtio_gpu_config {
358*02f27066SAndrew Turner 	uint32_t events_read;
359*02f27066SAndrew Turner 	uint32_t events_clear;
360*02f27066SAndrew Turner 	uint32_t num_scanouts;
361*02f27066SAndrew Turner 	uint32_t num_capsets;
362*02f27066SAndrew Turner };
363*02f27066SAndrew Turner 
364*02f27066SAndrew Turner /* simple formats for fbcon/X use */
365*02f27066SAndrew Turner enum virtio_gpu_formats {
366*02f27066SAndrew Turner 	VIRTIO_GPU_FORMAT_B8G8R8A8_UNORM  = 1,
367*02f27066SAndrew Turner 	VIRTIO_GPU_FORMAT_B8G8R8X8_UNORM  = 2,
368*02f27066SAndrew Turner 	VIRTIO_GPU_FORMAT_A8R8G8B8_UNORM  = 3,
369*02f27066SAndrew Turner 	VIRTIO_GPU_FORMAT_X8R8G8B8_UNORM  = 4,
370*02f27066SAndrew Turner 
371*02f27066SAndrew Turner 	VIRTIO_GPU_FORMAT_R8G8B8A8_UNORM  = 67,
372*02f27066SAndrew Turner 	VIRTIO_GPU_FORMAT_X8B8G8R8_UNORM  = 68,
373*02f27066SAndrew Turner 
374*02f27066SAndrew Turner 	VIRTIO_GPU_FORMAT_A8B8G8R8_UNORM  = 121,
375*02f27066SAndrew Turner 	VIRTIO_GPU_FORMAT_R8G8B8X8_UNORM  = 134,
376*02f27066SAndrew Turner };
377*02f27066SAndrew Turner 
378*02f27066SAndrew Turner /* VIRTIO_GPU_CMD_RESOURCE_ASSIGN_UUID */
379*02f27066SAndrew Turner struct virtio_gpu_resource_assign_uuid {
380*02f27066SAndrew Turner 	struct virtio_gpu_ctrl_hdr hdr;
381*02f27066SAndrew Turner 	uint32_t resource_id;
382*02f27066SAndrew Turner 	uint32_t padding;
383*02f27066SAndrew Turner };
384*02f27066SAndrew Turner 
385*02f27066SAndrew Turner /* VIRTIO_GPU_RESP_OK_RESOURCE_UUID */
386*02f27066SAndrew Turner struct virtio_gpu_resp_resource_uuid {
387*02f27066SAndrew Turner 	struct virtio_gpu_ctrl_hdr hdr;
388*02f27066SAndrew Turner 	uint8_t uuid[16];
389*02f27066SAndrew Turner };
390*02f27066SAndrew Turner 
391*02f27066SAndrew Turner /* VIRTIO_GPU_CMD_RESOURCE_CREATE_BLOB */
392*02f27066SAndrew Turner struct virtio_gpu_resource_create_blob {
393*02f27066SAndrew Turner 	struct virtio_gpu_ctrl_hdr hdr;
394*02f27066SAndrew Turner 	uint32_t resource_id;
395*02f27066SAndrew Turner #define VIRTIO_GPU_BLOB_MEM_GUEST             0x0001
396*02f27066SAndrew Turner #define VIRTIO_GPU_BLOB_MEM_HOST3D            0x0002
397*02f27066SAndrew Turner #define VIRTIO_GPU_BLOB_MEM_HOST3D_GUEST      0x0003
398*02f27066SAndrew Turner 
399*02f27066SAndrew Turner #define VIRTIO_GPU_BLOB_FLAG_USE_MAPPABLE     0x0001
400*02f27066SAndrew Turner #define VIRTIO_GPU_BLOB_FLAG_USE_SHAREABLE    0x0002
401*02f27066SAndrew Turner #define VIRTIO_GPU_BLOB_FLAG_USE_CROSS_DEVICE 0x0004
402*02f27066SAndrew Turner 	/* zero is invalid blob mem */
403*02f27066SAndrew Turner 	uint32_t blob_mem;
404*02f27066SAndrew Turner 	uint32_t blob_flags;
405*02f27066SAndrew Turner 	uint32_t nr_entries;
406*02f27066SAndrew Turner 	uint64_t blob_id;
407*02f27066SAndrew Turner 	uint64_t size;
408*02f27066SAndrew Turner 	/*
409*02f27066SAndrew Turner 	 * sizeof(nr_entries * virtio_gpu_mem_entry) bytes follow
410*02f27066SAndrew Turner 	 */
411*02f27066SAndrew Turner };
412*02f27066SAndrew Turner 
413*02f27066SAndrew Turner /* VIRTIO_GPU_CMD_SET_SCANOUT_BLOB */
414*02f27066SAndrew Turner struct virtio_gpu_set_scanout_blob {
415*02f27066SAndrew Turner 	struct virtio_gpu_ctrl_hdr hdr;
416*02f27066SAndrew Turner 	struct virtio_gpu_rect r;
417*02f27066SAndrew Turner 	uint32_t scanout_id;
418*02f27066SAndrew Turner 	uint32_t resource_id;
419*02f27066SAndrew Turner 	uint32_t width;
420*02f27066SAndrew Turner 	uint32_t height;
421*02f27066SAndrew Turner 	uint32_t format;
422*02f27066SAndrew Turner 	uint32_t padding;
423*02f27066SAndrew Turner 	uint32_t strides[4];
424*02f27066SAndrew Turner 	uint32_t offsets[4];
425*02f27066SAndrew Turner };
426*02f27066SAndrew Turner 
427*02f27066SAndrew Turner /* VIRTIO_GPU_CMD_RESOURCE_MAP_BLOB */
428*02f27066SAndrew Turner struct virtio_gpu_resource_map_blob {
429*02f27066SAndrew Turner 	struct virtio_gpu_ctrl_hdr hdr;
430*02f27066SAndrew Turner 	uint32_t resource_id;
431*02f27066SAndrew Turner 	uint32_t padding;
432*02f27066SAndrew Turner 	uint64_t offset;
433*02f27066SAndrew Turner };
434*02f27066SAndrew Turner 
435*02f27066SAndrew Turner /* VIRTIO_GPU_RESP_OK_MAP_INFO */
436*02f27066SAndrew Turner #define VIRTIO_GPU_MAP_CACHE_MASK     0x0f
437*02f27066SAndrew Turner #define VIRTIO_GPU_MAP_CACHE_NONE     0x00
438*02f27066SAndrew Turner #define VIRTIO_GPU_MAP_CACHE_CACHED   0x01
439*02f27066SAndrew Turner #define VIRTIO_GPU_MAP_CACHE_UNCACHED 0x02
440*02f27066SAndrew Turner #define VIRTIO_GPU_MAP_CACHE_WC       0x03
441*02f27066SAndrew Turner struct virtio_gpu_resp_map_info {
442*02f27066SAndrew Turner 	struct virtio_gpu_ctrl_hdr hdr;
443*02f27066SAndrew Turner 	uint32_t map_info;
444*02f27066SAndrew Turner 	uint32_t padding;
445*02f27066SAndrew Turner };
446*02f27066SAndrew Turner 
447*02f27066SAndrew Turner /* VIRTIO_GPU_CMD_RESOURCE_UNMAP_BLOB */
448*02f27066SAndrew Turner struct virtio_gpu_resource_unmap_blob {
449*02f27066SAndrew Turner 	struct virtio_gpu_ctrl_hdr hdr;
450*02f27066SAndrew Turner 	uint32_t resource_id;
451*02f27066SAndrew Turner 	uint32_t padding;
452*02f27066SAndrew Turner };
453*02f27066SAndrew Turner 
454*02f27066SAndrew Turner #endif
455