Lines Matching +full:rom +full:- +full:val

1 // SPDX-License-Identifier: GPL-2.0-only
19 #include <linux/io-64-nonatomic-lo-hi.h>
43 bool test_mem, u##size val, void __iomem *io) \
46 down_read(&vdev->memory_lock); \
48 up_read(&vdev->memory_lock); \
49 return -EIO; \
53 vfio_iowrite##size(val, io); \
56 up_read(&vdev->memory_lock); \
69 bool test_mem, u##size *val, void __iomem *io) \
72 down_read(&vdev->memory_lock); \
74 up_read(&vdev->memory_lock); \
75 return -EIO; \
79 *val = vfio_ioread##size(io); \
82 up_read(&vdev->memory_lock); \
99 u##size val; \
103 if (copy_from_user(&val, buf, sizeof(val))) \
104 return -EFAULT; \
107 val, io + off); \
112 &val, io + off); \
116 if (copy_to_user(buf, &val, sizeof(val))) \
117 return -EFAULT; \
120 *filled = sizeof(val); \
132 * reads with -1. This is intended for handling MSI-X vector tables and
133 * leftover space for ROM BARs.
147 fillable = min(count, (size_t)(x_start - off)); in vfio_pci_core_do_io_rw()
179 /* Fill reads with -1, drop writes */ in vfio_pci_core_do_io_rw()
180 filled = min(count, (size_t)(x_end - off)); in vfio_pci_core_do_io_rw()
182 u8 val = 0xFF; in vfio_pci_core_do_io_rw() local
186 if (copy_to_user(buf + i, &val, 1)) in vfio_pci_core_do_io_rw()
187 return -EFAULT; in vfio_pci_core_do_io_rw()
191 count -= filled; in vfio_pci_core_do_io_rw()
203 struct pci_dev *pdev = vdev->pdev; in vfio_pci_core_setup_barmap()
207 if (vdev->barmap[bar]) in vfio_pci_core_setup_barmap()
217 return -ENOMEM; in vfio_pci_core_setup_barmap()
220 vdev->barmap[bar] = io; in vfio_pci_core_setup_barmap()
229 struct pci_dev *pdev = vdev->pdev; in vfio_pci_bar_rw()
235 struct resource *res = &vdev->pdev->resource[bar]; in vfio_pci_bar_rw()
240 else if (bar == PCI_ROM_RESOURCE && pdev->rom && pdev->romlen) in vfio_pci_bar_rw()
241 end = roundup_pow_of_two(pdev->romlen); in vfio_pci_bar_rw()
243 return -EINVAL; in vfio_pci_bar_rw()
246 return -EINVAL; in vfio_pci_bar_rw()
248 count = min(count, (size_t)(end - pos)); in vfio_pci_bar_rw()
252 * The ROM can fill less space than the BAR, so we start the in vfio_pci_bar_rw()
253 * excluded range at the end of the actual ROM. This makes in vfio_pci_bar_rw()
254 * filling large ROM BARs much faster. in vfio_pci_bar_rw()
259 io = ioremap(pdev->rom, pdev->romlen); in vfio_pci_bar_rw()
260 x_start = pdev->romlen; in vfio_pci_bar_rw()
263 return -ENOMEM; in vfio_pci_bar_rw()
272 io = vdev->barmap[bar]; in vfio_pci_bar_rw()
275 if (bar == vdev->msix_bar) { in vfio_pci_bar_rw()
276 x_start = vdev->msix_offset; in vfio_pci_bar_rw()
277 x_end = vdev->msix_offset + vdev->msix_size; in vfio_pci_bar_rw()
280 done = vfio_pci_core_do_io_rw(vdev, res->flags & IORESOURCE_MEM, io, buf, pos, in vfio_pci_bar_rw()
308 if (!vdev->has_vga) in vfio_pci_vga_rw()
309 return -EINVAL; in vfio_pci_vga_rw()
312 return -EINVAL; in vfio_pci_vga_rw()
316 count = min(count, (size_t)(0xc0000 - pos)); in vfio_pci_vga_rw()
317 iomem = ioremap(0xa0000, 0xbffff - 0xa0000 + 1); in vfio_pci_vga_rw()
318 off = pos - 0xa0000; in vfio_pci_vga_rw()
323 count = min(count, (size_t)(0x3bc - pos)); in vfio_pci_vga_rw()
324 iomem = ioport_map(0x3b0, 0x3bb - 0x3b0 + 1); in vfio_pci_vga_rw()
325 off = pos - 0x3b0; in vfio_pci_vga_rw()
330 count = min(count, (size_t)(0x3e0 - pos)); in vfio_pci_vga_rw()
331 iomem = ioport_map(0x3c0, 0x3df - 0x3c0 + 1); in vfio_pci_vga_rw()
332 off = pos - 0x3c0; in vfio_pci_vga_rw()
337 return -EINVAL; in vfio_pci_vga_rw()
341 return -ENOMEM; in vfio_pci_vga_rw()
343 ret = vga_get_interruptible(vdev->pdev, rsrc); in vfio_pci_vga_rw()
350 * VGA MMIO is a legacy, non-BAR resource that hopefully allows in vfio_pci_vga_rw()
357 vga_put(vdev->pdev, rsrc); in vfio_pci_vga_rw()
371 switch (ioeventfd->count) { in vfio_pci_ioeventfd_do_write()
373 vfio_pci_core_iowrite8(ioeventfd->vdev, test_mem, in vfio_pci_ioeventfd_do_write()
374 ioeventfd->data, ioeventfd->addr); in vfio_pci_ioeventfd_do_write()
377 vfio_pci_core_iowrite16(ioeventfd->vdev, test_mem, in vfio_pci_ioeventfd_do_write()
378 ioeventfd->data, ioeventfd->addr); in vfio_pci_ioeventfd_do_write()
381 vfio_pci_core_iowrite32(ioeventfd->vdev, test_mem, in vfio_pci_ioeventfd_do_write()
382 ioeventfd->data, ioeventfd->addr); in vfio_pci_ioeventfd_do_write()
385 vfio_pci_core_iowrite64(ioeventfd->vdev, test_mem, in vfio_pci_ioeventfd_do_write()
386 ioeventfd->data, ioeventfd->addr); in vfio_pci_ioeventfd_do_write()
394 struct vfio_pci_core_device *vdev = ioeventfd->vdev; in vfio_pci_ioeventfd_handler()
396 if (ioeventfd->test_mem) { in vfio_pci_ioeventfd_handler()
397 if (!down_read_trylock(&vdev->memory_lock)) in vfio_pci_ioeventfd_handler()
400 up_read(&vdev->memory_lock); in vfio_pci_ioeventfd_handler()
407 if (ioeventfd->test_mem) in vfio_pci_ioeventfd_handler()
408 up_read(&vdev->memory_lock); in vfio_pci_ioeventfd_handler()
417 vfio_pci_ioeventfd_do_write(ioeventfd, ioeventfd->test_mem); in vfio_pci_ioeventfd_thread()
423 struct pci_dev *pdev = vdev->pdev; in vfio_pci_ioeventfd()
430 return -EINVAL; in vfio_pci_ioeventfd()
433 return -EINVAL; in vfio_pci_ioeventfd()
435 /* Disallow ioeventfds working around MSI-X table writes */ in vfio_pci_ioeventfd()
436 if (bar == vdev->msix_bar && in vfio_pci_ioeventfd()
437 !(pos + count <= vdev->msix_offset || in vfio_pci_ioeventfd()
438 pos >= vdev->msix_offset + vdev->msix_size)) in vfio_pci_ioeventfd()
439 return -EINVAL; in vfio_pci_ioeventfd()
442 return -EINVAL; in vfio_pci_ioeventfd()
448 mutex_lock(&vdev->ioeventfds_lock); in vfio_pci_ioeventfd()
450 list_for_each_entry(ioeventfd, &vdev->ioeventfds_list, next) { in vfio_pci_ioeventfd()
451 if (ioeventfd->pos == pos && ioeventfd->bar == bar && in vfio_pci_ioeventfd()
452 ioeventfd->data == data && ioeventfd->count == count) { in vfio_pci_ioeventfd()
453 if (fd == -1) { in vfio_pci_ioeventfd()
454 vfio_virqfd_disable(&ioeventfd->virqfd); in vfio_pci_ioeventfd()
455 list_del(&ioeventfd->next); in vfio_pci_ioeventfd()
456 vdev->ioeventfds_nr--; in vfio_pci_ioeventfd()
460 ret = -EEXIST; in vfio_pci_ioeventfd()
467 ret = -ENODEV; in vfio_pci_ioeventfd()
471 if (vdev->ioeventfds_nr >= VFIO_PCI_IOEVENTFD_MAX) { in vfio_pci_ioeventfd()
472 ret = -ENOSPC; in vfio_pci_ioeventfd()
478 ret = -ENOMEM; in vfio_pci_ioeventfd()
482 ioeventfd->vdev = vdev; in vfio_pci_ioeventfd()
483 ioeventfd->addr = vdev->barmap[bar] + pos; in vfio_pci_ioeventfd()
484 ioeventfd->data = data; in vfio_pci_ioeventfd()
485 ioeventfd->pos = pos; in vfio_pci_ioeventfd()
486 ioeventfd->bar = bar; in vfio_pci_ioeventfd()
487 ioeventfd->count = count; in vfio_pci_ioeventfd()
488 ioeventfd->test_mem = vdev->pdev->resource[bar].flags & IORESOURCE_MEM; in vfio_pci_ioeventfd()
492 &ioeventfd->virqfd, fd); in vfio_pci_ioeventfd()
498 list_add(&ioeventfd->next, &vdev->ioeventfds_list); in vfio_pci_ioeventfd()
499 vdev->ioeventfds_nr++; in vfio_pci_ioeventfd()
502 mutex_unlock(&vdev->ioeventfds_lock); in vfio_pci_ioeventfd()