Lines Matching +full:data +full:- +full:size

1 // SPDX-License-Identifier: GPL-2.0
13 #include <linux/virtio-uml.h>
23 /* for MSI-X we have a 32-bit payload */
61 u8 data[8]; member
84 return -EINVAL; in um_pci_send_cmd()
86 switch (cmd->op) { 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()
172 int size) in um_pci_cfgspace_read() argument
175 struct um_pci_device *dev = reg->dev; in um_pci_cfgspace_read()
178 .size = size, in um_pci_cfgspace_read()
181 /* buf->data is maximum size - we may only use parts of it */ in um_pci_cfgspace_read()
183 u8 *data; in um_pci_cfgspace_read() local
190 data = buf->data; in um_pci_cfgspace_read()
192 memset(data, 0xff, sizeof(data)); in um_pci_cfgspace_read()
194 switch (size) { in um_pci_cfgspace_read()
203 WARN(1, "invalid config space read size %d\n", size); in um_pci_cfgspace_read()
207 if (um_pci_send_cmd(dev, &hdr, sizeof(hdr), NULL, 0, data, 8)) in um_pci_cfgspace_read()
210 switch (size) { in um_pci_cfgspace_read()
212 ret = data[0]; in um_pci_cfgspace_read()
215 ret = le16_to_cpup((void *)data); in um_pci_cfgspace_read()
218 ret = le32_to_cpup((void *)data); in um_pci_cfgspace_read()
222 ret = le64_to_cpup((void *)data); in um_pci_cfgspace_read()
234 static void um_pci_cfgspace_write(void *priv, unsigned int offset, int size, in um_pci_cfgspace_write() argument
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()
242 u8 data[8]; in um_pci_cfgspace_write() member
246 .size = size, in um_pci_cfgspace_write()
254 switch (size) { in um_pci_cfgspace_write()
256 msg.data[0] = (u8)val; in um_pci_cfgspace_write()
259 put_unaligned_le16(val, (void *)msg.data); in um_pci_cfgspace_write()
262 put_unaligned_le32(val, (void *)msg.data); in um_pci_cfgspace_write()
266 put_unaligned_le64(val, (void *)msg.data); in um_pci_cfgspace_write()
270 WARN(1, "invalid config space write size %d\n", size); in um_pci_cfgspace_write()
283 unsigned int offset, int size) in um_pci_bar_copy_from() argument
286 struct um_pci_device *dev = container_of(resptr - *resptr, in um_pci_bar_copy_from()
292 .size = size, in um_pci_bar_copy_from()
296 memset(buffer, 0xff, size); in um_pci_bar_copy_from()
298 um_pci_send_cmd(dev, &hdr, sizeof(hdr), NULL, 0, buffer, size); in um_pci_bar_copy_from()
302 int size) in um_pci_bar_read() argument
304 /* buf->data is maximum size - we may only use parts of it */ in um_pci_bar_read()
306 u8 *data; in um_pci_bar_read() local
310 data = buf->data; in um_pci_bar_read()
312 switch (size) { in um_pci_bar_read()
321 WARN(1, "invalid config space read size %d\n", size); in um_pci_bar_read()
325 um_pci_bar_copy_from(priv, data, offset, size); in um_pci_bar_read()
327 switch (size) { in um_pci_bar_read()
329 ret = data[0]; in um_pci_bar_read()
332 ret = le16_to_cpup((void *)data); in um_pci_bar_read()
335 ret = le32_to_cpup((void *)data); in um_pci_bar_read()
339 ret = le64_to_cpup((void *)data); in um_pci_bar_read()
352 const void *buffer, int size) in um_pci_bar_copy_to() argument
355 struct um_pci_device *dev = container_of(resptr - *resptr, in um_pci_bar_copy_to()
361 .size = size, in um_pci_bar_copy_to()
365 um_pci_send_cmd(dev, &hdr, sizeof(hdr), buffer, size, NULL, 0); in um_pci_bar_copy_to()
368 static void um_pci_bar_write(void *priv, unsigned int offset, int size, in um_pci_bar_write() argument
371 /* maximum size - we may only use parts of it */ in um_pci_bar_write()
372 u8 data[8]; in um_pci_bar_write() local
374 switch (size) { in um_pci_bar_write()
376 data[0] = (u8)val; in um_pci_bar_write()
379 put_unaligned_le16(val, (void *)data); in um_pci_bar_write()
382 put_unaligned_le32(val, (void *)data); in um_pci_bar_write()
386 put_unaligned_le64(val, (void *)data); in um_pci_bar_write()
390 WARN(1, "invalid config space write size %d\n", size); in um_pci_bar_write()
394 um_pci_bar_copy_to(priv, offset, data, size); in um_pci_bar_write()
397 static void um_pci_bar_set(void *priv, unsigned int offset, u8 value, int size) in um_pci_bar_set() argument
400 struct um_pci_device *dev = container_of(resptr - *resptr, in um_pci_bar_set()
405 u8 data; in um_pci_bar_set() member
410 .size = size, in um_pci_bar_set()
413 .data = value, 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()
645 .driver.name = "virtio-pci",
654 .start = 0xf0000000 - MAX_DEVICES * CFG_SPACE_SIZE,
655 .end = 0xf0000000 - 1,
659 static long um_pci_map_cfgspace(unsigned long offset, size_t size, in um_pci_map_cfgspace() argument
663 if (WARN_ON(size > CFG_SPACE_SIZE || offset % CFG_SPACE_SIZE)) in um_pci_map_cfgspace()
664 return -EINVAL; in um_pci_map_cfgspace()
672 WARN(1, "cannot map offset 0x%lx/0x%zx\n", offset, size); in um_pci_map_cfgspace()
673 return -ENOENT; in um_pci_map_cfgspace()
689 size_t size; member
697 struct um_pci_map_iomem_data *data = _data; in um_pci_map_iomem_walk() local
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()
733 static long um_pci_map_iomem(unsigned long offset, size_t size, in um_pci_map_iomem() argument
737 struct um_pci_map_iomem_data data = { in um_pci_map_iomem() local
740 .size = size, in um_pci_map_iomem()
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()
747 return data.ret; in um_pci_map_iomem()
754 static void um_pci_compose_msi_msg(struct irq_data *data, struct msi_msg *msg) in um_pci_compose_msi_msg() argument
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()
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()
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()