/** * acpi_irq_get - Lookup an ACPI IRQ resource and use it to initialize resource. * @handle: ACPI device handle * @index: ACPI IRQ resource index to lookup * @res: Linux IRQ resource to initialize * * Description: * Look for the ACPI IRQ resource with the given index and use it to initialize * the given Linux IRQ resource. * * Return: * 0 on success * -EINVAL if an error occurs * -EPROBE_DEFER if the IRQ lookup/conversion failed */ int acpi_irq_get(acpi_handle handle, unsigned int index, struct resource *res) { struct irq_fwspec fwspec; struct irq_domain *domain; unsigned long flags; int rc; rc = acpi_irq_parse_one(handle, index, &fwspec, &flags); if (rc) return rc; domain = irq_find_matching_fwnode(fwspec.fwnode, DOMAIN_BUS_ANY); if (!domain) return -EPROBE_DEFER; rc = irq_create_fwspec_mapping(&fwspec); if (rc <= 0) return -EINVAL; res->start = rc; res->end = rc; res->flags = flags; return 0; }
/** * acpi_unregister_gsi() - Free a GSI<->linux IRQ number mapping * @gsi: GSI IRQ number */ void acpi_unregister_gsi(u32 gsi) { struct irq_domain *d = irq_find_matching_fwnode(acpi_gsi_domain_id, DOMAIN_BUS_ANY); int irq = irq_find_mapping(d, gsi); irq_dispose_mapping(irq); }
/** * acpi_gsi_to_irq() - Retrieve the linux irq number for a given GSI * @gsi: GSI IRQ number to map * @irq: pointer where linux IRQ number is stored * * irq location updated with irq value [>0 on success, 0 on failure] * * Returns: 0 on success * -EINVAL on failure */ int acpi_gsi_to_irq(u32 gsi, unsigned int *irq) { struct irq_domain *d = irq_find_matching_fwnode(acpi_gsi_domain_id, DOMAIN_BUS_ANY); *irq = irq_find_mapping(d, gsi); /* * *irq == 0 means no mapping, that should * be reported as a failure */ return (*irq > 0) ? 0 : -EINVAL; }
static int __init its_pci_msi_init_one(struct fwnode_handle *handle, const char *name) { struct irq_domain *parent; parent = irq_find_matching_fwnode(handle, DOMAIN_BUS_NEXUS); if (!parent || !msi_get_domain_info(parent)) { pr_err("%s: Unable to locate ITS domain\n", name); return -ENXIO; } if (!pci_msi_create_irq_domain(handle, &its_pci_msi_domain_info, parent)) { pr_err("%s: Unable to create PCI domain\n", name); return -ENOMEM; } return 0; }