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

1 // SPDX-License-Identifier: GPL-2.0-only
42 bool test_mem, u##size val, void __iomem *io) \
45 down_read(&vdev->memory_lock); \
47 up_read(&vdev->memory_lock); \
48 return -EIO; \
52 vfio_iowrite##size(val, io); \
55 up_read(&vdev->memory_lock); \
70 bool test_mem, u##size *val, void __iomem *io) \
73 down_read(&vdev->memory_lock); \
75 up_read(&vdev->memory_lock); \
76 return -EIO; \
80 *val = vfio_ioread##size(io); \
83 up_read(&vdev->memory_lock); \
96 * reads with -1. This is intended for handling MSI-X vector tables and
97 * leftover space for ROM BARs.
111 fillable = min(count, (size_t)(x_start - off)); in do_io_rw()
118 u32 val; in do_io_rw() local
121 if (copy_from_user(&val, buf, 4)) in do_io_rw()
122 return -EFAULT; in do_io_rw()
125 val, io + off); in do_io_rw()
130 &val, io + off); in do_io_rw()
134 if (copy_to_user(buf, &val, 4)) in do_io_rw()
135 return -EFAULT; in do_io_rw()
140 u16 val; in do_io_rw() local
143 if (copy_from_user(&val, buf, 2)) in do_io_rw()
144 return -EFAULT; in do_io_rw()
147 val, io + off); in do_io_rw()
152 &val, io + off); in do_io_rw()
156 if (copy_to_user(buf, &val, 2)) in do_io_rw()
157 return -EFAULT; in do_io_rw()
162 u8 val; in do_io_rw() local
165 if (copy_from_user(&val, buf, 1)) in do_io_rw()
166 return -EFAULT; in do_io_rw()
169 val, io + off); in do_io_rw()
174 &val, io + off); in do_io_rw()
178 if (copy_to_user(buf, &val, 1)) in do_io_rw()
179 return -EFAULT; in do_io_rw()
184 /* Fill reads with -1, drop writes */ in do_io_rw()
185 filled = min(count, (size_t)(x_end - off)); in do_io_rw()
187 u8 val = 0xFF; in do_io_rw() local
191 if (copy_to_user(buf + i, &val, 1)) in do_io_rw()
192 return -EFAULT; in do_io_rw()
196 count -= filled; in do_io_rw()
207 struct pci_dev *pdev = vdev->pdev; in vfio_pci_core_setup_barmap()
211 if (vdev->barmap[bar]) in vfio_pci_core_setup_barmap()
221 return -ENOMEM; in vfio_pci_core_setup_barmap()
224 vdev->barmap[bar] = io; in vfio_pci_core_setup_barmap()
233 struct pci_dev *pdev = vdev->pdev; in vfio_pci_bar_rw()
239 struct resource *res = &vdev->pdev->resource[bar]; in vfio_pci_bar_rw()
245 pdev->resource[bar].flags & IORESOURCE_ROM_SHADOW) in vfio_pci_bar_rw()
248 return -EINVAL; in vfio_pci_bar_rw()
251 return -EINVAL; in vfio_pci_bar_rw()
253 count = min(count, (size_t)(end - pos)); in vfio_pci_bar_rw()
257 * The ROM can fill less space than the BAR, so we start the in vfio_pci_bar_rw()
258 * excluded range at the end of the actual ROM. This makes in vfio_pci_bar_rw()
259 * filling large ROM BARs much faster. in vfio_pci_bar_rw()
263 done = -ENOMEM; in vfio_pci_bar_rw()
274 io = vdev->barmap[bar]; in vfio_pci_bar_rw()
277 if (bar == vdev->msix_bar) { in vfio_pci_bar_rw()
278 x_start = vdev->msix_offset; in vfio_pci_bar_rw()
279 x_end = vdev->msix_offset + vdev->msix_size; in vfio_pci_bar_rw()
282 done = do_io_rw(vdev, res->flags & IORESOURCE_MEM, io, buf, pos, in vfio_pci_bar_rw()
305 if (!vdev->has_vga) in vfio_pci_vga_rw()
306 return -EINVAL; in vfio_pci_vga_rw()
309 return -EINVAL; in vfio_pci_vga_rw()
313 count = min(count, (size_t)(0xc0000 - pos)); in vfio_pci_vga_rw()
314 iomem = ioremap(0xa0000, 0xbffff - 0xa0000 + 1); in vfio_pci_vga_rw()
315 off = pos - 0xa0000; in vfio_pci_vga_rw()
320 count = min(count, (size_t)(0x3bc - pos)); in vfio_pci_vga_rw()
321 iomem = ioport_map(0x3b0, 0x3bb - 0x3b0 + 1); in vfio_pci_vga_rw()
322 off = pos - 0x3b0; in vfio_pci_vga_rw()
327 count = min(count, (size_t)(0x3e0 - pos)); in vfio_pci_vga_rw()
328 iomem = ioport_map(0x3c0, 0x3df - 0x3c0 + 1); in vfio_pci_vga_rw()
329 off = pos - 0x3c0; in vfio_pci_vga_rw()
334 return -EINVAL; in vfio_pci_vga_rw()
338 return -ENOMEM; in vfio_pci_vga_rw()
340 ret = vga_get_interruptible(vdev->pdev, rsrc); in vfio_pci_vga_rw()
347 * VGA MMIO is a legacy, non-BAR resource that hopefully allows in vfio_pci_vga_rw()
353 vga_put(vdev->pdev, rsrc); in vfio_pci_vga_rw()
367 switch (ioeventfd->count) { in vfio_pci_ioeventfd_do_write()
369 vfio_pci_core_iowrite8(ioeventfd->vdev, test_mem, in vfio_pci_ioeventfd_do_write()
370 ioeventfd->data, ioeventfd->addr); in vfio_pci_ioeventfd_do_write()
373 vfio_pci_core_iowrite16(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_iowrite32(ioeventfd->vdev, test_mem, in vfio_pci_ioeventfd_do_write()
378 ioeventfd->data, ioeventfd->addr); in vfio_pci_ioeventfd_do_write()
382 vfio_pci_core_iowrite64(ioeventfd->vdev, test_mem, in vfio_pci_ioeventfd_do_write()
383 ioeventfd->data, ioeventfd->addr); in vfio_pci_ioeventfd_do_write()
392 struct vfio_pci_core_device *vdev = ioeventfd->vdev; in vfio_pci_ioeventfd_handler()
394 if (ioeventfd->test_mem) { in vfio_pci_ioeventfd_handler()
395 if (!down_read_trylock(&vdev->memory_lock)) in vfio_pci_ioeventfd_handler()
398 up_read(&vdev->memory_lock); in vfio_pci_ioeventfd_handler()
405 if (ioeventfd->test_mem) in vfio_pci_ioeventfd_handler()
406 up_read(&vdev->memory_lock); in vfio_pci_ioeventfd_handler()
415 vfio_pci_ioeventfd_do_write(ioeventfd, ioeventfd->test_mem); in vfio_pci_ioeventfd_thread()
421 struct pci_dev *pdev = vdev->pdev; in vfio_pci_ioeventfd()
428 return -EINVAL; in vfio_pci_ioeventfd()
431 return -EINVAL; in vfio_pci_ioeventfd()
433 /* Disallow ioeventfds working around MSI-X table writes */ in vfio_pci_ioeventfd()
434 if (bar == vdev->msix_bar && in vfio_pci_ioeventfd()
435 !(pos + count <= vdev->msix_offset || in vfio_pci_ioeventfd()
436 pos >= vdev->msix_offset + vdev->msix_size)) in vfio_pci_ioeventfd()
437 return -EINVAL; in vfio_pci_ioeventfd()
441 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()