Lines Matching refs:domain

28 static void irq_domain_check_hierarchy(struct irq_domain *domain);
48 struct irq_domain *domain; in __irq_domain_add() local
50 domain = kzalloc_node(sizeof(*domain) + (sizeof(unsigned int) * size), in __irq_domain_add()
52 if (WARN_ON(!domain)) in __irq_domain_add()
56 INIT_RADIX_TREE(&domain->revmap_tree, GFP_KERNEL); in __irq_domain_add()
57 domain->ops = ops; in __irq_domain_add()
58 domain->host_data = host_data; in __irq_domain_add()
59 domain->of_node = of_node_get(of_node); in __irq_domain_add()
60 domain->hwirq_max = hwirq_max; in __irq_domain_add()
61 domain->revmap_size = size; in __irq_domain_add()
62 domain->revmap_direct_max_irq = direct_max; in __irq_domain_add()
63 irq_domain_check_hierarchy(domain); in __irq_domain_add()
66 list_add(&domain->link, &irq_domain_list); in __irq_domain_add()
69 pr_debug("Added domain %s\n", domain->name); in __irq_domain_add()
70 return domain; in __irq_domain_add()
82 void irq_domain_remove(struct irq_domain *domain) in irq_domain_remove() argument
91 WARN_ON(domain->revmap_tree.height); in irq_domain_remove()
93 list_del(&domain->link); in irq_domain_remove()
98 if (unlikely(irq_default_domain == domain)) in irq_domain_remove()
103 pr_debug("Removed domain %s\n", domain->name); in irq_domain_remove()
105 of_node_put(domain->of_node); in irq_domain_remove()
106 kfree(domain); in irq_domain_remove()
134 struct irq_domain *domain; in irq_domain_add_simple() local
136 domain = __irq_domain_add(of_node, size, size, 0, ops, host_data); in irq_domain_add_simple()
137 if (!domain) in irq_domain_add_simple()
149 irq_domain_associate_many(domain, first_irq, 0, size); in irq_domain_add_simple()
152 return domain; in irq_domain_add_simple()
178 struct irq_domain *domain; in irq_domain_add_legacy() local
180 domain = __irq_domain_add(of_node, first_hwirq + size, in irq_domain_add_legacy()
182 if (domain) in irq_domain_add_legacy()
183 irq_domain_associate_many(domain, first_irq, first_hwirq, size); in irq_domain_add_legacy()
185 return domain; in irq_domain_add_legacy()
229 void irq_set_default_host(struct irq_domain *domain) in irq_set_default_host() argument
231 pr_debug("Default domain set to @0x%p\n", domain); in irq_set_default_host()
233 irq_default_domain = domain; in irq_set_default_host()
237 void irq_domain_disassociate(struct irq_domain *domain, unsigned int irq) in irq_domain_disassociate() argument
242 if (WARN(!irq_data || irq_data->domain != domain, in irq_domain_disassociate()
256 if (domain->ops->unmap) in irq_domain_disassociate()
257 domain->ops->unmap(domain, irq); in irq_domain_disassociate()
260 irq_data->domain = NULL; in irq_domain_disassociate()
264 if (hwirq < domain->revmap_size) { in irq_domain_disassociate()
265 domain->linear_revmap[hwirq] = 0; in irq_domain_disassociate()
268 radix_tree_delete(&domain->revmap_tree, hwirq); in irq_domain_disassociate()
273 int irq_domain_associate(struct irq_domain *domain, unsigned int virq, in irq_domain_associate() argument
279 if (WARN(hwirq >= domain->hwirq_max, in irq_domain_associate()
280 "error: hwirq 0x%x is too large for %s\n", (int)hwirq, domain->name)) in irq_domain_associate()
284 if (WARN(irq_data->domain, "error: virq%i is already associated", virq)) in irq_domain_associate()
289 irq_data->domain = domain; in irq_domain_associate()
290 if (domain->ops->map) { in irq_domain_associate()
291 ret = domain->ops->map(domain, virq, hwirq); in irq_domain_associate()
300 domain->name, hwirq, virq, ret); in irq_domain_associate()
302 irq_data->domain = NULL; in irq_domain_associate()
309 if (!domain->name && irq_data->chip) in irq_domain_associate()
310 domain->name = irq_data->chip->name; in irq_domain_associate()
313 if (hwirq < domain->revmap_size) { in irq_domain_associate()
314 domain->linear_revmap[hwirq] = virq; in irq_domain_associate()
317 radix_tree_insert(&domain->revmap_tree, hwirq, irq_data); in irq_domain_associate()
328 void irq_domain_associate_many(struct irq_domain *domain, unsigned int irq_base, in irq_domain_associate_many() argument
334 of_node_full_name(domain->of_node), irq_base, (int)hwirq_base, count); in irq_domain_associate_many()
337 irq_domain_associate(domain, irq_base + i, hwirq_base + i); in irq_domain_associate_many()
352 unsigned int irq_create_direct_mapping(struct irq_domain *domain) in irq_create_direct_mapping() argument
356 if (domain == NULL) in irq_create_direct_mapping()
357 domain = irq_default_domain; in irq_create_direct_mapping()
359 virq = irq_alloc_desc_from(1, of_node_to_nid(domain->of_node)); in irq_create_direct_mapping()
364 if (virq >= domain->revmap_direct_max_irq) { in irq_create_direct_mapping()
366 domain->revmap_direct_max_irq); in irq_create_direct_mapping()
372 if (irq_domain_associate(domain, virq, virq)) { in irq_create_direct_mapping()
391 unsigned int irq_create_mapping(struct irq_domain *domain, in irq_create_mapping() argument
396 pr_debug("irq_create_mapping(0x%p, 0x%lx)\n", domain, hwirq); in irq_create_mapping()
399 if (domain == NULL) in irq_create_mapping()
400 domain = irq_default_domain; in irq_create_mapping()
401 if (domain == NULL) { in irq_create_mapping()
405 pr_debug("-> using domain @%p\n", domain); in irq_create_mapping()
408 virq = irq_find_mapping(domain, hwirq); in irq_create_mapping()
416 of_node_to_nid(domain->of_node)); in irq_create_mapping()
422 if (irq_domain_associate(domain, virq, hwirq)) { in irq_create_mapping()
428 hwirq, of_node_full_name(domain->of_node), virq); in irq_create_mapping()
452 int irq_create_strict_mappings(struct irq_domain *domain, unsigned int irq_base, in irq_create_strict_mappings() argument
458 of_node_to_nid(domain->of_node)); in irq_create_strict_mappings()
462 irq_domain_associate_many(domain, irq_base, hwirq_base, count); in irq_create_strict_mappings()
469 struct irq_domain *domain; in irq_create_of_mapping() local
474 domain = irq_data->np ? irq_find_host(irq_data->np) : irq_default_domain; in irq_create_of_mapping()
475 if (!domain) { in irq_create_of_mapping()
482 if (domain->ops->xlate == NULL) in irq_create_of_mapping()
485 if (domain->ops->xlate(domain, irq_data->np, irq_data->args, in irq_create_of_mapping()
490 if (irq_domain_is_hierarchy(domain)) { in irq_create_of_mapping()
495 virq = irq_find_mapping(domain, hwirq); in irq_create_of_mapping()
499 virq = irq_domain_alloc_irqs(domain, 1, NUMA_NO_NODE, irq_data); in irq_create_of_mapping()
504 virq = irq_create_mapping(domain, hwirq); in irq_create_of_mapping()
524 struct irq_domain *domain; in irq_dispose_mapping() local
529 domain = irq_data->domain; in irq_dispose_mapping()
530 if (WARN_ON(domain == NULL)) in irq_dispose_mapping()
533 irq_domain_disassociate(domain, virq); in irq_dispose_mapping()
543 unsigned int irq_find_mapping(struct irq_domain *domain, in irq_find_mapping() argument
549 if (domain == NULL) in irq_find_mapping()
550 domain = irq_default_domain; in irq_find_mapping()
551 if (domain == NULL) in irq_find_mapping()
554 if (hwirq < domain->revmap_direct_max_irq) { in irq_find_mapping()
555 data = irq_domain_get_irq_data(domain, hwirq); in irq_find_mapping()
561 if (hwirq < domain->revmap_size) in irq_find_mapping()
562 return domain->linear_revmap[hwirq]; in irq_find_mapping()
565 data = radix_tree_lookup(&domain->revmap_tree, hwirq); in irq_find_mapping()
576 struct irq_domain *domain; in virq_debug_show() local
584 list_for_each_entry(domain, &irq_domain_list, link) { in virq_debug_show()
586 radix_tree_for_each_slot(slot, &domain->revmap_tree, &iter, 0) in virq_debug_show()
589 domain == irq_default_domain ? '*' : ' ', domain->name, in virq_debug_show()
590 domain->revmap_size + count, domain->revmap_size, in virq_debug_show()
591 domain->revmap_direct_max_irq, in virq_debug_show()
592 domain->of_node ? of_node_full_name(domain->of_node) : ""); in virq_debug_show()
606 domain = desc->irq_data.domain; in virq_debug_show()
608 if (domain) { in virq_debug_show()
623 direct = (i == hwirq) && (i < domain->revmap_direct_max_irq); in virq_debug_show()
625 (hwirq < domain->revmap_size) ? "LINEAR" : "RADIX", in virq_debug_show()
627 seq_printf(m, "%s\n", desc->irq_data.domain->name); in virq_debug_show()
767 struct irq_domain *domain; in irq_domain_add_hierarchy() local
770 domain = irq_domain_add_linear(node, size, ops, host_data); in irq_domain_add_hierarchy()
772 domain = irq_domain_add_tree(node, ops, host_data); in irq_domain_add_hierarchy()
773 if (domain) { in irq_domain_add_hierarchy()
774 domain->parent = parent; in irq_domain_add_hierarchy()
775 domain->flags |= flags; in irq_domain_add_hierarchy()
778 return domain; in irq_domain_add_hierarchy()
786 struct irq_domain *domain = data->domain; in irq_domain_insert_irq() local
789 if (hwirq < domain->revmap_size) { in irq_domain_insert_irq()
790 domain->linear_revmap[hwirq] = virq; in irq_domain_insert_irq()
793 radix_tree_insert(&domain->revmap_tree, hwirq, data); in irq_domain_insert_irq()
798 if (!domain->name && data->chip) in irq_domain_insert_irq()
799 domain->name = data->chip->name; in irq_domain_insert_irq()
815 struct irq_domain *domain = data->domain; in irq_domain_remove_irq() local
818 if (hwirq < domain->revmap_size) { in irq_domain_remove_irq()
819 domain->linear_revmap[hwirq] = 0; in irq_domain_remove_irq()
822 radix_tree_delete(&domain->revmap_tree, hwirq); in irq_domain_remove_irq()
828 static struct irq_data *irq_domain_insert_irq_data(struct irq_domain *domain, in irq_domain_insert_irq_data() argument
838 irq_data->domain = domain; in irq_domain_insert_irq_data()
853 irq_data->domain = NULL; in irq_domain_free_irq_data()
863 static int irq_domain_alloc_irq_data(struct irq_domain *domain, in irq_domain_alloc_irq_data() argument
873 irq_data->domain = domain; in irq_domain_alloc_irq_data()
875 for (parent = domain->parent; parent; parent = parent->parent) { in irq_domain_alloc_irq_data()
892 struct irq_data *irq_domain_get_irq_data(struct irq_domain *domain, in irq_domain_get_irq_data() argument
899 if (irq_data->domain == domain) in irq_domain_get_irq_data()
913 int irq_domain_set_hwirq_and_chip(struct irq_domain *domain, unsigned int virq, in irq_domain_set_hwirq_and_chip() argument
917 struct irq_data *irq_data = irq_domain_get_irq_data(domain, virq); in irq_domain_set_hwirq_and_chip()
940 void irq_domain_set_info(struct irq_domain *domain, unsigned int virq, in irq_domain_set_info() argument
945 irq_domain_set_hwirq_and_chip(domain, virq, hwirq, chip, chip_data); in irq_domain_set_info()
967 void irq_domain_free_irqs_common(struct irq_domain *domain, unsigned int virq, in irq_domain_free_irqs_common() argument
974 irq_data = irq_domain_get_irq_data(domain, virq + i); in irq_domain_free_irqs_common()
978 irq_domain_free_irqs_parent(domain, virq, nr_irqs); in irq_domain_free_irqs_common()
987 void irq_domain_free_irqs_top(struct irq_domain *domain, unsigned int virq, in irq_domain_free_irqs_top() argument
996 irq_domain_free_irqs_common(domain, virq, nr_irqs); in irq_domain_free_irqs_top()
999 static bool irq_domain_is_auto_recursive(struct irq_domain *domain) in irq_domain_is_auto_recursive() argument
1001 return domain->flags & IRQ_DOMAIN_FLAG_AUTO_RECURSIVE; in irq_domain_is_auto_recursive()
1004 static void irq_domain_free_irqs_recursive(struct irq_domain *domain, in irq_domain_free_irqs_recursive() argument
1008 domain->ops->free(domain, irq_base, nr_irqs); in irq_domain_free_irqs_recursive()
1009 if (irq_domain_is_auto_recursive(domain)) { in irq_domain_free_irqs_recursive()
1010 BUG_ON(!domain->parent); in irq_domain_free_irqs_recursive()
1011 irq_domain_free_irqs_recursive(domain->parent, irq_base, in irq_domain_free_irqs_recursive()
1016 static int irq_domain_alloc_irqs_recursive(struct irq_domain *domain, in irq_domain_alloc_irqs_recursive() argument
1021 struct irq_domain *parent = domain->parent; in irq_domain_alloc_irqs_recursive()
1022 bool recursive = irq_domain_is_auto_recursive(domain); in irq_domain_alloc_irqs_recursive()
1029 ret = domain->ops->alloc(domain, irq_base, nr_irqs, arg); in irq_domain_alloc_irqs_recursive()
1057 int __irq_domain_alloc_irqs(struct irq_domain *domain, int irq_base, in __irq_domain_alloc_irqs() argument
1063 if (domain == NULL) { in __irq_domain_alloc_irqs()
1064 domain = irq_default_domain; in __irq_domain_alloc_irqs()
1065 if (WARN(!domain, "domain is NULL; cannot allocate IRQ\n")) in __irq_domain_alloc_irqs()
1069 if (!domain->ops->alloc) { in __irq_domain_alloc_irqs()
1085 if (irq_domain_alloc_irq_data(domain, virq, nr_irqs)) { in __irq_domain_alloc_irqs()
1092 ret = irq_domain_alloc_irqs_recursive(domain, virq, nr_irqs, arg); in __irq_domain_alloc_irqs()
1120 if (WARN(!data || !data->domain || !data->domain->ops->free, in irq_domain_free_irqs()
1127 irq_domain_free_irqs_recursive(data->domain, virq, nr_irqs); in irq_domain_free_irqs()
1143 int irq_domain_alloc_irqs_parent(struct irq_domain *domain, in irq_domain_alloc_irqs_parent() argument
1148 if (irq_domain_is_auto_recursive(domain)) in irq_domain_alloc_irqs_parent()
1151 domain = domain->parent; in irq_domain_alloc_irqs_parent()
1152 if (domain) in irq_domain_alloc_irqs_parent()
1153 return irq_domain_alloc_irqs_recursive(domain, irq_base, in irq_domain_alloc_irqs_parent()
1166 void irq_domain_free_irqs_parent(struct irq_domain *domain, in irq_domain_free_irqs_parent() argument
1170 if (!irq_domain_is_auto_recursive(domain) && domain->parent) in irq_domain_free_irqs_parent()
1171 irq_domain_free_irqs_recursive(domain->parent, irq_base, in irq_domain_free_irqs_parent()
1185 if (irq_data && irq_data->domain) { in irq_domain_activate_irq()
1186 struct irq_domain *domain = irq_data->domain; in irq_domain_activate_irq() local
1190 if (domain->ops->activate) in irq_domain_activate_irq()
1191 domain->ops->activate(domain, irq_data); in irq_domain_activate_irq()
1205 if (irq_data && irq_data->domain) { in irq_domain_deactivate_irq()
1206 struct irq_domain *domain = irq_data->domain; in irq_domain_deactivate_irq() local
1208 if (domain->ops->deactivate) in irq_domain_deactivate_irq()
1209 domain->ops->deactivate(domain, irq_data); in irq_domain_deactivate_irq()
1215 static void irq_domain_check_hierarchy(struct irq_domain *domain) in irq_domain_check_hierarchy() argument
1218 if (domain->ops->alloc) in irq_domain_check_hierarchy()
1219 domain->flags |= IRQ_DOMAIN_FLAG_HIERARCHY; in irq_domain_check_hierarchy()
1227 struct irq_data *irq_domain_get_irq_data(struct irq_domain *domain, in irq_domain_get_irq_data() argument
1232 return (irq_data && irq_data->domain == domain) ? irq_data : NULL; in irq_domain_get_irq_data()
1235 static void irq_domain_check_hierarchy(struct irq_domain *domain) in irq_domain_check_hierarchy() argument