Commit f66b07c5 authored by Linus Torvalds's avatar Linus Torvalds

Merge tag 'vfio-v6.11-rc1' of https://github.com/awilliam/linux-vfio

Pull VFIO updates from Alex Williamson:

 - Add support for 8-byte accesses when using read/write through the
   device regions.  This fills a gap for userspace drivers that might
   not be able to use access through mmap to perform native register
   width accesses (Gerd Bayer)

 - Add missing MODULE_DESCRIPTION to vfio-mdev sample drivers and
   replace a non-standard MODULE_INFO usage (Jeff Johnson)

* tag 'vfio-v6.11-rc1' of https://github.com/awilliam/linux-vfio:
  vfio-mdev: add missing MODULE_DESCRIPTION() macros
  vfio/pci: Fix typo in macro to declare accessors
  vfio/pci: Support 8-byte PCI loads and stores
  vfio/pci: Extract duplicated code into macro
parents 4305ca00 0756bec2
...@@ -89,6 +89,47 @@ EXPORT_SYMBOL_GPL(vfio_pci_core_ioread##size); ...@@ -89,6 +89,47 @@ EXPORT_SYMBOL_GPL(vfio_pci_core_ioread##size);
VFIO_IOREAD(8) VFIO_IOREAD(8)
VFIO_IOREAD(16) VFIO_IOREAD(16)
VFIO_IOREAD(32) 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,\
bool iswrite, bool test_mem, \
void __iomem *io, char __user *buf, \
loff_t off, size_t *filled) \
{ \
u##size val; \
int ret; \
\
if (iswrite) { \
if (copy_from_user(&val, buf, sizeof(val))) \
return -EFAULT; \
\
ret = vfio_pci_core_iowrite##size(vdev, test_mem, \
val, io + off); \
if (ret) \
return ret; \
} else { \
ret = vfio_pci_core_ioread##size(vdev, test_mem, \
&val, io + off); \
if (ret) \
return ret; \
\
if (copy_to_user(buf, &val, sizeof(val))) \
return -EFAULT; \
} \
\
*filled = sizeof(val); \
return 0; \
} \
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 * Read or write from an __iomem region (MMIO or I/O port) with an excluded
...@@ -114,72 +155,33 @@ ssize_t vfio_pci_core_do_io_rw(struct vfio_pci_core_device *vdev, bool test_mem, ...@@ -114,72 +155,33 @@ ssize_t vfio_pci_core_do_io_rw(struct vfio_pci_core_device *vdev, bool test_mem,
else else
fillable = 0; fillable = 0;
if (fillable >= 4 && !(off % 4)) { #if defined(ioread64) && defined(iowrite64)
u32 val; if (fillable >= 8 && !(off % 8)) {
ret = vfio_pci_iordwr64(vdev, iswrite, test_mem,
if (iswrite) { io, buf, off, &filled);
if (copy_from_user(&val, buf, 4))
return -EFAULT;
ret = vfio_pci_core_iowrite32(vdev, test_mem,
val, io + off);
if (ret) if (ret)
return ret; return ret;
} else {
ret = vfio_pci_core_ioread32(vdev, test_mem, } else
&val, io + off); #endif
if (fillable >= 4 && !(off % 4)) {
ret = vfio_pci_iordwr32(vdev, iswrite, test_mem,
io, buf, off, &filled);
if (ret) if (ret)
return ret; return ret;
if (copy_to_user(buf, &val, 4))
return -EFAULT;
}
filled = 4;
} else if (fillable >= 2 && !(off % 2)) { } else if (fillable >= 2 && !(off % 2)) {
u16 val; ret = vfio_pci_iordwr16(vdev, iswrite, test_mem,
io, buf, off, &filled);
if (iswrite) {
if (copy_from_user(&val, buf, 2))
return -EFAULT;
ret = vfio_pci_core_iowrite16(vdev, test_mem,
val, io + off);
if (ret)
return ret;
} else {
ret = vfio_pci_core_ioread16(vdev, test_mem,
&val, io + off);
if (ret) if (ret)
return ret; return ret;
if (copy_to_user(buf, &val, 2))
return -EFAULT;
}
filled = 2;
} else if (fillable) { } else if (fillable) {
u8 val; ret = vfio_pci_iordwr8(vdev, iswrite, test_mem,
io, buf, off, &filled);
if (iswrite) {
if (copy_from_user(&val, buf, 1))
return -EFAULT;
ret = vfio_pci_core_iowrite8(vdev, test_mem,
val, io + off);
if (ret)
return ret;
} else {
ret = vfio_pci_core_ioread8(vdev, test_mem,
&val, io + off);
if (ret) if (ret)
return ret; return ret;
if (copy_to_user(buf, &val, 1))
return -EFAULT;
}
filled = 1;
} else { } else {
/* Fill reads with -1, drop writes */ /* Fill reads with -1, drop writes */
filled = min(count, (size_t)(x_end - off)); filled = min(count, (size_t)(x_end - off));
......
...@@ -137,23 +137,26 @@ bool vfio_pci_core_range_intersect_range(loff_t buf_start, size_t buf_cnt, ...@@ -137,23 +137,26 @@ bool vfio_pci_core_range_intersect_range(loff_t buf_start, size_t buf_cnt,
loff_t *buf_offset, loff_t *buf_offset,
size_t *intersect_count, size_t *intersect_count,
size_t *register_offset); size_t *register_offset);
#define VFIO_IOWRITE_DECLATION(size) \ #define VFIO_IOWRITE_DECLARATION(size) \
int vfio_pci_core_iowrite##size(struct vfio_pci_core_device *vdev, \ int vfio_pci_core_iowrite##size(struct vfio_pci_core_device *vdev, \
bool test_mem, u##size val, void __iomem *io); bool test_mem, u##size val, void __iomem *io);
VFIO_IOWRITE_DECLATION(8) VFIO_IOWRITE_DECLARATION(8)
VFIO_IOWRITE_DECLATION(16) VFIO_IOWRITE_DECLARATION(16)
VFIO_IOWRITE_DECLATION(32) VFIO_IOWRITE_DECLARATION(32)
#ifdef iowrite64 #ifdef iowrite64
VFIO_IOWRITE_DECLATION(64) VFIO_IOWRITE_DECLARATION(64)
#endif #endif
#define VFIO_IOREAD_DECLATION(size) \ #define VFIO_IOREAD_DECLARATION(size) \
int vfio_pci_core_ioread##size(struct vfio_pci_core_device *vdev, \ int vfio_pci_core_ioread##size(struct vfio_pci_core_device *vdev, \
bool test_mem, u##size *val, void __iomem *io); bool test_mem, u##size *val, void __iomem *io);
VFIO_IOREAD_DECLATION(8) VFIO_IOREAD_DECLARATION(8)
VFIO_IOREAD_DECLATION(16) VFIO_IOREAD_DECLARATION(16)
VFIO_IOREAD_DECLATION(32) VFIO_IOREAD_DECLARATION(32)
#ifdef ioread64
VFIO_IOREAD_DECLARATION(64)
#endif
#endif /* VFIO_PCI_CORE_H */ #endif /* VFIO_PCI_CORE_H */
...@@ -88,6 +88,7 @@ ...@@ -88,6 +88,7 @@
#define STORE_LE32(addr, val) (*(u32 *)addr = val) #define STORE_LE32(addr, val) (*(u32 *)addr = val)
MODULE_DESCRIPTION("Mediated virtual PCI display host device driver");
MODULE_LICENSE("GPL v2"); MODULE_LICENSE("GPL v2");
static int max_mbytes = 256; static int max_mbytes = 256;
......
...@@ -229,4 +229,5 @@ static int __init mdpy_fb_init(void) ...@@ -229,4 +229,5 @@ static int __init mdpy_fb_init(void)
module_init(mdpy_fb_init); module_init(mdpy_fb_init);
MODULE_DEVICE_TABLE(pci, mdpy_fb_pci_table); MODULE_DEVICE_TABLE(pci, mdpy_fb_pci_table);
MODULE_DESCRIPTION("Framebuffer driver for mdpy (mediated virtual pci display device)");
MODULE_LICENSE("GPL v2"); MODULE_LICENSE("GPL v2");
...@@ -40,6 +40,7 @@ ...@@ -40,6 +40,7 @@
#define STORE_LE32(addr, val) (*(u32 *)addr = val) #define STORE_LE32(addr, val) (*(u32 *)addr = val)
MODULE_DESCRIPTION("Mediated virtual PCI display host device driver");
MODULE_LICENSE("GPL v2"); MODULE_LICENSE("GPL v2");
#define MDPY_TYPE_1 "vga" #define MDPY_TYPE_1 "vga"
......
...@@ -2058,6 +2058,6 @@ module_init(mtty_dev_init) ...@@ -2058,6 +2058,6 @@ module_init(mtty_dev_init)
module_exit(mtty_dev_exit) module_exit(mtty_dev_exit)
MODULE_LICENSE("GPL v2"); MODULE_LICENSE("GPL v2");
MODULE_INFO(supported, "Test driver that simulate serial port over PCI"); MODULE_DESCRIPTION("Test driver that simulate serial port over PCI");
MODULE_VERSION(VERSION_STRING); MODULE_VERSION(VERSION_STRING);
MODULE_AUTHOR(DRIVER_AUTHOR); MODULE_AUTHOR(DRIVER_AUTHOR);
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment