• Home
  • Raw
  • Download

Lines Matching refs: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);
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()
194 INIT_RADIX_TREE(&domain->revmap_tree, GFP_KERNEL); in __irq_domain_create()
195 mutex_init(&domain->revmap_tree_mutex); in __irq_domain_create()
196 domain->ops = ops; in __irq_domain_create()
197 domain->host_data = host_data; in __irq_domain_create()
198 domain->hwirq_max = hwirq_max; in __irq_domain_create()
199 domain->revmap_size = size; in __irq_domain_create()
200 domain->revmap_direct_max_irq = direct_max; in __irq_domain_create()
201 irq_domain_check_hierarchy(domain); in __irq_domain_create()
203 return domain; in __irq_domain_create()
206 static void __irq_domain_publish(struct irq_domain *domain) in __irq_domain_publish() argument
209 debugfs_add_domain_dir(domain); in __irq_domain_publish()
210 list_add(&domain->link, &irq_domain_list); in __irq_domain_publish()
213 pr_debug("Added domain %s\n", domain->name); in __irq_domain_publish()
234 struct irq_domain *domain; in __irq_domain_add() local
236 domain = __irq_domain_create(fwnode, size, hwirq_max, direct_max, in __irq_domain_add()
238 if (domain) in __irq_domain_add()
239 __irq_domain_publish(domain); in __irq_domain_add()
241 return domain; in __irq_domain_add()
253 void irq_domain_remove(struct irq_domain *domain) in irq_domain_remove() argument
256 debugfs_remove_domain_dir(domain); in irq_domain_remove()
258 WARN_ON(!radix_tree_empty(&domain->revmap_tree)); in irq_domain_remove()
260 list_del(&domain->link); in irq_domain_remove()
265 if (unlikely(irq_default_domain == domain)) in irq_domain_remove()
270 pr_debug("Removed domain %s\n", domain->name); in irq_domain_remove()
272 fwnode_dev_initialized(domain->fwnode, false); in irq_domain_remove()
273 fwnode_handle_put(domain->fwnode); in irq_domain_remove()
274 if (domain->flags & IRQ_DOMAIN_NAME_ALLOCATED) in irq_domain_remove()
275 kfree(domain->name); in irq_domain_remove()
276 kfree(domain); in irq_domain_remove()
280 void irq_domain_update_bus_token(struct irq_domain *domain, in irq_domain_update_bus_token() argument
285 if (domain->bus_token == bus_token) in irq_domain_update_bus_token()
290 domain->bus_token = bus_token; in irq_domain_update_bus_token()
292 name = kasprintf(GFP_KERNEL, "%s-%d", domain->name, bus_token); in irq_domain_update_bus_token()
298 debugfs_remove_domain_dir(domain); in irq_domain_update_bus_token()
300 if (domain->flags & IRQ_DOMAIN_NAME_ALLOCATED) in irq_domain_update_bus_token()
301 kfree(domain->name); in irq_domain_update_bus_token()
303 domain->flags |= IRQ_DOMAIN_NAME_ALLOCATED; in irq_domain_update_bus_token()
305 domain->name = name; in irq_domain_update_bus_token()
306 debugfs_add_domain_dir(domain); in irq_domain_update_bus_token()
336 struct irq_domain *domain; in irq_domain_add_simple() local
338 domain = __irq_domain_add(of_node_to_fwnode(of_node), size, size, 0, ops, host_data); in irq_domain_add_simple()
339 if (!domain) in irq_domain_add_simple()
351 irq_domain_associate_many(domain, first_irq, 0, size); in irq_domain_add_simple()
354 return domain; in irq_domain_add_simple()
380 struct irq_domain *domain; in irq_domain_add_legacy() local
382 domain = __irq_domain_add(of_node_to_fwnode(of_node), first_hwirq + size, in irq_domain_add_legacy()
384 if (domain) in irq_domain_add_legacy()
385 irq_domain_associate_many(domain, first_irq, first_hwirq, size); in irq_domain_add_legacy()
387 return domain; in irq_domain_add_legacy()
467 void irq_set_default_host(struct irq_domain *domain) in irq_set_default_host() argument
469 pr_debug("Default domain set to @0x%p\n", domain); in irq_set_default_host()
471 irq_default_domain = domain; in irq_set_default_host()
489 static void irq_domain_clear_mapping(struct irq_domain *domain, in irq_domain_clear_mapping() argument
492 if (hwirq < domain->revmap_size) { in irq_domain_clear_mapping()
493 domain->linear_revmap[hwirq] = 0; in irq_domain_clear_mapping()
495 mutex_lock(&domain->revmap_tree_mutex); in irq_domain_clear_mapping()
496 radix_tree_delete(&domain->revmap_tree, hwirq); in irq_domain_clear_mapping()
497 mutex_unlock(&domain->revmap_tree_mutex); in irq_domain_clear_mapping()
501 static void irq_domain_set_mapping(struct irq_domain *domain, in irq_domain_set_mapping() argument
505 if (hwirq < domain->revmap_size) { in irq_domain_set_mapping()
506 domain->linear_revmap[hwirq] = irq_data->irq; in irq_domain_set_mapping()
508 mutex_lock(&domain->revmap_tree_mutex); in irq_domain_set_mapping()
509 radix_tree_insert(&domain->revmap_tree, hwirq, irq_data); in irq_domain_set_mapping()
510 mutex_unlock(&domain->revmap_tree_mutex); in irq_domain_set_mapping()
514 void irq_domain_disassociate(struct irq_domain *domain, unsigned int irq) in irq_domain_disassociate() argument
519 if (WARN(!irq_data || irq_data->domain != domain, in irq_domain_disassociate()
536 if (domain->ops->unmap) in irq_domain_disassociate()
537 domain->ops->unmap(domain, irq); in irq_domain_disassociate()
540 irq_data->domain = NULL; in irq_domain_disassociate()
542 domain->mapcount--; in irq_domain_disassociate()
545 irq_domain_clear_mapping(domain, hwirq); in irq_domain_disassociate()
550 static int irq_domain_associate_locked(struct irq_domain *domain, unsigned int virq, in irq_domain_associate_locked() argument
556 if (WARN(hwirq >= domain->hwirq_max, in irq_domain_associate_locked()
557 "error: hwirq 0x%x is too large for %s\n", (int)hwirq, domain->name)) in irq_domain_associate_locked()
561 if (WARN(irq_data->domain, "error: virq%i is already associated", virq)) in irq_domain_associate_locked()
565 irq_data->domain = domain; in irq_domain_associate_locked()
566 if (domain->ops->map) { in irq_domain_associate_locked()
567 ret = domain->ops->map(domain, virq, hwirq); in irq_domain_associate_locked()
576 domain->name, hwirq, virq, ret); in irq_domain_associate_locked()
578 irq_data->domain = NULL; in irq_domain_associate_locked()
584 if (!domain->name && irq_data->chip) in irq_domain_associate_locked()
585 domain->name = irq_data->chip->name; in irq_domain_associate_locked()
588 domain->mapcount++; in irq_domain_associate_locked()
589 irq_domain_set_mapping(domain, hwirq, irq_data); in irq_domain_associate_locked()
596 int irq_domain_associate(struct irq_domain *domain, unsigned int virq, in irq_domain_associate() argument
602 ret = irq_domain_associate_locked(domain, virq, hwirq); in irq_domain_associate()
609 void irq_domain_associate_many(struct irq_domain *domain, unsigned int irq_base, in irq_domain_associate_many() argument
615 of_node = irq_domain_get_of_node(domain); in irq_domain_associate_many()
620 irq_domain_associate(domain, irq_base + i, hwirq_base + i); in irq_domain_associate_many()
635 unsigned int irq_create_direct_mapping(struct irq_domain *domain) in irq_create_direct_mapping() argument
640 if (domain == NULL) in irq_create_direct_mapping()
641 domain = irq_default_domain; in irq_create_direct_mapping()
643 of_node = irq_domain_get_of_node(domain); in irq_create_direct_mapping()
649 if (virq >= domain->revmap_direct_max_irq) { in irq_create_direct_mapping()
651 domain->revmap_direct_max_irq); in irq_create_direct_mapping()
657 if (irq_domain_associate(domain, virq, virq)) { in irq_create_direct_mapping()
666 static unsigned int irq_create_mapping_affinity_locked(struct irq_domain *domain, in irq_create_mapping_affinity_locked() argument
670 struct device_node *of_node = irq_domain_get_of_node(domain); in irq_create_mapping_affinity_locked()
673 pr_debug("irq_create_mapping(0x%p, 0x%lx)\n", domain, hwirq); in irq_create_mapping_affinity_locked()
683 if (irq_domain_associate_locked(domain, virq, hwirq)) { in irq_create_mapping_affinity_locked()
705 unsigned int irq_create_mapping_affinity(struct irq_domain *domain, in irq_create_mapping_affinity() argument
712 if (domain == NULL) in irq_create_mapping_affinity()
713 domain = irq_default_domain; in irq_create_mapping_affinity()
714 if (domain == NULL) { in irq_create_mapping_affinity()
722 virq = irq_find_mapping(domain, hwirq); in irq_create_mapping_affinity()
728 virq = irq_create_mapping_affinity_locked(domain, hwirq, affinity); in irq_create_mapping_affinity()
754 int irq_create_strict_mappings(struct irq_domain *domain, unsigned int irq_base, in irq_create_strict_mappings() argument
760 of_node = irq_domain_get_of_node(domain); in irq_create_strict_mappings()
766 irq_domain_associate_many(domain, irq_base, hwirq_base, count); in irq_create_strict_mappings()
804 struct irq_domain *domain; in irq_create_fwspec_mapping() local
811 domain = irq_find_matching_fwspec(fwspec, DOMAIN_BUS_WIRED); in irq_create_fwspec_mapping()
812 if (!domain) in irq_create_fwspec_mapping()
813 domain = irq_find_matching_fwspec(fwspec, DOMAIN_BUS_ANY); in irq_create_fwspec_mapping()
815 domain = irq_default_domain; in irq_create_fwspec_mapping()
818 if (!domain) { in irq_create_fwspec_mapping()
824 if (irq_domain_translate(domain, fwspec, &hwirq, &type)) in irq_create_fwspec_mapping()
840 virq = irq_find_mapping(domain, hwirq); in irq_create_fwspec_mapping()
871 if (irq_domain_is_hierarchy(domain)) { in irq_create_fwspec_mapping()
872 virq = irq_domain_alloc_irqs_locked(domain, -1, 1, NUMA_NO_NODE, in irq_create_fwspec_mapping()
880 virq = irq_create_mapping_affinity_locked(domain, hwirq, NULL); in irq_create_fwspec_mapping()
918 struct irq_domain *domain; in irq_dispose_mapping() local
923 domain = irq_data->domain; in irq_dispose_mapping()
924 if (WARN_ON(domain == NULL)) in irq_dispose_mapping()
927 if (irq_domain_is_hierarchy(domain)) { in irq_dispose_mapping()
930 irq_domain_disassociate(domain, virq); in irq_dispose_mapping()
941 unsigned int irq_find_mapping(struct irq_domain *domain, in irq_find_mapping() argument
947 if (domain == NULL) in irq_find_mapping()
948 domain = irq_default_domain; in irq_find_mapping()
949 if (domain == NULL) in irq_find_mapping()
952 if (hwirq < domain->revmap_direct_max_irq) { in irq_find_mapping()
953 data = irq_domain_get_irq_data(domain, hwirq); in irq_find_mapping()
959 if (hwirq < domain->revmap_size) in irq_find_mapping()
960 return domain->linear_revmap[hwirq]; in irq_find_mapping()
963 data = radix_tree_lookup(&domain->revmap_tree, hwirq); in irq_find_mapping()
1133 struct irq_domain *domain; in irq_domain_create_hierarchy() local
1136 domain = __irq_domain_create(fwnode, size, size, 0, ops, host_data); in irq_domain_create_hierarchy()
1138 domain = __irq_domain_create(fwnode, 0, ~0, 0, ops, host_data); in irq_domain_create_hierarchy()
1140 if (domain) { in irq_domain_create_hierarchy()
1141 domain->parent = parent; in irq_domain_create_hierarchy()
1142 domain->flags |= flags; in irq_domain_create_hierarchy()
1144 __irq_domain_publish(domain); in irq_domain_create_hierarchy()
1147 return domain; in irq_domain_create_hierarchy()
1156 struct irq_domain *domain = data->domain; in irq_domain_insert_irq() local
1158 domain->mapcount++; in irq_domain_insert_irq()
1159 irq_domain_set_mapping(domain, data->hwirq, data); in irq_domain_insert_irq()
1162 if (!domain->name && data->chip) in irq_domain_insert_irq()
1163 domain->name = data->chip->name; in irq_domain_insert_irq()
1179 struct irq_domain *domain = data->domain; in irq_domain_remove_irq() local
1182 domain->mapcount--; in irq_domain_remove_irq()
1183 irq_domain_clear_mapping(domain, hwirq); in irq_domain_remove_irq()
1187 static struct irq_data *irq_domain_insert_irq_data(struct irq_domain *domain, in irq_domain_insert_irq_data() argument
1198 irq_data->domain = domain; in irq_domain_insert_irq_data()
1224 irq_data->domain = NULL; in irq_domain_free_irq_data()
1243 int irq_domain_disconnect_hierarchy(struct irq_domain *domain, in irq_domain_disconnect_hierarchy() argument
1248 irqd = irq_domain_get_irq_data(domain, virq); in irq_domain_disconnect_hierarchy()
1295 virq, tail->parent_data->domain->name); in irq_domain_trim_hierarchy()
1306 static int irq_domain_alloc_irq_data(struct irq_domain *domain, in irq_domain_alloc_irq_data() argument
1316 irq_data->domain = domain; in irq_domain_alloc_irq_data()
1318 for (parent = domain->parent; parent; parent = parent->parent) { in irq_domain_alloc_irq_data()
1335 struct irq_data *irq_domain_get_irq_data(struct irq_domain *domain, in irq_domain_get_irq_data() argument
1342 if (irq_data->domain == domain) in irq_domain_get_irq_data()
1357 int irq_domain_set_hwirq_and_chip(struct irq_domain *domain, unsigned int virq, in irq_domain_set_hwirq_and_chip() argument
1361 struct irq_data *irq_data = irq_domain_get_irq_data(domain, virq); in irq_domain_set_hwirq_and_chip()
1385 void irq_domain_set_info(struct irq_domain *domain, unsigned int virq, in irq_domain_set_info() argument
1390 irq_domain_set_hwirq_and_chip(domain, virq, hwirq, chip, chip_data); in irq_domain_set_info()
1402 void irq_domain_free_irqs_common(struct irq_domain *domain, unsigned int virq, in irq_domain_free_irqs_common() argument
1409 irq_data = irq_domain_get_irq_data(domain, virq + i); in irq_domain_free_irqs_common()
1413 irq_domain_free_irqs_parent(domain, virq, nr_irqs); in irq_domain_free_irqs_common()
1423 void irq_domain_free_irqs_top(struct irq_domain *domain, unsigned int virq, in irq_domain_free_irqs_top() argument
1432 irq_domain_free_irqs_common(domain, virq, nr_irqs); in irq_domain_free_irqs_top()
1435 static void irq_domain_free_irqs_hierarchy(struct irq_domain *domain, in irq_domain_free_irqs_hierarchy() argument
1441 if (!domain->ops->free) in irq_domain_free_irqs_hierarchy()
1445 if (irq_domain_get_irq_data(domain, irq_base + i)) in irq_domain_free_irqs_hierarchy()
1446 domain->ops->free(domain, irq_base + i, 1); in irq_domain_free_irqs_hierarchy()
1450 int irq_domain_alloc_irqs_hierarchy(struct irq_domain *domain, in irq_domain_alloc_irqs_hierarchy() argument
1454 if (!domain->ops->alloc) { in irq_domain_alloc_irqs_hierarchy()
1459 return domain->ops->alloc(domain, irq_base, nr_irqs, arg); in irq_domain_alloc_irqs_hierarchy()
1462 static int irq_domain_alloc_irqs_locked(struct irq_domain *domain, int irq_base, in irq_domain_alloc_irqs_locked() argument
1480 if (irq_domain_alloc_irq_data(domain, virq, nr_irqs)) { in irq_domain_alloc_irqs_locked()
1486 ret = irq_domain_alloc_irqs_hierarchy(domain, virq, nr_irqs, arg); in irq_domain_alloc_irqs_locked()
1530 int __irq_domain_alloc_irqs(struct irq_domain *domain, int irq_base, in __irq_domain_alloc_irqs() argument
1536 if (domain == NULL) { in __irq_domain_alloc_irqs()
1537 domain = irq_default_domain; in __irq_domain_alloc_irqs()
1538 if (WARN(!domain, "domain is NULL; cannot allocate IRQ\n")) in __irq_domain_alloc_irqs()
1543 ret = irq_domain_alloc_irqs_locked(domain, irq_base, nr_irqs, node, arg, in __irq_domain_alloc_irqs()
1555 if (d->hwirq < d->domain->revmap_size) in irq_domain_fix_revmap()
1559 mutex_lock(&d->domain->revmap_tree_mutex); in irq_domain_fix_revmap()
1560 slot = radix_tree_lookup_slot(&d->domain->revmap_tree, d->hwirq); in irq_domain_fix_revmap()
1562 radix_tree_replace_slot(&d->domain->revmap_tree, slot, d); in irq_domain_fix_revmap()
1563 mutex_unlock(&d->domain->revmap_tree_mutex); in irq_domain_fix_revmap()
1577 int irq_domain_push_irq(struct irq_domain *domain, int virq, void *arg) in irq_domain_push_irq() argument
1599 if (domain == NULL) in irq_domain_push_irq()
1602 if (WARN_ON(!irq_domain_is_hierarchy(domain))) in irq_domain_push_irq()
1608 if (domain->parent != root_irq_data->domain) in irq_domain_push_irq()
1626 root_irq_data->domain = domain; in irq_domain_push_irq()
1633 rv = irq_domain_alloc_irqs_hierarchy(domain, virq, 1, arg); in irq_domain_push_irq()
1642 irq_domain_set_mapping(domain, root_irq_data->hwirq, root_irq_data); in irq_domain_push_irq()
1659 int irq_domain_pop_irq(struct irq_domain *domain, int virq) in irq_domain_pop_irq() argument
1681 if (domain == NULL) in irq_domain_pop_irq()
1687 tmp_irq_data = irq_domain_get_irq_data(domain, virq); in irq_domain_pop_irq()
1693 if (WARN_ON(root_irq_data->domain != domain)) in irq_domain_pop_irq()
1704 irq_domain_clear_mapping(domain, root_irq_data->hwirq); in irq_domain_pop_irq()
1705 irq_domain_free_irqs_hierarchy(domain, virq, 1); in irq_domain_pop_irq()
1730 if (WARN(!data || !data->domain || !data->domain->ops->free, in irq_domain_free_irqs()
1737 irq_domain_free_irqs_hierarchy(data->domain, virq, nr_irqs); in irq_domain_free_irqs()
1753 int irq_domain_alloc_irqs_parent(struct irq_domain *domain, in irq_domain_alloc_irqs_parent() argument
1757 if (!domain->parent) in irq_domain_alloc_irqs_parent()
1760 return irq_domain_alloc_irqs_hierarchy(domain->parent, irq_base, in irq_domain_alloc_irqs_parent()
1773 void irq_domain_free_irqs_parent(struct irq_domain *domain, in irq_domain_free_irqs_parent() argument
1776 if (!domain->parent) in irq_domain_free_irqs_parent()
1779 irq_domain_free_irqs_hierarchy(domain->parent, irq_base, nr_irqs); in irq_domain_free_irqs_parent()
1785 if (irq_data && irq_data->domain) { in __irq_domain_deactivate_irq()
1786 struct irq_domain *domain = irq_data->domain; in __irq_domain_deactivate_irq() local
1788 if (domain->ops->deactivate) in __irq_domain_deactivate_irq()
1789 domain->ops->deactivate(domain, irq_data); in __irq_domain_deactivate_irq()
1799 if (irqd && irqd->domain) { in __irq_domain_activate_irq()
1800 struct irq_domain *domain = irqd->domain; in __irq_domain_activate_irq() local
1805 if (!ret && domain->ops->activate) { in __irq_domain_activate_irq()
1806 ret = domain->ops->activate(domain, irqd, reserve); in __irq_domain_activate_irq()
1851 static void irq_domain_check_hierarchy(struct irq_domain *domain) in irq_domain_check_hierarchy() argument
1854 if (domain->ops->alloc) in irq_domain_check_hierarchy()
1855 domain->flags |= IRQ_DOMAIN_FLAG_HIERARCHY; in irq_domain_check_hierarchy()
1863 bool irq_domain_hierarchical_is_msi_remap(struct irq_domain *domain) in irq_domain_hierarchical_is_msi_remap() argument
1865 for (; domain; domain = domain->parent) { in irq_domain_hierarchical_is_msi_remap()
1866 if (irq_domain_is_msi_remap(domain)) in irq_domain_hierarchical_is_msi_remap()
1877 struct irq_data *irq_domain_get_irq_data(struct irq_domain *domain, in irq_domain_get_irq_data() argument
1882 return (irq_data && irq_data->domain == domain) ? irq_data : NULL; in irq_domain_get_irq_data()
1897 void irq_domain_set_info(struct irq_domain *domain, unsigned int virq, in irq_domain_set_info() argument
1907 static int irq_domain_alloc_irqs_locked(struct irq_domain *domain, int irq_base, in irq_domain_alloc_irqs_locked() argument
1914 static void irq_domain_check_hierarchy(struct irq_domain *domain) in irq_domain_check_hierarchy() argument