virtio_gpu.h 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456
  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. /*
  50. * VIRTIO_GPU_CMD_RESOURCE_ASSIGN_UUID
  51. */
  52. #define VIRTIO_GPU_F_RESOURCE_UUID 2
  53. /*
  54. * VIRTIO_GPU_CMD_RESOURCE_CREATE_BLOB
  55. */
  56. #define VIRTIO_GPU_F_RESOURCE_BLOB 3
  57. /*
  58. * VIRTIO_GPU_CMD_CREATE_CONTEXT with
  59. * context_init and multiple timelines
  60. */
  61. #define VIRTIO_GPU_F_CONTEXT_INIT 4
  62. enum virtio_gpu_ctrl_type {
  63. VIRTIO_GPU_UNDEFINED = 0,
  64. /* 2d commands */
  65. VIRTIO_GPU_CMD_GET_DISPLAY_INFO = 0x0100,
  66. VIRTIO_GPU_CMD_RESOURCE_CREATE_2D,
  67. VIRTIO_GPU_CMD_RESOURCE_UNREF,
  68. VIRTIO_GPU_CMD_SET_SCANOUT,
  69. VIRTIO_GPU_CMD_RESOURCE_FLUSH,
  70. VIRTIO_GPU_CMD_TRANSFER_TO_HOST_2D,
  71. VIRTIO_GPU_CMD_RESOURCE_ATTACH_BACKING,
  72. VIRTIO_GPU_CMD_RESOURCE_DETACH_BACKING,
  73. VIRTIO_GPU_CMD_GET_CAPSET_INFO,
  74. VIRTIO_GPU_CMD_GET_CAPSET,
  75. VIRTIO_GPU_CMD_GET_EDID,
  76. VIRTIO_GPU_CMD_RESOURCE_ASSIGN_UUID,
  77. VIRTIO_GPU_CMD_RESOURCE_CREATE_BLOB,
  78. VIRTIO_GPU_CMD_SET_SCANOUT_BLOB,
  79. /* 3d commands */
  80. VIRTIO_GPU_CMD_CTX_CREATE = 0x0200,
  81. VIRTIO_GPU_CMD_CTX_DESTROY,
  82. VIRTIO_GPU_CMD_CTX_ATTACH_RESOURCE,
  83. VIRTIO_GPU_CMD_CTX_DETACH_RESOURCE,
  84. VIRTIO_GPU_CMD_RESOURCE_CREATE_3D,
  85. VIRTIO_GPU_CMD_TRANSFER_TO_HOST_3D,
  86. VIRTIO_GPU_CMD_TRANSFER_FROM_HOST_3D,
  87. VIRTIO_GPU_CMD_SUBMIT_3D,
  88. VIRTIO_GPU_CMD_RESOURCE_MAP_BLOB,
  89. VIRTIO_GPU_CMD_RESOURCE_UNMAP_BLOB,
  90. /* cursor commands */
  91. VIRTIO_GPU_CMD_UPDATE_CURSOR = 0x0300,
  92. VIRTIO_GPU_CMD_MOVE_CURSOR,
  93. /* success responses */
  94. VIRTIO_GPU_RESP_OK_NODATA = 0x1100,
  95. VIRTIO_GPU_RESP_OK_DISPLAY_INFO,
  96. VIRTIO_GPU_RESP_OK_CAPSET_INFO,
  97. VIRTIO_GPU_RESP_OK_CAPSET,
  98. VIRTIO_GPU_RESP_OK_EDID,
  99. VIRTIO_GPU_RESP_OK_RESOURCE_UUID,
  100. VIRTIO_GPU_RESP_OK_MAP_INFO,
  101. /* error responses */
  102. VIRTIO_GPU_RESP_ERR_UNSPEC = 0x1200,
  103. VIRTIO_GPU_RESP_ERR_OUT_OF_MEMORY,
  104. VIRTIO_GPU_RESP_ERR_INVALID_SCANOUT_ID,
  105. VIRTIO_GPU_RESP_ERR_INVALID_RESOURCE_ID,
  106. VIRTIO_GPU_RESP_ERR_INVALID_CONTEXT_ID,
  107. VIRTIO_GPU_RESP_ERR_INVALID_PARAMETER,
  108. };
  109. enum virtio_gpu_shm_id {
  110. VIRTIO_GPU_SHM_ID_UNDEFINED = 0,
  111. /*
  112. * VIRTIO_GPU_CMD_RESOURCE_MAP_BLOB
  113. * VIRTIO_GPU_CMD_RESOURCE_UNMAP_BLOB
  114. */
  115. VIRTIO_GPU_SHM_ID_HOST_VISIBLE = 1
  116. };
  117. #define VIRTIO_GPU_FLAG_FENCE (1 << 0)
  118. /*
  119. * If the following flag is set, then ring_idx contains the index
  120. * of the command ring that needs to used when creating the fence
  121. */
  122. #define VIRTIO_GPU_FLAG_INFO_RING_IDX (1 << 1)
  123. struct virtio_gpu_ctrl_hdr {
  124. __le32 type;
  125. __le32 flags;
  126. __le64 fence_id;
  127. __le32 ctx_id;
  128. __u8 ring_idx;
  129. __u8 padding[3];
  130. };
  131. /* data passed in the cursor vq */
  132. struct virtio_gpu_cursor_pos {
  133. __le32 scanout_id;
  134. __le32 x;
  135. __le32 y;
  136. __le32 padding;
  137. };
  138. /* VIRTIO_GPU_CMD_UPDATE_CURSOR, VIRTIO_GPU_CMD_MOVE_CURSOR */
  139. struct virtio_gpu_update_cursor {
  140. struct virtio_gpu_ctrl_hdr hdr;
  141. struct virtio_gpu_cursor_pos pos; /* update & move */
  142. __le32 resource_id; /* update only */
  143. __le32 hot_x; /* update only */
  144. __le32 hot_y; /* update only */
  145. __le32 padding;
  146. };
  147. /* data passed in the control vq, 2d related */
  148. struct virtio_gpu_rect {
  149. __le32 x;
  150. __le32 y;
  151. __le32 width;
  152. __le32 height;
  153. };
  154. /* VIRTIO_GPU_CMD_RESOURCE_UNREF */
  155. struct virtio_gpu_resource_unref {
  156. struct virtio_gpu_ctrl_hdr hdr;
  157. __le32 resource_id;
  158. __le32 padding;
  159. };
  160. /* VIRTIO_GPU_CMD_RESOURCE_CREATE_2D: create a 2d resource with a format */
  161. struct virtio_gpu_resource_create_2d {
  162. struct virtio_gpu_ctrl_hdr hdr;
  163. __le32 resource_id;
  164. __le32 format;
  165. __le32 width;
  166. __le32 height;
  167. };
  168. /* VIRTIO_GPU_CMD_SET_SCANOUT */
  169. struct virtio_gpu_set_scanout {
  170. struct virtio_gpu_ctrl_hdr hdr;
  171. struct virtio_gpu_rect r;
  172. __le32 scanout_id;
  173. __le32 resource_id;
  174. };
  175. /* VIRTIO_GPU_CMD_RESOURCE_FLUSH */
  176. struct virtio_gpu_resource_flush {
  177. struct virtio_gpu_ctrl_hdr hdr;
  178. struct virtio_gpu_rect r;
  179. __le32 resource_id;
  180. __le32 padding;
  181. };
  182. /* VIRTIO_GPU_CMD_TRANSFER_TO_HOST_2D: simple transfer to_host */
  183. struct virtio_gpu_transfer_to_host_2d {
  184. struct virtio_gpu_ctrl_hdr hdr;
  185. struct virtio_gpu_rect r;
  186. __le64 offset;
  187. __le32 resource_id;
  188. __le32 padding;
  189. };
  190. struct virtio_gpu_mem_entry {
  191. __le64 addr;
  192. __le32 length;
  193. __le32 padding;
  194. };
  195. /* VIRTIO_GPU_CMD_RESOURCE_ATTACH_BACKING */
  196. struct virtio_gpu_resource_attach_backing {
  197. struct virtio_gpu_ctrl_hdr hdr;
  198. __le32 resource_id;
  199. __le32 nr_entries;
  200. };
  201. /* VIRTIO_GPU_CMD_RESOURCE_DETACH_BACKING */
  202. struct virtio_gpu_resource_detach_backing {
  203. struct virtio_gpu_ctrl_hdr hdr;
  204. __le32 resource_id;
  205. __le32 padding;
  206. };
  207. /* VIRTIO_GPU_RESP_OK_DISPLAY_INFO */
  208. #define VIRTIO_GPU_MAX_SCANOUTS 16
  209. struct virtio_gpu_resp_display_info {
  210. struct virtio_gpu_ctrl_hdr hdr;
  211. struct virtio_gpu_display_one {
  212. struct virtio_gpu_rect r;
  213. __le32 enabled;
  214. __le32 flags;
  215. } pmodes[VIRTIO_GPU_MAX_SCANOUTS];
  216. };
  217. /* data passed in the control vq, 3d related */
  218. struct virtio_gpu_box {
  219. __le32 x, y, z;
  220. __le32 w, h, d;
  221. };
  222. /* VIRTIO_GPU_CMD_TRANSFER_TO_HOST_3D, VIRTIO_GPU_CMD_TRANSFER_FROM_HOST_3D */
  223. struct virtio_gpu_transfer_host_3d {
  224. struct virtio_gpu_ctrl_hdr hdr;
  225. struct virtio_gpu_box box;
  226. __le64 offset;
  227. __le32 resource_id;
  228. __le32 level;
  229. __le32 stride;
  230. __le32 layer_stride;
  231. };
  232. /* VIRTIO_GPU_CMD_RESOURCE_CREATE_3D */
  233. #define VIRTIO_GPU_RESOURCE_FLAG_Y_0_TOP (1 << 0)
  234. struct virtio_gpu_resource_create_3d {
  235. struct virtio_gpu_ctrl_hdr hdr;
  236. __le32 resource_id;
  237. __le32 target;
  238. __le32 format;
  239. __le32 bind;
  240. __le32 width;
  241. __le32 height;
  242. __le32 depth;
  243. __le32 array_size;
  244. __le32 last_level;
  245. __le32 nr_samples;
  246. __le32 flags;
  247. __le32 padding;
  248. };
  249. /* VIRTIO_GPU_CMD_CTX_CREATE */
  250. #define VIRTIO_GPU_CONTEXT_INIT_CAPSET_ID_MASK 0x000000ff
  251. struct virtio_gpu_ctx_create {
  252. struct virtio_gpu_ctrl_hdr hdr;
  253. __le32 nlen;
  254. __le32 context_init;
  255. char debug_name[64];
  256. };
  257. /* VIRTIO_GPU_CMD_CTX_DESTROY */
  258. struct virtio_gpu_ctx_destroy {
  259. struct virtio_gpu_ctrl_hdr hdr;
  260. };
  261. /* VIRTIO_GPU_CMD_CTX_ATTACH_RESOURCE, VIRTIO_GPU_CMD_CTX_DETACH_RESOURCE */
  262. struct virtio_gpu_ctx_resource {
  263. struct virtio_gpu_ctrl_hdr hdr;
  264. __le32 resource_id;
  265. __le32 padding;
  266. };
  267. /* VIRTIO_GPU_CMD_SUBMIT_3D */
  268. struct virtio_gpu_cmd_submit {
  269. struct virtio_gpu_ctrl_hdr hdr;
  270. __le32 size;
  271. __le32 padding;
  272. };
  273. #define VIRTIO_GPU_CAPSET_VIRGL 1
  274. #define VIRTIO_GPU_CAPSET_VIRGL2 2
  275. /* VIRTIO_GPU_CMD_GET_CAPSET_INFO */
  276. struct virtio_gpu_get_capset_info {
  277. struct virtio_gpu_ctrl_hdr hdr;
  278. __le32 capset_index;
  279. __le32 padding;
  280. };
  281. /* VIRTIO_GPU_RESP_OK_CAPSET_INFO */
  282. struct virtio_gpu_resp_capset_info {
  283. struct virtio_gpu_ctrl_hdr hdr;
  284. __le32 capset_id;
  285. __le32 capset_max_version;
  286. __le32 capset_max_size;
  287. __le32 padding;
  288. };
  289. /* VIRTIO_GPU_CMD_GET_CAPSET */
  290. struct virtio_gpu_get_capset {
  291. struct virtio_gpu_ctrl_hdr hdr;
  292. __le32 capset_id;
  293. __le32 capset_version;
  294. };
  295. /* VIRTIO_GPU_RESP_OK_CAPSET */
  296. struct virtio_gpu_resp_capset {
  297. struct virtio_gpu_ctrl_hdr hdr;
  298. __u8 capset_data[];
  299. };
  300. /* VIRTIO_GPU_CMD_GET_EDID */
  301. struct virtio_gpu_cmd_get_edid {
  302. struct virtio_gpu_ctrl_hdr hdr;
  303. __le32 scanout;
  304. __le32 padding;
  305. };
  306. /* VIRTIO_GPU_RESP_OK_EDID */
  307. struct virtio_gpu_resp_edid {
  308. struct virtio_gpu_ctrl_hdr hdr;
  309. __le32 size;
  310. __le32 padding;
  311. __u8 edid[1024];
  312. };
  313. #define VIRTIO_GPU_EVENT_DISPLAY (1 << 0)
  314. struct virtio_gpu_config {
  315. __le32 events_read;
  316. __le32 events_clear;
  317. __le32 num_scanouts;
  318. __le32 num_capsets;
  319. };
  320. /* simple formats for fbcon/X use */
  321. enum virtio_gpu_formats {
  322. VIRTIO_GPU_FORMAT_B8G8R8A8_UNORM = 1,
  323. VIRTIO_GPU_FORMAT_B8G8R8X8_UNORM = 2,
  324. VIRTIO_GPU_FORMAT_A8R8G8B8_UNORM = 3,
  325. VIRTIO_GPU_FORMAT_X8R8G8B8_UNORM = 4,
  326. VIRTIO_GPU_FORMAT_R8G8B8A8_UNORM = 67,
  327. VIRTIO_GPU_FORMAT_X8B8G8R8_UNORM = 68,
  328. VIRTIO_GPU_FORMAT_A8B8G8R8_UNORM = 121,
  329. VIRTIO_GPU_FORMAT_R8G8B8X8_UNORM = 134,
  330. };
  331. /* VIRTIO_GPU_CMD_RESOURCE_ASSIGN_UUID */
  332. struct virtio_gpu_resource_assign_uuid {
  333. struct virtio_gpu_ctrl_hdr hdr;
  334. __le32 resource_id;
  335. __le32 padding;
  336. };
  337. /* VIRTIO_GPU_RESP_OK_RESOURCE_UUID */
  338. struct virtio_gpu_resp_resource_uuid {
  339. struct virtio_gpu_ctrl_hdr hdr;
  340. __u8 uuid[16];
  341. };
  342. /* VIRTIO_GPU_CMD_RESOURCE_CREATE_BLOB */
  343. struct virtio_gpu_resource_create_blob {
  344. struct virtio_gpu_ctrl_hdr hdr;
  345. __le32 resource_id;
  346. #define VIRTIO_GPU_BLOB_MEM_GUEST 0x0001
  347. #define VIRTIO_GPU_BLOB_MEM_HOST3D 0x0002
  348. #define VIRTIO_GPU_BLOB_MEM_HOST3D_GUEST 0x0003
  349. #define VIRTIO_GPU_BLOB_FLAG_USE_MAPPABLE 0x0001
  350. #define VIRTIO_GPU_BLOB_FLAG_USE_SHAREABLE 0x0002
  351. #define VIRTIO_GPU_BLOB_FLAG_USE_CROSS_DEVICE 0x0004
  352. /* zero is invalid blob mem */
  353. __le32 blob_mem;
  354. __le32 blob_flags;
  355. __le32 nr_entries;
  356. __le64 blob_id;
  357. __le64 size;
  358. /*
  359. * sizeof(nr_entries * virtio_gpu_mem_entry) bytes follow
  360. */
  361. };
  362. /* VIRTIO_GPU_CMD_SET_SCANOUT_BLOB */
  363. struct virtio_gpu_set_scanout_blob {
  364. struct virtio_gpu_ctrl_hdr hdr;
  365. struct virtio_gpu_rect r;
  366. __le32 scanout_id;
  367. __le32 resource_id;
  368. __le32 width;
  369. __le32 height;
  370. __le32 format;
  371. __le32 padding;
  372. __le32 strides[4];
  373. __le32 offsets[4];
  374. };
  375. /* VIRTIO_GPU_CMD_RESOURCE_MAP_BLOB */
  376. struct virtio_gpu_resource_map_blob {
  377. struct virtio_gpu_ctrl_hdr hdr;
  378. __le32 resource_id;
  379. __le32 padding;
  380. __le64 offset;
  381. };
  382. /* VIRTIO_GPU_RESP_OK_MAP_INFO */
  383. #define VIRTIO_GPU_MAP_CACHE_MASK 0x0f
  384. #define VIRTIO_GPU_MAP_CACHE_NONE 0x00
  385. #define VIRTIO_GPU_MAP_CACHE_CACHED 0x01
  386. #define VIRTIO_GPU_MAP_CACHE_UNCACHED 0x02
  387. #define VIRTIO_GPU_MAP_CACHE_WC 0x03
  388. struct virtio_gpu_resp_map_info {
  389. struct virtio_gpu_ctrl_hdr hdr;
  390. __u32 map_info;
  391. __u32 padding;
  392. };
  393. /* VIRTIO_GPU_CMD_RESOURCE_UNMAP_BLOB */
  394. struct virtio_gpu_resource_unmap_blob {
  395. struct virtio_gpu_ctrl_hdr hdr;
  396. __le32 resource_id;
  397. __le32 padding;
  398. };
  399. #endif