From ed212af1e90e511cc065bae7db6eaaf6380fe02d Mon Sep 17 00:00:00 2001 From: Michalis Pappas Date: Fri, 15 Sep 2023 18:43:43 +0200 Subject: [PATCH] drivers/virtio: Update virtio to use the new uk_intctlr API Notice: Picking individual commits in this PR will break the build. Signed-off-by: Michalis Pappas Reviewed-by: Marco Schlumpp Reviewed-by: Sergiu Moga Approved-by: Razvan Deaconescu GitHub-Closes: #1103 --- drivers/virtio/mmio/virtio_mmio.c | 51 +++++++++++++------------------ drivers/virtio/pci/virtio_pci.c | 5 +-- lib/uk9p/include/uk/9pdev.h | 1 - 3 files changed, 25 insertions(+), 32 deletions(-) diff --git a/drivers/virtio/mmio/virtio_mmio.c b/drivers/virtio/mmio/virtio_mmio.c index 61cfc0b30..d1f99b675 100644 --- a/drivers/virtio/mmio/virtio_mmio.c +++ b/drivers/virtio/mmio/virtio_mmio.c @@ -37,7 +37,7 @@ #include #include #include -#include +#include #include #include #include @@ -373,7 +373,7 @@ static int vm_find_vqs(struct virtio_dev *vdev, __u16 num_vqs, __u16 *qdesc_size int i, err; int vq_cnt = 0; - err = ukplat_irq_register(irq, vm_interrupt, vm_dev); + err = uk_intctlr_irq_register(irq, vm_interrupt, vm_dev); if (err) return err; @@ -419,45 +419,38 @@ static struct virtio_config_ops virtio_mmio_config_ops = { static int virtio_mmio_probe(struct pf_device *pfdev) { + int rc; const fdt32_t *prop; - int type, hwirq, prop_len; - int fdt_vm = pfdev->fdt_offset; - __u64 reg_base; - __u64 reg_size; + int prop_len, offs; + __u64 reg_base, reg_size; void *dtb; + struct uk_intctlr_irq irq; dtb = (void *)ukplat_bootinfo_get()->dtb; - if (fdt_vm == -FDT_ERR_NOTFOUND) { - uk_pr_info("device not found in fdt\n"); - goto error_exit; - } else { - prop = fdt_getprop(dtb, fdt_vm, "interrupts", &prop_len); - if (!prop) { - uk_pr_err("irq of device not found in fdt\n"); - goto error_exit; - } + offs = pfdev->fdt_offset; - type = fdt32_to_cpu(prop[0]); - hwirq = fdt32_to_cpu(prop[1]); + if (unlikely(offs < 0)) + return -EINVAL; - prop = fdt_getprop(dtb, fdt_vm, "reg", &prop_len); - if (!prop) { - uk_pr_err("reg of device not found in fdt\n"); - goto error_exit; - } + rc = uk_intctlr_irq_fdt_xlat(dtb, offs, 0, &irq); + if (unlikely(rc < 0)) + return -EINVAL; - /* only care about base addr, ignore the size */ - fdt_get_address(dtb, fdt_vm, 0, ®_base, ®_size); - } + uk_intctlr_irq_configure(&irq); + + prop = fdt_getprop(dtb, offs, "reg", &prop_len); + if (unlikely(!prop)) + return -EINVAL; + + /* only care about base addr, ignore the size */ + fdt_get_address(dtb, offs, 0, ®_base, ®_size); pfdev->base = reg_base; - pfdev->irq = gic_irq_translate(type, hwirq); + pfdev->irq = irq.id; + uk_pr_info("virtio mmio probe base(0x%lx) irq(%ld)\n", pfdev->base, pfdev->irq); return 0; - -error_exit: - return -EFAULT; } static int virtio_mmio_add_dev(struct pf_device *pfdev) diff --git a/drivers/virtio/pci/virtio_pci.c b/drivers/virtio/pci/virtio_pci.c index 0403af6ef..ed0aad15e 100644 --- a/drivers/virtio/pci/virtio_pci.c +++ b/drivers/virtio/pci/virtio_pci.c @@ -36,7 +36,7 @@ #include #include #include -#include +#include #include #include #include @@ -220,7 +220,8 @@ static int vpci_legacy_pci_vq_find(struct virtio_dev *vdev, __u16 num_vqs, vpdev = to_virtiopcidev(vdev); /* Registering the interrupt for the queue */ - rc = ukplat_irq_register(vpdev->pdev->irq, virtio_pci_handle, vpdev); + rc = uk_intctlr_irq_register(vpdev->pdev->irq, virtio_pci_handle, + vpdev); if (rc != 0) { uk_pr_err("Failed to register the interrupt\n"); return rc; diff --git a/lib/uk9p/include/uk/9pdev.h b/lib/uk9p/include/uk/9pdev.h index 75be3518f..7b3ff47f4 100644 --- a/lib/uk9p/include/uk/9pdev.h +++ b/lib/uk9p/include/uk/9pdev.h @@ -40,7 +40,6 @@ #include #include #include -#include #ifdef __cplusplus extern "C" { -- 2.39.5