![Michael S. Tsirkin](/assets/img/avatar_default.png)
The interaction between virtio and IOMMUs is messy. On most systems with virtio, physical addresses match bus addresses, and it doesn't particularly matter which one we use to program the device. On some systems, including Xen and any system with a physical device that speaks virtio behind a physical IOMMU, we must program the IOMMU for virtio DMA to work at all. On other systems, including SPARC and PPC64, virtio-pci devices are enumerated as though they are behind an IOMMU, but the virtio host ignores the IOMMU, so we must either pretend that the IOMMU isn't there or somehow map everything as the identity. Add a feature bit to detect that quirk: VIRTIO_F_IOMMU_PLATFORM. Any device with this feature bit set to 0 needs a quirk and has to be passed physical addresses (as opposed to bus addresses) even though the device is behind an IOMMU. Note: it has to be a per-device quirk because for example, there could be a mix of passed-through and virtual virtio devices. As another example, some devices could be implemented by an out of process hypervisor backend (in case of qemu vhost, or vhost-user) and so support for an IOMMU needs to be coded up separately. It would be cleanest to handle this in IOMMU core code, but that needs per-device DMA ops. While we are waiting for that to be implemented, use a work-around in virtio core. Note: a "noiommu" feature is a quirk - add a wrapper to make that clear. Signed-off-by: Michael S. Tsirkin <mst@redhat.com>
75 lines
3.4 KiB
C
75 lines
3.4 KiB
C
#ifndef _UAPI_LINUX_VIRTIO_CONFIG_H
|
|
#define _UAPI_LINUX_VIRTIO_CONFIG_H
|
|
/* This header, excluding the #ifdef __KERNEL__ part, is BSD licensed so
|
|
* anyone can use the definitions to implement compatible drivers/servers.
|
|
*
|
|
* Redistribution and use in source and binary forms, with or without
|
|
* modification, are permitted provided that the following conditions
|
|
* are met:
|
|
* 1. Redistributions of source code must retain the above copyright
|
|
* notice, this list of conditions and the following disclaimer.
|
|
* 2. Redistributions in binary form must reproduce the above copyright
|
|
* notice, this list of conditions and the following disclaimer in the
|
|
* documentation and/or other materials provided with the distribution.
|
|
* 3. Neither the name of IBM nor the names of its contributors
|
|
* may be used to endorse or promote products derived from this software
|
|
* without specific prior written permission.
|
|
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ``AS IS'' AND
|
|
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
|
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
|
* ARE DISCLAIMED. IN NO EVENT SHALL IBM OR CONTRIBUTORS BE LIABLE
|
|
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
|
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
|
|
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
|
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
|
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
|
|
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
|
* SUCH DAMAGE. */
|
|
|
|
/* Virtio devices use a standardized configuration space to define their
|
|
* features and pass configuration information, but each implementation can
|
|
* store and access that space differently. */
|
|
#include <linux/types.h>
|
|
|
|
/* Status byte for guest to report progress, and synchronize features. */
|
|
/* We have seen device and processed generic fields (VIRTIO_CONFIG_F_VIRTIO) */
|
|
#define VIRTIO_CONFIG_S_ACKNOWLEDGE 1
|
|
/* We have found a driver for the device. */
|
|
#define VIRTIO_CONFIG_S_DRIVER 2
|
|
/* Driver has used its parts of the config, and is happy */
|
|
#define VIRTIO_CONFIG_S_DRIVER_OK 4
|
|
/* Driver has finished configuring features */
|
|
#define VIRTIO_CONFIG_S_FEATURES_OK 8
|
|
/* Device entered invalid state, driver must reset it */
|
|
#define VIRTIO_CONFIG_S_NEEDS_RESET 0x40
|
|
/* We've given up on this device. */
|
|
#define VIRTIO_CONFIG_S_FAILED 0x80
|
|
|
|
/* Some virtio feature bits (currently bits 28 through 32) are reserved for the
|
|
* transport being used (eg. virtio_ring), the rest are per-device feature
|
|
* bits. */
|
|
#define VIRTIO_TRANSPORT_F_START 28
|
|
#define VIRTIO_TRANSPORT_F_END 34
|
|
|
|
#ifndef VIRTIO_CONFIG_NO_LEGACY
|
|
/* Do we get callbacks when the ring is completely used, even if we've
|
|
* suppressed them? */
|
|
#define VIRTIO_F_NOTIFY_ON_EMPTY 24
|
|
|
|
/* Can the device handle any descriptor layout? */
|
|
#define VIRTIO_F_ANY_LAYOUT 27
|
|
#endif /* VIRTIO_CONFIG_NO_LEGACY */
|
|
|
|
/* v1.0 compliant. */
|
|
#define VIRTIO_F_VERSION_1 32
|
|
|
|
/*
|
|
* If clear - device has the IOMMU bypass quirk feature.
|
|
* If set - use platform tools to detect the IOMMU.
|
|
*
|
|
* Note the reverse polarity (compared to most other features),
|
|
* this is for compatibility with legacy systems.
|
|
*/
|
|
#define VIRTIO_F_IOMMU_PLATFORM 33
|
|
#endif /* _UAPI_LINUX_VIRTIO_CONFIG_H */
|