static int __init its_pci_msi_init(void) { struct device_node *np; struct irq_domain *parent; for (np = of_find_matching_node(NULL, its_device_id); np; np = of_find_matching_node(np, its_device_id)) { if (!of_property_read_bool(np, "msi-controller")) continue; parent = irq_find_matching_host(np, DOMAIN_BUS_NEXUS); if (!parent || !msi_get_domain_info(parent)) { pr_err("%s: unable to locate ITS domain\n", np->full_name); continue; } if (!pci_msi_create_irq_domain(np, &its_pci_msi_domain_info, parent)) { pr_err("%s: unable to create PCI domain\n", np->full_name); continue; } pr_info("PCI/MSI: %s domain created\n", np->full_name); } return 0; }
static int __init its_fsl_mc_msi_init(void) { struct device_node *np; struct irq_domain *parent; struct irq_domain *mc_msi_domain; for (np = of_find_matching_node(NULL, its_device_id); np; np = of_find_matching_node(np, its_device_id)) { if (!of_device_is_available(np)) continue; if (!of_property_read_bool(np, "msi-controller")) continue; parent = irq_find_matching_host(np, DOMAIN_BUS_NEXUS); if (!parent || !msi_get_domain_info(parent)) { pr_err("%pOF: unable to locate ITS domain\n", np); continue; } mc_msi_domain = fsl_mc_msi_create_irq_domain( of_node_to_fwnode(np), &its_fsl_mc_msi_domain_info, parent); if (!mc_msi_domain) { pr_err("%pOF: unable to create fsl-mc domain\n", np); continue; } pr_info("fsl-mc MSI: %pOF domain created\n", np); } return 0; }
struct irq_domain *pci_host_bridge_of_msi_domain(struct pci_bus *bus) { #ifdef CONFIG_IRQ_DOMAIN struct irq_domain *d; if (!bus->dev.of_node) return NULL; /* Start looking for a phandle to an MSI controller. */ d = of_msi_get_domain(&bus->dev, bus->dev.of_node, DOMAIN_BUS_PCI_MSI); if (d) return d; /* * If we don't have an msi-parent property, look for a domain * directly attached to the host bridge. */ d = irq_find_matching_host(bus->dev.of_node, DOMAIN_BUS_PCI_MSI); if (d) return d; return irq_find_host(bus->dev.of_node); #else return NULL; #endif }
void its_fsl_mc_msi_cleanup(void) { struct device_node *np; for (np = of_find_matching_node(NULL, its_device_id); np; np = of_find_matching_node(np, its_device_id)) { struct irq_domain *mc_msi_domain = irq_find_matching_host( np, DOMAIN_BUS_FSL_MC_MSI); if (!of_property_read_bool(np, "msi-controller")) continue; if (mc_msi_domain && mc_msi_domain->host_data == &its_fsl_mc_msi_domain_info) irq_domain_remove(mc_msi_domain); } }