Commit db744aaa authored by Tomasz Nowicki's avatar Tomasz Nowicki Committed by Marc Zyngier

irqchip/gicv3-its: Factor out PCI-MSI part that might be reused for ACPI

Firmware agnostic code lands in common functions which do necessary
domain initialization based on unique domain handler. DT specific
code goes to DT specific init call.
Signed-off-by: default avatarTomasz Nowicki <tn@semihalf.com>
Acked-by: default avatarMarc Zyngier <marc.zyngier@arm.com>
Signed-off-by: default avatarMarc Zyngier <marc.zyngier@arm.com>
parent 3f010cf1
...@@ -106,34 +106,48 @@ static struct of_device_id its_device_id[] = { ...@@ -106,34 +106,48 @@ static struct of_device_id its_device_id[] = {
{}, {},
}; };
static int __init its_pci_msi_init(void) static int __init its_pci_msi_init_one(struct fwnode_handle *handle,
const char *name)
{ {
struct device_node *np;
struct irq_domain *parent; 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;
}
static int __init its_pci_of_msi_init(void)
{
struct device_node *np;
for (np = of_find_matching_node(NULL, its_device_id); np; for (np = of_find_matching_node(NULL, its_device_id); np;
np = of_find_matching_node(np, its_device_id)) { np = of_find_matching_node(np, its_device_id)) {
if (!of_property_read_bool(np, "msi-controller")) if (!of_property_read_bool(np, "msi-controller"))
continue; continue;
parent = irq_find_matching_host(np, DOMAIN_BUS_NEXUS); if (its_pci_msi_init_one(of_node_to_fwnode(np), np->full_name))
if (!parent || !msi_get_domain_info(parent)) {
pr_err("%s: unable to locate ITS domain\n",
np->full_name);
continue; continue;
}
if (!pci_msi_create_irq_domain(of_node_to_fwnode(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); pr_info("PCI/MSI: %s domain created\n", np->full_name);
} }
return 0; return 0;
} }
static int __init its_pci_msi_init(void)
{
its_pci_of_msi_init();
return 0;
}
early_initcall(its_pci_msi_init); early_initcall(its_pci_msi_init);
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment