xref: /openbmc/qemu/qapi/virtio.json (revision 2df1eb27)
1# -*- Mode: Python -*-
2# vim: filetype=python
3#
4
5##
6# = Virtio devices
7##
8
9##
10# @VirtioInfo:
11#
12# Basic information about a given VirtIODevice
13#
14# @path: The VirtIODevice's canonical QOM path
15#
16# @name: Name of the VirtIODevice
17#
18# Since: 7.2
19##
20{ 'struct': 'VirtioInfo',
21  'data': { 'path': 'str',
22            'name': 'str' } }
23
24##
25# @x-query-virtio:
26#
27# Returns a list of all realized VirtIODevices
28#
29# Features:
30#
31# @unstable: This command is meant for debugging.
32#
33# Returns: List of gathered VirtIODevices
34#
35# Since: 7.2
36#
37# Example:
38#
39# -> { "execute": "x-query-virtio" }
40# <- { "return": [
41#          {
42#              "name": "virtio-input",
43#              "path": "/machine/peripheral-anon/device[4]/virtio-backend"
44#          },
45#          {
46#              "name": "virtio-crypto",
47#              "path": "/machine/peripheral/crypto0/virtio-backend"
48#          },
49#          {
50#              "name": "virtio-scsi",
51#              "path": "/machine/peripheral-anon/device[2]/virtio-backend"
52#          },
53#          {
54#              "name": "virtio-net",
55#              "path": "/machine/peripheral-anon/device[1]/virtio-backend"
56#          },
57#          {
58#              "name": "virtio-serial",
59#              "path": "/machine/peripheral-anon/device[0]/virtio-backend"
60#          }
61#      ]
62#    }
63##
64{ 'command': 'x-query-virtio',
65  'returns': [ 'VirtioInfo' ],
66  'features': [ 'unstable' ] }
67
68##
69# @VhostStatus:
70#
71# Information about a vhost device.  This information will only be
72# displayed if the vhost device is active.
73#
74# @n-mem-sections: vhost_dev n_mem_sections
75#
76# @n-tmp-sections: vhost_dev n_tmp_sections
77#
78# @nvqs: vhost_dev nvqs (number of virtqueues being used)
79#
80# @vq-index: vhost_dev vq_index
81#
82# @features: vhost_dev features
83#
84# @acked-features: vhost_dev acked_features
85#
86# @backend-features: vhost_dev backend_features
87#
88# @protocol-features: vhost_dev protocol_features
89#
90# @max-queues: vhost_dev max_queues
91#
92# @backend-cap: vhost_dev backend_cap
93#
94# @log-enabled: vhost_dev log_enabled flag
95#
96# @log-size: vhost_dev log_size
97#
98# Since: 7.2
99##
100{ 'struct': 'VhostStatus',
101  'data': { 'n-mem-sections': 'int',
102            'n-tmp-sections': 'int',
103            'nvqs': 'uint32',
104            'vq-index': 'int',
105            'features': 'VirtioDeviceFeatures',
106            'acked-features': 'VirtioDeviceFeatures',
107            'backend-features': 'VirtioDeviceFeatures',
108            'protocol-features': 'VhostDeviceProtocols',
109            'max-queues': 'uint64',
110            'backend-cap': 'uint64',
111            'log-enabled': 'bool',
112            'log-size': 'uint64' } }
113
114##
115# @VirtioStatus:
116#
117# Full status of the virtio device with most VirtIODevice members.
118# Also includes the full status of the corresponding vhost device if
119# the vhost device is active.
120#
121# @name: VirtIODevice name
122#
123# @device-id: VirtIODevice ID
124#
125# @vhost-started: VirtIODevice vhost_started flag
126#
127# @guest-features: VirtIODevice guest_features
128#
129# @host-features: VirtIODevice host_features
130#
131# @backend-features: VirtIODevice backend_features
132#
133# @device-endian: VirtIODevice device_endian
134#
135# @num-vqs: VirtIODevice virtqueue count.  This is the number of
136#     active virtqueues being used by the VirtIODevice.
137#
138# @status: VirtIODevice configuration status (VirtioDeviceStatus)
139#
140# @isr: VirtIODevice ISR
141#
142# @queue-sel: VirtIODevice queue_sel
143#
144# @vm-running: VirtIODevice vm_running flag
145#
146# @broken: VirtIODevice broken flag
147#
148# @disabled: VirtIODevice disabled flag
149#
150# @use-started: VirtIODevice use_started flag
151#
152# @started: VirtIODevice started flag
153#
154# @start-on-kick: VirtIODevice start_on_kick flag
155#
156# @disable-legacy-check: VirtIODevice disabled_legacy_check flag
157#
158# @bus-name: VirtIODevice bus_name
159#
160# @use-guest-notifier-mask: VirtIODevice use_guest_notifier_mask flag
161#
162# @vhost-dev: Corresponding vhost device info for a given
163#     VirtIODevice.  Present if the given VirtIODevice has an active
164#     vhost device.
165#
166# Since: 7.2
167##
168{ 'struct': 'VirtioStatus',
169  'data': { 'name': 'str',
170            'device-id': 'uint16',
171            'vhost-started': 'bool',
172            'device-endian': 'str',
173            'guest-features': 'VirtioDeviceFeatures',
174            'host-features': 'VirtioDeviceFeatures',
175            'backend-features': 'VirtioDeviceFeatures',
176            'num-vqs': 'int',
177            'status': 'VirtioDeviceStatus',
178            'isr': 'uint8',
179            'queue-sel': 'uint16',
180            'vm-running': 'bool',
181            'broken': 'bool',
182            'disabled': 'bool',
183            'use-started': 'bool',
184            'started': 'bool',
185            'start-on-kick': 'bool',
186            'disable-legacy-check': 'bool',
187            'bus-name': 'str',
188            'use-guest-notifier-mask': 'bool',
189            '*vhost-dev': 'VhostStatus' } }
190
191##
192# @x-query-virtio-status:
193#
194# Poll for a comprehensive status of a given virtio device
195#
196# @path: Canonical QOM path of the VirtIODevice
197#
198# Features:
199#
200# @unstable: This command is meant for debugging.
201#
202# Returns: VirtioStatus of the virtio device
203#
204# Since: 7.2
205#
206# Examples:
207#
208# 1. Poll for the status of virtio-crypto (no vhost-crypto active)
209#
210# -> { "execute": "x-query-virtio-status",
211#      "arguments": { "path": "/machine/peripheral/crypto0/virtio-backend" }
212#    }
213# <- { "return": {
214#          "device-endian": "little",
215#          "bus-name": "",
216#          "disable-legacy-check": false,
217#          "name": "virtio-crypto",
218#          "started": true,
219#          "device-id": 20,
220#          "backend-features": {
221#              "transports": [],
222#              "dev-features": []
223#          },
224#          "start-on-kick": false,
225#          "isr": 1,
226#          "broken": false,
227#          "status": {
228#              "statuses": [
229#                  "VIRTIO_CONFIG_S_ACKNOWLEDGE: Valid virtio device found",
230#                  "VIRTIO_CONFIG_S_DRIVER: Guest OS compatible with device",
231#                  "VIRTIO_CONFIG_S_FEATURES_OK: Feature negotiation complete",
232#                  "VIRTIO_CONFIG_S_DRIVER_OK: Driver setup and ready"
233#              ]
234#          },
235#          "num-vqs": 2,
236#          "guest-features": {
237#              "dev-features": [],
238#              "transports": [
239#                  "VIRTIO_RING_F_EVENT_IDX: Used & avail. event fields enabled",
240#                  "VIRTIO_RING_F_INDIRECT_DESC: Indirect descriptors supported",
241#                  "VIRTIO_F_VERSION_1: Device compliant for v1 spec (legacy)"
242#              ]
243#          },
244#          "host-features": {
245#              "unknown-dev-features": 1073741824,
246#              "dev-features": [],
247#              "transports": [
248#                  "VIRTIO_RING_F_EVENT_IDX: Used & avail. event fields enabled",
249#                  "VIRTIO_RING_F_INDIRECT_DESC: Indirect descriptors supported",
250#                  "VIRTIO_F_VERSION_1: Device compliant for v1 spec (legacy)",
251#                  "VIRTIO_F_ANY_LAYOUT: Device accepts arbitrary desc. layouts",
252#                  "VIRTIO_F_NOTIFY_ON_EMPTY: Notify when device runs out of avail. descs. on VQ"
253#              ]
254#          },
255#          "use-guest-notifier-mask": true,
256#          "vm-running": true,
257#          "queue-sel": 1,
258#          "disabled": false,
259#          "vhost-started": false,
260#          "use-started": true
261#      }
262#    }
263#
264# 2. Poll for the status of virtio-net (vhost-net is active)
265#
266# -> { "execute": "x-query-virtio-status",
267#      "arguments": { "path": "/machine/peripheral-anon/device[1]/virtio-backend" }
268#    }
269# <- { "return": {
270#          "device-endian": "little",
271#          "bus-name": "",
272#          "disabled-legacy-check": false,
273#          "name": "virtio-net",
274#          "started": true,
275#          "device-id": 1,
276#          "vhost-dev": {
277#              "n-tmp-sections": 4,
278#              "n-mem-sections": 4,
279#              "max-queues": 1,
280#              "backend-cap": 2,
281#              "log-size": 0,
282#              "backend-features": {
283#                  "dev-features": [],
284#                  "transports": []
285#              },
286#              "nvqs": 2,
287#              "protocol-features": {
288#                  "protocols": []
289#              },
290#              "vq-index": 0,
291#              "log-enabled": false,
292#              "acked-features": {
293#                  "dev-features": [
294#                      "VIRTIO_NET_F_MRG_RXBUF: Driver can merge receive buffers"
295#                  ],
296#                  "transports": [
297#                      "VIRTIO_RING_F_EVENT_IDX: Used & avail. event fields enabled",
298#                      "VIRTIO_RING_F_INDIRECT_DESC: Indirect descriptors supported",
299#                      "VIRTIO_F_VERSION_1: Device compliant for v1 spec (legacy)"
300#                  ]
301#              },
302#              "features": {
303#                  "dev-features": [
304#                      "VHOST_F_LOG_ALL: Logging write descriptors supported",
305#                      "VIRTIO_NET_F_MRG_RXBUF: Driver can merge receive buffers"
306#                  ],
307#                  "transports": [
308#                      "VIRTIO_RING_F_EVENT_IDX: Used & avail. event fields enabled",
309#                      "VIRTIO_RING_F_INDIRECT_DESC: Indirect descriptors supported",
310#                      "VIRTIO_F_IOMMU_PLATFORM: Device can be used on IOMMU platform",
311#                      "VIRTIO_F_VERSION_1: Device compliant for v1 spec (legacy)",
312#                      "VIRTIO_F_ANY_LAYOUT: Device accepts arbitrary desc. layouts",
313#                      "VIRTIO_F_NOTIFY_ON_EMPTY: Notify when device runs out of avail. descs. on VQ"
314#                  ]
315#              }
316#          },
317#          "backend-features": {
318#              "dev-features": [
319#                  "VHOST_USER_F_PROTOCOL_FEATURES: Vhost-user protocol features negotiation supported",
320#                  "VIRTIO_NET_F_GSO: Handling GSO-type packets supported",
321#                  "VIRTIO_NET_F_CTRL_MAC_ADDR: MAC address set through control channel",
322#                  "VIRTIO_NET_F_GUEST_ANNOUNCE: Driver sending gratuitous packets supported",
323#                  "VIRTIO_NET_F_CTRL_RX_EXTRA: Extra RX mode control supported",
324#                  "VIRTIO_NET_F_CTRL_VLAN: Control channel VLAN filtering supported",
325#                  "VIRTIO_NET_F_CTRL_RX: Control channel RX mode supported",
326#                  "VIRTIO_NET_F_CTRL_VQ: Control channel available",
327#                  "VIRTIO_NET_F_STATUS: Configuration status field available",
328#                  "VIRTIO_NET_F_MRG_RXBUF: Driver can merge receive buffers",
329#                  "VIRTIO_NET_F_HOST_UFO: Device can receive UFO",
330#                  "VIRTIO_NET_F_HOST_ECN: Device can receive TSO with ECN",
331#                  "VIRTIO_NET_F_HOST_TSO6: Device can receive TSOv6",
332#                  "VIRTIO_NET_F_HOST_TSO4: Device can receive TSOv4",
333#                  "VIRTIO_NET_F_GUEST_UFO: Driver can receive UFO",
334#                  "VIRTIO_NET_F_GUEST_ECN: Driver can receive TSO with ECN",
335#                  "VIRTIO_NET_F_GUEST_TSO6: Driver can receive TSOv6",
336#                  "VIRTIO_NET_F_GUEST_TSO4: Driver can receive TSOv4",
337#                  "VIRTIO_NET_F_MAC: Device has given MAC address",
338#                  "VIRTIO_NET_F_CTRL_GUEST_OFFLOADS: Control channel offloading reconfig. supported",
339#                  "VIRTIO_NET_F_GUEST_CSUM: Driver handling packets with partial checksum supported",
340#                  "VIRTIO_NET_F_CSUM: Device handling packets with partial checksum supported"
341#              ],
342#              "transports": [
343#                  "VIRTIO_RING_F_EVENT_IDX: Used & avail. event fields enabled",
344#                  "VIRTIO_RING_F_INDIRECT_DESC: Indirect descriptors supported",
345#                  "VIRTIO_F_VERSION_1: Device compliant for v1 spec (legacy)",
346#                  "VIRTIO_F_ANY_LAYOUT: Device accepts arbitrary desc. layouts",
347#                  "VIRTIO_F_NOTIFY_ON_EMPTY: Notify when device runs out of avail. descs. on VQ"
348#              ]
349#          },
350#          "start-on-kick": false,
351#          "isr": 1,
352#          "broken": false,
353#          "status": {
354#              "statuses": [
355#                  "VIRTIO_CONFIG_S_ACKNOWLEDGE: Valid virtio device found",
356#                  "VIRTIO_CONFIG_S_DRIVER: Guest OS compatible with device",
357#                  "VIRTIO_CONFIG_S_FEATURES_OK: Feature negotiation complete",
358#                  "VIRTIO_CONFIG_S_DRIVER_OK: Driver setup and ready"
359#              ]
360#          },
361#          "num-vqs": 3,
362#          "guest-features": {
363#              "dev-features": [
364#                  "VIRTIO_NET_F_CTRL_MAC_ADDR: MAC address set through control channel",
365#                  "VIRTIO_NET_F_GUEST_ANNOUNCE: Driver sending gratuitous packets supported",
366#                  "VIRTIO_NET_F_CTRL_VLAN: Control channel VLAN filtering supported",
367#                  "VIRTIO_NET_F_CTRL_RX: Control channel RX mode supported",
368#                  "VIRTIO_NET_F_CTRL_VQ: Control channel available",
369#                  "VIRTIO_NET_F_STATUS: Configuration status field available",
370#                  "VIRTIO_NET_F_MRG_RXBUF: Driver can merge receive buffers",
371#                  "VIRTIO_NET_F_HOST_UFO: Device can receive UFO",
372#                  "VIRTIO_NET_F_HOST_ECN: Device can receive TSO with ECN",
373#                  "VIRTIO_NET_F_HOST_TSO6: Device can receive TSOv6",
374#                  "VIRTIO_NET_F_HOST_TSO4: Device can receive TSOv4",
375#                  "VIRTIO_NET_F_GUEST_UFO: Driver can receive UFO",
376#                  "VIRTIO_NET_F_GUEST_ECN: Driver can receive TSO with ECN",
377#                  "VIRTIO_NET_F_GUEST_TSO6: Driver can receive TSOv6",
378#                  "VIRTIO_NET_F_GUEST_TSO4: Driver can receive TSOv4",
379#                  "VIRTIO_NET_F_MAC: Device has given MAC address",
380#                  "VIRTIO_NET_F_CTRL_GUEST_OFFLOADS: Control channel offloading reconfig. supported",
381#                  "VIRTIO_NET_F_GUEST_CSUM: Driver handling packets with partial checksum supported",
382#                  "VIRTIO_NET_F_CSUM: Device handling packets with partial checksum supported"
383#              ],
384#              "transports": [
385#                  "VIRTIO_RING_F_EVENT_IDX: Used & avail. event fields enabled",
386#                  "VIRTIO_RING_F_INDIRECT_DESC: Indirect descriptors supported",
387#                  "VIRTIO_F_VERSION_1: Device compliant for v1 spec (legacy)"
388#             ]
389#          },
390#          "host-features": {
391#              "dev-features": [
392#                  "VHOST_USER_F_PROTOCOL_FEATURES: Vhost-user protocol features negotiation supported",
393#                  "VIRTIO_NET_F_GSO: Handling GSO-type packets supported",
394#                  "VIRTIO_NET_F_CTRL_MAC_ADDR: MAC address set through control channel",
395#                  "VIRTIO_NET_F_GUEST_ANNOUNCE: Driver sending gratuitous packets supported",
396#                  "VIRTIO_NET_F_CTRL_RX_EXTRA: Extra RX mode control supported",
397#                  "VIRTIO_NET_F_CTRL_VLAN: Control channel VLAN filtering supported",
398#                  "VIRTIO_NET_F_CTRL_RX: Control channel RX mode supported",
399#                  "VIRTIO_NET_F_CTRL_VQ: Control channel available",
400#                  "VIRTIO_NET_F_STATUS: Configuration status field available",
401#                  "VIRTIO_NET_F_MRG_RXBUF: Driver can merge receive buffers",
402#                  "VIRTIO_NET_F_HOST_UFO: Device can receive UFO",
403#                  "VIRTIO_NET_F_HOST_ECN: Device can receive TSO with ECN",
404#                  "VIRTIO_NET_F_HOST_TSO6: Device can receive TSOv6",
405#                  "VIRTIO_NET_F_HOST_TSO4: Device can receive TSOv4",
406#                  "VIRTIO_NET_F_GUEST_UFO: Driver can receive UFO",
407#                  "VIRTIO_NET_F_GUEST_ECN: Driver can receive TSO with ECN",
408#                  "VIRTIO_NET_F_GUEST_TSO6: Driver can receive TSOv6",
409#                  "VIRTIO_NET_F_GUEST_TSO4: Driver can receive TSOv4",
410#                  "VIRTIO_NET_F_MAC: Device has given MAC address",
411#                  "VIRTIO_NET_F_CTRL_GUEST_OFFLOADS: Control channel offloading reconfig. supported",
412#                  "VIRTIO_NET_F_GUEST_CSUM: Driver handling packets with partial checksum supported",
413#                  "VIRTIO_NET_F_CSUM: Device handling packets with partial checksum supported"
414#              ],
415#              "transports": [
416#                  "VIRTIO_RING_F_EVENT_IDX: Used & avail. event fields enabled",
417#                  "VIRTIO_RING_F_INDIRECT_DESC: Indirect descriptors supported",
418#                  "VIRTIO_F_VERSION_1: Device compliant for v1 spec (legacy)",
419#                  "VIRTIO_F_ANY_LAYOUT: Device accepts arbitrary desc. layouts",
420#                  "VIRTIO_F_NOTIFY_ON_EMPTY: Notify when device runs out of avail. descs. on VQ"
421#             ]
422#          },
423#          "use-guest-notifier-mask": true,
424#          "vm-running": true,
425#          "queue-sel": 2,
426#          "disabled": false,
427#          "vhost-started": true,
428#          "use-started": true
429#      }
430#    }
431##
432{ 'command': 'x-query-virtio-status',
433  'data': { 'path': 'str' },
434  'returns': 'VirtioStatus',
435  'features': [ 'unstable' ] }
436
437##
438# @VirtioDeviceStatus:
439#
440# A structure defined to list the configuration statuses of a virtio
441# device
442#
443# @statuses: List of decoded configuration statuses of the virtio
444#     device
445#
446# @unknown-statuses: Virtio device statuses bitmap that have not been
447#     decoded
448#
449# Since: 7.2
450##
451{ 'struct': 'VirtioDeviceStatus',
452  'data': { 'statuses': [ 'str' ],
453            '*unknown-statuses': 'uint8' } }
454
455##
456# @VhostDeviceProtocols:
457#
458# A structure defined to list the vhost user protocol features of a
459# Vhost User device
460#
461# @protocols: List of decoded vhost user protocol features of a vhost
462#     user device
463#
464# @unknown-protocols: Vhost user device protocol features bitmap that
465#     have not been decoded
466#
467# Since: 7.2
468##
469{ 'struct': 'VhostDeviceProtocols',
470  'data': { 'protocols': [ 'str' ],
471            '*unknown-protocols': 'uint64' } }
472
473##
474# @VirtioDeviceFeatures:
475#
476# The common fields that apply to most Virtio devices.  Some devices
477# may not have their own device-specific features (e.g. virtio-rng).
478#
479# @transports: List of transport features of the virtio device
480#
481# @dev-features: List of device-specific features (if the device has
482#     unique features)
483#
484# @unknown-dev-features: Virtio device features bitmap that have not
485#     been decoded
486#
487# Since: 7.2
488##
489{ 'struct': 'VirtioDeviceFeatures',
490  'data': { 'transports': [ 'str' ],
491            '*dev-features': [ 'str' ],
492            '*unknown-dev-features': 'uint64' } }
493
494##
495# @VirtQueueStatus:
496#
497# Information of a VirtIODevice VirtQueue, including most members of
498# the VirtQueue data structure.
499#
500# @name: Name of the VirtIODevice that uses this VirtQueue
501#
502# @queue-index: VirtQueue queue_index
503#
504# @inuse: VirtQueue inuse
505#
506# @vring-num: VirtQueue vring.num
507#
508# @vring-num-default: VirtQueue vring.num_default
509#
510# @vring-align: VirtQueue vring.align
511#
512# @vring-desc: VirtQueue vring.desc (descriptor area)
513#
514# @vring-avail: VirtQueue vring.avail (driver area)
515#
516# @vring-used: VirtQueue vring.used (device area)
517#
518# @last-avail-idx: VirtQueue last_avail_idx or return of vhost_dev
519#     vhost_get_vring_base (if vhost active)
520#
521# @shadow-avail-idx: VirtQueue shadow_avail_idx
522#
523# @used-idx: VirtQueue used_idx
524#
525# @signalled-used: VirtQueue signalled_used
526#
527# @signalled-used-valid: VirtQueue signalled_used_valid flag
528#
529# Since: 7.2
530##
531{ 'struct': 'VirtQueueStatus',
532  'data': { 'name': 'str',
533            'queue-index': 'uint16',
534            'inuse': 'uint32',
535            'vring-num': 'uint32',
536            'vring-num-default': 'uint32',
537            'vring-align': 'uint32',
538            'vring-desc': 'uint64',
539            'vring-avail': 'uint64',
540            'vring-used': 'uint64',
541            '*last-avail-idx': 'uint16',
542            '*shadow-avail-idx': 'uint16',
543            'used-idx': 'uint16',
544            'signalled-used': 'uint16',
545            'signalled-used-valid': 'bool' } }
546
547##
548# @x-query-virtio-queue-status:
549#
550# Return the status of a given VirtIODevice's VirtQueue
551#
552# @path: VirtIODevice canonical QOM path
553#
554# @queue: VirtQueue index to examine
555#
556# Features:
557#
558# @unstable: This command is meant for debugging.
559#
560# Returns: VirtQueueStatus of the VirtQueue
561#
562# Notes: last_avail_idx will not be displayed in the case where the
563#     selected VirtIODevice has a running vhost device and the
564#     VirtIODevice VirtQueue index (queue) does not exist for the
565#     corresponding vhost device vhost_virtqueue.  Also,
566#     shadow_avail_idx will not be displayed in the case where the
567#     selected VirtIODevice has a running vhost device.
568#
569# Since: 7.2
570#
571# Examples:
572#
573# 1. Get VirtQueueStatus for virtio-vsock (vhost-vsock running)
574#
575# -> { "execute": "x-query-virtio-queue-status",
576#      "arguments": { "path": "/machine/peripheral/vsock0/virtio-backend",
577#                     "queue": 1 }
578#    }
579# <- { "return": {
580#          "signalled-used": 0,
581#          "inuse": 0,
582#          "name": "vhost-vsock",
583#          "vring-align": 4096,
584#          "vring-desc": 5217370112,
585#          "signalled-used-valid": false,
586#          "vring-num-default": 128,
587#          "vring-avail": 5217372160,
588#          "queue-index": 1,
589#          "last-avail-idx": 0,
590#          "vring-used": 5217372480,
591#          "used-idx": 0,
592#          "vring-num": 128
593#      }
594#    }
595#
596# 2. Get VirtQueueStatus for virtio-serial (no vhost)
597#
598# -> { "execute": "x-query-virtio-queue-status",
599#      "arguments": { "path": "/machine/peripheral-anon/device[0]/virtio-backend",
600#                     "queue": 20 }
601#    }
602# <- { "return": {
603#          "signalled-used": 0,
604#          "inuse": 0,
605#          "name": "virtio-serial",
606#          "vring-align": 4096,
607#          "vring-desc": 5182074880,
608#          "signalled-used-valid": false,
609#          "vring-num-default": 128,
610#          "vring-avail": 5182076928,
611#          "queue-index": 20,
612#          "last-avail-idx": 0,
613#          "vring-used": 5182077248,
614#          "used-idx": 0,
615#          "shadow-avail-idx": 0,
616#          "vring-num": 128
617#      }
618#    }
619##
620{ 'command': 'x-query-virtio-queue-status',
621  'data': { 'path': 'str', 'queue': 'uint16' },
622  'returns': 'VirtQueueStatus',
623  'features': [ 'unstable' ] }
624
625##
626# @VirtVhostQueueStatus:
627#
628# Information of a vhost device's vhost_virtqueue, including most
629# members of the vhost_dev vhost_virtqueue data structure.
630#
631# @name: Name of the VirtIODevice that uses this vhost_virtqueue
632#
633# @kick: vhost_virtqueue kick
634#
635# @call: vhost_virtqueue call
636#
637# @desc: vhost_virtqueue desc
638#
639# @avail: vhost_virtqueue avail
640#
641# @used: vhost_virtqueue used
642#
643# @num: vhost_virtqueue num
644#
645# @desc-phys: vhost_virtqueue desc_phys (descriptor area phys. addr.)
646#
647# @desc-size: vhost_virtqueue desc_size
648#
649# @avail-phys: vhost_virtqueue avail_phys (driver area phys. addr.)
650#
651# @avail-size: vhost_virtqueue avail_size
652#
653# @used-phys: vhost_virtqueue used_phys (device area phys. addr.)
654#
655# @used-size: vhost_virtqueue used_size
656#
657# Since: 7.2
658##
659{ 'struct': 'VirtVhostQueueStatus',
660  'data': { 'name': 'str',
661            'kick': 'int',
662            'call': 'int',
663            'desc': 'uint64',
664            'avail': 'uint64',
665            'used': 'uint64',
666            'num': 'int',
667            'desc-phys': 'uint64',
668            'desc-size': 'uint32',
669            'avail-phys': 'uint64',
670            'avail-size': 'uint32',
671            'used-phys': 'uint64',
672            'used-size': 'uint32' } }
673
674##
675# @x-query-virtio-vhost-queue-status:
676#
677# Return information of a given vhost device's vhost_virtqueue
678#
679# @path: VirtIODevice canonical QOM path
680#
681# @queue: vhost_virtqueue index to examine
682#
683# Features:
684#
685# @unstable: This command is meant for debugging.
686#
687# Returns: VirtVhostQueueStatus of the vhost_virtqueue
688#
689# Since: 7.2
690#
691# Examples:
692#
693# 1. Get vhost_virtqueue status for vhost-crypto
694#
695# -> { "execute": "x-query-virtio-vhost-queue-status",
696#      "arguments": { "path": "/machine/peripheral/crypto0/virtio-backend",
697#                     "queue": 0 }
698#    }
699# <- { "return": {
700#          "avail-phys": 5216124928,
701#          "name": "virtio-crypto",
702#          "used-phys": 5216127040,
703#          "avail-size": 2054,
704#          "desc-size": 16384,
705#          "used-size": 8198,
706#          "desc": 140141447430144,
707#          "num": 1024,
708#          "call": 0,
709#          "avail": 140141447446528,
710#          "desc-phys": 5216108544,
711#          "used": 140141447448640,
712#          "kick": 0
713#      }
714#    }
715#
716# 2. Get vhost_virtqueue status for vhost-vsock
717#
718# -> { "execute": "x-query-virtio-vhost-queue-status",
719#      "arguments": { "path": "/machine/peripheral/vsock0/virtio-backend",
720#                     "queue": 0 }
721#    }
722# <- { "return": {
723#          "avail-phys": 5182261248,
724#          "name": "vhost-vsock",
725#          "used-phys": 5182261568,
726#          "avail-size": 262,
727#          "desc-size": 2048,
728#          "used-size": 1030,
729#          "desc": 140141413580800,
730#          "num": 128,
731#          "call": 0,
732#          "avail": 140141413582848,
733#          "desc-phys": 5182259200,
734#          "used": 140141413583168,
735#          "kick": 0
736#      }
737#    }
738##
739{ 'command': 'x-query-virtio-vhost-queue-status',
740  'data': { 'path': 'str', 'queue': 'uint16' },
741  'returns': 'VirtVhostQueueStatus',
742  'features': [ 'unstable' ] }
743
744##
745# @VirtioRingDesc:
746#
747# Information regarding the vring descriptor area
748#
749# @addr: Guest physical address of the descriptor area
750#
751# @len: Length of the descriptor area
752#
753# @flags: List of descriptor flags
754#
755# Since: 7.2
756##
757{ 'struct': 'VirtioRingDesc',
758  'data': { 'addr': 'uint64',
759            'len': 'uint32',
760            'flags': [ 'str' ] } }
761
762##
763# @VirtioRingAvail:
764#
765# Information regarding the avail vring (a.k.a. driver area)
766#
767# @flags: VRingAvail flags
768#
769# @idx: VRingAvail index
770#
771# @ring: VRingAvail ring[] entry at provided index
772#
773# Since: 7.2
774##
775{ 'struct': 'VirtioRingAvail',
776  'data': { 'flags': 'uint16',
777            'idx': 'uint16',
778            'ring': 'uint16' } }
779
780##
781# @VirtioRingUsed:
782#
783# Information regarding the used vring (a.k.a. device area)
784#
785# @flags: VRingUsed flags
786#
787# @idx: VRingUsed index
788#
789# Since: 7.2
790##
791{ 'struct': 'VirtioRingUsed',
792  'data': { 'flags': 'uint16',
793            'idx': 'uint16' } }
794
795##
796# @VirtioQueueElement:
797#
798# Information regarding a VirtQueue's VirtQueueElement including
799# descriptor, driver, and device areas
800#
801# @name: Name of the VirtIODevice that uses this VirtQueue
802#
803# @index: Index of the element in the queue
804#
805# @descs: List of descriptors (VirtioRingDesc)
806#
807# @avail: VRingAvail info
808#
809# @used: VRingUsed info
810#
811# Since: 7.2
812##
813{ 'struct': 'VirtioQueueElement',
814  'data': { 'name': 'str',
815            'index': 'uint32',
816            'descs': [ 'VirtioRingDesc' ],
817            'avail': 'VirtioRingAvail',
818            'used': 'VirtioRingUsed' } }
819
820##
821# @x-query-virtio-queue-element:
822#
823# Return the information about a VirtQueue's VirtQueueElement
824#
825# @path: VirtIODevice canonical QOM path
826#
827# @queue: VirtQueue index to examine
828#
829# @index: Index of the element in the queue (default: head of the
830#     queue)
831#
832# Features:
833#
834# @unstable: This command is meant for debugging.
835#
836# Returns: VirtioQueueElement information
837#
838# Since: 7.2
839#
840# Examples:
841#
842# 1. Introspect on virtio-net's VirtQueue 0 at index 5
843#
844# -> { "execute": "x-query-virtio-queue-element",
845#      "arguments": { "path": "/machine/peripheral-anon/device[1]/virtio-backend",
846#                     "queue": 0,
847#                     "index": 5 }
848#    }
849# <- { "return": {
850#          "index": 5,
851#          "name": "virtio-net",
852#          "descs": [
853#              {
854#                  "flags": ["write"],
855#                  "len": 1536,
856#                  "addr": 5257305600
857#              }
858#          ],
859#          "avail": {
860#              "idx": 256,
861#              "flags": 0,
862#              "ring": 5
863#          },
864#          "used": {
865#              "idx": 13,
866#              "flags": 0
867#          }
868#      }
869#    }
870#
871# 2. Introspect on virtio-crypto's VirtQueue 1 at head
872#
873# -> { "execute": "x-query-virtio-queue-element",
874#      "arguments": { "path": "/machine/peripheral/crypto0/virtio-backend",
875#                     "queue": 1 }
876#    }
877# <- { "return": {
878#          "index": 0,
879#          "name": "virtio-crypto",
880#          "descs": [
881#              {
882#                  "flags": [],
883#                  "len": 0,
884#                  "addr": 8080268923184214134
885#              }
886#          ],
887#          "avail": {
888#              "idx": 280,
889#              "flags": 0,
890#              "ring": 0
891#          },
892#          "used": {
893#              "idx": 280,
894#              "flags": 0
895#          }
896#      }
897#    }
898#
899# 3. Introspect on virtio-scsi's VirtQueue 2 at head
900#
901# -> { "execute": "x-query-virtio-queue-element",
902#      "arguments": { "path": "/machine/peripheral-anon/device[2]/virtio-backend",
903#                     "queue": 2 }
904#    }
905# <- { "return": {
906#          "index": 19,
907#          "name": "virtio-scsi",
908#          "descs": [
909#              {
910#                  "flags": ["used", "indirect", "write"],
911#                  "len": 4099327944,
912#                  "addr": 12055409292258155293
913#              }
914#          ],
915#          "avail": {
916#              "idx": 1147,
917#              "flags": 0,
918#              "ring": 19
919#          },
920#          "used": {
921#              "idx": 280,
922#              "flags": 0
923#          }
924#      }
925#    }
926##
927{ 'command': 'x-query-virtio-queue-element',
928  'data': { 'path': 'str', 'queue': 'uint16', '*index': 'uint16' },
929  'returns': 'VirtioQueueElement',
930  'features': [ 'unstable' ] }
931
932##
933# @IOThreadVirtQueueMapping:
934#
935# Describes the subset of virtqueues assigned to an IOThread.
936#
937# @iothread: the id of IOThread object
938#
939# @vqs: an optional array of virtqueue indices that will be handled by this
940#     IOThread.  When absent, virtqueues are assigned round-robin across all
941#     IOThreadVirtQueueMappings provided.  Either all IOThreadVirtQueueMappings
942#     must have @vqs or none of them must have it.
943#
944# Since: 9.0
945##
946
947{ 'struct': 'IOThreadVirtQueueMapping',
948  'data': { 'iothread': 'str', '*vqs': ['uint16'] } }
949
950##
951# @DummyVirtioForceArrays:
952#
953# Not used by QMP; hack to let us use IOThreadVirtQueueMappingList internally
954#
955# Since: 9.0
956##
957
958{ 'struct': 'DummyVirtioForceArrays',
959  'data': { 'unused-iothread-vq-mapping': ['IOThreadVirtQueueMapping'] } }
960