xref: /linux/include/uapi/linux/virtio_gpu.h (revision dc5698e80cf724770283e10414054662bdf6ccfa)
1*dc5698e8SDave Airlie /*
2*dc5698e8SDave Airlie  * Virtio GPU Device
3*dc5698e8SDave Airlie  *
4*dc5698e8SDave Airlie  * Copyright Red Hat, Inc. 2013-2014
5*dc5698e8SDave Airlie  *
6*dc5698e8SDave Airlie  * Authors:
7*dc5698e8SDave Airlie  *     Dave Airlie <airlied@redhat.com>
8*dc5698e8SDave Airlie  *     Gerd Hoffmann <kraxel@redhat.com>
9*dc5698e8SDave Airlie  *
10*dc5698e8SDave Airlie  * This header is BSD licensed so anyone can use the definitions
11*dc5698e8SDave Airlie  * to implement compatible drivers/servers:
12*dc5698e8SDave Airlie  *
13*dc5698e8SDave Airlie  * Redistribution and use in source and binary forms, with or without
14*dc5698e8SDave Airlie  * modification, are permitted provided that the following conditions
15*dc5698e8SDave Airlie  * are met:
16*dc5698e8SDave Airlie  * 1. Redistributions of source code must retain the above copyright
17*dc5698e8SDave Airlie  *    notice, this list of conditions and the following disclaimer.
18*dc5698e8SDave Airlie  * 2. Redistributions in binary form must reproduce the above copyright
19*dc5698e8SDave Airlie  *    notice, this list of conditions and the following disclaimer in the
20*dc5698e8SDave Airlie  *    documentation and/or other materials provided with the distribution.
21*dc5698e8SDave Airlie  * 3. Neither the name of IBM nor the names of its contributors
22*dc5698e8SDave Airlie  *    may be used to endorse or promote products derived from this software
23*dc5698e8SDave Airlie  *    without specific prior written permission.
24*dc5698e8SDave Airlie  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
25*dc5698e8SDave Airlie  * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
26*dc5698e8SDave Airlie  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
27*dc5698e8SDave Airlie  * FOR A PARTICULAR PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL IBM OR
28*dc5698e8SDave Airlie  * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
29*dc5698e8SDave Airlie  * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
30*dc5698e8SDave Airlie  * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
31*dc5698e8SDave Airlie  * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
32*dc5698e8SDave Airlie  * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
33*dc5698e8SDave Airlie  * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
34*dc5698e8SDave Airlie  * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
35*dc5698e8SDave Airlie  * SUCH DAMAGE.
36*dc5698e8SDave Airlie  */
37*dc5698e8SDave Airlie 
38*dc5698e8SDave Airlie #ifndef VIRTIO_GPU_HW_H
39*dc5698e8SDave Airlie #define VIRTIO_GPU_HW_H
40*dc5698e8SDave Airlie 
41*dc5698e8SDave Airlie enum virtio_gpu_ctrl_type {
42*dc5698e8SDave Airlie 	VIRTIO_GPU_UNDEFINED = 0,
43*dc5698e8SDave Airlie 
44*dc5698e8SDave Airlie 	/* 2d commands */
45*dc5698e8SDave Airlie 	VIRTIO_GPU_CMD_GET_DISPLAY_INFO = 0x0100,
46*dc5698e8SDave Airlie 	VIRTIO_GPU_CMD_RESOURCE_CREATE_2D,
47*dc5698e8SDave Airlie 	VIRTIO_GPU_CMD_RESOURCE_UNREF,
48*dc5698e8SDave Airlie 	VIRTIO_GPU_CMD_SET_SCANOUT,
49*dc5698e8SDave Airlie 	VIRTIO_GPU_CMD_RESOURCE_FLUSH,
50*dc5698e8SDave Airlie 	VIRTIO_GPU_CMD_TRANSFER_TO_HOST_2D,
51*dc5698e8SDave Airlie 	VIRTIO_GPU_CMD_RESOURCE_ATTACH_BACKING,
52*dc5698e8SDave Airlie 	VIRTIO_GPU_CMD_RESOURCE_DETACH_BACKING,
53*dc5698e8SDave Airlie 
54*dc5698e8SDave Airlie 	/* cursor commands */
55*dc5698e8SDave Airlie 	VIRTIO_GPU_CMD_UPDATE_CURSOR = 0x0300,
56*dc5698e8SDave Airlie 	VIRTIO_GPU_CMD_MOVE_CURSOR,
57*dc5698e8SDave Airlie 
58*dc5698e8SDave Airlie 	/* success responses */
59*dc5698e8SDave Airlie 	VIRTIO_GPU_RESP_OK_NODATA = 0x1100,
60*dc5698e8SDave Airlie 	VIRTIO_GPU_RESP_OK_DISPLAY_INFO,
61*dc5698e8SDave Airlie 
62*dc5698e8SDave Airlie 	/* error responses */
63*dc5698e8SDave Airlie 	VIRTIO_GPU_RESP_ERR_UNSPEC = 0x1200,
64*dc5698e8SDave Airlie 	VIRTIO_GPU_RESP_ERR_OUT_OF_MEMORY,
65*dc5698e8SDave Airlie 	VIRTIO_GPU_RESP_ERR_INVALID_SCANOUT_ID,
66*dc5698e8SDave Airlie 	VIRTIO_GPU_RESP_ERR_INVALID_RESOURCE_ID,
67*dc5698e8SDave Airlie 	VIRTIO_GPU_RESP_ERR_INVALID_CONTEXT_ID,
68*dc5698e8SDave Airlie 	VIRTIO_GPU_RESP_ERR_INVALID_PARAMETER,
69*dc5698e8SDave Airlie };
70*dc5698e8SDave Airlie 
71*dc5698e8SDave Airlie #define VIRTIO_GPU_FLAG_FENCE (1 << 0)
72*dc5698e8SDave Airlie 
73*dc5698e8SDave Airlie struct virtio_gpu_ctrl_hdr {
74*dc5698e8SDave Airlie 	__le32 type;
75*dc5698e8SDave Airlie 	__le32 flags;
76*dc5698e8SDave Airlie 	__le64 fence_id;
77*dc5698e8SDave Airlie 	__le32 ctx_id;
78*dc5698e8SDave Airlie 	__le32 padding;
79*dc5698e8SDave Airlie };
80*dc5698e8SDave Airlie 
81*dc5698e8SDave Airlie /* data passed in the cursor vq */
82*dc5698e8SDave Airlie 
83*dc5698e8SDave Airlie struct virtio_gpu_cursor_pos {
84*dc5698e8SDave Airlie 	__le32 scanout_id;
85*dc5698e8SDave Airlie 	__le32 x;
86*dc5698e8SDave Airlie 	__le32 y;
87*dc5698e8SDave Airlie 	__le32 padding;
88*dc5698e8SDave Airlie };
89*dc5698e8SDave Airlie 
90*dc5698e8SDave Airlie /* VIRTIO_GPU_CMD_UPDATE_CURSOR, VIRTIO_GPU_CMD_MOVE_CURSOR */
91*dc5698e8SDave Airlie struct virtio_gpu_update_cursor {
92*dc5698e8SDave Airlie 	struct virtio_gpu_ctrl_hdr hdr;
93*dc5698e8SDave Airlie 	struct virtio_gpu_cursor_pos pos;  /* update & move */
94*dc5698e8SDave Airlie 	__le32 resource_id;           /* update only */
95*dc5698e8SDave Airlie 	__le32 hot_x;                 /* update only */
96*dc5698e8SDave Airlie 	__le32 hot_y;                 /* update only */
97*dc5698e8SDave Airlie 	__le32 padding;
98*dc5698e8SDave Airlie };
99*dc5698e8SDave Airlie 
100*dc5698e8SDave Airlie /* data passed in the control vq, 2d related */
101*dc5698e8SDave Airlie 
102*dc5698e8SDave Airlie struct virtio_gpu_rect {
103*dc5698e8SDave Airlie 	__le32 x;
104*dc5698e8SDave Airlie 	__le32 y;
105*dc5698e8SDave Airlie 	__le32 width;
106*dc5698e8SDave Airlie 	__le32 height;
107*dc5698e8SDave Airlie };
108*dc5698e8SDave Airlie 
109*dc5698e8SDave Airlie /* VIRTIO_GPU_CMD_RESOURCE_UNREF */
110*dc5698e8SDave Airlie struct virtio_gpu_resource_unref {
111*dc5698e8SDave Airlie 	struct virtio_gpu_ctrl_hdr hdr;
112*dc5698e8SDave Airlie 	__le32 resource_id;
113*dc5698e8SDave Airlie 	__le32 padding;
114*dc5698e8SDave Airlie };
115*dc5698e8SDave Airlie 
116*dc5698e8SDave Airlie /* VIRTIO_GPU_CMD_RESOURCE_CREATE_2D: create a 2d resource with a format */
117*dc5698e8SDave Airlie struct virtio_gpu_resource_create_2d {
118*dc5698e8SDave Airlie 	struct virtio_gpu_ctrl_hdr hdr;
119*dc5698e8SDave Airlie 	__le32 resource_id;
120*dc5698e8SDave Airlie 	__le32 format;
121*dc5698e8SDave Airlie 	__le32 width;
122*dc5698e8SDave Airlie 	__le32 height;
123*dc5698e8SDave Airlie };
124*dc5698e8SDave Airlie 
125*dc5698e8SDave Airlie /* VIRTIO_GPU_CMD_SET_SCANOUT */
126*dc5698e8SDave Airlie struct virtio_gpu_set_scanout {
127*dc5698e8SDave Airlie 	struct virtio_gpu_ctrl_hdr hdr;
128*dc5698e8SDave Airlie 	struct virtio_gpu_rect r;
129*dc5698e8SDave Airlie 	__le32 scanout_id;
130*dc5698e8SDave Airlie 	__le32 resource_id;
131*dc5698e8SDave Airlie };
132*dc5698e8SDave Airlie 
133*dc5698e8SDave Airlie /* VIRTIO_GPU_CMD_RESOURCE_FLUSH */
134*dc5698e8SDave Airlie struct virtio_gpu_resource_flush {
135*dc5698e8SDave Airlie 	struct virtio_gpu_ctrl_hdr hdr;
136*dc5698e8SDave Airlie 	struct virtio_gpu_rect r;
137*dc5698e8SDave Airlie 	__le32 resource_id;
138*dc5698e8SDave Airlie 	__le32 padding;
139*dc5698e8SDave Airlie };
140*dc5698e8SDave Airlie 
141*dc5698e8SDave Airlie /* VIRTIO_GPU_CMD_TRANSFER_TO_HOST_2D: simple transfer to_host */
142*dc5698e8SDave Airlie struct virtio_gpu_transfer_to_host_2d {
143*dc5698e8SDave Airlie 	struct virtio_gpu_ctrl_hdr hdr;
144*dc5698e8SDave Airlie 	struct virtio_gpu_rect r;
145*dc5698e8SDave Airlie 	__le64 offset;
146*dc5698e8SDave Airlie 	__le32 resource_id;
147*dc5698e8SDave Airlie 	__le32 padding;
148*dc5698e8SDave Airlie };
149*dc5698e8SDave Airlie 
150*dc5698e8SDave Airlie struct virtio_gpu_mem_entry {
151*dc5698e8SDave Airlie 	__le64 addr;
152*dc5698e8SDave Airlie 	__le32 length;
153*dc5698e8SDave Airlie 	__le32 padding;
154*dc5698e8SDave Airlie };
155*dc5698e8SDave Airlie 
156*dc5698e8SDave Airlie /* VIRTIO_GPU_CMD_RESOURCE_ATTACH_BACKING */
157*dc5698e8SDave Airlie struct virtio_gpu_resource_attach_backing {
158*dc5698e8SDave Airlie 	struct virtio_gpu_ctrl_hdr hdr;
159*dc5698e8SDave Airlie 	__le32 resource_id;
160*dc5698e8SDave Airlie 	__le32 nr_entries;
161*dc5698e8SDave Airlie };
162*dc5698e8SDave Airlie 
163*dc5698e8SDave Airlie /* VIRTIO_GPU_CMD_RESOURCE_DETACH_BACKING */
164*dc5698e8SDave Airlie struct virtio_gpu_resource_detach_backing {
165*dc5698e8SDave Airlie 	struct virtio_gpu_ctrl_hdr hdr;
166*dc5698e8SDave Airlie 	__le32 resource_id;
167*dc5698e8SDave Airlie 	__le32 padding;
168*dc5698e8SDave Airlie };
169*dc5698e8SDave Airlie 
170*dc5698e8SDave Airlie /* VIRTIO_GPU_RESP_OK_DISPLAY_INFO */
171*dc5698e8SDave Airlie #define VIRTIO_GPU_MAX_SCANOUTS 16
172*dc5698e8SDave Airlie struct virtio_gpu_resp_display_info {
173*dc5698e8SDave Airlie 	struct virtio_gpu_ctrl_hdr hdr;
174*dc5698e8SDave Airlie 	struct virtio_gpu_display_one {
175*dc5698e8SDave Airlie 		struct virtio_gpu_rect r;
176*dc5698e8SDave Airlie 		__le32 enabled;
177*dc5698e8SDave Airlie 		__le32 flags;
178*dc5698e8SDave Airlie 	} pmodes[VIRTIO_GPU_MAX_SCANOUTS];
179*dc5698e8SDave Airlie };
180*dc5698e8SDave Airlie 
181*dc5698e8SDave Airlie #define VIRTIO_GPU_EVENT_DISPLAY (1 << 0)
182*dc5698e8SDave Airlie 
183*dc5698e8SDave Airlie struct virtio_gpu_config {
184*dc5698e8SDave Airlie 	__u32 events_read;
185*dc5698e8SDave Airlie 	__u32 events_clear;
186*dc5698e8SDave Airlie 	__u32 num_scanouts;
187*dc5698e8SDave Airlie 	__u32 reserved;
188*dc5698e8SDave Airlie };
189*dc5698e8SDave Airlie 
190*dc5698e8SDave Airlie /* simple formats for fbcon/X use */
191*dc5698e8SDave Airlie enum virtio_gpu_formats {
192*dc5698e8SDave Airlie 	VIRTIO_GPU_FORMAT_B8G8R8A8_UNORM  = 1,
193*dc5698e8SDave Airlie 	VIRTIO_GPU_FORMAT_B8G8R8X8_UNORM  = 2,
194*dc5698e8SDave Airlie 	VIRTIO_GPU_FORMAT_A8R8G8B8_UNORM  = 3,
195*dc5698e8SDave Airlie 	VIRTIO_GPU_FORMAT_X8R8G8B8_UNORM  = 4,
196*dc5698e8SDave Airlie 
197*dc5698e8SDave Airlie 	VIRTIO_GPU_FORMAT_R8G8B8A8_UNORM  = 67,
198*dc5698e8SDave Airlie 	VIRTIO_GPU_FORMAT_X8B8G8R8_UNORM  = 68,
199*dc5698e8SDave Airlie 
200*dc5698e8SDave Airlie 	VIRTIO_GPU_FORMAT_A8B8G8R8_UNORM  = 121,
201*dc5698e8SDave Airlie 	VIRTIO_GPU_FORMAT_R8G8B8X8_UNORM  = 134,
202*dc5698e8SDave Airlie };
203*dc5698e8SDave Airlie 
204*dc5698e8SDave Airlie #endif
205