]> xenbits.xensource.com Git - unikraft/unikraft.git/commitdiff
drivers/virtio: Update virtio to use the new uk_intctlr API
authorMichalis Pappas <michalis@unikraft.io>
Fri, 15 Sep 2023 16:43:43 +0000 (18:43 +0200)
committerRazvan Deaconescu <razvand@unikraft.io>
Fri, 20 Oct 2023 16:35:55 +0000 (19:35 +0300)
Notice: Picking individual commits in this PR will break the build.

Signed-off-by: Michalis Pappas <michalis@unikraft.io>
Reviewed-by: Marco Schlumpp <marco@unikraft.io>
Reviewed-by: Sergiu Moga <sergiu@unikraft.io>
Approved-by: Razvan Deaconescu <razvand@unikraft.io>
GitHub-Closes: #1103

drivers/virtio/mmio/virtio_mmio.c
drivers/virtio/pci/virtio_pci.c
lib/uk9p/include/uk/9pdev.h

index 61cfc0b30ef0ce1dad7d37408b08c7d7db0b1be7..d1f99b6754a6c6ad195186118747d582ec681705 100644 (file)
@@ -37,7 +37,7 @@
 #include <uk/alloc.h>
 #include <uk/print.h>
 #include <uk/plat/lcpu.h>
-#include <uk/plat/irq.h>
+#include <uk/intctlr.h>
 #include <uk/bus.h>
 #include <uk/bitops.h>
 #include <uk/ofw/fdt.h>
@@ -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, &reg_base, &reg_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, &reg_base, &reg_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)
index 0403af6ef2c0de83e94d71558866cd87d1dcde65..ed0aad15e493db2d9c372554663e9480756dca72 100644 (file)
@@ -36,7 +36,7 @@
 #include <uk/alloc.h>
 #include <uk/print.h>
 #include <uk/plat/lcpu.h>
-#include <uk/plat/irq.h>
+#include <uk/intctlr.h>
 #include <uk/bus/pci.h>
 #include <virtio/virtio_config.h>
 #include <virtio/virtio_bus.h>
@@ -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;
index 75be3518f78ee81f800d3535cea1b2be9322a898..7b3ff47f4fbcf14a0f1bf19ec4959d326609240e 100644 (file)
@@ -40,7 +40,6 @@
 #include <uk/assert.h>
 #include <uk/essentials.h>
 #include <uk/9pdev_core.h>
-#include <uk/plat/irq.h>
 
 #ifdef __cplusplus
 extern "C" {