153476e07SGerd Hoffmann /*
253476e07SGerd Hoffmann  * Virtio GPU Device
353476e07SGerd Hoffmann  *
453476e07SGerd Hoffmann  * Copyright Red Hat, Inc. 2013-2014
553476e07SGerd Hoffmann  *
653476e07SGerd Hoffmann  * Authors:
753476e07SGerd Hoffmann  *     Dave Airlie <airlied@redhat.com>
853476e07SGerd Hoffmann  *     Gerd Hoffmann <kraxel@redhat.com>
953476e07SGerd Hoffmann  *
1053476e07SGerd Hoffmann  * This header is BSD licensed so anyone can use the definitions
1153476e07SGerd Hoffmann  * to implement compatible drivers/servers:
1253476e07SGerd Hoffmann  *
1353476e07SGerd Hoffmann  * Redistribution and use in source and binary forms, with or without
1453476e07SGerd Hoffmann  * modification, are permitted provided that the following conditions
1553476e07SGerd Hoffmann  * are met:
1653476e07SGerd Hoffmann  * 1. Redistributions of source code must retain the above copyright
1753476e07SGerd Hoffmann  *    notice, this list of conditions and the following disclaimer.
1853476e07SGerd Hoffmann  * 2. Redistributions in binary form must reproduce the above copyright
1953476e07SGerd Hoffmann  *    notice, this list of conditions and the following disclaimer in the
2053476e07SGerd Hoffmann  *    documentation and/or other materials provided with the distribution.
2153476e07SGerd Hoffmann  * 3. Neither the name of IBM nor the names of its contributors
2253476e07SGerd Hoffmann  *    may be used to endorse or promote products derived from this software
2353476e07SGerd Hoffmann  *    without specific prior written permission.
2453476e07SGerd Hoffmann  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
2553476e07SGerd Hoffmann  * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
2653476e07SGerd Hoffmann  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
2753476e07SGerd Hoffmann  * FOR A PARTICULAR PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL IBM OR
2853476e07SGerd Hoffmann  * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
2953476e07SGerd Hoffmann  * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
3053476e07SGerd Hoffmann  * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
3153476e07SGerd Hoffmann  * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
3253476e07SGerd Hoffmann  * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
3353476e07SGerd Hoffmann  * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
3453476e07SGerd Hoffmann  * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
3553476e07SGerd Hoffmann  * SUCH DAMAGE.
3653476e07SGerd Hoffmann  */
3753476e07SGerd Hoffmann 
3853476e07SGerd Hoffmann #ifndef VIRTIO_GPU_HW_H
3953476e07SGerd Hoffmann #define VIRTIO_GPU_HW_H
4053476e07SGerd Hoffmann 
4125b8b39bSAlexey Kardashevskiy #include "standard-headers/linux/types.h"
4225b8b39bSAlexey Kardashevskiy 
43d9cb4336SCornelia Huck /*
44d9cb4336SCornelia Huck  * VIRTIO_GPU_CMD_CTX_*
45d9cb4336SCornelia Huck  * VIRTIO_GPU_CMD_*_3D
46d9cb4336SCornelia Huck  */
47fff02bc0SPaolo Bonzini #define VIRTIO_GPU_F_VIRGL               0
48d9cb4336SCornelia Huck 
49d9cb4336SCornelia Huck /*
50d9cb4336SCornelia Huck  * VIRTIO_GPU_CMD_GET_EDID
51d9cb4336SCornelia Huck  */
52da054c64SPaolo Bonzini #define VIRTIO_GPU_F_EDID                1
5353ba2eeeSMatthew Rosato /*
5453ba2eeeSMatthew Rosato  * VIRTIO_GPU_CMD_RESOURCE_ASSIGN_UUID
5553ba2eeeSMatthew Rosato  */
5653ba2eeeSMatthew Rosato #define VIRTIO_GPU_F_RESOURCE_UUID       2
57bc79e964SGerd Hoffmann 
58*b3c818a4SEric Farman /*
59*b3c818a4SEric Farman  * VIRTIO_GPU_CMD_RESOURCE_CREATE_BLOB
60*b3c818a4SEric Farman  */
61*b3c818a4SEric Farman #define VIRTIO_GPU_F_RESOURCE_BLOB       3
62*b3c818a4SEric Farman 
6353476e07SGerd Hoffmann enum virtio_gpu_ctrl_type {
6453476e07SGerd Hoffmann 	VIRTIO_GPU_UNDEFINED = 0,
6553476e07SGerd Hoffmann 
6653476e07SGerd Hoffmann 	/* 2d commands */
6753476e07SGerd Hoffmann 	VIRTIO_GPU_CMD_GET_DISPLAY_INFO = 0x0100,
6853476e07SGerd Hoffmann 	VIRTIO_GPU_CMD_RESOURCE_CREATE_2D,
6953476e07SGerd Hoffmann 	VIRTIO_GPU_CMD_RESOURCE_UNREF,
7053476e07SGerd Hoffmann 	VIRTIO_GPU_CMD_SET_SCANOUT,
7153476e07SGerd Hoffmann 	VIRTIO_GPU_CMD_RESOURCE_FLUSH,
7253476e07SGerd Hoffmann 	VIRTIO_GPU_CMD_TRANSFER_TO_HOST_2D,
7353476e07SGerd Hoffmann 	VIRTIO_GPU_CMD_RESOURCE_ATTACH_BACKING,
7453476e07SGerd Hoffmann 	VIRTIO_GPU_CMD_RESOURCE_DETACH_BACKING,
75bc79e964SGerd Hoffmann 	VIRTIO_GPU_CMD_GET_CAPSET_INFO,
76bc79e964SGerd Hoffmann 	VIRTIO_GPU_CMD_GET_CAPSET,
77da054c64SPaolo Bonzini 	VIRTIO_GPU_CMD_GET_EDID,
7853ba2eeeSMatthew Rosato 	VIRTIO_GPU_CMD_RESOURCE_ASSIGN_UUID,
79*b3c818a4SEric Farman 	VIRTIO_GPU_CMD_RESOURCE_CREATE_BLOB,
80*b3c818a4SEric Farman 	VIRTIO_GPU_CMD_SET_SCANOUT_BLOB,
81bc79e964SGerd Hoffmann 
82bc79e964SGerd Hoffmann 	/* 3d commands */
83bc79e964SGerd Hoffmann 	VIRTIO_GPU_CMD_CTX_CREATE = 0x0200,
84bc79e964SGerd Hoffmann 	VIRTIO_GPU_CMD_CTX_DESTROY,
85bc79e964SGerd Hoffmann 	VIRTIO_GPU_CMD_CTX_ATTACH_RESOURCE,
86bc79e964SGerd Hoffmann 	VIRTIO_GPU_CMD_CTX_DETACH_RESOURCE,
87bc79e964SGerd Hoffmann 	VIRTIO_GPU_CMD_RESOURCE_CREATE_3D,
88bc79e964SGerd Hoffmann 	VIRTIO_GPU_CMD_TRANSFER_TO_HOST_3D,
89bc79e964SGerd Hoffmann 	VIRTIO_GPU_CMD_TRANSFER_FROM_HOST_3D,
90bc79e964SGerd Hoffmann 	VIRTIO_GPU_CMD_SUBMIT_3D,
91*b3c818a4SEric Farman 	VIRTIO_GPU_CMD_RESOURCE_MAP_BLOB,
92*b3c818a4SEric Farman 	VIRTIO_GPU_CMD_RESOURCE_UNMAP_BLOB,
9353476e07SGerd Hoffmann 
9453476e07SGerd Hoffmann 	/* cursor commands */
9553476e07SGerd Hoffmann 	VIRTIO_GPU_CMD_UPDATE_CURSOR = 0x0300,
9653476e07SGerd Hoffmann 	VIRTIO_GPU_CMD_MOVE_CURSOR,
9753476e07SGerd Hoffmann 
9853476e07SGerd Hoffmann 	/* success responses */
9953476e07SGerd Hoffmann 	VIRTIO_GPU_RESP_OK_NODATA = 0x1100,
10053476e07SGerd Hoffmann 	VIRTIO_GPU_RESP_OK_DISPLAY_INFO,
101bc79e964SGerd Hoffmann 	VIRTIO_GPU_RESP_OK_CAPSET_INFO,
102bc79e964SGerd Hoffmann 	VIRTIO_GPU_RESP_OK_CAPSET,
103da054c64SPaolo Bonzini 	VIRTIO_GPU_RESP_OK_EDID,
10453ba2eeeSMatthew Rosato 	VIRTIO_GPU_RESP_OK_RESOURCE_UUID,
105*b3c818a4SEric Farman 	VIRTIO_GPU_RESP_OK_MAP_INFO,
10653476e07SGerd Hoffmann 
10753476e07SGerd Hoffmann 	/* error responses */
10853476e07SGerd Hoffmann 	VIRTIO_GPU_RESP_ERR_UNSPEC = 0x1200,
10953476e07SGerd Hoffmann 	VIRTIO_GPU_RESP_ERR_OUT_OF_MEMORY,
11053476e07SGerd Hoffmann 	VIRTIO_GPU_RESP_ERR_INVALID_SCANOUT_ID,
11153476e07SGerd Hoffmann 	VIRTIO_GPU_RESP_ERR_INVALID_RESOURCE_ID,
11253476e07SGerd Hoffmann 	VIRTIO_GPU_RESP_ERR_INVALID_CONTEXT_ID,
11353476e07SGerd Hoffmann 	VIRTIO_GPU_RESP_ERR_INVALID_PARAMETER,
11453476e07SGerd Hoffmann };
11553476e07SGerd Hoffmann 
116*b3c818a4SEric Farman enum virtio_gpu_shm_id {
117*b3c818a4SEric Farman 	VIRTIO_GPU_SHM_ID_UNDEFINED = 0,
118*b3c818a4SEric Farman 	/*
119*b3c818a4SEric Farman 	 * VIRTIO_GPU_CMD_RESOURCE_MAP_BLOB
120*b3c818a4SEric Farman 	 * VIRTIO_GPU_CMD_RESOURCE_UNMAP_BLOB
121*b3c818a4SEric Farman 	 */
122*b3c818a4SEric Farman 	VIRTIO_GPU_SHM_ID_HOST_VISIBLE = 1
123*b3c818a4SEric Farman };
124*b3c818a4SEric Farman 
12553476e07SGerd Hoffmann #define VIRTIO_GPU_FLAG_FENCE (1 << 0)
12653476e07SGerd Hoffmann 
12753476e07SGerd Hoffmann struct virtio_gpu_ctrl_hdr {
12853476e07SGerd Hoffmann 	uint32_t type;
12953476e07SGerd Hoffmann 	uint32_t flags;
13053476e07SGerd Hoffmann 	uint64_t fence_id;
13153476e07SGerd Hoffmann 	uint32_t ctx_id;
13253476e07SGerd Hoffmann 	uint32_t padding;
13353476e07SGerd Hoffmann };
13453476e07SGerd Hoffmann 
13553476e07SGerd Hoffmann /* data passed in the cursor vq */
13653476e07SGerd Hoffmann 
13753476e07SGerd Hoffmann struct virtio_gpu_cursor_pos {
13853476e07SGerd Hoffmann 	uint32_t scanout_id;
13953476e07SGerd Hoffmann 	uint32_t x;
14053476e07SGerd Hoffmann 	uint32_t y;
14153476e07SGerd Hoffmann 	uint32_t padding;
14253476e07SGerd Hoffmann };
14353476e07SGerd Hoffmann 
14453476e07SGerd Hoffmann /* VIRTIO_GPU_CMD_UPDATE_CURSOR, VIRTIO_GPU_CMD_MOVE_CURSOR */
14553476e07SGerd Hoffmann struct virtio_gpu_update_cursor {
14653476e07SGerd Hoffmann 	struct virtio_gpu_ctrl_hdr hdr;
14753476e07SGerd Hoffmann 	struct virtio_gpu_cursor_pos pos;  /* update & move */
14853476e07SGerd Hoffmann 	uint32_t resource_id;           /* update only */
14953476e07SGerd Hoffmann 	uint32_t hot_x;                 /* update only */
15053476e07SGerd Hoffmann 	uint32_t hot_y;                 /* update only */
15153476e07SGerd Hoffmann 	uint32_t padding;
15253476e07SGerd Hoffmann };
15353476e07SGerd Hoffmann 
15453476e07SGerd Hoffmann /* data passed in the control vq, 2d related */
15553476e07SGerd Hoffmann 
15653476e07SGerd Hoffmann struct virtio_gpu_rect {
15753476e07SGerd Hoffmann 	uint32_t x;
15853476e07SGerd Hoffmann 	uint32_t y;
15953476e07SGerd Hoffmann 	uint32_t width;
16053476e07SGerd Hoffmann 	uint32_t height;
16153476e07SGerd Hoffmann };
16253476e07SGerd Hoffmann 
16353476e07SGerd Hoffmann /* VIRTIO_GPU_CMD_RESOURCE_UNREF */
16453476e07SGerd Hoffmann struct virtio_gpu_resource_unref {
16553476e07SGerd Hoffmann 	struct virtio_gpu_ctrl_hdr hdr;
16653476e07SGerd Hoffmann 	uint32_t resource_id;
16753476e07SGerd Hoffmann 	uint32_t padding;
16853476e07SGerd Hoffmann };
16953476e07SGerd Hoffmann 
17053476e07SGerd Hoffmann /* VIRTIO_GPU_CMD_RESOURCE_CREATE_2D: create a 2d resource with a format */
17153476e07SGerd Hoffmann struct virtio_gpu_resource_create_2d {
17253476e07SGerd Hoffmann 	struct virtio_gpu_ctrl_hdr hdr;
17353476e07SGerd Hoffmann 	uint32_t resource_id;
17453476e07SGerd Hoffmann 	uint32_t format;
17553476e07SGerd Hoffmann 	uint32_t width;
17653476e07SGerd Hoffmann 	uint32_t height;
17753476e07SGerd Hoffmann };
17853476e07SGerd Hoffmann 
17953476e07SGerd Hoffmann /* VIRTIO_GPU_CMD_SET_SCANOUT */
18053476e07SGerd Hoffmann struct virtio_gpu_set_scanout {
18153476e07SGerd Hoffmann 	struct virtio_gpu_ctrl_hdr hdr;
18253476e07SGerd Hoffmann 	struct virtio_gpu_rect r;
18353476e07SGerd Hoffmann 	uint32_t scanout_id;
18453476e07SGerd Hoffmann 	uint32_t resource_id;
18553476e07SGerd Hoffmann };
18653476e07SGerd Hoffmann 
18753476e07SGerd Hoffmann /* VIRTIO_GPU_CMD_RESOURCE_FLUSH */
18853476e07SGerd Hoffmann struct virtio_gpu_resource_flush {
18953476e07SGerd Hoffmann 	struct virtio_gpu_ctrl_hdr hdr;
19053476e07SGerd Hoffmann 	struct virtio_gpu_rect r;
19153476e07SGerd Hoffmann 	uint32_t resource_id;
19253476e07SGerd Hoffmann 	uint32_t padding;
19353476e07SGerd Hoffmann };
19453476e07SGerd Hoffmann 
19553476e07SGerd Hoffmann /* VIRTIO_GPU_CMD_TRANSFER_TO_HOST_2D: simple transfer to_host */
19653476e07SGerd Hoffmann struct virtio_gpu_transfer_to_host_2d {
19753476e07SGerd Hoffmann 	struct virtio_gpu_ctrl_hdr hdr;
19853476e07SGerd Hoffmann 	struct virtio_gpu_rect r;
19953476e07SGerd Hoffmann 	uint64_t offset;
20053476e07SGerd Hoffmann 	uint32_t resource_id;
20153476e07SGerd Hoffmann 	uint32_t padding;
20253476e07SGerd Hoffmann };
20353476e07SGerd Hoffmann 
20453476e07SGerd Hoffmann struct virtio_gpu_mem_entry {
20553476e07SGerd Hoffmann 	uint64_t addr;
20653476e07SGerd Hoffmann 	uint32_t length;
20753476e07SGerd Hoffmann 	uint32_t padding;
20853476e07SGerd Hoffmann };
20953476e07SGerd Hoffmann 
21053476e07SGerd Hoffmann /* VIRTIO_GPU_CMD_RESOURCE_ATTACH_BACKING */
21153476e07SGerd Hoffmann struct virtio_gpu_resource_attach_backing {
21253476e07SGerd Hoffmann 	struct virtio_gpu_ctrl_hdr hdr;
21353476e07SGerd Hoffmann 	uint32_t resource_id;
21453476e07SGerd Hoffmann 	uint32_t nr_entries;
21553476e07SGerd Hoffmann };
21653476e07SGerd Hoffmann 
21753476e07SGerd Hoffmann /* VIRTIO_GPU_CMD_RESOURCE_DETACH_BACKING */
21853476e07SGerd Hoffmann struct virtio_gpu_resource_detach_backing {
21953476e07SGerd Hoffmann 	struct virtio_gpu_ctrl_hdr hdr;
22053476e07SGerd Hoffmann 	uint32_t resource_id;
22153476e07SGerd Hoffmann 	uint32_t padding;
22253476e07SGerd Hoffmann };
22353476e07SGerd Hoffmann 
22453476e07SGerd Hoffmann /* VIRTIO_GPU_RESP_OK_DISPLAY_INFO */
22553476e07SGerd Hoffmann #define VIRTIO_GPU_MAX_SCANOUTS 16
22653476e07SGerd Hoffmann struct virtio_gpu_resp_display_info {
22753476e07SGerd Hoffmann 	struct virtio_gpu_ctrl_hdr hdr;
22853476e07SGerd Hoffmann 	struct virtio_gpu_display_one {
22953476e07SGerd Hoffmann 		struct virtio_gpu_rect r;
23053476e07SGerd Hoffmann 		uint32_t enabled;
23153476e07SGerd Hoffmann 		uint32_t flags;
23253476e07SGerd Hoffmann 	} pmodes[VIRTIO_GPU_MAX_SCANOUTS];
23353476e07SGerd Hoffmann };
23453476e07SGerd Hoffmann 
235bc79e964SGerd Hoffmann /* data passed in the control vq, 3d related */
236bc79e964SGerd Hoffmann 
237bc79e964SGerd Hoffmann struct virtio_gpu_box {
238bc79e964SGerd Hoffmann 	uint32_t x, y, z;
239bc79e964SGerd Hoffmann 	uint32_t w, h, d;
240bc79e964SGerd Hoffmann };
241bc79e964SGerd Hoffmann 
242bc79e964SGerd Hoffmann /* VIRTIO_GPU_CMD_TRANSFER_TO_HOST_3D, VIRTIO_GPU_CMD_TRANSFER_FROM_HOST_3D */
243bc79e964SGerd Hoffmann struct virtio_gpu_transfer_host_3d {
244bc79e964SGerd Hoffmann 	struct virtio_gpu_ctrl_hdr hdr;
245bc79e964SGerd Hoffmann 	struct virtio_gpu_box box;
246bc79e964SGerd Hoffmann 	uint64_t offset;
247bc79e964SGerd Hoffmann 	uint32_t resource_id;
248bc79e964SGerd Hoffmann 	uint32_t level;
249bc79e964SGerd Hoffmann 	uint32_t stride;
250bc79e964SGerd Hoffmann 	uint32_t layer_stride;
251bc79e964SGerd Hoffmann };
252bc79e964SGerd Hoffmann 
253bc79e964SGerd Hoffmann /* VIRTIO_GPU_CMD_RESOURCE_CREATE_3D */
254bc79e964SGerd Hoffmann #define VIRTIO_GPU_RESOURCE_FLAG_Y_0_TOP (1 << 0)
255bc79e964SGerd Hoffmann struct virtio_gpu_resource_create_3d {
256bc79e964SGerd Hoffmann 	struct virtio_gpu_ctrl_hdr hdr;
257bc79e964SGerd Hoffmann 	uint32_t resource_id;
258bc79e964SGerd Hoffmann 	uint32_t target;
259bc79e964SGerd Hoffmann 	uint32_t format;
260bc79e964SGerd Hoffmann 	uint32_t bind;
261bc79e964SGerd Hoffmann 	uint32_t width;
262bc79e964SGerd Hoffmann 	uint32_t height;
263bc79e964SGerd Hoffmann 	uint32_t depth;
264bc79e964SGerd Hoffmann 	uint32_t array_size;
265bc79e964SGerd Hoffmann 	uint32_t last_level;
266bc79e964SGerd Hoffmann 	uint32_t nr_samples;
267bc79e964SGerd Hoffmann 	uint32_t flags;
268bc79e964SGerd Hoffmann 	uint32_t padding;
269bc79e964SGerd Hoffmann };
270bc79e964SGerd Hoffmann 
271bc79e964SGerd Hoffmann /* VIRTIO_GPU_CMD_CTX_CREATE */
272bc79e964SGerd Hoffmann struct virtio_gpu_ctx_create {
273bc79e964SGerd Hoffmann 	struct virtio_gpu_ctrl_hdr hdr;
274bc79e964SGerd Hoffmann 	uint32_t nlen;
275bc79e964SGerd Hoffmann 	uint32_t padding;
276bc79e964SGerd Hoffmann 	char debug_name[64];
277bc79e964SGerd Hoffmann };
278bc79e964SGerd Hoffmann 
279bc79e964SGerd Hoffmann /* VIRTIO_GPU_CMD_CTX_DESTROY */
280bc79e964SGerd Hoffmann struct virtio_gpu_ctx_destroy {
281bc79e964SGerd Hoffmann 	struct virtio_gpu_ctrl_hdr hdr;
282bc79e964SGerd Hoffmann };
283bc79e964SGerd Hoffmann 
284bc79e964SGerd Hoffmann /* VIRTIO_GPU_CMD_CTX_ATTACH_RESOURCE, VIRTIO_GPU_CMD_CTX_DETACH_RESOURCE */
285bc79e964SGerd Hoffmann struct virtio_gpu_ctx_resource {
286bc79e964SGerd Hoffmann 	struct virtio_gpu_ctrl_hdr hdr;
287bc79e964SGerd Hoffmann 	uint32_t resource_id;
288bc79e964SGerd Hoffmann 	uint32_t padding;
289bc79e964SGerd Hoffmann };
290bc79e964SGerd Hoffmann 
291bc79e964SGerd Hoffmann /* VIRTIO_GPU_CMD_SUBMIT_3D */
292bc79e964SGerd Hoffmann struct virtio_gpu_cmd_submit {
293bc79e964SGerd Hoffmann 	struct virtio_gpu_ctrl_hdr hdr;
294bc79e964SGerd Hoffmann 	uint32_t size;
295bc79e964SGerd Hoffmann 	uint32_t padding;
296bc79e964SGerd Hoffmann };
297bc79e964SGerd Hoffmann 
298bc79e964SGerd Hoffmann #define VIRTIO_GPU_CAPSET_VIRGL 1
29977d361b1SEric Auger #define VIRTIO_GPU_CAPSET_VIRGL2 2
300bc79e964SGerd Hoffmann 
301bc79e964SGerd Hoffmann /* VIRTIO_GPU_CMD_GET_CAPSET_INFO */
302bc79e964SGerd Hoffmann struct virtio_gpu_get_capset_info {
303bc79e964SGerd Hoffmann 	struct virtio_gpu_ctrl_hdr hdr;
304bc79e964SGerd Hoffmann 	uint32_t capset_index;
305bc79e964SGerd Hoffmann 	uint32_t padding;
306bc79e964SGerd Hoffmann };
307bc79e964SGerd Hoffmann 
308bc79e964SGerd Hoffmann /* VIRTIO_GPU_RESP_OK_CAPSET_INFO */
309bc79e964SGerd Hoffmann struct virtio_gpu_resp_capset_info {
310bc79e964SGerd Hoffmann 	struct virtio_gpu_ctrl_hdr hdr;
311bc79e964SGerd Hoffmann 	uint32_t capset_id;
312bc79e964SGerd Hoffmann 	uint32_t capset_max_version;
313bc79e964SGerd Hoffmann 	uint32_t capset_max_size;
314bc79e964SGerd Hoffmann 	uint32_t padding;
315bc79e964SGerd Hoffmann };
316bc79e964SGerd Hoffmann 
317bc79e964SGerd Hoffmann /* VIRTIO_GPU_CMD_GET_CAPSET */
318bc79e964SGerd Hoffmann struct virtio_gpu_get_capset {
319bc79e964SGerd Hoffmann 	struct virtio_gpu_ctrl_hdr hdr;
320bc79e964SGerd Hoffmann 	uint32_t capset_id;
321bc79e964SGerd Hoffmann 	uint32_t capset_version;
322bc79e964SGerd Hoffmann };
323bc79e964SGerd Hoffmann 
324bc79e964SGerd Hoffmann /* VIRTIO_GPU_RESP_OK_CAPSET */
325bc79e964SGerd Hoffmann struct virtio_gpu_resp_capset {
326bc79e964SGerd Hoffmann 	struct virtio_gpu_ctrl_hdr hdr;
327bc79e964SGerd Hoffmann 	uint8_t capset_data[];
328bc79e964SGerd Hoffmann };
329bc79e964SGerd Hoffmann 
330da054c64SPaolo Bonzini /* VIRTIO_GPU_CMD_GET_EDID */
331da054c64SPaolo Bonzini struct virtio_gpu_cmd_get_edid {
332da054c64SPaolo Bonzini 	struct virtio_gpu_ctrl_hdr hdr;
333da054c64SPaolo Bonzini 	uint32_t scanout;
334da054c64SPaolo Bonzini 	uint32_t padding;
335da054c64SPaolo Bonzini };
336da054c64SPaolo Bonzini 
337da054c64SPaolo Bonzini /* VIRTIO_GPU_RESP_OK_EDID */
338da054c64SPaolo Bonzini struct virtio_gpu_resp_edid {
339da054c64SPaolo Bonzini 	struct virtio_gpu_ctrl_hdr hdr;
340da054c64SPaolo Bonzini 	uint32_t size;
341da054c64SPaolo Bonzini 	uint32_t padding;
342da054c64SPaolo Bonzini 	uint8_t edid[1024];
343da054c64SPaolo Bonzini };
344da054c64SPaolo Bonzini 
34553476e07SGerd Hoffmann #define VIRTIO_GPU_EVENT_DISPLAY (1 << 0)
34653476e07SGerd Hoffmann 
34753476e07SGerd Hoffmann struct virtio_gpu_config {
34853476e07SGerd Hoffmann 	uint32_t events_read;
34953476e07SGerd Hoffmann 	uint32_t events_clear;
35053476e07SGerd Hoffmann 	uint32_t num_scanouts;
351bc79e964SGerd Hoffmann 	uint32_t num_capsets;
35253476e07SGerd Hoffmann };
35353476e07SGerd Hoffmann 
35453476e07SGerd Hoffmann /* simple formats for fbcon/X use */
35553476e07SGerd Hoffmann enum virtio_gpu_formats {
35653476e07SGerd Hoffmann 	VIRTIO_GPU_FORMAT_B8G8R8A8_UNORM  = 1,
35753476e07SGerd Hoffmann 	VIRTIO_GPU_FORMAT_B8G8R8X8_UNORM  = 2,
35853476e07SGerd Hoffmann 	VIRTIO_GPU_FORMAT_A8R8G8B8_UNORM  = 3,
35953476e07SGerd Hoffmann 	VIRTIO_GPU_FORMAT_X8R8G8B8_UNORM  = 4,
36053476e07SGerd Hoffmann 
36153476e07SGerd Hoffmann 	VIRTIO_GPU_FORMAT_R8G8B8A8_UNORM  = 67,
36253476e07SGerd Hoffmann 	VIRTIO_GPU_FORMAT_X8B8G8R8_UNORM  = 68,
36353476e07SGerd Hoffmann 
36453476e07SGerd Hoffmann 	VIRTIO_GPU_FORMAT_A8B8G8R8_UNORM  = 121,
36553476e07SGerd Hoffmann 	VIRTIO_GPU_FORMAT_R8G8B8X8_UNORM  = 134,
36653476e07SGerd Hoffmann };
36753476e07SGerd Hoffmann 
36853ba2eeeSMatthew Rosato /* VIRTIO_GPU_CMD_RESOURCE_ASSIGN_UUID */
36953ba2eeeSMatthew Rosato struct virtio_gpu_resource_assign_uuid {
37053ba2eeeSMatthew Rosato 	struct virtio_gpu_ctrl_hdr hdr;
37153ba2eeeSMatthew Rosato 	uint32_t resource_id;
37253ba2eeeSMatthew Rosato 	uint32_t padding;
37353ba2eeeSMatthew Rosato };
37453ba2eeeSMatthew Rosato 
37553ba2eeeSMatthew Rosato /* VIRTIO_GPU_RESP_OK_RESOURCE_UUID */
37653ba2eeeSMatthew Rosato struct virtio_gpu_resp_resource_uuid {
37753ba2eeeSMatthew Rosato 	struct virtio_gpu_ctrl_hdr hdr;
37853ba2eeeSMatthew Rosato 	uint8_t uuid[16];
37953ba2eeeSMatthew Rosato };
38053ba2eeeSMatthew Rosato 
381*b3c818a4SEric Farman /* VIRTIO_GPU_CMD_RESOURCE_CREATE_BLOB */
382*b3c818a4SEric Farman struct virtio_gpu_resource_create_blob {
383*b3c818a4SEric Farman 	struct virtio_gpu_ctrl_hdr hdr;
384*b3c818a4SEric Farman 	uint32_t resource_id;
385*b3c818a4SEric Farman #define VIRTIO_GPU_BLOB_MEM_GUEST             0x0001
386*b3c818a4SEric Farman #define VIRTIO_GPU_BLOB_MEM_HOST3D            0x0002
387*b3c818a4SEric Farman #define VIRTIO_GPU_BLOB_MEM_HOST3D_GUEST      0x0003
388*b3c818a4SEric Farman 
389*b3c818a4SEric Farman #define VIRTIO_GPU_BLOB_FLAG_USE_MAPPABLE     0x0001
390*b3c818a4SEric Farman #define VIRTIO_GPU_BLOB_FLAG_USE_SHAREABLE    0x0002
391*b3c818a4SEric Farman #define VIRTIO_GPU_BLOB_FLAG_USE_CROSS_DEVICE 0x0004
392*b3c818a4SEric Farman 	/* zero is invalid blob mem */
393*b3c818a4SEric Farman 	uint32_t blob_mem;
394*b3c818a4SEric Farman 	uint32_t blob_flags;
395*b3c818a4SEric Farman 	uint32_t nr_entries;
396*b3c818a4SEric Farman 	uint64_t blob_id;
397*b3c818a4SEric Farman 	uint64_t size;
398*b3c818a4SEric Farman 	/*
399*b3c818a4SEric Farman 	 * sizeof(nr_entries * virtio_gpu_mem_entry) bytes follow
400*b3c818a4SEric Farman 	 */
401*b3c818a4SEric Farman };
402*b3c818a4SEric Farman 
403*b3c818a4SEric Farman /* VIRTIO_GPU_CMD_SET_SCANOUT_BLOB */
404*b3c818a4SEric Farman struct virtio_gpu_set_scanout_blob {
405*b3c818a4SEric Farman 	struct virtio_gpu_ctrl_hdr hdr;
406*b3c818a4SEric Farman 	struct virtio_gpu_rect r;
407*b3c818a4SEric Farman 	uint32_t scanout_id;
408*b3c818a4SEric Farman 	uint32_t resource_id;
409*b3c818a4SEric Farman 	uint32_t width;
410*b3c818a4SEric Farman 	uint32_t height;
411*b3c818a4SEric Farman 	uint32_t format;
412*b3c818a4SEric Farman 	uint32_t padding;
413*b3c818a4SEric Farman 	uint32_t strides[4];
414*b3c818a4SEric Farman 	uint32_t offsets[4];
415*b3c818a4SEric Farman };
416*b3c818a4SEric Farman 
417*b3c818a4SEric Farman /* VIRTIO_GPU_CMD_RESOURCE_MAP_BLOB */
418*b3c818a4SEric Farman struct virtio_gpu_resource_map_blob {
419*b3c818a4SEric Farman 	struct virtio_gpu_ctrl_hdr hdr;
420*b3c818a4SEric Farman 	uint32_t resource_id;
421*b3c818a4SEric Farman 	uint32_t padding;
422*b3c818a4SEric Farman 	uint64_t offset;
423*b3c818a4SEric Farman };
424*b3c818a4SEric Farman 
425*b3c818a4SEric Farman /* VIRTIO_GPU_RESP_OK_MAP_INFO */
426*b3c818a4SEric Farman #define VIRTIO_GPU_MAP_CACHE_MASK     0x0f
427*b3c818a4SEric Farman #define VIRTIO_GPU_MAP_CACHE_NONE     0x00
428*b3c818a4SEric Farman #define VIRTIO_GPU_MAP_CACHE_CACHED   0x01
429*b3c818a4SEric Farman #define VIRTIO_GPU_MAP_CACHE_UNCACHED 0x02
430*b3c818a4SEric Farman #define VIRTIO_GPU_MAP_CACHE_WC       0x03
431*b3c818a4SEric Farman struct virtio_gpu_resp_map_info {
432*b3c818a4SEric Farman 	struct virtio_gpu_ctrl_hdr hdr;
433*b3c818a4SEric Farman 	uint32_t map_info;
434*b3c818a4SEric Farman 	uint32_t padding;
435*b3c818a4SEric Farman };
436*b3c818a4SEric Farman 
437*b3c818a4SEric Farman /* VIRTIO_GPU_CMD_RESOURCE_UNMAP_BLOB */
438*b3c818a4SEric Farman struct virtio_gpu_resource_unmap_blob {
439*b3c818a4SEric Farman 	struct virtio_gpu_ctrl_hdr hdr;
440*b3c818a4SEric Farman 	uint32_t resource_id;
441*b3c818a4SEric Farman 	uint32_t padding;
442*b3c818a4SEric Farman };
443*b3c818a4SEric Farman 
44453476e07SGerd Hoffmann #endif
445