1bd2e44feSMarc-André Lureau======================= 2bd2e44feSMarc-André LureauVhost-user-gpu Protocol 3bd2e44feSMarc-André Lureau======================= 4bd2e44feSMarc-André Lureau 54e0b15c2SPeter Maydell.. 64e0b15c2SPeter Maydell Licence: This work is licensed under the terms of the GNU GPL, 7bd2e44feSMarc-André Lureau version 2 or later. See the COPYING file in the top-level 8bd2e44feSMarc-André Lureau directory. 9bd2e44feSMarc-André Lureau 10bd2e44feSMarc-André Lureau.. contents:: Table of Contents 11bd2e44feSMarc-André Lureau 12bd2e44feSMarc-André LureauIntroduction 13bd2e44feSMarc-André Lureau============ 14bd2e44feSMarc-André Lureau 15bd2e44feSMarc-André LureauThe vhost-user-gpu protocol is aiming at sharing the rendering result 16bd59f2a1SPaolo Bonziniof a virtio-gpu, done from a vhost-user back-end process to a vhost-user 17bd59f2a1SPaolo Bonzinifront-end process (such as QEMU). It bears a resemblance to a display 18bd2e44feSMarc-André Lureauserver protocol, if you consider QEMU as the display server and the 19bd59f2a1SPaolo Bonziniback-end as the client, but in a very limited way. Typically, it will 20bd2e44feSMarc-André Lureauwork by setting a scanout/display configuration, before sending flush 21bd2e44feSMarc-André Lureauevents for the display updates. It will also update the cursor shape 22bd2e44feSMarc-André Lureauand position. 23bd2e44feSMarc-André Lureau 24bd2e44feSMarc-André LureauThe protocol is sent over a UNIX domain stream socket, since it uses 25bd2e44feSMarc-André Lureausocket ancillary data to share opened file descriptors (DMABUF fds or 26bd2e44feSMarc-André Lureaushared memory). The socket is usually obtained via 27bd2e44feSMarc-André Lureau``VHOST_USER_GPU_SET_SOCKET``. 28bd2e44feSMarc-André Lureau 29bd59f2a1SPaolo BonziniRequests are sent by the *back-end*, and the optional replies by the 30bd59f2a1SPaolo Bonzini*front-end*. 31bd2e44feSMarc-André Lureau 32bd2e44feSMarc-André LureauWire format 33bd2e44feSMarc-André Lureau=========== 34bd2e44feSMarc-André Lureau 35bd2e44feSMarc-André LureauUnless specified differently, numbers are in the machine native byte 36bd2e44feSMarc-André Lureauorder. 37bd2e44feSMarc-André Lureau 38bd2e44feSMarc-André LureauA vhost-user-gpu message (request and reply) consists of 3 header 39bd2e44feSMarc-André Lureaufields and a payload. 40bd2e44feSMarc-André Lureau 41bd2e44feSMarc-André Lureau+---------+-------+------+---------+ 42bd2e44feSMarc-André Lureau| request | flags | size | payload | 43bd2e44feSMarc-André Lureau+---------+-------+------+---------+ 44bd2e44feSMarc-André Lureau 45bd2e44feSMarc-André LureauHeader 46bd2e44feSMarc-André Lureau------ 47bd2e44feSMarc-André Lureau 48bd2e44feSMarc-André Lureau:request: ``u32``, type of the request 49bd2e44feSMarc-André Lureau 50bd2e44feSMarc-André Lureau:flags: ``u32``, 32-bit bit field: 51bd2e44feSMarc-André Lureau 52bd2e44feSMarc-André Lureau - Bit 2 is the reply flag - needs to be set on each reply 53bd2e44feSMarc-André Lureau 54bd2e44feSMarc-André Lureau:size: ``u32``, size of the payload 55bd2e44feSMarc-André Lureau 56bd2e44feSMarc-André LureauPayload types 57bd2e44feSMarc-André Lureau------------- 58bd2e44feSMarc-André Lureau 59bd2e44feSMarc-André LureauDepending on the request type, **payload** can be: 60bd2e44feSMarc-André Lureau 61bd2e44feSMarc-André LureauVhostUserGpuCursorPos 62bd2e44feSMarc-André Lureau^^^^^^^^^^^^^^^^^^^^^ 63bd2e44feSMarc-André Lureau 64bd2e44feSMarc-André Lureau+------------+---+---+ 65bd2e44feSMarc-André Lureau| scanout-id | x | y | 66bd2e44feSMarc-André Lureau+------------+---+---+ 67bd2e44feSMarc-André Lureau 68bd2e44feSMarc-André Lureau:scanout-id: ``u32``, the scanout where the cursor is located 69bd2e44feSMarc-André Lureau 7076ca4b58Szhaolichang:x/y: ``u32``, the cursor position 71bd2e44feSMarc-André Lureau 72bd2e44feSMarc-André LureauVhostUserGpuCursorUpdate 73bd2e44feSMarc-André Lureau^^^^^^^^^^^^^^^^^^^^^^^^ 74bd2e44feSMarc-André Lureau 75bd2e44feSMarc-André Lureau+-----+-------+-------+--------+ 76bd2e44feSMarc-André Lureau| pos | hot_x | hot_y | cursor | 77bd2e44feSMarc-André Lureau+-----+-------+-------+--------+ 78bd2e44feSMarc-André Lureau 79bd2e44feSMarc-André Lureau:pos: a ``VhostUserGpuCursorPos``, the cursor location 80bd2e44feSMarc-André Lureau 81bd2e44feSMarc-André Lureau:hot_x/hot_y: ``u32``, the cursor hot location 82bd2e44feSMarc-André Lureau 83bd2e44feSMarc-André Lureau:cursor: ``[u32; 64 * 64]``, 64x64 RGBA cursor data (PIXMAN_a8r8g8b8 format) 84bd2e44feSMarc-André Lureau 85bd2e44feSMarc-André LureauVhostUserGpuScanout 86bd2e44feSMarc-André Lureau^^^^^^^^^^^^^^^^^^^ 87bd2e44feSMarc-André Lureau 88bd2e44feSMarc-André Lureau+------------+---+---+ 89bd2e44feSMarc-André Lureau| scanout-id | w | h | 90bd2e44feSMarc-André Lureau+------------+---+---+ 91bd2e44feSMarc-André Lureau 92bd2e44feSMarc-André Lureau:scanout-id: ``u32``, the scanout configuration to set 93bd2e44feSMarc-André Lureau 94bd2e44feSMarc-André Lureau:w/h: ``u32``, the scanout width/height size 95bd2e44feSMarc-André Lureau 96bd2e44feSMarc-André LureauVhostUserGpuUpdate 97bd2e44feSMarc-André Lureau^^^^^^^^^^^^^^^^^^ 98bd2e44feSMarc-André Lureau 99bd2e44feSMarc-André Lureau+------------+---+---+---+---+------+ 100bd2e44feSMarc-André Lureau| scanout-id | x | y | w | h | data | 101bd2e44feSMarc-André Lureau+------------+---+---+---+---+------+ 102bd2e44feSMarc-André Lureau 103bd2e44feSMarc-André Lureau:scanout-id: ``u32``, the scanout content to update 104bd2e44feSMarc-André Lureau 105bd2e44feSMarc-André Lureau:x/y/w/h: ``u32``, region of the update 106bd2e44feSMarc-André Lureau 107bd2e44feSMarc-André Lureau:data: RGB data (PIXMAN_x8r8g8b8 format) 108bd2e44feSMarc-André Lureau 109bd2e44feSMarc-André LureauVhostUserGpuDMABUFScanout 110bd2e44feSMarc-André Lureau^^^^^^^^^^^^^^^^^^^^^^^^^ 111bd2e44feSMarc-André Lureau 112bd2e44feSMarc-André Lureau+------------+---+---+---+---+-----+-----+--------+-------+--------+ 113bd2e44feSMarc-André Lureau| scanout-id | x | y | w | h | fdw | fwh | stride | flags | fourcc | 114bd2e44feSMarc-André Lureau+------------+---+---+---+---+-----+-----+--------+-------+--------+ 115bd2e44feSMarc-André Lureau 116bd2e44feSMarc-André Lureau:scanout-id: ``u32``, the scanout configuration to set 117bd2e44feSMarc-André Lureau 118bd2e44feSMarc-André Lureau:x/y: ``u32``, the location of the scanout within the DMABUF 119bd2e44feSMarc-André Lureau 120bd2e44feSMarc-André Lureau:w/h: ``u32``, the scanout width/height size 121bd2e44feSMarc-André Lureau 122bd2e44feSMarc-André Lureau:fdw/fdh/stride/flags: ``u32``, the DMABUF width/height/stride/flags 123bd2e44feSMarc-André Lureau 124bd2e44feSMarc-André Lureau:fourcc: ``i32``, the DMABUF fourcc 125bd2e44feSMarc-André Lureau 126bd2e44feSMarc-André Lureau 12750cbd5b4SErico NunesVhostUserGpuEdidRequest 12850cbd5b4SErico Nunes^^^^^^^^^^^^^^^^^^^^^^^ 12950cbd5b4SErico Nunes 13050cbd5b4SErico Nunes+------------+ 13150cbd5b4SErico Nunes| scanout-id | 13250cbd5b4SErico Nunes+------------+ 13350cbd5b4SErico Nunes 13450cbd5b4SErico Nunes:scanout-id: ``u32``, the scanout to get edid from 13550cbd5b4SErico Nunes 13650cbd5b4SErico Nunes 137*75f217b4SErico NunesVhostUserGpuDMABUFScanout2 138*75f217b4SErico Nunes^^^^^^^^^^^^^^^^^^^^^^^^^^ 139*75f217b4SErico Nunes 140*75f217b4SErico Nunes+----------------+----------+ 141*75f217b4SErico Nunes| dmabuf_scanout | modifier | 142*75f217b4SErico Nunes+----------------+----------+ 143*75f217b4SErico Nunes 144*75f217b4SErico Nunes:dmabuf_scanout: ``VhostUserGpuDMABUFScanout``, filled as described in the 145*75f217b4SErico Nunes VhostUserGpuDMABUFScanout structure. 146*75f217b4SErico Nunes 147*75f217b4SErico Nunes:modifier: ``u64``, the DMABUF modifiers 148*75f217b4SErico Nunes 149*75f217b4SErico Nunes 150bd2e44feSMarc-André LureauC structure 151bd2e44feSMarc-André Lureau----------- 152bd2e44feSMarc-André Lureau 153bd2e44feSMarc-André LureauIn QEMU the vhost-user-gpu message is implemented with the following struct: 154bd2e44feSMarc-André Lureau 155bd2e44feSMarc-André Lureau.. code:: c 156bd2e44feSMarc-André Lureau 157bd2e44feSMarc-André Lureau typedef struct VhostUserGpuMsg { 158bd2e44feSMarc-André Lureau uint32_t request; /* VhostUserGpuRequest */ 159bd2e44feSMarc-André Lureau uint32_t flags; 160bd2e44feSMarc-André Lureau uint32_t size; /* the following payload size */ 161bd2e44feSMarc-André Lureau union { 162bd2e44feSMarc-André Lureau VhostUserGpuCursorPos cursor_pos; 163bd2e44feSMarc-André Lureau VhostUserGpuCursorUpdate cursor_update; 164bd2e44feSMarc-André Lureau VhostUserGpuScanout scanout; 165bd2e44feSMarc-André Lureau VhostUserGpuUpdate update; 166bd2e44feSMarc-André Lureau VhostUserGpuDMABUFScanout dmabuf_scanout; 16750cbd5b4SErico Nunes VhostUserGpuEdidRequest edid_req; 16850cbd5b4SErico Nunes struct virtio_gpu_resp_edid resp_edid; 169bd2e44feSMarc-André Lureau struct virtio_gpu_resp_display_info display_info; 170bd2e44feSMarc-André Lureau uint64_t u64; 171bd2e44feSMarc-André Lureau } payload; 172bd2e44feSMarc-André Lureau } QEMU_PACKED VhostUserGpuMsg; 173bd2e44feSMarc-André Lureau 174bd2e44feSMarc-André LureauProtocol features 175bd2e44feSMarc-André Lureau----------------- 176bd2e44feSMarc-André Lureau 17750cbd5b4SErico Nunes.. code:: c 178bd2e44feSMarc-André Lureau 17950cbd5b4SErico Nunes #define VHOST_USER_GPU_PROTOCOL_F_EDID 0 180*75f217b4SErico Nunes #define VHOST_USER_GPU_PROTOCOL_F_DMABUF2 1 18150cbd5b4SErico Nunes 18250cbd5b4SErico NunesNew messages and communication changes are negotiated thanks to the 183bd2e44feSMarc-André Lureau``VHOST_USER_GPU_GET_PROTOCOL_FEATURES`` and 184bd2e44feSMarc-André Lureau``VHOST_USER_GPU_SET_PROTOCOL_FEATURES`` requests. 185bd2e44feSMarc-André Lureau 186bd2e44feSMarc-André LureauCommunication 187bd2e44feSMarc-André Lureau============= 188bd2e44feSMarc-André Lureau 189bd2e44feSMarc-André LureauMessage types 190bd2e44feSMarc-André Lureau------------- 191bd2e44feSMarc-André Lureau 192bd2e44feSMarc-André Lureau``VHOST_USER_GPU_GET_PROTOCOL_FEATURES`` 193bd2e44feSMarc-André Lureau :id: 1 194bd2e44feSMarc-André Lureau :request payload: N/A 195bd2e44feSMarc-André Lureau :reply payload: ``u64`` 196bd2e44feSMarc-André Lureau 197bd2e44feSMarc-André Lureau Get the supported protocol features bitmask. 198bd2e44feSMarc-André Lureau 199bd2e44feSMarc-André Lureau``VHOST_USER_GPU_SET_PROTOCOL_FEATURES`` 200bd2e44feSMarc-André Lureau :id: 2 201bd2e44feSMarc-André Lureau :request payload: ``u64`` 202bd2e44feSMarc-André Lureau :reply payload: N/A 203bd2e44feSMarc-André Lureau 204bd2e44feSMarc-André Lureau Enable protocol features using a bitmask. 205bd2e44feSMarc-André Lureau 206bd2e44feSMarc-André Lureau``VHOST_USER_GPU_GET_DISPLAY_INFO`` 207bd2e44feSMarc-André Lureau :id: 3 208bd2e44feSMarc-André Lureau :request payload: N/A 209bd2e44feSMarc-André Lureau :reply payload: ``struct virtio_gpu_resp_display_info`` (from virtio specification) 210bd2e44feSMarc-André Lureau 211bd2e44feSMarc-André Lureau Get the preferred display configuration. 212bd2e44feSMarc-André Lureau 213bd2e44feSMarc-André Lureau``VHOST_USER_GPU_CURSOR_POS`` 214bd2e44feSMarc-André Lureau :id: 4 215bd2e44feSMarc-André Lureau :request payload: ``VhostUserGpuCursorPos`` 216bd2e44feSMarc-André Lureau :reply payload: N/A 217bd2e44feSMarc-André Lureau 218bd2e44feSMarc-André Lureau Set/show the cursor position. 219bd2e44feSMarc-André Lureau 220bd2e44feSMarc-André Lureau``VHOST_USER_GPU_CURSOR_POS_HIDE`` 221bd2e44feSMarc-André Lureau :id: 5 222bd2e44feSMarc-André Lureau :request payload: ``VhostUserGpuCursorPos`` 223bd2e44feSMarc-André Lureau :reply payload: N/A 224bd2e44feSMarc-André Lureau 225bd2e44feSMarc-André Lureau Set/hide the cursor. 226bd2e44feSMarc-André Lureau 227bd2e44feSMarc-André Lureau``VHOST_USER_GPU_CURSOR_UPDATE`` 228bd2e44feSMarc-André Lureau :id: 6 229bd2e44feSMarc-André Lureau :request payload: ``VhostUserGpuCursorUpdate`` 230bd2e44feSMarc-André Lureau :reply payload: N/A 231bd2e44feSMarc-André Lureau 232bd2e44feSMarc-André Lureau Update the cursor shape and location. 233bd2e44feSMarc-André Lureau 234bd2e44feSMarc-André Lureau``VHOST_USER_GPU_SCANOUT`` 235bd2e44feSMarc-André Lureau :id: 7 236bd2e44feSMarc-André Lureau :request payload: ``VhostUserGpuScanout`` 237bd2e44feSMarc-André Lureau :reply payload: N/A 238bd2e44feSMarc-André Lureau 239bd2e44feSMarc-André Lureau Set the scanout resolution. To disable a scanout, the dimensions 240bd2e44feSMarc-André Lureau width/height are set to 0. 241bd2e44feSMarc-André Lureau 242bd2e44feSMarc-André Lureau``VHOST_USER_GPU_UPDATE`` 243bd2e44feSMarc-André Lureau :id: 8 244bd2e44feSMarc-André Lureau :request payload: ``VhostUserGpuUpdate`` 245bd2e44feSMarc-André Lureau :reply payload: N/A 246bd2e44feSMarc-André Lureau 247bd2e44feSMarc-André Lureau Update the scanout content. The data payload contains the graphical bits. 248bd2e44feSMarc-André Lureau The display should be flushed and presented. 249bd2e44feSMarc-André Lureau 250bd2e44feSMarc-André Lureau``VHOST_USER_GPU_DMABUF_SCANOUT`` 251bd2e44feSMarc-André Lureau :id: 9 252bd2e44feSMarc-André Lureau :request payload: ``VhostUserGpuDMABUFScanout`` 253bd2e44feSMarc-André Lureau :reply payload: N/A 254bd2e44feSMarc-André Lureau 255bd2e44feSMarc-André Lureau Set the scanout resolution/configuration, and share a DMABUF file 256bd2e44feSMarc-André Lureau descriptor for the scanout content, which is passed as ancillary 257bd2e44feSMarc-André Lureau data. To disable a scanout, the dimensions width/height are set 258bd2e44feSMarc-André Lureau to 0, there is no file descriptor passed. 259bd2e44feSMarc-André Lureau 260bd2e44feSMarc-André Lureau``VHOST_USER_GPU_DMABUF_UPDATE`` 261bd2e44feSMarc-André Lureau :id: 10 262bd2e44feSMarc-André Lureau :request payload: ``VhostUserGpuUpdate`` 263bd2e44feSMarc-André Lureau :reply payload: empty payload 264bd2e44feSMarc-André Lureau 265bd2e44feSMarc-André Lureau The display should be flushed and presented according to updated 266bd2e44feSMarc-André Lureau region from ``VhostUserGpuUpdate``. 267bd2e44feSMarc-André Lureau 268bd2e44feSMarc-André Lureau Note: there is no data payload, since the scanout is shared thanks 269bd2e44feSMarc-André Lureau to DMABUF, that must have been set previously with 270bd2e44feSMarc-André Lureau ``VHOST_USER_GPU_DMABUF_SCANOUT``. 27150cbd5b4SErico Nunes 27250cbd5b4SErico Nunes``VHOST_USER_GPU_GET_EDID`` 27350cbd5b4SErico Nunes :id: 11 27450cbd5b4SErico Nunes :request payload: ``struct VhostUserGpuEdidRequest`` 27550cbd5b4SErico Nunes :reply payload: ``struct virtio_gpu_resp_edid`` (from virtio specification) 27650cbd5b4SErico Nunes 27750cbd5b4SErico Nunes Retrieve the EDID data for a given scanout. 27850cbd5b4SErico Nunes This message requires the ``VHOST_USER_GPU_PROTOCOL_F_EDID`` protocol 27950cbd5b4SErico Nunes feature to be supported. 280*75f217b4SErico Nunes 281*75f217b4SErico Nunes``VHOST_USER_GPU_DMABUF_SCANOUT2`` 282*75f217b4SErico Nunes :id: 12 283*75f217b4SErico Nunes :request payload: ``VhostUserGpuDMABUFScanout2`` 284*75f217b4SErico Nunes :reply payload: N/A 285*75f217b4SErico Nunes 286*75f217b4SErico Nunes Same as VHOST_USER_GPU_DMABUF_SCANOUT, but also sends the dmabuf modifiers 287*75f217b4SErico Nunes appended to the message, which were not provided in the other message. 288*75f217b4SErico Nunes This message requires the ``VHOST_USER_GPU_PROTOCOL_F_DMABUF2`` protocol 289*75f217b4SErico Nunes feature to be supported. 290