#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>
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;
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)
#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>
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;