VFIO updates for v6.11
- 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) -----BEGIN PGP SIGNATURE----- iQJPBAABCAA5FiEEQvbATlQL0amee4qQI5ubbjuwiyIFAmaZXhwbHGFsZXgud2ls bGlhbXNvbkByZWRoYXQuY29tAAoJECObm247sIsiItQQAJD29AqKIAy0DBTe9Hqq vk8TTjOXnzH44FgCQNg6h5+Xvqv6ZqGi+Fn6bAKutNdqMUpRBQljBiDEHEsQRFTr rd993PHuvO/FSQQMLmpiJzsb9VEKvqkUxPwOv50mnLnp1w5F6bxdDYhXkQCE0yUo n0eGQTYSFZWSIh4m17gCpclVSg/uuihlY4vBJVE8k+nLmUgPY9aHLLDHEcfN06CK qTkfmGGR//xsns0do/jaX6Fs0znIKTNixjHq6C/jdb4bw6CpBwWVT8Nc1apfqp+M 0VUHpBRgQk3HAs47EHwv3efc3t1ebAawYLql2laAug/2QJDFJdQEK713CkvLa4N+ gLyzOKHU6pkVN6f+sGLmr+fwOH1EMq4XLrIyncoBxiYOrR3aWmVfb/+we3yAq3Fj Np40pfdNHECGGXuNSWVeNgyCd5h2RuuxWV3XwcUGZjXqgtTlwRtySeLpzib1Wv1E 9qKsBdAnLt+5wgDySh//cTLjNcQPB4yhT9II6YmBZ6GNI7rtIF6hqjNqy3lx/lhr hRVueMH0u9PC81Up2Soiy1y3CnqckIDTg+L8n/X+6wUha+wiPNGCQWJr2Cvk/Cwt /ELflXh8FTPmN27tpaTFj8w4ZG7z3RFVGD7nwE9HWXiD7EJLZSsgwkMbGN6oETO8 flLtfexFgc9ruDSRBJYMFbCs =sA4G -----END PGP SIGNATURE----- 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
This commit is contained in:
commit
f66b07c561
@ -89,6 +89,47 @@ 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,\
|
||||
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
|
||||
@ -114,72 +155,33 @@ 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)) {
|
||||
u32 val;
|
||||
ret = vfio_pci_iordwr32(vdev, iswrite, test_mem,
|
||||
io, buf, off, &filled);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
if (iswrite) {
|
||||
if (copy_from_user(&val, buf, 4))
|
||||
return -EFAULT;
|
||||
|
||||
ret = vfio_pci_core_iowrite32(vdev, test_mem,
|
||||
val, io + off);
|
||||
if (ret)
|
||||
return ret;
|
||||
} else {
|
||||
ret = vfio_pci_core_ioread32(vdev, test_mem,
|
||||
&val, io + off);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
if (copy_to_user(buf, &val, 4))
|
||||
return -EFAULT;
|
||||
}
|
||||
|
||||
filled = 4;
|
||||
} else if (fillable >= 2 && !(off % 2)) {
|
||||
u16 val;
|
||||
ret = vfio_pci_iordwr16(vdev, iswrite, test_mem,
|
||||
io, buf, off, &filled);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
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)
|
||||
return ret;
|
||||
|
||||
if (copy_to_user(buf, &val, 2))
|
||||
return -EFAULT;
|
||||
}
|
||||
|
||||
filled = 2;
|
||||
} else if (fillable) {
|
||||
u8 val;
|
||||
ret = vfio_pci_iordwr8(vdev, iswrite, test_mem,
|
||||
io, buf, off, &filled);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
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)
|
||||
return ret;
|
||||
|
||||
if (copy_to_user(buf, &val, 1))
|
||||
return -EFAULT;
|
||||
}
|
||||
|
||||
filled = 1;
|
||||
} else {
|
||||
/* Fill reads with -1, drop writes */
|
||||
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,
|
||||
loff_t *buf_offset,
|
||||
size_t *intersect_count,
|
||||
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, \
|
||||
bool test_mem, u##size val, void __iomem *io);
|
||||
|
||||
VFIO_IOWRITE_DECLATION(8)
|
||||
VFIO_IOWRITE_DECLATION(16)
|
||||
VFIO_IOWRITE_DECLATION(32)
|
||||
VFIO_IOWRITE_DECLARATION(8)
|
||||
VFIO_IOWRITE_DECLARATION(16)
|
||||
VFIO_IOWRITE_DECLARATION(32)
|
||||
#ifdef iowrite64
|
||||
VFIO_IOWRITE_DECLATION(64)
|
||||
VFIO_IOWRITE_DECLARATION(64)
|
||||
#endif
|
||||
|
||||
#define VFIO_IOREAD_DECLATION(size) \
|
||||
#define VFIO_IOREAD_DECLARATION(size) \
|
||||
int vfio_pci_core_ioread##size(struct vfio_pci_core_device *vdev, \
|
||||
bool test_mem, u##size *val, void __iomem *io);
|
||||
|
||||
VFIO_IOREAD_DECLATION(8)
|
||||
VFIO_IOREAD_DECLATION(16)
|
||||
VFIO_IOREAD_DECLATION(32)
|
||||
VFIO_IOREAD_DECLARATION(8)
|
||||
VFIO_IOREAD_DECLARATION(16)
|
||||
VFIO_IOREAD_DECLARATION(32)
|
||||
#ifdef ioread64
|
||||
VFIO_IOREAD_DECLARATION(64)
|
||||
#endif
|
||||
|
||||
#endif /* VFIO_PCI_CORE_H */
|
||||
|
@ -88,6 +88,7 @@
|
||||
#define STORE_LE32(addr, val) (*(u32 *)addr = val)
|
||||
|
||||
|
||||
MODULE_DESCRIPTION("Mediated virtual PCI display host device driver");
|
||||
MODULE_LICENSE("GPL v2");
|
||||
|
||||
static int max_mbytes = 256;
|
||||
|
@ -229,4 +229,5 @@ static int __init mdpy_fb_init(void)
|
||||
module_init(mdpy_fb_init);
|
||||
|
||||
MODULE_DEVICE_TABLE(pci, mdpy_fb_pci_table);
|
||||
MODULE_DESCRIPTION("Framebuffer driver for mdpy (mediated virtual pci display device)");
|
||||
MODULE_LICENSE("GPL v2");
|
||||
|
@ -40,6 +40,7 @@
|
||||
#define STORE_LE32(addr, val) (*(u32 *)addr = val)
|
||||
|
||||
|
||||
MODULE_DESCRIPTION("Mediated virtual PCI display host device driver");
|
||||
MODULE_LICENSE("GPL v2");
|
||||
|
||||
#define MDPY_TYPE_1 "vga"
|
||||
|
@ -2058,6 +2058,6 @@ module_init(mtty_dev_init)
|
||||
module_exit(mtty_dev_exit)
|
||||
|
||||
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_AUTHOR(DRIVER_AUTHOR);
|
||||
|
Loading…
Reference in New Issue
Block a user