virtio_gpu.h 9.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412
  1. /*
  2. * Copyright (c) 2006-2023, RT-Thread Development Team
  3. *
  4. * SPDX-License-Identifier: Apache-2.0
  5. *
  6. * Change Logs:
  7. * Date Author Notes
  8. * 2021-11-11 GuEe-GUI the first version
  9. */
  10. #ifndef __VIRTIO_GPU_H__
  11. #define __VIRTIO_GPU_H__
  12. #include <rtdef.h>
  13. #include <virtio.h>
  14. #define VIRTIO_GPU_QUEUE_CTRL 0
  15. #define VIRTIO_GPU_QUEUE_CURSOR 1
  16. #define VIRTIO_GPU_QUEUE_SIZE 32
  17. #define VIRTIO_GPU_F_VIRGL 0 /* VIRTIO_GPU_CMD_CTX_*, VIRTIO_GPU_CMD_*_3D */
  18. #define VIRTIO_GPU_F_EDID 1 /* VIRTIO_GPU_CMD_GET_EDID */
  19. #define VIRTIO_GPU_F_RESOURCE_UUID 2 /* VIRTIO_GPU_CMD_RESOURCE_ASSIGN_UUID */
  20. #define VIRTIO_GPU_F_RESOURCE_BLOB 3 /* VIRTIO_GPU_CMD_RESOURCE_CREATE_BLOB */
  21. #define VIRTIO_GPU_F_CONTEXT_INIT 4 /* VIRTIO_GPU_CMD_CREATE_CONTEXT with context_init and multiple timelines */
  22. #define VIRTIO_GPU_EVENT_DISPLAY (1 << 0)
  23. #define VIRTIO_GPU_FORMAT_BPP 32
  24. #define VIRTIO_GPU_FORMAT_PIXEL 4
  25. #define VIRTIO_GPU_CURSOR_WIDTH 64
  26. #define VIRTIO_GPU_CURSOR_HEIGHT 64
  27. #define VIRTIO_GPU_CURSOR_IMG_SIZE (VIRTIO_GPU_CURSOR_WIDTH * VIRTIO_GPU_CURSOR_HEIGHT * VIRTIO_GPU_FORMAT_PIXEL)
  28. #define VIRTIO_GPU_INVALID_PMODE_ID RT_UINT32_MAX
  29. /* GPU control */
  30. struct virtio_gpu_config
  31. {
  32. rt_uint32_t events_read;
  33. rt_uint32_t events_clear;
  34. rt_uint32_t num_scanouts; /* 1 ~ 16 */
  35. rt_uint32_t reserved;
  36. };
  37. enum virtio_gpu_ctrl_type
  38. {
  39. VIRTIO_GPU_UNDEFINED = 0,
  40. /* 2d commands */
  41. VIRTIO_GPU_CMD_GET_DISPLAY_INFO = 0x0100,
  42. VIRTIO_GPU_CMD_RESOURCE_CREATE_2D,
  43. VIRTIO_GPU_CMD_RESOURCE_UNREF,
  44. VIRTIO_GPU_CMD_SET_SCANOUT,
  45. VIRTIO_GPU_CMD_RESOURCE_FLUSH,
  46. VIRTIO_GPU_CMD_TRANSFER_TO_HOST_2D,
  47. VIRTIO_GPU_CMD_RESOURCE_ATTACH_BACKING,
  48. VIRTIO_GPU_CMD_RESOURCE_DETACH_BACKING,
  49. VIRTIO_GPU_CMD_GET_CAPSET_INFO,
  50. VIRTIO_GPU_CMD_GET_CAPSET,
  51. VIRTIO_GPU_CMD_GET_EDID,
  52. VIRTIO_GPU_CMD_RESOURCE_ASSIGN_UUID,
  53. VIRTIO_GPU_CMD_RESOURCE_CREATE_BLOB,
  54. VIRTIO_GPU_CMD_SET_SCANOUT_BLOB,
  55. /* 3d commands */
  56. VIRTIO_GPU_CMD_CTX_CREATE = 0x0200,
  57. VIRTIO_GPU_CMD_CTX_DESTROY,
  58. VIRTIO_GPU_CMD_CTX_ATTACH_RESOURCE,
  59. VIRTIO_GPU_CMD_CTX_DETACH_RESOURCE,
  60. VIRTIO_GPU_CMD_RESOURCE_CREATE_3D,
  61. VIRTIO_GPU_CMD_TRANSFER_TO_HOST_3D,
  62. VIRTIO_GPU_CMD_TRANSFER_FROM_HOST_3D,
  63. VIRTIO_GPU_CMD_SUBMIT_3D,
  64. VIRTIO_GPU_CMD_RESOURCE_MAP_BLOB,
  65. VIRTIO_GPU_CMD_RESOURCE_UNMAP_BLOB,
  66. /* cursor commands */
  67. VIRTIO_GPU_CMD_UPDATE_CURSOR = 0x0300,
  68. VIRTIO_GPU_CMD_MOVE_CURSOR,
  69. /* success responses */
  70. VIRTIO_GPU_RESP_OK_NODATA = 0x1100,
  71. VIRTIO_GPU_RESP_OK_DISPLAY_INFO,
  72. VIRTIO_GPU_RESP_OK_CAPSET_INFO,
  73. VIRTIO_GPU_RESP_OK_CAPSET,
  74. VIRTIO_GPU_RESP_OK_EDID,
  75. VIRTIO_GPU_RESP_OK_RESOURCE_UUID,
  76. VIRTIO_GPU_RESP_OK_MAP_INFO,
  77. /* error responses */
  78. VIRTIO_GPU_RESP_ERR_UNSPEC = 0x1200,
  79. VIRTIO_GPU_RESP_ERR_OUT_OF_MEMORY,
  80. VIRTIO_GPU_RESP_ERR_INVALID_SCANOUT_ID,
  81. VIRTIO_GPU_RESP_ERR_INVALID_RESOURCE_ID,
  82. VIRTIO_GPU_RESP_ERR_INVALID_CONTEXT_ID,
  83. VIRTIO_GPU_RESP_ERR_INVALID_PARAMETER,
  84. };
  85. #define VIRTIO_GPU_FLAG_FENCE (1 << 0)
  86. struct virtio_gpu_ctrl_hdr
  87. {
  88. rt_uint32_t type;
  89. rt_uint32_t flags;
  90. rt_uint64_t fence_id;
  91. rt_uint32_t ctx_id;
  92. rt_uint8_t ring_idx;
  93. rt_uint8_t padding[3];
  94. };
  95. #define VIRTIO_GPU_MAX_SCANOUTS 16
  96. struct virtio_gpu_rect
  97. {
  98. rt_uint32_t x;
  99. rt_uint32_t y;
  100. rt_uint32_t width;
  101. rt_uint32_t height;
  102. };
  103. struct virtio_gpu_resp_display_info
  104. {
  105. struct virtio_gpu_ctrl_hdr hdr;
  106. struct virtio_gpu_display_one
  107. {
  108. struct virtio_gpu_rect r;
  109. rt_uint32_t enabled;
  110. rt_uint32_t flags;
  111. } pmodes[VIRTIO_GPU_MAX_SCANOUTS];
  112. };
  113. struct virtio_gpu_get_edid
  114. {
  115. struct virtio_gpu_ctrl_hdr hdr;
  116. rt_uint32_t scanout;
  117. rt_uint32_t padding;
  118. };
  119. struct virtio_gpu_resp_edid
  120. {
  121. struct virtio_gpu_ctrl_hdr hdr;
  122. rt_uint32_t size;
  123. rt_uint32_t padding;
  124. rt_uint8_t edid[1024];
  125. };
  126. enum virtio_gpu_formats
  127. {
  128. VIRTIO_GPU_FORMAT_B8G8R8A8_UNORM = 1,
  129. VIRTIO_GPU_FORMAT_B8G8R8X8_UNORM = 2,
  130. VIRTIO_GPU_FORMAT_A8R8G8B8_UNORM = 3,
  131. VIRTIO_GPU_FORMAT_X8R8G8B8_UNORM = 4,
  132. VIRTIO_GPU_FORMAT_R8G8B8A8_UNORM = 67,
  133. VIRTIO_GPU_FORMAT_X8B8G8R8_UNORM = 68,
  134. VIRTIO_GPU_FORMAT_A8B8G8R8_UNORM = 121,
  135. VIRTIO_GPU_FORMAT_R8G8B8X8_UNORM = 134,
  136. };
  137. struct virtio_gpu_resource_create_2d
  138. {
  139. struct virtio_gpu_ctrl_hdr hdr;
  140. rt_uint32_t resource_id;
  141. rt_uint32_t format;
  142. rt_uint32_t width;
  143. rt_uint32_t height;
  144. };
  145. struct virtio_gpu_resource_unref
  146. {
  147. struct virtio_gpu_ctrl_hdr hdr;
  148. rt_uint32_t resource_id;
  149. rt_uint32_t padding;
  150. };
  151. struct virtio_gpu_set_scanout
  152. {
  153. struct virtio_gpu_ctrl_hdr hdr;
  154. struct virtio_gpu_rect r;
  155. rt_uint32_t scanout_id;
  156. rt_uint32_t resource_id;
  157. };
  158. struct virtio_gpu_resource_flush
  159. {
  160. struct virtio_gpu_ctrl_hdr hdr;
  161. struct virtio_gpu_rect r;
  162. rt_uint32_t resource_id;
  163. rt_uint32_t padding;
  164. };
  165. struct virtio_gpu_transfer_to_host_2d
  166. {
  167. struct virtio_gpu_ctrl_hdr hdr;
  168. struct virtio_gpu_rect r;
  169. rt_uint64_t offset;
  170. rt_uint32_t resource_id;
  171. rt_uint32_t padding;
  172. };
  173. struct virtio_gpu_resource_attach_backing
  174. {
  175. struct virtio_gpu_ctrl_hdr hdr;
  176. rt_uint32_t resource_id;
  177. rt_uint32_t nr_entries;
  178. };
  179. struct virtio_gpu_mem_entry
  180. {
  181. rt_uint64_t addr;
  182. rt_uint32_t length;
  183. rt_uint32_t padding;
  184. };
  185. struct virtio_gpu_resource_detach_backing
  186. {
  187. struct virtio_gpu_ctrl_hdr hdr;
  188. rt_uint32_t resource_id;
  189. rt_uint32_t padding;
  190. };
  191. struct virtio_gpu_get_capset_info
  192. {
  193. struct virtio_gpu_ctrl_hdr hdr;
  194. rt_uint32_t capset_index;
  195. rt_uint32_t padding;
  196. };
  197. #define VIRTIO_GPU_CAPSET_VIRGL 1
  198. #define VIRTIO_GPU_CAPSET_VIRGL2 2
  199. #define VIRTIO_GPU_CAPSET_GFXSTREAM 3
  200. #define VIRTIO_GPU_CAPSET_VENUS 4
  201. #define VIRTIO_GPU_CAPSET_CROSS_DOMAIN 5
  202. struct virtio_gpu_resp_capset_info
  203. {
  204. struct virtio_gpu_ctrl_hdr hdr;
  205. rt_uint32_t capset_id;
  206. rt_uint32_t capset_max_version;
  207. rt_uint32_t capset_max_size;
  208. rt_uint32_t padding;
  209. };
  210. struct virtio_gpu_get_capset
  211. {
  212. struct virtio_gpu_ctrl_hdr hdr;
  213. rt_uint32_t capset_id;
  214. rt_uint32_t capset_version;
  215. };
  216. struct virtio_gpu_resp_capset
  217. {
  218. struct virtio_gpu_ctrl_hdr hdr;
  219. rt_uint8_t capset_data[];
  220. };
  221. struct virtio_gpu_resource_assign_uuid
  222. {
  223. struct virtio_gpu_ctrl_hdr hdr;
  224. rt_uint32_t resource_id;
  225. rt_uint32_t padding;
  226. };
  227. struct virtio_gpu_resp_resource_uuid
  228. {
  229. struct virtio_gpu_ctrl_hdr hdr;
  230. rt_uint8_t uuid[16];
  231. };
  232. #define VIRTIO_GPU_BLOB_MEM_GUEST 0x0001
  233. #define VIRTIO_GPU_BLOB_MEM_HOST3D 0x0002
  234. #define VIRTIO_GPU_BLOB_MEM_HOST3D_GUEST 0x0003
  235. #define VIRTIO_GPU_BLOB_FLAG_USE_MAPPABLE 0x0001
  236. #define VIRTIO_GPU_BLOB_FLAG_USE_SHAREABLE 0x0002
  237. #define VIRTIO_GPU_BLOB_FLAG_USE_CROSS_DEVICE 0x0004
  238. struct virtio_gpu_resource_create_blob
  239. {
  240. struct virtio_gpu_ctrl_hdr hdr;
  241. rt_uint32_t resource_id;
  242. rt_uint32_t blob_mem;
  243. rt_uint32_t blob_flags;
  244. rt_uint32_t nr_entries;
  245. rt_uint64_t blob_id;
  246. rt_uint64_t size;
  247. };
  248. struct virtio_gpu_set_scanout_blob
  249. {
  250. struct virtio_gpu_ctrl_hdr hdr;
  251. struct virtio_gpu_rect r;
  252. rt_uint32_t scanout_id;
  253. rt_uint32_t resource_id;
  254. rt_uint32_t width;
  255. rt_uint32_t height;
  256. rt_uint32_t format;
  257. rt_uint32_t padding;
  258. rt_uint32_t strides[4];
  259. rt_uint32_t offsets[4];
  260. };
  261. #define VIRTIO_GPU_CONTEXT_INIT_CAPSET_ID_MASK 0x000000ff
  262. struct virtio_gpu_ctx_create
  263. {
  264. struct virtio_gpu_ctrl_hdr hdr;
  265. rt_uint32_t nlen;
  266. rt_uint32_t context_init;
  267. char debug_name[64];
  268. };
  269. struct virtio_gpu_resource_map_blob
  270. {
  271. struct virtio_gpu_ctrl_hdr hdr;
  272. rt_uint32_t resource_id;
  273. rt_uint32_t padding;
  274. rt_uint64_t offset;
  275. };
  276. #define VIRTIO_GPU_MAP_CACHE_MASK 0x0f
  277. #define VIRTIO_GPU_MAP_CACHE_NONE 0x00
  278. #define VIRTIO_GPU_MAP_CACHE_CACHED 0x01
  279. #define VIRTIO_GPU_MAP_CACHE_UNCACHED 0x02
  280. #define VIRTIO_GPU_MAP_CACHE_WC 0x03
  281. struct virtio_gpu_resp_map_info
  282. {
  283. struct virtio_gpu_ctrl_hdr hdr;
  284. rt_uint32_t map_info;
  285. rt_uint32_t padding;
  286. };
  287. struct virtio_gpu_resource_unmap_blob
  288. {
  289. struct virtio_gpu_ctrl_hdr hdr;
  290. rt_uint32_t resource_id;
  291. rt_uint32_t padding;
  292. };
  293. /* GPU cursor */
  294. struct virtio_gpu_cursor_pos
  295. {
  296. rt_uint32_t scanout_id;
  297. rt_uint32_t x;
  298. rt_uint32_t y;
  299. rt_uint32_t padding;
  300. };
  301. struct virtio_gpu_update_cursor
  302. {
  303. struct virtio_gpu_ctrl_hdr hdr;
  304. struct virtio_gpu_cursor_pos pos;
  305. rt_uint32_t resource_id;
  306. rt_uint32_t hot_x;
  307. rt_uint32_t hot_y;
  308. rt_uint32_t padding;
  309. };
  310. struct virtio_gpu_device
  311. {
  312. struct rt_device parent;
  313. struct virtio_device virtio_dev;
  314. /* Current display's info */
  315. struct virtio_gpu_display_one pmode;
  316. enum virtio_gpu_formats format;
  317. rt_uint32_t pmode_id;
  318. rt_uint32_t cursor_x, cursor_y;
  319. rt_uint32_t display_resource_id;
  320. rt_uint32_t cursor_resource_id;
  321. rt_uint32_t next_resource_id;
  322. /* Display framebuffer */
  323. struct rt_mutex rw_mutex;
  324. void *framebuffer;
  325. rt_uint32_t smem_len;
  326. /* Cursor image info */
  327. rt_bool_t cursor_enable;
  328. struct rt_mutex ops_mutex;
  329. rt_uint8_t cursor_img[VIRTIO_GPU_CURSOR_IMG_SIZE];
  330. /* GPU request info */
  331. struct virtio_gpu_resp_display_info gpu_request;
  332. struct
  333. {
  334. rt_bool_t ctrl_valid;
  335. rt_bool_t cursor_valid;
  336. struct virtio_gpu_update_cursor cursor_cmd;
  337. } info[VIRTIO_GPU_QUEUE_SIZE];
  338. };
  339. rt_err_t rt_virtio_gpu_init(rt_ubase_t *mmio_base, rt_uint32_t irq);
  340. enum
  341. {
  342. VIRTIO_DEVICE_CTRL_GPU_SET_PRIMARY = 0x20,
  343. VIRTIO_DEVICE_CTRL_GPU_CREATE_2D,
  344. VIRTIO_DEVICE_CTRL_CURSOR_SETUP,
  345. VIRTIO_DEVICE_CTRL_CURSOR_SET_IMG,
  346. VIRTIO_DEVICE_CTRL_CURSOR_MOVE,
  347. };
  348. #endif /* __VIRTIO_GPU_H__ */