Lines Matching +full:virtio +full:- +full:pci

1 // SPDX-License-Identifier: GPL-2.0
7 #include <linux/pci.h>
8 #include <linux/virtio.h>
13 #include <linux/virtio-uml.h>
23 /* for MSI-X we have a 32-bit payload */
84 return -EINVAL; in um_pci_send_cmd()
86 switch (cmd->op) { in um_pci_send_cmd()
90 /* in PCI, writes are posted, so don't wait */ in um_pci_send_cmd()
128 /* add to internal virtio queue */ in um_pci_send_cmd()
129 ret = virtqueue_add_sgs(dev->cmd_vq, sgs_list, in um_pci_send_cmd()
138 virtqueue_kick(dev->cmd_vq); in um_pci_send_cmd()
144 set_bit(UM_PCI_STAT_WAITING, &dev->status); in um_pci_send_cmd()
145 virtqueue_kick(dev->cmd_vq); in um_pci_send_cmd()
148 void *completed = virtqueue_get_buf(dev->cmd_vq, &len); in um_pci_send_cmd()
156 if (WARN_ONCE(virtqueue_is_broken(dev->cmd_vq) || in um_pci_send_cmd()
158 "um virt-pci delay: %d", delay_count)) { in um_pci_send_cmd()
159 ret = -EIO; in um_pci_send_cmd()
164 clear_bit(UM_PCI_STAT_WAITING, &dev->status); in um_pci_send_cmd()
175 struct um_pci_device *dev = reg->dev; in um_pci_cfgspace_read()
181 /* buf->data is maximum size - we may only use parts of it */ in um_pci_cfgspace_read()
190 data = buf->data; in um_pci_cfgspace_read()
238 struct um_pci_device *dev = reg->dev; in um_pci_cfgspace_write()
241 /* maximum size - we may only use parts of it */ in um_pci_cfgspace_write()
286 struct um_pci_device *dev = container_of(resptr - *resptr, in um_pci_bar_copy_from()
304 /* buf->data is maximum size - we may only use parts of it */ in um_pci_bar_read()
310 data = buf->data; in um_pci_bar_read()
355 struct um_pci_device *dev = container_of(resptr - *resptr, in um_pci_bar_copy_to()
371 /* maximum size - we may only use parts of it */ in um_pci_bar_write()
400 struct um_pci_device *dev = container_of(resptr - *resptr, in um_pci_bar_set()
431 unsigned int busn = bus->number; in um_pci_map_bus()
447 return (void __iomem *)((unsigned long)dev->iomem + where); in um_pci_map_bus()
459 pci_rescan_bus(bridge->bus); in um_pci_rescan()
477 struct virtio_device *vdev = vq->vdev; in um_pci_handle_irq_message()
478 struct um_pci_device *dev = vdev->priv; in um_pci_handle_irq_message()
482 switch (msg->op) { in um_pci_handle_irq_message()
484 generic_handle_irq(dev->irq); in um_pci_handle_irq_message()
488 if (msg->size == sizeof(u32)) in um_pci_handle_irq_message()
489 generic_handle_irq(le32_to_cpup((void *)msg->data)); in um_pci_handle_irq_message()
491 generic_handle_irq(le16_to_cpup((void *)msg->data)); in um_pci_handle_irq_message()
494 /* nothing to do - we already woke up due to the message */ in um_pci_handle_irq_message()
497 dev_err(&vdev->dev, "unexpected virt-pci message %d\n", msg->op); in um_pci_handle_irq_message()
504 struct virtio_device *vdev = vq->vdev; in um_pci_cmd_vq_cb()
505 struct um_pci_device *dev = vdev->priv; in um_pci_cmd_vq_cb()
509 if (test_bit(UM_PCI_STAT_WAITING, &dev->status)) in um_pci_cmd_vq_cb()
540 err = virtio_find_vqs(dev->vdev, 2, vqs, cbs, names, NULL); in um_pci_init_vqs()
544 dev->cmd_vq = vqs[0]; in um_pci_init_vqs()
545 dev->irq_vq = vqs[1]; in um_pci_init_vqs()
551 um_pci_irq_vq_addbuf(dev->irq_vq, msg, false); in um_pci_init_vqs()
554 virtqueue_kick(dev->irq_vq); in um_pci_init_vqs()
562 int i, free = -1; in um_pci_virtio_probe()
563 int err = -ENOSPC; in um_pci_virtio_probe()
567 return -ENOMEM; in um_pci_virtio_probe()
569 dev->vdev = vdev; in um_pci_virtio_probe()
570 vdev->priv = dev; in um_pci_virtio_probe()
587 dev->irq = irq_alloc_desc(numa_node_id()); in um_pci_virtio_probe()
588 if (dev->irq < 0) { in um_pci_virtio_probe()
589 err = dev->irq; in um_pci_virtio_probe()
593 vdev->priv = dev; in um_pci_virtio_probe()
597 device_set_wakeup_enable(&vdev->dev, true); in um_pci_virtio_probe()
600 * In order to do suspend-resume properly, don't allow VQs in um_pci_virtio_probe()
615 struct um_pci_device *dev = vdev->priv; in um_pci_virtio_remove()
619 vdev->config->reset(vdev); in um_pci_virtio_remove()
620 vdev->config->del_vqs(vdev); in um_pci_virtio_remove()
622 device_set_wakeup_enable(&vdev->dev, false); in um_pci_virtio_remove()
629 irq_free_desc(dev->irq); in um_pci_virtio_remove()
642 MODULE_DEVICE_TABLE(virtio, id_table);
645 .driver.name = "virtio-pci",
653 .name = "PCI config space",
654 .start = 0xf0000000 - MAX_DEVICES * CFG_SPACE_SIZE,
655 .end = 0xf0000000 - 1,
664 return -EINVAL; in um_pci_map_cfgspace()
673 return -ENOENT; in um_pci_map_cfgspace()
681 .name = "PCI iomem",
698 struct um_pci_device_reg *reg = &um_pci_devices[pdev->devfn / 8]; in um_pci_map_iomem_walk()
702 if (!reg->dev) in um_pci_map_iomem_walk()
705 for (i = 0; i < ARRAY_SIZE(dev->resptr); i++) { in um_pci_map_iomem_walk()
706 struct resource *r = &pdev->resource[i]; in um_pci_map_iomem_walk()
708 if ((r->flags & IORESOURCE_TYPE_BITS) != IORESOURCE_MEM) in um_pci_map_iomem_walk()
715 if (data->offset < r->start || data->offset > r->end) in um_pci_map_iomem_walk()
717 if (data->offset + data->size - 1 > r->end) in um_pci_map_iomem_walk()
720 dev = reg->dev; in um_pci_map_iomem_walk()
721 *data->ops = &um_pci_device_bar_ops; in um_pci_map_iomem_walk()
722 dev->resptr[i] = i; in um_pci_map_iomem_walk()
723 *data->priv = &dev->resptr[i]; in um_pci_map_iomem_walk()
724 data->ret = data->offset - r->start; in um_pci_map_iomem_walk()
743 .ret = -ENOENT, in um_pci_map_iomem()
746 pci_walk_bus(bridge->bus, um_pci_map_iomem_walk, &data); in um_pci_map_iomem()
758 * in UML, so we can simply map MSI(-X) vectors to there, it cannot be in um_pci_compose_msi_msg()
764 msg->address_hi = 0; in um_pci_compose_msi_msg()
765 msg->address_lo = 0xa0000; in um_pci_compose_msi_msg()
766 msg->data = data->irq; in um_pci_compose_msi_msg()
770 .name = "UM virtio MSI",
786 return -ENOSPC; in um_pci_inner_domain_alloc()
793 domain->host_data, handle_simple_irq, in um_pci_inner_domain_alloc()
806 if (!test_bit(d->hwirq, um_pci_msi_used)) in um_pci_inner_domain_free()
807 pr_err("trying to free unused MSI#%lu\n", d->hwirq); in um_pci_inner_domain_free()
809 __clear_bit(d->hwirq, um_pci_msi_used); in um_pci_inner_domain_free()
820 .name = "UM virtio PCIe MSI",
833 .name = "PCI busn",
841 struct um_pci_device_reg *reg = &um_pci_devices[pdev->devfn / 8]; in um_pci_map_irq()
843 if (WARN_ON(!reg->dev)) in um_pci_map_irq()
844 return -EINVAL; in um_pci_map_irq()
847 return reg->dev->irq; in um_pci_map_irq()
865 "No virtio device ID configured for PCI - no PCI support\n")) in um_pci_init()
870 return -ENOMEM; in um_pci_init()
874 err = -ENOMEM; in um_pci_init()
878 um_pci_fwnode = irq_domain_alloc_named_fwnode("um-pci"); in um_pci_init()
880 err = -ENOMEM; in um_pci_init()
888 err = -ENOMEM; in um_pci_init()
896 err = -ENOMEM; in um_pci_init()
900 pci_add_resource(&bridge->windows, &virt_iomem_resource); in um_pci_init()
901 pci_add_resource(&bridge->windows, &busn_resource); in um_pci_init()
902 bridge->ops = &um_pci_ops; in um_pci_init()
903 bridge->map_irq = um_pci_map_irq; in um_pci_init()
911 err = -ENOMEM; in um_pci_init()
930 pci_free_resource_list(&bridge->windows); in um_pci_init()
943 pci_free_resource_list(&bridge->windows); in um_pci_exit()