In preparation to support VIRTIO_F_DMB, define the feature bit. A device
that negotiates it holds its virtqueues and the buffers they reference in
a Device Memory Buffer, a shared memory region the device owns. The data
DMA of such a device is routed through a per-device transparent IOMMU
whose bus address space maps 1:1 onto that region, so every address the
driver places in a virtqueue is an address in that space and the device
can reach nothing the driver has not published there.

Define VIRTIO_F_DMB as 44 and raise VIRTIO_TRANSPORT_F_END to 45, so
virtio_dev_probe() preserves the bit into finalize_features() where a
transport can act on it. VIRTIO_DEVICE_F_MASK derives from the same bound
and moves with it. vdpa reads the bound as VIRTIO_TRANSPORT_F_END + 1
while vring_transport_features() stops below it, so the mask drops bits
43 to 45 from the device_features vdpa reports over netlink, one bit
beyond the last bit a transport can act on.

Define VIRTIO_DMB_MEM_TYPE_COHERENT too. A device reports the memory
type of its region, and this is the one type that says a write by either
side becomes visible to the other with no cache maintenance by the
driver. Every transport reports the same type, so the name belongs here
beside the feature bit and not in the header of one of them.

Link: 
https://lore.kernel.org/virtio-comment/[email protected]/
Assisted-by: Kiro:claude-opus-5 checkpatch sparse
Signed-off-by: Alexander Graf <[email protected]>
---

  - Say bus address space rather than IOVA space

---
 include/uapi/linux/virtio_config.h | 24 +++++++++++++++++++++++-
 1 file changed, 23 insertions(+), 1 deletion(-)

diff --git a/include/uapi/linux/virtio_config.h 
b/include/uapi/linux/virtio_config.h
index 2445f365bce7..8cfd9436a09e 100644
--- a/include/uapi/linux/virtio_config.h
+++ b/include/uapi/linux/virtio_config.h
@@ -52,7 +52,7 @@
  * rest are per-device feature bits.
  */
 #define VIRTIO_TRANSPORT_F_START       28
-#define VIRTIO_TRANSPORT_F_END         42
+#define VIRTIO_TRANSPORT_F_END         45
 
 #ifndef VIRTIO_CONFIG_NO_LEGACY
 /* Do we get callbacks when the ring is completely used, even if we've
@@ -120,4 +120,26 @@
  */
 #define VIRTIO_F_ADMIN_VQ              41
 
+/*
+ * This feature indicates that the device offers a Device Memory Buffer: a
+ * shared memory region, owned by the device, that holds the virtqueues and
+ * the buffers they reference.  When this feature is negotiated, the data DMA
+ * of the device is routed through a per-device transparent IOMMU whose bus
+ * address space maps 1:1 onto that region, so every address the driver
+ * places in a virtqueue is an address in that space and the device can
+ * reach nothing the driver has not published there.  Interrupts are
+ * unaffected.
+ */
+#define VIRTIO_F_DMB                   44
+
+/*
+ * The memory type of a Device Memory Buffer region, as the device reports it.
+ * VIRTIO_DMB_MEM_TYPE_COHERENT means a write by either side becomes visible to
+ * the other with no cache maintenance by the driver.  Every other value is
+ * reserved.  A device reports the type from the moment it offers
+ * VIRTIO_F_DMB, and a driver must not accept the feature unless the type is
+ * one it supports.
+ */
+#define VIRTIO_DMB_MEM_TYPE_COHERENT   0
+
 #endif /* _UAPI_LINUX_VIRTIO_CONFIG_H */

Reply via email to