virtio_gpu.h 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459
  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 "standard-headers/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. uint32_t type;
  125. uint32_t flags;
  126. uint64_t fence_id;
  127. uint32_t ctx_id;
  128. uint8_t ring_idx;
  129. uint8_t padding[3];
  130. };
  131. /* data passed in the cursor vq */
  132. struct virtio_gpu_cursor_pos {
  133. uint32_t scanout_id;
  134. uint32_t x;
  135. uint32_t y;
  136. uint32_t 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. uint32_t resource_id; /* update only */
  143. uint32_t hot_x; /* update only */
  144. uint32_t hot_y; /* update only */
  145. uint32_t padding;
  146. };
  147. /* data passed in the control vq, 2d related */
  148. struct virtio_gpu_rect {
  149. uint32_t x;
  150. uint32_t y;
  151. uint32_t width;
  152. uint32_t height;
  153. };
  154. /* VIRTIO_GPU_CMD_RESOURCE_UNREF */
  155. struct virtio_gpu_resource_unref {
  156. struct virtio_gpu_ctrl_hdr hdr;
  157. uint32_t resource_id;
  158. uint32_t 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. uint32_t resource_id;
  164. uint32_t format;
  165. uint32_t width;
  166. uint32_t 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. uint32_t scanout_id;
  173. uint32_t 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. uint32_t resource_id;
  180. uint32_t 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. uint64_t offset;
  187. uint32_t resource_id;
  188. uint32_t padding;
  189. };
  190. struct virtio_gpu_mem_entry {
  191. uint64_t addr;
  192. uint32_t length;
  193. uint32_t padding;
  194. };
  195. /* VIRTIO_GPU_CMD_RESOURCE_ATTACH_BACKING */
  196. struct virtio_gpu_resource_attach_backing {
  197. struct virtio_gpu_ctrl_hdr hdr;
  198. uint32_t resource_id;
  199. uint32_t 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. uint32_t resource_id;
  205. uint32_t 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. uint32_t enabled;
  214. uint32_t flags;
  215. } pmodes[VIRTIO_GPU_MAX_SCANOUTS];
  216. };
  217. /* data passed in the control vq, 3d related */
  218. struct virtio_gpu_box {
  219. uint32_t x, y, z;
  220. uint32_t 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. uint64_t offset;
  227. uint32_t resource_id;
  228. uint32_t level;
  229. uint32_t stride;
  230. uint32_t 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. uint32_t resource_id;
  237. uint32_t target;
  238. uint32_t format;
  239. uint32_t bind;
  240. uint32_t width;
  241. uint32_t height;
  242. uint32_t depth;
  243. uint32_t array_size;
  244. uint32_t last_level;
  245. uint32_t nr_samples;
  246. uint32_t flags;
  247. uint32_t 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. uint32_t nlen;
  254. uint32_t 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. uint32_t resource_id;
  265. uint32_t padding;
  266. };
  267. /* VIRTIO_GPU_CMD_SUBMIT_3D */
  268. struct virtio_gpu_cmd_submit {
  269. struct virtio_gpu_ctrl_hdr hdr;
  270. uint32_t size;
  271. uint32_t padding;
  272. };
  273. #define VIRTIO_GPU_CAPSET_VIRGL 1
  274. #define VIRTIO_GPU_CAPSET_VIRGL2 2
  275. /* 3 is reserved for gfxstream */
  276. #define VIRTIO_GPU_CAPSET_VENUS 4
  277. #define VIRTIO_GPU_CAPSET_DRM 6
  278. /* VIRTIO_GPU_CMD_GET_CAPSET_INFO */
  279. struct virtio_gpu_get_capset_info {
  280. struct virtio_gpu_ctrl_hdr hdr;
  281. uint32_t capset_index;
  282. uint32_t padding;
  283. };
  284. /* VIRTIO_GPU_RESP_OK_CAPSET_INFO */
  285. struct virtio_gpu_resp_capset_info {
  286. struct virtio_gpu_ctrl_hdr hdr;
  287. uint32_t capset_id;
  288. uint32_t capset_max_version;
  289. uint32_t capset_max_size;
  290. uint32_t padding;
  291. };
  292. /* VIRTIO_GPU_CMD_GET_CAPSET */
  293. struct virtio_gpu_get_capset {
  294. struct virtio_gpu_ctrl_hdr hdr;
  295. uint32_t capset_id;
  296. uint32_t capset_version;
  297. };
  298. /* VIRTIO_GPU_RESP_OK_CAPSET */
  299. struct virtio_gpu_resp_capset {
  300. struct virtio_gpu_ctrl_hdr hdr;
  301. uint8_t capset_data[];
  302. };
  303. /* VIRTIO_GPU_CMD_GET_EDID */
  304. struct virtio_gpu_cmd_get_edid {
  305. struct virtio_gpu_ctrl_hdr hdr;
  306. uint32_t scanout;
  307. uint32_t padding;
  308. };
  309. /* VIRTIO_GPU_RESP_OK_EDID */
  310. struct virtio_gpu_resp_edid {
  311. struct virtio_gpu_ctrl_hdr hdr;
  312. uint32_t size;
  313. uint32_t padding;
  314. uint8_t edid[1024];
  315. };
  316. #define VIRTIO_GPU_EVENT_DISPLAY (1 << 0)
  317. struct virtio_gpu_config {
  318. uint32_t events_read;
  319. uint32_t events_clear;
  320. uint32_t num_scanouts;
  321. uint32_t num_capsets;
  322. };
  323. /* simple formats for fbcon/X use */
  324. enum virtio_gpu_formats {
  325. VIRTIO_GPU_FORMAT_B8G8R8A8_UNORM = 1,
  326. VIRTIO_GPU_FORMAT_B8G8R8X8_UNORM = 2,
  327. VIRTIO_GPU_FORMAT_A8R8G8B8_UNORM = 3,
  328. VIRTIO_GPU_FORMAT_X8R8G8B8_UNORM = 4,
  329. VIRTIO_GPU_FORMAT_R8G8B8A8_UNORM = 67,
  330. VIRTIO_GPU_FORMAT_X8B8G8R8_UNORM = 68,
  331. VIRTIO_GPU_FORMAT_A8B8G8R8_UNORM = 121,
  332. VIRTIO_GPU_FORMAT_R8G8B8X8_UNORM = 134,
  333. };
  334. /* VIRTIO_GPU_CMD_RESOURCE_ASSIGN_UUID */
  335. struct virtio_gpu_resource_assign_uuid {
  336. struct virtio_gpu_ctrl_hdr hdr;
  337. uint32_t resource_id;
  338. uint32_t padding;
  339. };
  340. /* VIRTIO_GPU_RESP_OK_RESOURCE_UUID */
  341. struct virtio_gpu_resp_resource_uuid {
  342. struct virtio_gpu_ctrl_hdr hdr;
  343. uint8_t uuid[16];
  344. };
  345. /* VIRTIO_GPU_CMD_RESOURCE_CREATE_BLOB */
  346. struct virtio_gpu_resource_create_blob {
  347. struct virtio_gpu_ctrl_hdr hdr;
  348. uint32_t resource_id;
  349. #define VIRTIO_GPU_BLOB_MEM_GUEST 0x0001
  350. #define VIRTIO_GPU_BLOB_MEM_HOST3D 0x0002
  351. #define VIRTIO_GPU_BLOB_MEM_HOST3D_GUEST 0x0003
  352. #define VIRTIO_GPU_BLOB_FLAG_USE_MAPPABLE 0x0001
  353. #define VIRTIO_GPU_BLOB_FLAG_USE_SHAREABLE 0x0002
  354. #define VIRTIO_GPU_BLOB_FLAG_USE_CROSS_DEVICE 0x0004
  355. /* zero is invalid blob mem */
  356. uint32_t blob_mem;
  357. uint32_t blob_flags;
  358. uint32_t nr_entries;
  359. uint64_t blob_id;
  360. uint64_t size;
  361. /*
  362. * sizeof(nr_entries * virtio_gpu_mem_entry) bytes follow
  363. */
  364. };
  365. /* VIRTIO_GPU_CMD_SET_SCANOUT_BLOB */
  366. struct virtio_gpu_set_scanout_blob {
  367. struct virtio_gpu_ctrl_hdr hdr;
  368. struct virtio_gpu_rect r;
  369. uint32_t scanout_id;
  370. uint32_t resource_id;
  371. uint32_t width;
  372. uint32_t height;
  373. uint32_t format;
  374. uint32_t padding;
  375. uint32_t strides[4];
  376. uint32_t offsets[4];
  377. };
  378. /* VIRTIO_GPU_CMD_RESOURCE_MAP_BLOB */
  379. struct virtio_gpu_resource_map_blob {
  380. struct virtio_gpu_ctrl_hdr hdr;
  381. uint32_t resource_id;
  382. uint32_t padding;
  383. uint64_t offset;
  384. };
  385. /* VIRTIO_GPU_RESP_OK_MAP_INFO */
  386. #define VIRTIO_GPU_MAP_CACHE_MASK 0x0f
  387. #define VIRTIO_GPU_MAP_CACHE_NONE 0x00
  388. #define VIRTIO_GPU_MAP_CACHE_CACHED 0x01
  389. #define VIRTIO_GPU_MAP_CACHE_UNCACHED 0x02
  390. #define VIRTIO_GPU_MAP_CACHE_WC 0x03
  391. struct virtio_gpu_resp_map_info {
  392. struct virtio_gpu_ctrl_hdr hdr;
  393. uint32_t map_info;
  394. uint32_t padding;
  395. };
  396. /* VIRTIO_GPU_CMD_RESOURCE_UNMAP_BLOB */
  397. struct virtio_gpu_resource_unmap_blob {
  398. struct virtio_gpu_ctrl_hdr hdr;
  399. uint32_t resource_id;
  400. uint32_t padding;
  401. };
  402. #endif