]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
vfio/pci: Support 8-byte PCI loads and stores
authorBen Segal <bpsegal@us.ibm.com>
Wed, 19 Jun 2024 11:58:46 +0000 (13:58 +0200)
committerAlex Williamson <alex.williamson@redhat.com>
Fri, 21 Jun 2024 18:47:01 +0000 (12:47 -0600)
Many PCI adapters can benefit or even require full 64bit read
and write access to their registers. In order to enable work on
user-space drivers for these devices add two new variations
vfio_pci_core_io{read|write}64 of the existing access methods
when the architecture supports 64-bit ioreads and iowrites.

Signed-off-by: Ben Segal <bpsegal@us.ibm.com>
Co-developed-by: Gerd Bayer <gbayer@linux.ibm.com>
Signed-off-by: Gerd Bayer <gbayer@linux.ibm.com>
Link: https://lore.kernel.org/r/20240619115847.1344875-3-gbayer@linux.ibm.com
Signed-off-by: Alex Williamson <alex.williamson@redhat.com>
drivers/vfio/pci/vfio_pci_rdwr.c
include/linux/vfio_pci_core.h

index d07bfb0ab892b70414b9fabd275a6bdbd41a547f..66b72c2892841d9f25f17033fc7b3e86f108c1f0 100644 (file)
@@ -89,6 +89,9 @@ EXPORT_SYMBOL_GPL(vfio_pci_core_ioread##size);
 VFIO_IOREAD(8)
 VFIO_IOREAD(16)
 VFIO_IOREAD(32)
+#ifdef ioread64
+VFIO_IOREAD(64)
+#endif
 
 #define VFIO_IORDWR(size)                                              \
 static int vfio_pci_iordwr##size(struct vfio_pci_core_device *vdev,\
@@ -124,6 +127,10 @@ static int vfio_pci_iordwr##size(struct vfio_pci_core_device *vdev,\
 VFIO_IORDWR(8)
 VFIO_IORDWR(16)
 VFIO_IORDWR(32)
+#if defined(ioread64) && defined(iowrite64)
+VFIO_IORDWR(64)
+#endif
+
 /*
  * Read or write from an __iomem region (MMIO or I/O port) with an excluded
  * range which is inaccessible.  The excluded range drops writes and fills
@@ -148,6 +155,15 @@ ssize_t vfio_pci_core_do_io_rw(struct vfio_pci_core_device *vdev, bool test_mem,
                else
                        fillable = 0;
 
+#if defined(ioread64) && defined(iowrite64)
+               if (fillable >= 8 && !(off % 8)) {
+                       ret = vfio_pci_iordwr64(vdev, iswrite, test_mem,
+                                               io, buf, off, &filled);
+                       if (ret)
+                               return ret;
+
+               } else
+#endif
                if (fillable >= 4 && !(off % 4)) {
                        ret = vfio_pci_iordwr32(vdev, iswrite, test_mem,
                                                io, buf, off, &filled);
index f87067438ed48f4304a8ffdb2fa60f79b6208d33..7b45f70f84c3b5b35d9213fe3f2ba6057a48d012 100644 (file)
@@ -155,5 +155,8 @@ int vfio_pci_core_ioread##size(struct vfio_pci_core_device *vdev,   \
 VFIO_IOREAD_DECLATION(8)
 VFIO_IOREAD_DECLATION(16)
 VFIO_IOREAD_DECLATION(32)
+#ifdef ioread64
+VFIO_IOREAD_DECLATION(64)
+#endif
 
 #endif /* VFIO_PCI_CORE_H */