Lines Matching full:domain
28 static int irq_domain_alloc_irqs_locked(struct irq_domain *domain, int irq_base,
31 static void irq_domain_check_hierarchy(struct irq_domain *domain);
53 * identifying an irq domain
56 * @name: Optional user provided domain name
65 * domain struct.
128 struct irq_domain *domain; in __irq_domain_create() local
132 domain = kzalloc_node(sizeof(*domain) + (sizeof(unsigned int) * size), in __irq_domain_create()
134 if (!domain) in __irq_domain_create()
143 domain->fwnode = fwnode; in __irq_domain_create()
144 domain->name = kstrdup(fwid->name, GFP_KERNEL); in __irq_domain_create()
145 if (!domain->name) { in __irq_domain_create()
146 kfree(domain); in __irq_domain_create()
149 domain->flags |= IRQ_DOMAIN_NAME_ALLOCATED; in __irq_domain_create()
152 domain->fwnode = fwnode; in __irq_domain_create()
153 domain->name = fwid->name; in __irq_domain_create()
167 kfree(domain); in __irq_domain_create()
173 domain->name = name; in __irq_domain_create()
174 domain->fwnode = fwnode; in __irq_domain_create()
175 domain->flags |= IRQ_DOMAIN_NAME_ALLOCATED; in __irq_domain_create()
178 if (!domain->name) { in __irq_domain_create()
181 domain->name = kasprintf(GFP_KERNEL, "unknown-%d", in __irq_domain_create()
183 if (!domain->name) { in __irq_domain_create()
184 kfree(domain); in __irq_domain_create()
187 domain->flags |= IRQ_DOMAIN_NAME_ALLOCATED; in __irq_domain_create()
193 INIT_RADIX_TREE(&domain->revmap_tree, GFP_KERNEL); in __irq_domain_create()
194 mutex_init(&domain->revmap_tree_mutex); in __irq_domain_create()
195 domain->ops = ops; in __irq_domain_create()
196 domain->host_data = host_data; in __irq_domain_create()
197 domain->hwirq_max = hwirq_max; in __irq_domain_create()
198 domain->revmap_size = size; in __irq_domain_create()
199 domain->revmap_direct_max_irq = direct_max; in __irq_domain_create()
200 irq_domain_check_hierarchy(domain); in __irq_domain_create()
202 return domain; in __irq_domain_create()
205 static void __irq_domain_publish(struct irq_domain *domain) in __irq_domain_publish() argument
208 debugfs_add_domain_dir(domain); in __irq_domain_publish()
209 list_add(&domain->link, &irq_domain_list); in __irq_domain_publish()
212 pr_debug("Added domain %s\n", domain->name); in __irq_domain_publish()
222 * @ops: domain callbacks
226 * Returns pointer to IRQ domain, or NULL on failure.
233 struct irq_domain *domain; in __irq_domain_add() local
235 domain = __irq_domain_create(fwnode, size, hwirq_max, direct_max, in __irq_domain_add()
237 if (domain) in __irq_domain_add()
238 __irq_domain_publish(domain); in __irq_domain_add()
240 return domain; in __irq_domain_add()
245 * irq_domain_remove() - Remove an irq domain.
246 * @domain: domain to remove
248 * This routine is used to remove an irq domain. The caller must ensure
249 * that all mappings within the domain have been disposed of prior to
252 void irq_domain_remove(struct irq_domain *domain) in irq_domain_remove() argument
255 debugfs_remove_domain_dir(domain); in irq_domain_remove()
257 WARN_ON(!radix_tree_empty(&domain->revmap_tree)); in irq_domain_remove()
259 list_del(&domain->link); in irq_domain_remove()
262 * If the going away domain is the default one, reset it. in irq_domain_remove()
264 if (unlikely(irq_default_domain == domain)) in irq_domain_remove()
269 pr_debug("Removed domain %s\n", domain->name); in irq_domain_remove()
271 fwnode_handle_put(domain->fwnode); in irq_domain_remove()
272 if (domain->flags & IRQ_DOMAIN_NAME_ALLOCATED) in irq_domain_remove()
273 kfree(domain->name); in irq_domain_remove()
274 kfree(domain); in irq_domain_remove()
278 void irq_domain_update_bus_token(struct irq_domain *domain, in irq_domain_update_bus_token() argument
283 if (domain->bus_token == bus_token) in irq_domain_update_bus_token()
288 domain->bus_token = bus_token; in irq_domain_update_bus_token()
290 name = kasprintf(GFP_KERNEL, "%s-%d", domain->name, bus_token); in irq_domain_update_bus_token()
296 debugfs_remove_domain_dir(domain); in irq_domain_update_bus_token()
298 if (domain->flags & IRQ_DOMAIN_NAME_ALLOCATED) in irq_domain_update_bus_token()
299 kfree(domain->name); in irq_domain_update_bus_token()
301 domain->flags |= IRQ_DOMAIN_NAME_ALLOCATED; in irq_domain_update_bus_token()
303 domain->name = name; in irq_domain_update_bus_token()
304 debugfs_add_domain_dir(domain); in irq_domain_update_bus_token()
314 * @first_irq: first number of irq block assigned to the domain,
316 * pre-map all of the irqs in the domain to virqs starting at first_irq.
317 * @ops: domain callbacks
334 struct irq_domain *domain; in irq_domain_add_simple() local
336 domain = __irq_domain_add(of_node_to_fwnode(of_node), size, size, 0, ops, host_data); in irq_domain_add_simple()
337 if (!domain) in irq_domain_add_simple()
349 irq_domain_associate_many(domain, first_irq, 0, size); in irq_domain_add_simple()
352 return domain; in irq_domain_add_simple()
360 * @first_irq: first number of irq block assigned to the domain
364 * @ops: map/unmap domain callbacks
378 struct irq_domain *domain; in irq_domain_add_legacy() local
380 domain = __irq_domain_add(of_node_to_fwnode(of_node), first_hwirq + size, in irq_domain_add_legacy()
382 if (domain) in irq_domain_add_legacy()
383 irq_domain_associate_many(domain, first_irq, first_hwirq, size); in irq_domain_add_legacy()
385 return domain; in irq_domain_add_legacy()
390 * irq_find_matching_fwspec() - Locates a domain for a given fwspec
392 * @bus_token: domain-specific data
406 * bus_token == DOMAIN_BUS_ANY matches any domain, any other in irq_find_matching_fwspec()
407 * values must generate an exact match for the domain to be in irq_find_matching_fwspec()
435 * Return: false if any MSI irq domain does not support IRQ remapping,
436 * true otherwise (including if there is no MSI irq domain)
457 * irq_set_default_host() - Set a "default" irq domain
458 * @domain: default domain pointer
460 * For convenience, it's possible to set a "default" domain that will be used
465 void irq_set_default_host(struct irq_domain *domain) in irq_set_default_host() argument
467 pr_debug("Default domain set to @0x%p\n", domain); in irq_set_default_host()
469 irq_default_domain = domain; in irq_set_default_host()
474 * irq_get_default_host() - Retrieve the "default" irq domain
476 * Returns: the default domain, if any.
487 static void irq_domain_clear_mapping(struct irq_domain *domain, in irq_domain_clear_mapping() argument
490 if (hwirq < domain->revmap_size) { in irq_domain_clear_mapping()
491 domain->linear_revmap[hwirq] = 0; in irq_domain_clear_mapping()
493 mutex_lock(&domain->revmap_tree_mutex); in irq_domain_clear_mapping()
494 radix_tree_delete(&domain->revmap_tree, hwirq); in irq_domain_clear_mapping()
495 mutex_unlock(&domain->revmap_tree_mutex); in irq_domain_clear_mapping()
499 static void irq_domain_set_mapping(struct irq_domain *domain, in irq_domain_set_mapping() argument
503 if (hwirq < domain->revmap_size) { in irq_domain_set_mapping()
504 domain->linear_revmap[hwirq] = irq_data->irq; in irq_domain_set_mapping()
506 mutex_lock(&domain->revmap_tree_mutex); in irq_domain_set_mapping()
507 radix_tree_insert(&domain->revmap_tree, hwirq, irq_data); in irq_domain_set_mapping()
508 mutex_unlock(&domain->revmap_tree_mutex); in irq_domain_set_mapping()
512 void irq_domain_disassociate(struct irq_domain *domain, unsigned int irq) in irq_domain_disassociate() argument
517 if (WARN(!irq_data || irq_data->domain != domain, in irq_domain_disassociate()
534 if (domain->ops->unmap) in irq_domain_disassociate()
535 domain->ops->unmap(domain, irq); in irq_domain_disassociate()
538 irq_data->domain = NULL; in irq_domain_disassociate()
540 domain->mapcount--; in irq_domain_disassociate()
543 irq_domain_clear_mapping(domain, hwirq); in irq_domain_disassociate()
548 static int irq_domain_associate_locked(struct irq_domain *domain, unsigned int virq, in irq_domain_associate_locked() argument
554 if (WARN(hwirq >= domain->hwirq_max, in irq_domain_associate_locked()
555 "error: hwirq 0x%x is too large for %s\n", (int)hwirq, domain->name)) in irq_domain_associate_locked()
559 if (WARN(irq_data->domain, "error: virq%i is already associated", virq)) in irq_domain_associate_locked()
563 irq_data->domain = domain; in irq_domain_associate_locked()
564 if (domain->ops->map) { in irq_domain_associate_locked()
565 ret = domain->ops->map(domain, virq, hwirq); in irq_domain_associate_locked()
574 domain->name, hwirq, virq, ret); in irq_domain_associate_locked()
576 irq_data->domain = NULL; in irq_domain_associate_locked()
581 /* If not already assigned, give the domain the chip's name */ in irq_domain_associate_locked()
582 if (!domain->name && irq_data->chip) in irq_domain_associate_locked()
583 domain->name = irq_data->chip->name; in irq_domain_associate_locked()
586 domain->mapcount++; in irq_domain_associate_locked()
587 irq_domain_set_mapping(domain, hwirq, irq_data); in irq_domain_associate_locked()
594 int irq_domain_associate(struct irq_domain *domain, unsigned int virq, in irq_domain_associate() argument
600 ret = irq_domain_associate_locked(domain, virq, hwirq); in irq_domain_associate()
607 void irq_domain_associate_many(struct irq_domain *domain, unsigned int irq_base, in irq_domain_associate_many() argument
613 of_node = irq_domain_get_of_node(domain); in irq_domain_associate_many()
618 irq_domain_associate(domain, irq_base + i, hwirq_base + i); in irq_domain_associate_many()
625 * @domain: domain to allocate the irq for or NULL for default domain
633 unsigned int irq_create_direct_mapping(struct irq_domain *domain) in irq_create_direct_mapping() argument
638 if (domain == NULL) in irq_create_direct_mapping()
639 domain = irq_default_domain; in irq_create_direct_mapping()
641 of_node = irq_domain_get_of_node(domain); in irq_create_direct_mapping()
647 if (virq >= domain->revmap_direct_max_irq) { in irq_create_direct_mapping()
649 domain->revmap_direct_max_irq); in irq_create_direct_mapping()
655 if (irq_domain_associate(domain, virq, virq)) { in irq_create_direct_mapping()
664 static unsigned int irq_create_mapping_affinity_locked(struct irq_domain *domain, in irq_create_mapping_affinity_locked() argument
668 struct device_node *of_node = irq_domain_get_of_node(domain); in irq_create_mapping_affinity_locked()
671 pr_debug("irq_create_mapping(0x%p, 0x%lx)\n", domain, hwirq); in irq_create_mapping_affinity_locked()
681 if (irq_domain_associate_locked(domain, virq, hwirq)) { in irq_create_mapping_affinity_locked()
686 pr_debug("irq %lu on domain %s mapped to virtual irq %u\n", in irq_create_mapping_affinity_locked()
694 * @domain: domain owning this hardware interrupt or NULL for default domain
695 * @hwirq: hardware irq number in that domain space
703 unsigned int irq_create_mapping_affinity(struct irq_domain *domain, in irq_create_mapping_affinity() argument
709 /* Look for default domain if necessary */ in irq_create_mapping_affinity()
710 if (domain == NULL) in irq_create_mapping_affinity()
711 domain = irq_default_domain; in irq_create_mapping_affinity()
712 if (domain == NULL) { in irq_create_mapping_affinity()
713 WARN(1, "%s(, %lx) called with NULL domain\n", __func__, hwirq); in irq_create_mapping_affinity()
720 virq = irq_find_mapping(domain, hwirq); in irq_create_mapping_affinity()
726 virq = irq_create_mapping_affinity_locked(domain, hwirq, affinity); in irq_create_mapping_affinity()
736 * @domain: domain owning the interrupt range
744 * to insert in to the domain.
747 * domain insertion.
752 int irq_create_strict_mappings(struct irq_domain *domain, unsigned int irq_base, in irq_create_strict_mappings() argument
758 of_node = irq_domain_get_of_node(domain); in irq_create_strict_mappings()
764 irq_domain_associate_many(domain, irq_base, hwirq_base, count); in irq_create_strict_mappings()
782 /* If domain has no translation, then we assume interrupt line */ in irq_domain_translate()
802 struct irq_domain *domain; in irq_create_fwspec_mapping() local
809 domain = irq_find_matching_fwspec(fwspec, DOMAIN_BUS_WIRED); in irq_create_fwspec_mapping()
810 if (!domain) in irq_create_fwspec_mapping()
811 domain = irq_find_matching_fwspec(fwspec, DOMAIN_BUS_ANY); in irq_create_fwspec_mapping()
813 domain = irq_default_domain; in irq_create_fwspec_mapping()
816 if (!domain) { in irq_create_fwspec_mapping()
817 pr_warn("no irq domain found for %s !\n", in irq_create_fwspec_mapping()
822 if (irq_domain_translate(domain, fwspec, &hwirq, &type)) in irq_create_fwspec_mapping()
838 virq = irq_find_mapping(domain, hwirq); in irq_create_fwspec_mapping()
869 if (irq_domain_is_hierarchy(domain)) { in irq_create_fwspec_mapping()
870 virq = irq_domain_alloc_irqs_locked(domain, -1, 1, NUMA_NO_NODE, in irq_create_fwspec_mapping()
878 virq = irq_create_mapping_affinity_locked(domain, hwirq, NULL); in irq_create_fwspec_mapping()
916 struct irq_domain *domain; in irq_dispose_mapping() local
921 domain = irq_data->domain; in irq_dispose_mapping()
922 if (WARN_ON(domain == NULL)) in irq_dispose_mapping()
925 if (irq_domain_is_hierarchy(domain)) { in irq_dispose_mapping()
928 irq_domain_disassociate(domain, virq); in irq_dispose_mapping()
936 * @domain: domain owning this hardware interrupt
937 * @hwirq: hardware irq number in that domain space
939 unsigned int irq_find_mapping(struct irq_domain *domain, in irq_find_mapping() argument
944 /* Look for default domain if necessary */ in irq_find_mapping()
945 if (domain == NULL) in irq_find_mapping()
946 domain = irq_default_domain; in irq_find_mapping()
947 if (domain == NULL) in irq_find_mapping()
950 if (hwirq < domain->revmap_direct_max_irq) { in irq_find_mapping()
951 data = irq_domain_get_irq_data(domain, hwirq); in irq_find_mapping()
957 if (hwirq < domain->revmap_size) in irq_find_mapping()
958 return domain->linear_revmap[hwirq]; in irq_find_mapping()
961 data = radix_tree_lookup(&domain->revmap_tree, hwirq); in irq_find_mapping()
1111 * @parent: Parent irq domain to associate with the new domain
1112 * @flags: Irq domain flags associated to the domain
1113 * @size: Size of the domain. See below
1115 * @ops: Pointer to the interrupt domain callbacks
1118 * If @size is 0 a tree domain is created, otherwise a linear domain.
1120 * If successful the parent is associated to the new domain and the
1121 * domain flags are set.
1122 * Returns pointer to IRQ domain, or NULL on failure.
1131 struct irq_domain *domain; in irq_domain_create_hierarchy() local
1134 domain = __irq_domain_create(fwnode, size, size, 0, ops, host_data); in irq_domain_create_hierarchy()
1136 domain = __irq_domain_create(fwnode, 0, ~0, 0, ops, host_data); in irq_domain_create_hierarchy()
1138 if (domain) { in irq_domain_create_hierarchy()
1139 domain->parent = parent; in irq_domain_create_hierarchy()
1140 domain->flags |= flags; in irq_domain_create_hierarchy()
1142 __irq_domain_publish(domain); in irq_domain_create_hierarchy()
1145 return domain; in irq_domain_create_hierarchy()
1154 struct irq_domain *domain = data->domain; in irq_domain_insert_irq() local
1156 domain->mapcount++; in irq_domain_insert_irq()
1157 irq_domain_set_mapping(domain, data->hwirq, data); in irq_domain_insert_irq()
1159 /* If not already assigned, give the domain the chip's name */ in irq_domain_insert_irq()
1160 if (!domain->name && data->chip) in irq_domain_insert_irq()
1161 domain->name = data->chip->name; in irq_domain_insert_irq()
1177 struct irq_domain *domain = data->domain; in irq_domain_remove_irq() local
1180 domain->mapcount--; in irq_domain_remove_irq()
1181 irq_domain_clear_mapping(domain, hwirq); in irq_domain_remove_irq()
1185 static struct irq_data *irq_domain_insert_irq_data(struct irq_domain *domain, in irq_domain_insert_irq_data() argument
1196 irq_data->domain = domain; in irq_domain_insert_irq_data()
1222 irq_data->domain = NULL; in irq_domain_free_irq_data()
1230 * @domain: IRQ domain from which the hierarchy is to be disconnected
1233 * Marks the @virq level belonging to @domain as disconnected.
1235 * to @domain.
1241 int irq_domain_disconnect_hierarchy(struct irq_domain *domain, in irq_domain_disconnect_hierarchy() argument
1246 irqd = irq_domain_get_irq_data(domain, virq); in irq_domain_disconnect_hierarchy()
1292 virq, tail->parent_data->domain->name); in irq_domain_trim_hierarchy()
1303 static int irq_domain_alloc_irq_data(struct irq_domain *domain, in irq_domain_alloc_irq_data() argument
1313 irq_data->domain = domain; in irq_domain_alloc_irq_data()
1315 for (parent = domain->parent; parent; parent = parent->parent) { in irq_domain_alloc_irq_data()
1328 * irq_domain_get_irq_data - Get irq_data associated with @virq and @domain
1329 * @domain: domain to match
1332 struct irq_data *irq_domain_get_irq_data(struct irq_domain *domain, in irq_domain_get_irq_data() argument
1339 if (irq_data->domain == domain) in irq_domain_get_irq_data()
1347 * irq_domain_set_hwirq_and_chip - Set hwirq and irqchip of @virq at @domain
1348 * @domain: Interrupt domain to match
1354 int irq_domain_set_hwirq_and_chip(struct irq_domain *domain, unsigned int virq, in irq_domain_set_hwirq_and_chip() argument
1358 struct irq_data *irq_data = irq_domain_get_irq_data(domain, virq); in irq_domain_set_hwirq_and_chip()
1372 * irq_domain_set_info - Set the complete data for a @virq in @domain
1373 * @domain: Interrupt domain to match
1382 void irq_domain_set_info(struct irq_domain *domain, unsigned int virq, in irq_domain_set_info() argument
1387 irq_domain_set_hwirq_and_chip(domain, virq, hwirq, chip, chip_data); in irq_domain_set_info()
1395 * @domain: Interrupt domain to match
1399 void irq_domain_free_irqs_common(struct irq_domain *domain, unsigned int virq, in irq_domain_free_irqs_common() argument
1406 irq_data = irq_domain_get_irq_data(domain, virq + i); in irq_domain_free_irqs_common()
1410 irq_domain_free_irqs_parent(domain, virq, nr_irqs); in irq_domain_free_irqs_common()
1416 * @domain: Interrupt domain to match
1420 void irq_domain_free_irqs_top(struct irq_domain *domain, unsigned int virq, in irq_domain_free_irqs_top() argument
1429 irq_domain_free_irqs_common(domain, virq, nr_irqs); in irq_domain_free_irqs_top()
1432 static void irq_domain_free_irqs_hierarchy(struct irq_domain *domain, in irq_domain_free_irqs_hierarchy() argument
1438 if (!domain->ops->free) in irq_domain_free_irqs_hierarchy()
1442 if (irq_domain_get_irq_data(domain, irq_base + i)) in irq_domain_free_irqs_hierarchy()
1443 domain->ops->free(domain, irq_base + i, 1); in irq_domain_free_irqs_hierarchy()
1447 int irq_domain_alloc_irqs_hierarchy(struct irq_domain *domain, in irq_domain_alloc_irqs_hierarchy() argument
1451 if (!domain->ops->alloc) { in irq_domain_alloc_irqs_hierarchy()
1452 pr_debug("domain->ops->alloc() is NULL\n"); in irq_domain_alloc_irqs_hierarchy()
1456 return domain->ops->alloc(domain, irq_base, nr_irqs, arg); in irq_domain_alloc_irqs_hierarchy()
1459 static int irq_domain_alloc_irqs_locked(struct irq_domain *domain, int irq_base, in irq_domain_alloc_irqs_locked() argument
1477 if (irq_domain_alloc_irq_data(domain, virq, nr_irqs)) { in irq_domain_alloc_irqs_locked()
1483 ret = irq_domain_alloc_irqs_hierarchy(domain, virq, nr_irqs, arg); in irq_domain_alloc_irqs_locked()
1506 * __irq_domain_alloc_irqs - Allocate IRQs from domain
1507 * @domain: domain to allocate from
1511 * @arg: domain specific argument
1527 int __irq_domain_alloc_irqs(struct irq_domain *domain, int irq_base, in __irq_domain_alloc_irqs() argument
1533 if (domain == NULL) { in __irq_domain_alloc_irqs()
1534 domain = irq_default_domain; in __irq_domain_alloc_irqs()
1535 if (WARN(!domain, "domain is NULL; cannot allocate IRQ\n")) in __irq_domain_alloc_irqs()
1540 ret = irq_domain_alloc_irqs_locked(domain, irq_base, nr_irqs, node, arg, in __irq_domain_alloc_irqs()
1552 if (d->hwirq < d->domain->revmap_size) in irq_domain_fix_revmap()
1556 mutex_lock(&d->domain->revmap_tree_mutex); in irq_domain_fix_revmap()
1557 slot = radix_tree_lookup_slot(&d->domain->revmap_tree, d->hwirq); in irq_domain_fix_revmap()
1559 radix_tree_replace_slot(&d->domain->revmap_tree, slot, d); in irq_domain_fix_revmap()
1560 mutex_unlock(&d->domain->revmap_tree_mutex); in irq_domain_fix_revmap()
1564 * irq_domain_push_irq() - Push a domain in to the top of a hierarchy.
1565 * @domain: Domain to push.
1566 * @virq: Irq to push the domain in to.
1570 * via a call to pci_enable_msix(), add an additional domain to the
1574 int irq_domain_push_irq(struct irq_domain *domain, int virq, void *arg) in irq_domain_push_irq() argument
1596 if (domain == NULL) in irq_domain_push_irq()
1599 if (WARN_ON(!irq_domain_is_hierarchy(domain))) in irq_domain_push_irq()
1605 if (domain->parent != root_irq_data->domain) in irq_domain_push_irq()
1620 * irq_desc, with values for this domain. in irq_domain_push_irq()
1623 root_irq_data->domain = domain; in irq_domain_push_irq()
1630 rv = irq_domain_alloc_irqs_hierarchy(domain, virq, 1, arg); in irq_domain_push_irq()
1639 irq_domain_set_mapping(domain, root_irq_data->hwirq, root_irq_data); in irq_domain_push_irq()
1649 * irq_domain_pop_irq() - Remove a domain from the top of a hierarchy.
1650 * @domain: Domain to remove.
1651 * @virq: Irq to remove the domain from.
1656 int irq_domain_pop_irq(struct irq_domain *domain, int virq) in irq_domain_pop_irq() argument
1678 if (domain == NULL) in irq_domain_pop_irq()
1684 tmp_irq_data = irq_domain_get_irq_data(domain, virq); in irq_domain_pop_irq()
1686 /* We can only "pop" if this domain is at the top of the list */ in irq_domain_pop_irq()
1690 if (WARN_ON(root_irq_data->domain != domain)) in irq_domain_pop_irq()
1701 irq_domain_clear_mapping(domain, root_irq_data->hwirq); in irq_domain_pop_irq()
1702 irq_domain_free_irqs_hierarchy(domain, virq, 1); in irq_domain_pop_irq()
1727 if (WARN(!data || !data->domain || !data->domain->ops->free, in irq_domain_free_irqs()
1734 irq_domain_free_irqs_hierarchy(data->domain, virq, nr_irqs); in irq_domain_free_irqs()
1742 * irq_domain_alloc_irqs_parent - Allocate interrupts from parent domain
1745 * @arg: Allocation data (arch/domain specific)
1747 * Check whether the domain has been setup recursive. If not allocate
1748 * through the parent domain.
1750 int irq_domain_alloc_irqs_parent(struct irq_domain *domain, in irq_domain_alloc_irqs_parent() argument
1754 if (!domain->parent) in irq_domain_alloc_irqs_parent()
1757 return irq_domain_alloc_irqs_hierarchy(domain->parent, irq_base, in irq_domain_alloc_irqs_parent()
1763 * irq_domain_free_irqs_parent - Free interrupts from parent domain
1767 * Check whether the domain has been setup recursive. If not free
1768 * through the parent domain.
1770 void irq_domain_free_irqs_parent(struct irq_domain *domain, in irq_domain_free_irqs_parent() argument
1773 if (!domain->parent) in irq_domain_free_irqs_parent()
1776 irq_domain_free_irqs_hierarchy(domain->parent, irq_base, nr_irqs); in irq_domain_free_irqs_parent()
1782 if (irq_data && irq_data->domain) { in __irq_domain_deactivate_irq()
1783 struct irq_domain *domain = irq_data->domain; in __irq_domain_deactivate_irq() local
1785 if (domain->ops->deactivate) in __irq_domain_deactivate_irq()
1786 domain->ops->deactivate(domain, irq_data); in __irq_domain_deactivate_irq()
1796 if (irqd && irqd->domain) { in __irq_domain_activate_irq()
1797 struct irq_domain *domain = irqd->domain; in __irq_domain_activate_irq() local
1802 if (!ret && domain->ops->activate) { in __irq_domain_activate_irq()
1803 ret = domain->ops->activate(domain, irqd, reserve); in __irq_domain_activate_irq()
1848 static void irq_domain_check_hierarchy(struct irq_domain *domain) in irq_domain_check_hierarchy() argument
1851 if (domain->ops->alloc) in irq_domain_check_hierarchy()
1852 domain->flags |= IRQ_DOMAIN_FLAG_HIERARCHY; in irq_domain_check_hierarchy()
1856 * irq_domain_hierarchical_is_msi_remap - Check if the domain or any
1858 * @domain: domain pointer
1860 bool irq_domain_hierarchical_is_msi_remap(struct irq_domain *domain) in irq_domain_hierarchical_is_msi_remap() argument
1862 for (; domain; domain = domain->parent) { in irq_domain_hierarchical_is_msi_remap()
1863 if (irq_domain_is_msi_remap(domain)) in irq_domain_hierarchical_is_msi_remap()
1870 * irq_domain_get_irq_data - Get irq_data associated with @virq and @domain
1871 * @domain: domain to match
1874 struct irq_data *irq_domain_get_irq_data(struct irq_domain *domain, in irq_domain_get_irq_data() argument
1879 return (irq_data && irq_data->domain == domain) ? irq_data : NULL; in irq_domain_get_irq_data()
1884 * irq_domain_set_info - Set the complete data for a @virq in @domain
1885 * @domain: Interrupt domain to match
1894 void irq_domain_set_info(struct irq_domain *domain, unsigned int virq, in irq_domain_set_info() argument
1904 static int irq_domain_alloc_irqs_locked(struct irq_domain *domain, int irq_base, in irq_domain_alloc_irqs_locked() argument
1911 static void irq_domain_check_hierarchy(struct irq_domain *domain) in irq_domain_check_hierarchy() argument
1941 /* Default domain? Might be NULL */ in irq_domain_debug_show()