virtio_gpu.h 8.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343
  1. /*
  2. * Virtio GPU Device
  3. *
  4. * Copyright Red Hat, Inc. 2013-2014
  5. *
  6. * Authors:
  7. * Dave Airlie <airlied@redhat.com>
  8. * Gerd Hoffmann <kraxel@redhat.com>
  9. *
  10. * This header is BSD licensed so anyone can use the definitions
  11. * to implement compatible drivers/servers:
  12. *
  13. * Redistribution and use in source and binary forms, with or without
  14. * modification, are permitted provided that the following conditions
  15. * are met:
  16. * 1. Redistributions of source code must retain the above copyright
  17. * notice, this list of conditions and the following disclaimer.
  18. * 2. Redistributions in binary form must reproduce the above copyright
  19. * notice, this list of conditions and the following disclaimer in the
  20. * documentation and/or other materials provided with the distribution.
  21. * 3. Neither the name of IBM nor the names of its contributors
  22. * may be used to endorse or promote products derived from this software
  23. * without specific prior written permission.
  24. * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
  25. * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
  26. * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
  27. * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL IBM OR
  28. * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
  29. * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
  30. * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
  31. * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
  32. * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
  33. * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
  34. * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
  35. * SUCH DAMAGE.
  36. */
  37. #ifndef VIRTIO_GPU_HW_H
  38. #define VIRTIO_GPU_HW_H
  39. #include <linux/types.h>
  40. /*
  41. * VIRTIO_GPU_CMD_CTX_*
  42. * VIRTIO_GPU_CMD_*_3D
  43. */
  44. #define VIRTIO_GPU_F_VIRGL 0
  45. /*
  46. * VIRTIO_GPU_CMD_GET_EDID
  47. */
  48. #define VIRTIO_GPU_F_EDID 1
  49. enum virtio_gpu_ctrl_type {
  50. VIRTIO_GPU_UNDEFINED = 0,
  51. /* 2d commands */
  52. VIRTIO_GPU_CMD_GET_DISPLAY_INFO = 0x0100,
  53. VIRTIO_GPU_CMD_RESOURCE_CREATE_2D,
  54. VIRTIO_GPU_CMD_RESOURCE_UNREF,
  55. VIRTIO_GPU_CMD_SET_SCANOUT,
  56. VIRTIO_GPU_CMD_RESOURCE_FLUSH,
  57. VIRTIO_GPU_CMD_TRANSFER_TO_HOST_2D,
  58. VIRTIO_GPU_CMD_RESOURCE_ATTACH_BACKING,
  59. VIRTIO_GPU_CMD_RESOURCE_DETACH_BACKING,
  60. VIRTIO_GPU_CMD_GET_CAPSET_INFO,
  61. VIRTIO_GPU_CMD_GET_CAPSET,
  62. VIRTIO_GPU_CMD_GET_EDID,
  63. /* 3d commands */
  64. VIRTIO_GPU_CMD_CTX_CREATE = 0x0200,
  65. VIRTIO_GPU_CMD_CTX_DESTROY,
  66. VIRTIO_GPU_CMD_CTX_ATTACH_RESOURCE,
  67. VIRTIO_GPU_CMD_CTX_DETACH_RESOURCE,
  68. VIRTIO_GPU_CMD_RESOURCE_CREATE_3D,
  69. VIRTIO_GPU_CMD_TRANSFER_TO_HOST_3D,
  70. VIRTIO_GPU_CMD_TRANSFER_FROM_HOST_3D,
  71. VIRTIO_GPU_CMD_SUBMIT_3D,
  72. /* cursor commands */
  73. VIRTIO_GPU_CMD_UPDATE_CURSOR = 0x0300,
  74. VIRTIO_GPU_CMD_MOVE_CURSOR,
  75. /* success responses */
  76. VIRTIO_GPU_RESP_OK_NODATA = 0x1100,
  77. VIRTIO_GPU_RESP_OK_DISPLAY_INFO,
  78. VIRTIO_GPU_RESP_OK_CAPSET_INFO,
  79. VIRTIO_GPU_RESP_OK_CAPSET,
  80. VIRTIO_GPU_RESP_OK_EDID,
  81. /* error responses */
  82. VIRTIO_GPU_RESP_ERR_UNSPEC = 0x1200,
  83. VIRTIO_GPU_RESP_ERR_OUT_OF_MEMORY,
  84. VIRTIO_GPU_RESP_ERR_INVALID_SCANOUT_ID,
  85. VIRTIO_GPU_RESP_ERR_INVALID_RESOURCE_ID,
  86. VIRTIO_GPU_RESP_ERR_INVALID_CONTEXT_ID,
  87. VIRTIO_GPU_RESP_ERR_INVALID_PARAMETER,
  88. };
  89. #define VIRTIO_GPU_FLAG_FENCE (1 << 0)
  90. struct virtio_gpu_ctrl_hdr {
  91. __le32 type;
  92. __le32 flags;
  93. __le64 fence_id;
  94. __le32 ctx_id;
  95. __le32 padding;
  96. };
  97. /* data passed in the cursor vq */
  98. struct virtio_gpu_cursor_pos {
  99. __le32 scanout_id;
  100. __le32 x;
  101. __le32 y;
  102. __le32 padding;
  103. };
  104. /* VIRTIO_GPU_CMD_UPDATE_CURSOR, VIRTIO_GPU_CMD_MOVE_CURSOR */
  105. struct virtio_gpu_update_cursor {
  106. struct virtio_gpu_ctrl_hdr hdr;
  107. struct virtio_gpu_cursor_pos pos; /* update & move */
  108. __le32 resource_id; /* update only */
  109. __le32 hot_x; /* update only */
  110. __le32 hot_y; /* update only */
  111. __le32 padding;
  112. };
  113. /* data passed in the control vq, 2d related */
  114. struct virtio_gpu_rect {
  115. __le32 x;
  116. __le32 y;
  117. __le32 width;
  118. __le32 height;
  119. };
  120. /* VIRTIO_GPU_CMD_RESOURCE_UNREF */
  121. struct virtio_gpu_resource_unref {
  122. struct virtio_gpu_ctrl_hdr hdr;
  123. __le32 resource_id;
  124. __le32 padding;
  125. };
  126. /* VIRTIO_GPU_CMD_RESOURCE_CREATE_2D: create a 2d resource with a format */
  127. struct virtio_gpu_resource_create_2d {
  128. struct virtio_gpu_ctrl_hdr hdr;
  129. __le32 resource_id;
  130. __le32 format;
  131. __le32 width;
  132. __le32 height;
  133. };
  134. /* VIRTIO_GPU_CMD_SET_SCANOUT */
  135. struct virtio_gpu_set_scanout {
  136. struct virtio_gpu_ctrl_hdr hdr;
  137. struct virtio_gpu_rect r;
  138. __le32 scanout_id;
  139. __le32 resource_id;
  140. };
  141. /* VIRTIO_GPU_CMD_RESOURCE_FLUSH */
  142. struct virtio_gpu_resource_flush {
  143. struct virtio_gpu_ctrl_hdr hdr;
  144. struct virtio_gpu_rect r;
  145. __le32 resource_id;
  146. __le32 padding;
  147. };
  148. /* VIRTIO_GPU_CMD_TRANSFER_TO_HOST_2D: simple transfer to_host */
  149. struct virtio_gpu_transfer_to_host_2d {
  150. struct virtio_gpu_ctrl_hdr hdr;
  151. struct virtio_gpu_rect r;
  152. __le64 offset;
  153. __le32 resource_id;
  154. __le32 padding;
  155. };
  156. struct virtio_gpu_mem_entry {
  157. __le64 addr;
  158. __le32 length;
  159. __le32 padding;
  160. };
  161. /* VIRTIO_GPU_CMD_RESOURCE_ATTACH_BACKING */
  162. struct virtio_gpu_resource_attach_backing {
  163. struct virtio_gpu_ctrl_hdr hdr;
  164. __le32 resource_id;
  165. __le32 nr_entries;
  166. };
  167. /* VIRTIO_GPU_CMD_RESOURCE_DETACH_BACKING */
  168. struct virtio_gpu_resource_detach_backing {
  169. struct virtio_gpu_ctrl_hdr hdr;
  170. __le32 resource_id;
  171. __le32 padding;
  172. };
  173. /* VIRTIO_GPU_RESP_OK_DISPLAY_INFO */
  174. #define VIRTIO_GPU_MAX_SCANOUTS 16
  175. struct virtio_gpu_resp_display_info {
  176. struct virtio_gpu_ctrl_hdr hdr;
  177. struct virtio_gpu_display_one {
  178. struct virtio_gpu_rect r;
  179. __le32 enabled;
  180. __le32 flags;
  181. } pmodes[VIRTIO_GPU_MAX_SCANOUTS];
  182. };
  183. /* data passed in the control vq, 3d related */
  184. struct virtio_gpu_box {
  185. __le32 x, y, z;
  186. __le32 w, h, d;
  187. };
  188. /* VIRTIO_GPU_CMD_TRANSFER_TO_HOST_3D, VIRTIO_GPU_CMD_TRANSFER_FROM_HOST_3D */
  189. struct virtio_gpu_transfer_host_3d {
  190. struct virtio_gpu_ctrl_hdr hdr;
  191. struct virtio_gpu_box box;
  192. __le64 offset;
  193. __le32 resource_id;
  194. __le32 level;
  195. __le32 stride;
  196. __le32 layer_stride;
  197. };
  198. /* VIRTIO_GPU_CMD_RESOURCE_CREATE_3D */
  199. #define VIRTIO_GPU_RESOURCE_FLAG_Y_0_TOP (1 << 0)
  200. struct virtio_gpu_resource_create_3d {
  201. struct virtio_gpu_ctrl_hdr hdr;
  202. __le32 resource_id;
  203. __le32 target;
  204. __le32 format;
  205. __le32 bind;
  206. __le32 width;
  207. __le32 height;
  208. __le32 depth;
  209. __le32 array_size;
  210. __le32 last_level;
  211. __le32 nr_samples;
  212. __le32 flags;
  213. __le32 padding;
  214. };
  215. /* VIRTIO_GPU_CMD_CTX_CREATE */
  216. struct virtio_gpu_ctx_create {
  217. struct virtio_gpu_ctrl_hdr hdr;
  218. __le32 nlen;
  219. __le32 padding;
  220. char debug_name[64];
  221. };
  222. /* VIRTIO_GPU_CMD_CTX_DESTROY */
  223. struct virtio_gpu_ctx_destroy {
  224. struct virtio_gpu_ctrl_hdr hdr;
  225. };
  226. /* VIRTIO_GPU_CMD_CTX_ATTACH_RESOURCE, VIRTIO_GPU_CMD_CTX_DETACH_RESOURCE */
  227. struct virtio_gpu_ctx_resource {
  228. struct virtio_gpu_ctrl_hdr hdr;
  229. __le32 resource_id;
  230. __le32 padding;
  231. };
  232. /* VIRTIO_GPU_CMD_SUBMIT_3D */
  233. struct virtio_gpu_cmd_submit {
  234. struct virtio_gpu_ctrl_hdr hdr;
  235. __le32 size;
  236. __le32 padding;
  237. };
  238. #define VIRTIO_GPU_CAPSET_VIRGL 1
  239. #define VIRTIO_GPU_CAPSET_VIRGL2 2
  240. /* VIRTIO_GPU_CMD_GET_CAPSET_INFO */
  241. struct virtio_gpu_get_capset_info {
  242. struct virtio_gpu_ctrl_hdr hdr;
  243. __le32 capset_index;
  244. __le32 padding;
  245. };
  246. /* VIRTIO_GPU_RESP_OK_CAPSET_INFO */
  247. struct virtio_gpu_resp_capset_info {
  248. struct virtio_gpu_ctrl_hdr hdr;
  249. __le32 capset_id;
  250. __le32 capset_max_version;
  251. __le32 capset_max_size;
  252. __le32 padding;
  253. };
  254. /* VIRTIO_GPU_CMD_GET_CAPSET */
  255. struct virtio_gpu_get_capset {
  256. struct virtio_gpu_ctrl_hdr hdr;
  257. __le32 capset_id;
  258. __le32 capset_version;
  259. };
  260. /* VIRTIO_GPU_RESP_OK_CAPSET */
  261. struct virtio_gpu_resp_capset {
  262. struct virtio_gpu_ctrl_hdr hdr;
  263. __u8 capset_data[];
  264. };
  265. /* VIRTIO_GPU_CMD_GET_EDID */
  266. struct virtio_gpu_cmd_get_edid {
  267. struct virtio_gpu_ctrl_hdr hdr;
  268. __le32 scanout;
  269. __le32 padding;
  270. };
  271. /* VIRTIO_GPU_RESP_OK_EDID */
  272. struct virtio_gpu_resp_edid {
  273. struct virtio_gpu_ctrl_hdr hdr;
  274. __le32 size;
  275. __le32 padding;
  276. __u8 edid[1024];
  277. };
  278. #define VIRTIO_GPU_EVENT_DISPLAY (1 << 0)
  279. struct virtio_gpu_config {
  280. __u32 events_read;
  281. __u32 events_clear;
  282. __u32 num_scanouts;
  283. __u32 num_capsets;
  284. };
  285. /* simple formats for fbcon/X use */
  286. enum virtio_gpu_formats {
  287. VIRTIO_GPU_FORMAT_B8G8R8A8_UNORM = 1,
  288. VIRTIO_GPU_FORMAT_B8G8R8X8_UNORM = 2,
  289. VIRTIO_GPU_FORMAT_A8R8G8B8_UNORM = 3,
  290. VIRTIO_GPU_FORMAT_X8R8G8B8_UNORM = 4,
  291. VIRTIO_GPU_FORMAT_R8G8B8A8_UNORM = 67,
  292. VIRTIO_GPU_FORMAT_X8B8G8R8_UNORM = 68,
  293. VIRTIO_GPU_FORMAT_A8B8G8R8_UNORM = 121,
  294. VIRTIO_GPU_FORMAT_R8G8B8X8_UNORM = 134,
  295. };
  296. #endif