xref: /qemu/docs/interop/vhost-user.json (revision 482580a6)
1*482580a6SMarc-André Lureau# -*- Mode: Python -*-
2*482580a6SMarc-André Lureau#
3*482580a6SMarc-André Lureau# Copyright (C) 2018 Red Hat, Inc.
4*482580a6SMarc-André Lureau#
5*482580a6SMarc-André Lureau# Authors:
6*482580a6SMarc-André Lureau#  Marc-André Lureau <marcandre.lureau@redhat.com>
7*482580a6SMarc-André Lureau#
8*482580a6SMarc-André Lureau# This work is licensed under the terms of the GNU GPL, version 2 or
9*482580a6SMarc-André Lureau# later. See the COPYING file in the top-level directory.
10*482580a6SMarc-André Lureau
11*482580a6SMarc-André Lureau##
12*482580a6SMarc-André Lureau# = vhost user backend discovery & capabilities
13*482580a6SMarc-André Lureau##
14*482580a6SMarc-André Lureau
15*482580a6SMarc-André Lureau##
16*482580a6SMarc-André Lureau# @VHostUserBackendType:
17*482580a6SMarc-André Lureau#
18*482580a6SMarc-André Lureau# List the various vhost user backend types.
19*482580a6SMarc-André Lureau#
20*482580a6SMarc-André Lureau# @9p: 9p virtio console
21*482580a6SMarc-André Lureau# @balloon: virtio balloon
22*482580a6SMarc-André Lureau# @block: virtio block
23*482580a6SMarc-André Lureau# @caif: virtio caif
24*482580a6SMarc-André Lureau# @console: virtio console
25*482580a6SMarc-André Lureau# @crypto: virtio crypto
26*482580a6SMarc-André Lureau# @gpu: virtio gpu
27*482580a6SMarc-André Lureau# @input: virtio input
28*482580a6SMarc-André Lureau# @net: virtio net
29*482580a6SMarc-André Lureau# @rng: virtio rng
30*482580a6SMarc-André Lureau# @rpmsg: virtio remote processor messaging
31*482580a6SMarc-André Lureau# @rproc-serial: virtio remoteproc serial link
32*482580a6SMarc-André Lureau# @scsi: virtio scsi
33*482580a6SMarc-André Lureau# @vsock: virtio vsock transport
34*482580a6SMarc-André Lureau#
35*482580a6SMarc-André Lureau# Since: 4.0
36*482580a6SMarc-André Lureau##
37*482580a6SMarc-André Lureau{
38*482580a6SMarc-André Lureau  'enum': 'VHostUserBackendType',
39*482580a6SMarc-André Lureau  'data': [
40*482580a6SMarc-André Lureau      '9p',
41*482580a6SMarc-André Lureau      'balloon',
42*482580a6SMarc-André Lureau      'block',
43*482580a6SMarc-André Lureau      'caif',
44*482580a6SMarc-André Lureau      'console',
45*482580a6SMarc-André Lureau      'crypto',
46*482580a6SMarc-André Lureau      'gpu',
47*482580a6SMarc-André Lureau      'input',
48*482580a6SMarc-André Lureau      'net',
49*482580a6SMarc-André Lureau      'rng',
50*482580a6SMarc-André Lureau      'rpmsg',
51*482580a6SMarc-André Lureau      'rproc-serial',
52*482580a6SMarc-André Lureau      'scsi',
53*482580a6SMarc-André Lureau      'vsock'
54*482580a6SMarc-André Lureau  ]
55*482580a6SMarc-André Lureau}
56*482580a6SMarc-André Lureau
57*482580a6SMarc-André Lureau##
58*482580a6SMarc-André Lureau# @VHostUserBackendInputFeature:
59*482580a6SMarc-André Lureau#
60*482580a6SMarc-André Lureau# List of vhost user "input" features.
61*482580a6SMarc-André Lureau#
62*482580a6SMarc-André Lureau# @evdev-path: The --evdev-path command line option is supported.
63*482580a6SMarc-André Lureau# @no-grab: The --no-grab command line option is supported.
64*482580a6SMarc-André Lureau#
65*482580a6SMarc-André Lureau# Since: 4.0
66*482580a6SMarc-André Lureau##
67*482580a6SMarc-André Lureau{
68*482580a6SMarc-André Lureau  'enum': 'VHostUserBackendInputFeature',
69*482580a6SMarc-André Lureau  'data': [ 'evdev-path', 'no-grab' ]
70*482580a6SMarc-André Lureau}
71*482580a6SMarc-André Lureau
72*482580a6SMarc-André Lureau##
73*482580a6SMarc-André Lureau# @VHostUserBackendCapabilitiesInput:
74*482580a6SMarc-André Lureau#
75*482580a6SMarc-André Lureau# Capabilities reported by vhost user "input" backends
76*482580a6SMarc-André Lureau#
77*482580a6SMarc-André Lureau# @features: list of supported features.
78*482580a6SMarc-André Lureau#
79*482580a6SMarc-André Lureau# Since: 4.0
80*482580a6SMarc-André Lureau##
81*482580a6SMarc-André Lureau{
82*482580a6SMarc-André Lureau  'struct': 'VHostUserBackendCapabilitiesInput',
83*482580a6SMarc-André Lureau  'data': {
84*482580a6SMarc-André Lureau    'features': [ 'VHostUserBackendInputFeature' ]
85*482580a6SMarc-André Lureau  }
86*482580a6SMarc-André Lureau}
87*482580a6SMarc-André Lureau
88*482580a6SMarc-André Lureau##
89*482580a6SMarc-André Lureau# @VHostUserBackendGPUFeature:
90*482580a6SMarc-André Lureau#
91*482580a6SMarc-André Lureau# List of vhost user "gpu" features.
92*482580a6SMarc-André Lureau#
93*482580a6SMarc-André Lureau# @render-node: The --render-node command line option is supported.
94*482580a6SMarc-André Lureau# @virgl: The --virgl command line option is supported.
95*482580a6SMarc-André Lureau#
96*482580a6SMarc-André Lureau# Since: 4.0
97*482580a6SMarc-André Lureau##
98*482580a6SMarc-André Lureau{
99*482580a6SMarc-André Lureau  'enum': 'VHostUserBackendGPUFeature',
100*482580a6SMarc-André Lureau  'data': [ 'render-node', 'virgl' ]
101*482580a6SMarc-André Lureau}
102*482580a6SMarc-André Lureau
103*482580a6SMarc-André Lureau##
104*482580a6SMarc-André Lureau# @VHostUserBackendCapabilitiesGPU:
105*482580a6SMarc-André Lureau#
106*482580a6SMarc-André Lureau# Capabilities reported by vhost user "gpu" backends.
107*482580a6SMarc-André Lureau#
108*482580a6SMarc-André Lureau# @features: list of supported features.
109*482580a6SMarc-André Lureau#
110*482580a6SMarc-André Lureau# Since: 4.0
111*482580a6SMarc-André Lureau##
112*482580a6SMarc-André Lureau{
113*482580a6SMarc-André Lureau  'struct': 'VHostUserBackendCapabilitiesGPU',
114*482580a6SMarc-André Lureau  'data': {
115*482580a6SMarc-André Lureau    'features': [ 'VHostUserBackendGPUFeature' ]
116*482580a6SMarc-André Lureau  }
117*482580a6SMarc-André Lureau}
118*482580a6SMarc-André Lureau
119*482580a6SMarc-André Lureau##
120*482580a6SMarc-André Lureau# @VHostUserBackendCapabilities:
121*482580a6SMarc-André Lureau#
122*482580a6SMarc-André Lureau# Capabilities reported by vhost user backends.
123*482580a6SMarc-André Lureau#
124*482580a6SMarc-André Lureau# @type: The vhost user backend type.
125*482580a6SMarc-André Lureau#
126*482580a6SMarc-André Lureau# Since: 4.0
127*482580a6SMarc-André Lureau##
128*482580a6SMarc-André Lureau{
129*482580a6SMarc-André Lureau  'union': 'VHostUserBackendCapabilities',
130*482580a6SMarc-André Lureau  'base': { 'type': 'VHostUserBackendType' },
131*482580a6SMarc-André Lureau  'discriminator': 'type',
132*482580a6SMarc-André Lureau  'data': {
133*482580a6SMarc-André Lureau    'input': 'VHostUserBackendCapabilitiesInput',
134*482580a6SMarc-André Lureau    'gpu': 'VHostUserBackendCapabilitiesGPU'
135*482580a6SMarc-André Lureau  }
136*482580a6SMarc-André Lureau}
137*482580a6SMarc-André Lureau
138*482580a6SMarc-André Lureau##
139*482580a6SMarc-André Lureau# @VhostUserBackend:
140*482580a6SMarc-André Lureau#
141*482580a6SMarc-André Lureau# Describes a vhost user backend to management software.
142*482580a6SMarc-André Lureau#
143*482580a6SMarc-André Lureau# It is possible for multiple @VhostUserBackend elements to match the
144*482580a6SMarc-André Lureau# search criteria of management software. Applications thus need rules
145*482580a6SMarc-André Lureau# to pick one of the many matches, and users need the ability to
146*482580a6SMarc-André Lureau# override distro defaults.
147*482580a6SMarc-André Lureau#
148*482580a6SMarc-André Lureau# It is recommended to create vhost user backend JSON files (each
149*482580a6SMarc-André Lureau# containing a single @VhostUserBackend root element) with a
150*482580a6SMarc-André Lureau# double-digit prefix, for example "50-qemu-gpu.json",
151*482580a6SMarc-André Lureau# "50-crosvm-gpu.json", etc, so they can be sorted in predictable
152*482580a6SMarc-André Lureau# order. The backend JSON files should be searched for in three
153*482580a6SMarc-André Lureau# directories:
154*482580a6SMarc-André Lureau#
155*482580a6SMarc-André Lureau#   - /usr/share/qemu/vhost-user -- populated by distro-provided
156*482580a6SMarc-André Lureau#                                   packages (XDG_DATA_DIRS covers
157*482580a6SMarc-André Lureau#                                   /usr/share by default),
158*482580a6SMarc-André Lureau#
159*482580a6SMarc-André Lureau#   - /etc/qemu/vhost-user -- exclusively for sysadmins' local additions,
160*482580a6SMarc-André Lureau#
161*482580a6SMarc-André Lureau#   - $XDG_CONFIG_HOME/qemu/vhost-user -- exclusively for per-user local
162*482580a6SMarc-André Lureau#                                         additions (XDG_CONFIG_HOME
163*482580a6SMarc-André Lureau#                                         defaults to $HOME/.config).
164*482580a6SMarc-André Lureau#
165*482580a6SMarc-André Lureau# Top-down, the list of directories goes from general to specific.
166*482580a6SMarc-André Lureau#
167*482580a6SMarc-André Lureau# Management software should build a list of files from all three
168*482580a6SMarc-André Lureau# locations, then sort the list by filename (i.e., basename
169*482580a6SMarc-André Lureau# component). Management software should choose the first JSON file on
170*482580a6SMarc-André Lureau# the sorted list that matches the search criteria. If a more specific
171*482580a6SMarc-André Lureau# directory has a file with same name as a less specific directory,
172*482580a6SMarc-André Lureau# then the file in the more specific directory takes effect. If the
173*482580a6SMarc-André Lureau# more specific file is zero length, it hides the less specific one.
174*482580a6SMarc-André Lureau#
175*482580a6SMarc-André Lureau# For example, if a distro ships
176*482580a6SMarc-André Lureau#
177*482580a6SMarc-André Lureau#   - /usr/share/qemu/vhost-user/50-qemu-gpu.json
178*482580a6SMarc-André Lureau#
179*482580a6SMarc-André Lureau#   - /usr/share/qemu/vhost-user/50-crosvm-gpu.json
180*482580a6SMarc-André Lureau#
181*482580a6SMarc-André Lureau# then the sysadmin can prevent the default QEMU being used at all with
182*482580a6SMarc-André Lureau#
183*482580a6SMarc-André Lureau#   $ touch /etc/qemu/vhost-user/50-qemu-gpu.json
184*482580a6SMarc-André Lureau#
185*482580a6SMarc-André Lureau# The sysadmin can replace/alter the distro default OVMF with
186*482580a6SMarc-André Lureau#
187*482580a6SMarc-André Lureau#   $ vim /etc/qemu/vhost-user/50-qemu-gpu.json
188*482580a6SMarc-André Lureau#
189*482580a6SMarc-André Lureau# or they can provide a parallel QEMU GPU with higher priority
190*482580a6SMarc-André Lureau#
191*482580a6SMarc-André Lureau#   $ vim /etc/qemu/vhost-user/10-qemu-gpu.json
192*482580a6SMarc-André Lureau#
193*482580a6SMarc-André Lureau# or they can provide a parallel OVMF with lower priority
194*482580a6SMarc-André Lureau#
195*482580a6SMarc-André Lureau#   $ vim /etc/qemu/vhost-user/99-qemu-gpu.json
196*482580a6SMarc-André Lureau#
197*482580a6SMarc-André Lureau# @type: The vhost user backend type.
198*482580a6SMarc-André Lureau#
199*482580a6SMarc-André Lureau# @description: Provides a human-readable description of the backend.
200*482580a6SMarc-André Lureau#               Management software may or may not display @description.
201*482580a6SMarc-André Lureau#
202*482580a6SMarc-André Lureau# @binary: Absolute path to the backend binary.
203*482580a6SMarc-André Lureau#
204*482580a6SMarc-André Lureau# @tags: An optional list of auxiliary strings associated with the
205*482580a6SMarc-André Lureau#        backend for which @description is not appropriate, due to the
206*482580a6SMarc-André Lureau#        latter's possible exposure to the end-user. @tags serves
207*482580a6SMarc-André Lureau#        development and debugging purposes only, and management
208*482580a6SMarc-André Lureau#        software shall explicitly ignore it.
209*482580a6SMarc-André Lureau#
210*482580a6SMarc-André Lureau# Since: 4.0
211*482580a6SMarc-André Lureau#
212*482580a6SMarc-André Lureau# Example:
213*482580a6SMarc-André Lureau#
214*482580a6SMarc-André Lureau# {
215*482580a6SMarc-André Lureau#   "description": "QEMU vhost-user-gpu",
216*482580a6SMarc-André Lureau#   "type": "gpu",
217*482580a6SMarc-André Lureau#   "binary": "/usr/libexec/qemu/vhost-user-gpu",
218*482580a6SMarc-André Lureau#   "tags": [
219*482580a6SMarc-André Lureau#     "CONFIG_OPENGL_DMABUF=y"
220*482580a6SMarc-André Lureau#   ]
221*482580a6SMarc-André Lureau# }
222*482580a6SMarc-André Lureau#
223*482580a6SMarc-André Lureau##
224*482580a6SMarc-André Lureau{
225*482580a6SMarc-André Lureau  'struct' : 'VhostUserBackend',
226*482580a6SMarc-André Lureau  'data'   : {
227*482580a6SMarc-André Lureau    'description': 'str',
228*482580a6SMarc-André Lureau    'type': 'VHostUserBackendType',
229*482580a6SMarc-André Lureau    'binary': 'str',
230*482580a6SMarc-André Lureau    '*tags': [ 'str' ]
231*482580a6SMarc-André Lureau  }
232*482580a6SMarc-André Lureau}
233