Lines Matching refs:domain
28 static void irq_domain_check_hierarchy(struct irq_domain *domain);
99 struct irq_domain *domain; in __irq_domain_add() local
104 domain = kzalloc_node(sizeof(*domain) + (sizeof(unsigned int) * size), in __irq_domain_add()
106 if (WARN_ON(!domain)) in __irq_domain_add()
112 INIT_RADIX_TREE(&domain->revmap_tree, GFP_KERNEL); in __irq_domain_add()
113 domain->ops = ops; in __irq_domain_add()
114 domain->host_data = host_data; in __irq_domain_add()
115 domain->fwnode = fwnode; in __irq_domain_add()
116 domain->hwirq_max = hwirq_max; in __irq_domain_add()
117 domain->revmap_size = size; in __irq_domain_add()
118 domain->revmap_direct_max_irq = direct_max; in __irq_domain_add()
119 irq_domain_check_hierarchy(domain); in __irq_domain_add()
122 list_add(&domain->link, &irq_domain_list); in __irq_domain_add()
125 pr_debug("Added domain %s\n", domain->name); in __irq_domain_add()
126 return domain; in __irq_domain_add()
138 void irq_domain_remove(struct irq_domain *domain) in irq_domain_remove() argument
147 WARN_ON(domain->revmap_tree.height); in irq_domain_remove()
149 list_del(&domain->link); in irq_domain_remove()
154 if (unlikely(irq_default_domain == domain)) in irq_domain_remove()
159 pr_debug("Removed domain %s\n", domain->name); in irq_domain_remove()
161 of_node_put(irq_domain_get_of_node(domain)); in irq_domain_remove()
162 kfree(domain); in irq_domain_remove()
190 struct irq_domain *domain; in irq_domain_add_simple() local
192 domain = __irq_domain_add(of_node_to_fwnode(of_node), size, size, 0, ops, host_data); in irq_domain_add_simple()
193 if (!domain) in irq_domain_add_simple()
205 irq_domain_associate_many(domain, first_irq, 0, size); in irq_domain_add_simple()
208 return domain; in irq_domain_add_simple()
234 struct irq_domain *domain; in irq_domain_add_legacy() local
236 domain = __irq_domain_add(of_node_to_fwnode(of_node), first_hwirq + size, in irq_domain_add_legacy()
238 if (domain) in irq_domain_add_legacy()
239 irq_domain_associate_many(domain, first_irq, first_hwirq, size); in irq_domain_add_legacy()
241 return domain; in irq_domain_add_legacy()
293 void irq_set_default_host(struct irq_domain *domain) in irq_set_default_host() argument
295 pr_debug("Default domain set to @0x%p\n", domain); in irq_set_default_host()
297 irq_default_domain = domain; in irq_set_default_host()
301 void irq_domain_disassociate(struct irq_domain *domain, unsigned int irq) in irq_domain_disassociate() argument
306 if (WARN(!irq_data || irq_data->domain != domain, in irq_domain_disassociate()
320 if (domain->ops->unmap) in irq_domain_disassociate()
321 domain->ops->unmap(domain, irq); in irq_domain_disassociate()
324 irq_data->domain = NULL; in irq_domain_disassociate()
328 if (hwirq < domain->revmap_size) { in irq_domain_disassociate()
329 domain->linear_revmap[hwirq] = 0; in irq_domain_disassociate()
332 radix_tree_delete(&domain->revmap_tree, hwirq); in irq_domain_disassociate()
337 int irq_domain_associate(struct irq_domain *domain, unsigned int virq, in irq_domain_associate() argument
343 if (WARN(hwirq >= domain->hwirq_max, in irq_domain_associate()
344 "error: hwirq 0x%x is too large for %s\n", (int)hwirq, domain->name)) in irq_domain_associate()
348 if (WARN(irq_data->domain, "error: virq%i is already associated", virq)) in irq_domain_associate()
353 irq_data->domain = domain; in irq_domain_associate()
354 if (domain->ops->map) { in irq_domain_associate()
355 ret = domain->ops->map(domain, virq, hwirq); in irq_domain_associate()
364 domain->name, hwirq, virq, ret); in irq_domain_associate()
366 irq_data->domain = NULL; in irq_domain_associate()
373 if (!domain->name && irq_data->chip) in irq_domain_associate()
374 domain->name = irq_data->chip->name; in irq_domain_associate()
377 if (hwirq < domain->revmap_size) { in irq_domain_associate()
378 domain->linear_revmap[hwirq] = virq; in irq_domain_associate()
381 radix_tree_insert(&domain->revmap_tree, hwirq, irq_data); in irq_domain_associate()
392 void irq_domain_associate_many(struct irq_domain *domain, unsigned int irq_base, in irq_domain_associate_many() argument
398 of_node = irq_domain_get_of_node(domain); in irq_domain_associate_many()
403 irq_domain_associate(domain, irq_base + i, hwirq_base + i); in irq_domain_associate_many()
418 unsigned int irq_create_direct_mapping(struct irq_domain *domain) in irq_create_direct_mapping() argument
423 if (domain == NULL) in irq_create_direct_mapping()
424 domain = irq_default_domain; in irq_create_direct_mapping()
426 of_node = irq_domain_get_of_node(domain); in irq_create_direct_mapping()
432 if (virq >= domain->revmap_direct_max_irq) { in irq_create_direct_mapping()
434 domain->revmap_direct_max_irq); in irq_create_direct_mapping()
440 if (irq_domain_associate(domain, virq, virq)) { in irq_create_direct_mapping()
459 unsigned int irq_create_mapping(struct irq_domain *domain, in irq_create_mapping() argument
465 pr_debug("irq_create_mapping(0x%p, 0x%lx)\n", domain, hwirq); in irq_create_mapping()
468 if (domain == NULL) in irq_create_mapping()
469 domain = irq_default_domain; in irq_create_mapping()
470 if (domain == NULL) { in irq_create_mapping()
474 pr_debug("-> using domain @%p\n", domain); in irq_create_mapping()
476 of_node = irq_domain_get_of_node(domain); in irq_create_mapping()
479 virq = irq_find_mapping(domain, hwirq); in irq_create_mapping()
492 if (irq_domain_associate(domain, virq, hwirq)) { in irq_create_mapping()
522 int irq_create_strict_mappings(struct irq_domain *domain, unsigned int irq_base, in irq_create_strict_mappings() argument
528 of_node = irq_domain_get_of_node(domain); in irq_create_strict_mappings()
534 irq_domain_associate_many(domain, irq_base, hwirq_base, count); in irq_create_strict_mappings()
571 struct irq_domain *domain; in irq_create_fwspec_mapping() local
577 domain = irq_find_matching_fwnode(fwspec->fwnode, DOMAIN_BUS_ANY); in irq_create_fwspec_mapping()
579 domain = irq_default_domain; in irq_create_fwspec_mapping()
581 if (!domain) { in irq_create_fwspec_mapping()
587 if (irq_domain_translate(domain, fwspec, &hwirq, &type)) in irq_create_fwspec_mapping()
590 if (irq_domain_is_hierarchy(domain)) { in irq_create_fwspec_mapping()
595 virq = irq_find_mapping(domain, hwirq); in irq_create_fwspec_mapping()
599 virq = irq_domain_alloc_irqs(domain, 1, NUMA_NO_NODE, fwspec); in irq_create_fwspec_mapping()
604 virq = irq_create_mapping(domain, hwirq); in irq_create_fwspec_mapping()
633 struct irq_domain *domain; in irq_dispose_mapping() local
638 domain = irq_data->domain; in irq_dispose_mapping()
639 if (WARN_ON(domain == NULL)) in irq_dispose_mapping()
642 irq_domain_disassociate(domain, virq); in irq_dispose_mapping()
652 unsigned int irq_find_mapping(struct irq_domain *domain, in irq_find_mapping() argument
658 if (domain == NULL) in irq_find_mapping()
659 domain = irq_default_domain; in irq_find_mapping()
660 if (domain == NULL) in irq_find_mapping()
663 if (hwirq < domain->revmap_direct_max_irq) { in irq_find_mapping()
664 data = irq_domain_get_irq_data(domain, hwirq); in irq_find_mapping()
670 if (hwirq < domain->revmap_size) in irq_find_mapping()
671 return domain->linear_revmap[hwirq]; in irq_find_mapping()
674 data = radix_tree_lookup(&domain->revmap_tree, hwirq); in irq_find_mapping()
685 struct irq_domain *domain; in virq_debug_show() local
693 list_for_each_entry(domain, &irq_domain_list, link) { in virq_debug_show()
696 of_node = irq_domain_get_of_node(domain); in virq_debug_show()
697 radix_tree_for_each_slot(slot, &domain->revmap_tree, &iter, 0) in virq_debug_show()
700 domain == irq_default_domain ? '*' : ' ', domain->name, in virq_debug_show()
701 domain->revmap_size + count, domain->revmap_size, in virq_debug_show()
702 domain->revmap_direct_max_irq, in virq_debug_show()
717 domain = desc->irq_data.domain; in virq_debug_show()
719 if (domain) { in virq_debug_show()
734 direct = (i == hwirq) && (i < domain->revmap_direct_max_irq); in virq_debug_show()
736 (hwirq < domain->revmap_size) ? "LINEAR" : "RADIX", in virq_debug_show()
738 seq_printf(m, "%s\n", desc->irq_data.domain->name); in virq_debug_show()
878 struct irq_domain *domain; in irq_domain_create_hierarchy() local
881 domain = irq_domain_create_linear(fwnode, size, ops, host_data); in irq_domain_create_hierarchy()
883 domain = irq_domain_create_tree(fwnode, ops, host_data); in irq_domain_create_hierarchy()
884 if (domain) { in irq_domain_create_hierarchy()
885 domain->parent = parent; in irq_domain_create_hierarchy()
886 domain->flags |= flags; in irq_domain_create_hierarchy()
889 return domain; in irq_domain_create_hierarchy()
897 struct irq_domain *domain = data->domain; in irq_domain_insert_irq() local
900 if (hwirq < domain->revmap_size) { in irq_domain_insert_irq()
901 domain->linear_revmap[hwirq] = virq; in irq_domain_insert_irq()
904 radix_tree_insert(&domain->revmap_tree, hwirq, data); in irq_domain_insert_irq()
909 if (!domain->name && data->chip) in irq_domain_insert_irq()
910 domain->name = data->chip->name; in irq_domain_insert_irq()
926 struct irq_domain *domain = data->domain; in irq_domain_remove_irq() local
929 if (hwirq < domain->revmap_size) { in irq_domain_remove_irq()
930 domain->linear_revmap[hwirq] = 0; in irq_domain_remove_irq()
933 radix_tree_delete(&domain->revmap_tree, hwirq); in irq_domain_remove_irq()
939 static struct irq_data *irq_domain_insert_irq_data(struct irq_domain *domain, in irq_domain_insert_irq_data() argument
950 irq_data->domain = domain; in irq_domain_insert_irq_data()
965 irq_data->domain = NULL; in irq_domain_free_irq_data()
975 static int irq_domain_alloc_irq_data(struct irq_domain *domain, in irq_domain_alloc_irq_data() argument
985 irq_data->domain = domain; in irq_domain_alloc_irq_data()
987 for (parent = domain->parent; parent; parent = parent->parent) { in irq_domain_alloc_irq_data()
1004 struct irq_data *irq_domain_get_irq_data(struct irq_domain *domain, in irq_domain_get_irq_data() argument
1011 if (irq_data->domain == domain) in irq_domain_get_irq_data()
1025 int irq_domain_set_hwirq_and_chip(struct irq_domain *domain, unsigned int virq, in irq_domain_set_hwirq_and_chip() argument
1029 struct irq_data *irq_data = irq_domain_get_irq_data(domain, virq); in irq_domain_set_hwirq_and_chip()
1052 void irq_domain_set_info(struct irq_domain *domain, unsigned int virq, in irq_domain_set_info() argument
1057 irq_domain_set_hwirq_and_chip(domain, virq, hwirq, chip, chip_data); in irq_domain_set_info()
1079 void irq_domain_free_irqs_common(struct irq_domain *domain, unsigned int virq, in irq_domain_free_irqs_common() argument
1086 irq_data = irq_domain_get_irq_data(domain, virq + i); in irq_domain_free_irqs_common()
1090 irq_domain_free_irqs_parent(domain, virq, nr_irqs); in irq_domain_free_irqs_common()
1099 void irq_domain_free_irqs_top(struct irq_domain *domain, unsigned int virq, in irq_domain_free_irqs_top() argument
1108 irq_domain_free_irqs_common(domain, virq, nr_irqs); in irq_domain_free_irqs_top()
1111 static bool irq_domain_is_auto_recursive(struct irq_domain *domain) in irq_domain_is_auto_recursive() argument
1113 return domain->flags & IRQ_DOMAIN_FLAG_AUTO_RECURSIVE; in irq_domain_is_auto_recursive()
1116 static void irq_domain_free_irqs_recursive(struct irq_domain *domain, in irq_domain_free_irqs_recursive() argument
1120 domain->ops->free(domain, irq_base, nr_irqs); in irq_domain_free_irqs_recursive()
1121 if (irq_domain_is_auto_recursive(domain)) { in irq_domain_free_irqs_recursive()
1122 BUG_ON(!domain->parent); in irq_domain_free_irqs_recursive()
1123 irq_domain_free_irqs_recursive(domain->parent, irq_base, in irq_domain_free_irqs_recursive()
1128 static int irq_domain_alloc_irqs_recursive(struct irq_domain *domain, in irq_domain_alloc_irqs_recursive() argument
1133 struct irq_domain *parent = domain->parent; in irq_domain_alloc_irqs_recursive()
1134 bool recursive = irq_domain_is_auto_recursive(domain); in irq_domain_alloc_irqs_recursive()
1141 ret = domain->ops->alloc(domain, irq_base, nr_irqs, arg); in irq_domain_alloc_irqs_recursive()
1169 int __irq_domain_alloc_irqs(struct irq_domain *domain, int irq_base, in __irq_domain_alloc_irqs() argument
1175 if (domain == NULL) { in __irq_domain_alloc_irqs()
1176 domain = irq_default_domain; in __irq_domain_alloc_irqs()
1177 if (WARN(!domain, "domain is NULL; cannot allocate IRQ\n")) in __irq_domain_alloc_irqs()
1181 if (!domain->ops->alloc) { in __irq_domain_alloc_irqs()
1197 if (irq_domain_alloc_irq_data(domain, virq, nr_irqs)) { in __irq_domain_alloc_irqs()
1204 ret = irq_domain_alloc_irqs_recursive(domain, virq, nr_irqs, arg); in __irq_domain_alloc_irqs()
1232 if (WARN(!data || !data->domain || !data->domain->ops->free, in irq_domain_free_irqs()
1239 irq_domain_free_irqs_recursive(data->domain, virq, nr_irqs); in irq_domain_free_irqs()
1255 int irq_domain_alloc_irqs_parent(struct irq_domain *domain, in irq_domain_alloc_irqs_parent() argument
1260 if (irq_domain_is_auto_recursive(domain)) in irq_domain_alloc_irqs_parent()
1263 domain = domain->parent; in irq_domain_alloc_irqs_parent()
1264 if (domain) in irq_domain_alloc_irqs_parent()
1265 return irq_domain_alloc_irqs_recursive(domain, irq_base, in irq_domain_alloc_irqs_parent()
1278 void irq_domain_free_irqs_parent(struct irq_domain *domain, in irq_domain_free_irqs_parent() argument
1282 if (!irq_domain_is_auto_recursive(domain) && domain->parent) in irq_domain_free_irqs_parent()
1283 irq_domain_free_irqs_recursive(domain->parent, irq_base, in irq_domain_free_irqs_parent()
1297 if (irq_data && irq_data->domain) { in irq_domain_activate_irq()
1298 struct irq_domain *domain = irq_data->domain; in irq_domain_activate_irq() local
1302 if (domain->ops->activate) in irq_domain_activate_irq()
1303 domain->ops->activate(domain, irq_data); in irq_domain_activate_irq()
1317 if (irq_data && irq_data->domain) { in irq_domain_deactivate_irq()
1318 struct irq_domain *domain = irq_data->domain; in irq_domain_deactivate_irq() local
1320 if (domain->ops->deactivate) in irq_domain_deactivate_irq()
1321 domain->ops->deactivate(domain, irq_data); in irq_domain_deactivate_irq()
1327 static void irq_domain_check_hierarchy(struct irq_domain *domain) in irq_domain_check_hierarchy() argument
1330 if (domain->ops->alloc) in irq_domain_check_hierarchy()
1331 domain->flags |= IRQ_DOMAIN_FLAG_HIERARCHY; in irq_domain_check_hierarchy()
1339 struct irq_data *irq_domain_get_irq_data(struct irq_domain *domain, in irq_domain_get_irq_data() argument
1344 return (irq_data && irq_data->domain == domain) ? irq_data : NULL; in irq_domain_get_irq_data()
1358 void irq_domain_set_info(struct irq_domain *domain, unsigned int virq, in irq_domain_set_info() argument
1368 static void irq_domain_check_hierarchy(struct irq_domain *domain) in irq_domain_check_hierarchy() argument