1 // SPDX-License-Identifier: GPL-2.0 2 3 #define pr_fmt(fmt) "irq: " fmt 4 5 #include <linux/acpi.h> 6 #include <linux/debugfs.h> 7 #include <linux/hardirq.h> 8 #include <linux/interrupt.h> 9 #include <linux/irq.h> 10 #include <linux/irqdesc.h> 11 #include <linux/irqdomain.h> 12 #include <linux/module.h> 13 #include <linux/mutex.h> 14 #include <linux/of.h> 15 #include <linux/of_address.h> 16 #include <linux/of_irq.h> 17 #include <linux/topology.h> 18 #include <linux/seq_file.h> 19 #include <linux/slab.h> 20 #include <linux/smp.h> 21 #include <linux/fs.h> 22 23 static LIST_HEAD(irq_domain_list); 24 static DEFINE_MUTEX(irq_domain_mutex); 25 26 static struct irq_domain *irq_default_domain; 27 28 static int irq_domain_alloc_irqs_locked(struct irq_domain *domain, int irq_base, 29 unsigned int nr_irqs, int node, void *arg, 30 bool realloc, const struct irq_affinity_desc *affinity); 31 static void irq_domain_check_hierarchy(struct irq_domain *domain); 32 static void irq_domain_free_one_irq(struct irq_domain *domain, unsigned int virq); 33 34 struct irqchip_fwid { 35 struct fwnode_handle fwnode; 36 unsigned int type; 37 char *name; 38 phys_addr_t *pa; 39 }; 40 41 #ifdef CONFIG_GENERIC_IRQ_DEBUGFS 42 static void debugfs_add_domain_dir(struct irq_domain *d); 43 static void debugfs_remove_domain_dir(struct irq_domain *d); 44 #else 45 static inline void debugfs_add_domain_dir(struct irq_domain *d) { } 46 static inline void debugfs_remove_domain_dir(struct irq_domain *d) { } 47 #endif 48 49 static const char *irqchip_fwnode_get_name(const struct fwnode_handle *fwnode) 50 { 51 struct irqchip_fwid *fwid = container_of(fwnode, struct irqchip_fwid, fwnode); 52 53 return fwid->name; 54 } 55 56 const struct fwnode_operations irqchip_fwnode_ops = { 57 .get_name = irqchip_fwnode_get_name, 58 }; 59 EXPORT_SYMBOL_GPL(irqchip_fwnode_ops); 60 61 /** 62 * __irq_domain_alloc_fwnode - Allocate a fwnode_handle suitable for 63 * identifying an irq domain 64 * @type: Type of irqchip_fwnode. See linux/irqdomain.h 65 * @id: Optional user provided id if name != NULL 66 * @name: Optional user provided domain name 67 * @pa: Optional user-provided physical address 68 * 69 * Allocate a struct irqchip_fwid, and return a pointer to the embedded 70 * fwnode_handle (or NULL on failure). 71 * 72 * Note: The types IRQCHIP_FWNODE_NAMED and IRQCHIP_FWNODE_NAMED_ID are 73 * solely to transport name information to irqdomain creation code. The 74 * node is not stored. For other types the pointer is kept in the irq 75 * domain struct. 76 */ 77 struct fwnode_handle *__irq_domain_alloc_fwnode(unsigned int type, int id, 78 const char *name, 79 phys_addr_t *pa) 80 { 81 struct irqchip_fwid *fwid; 82 char *n; 83 84 fwid = kzalloc(sizeof(*fwid), GFP_KERNEL); 85 86 switch (type) { 87 case IRQCHIP_FWNODE_NAMED: 88 n = kasprintf(GFP_KERNEL, "%s", name); 89 break; 90 case IRQCHIP_FWNODE_NAMED_ID: 91 n = kasprintf(GFP_KERNEL, "%s-%d", name, id); 92 break; 93 default: 94 n = kasprintf(GFP_KERNEL, "irqchip@%pa", pa); 95 break; 96 } 97 98 if (!fwid || !n) { 99 kfree(fwid); 100 kfree(n); 101 return NULL; 102 } 103 104 fwid->type = type; 105 fwid->name = n; 106 fwid->pa = pa; 107 fwnode_init(&fwid->fwnode, &irqchip_fwnode_ops); 108 return &fwid->fwnode; 109 } 110 EXPORT_SYMBOL_GPL(__irq_domain_alloc_fwnode); 111 112 /** 113 * irq_domain_free_fwnode - Free a non-OF-backed fwnode_handle 114 * @fwnode: fwnode_handle to free 115 * 116 * Free a fwnode_handle allocated with irq_domain_alloc_fwnode. 117 */ 118 void irq_domain_free_fwnode(struct fwnode_handle *fwnode) 119 { 120 struct irqchip_fwid *fwid; 121 122 if (!fwnode || WARN_ON(!is_fwnode_irqchip(fwnode))) 123 return; 124 125 fwid = container_of(fwnode, struct irqchip_fwid, fwnode); 126 kfree(fwid->name); 127 kfree(fwid); 128 } 129 EXPORT_SYMBOL_GPL(irq_domain_free_fwnode); 130 131 static int irq_domain_set_name(struct irq_domain *domain, 132 const struct fwnode_handle *fwnode, 133 enum irq_domain_bus_token bus_token) 134 { 135 static atomic_t unknown_domains; 136 struct irqchip_fwid *fwid; 137 138 if (is_fwnode_irqchip(fwnode)) { 139 fwid = container_of(fwnode, struct irqchip_fwid, fwnode); 140 141 switch (fwid->type) { 142 case IRQCHIP_FWNODE_NAMED: 143 case IRQCHIP_FWNODE_NAMED_ID: 144 domain->name = bus_token ? 145 kasprintf(GFP_KERNEL, "%s-%d", 146 fwid->name, bus_token) : 147 kstrdup(fwid->name, GFP_KERNEL); 148 if (!domain->name) 149 return -ENOMEM; 150 domain->flags |= IRQ_DOMAIN_NAME_ALLOCATED; 151 break; 152 default: 153 domain->name = fwid->name; 154 if (bus_token) { 155 domain->name = kasprintf(GFP_KERNEL, "%s-%d", 156 fwid->name, bus_token); 157 if (!domain->name) 158 return -ENOMEM; 159 domain->flags |= IRQ_DOMAIN_NAME_ALLOCATED; 160 } 161 break; 162 } 163 } else if (is_of_node(fwnode) || is_acpi_device_node(fwnode) || 164 is_software_node(fwnode)) { 165 char *name; 166 167 /* 168 * fwnode paths contain '/', which debugfs is legitimately 169 * unhappy about. Replace them with ':', which does 170 * the trick and is not as offensive as '\'... 171 */ 172 name = bus_token ? 173 kasprintf(GFP_KERNEL, "%pfw-%d", fwnode, bus_token) : 174 kasprintf(GFP_KERNEL, "%pfw", fwnode); 175 if (!name) 176 return -ENOMEM; 177 178 domain->name = strreplace(name, '/', ':'); 179 domain->flags |= IRQ_DOMAIN_NAME_ALLOCATED; 180 } 181 182 if (!domain->name) { 183 if (fwnode) 184 pr_err("Invalid fwnode type for irqdomain\n"); 185 domain->name = bus_token ? 186 kasprintf(GFP_KERNEL, "unknown-%d-%d", 187 atomic_inc_return(&unknown_domains), 188 bus_token) : 189 kasprintf(GFP_KERNEL, "unknown-%d", 190 atomic_inc_return(&unknown_domains)); 191 if (!domain->name) 192 return -ENOMEM; 193 domain->flags |= IRQ_DOMAIN_NAME_ALLOCATED; 194 } 195 196 return 0; 197 } 198 199 static struct irq_domain *__irq_domain_create(const struct irq_domain_info *info) 200 { 201 struct irq_domain *domain; 202 int err; 203 204 if (WARN_ON((info->size && info->direct_max) || 205 (!IS_ENABLED(CONFIG_IRQ_DOMAIN_NOMAP) && info->direct_max) || 206 (info->direct_max && info->direct_max != info->hwirq_max))) 207 return ERR_PTR(-EINVAL); 208 209 domain = kzalloc_node(struct_size(domain, revmap, info->size), 210 GFP_KERNEL, of_node_to_nid(to_of_node(info->fwnode))); 211 if (!domain) 212 return ERR_PTR(-ENOMEM); 213 214 err = irq_domain_set_name(domain, info->fwnode, info->bus_token); 215 if (err) { 216 kfree(domain); 217 return ERR_PTR(err); 218 } 219 220 domain->fwnode = fwnode_handle_get(info->fwnode); 221 fwnode_dev_initialized(domain->fwnode, true); 222 223 /* Fill structure */ 224 INIT_RADIX_TREE(&domain->revmap_tree, GFP_KERNEL); 225 domain->ops = info->ops; 226 domain->host_data = info->host_data; 227 domain->bus_token = info->bus_token; 228 domain->hwirq_max = info->hwirq_max; 229 230 if (info->direct_max) 231 domain->flags |= IRQ_DOMAIN_FLAG_NO_MAP; 232 233 domain->revmap_size = info->size; 234 235 /* 236 * Hierarchical domains use the domain lock of the root domain 237 * (innermost domain). 238 * 239 * For non-hierarchical domains (as for root domains), the root 240 * pointer is set to the domain itself so that &domain->root->mutex 241 * always points to the right lock. 242 */ 243 mutex_init(&domain->mutex); 244 domain->root = domain; 245 246 irq_domain_check_hierarchy(domain); 247 248 return domain; 249 } 250 251 static void __irq_domain_publish(struct irq_domain *domain) 252 { 253 mutex_lock(&irq_domain_mutex); 254 debugfs_add_domain_dir(domain); 255 list_add(&domain->link, &irq_domain_list); 256 mutex_unlock(&irq_domain_mutex); 257 258 pr_debug("Added domain %s\n", domain->name); 259 } 260 261 static void irq_domain_free(struct irq_domain *domain) 262 { 263 fwnode_dev_initialized(domain->fwnode, false); 264 fwnode_handle_put(domain->fwnode); 265 if (domain->flags & IRQ_DOMAIN_NAME_ALLOCATED) 266 kfree(domain->name); 267 kfree(domain); 268 } 269 270 /** 271 * irq_domain_instantiate() - Instantiate a new irq domain data structure 272 * @info: Domain information pointer pointing to the information for this domain 273 * 274 * Return: A pointer to the instantiated irq domain or an ERR_PTR value. 275 */ 276 struct irq_domain *irq_domain_instantiate(const struct irq_domain_info *info) 277 { 278 struct irq_domain *domain; 279 int err; 280 281 domain = __irq_domain_create(info); 282 if (IS_ERR(domain)) 283 return domain; 284 285 domain->flags |= info->domain_flags; 286 domain->exit = info->exit; 287 288 #ifdef CONFIG_IRQ_DOMAIN_HIERARCHY 289 if (info->parent) { 290 domain->root = info->parent->root; 291 domain->parent = info->parent; 292 } 293 #endif 294 295 if (info->dgc_info) { 296 err = irq_domain_alloc_generic_chips(domain, info->dgc_info); 297 if (err) 298 goto err_domain_free; 299 } 300 301 if (info->init) { 302 err = info->init(domain); 303 if (err) 304 goto err_domain_gc_remove; 305 } 306 307 __irq_domain_publish(domain); 308 309 return domain; 310 311 err_domain_gc_remove: 312 if (info->dgc_info) 313 irq_domain_remove_generic_chips(domain); 314 err_domain_free: 315 irq_domain_free(domain); 316 return ERR_PTR(err); 317 } 318 EXPORT_SYMBOL_GPL(irq_domain_instantiate); 319 320 /** 321 * irq_domain_remove() - Remove an irq domain. 322 * @domain: domain to remove 323 * 324 * This routine is used to remove an irq domain. The caller must ensure 325 * that all mappings within the domain have been disposed of prior to 326 * use, depending on the revmap type. 327 */ 328 void irq_domain_remove(struct irq_domain *domain) 329 { 330 if (domain->exit) 331 domain->exit(domain); 332 333 mutex_lock(&irq_domain_mutex); 334 debugfs_remove_domain_dir(domain); 335 336 WARN_ON(!radix_tree_empty(&domain->revmap_tree)); 337 338 list_del(&domain->link); 339 340 /* 341 * If the going away domain is the default one, reset it. 342 */ 343 if (unlikely(irq_default_domain == domain)) 344 irq_set_default_host(NULL); 345 346 mutex_unlock(&irq_domain_mutex); 347 348 if (domain->flags & IRQ_DOMAIN_FLAG_DESTROY_GC) 349 irq_domain_remove_generic_chips(domain); 350 351 pr_debug("Removed domain %s\n", domain->name); 352 irq_domain_free(domain); 353 } 354 EXPORT_SYMBOL_GPL(irq_domain_remove); 355 356 void irq_domain_update_bus_token(struct irq_domain *domain, 357 enum irq_domain_bus_token bus_token) 358 { 359 char *name; 360 361 if (domain->bus_token == bus_token) 362 return; 363 364 mutex_lock(&irq_domain_mutex); 365 366 domain->bus_token = bus_token; 367 368 name = kasprintf(GFP_KERNEL, "%s-%d", domain->name, bus_token); 369 if (!name) { 370 mutex_unlock(&irq_domain_mutex); 371 return; 372 } 373 374 debugfs_remove_domain_dir(domain); 375 376 if (domain->flags & IRQ_DOMAIN_NAME_ALLOCATED) 377 kfree(domain->name); 378 else 379 domain->flags |= IRQ_DOMAIN_NAME_ALLOCATED; 380 381 domain->name = name; 382 debugfs_add_domain_dir(domain); 383 384 mutex_unlock(&irq_domain_mutex); 385 } 386 EXPORT_SYMBOL_GPL(irq_domain_update_bus_token); 387 388 /** 389 * irq_domain_create_simple() - Register an irq_domain and optionally map a range of irqs 390 * @fwnode: firmware node for the interrupt controller 391 * @size: total number of irqs in mapping 392 * @first_irq: first number of irq block assigned to the domain, 393 * pass zero to assign irqs on-the-fly. If first_irq is non-zero, then 394 * pre-map all of the irqs in the domain to virqs starting at first_irq. 395 * @ops: domain callbacks 396 * @host_data: Controller private data pointer 397 * 398 * Allocates an irq_domain, and optionally if first_irq is positive then also 399 * allocate irq_descs and map all of the hwirqs to virqs starting at first_irq. 400 * 401 * This is intended to implement the expected behaviour for most 402 * interrupt controllers. If device tree is used, then first_irq will be 0 and 403 * irqs get mapped dynamically on the fly. However, if the controller requires 404 * static virq assignments (non-DT boot) then it will set that up correctly. 405 */ 406 struct irq_domain *irq_domain_create_simple(struct fwnode_handle *fwnode, 407 unsigned int size, 408 unsigned int first_irq, 409 const struct irq_domain_ops *ops, 410 void *host_data) 411 { 412 struct irq_domain_info info = { 413 .fwnode = fwnode, 414 .size = size, 415 .hwirq_max = size, 416 .ops = ops, 417 .host_data = host_data, 418 }; 419 struct irq_domain *domain; 420 421 domain = irq_domain_instantiate(&info); 422 if (IS_ERR(domain)) 423 return NULL; 424 425 if (first_irq > 0) { 426 if (IS_ENABLED(CONFIG_SPARSE_IRQ)) { 427 /* attempt to allocated irq_descs */ 428 int rc = irq_alloc_descs(first_irq, first_irq, size, 429 of_node_to_nid(to_of_node(fwnode))); 430 if (rc < 0) 431 pr_info("Cannot allocate irq_descs @ IRQ%d, assuming pre-allocated\n", 432 first_irq); 433 } 434 irq_domain_associate_many(domain, first_irq, 0, size); 435 } 436 437 return domain; 438 } 439 EXPORT_SYMBOL_GPL(irq_domain_create_simple); 440 441 /** 442 * irq_domain_add_legacy() - Allocate and register a legacy revmap irq_domain. 443 * @of_node: pointer to interrupt controller's device tree node. 444 * @size: total number of irqs in legacy mapping 445 * @first_irq: first number of irq block assigned to the domain 446 * @first_hwirq: first hwirq number to use for the translation. Should normally 447 * be '', but a positive integer can be used if the effective 448 * hwirqs numbering does not begin at zero. 449 * @ops: map/unmap domain callbacks 450 * @host_data: Controller private data pointer 451 * 452 * Note: the map() callback will be called before this function returns 453 * for all legacy interrupts except 0 (which is always the invalid irq for 454 * a legacy controller). 455 */ 456 struct irq_domain *irq_domain_add_legacy(struct device_node *of_node, 457 unsigned int size, 458 unsigned int first_irq, 459 irq_hw_number_t first_hwirq, 460 const struct irq_domain_ops *ops, 461 void *host_data) 462 { 463 return irq_domain_create_legacy(of_node_to_fwnode(of_node), size, 464 first_irq, first_hwirq, ops, host_data); 465 } 466 EXPORT_SYMBOL_GPL(irq_domain_add_legacy); 467 468 struct irq_domain *irq_domain_create_legacy(struct fwnode_handle *fwnode, 469 unsigned int size, 470 unsigned int first_irq, 471 irq_hw_number_t first_hwirq, 472 const struct irq_domain_ops *ops, 473 void *host_data) 474 { 475 struct irq_domain_info info = { 476 .fwnode = fwnode, 477 .size = first_hwirq + size, 478 .hwirq_max = first_hwirq + size, 479 .ops = ops, 480 .host_data = host_data, 481 }; 482 struct irq_domain *domain; 483 484 domain = irq_domain_instantiate(&info); 485 if (IS_ERR(domain)) 486 return NULL; 487 488 irq_domain_associate_many(domain, first_irq, first_hwirq, size); 489 490 return domain; 491 } 492 EXPORT_SYMBOL_GPL(irq_domain_create_legacy); 493 494 /** 495 * irq_find_matching_fwspec() - Locates a domain for a given fwspec 496 * @fwspec: FW specifier for an interrupt 497 * @bus_token: domain-specific data 498 */ 499 struct irq_domain *irq_find_matching_fwspec(struct irq_fwspec *fwspec, 500 enum irq_domain_bus_token bus_token) 501 { 502 struct irq_domain *h, *found = NULL; 503 struct fwnode_handle *fwnode = fwspec->fwnode; 504 int rc; 505 506 /* 507 * We might want to match the legacy controller last since 508 * it might potentially be set to match all interrupts in 509 * the absence of a device node. This isn't a problem so far 510 * yet though... 511 * 512 * bus_token == DOMAIN_BUS_ANY matches any domain, any other 513 * values must generate an exact match for the domain to be 514 * selected. 515 */ 516 mutex_lock(&irq_domain_mutex); 517 list_for_each_entry(h, &irq_domain_list, link) { 518 if (h->ops->select && bus_token != DOMAIN_BUS_ANY) 519 rc = h->ops->select(h, fwspec, bus_token); 520 else if (h->ops->match) 521 rc = h->ops->match(h, to_of_node(fwnode), bus_token); 522 else 523 rc = ((fwnode != NULL) && (h->fwnode == fwnode) && 524 ((bus_token == DOMAIN_BUS_ANY) || 525 (h->bus_token == bus_token))); 526 527 if (rc) { 528 found = h; 529 break; 530 } 531 } 532 mutex_unlock(&irq_domain_mutex); 533 return found; 534 } 535 EXPORT_SYMBOL_GPL(irq_find_matching_fwspec); 536 537 /** 538 * irq_set_default_host() - Set a "default" irq domain 539 * @domain: default domain pointer 540 * 541 * For convenience, it's possible to set a "default" domain that will be used 542 * whenever NULL is passed to irq_create_mapping(). It makes life easier for 543 * platforms that want to manipulate a few hard coded interrupt numbers that 544 * aren't properly represented in the device-tree. 545 */ 546 void irq_set_default_host(struct irq_domain *domain) 547 { 548 pr_debug("Default domain set to @0x%p\n", domain); 549 550 irq_default_domain = domain; 551 } 552 EXPORT_SYMBOL_GPL(irq_set_default_host); 553 554 /** 555 * irq_get_default_host() - Retrieve the "default" irq domain 556 * 557 * Returns: the default domain, if any. 558 * 559 * Modern code should never use this. This should only be used on 560 * systems that cannot implement a firmware->fwnode mapping (which 561 * both DT and ACPI provide). 562 */ 563 struct irq_domain *irq_get_default_host(void) 564 { 565 return irq_default_domain; 566 } 567 EXPORT_SYMBOL_GPL(irq_get_default_host); 568 569 static bool irq_domain_is_nomap(struct irq_domain *domain) 570 { 571 return IS_ENABLED(CONFIG_IRQ_DOMAIN_NOMAP) && 572 (domain->flags & IRQ_DOMAIN_FLAG_NO_MAP); 573 } 574 575 static void irq_domain_clear_mapping(struct irq_domain *domain, 576 irq_hw_number_t hwirq) 577 { 578 lockdep_assert_held(&domain->root->mutex); 579 580 if (irq_domain_is_nomap(domain)) 581 return; 582 583 if (hwirq < domain->revmap_size) 584 rcu_assign_pointer(domain->revmap[hwirq], NULL); 585 else 586 radix_tree_delete(&domain->revmap_tree, hwirq); 587 } 588 589 static void irq_domain_set_mapping(struct irq_domain *domain, 590 irq_hw_number_t hwirq, 591 struct irq_data *irq_data) 592 { 593 /* 594 * This also makes sure that all domains point to the same root when 595 * called from irq_domain_insert_irq() for each domain in a hierarchy. 596 */ 597 lockdep_assert_held(&domain->root->mutex); 598 599 if (irq_domain_is_nomap(domain)) 600 return; 601 602 if (hwirq < domain->revmap_size) 603 rcu_assign_pointer(domain->revmap[hwirq], irq_data); 604 else 605 radix_tree_insert(&domain->revmap_tree, hwirq, irq_data); 606 } 607 608 static void irq_domain_disassociate(struct irq_domain *domain, unsigned int irq) 609 { 610 struct irq_data *irq_data = irq_get_irq_data(irq); 611 irq_hw_number_t hwirq; 612 613 if (WARN(!irq_data || irq_data->domain != domain, 614 "virq%i doesn't exist; cannot disassociate\n", irq)) 615 return; 616 617 hwirq = irq_data->hwirq; 618 619 mutex_lock(&domain->root->mutex); 620 621 irq_set_status_flags(irq, IRQ_NOREQUEST); 622 623 /* remove chip and handler */ 624 irq_set_chip_and_handler(irq, NULL, NULL); 625 626 /* Make sure it's completed */ 627 synchronize_irq(irq); 628 629 /* Tell the PIC about it */ 630 if (domain->ops->unmap) 631 domain->ops->unmap(domain, irq); 632 smp_mb(); 633 634 irq_data->domain = NULL; 635 irq_data->hwirq = 0; 636 domain->mapcount--; 637 638 /* Clear reverse map for this hwirq */ 639 irq_domain_clear_mapping(domain, hwirq); 640 641 mutex_unlock(&domain->root->mutex); 642 } 643 644 static int irq_domain_associate_locked(struct irq_domain *domain, unsigned int virq, 645 irq_hw_number_t hwirq) 646 { 647 struct irq_data *irq_data = irq_get_irq_data(virq); 648 int ret; 649 650 if (WARN(hwirq >= domain->hwirq_max, 651 "error: hwirq 0x%x is too large for %s\n", (int)hwirq, domain->name)) 652 return -EINVAL; 653 if (WARN(!irq_data, "error: virq%i is not allocated", virq)) 654 return -EINVAL; 655 if (WARN(irq_data->domain, "error: virq%i is already associated", virq)) 656 return -EINVAL; 657 658 irq_data->hwirq = hwirq; 659 irq_data->domain = domain; 660 if (domain->ops->map) { 661 ret = domain->ops->map(domain, virq, hwirq); 662 if (ret != 0) { 663 /* 664 * If map() returns -EPERM, this interrupt is protected 665 * by the firmware or some other service and shall not 666 * be mapped. Don't bother telling the user about it. 667 */ 668 if (ret != -EPERM) { 669 pr_info("%s didn't like hwirq-0x%lx to VIRQ%i mapping (rc=%d)\n", 670 domain->name, hwirq, virq, ret); 671 } 672 irq_data->domain = NULL; 673 irq_data->hwirq = 0; 674 return ret; 675 } 676 } 677 678 domain->mapcount++; 679 irq_domain_set_mapping(domain, hwirq, irq_data); 680 681 irq_clear_status_flags(virq, IRQ_NOREQUEST); 682 683 return 0; 684 } 685 686 int irq_domain_associate(struct irq_domain *domain, unsigned int virq, 687 irq_hw_number_t hwirq) 688 { 689 int ret; 690 691 mutex_lock(&domain->root->mutex); 692 ret = irq_domain_associate_locked(domain, virq, hwirq); 693 mutex_unlock(&domain->root->mutex); 694 695 return ret; 696 } 697 EXPORT_SYMBOL_GPL(irq_domain_associate); 698 699 void irq_domain_associate_many(struct irq_domain *domain, unsigned int irq_base, 700 irq_hw_number_t hwirq_base, int count) 701 { 702 struct device_node *of_node; 703 int i; 704 705 of_node = irq_domain_get_of_node(domain); 706 pr_debug("%s(%s, irqbase=%i, hwbase=%i, count=%i)\n", __func__, 707 of_node_full_name(of_node), irq_base, (int)hwirq_base, count); 708 709 for (i = 0; i < count; i++) 710 irq_domain_associate(domain, irq_base + i, hwirq_base + i); 711 } 712 EXPORT_SYMBOL_GPL(irq_domain_associate_many); 713 714 #ifdef CONFIG_IRQ_DOMAIN_NOMAP 715 /** 716 * irq_create_direct_mapping() - Allocate an irq for direct mapping 717 * @domain: domain to allocate the irq for or NULL for default domain 718 * 719 * This routine is used for irq controllers which can choose the hardware 720 * interrupt numbers they generate. In such a case it's simplest to use 721 * the linux irq as the hardware interrupt number. It still uses the linear 722 * or radix tree to store the mapping, but the irq controller can optimize 723 * the revmap path by using the hwirq directly. 724 */ 725 unsigned int irq_create_direct_mapping(struct irq_domain *domain) 726 { 727 struct device_node *of_node; 728 unsigned int virq; 729 730 if (domain == NULL) 731 domain = irq_default_domain; 732 733 of_node = irq_domain_get_of_node(domain); 734 virq = irq_alloc_desc_from(1, of_node_to_nid(of_node)); 735 if (!virq) { 736 pr_debug("create_direct virq allocation failed\n"); 737 return 0; 738 } 739 if (virq >= domain->hwirq_max) { 740 pr_err("ERROR: no free irqs available below %lu maximum\n", 741 domain->hwirq_max); 742 irq_free_desc(virq); 743 return 0; 744 } 745 pr_debug("create_direct obtained virq %d\n", virq); 746 747 if (irq_domain_associate(domain, virq, virq)) { 748 irq_free_desc(virq); 749 return 0; 750 } 751 752 return virq; 753 } 754 EXPORT_SYMBOL_GPL(irq_create_direct_mapping); 755 #endif 756 757 static unsigned int irq_create_mapping_affinity_locked(struct irq_domain *domain, 758 irq_hw_number_t hwirq, 759 const struct irq_affinity_desc *affinity) 760 { 761 struct device_node *of_node = irq_domain_get_of_node(domain); 762 int virq; 763 764 pr_debug("irq_create_mapping(0x%p, 0x%lx)\n", domain, hwirq); 765 766 /* Allocate a virtual interrupt number */ 767 virq = irq_domain_alloc_descs(-1, 1, hwirq, of_node_to_nid(of_node), 768 affinity); 769 if (virq <= 0) { 770 pr_debug("-> virq allocation failed\n"); 771 return 0; 772 } 773 774 if (irq_domain_associate_locked(domain, virq, hwirq)) { 775 irq_free_desc(virq); 776 return 0; 777 } 778 779 pr_debug("irq %lu on domain %s mapped to virtual irq %u\n", 780 hwirq, of_node_full_name(of_node), virq); 781 782 return virq; 783 } 784 785 /** 786 * irq_create_mapping_affinity() - Map a hardware interrupt into linux irq space 787 * @domain: domain owning this hardware interrupt or NULL for default domain 788 * @hwirq: hardware irq number in that domain space 789 * @affinity: irq affinity 790 * 791 * Only one mapping per hardware interrupt is permitted. Returns a linux 792 * irq number. 793 * If the sense/trigger is to be specified, set_irq_type() should be called 794 * on the number returned from that call. 795 */ 796 unsigned int irq_create_mapping_affinity(struct irq_domain *domain, 797 irq_hw_number_t hwirq, 798 const struct irq_affinity_desc *affinity) 799 { 800 int virq; 801 802 /* Look for default domain if necessary */ 803 if (domain == NULL) 804 domain = irq_default_domain; 805 if (domain == NULL) { 806 WARN(1, "%s(, %lx) called with NULL domain\n", __func__, hwirq); 807 return 0; 808 } 809 810 mutex_lock(&domain->root->mutex); 811 812 /* Check if mapping already exists */ 813 virq = irq_find_mapping(domain, hwirq); 814 if (virq) { 815 pr_debug("existing mapping on virq %d\n", virq); 816 goto out; 817 } 818 819 virq = irq_create_mapping_affinity_locked(domain, hwirq, affinity); 820 out: 821 mutex_unlock(&domain->root->mutex); 822 823 return virq; 824 } 825 EXPORT_SYMBOL_GPL(irq_create_mapping_affinity); 826 827 static int irq_domain_translate(struct irq_domain *d, 828 struct irq_fwspec *fwspec, 829 irq_hw_number_t *hwirq, unsigned int *type) 830 { 831 #ifdef CONFIG_IRQ_DOMAIN_HIERARCHY 832 if (d->ops->translate) 833 return d->ops->translate(d, fwspec, hwirq, type); 834 #endif 835 if (d->ops->xlate) 836 return d->ops->xlate(d, to_of_node(fwspec->fwnode), 837 fwspec->param, fwspec->param_count, 838 hwirq, type); 839 840 /* If domain has no translation, then we assume interrupt line */ 841 *hwirq = fwspec->param[0]; 842 return 0; 843 } 844 845 void of_phandle_args_to_fwspec(struct device_node *np, const u32 *args, 846 unsigned int count, struct irq_fwspec *fwspec) 847 { 848 int i; 849 850 fwspec->fwnode = of_node_to_fwnode(np); 851 fwspec->param_count = count; 852 853 for (i = 0; i < count; i++) 854 fwspec->param[i] = args[i]; 855 } 856 EXPORT_SYMBOL_GPL(of_phandle_args_to_fwspec); 857 858 unsigned int irq_create_fwspec_mapping(struct irq_fwspec *fwspec) 859 { 860 struct irq_domain *domain; 861 struct irq_data *irq_data; 862 irq_hw_number_t hwirq; 863 unsigned int type = IRQ_TYPE_NONE; 864 int virq; 865 866 if (fwspec->fwnode) { 867 domain = irq_find_matching_fwspec(fwspec, DOMAIN_BUS_WIRED); 868 if (!domain) 869 domain = irq_find_matching_fwspec(fwspec, DOMAIN_BUS_ANY); 870 } else { 871 domain = irq_default_domain; 872 } 873 874 if (!domain) { 875 pr_warn("no irq domain found for %s !\n", 876 of_node_full_name(to_of_node(fwspec->fwnode))); 877 return 0; 878 } 879 880 if (irq_domain_translate(domain, fwspec, &hwirq, &type)) 881 return 0; 882 883 /* 884 * WARN if the irqchip returns a type with bits 885 * outside the sense mask set and clear these bits. 886 */ 887 if (WARN_ON(type & ~IRQ_TYPE_SENSE_MASK)) 888 type &= IRQ_TYPE_SENSE_MASK; 889 890 mutex_lock(&domain->root->mutex); 891 892 /* 893 * If we've already configured this interrupt, 894 * don't do it again, or hell will break loose. 895 */ 896 virq = irq_find_mapping(domain, hwirq); 897 if (virq) { 898 /* 899 * If the trigger type is not specified or matches the 900 * current trigger type then we are done so return the 901 * interrupt number. 902 */ 903 if (type == IRQ_TYPE_NONE || type == irq_get_trigger_type(virq)) 904 goto out; 905 906 /* 907 * If the trigger type has not been set yet, then set 908 * it now and return the interrupt number. 909 */ 910 if (irq_get_trigger_type(virq) == IRQ_TYPE_NONE) { 911 irq_data = irq_get_irq_data(virq); 912 if (!irq_data) { 913 virq = 0; 914 goto out; 915 } 916 917 irqd_set_trigger_type(irq_data, type); 918 goto out; 919 } 920 921 pr_warn("type mismatch, failed to map hwirq-%lu for %s!\n", 922 hwirq, of_node_full_name(to_of_node(fwspec->fwnode))); 923 virq = 0; 924 goto out; 925 } 926 927 if (irq_domain_is_hierarchy(domain)) { 928 if (irq_domain_is_msi_device(domain)) { 929 mutex_unlock(&domain->root->mutex); 930 virq = msi_device_domain_alloc_wired(domain, hwirq, type); 931 mutex_lock(&domain->root->mutex); 932 } else 933 virq = irq_domain_alloc_irqs_locked(domain, -1, 1, NUMA_NO_NODE, 934 fwspec, false, NULL); 935 if (virq <= 0) { 936 virq = 0; 937 goto out; 938 } 939 } else { 940 /* Create mapping */ 941 virq = irq_create_mapping_affinity_locked(domain, hwirq, NULL); 942 if (!virq) 943 goto out; 944 } 945 946 irq_data = irq_get_irq_data(virq); 947 if (WARN_ON(!irq_data)) { 948 virq = 0; 949 goto out; 950 } 951 952 /* Store trigger type */ 953 irqd_set_trigger_type(irq_data, type); 954 out: 955 mutex_unlock(&domain->root->mutex); 956 957 return virq; 958 } 959 EXPORT_SYMBOL_GPL(irq_create_fwspec_mapping); 960 961 unsigned int irq_create_of_mapping(struct of_phandle_args *irq_data) 962 { 963 struct irq_fwspec fwspec; 964 965 of_phandle_args_to_fwspec(irq_data->np, irq_data->args, 966 irq_data->args_count, &fwspec); 967 968 return irq_create_fwspec_mapping(&fwspec); 969 } 970 EXPORT_SYMBOL_GPL(irq_create_of_mapping); 971 972 /** 973 * irq_dispose_mapping() - Unmap an interrupt 974 * @virq: linux irq number of the interrupt to unmap 975 */ 976 void irq_dispose_mapping(unsigned int virq) 977 { 978 struct irq_data *irq_data; 979 struct irq_domain *domain; 980 981 irq_data = virq ? irq_get_irq_data(virq) : NULL; 982 if (!irq_data) 983 return; 984 985 domain = irq_data->domain; 986 if (WARN_ON(domain == NULL)) 987 return; 988 989 if (irq_domain_is_hierarchy(domain)) { 990 irq_domain_free_one_irq(domain, virq); 991 } else { 992 irq_domain_disassociate(domain, virq); 993 irq_free_desc(virq); 994 } 995 } 996 EXPORT_SYMBOL_GPL(irq_dispose_mapping); 997 998 /** 999 * __irq_resolve_mapping() - Find a linux irq from a hw irq number. 1000 * @domain: domain owning this hardware interrupt 1001 * @hwirq: hardware irq number in that domain space 1002 * @irq: optional pointer to return the Linux irq if required 1003 * 1004 * Returns the interrupt descriptor. 1005 */ 1006 struct irq_desc *__irq_resolve_mapping(struct irq_domain *domain, 1007 irq_hw_number_t hwirq, 1008 unsigned int *irq) 1009 { 1010 struct irq_desc *desc = NULL; 1011 struct irq_data *data; 1012 1013 /* Look for default domain if necessary */ 1014 if (domain == NULL) 1015 domain = irq_default_domain; 1016 if (domain == NULL) 1017 return desc; 1018 1019 if (irq_domain_is_nomap(domain)) { 1020 if (hwirq < domain->hwirq_max) { 1021 data = irq_domain_get_irq_data(domain, hwirq); 1022 if (data && data->hwirq == hwirq) 1023 desc = irq_data_to_desc(data); 1024 if (irq && desc) 1025 *irq = hwirq; 1026 } 1027 1028 return desc; 1029 } 1030 1031 rcu_read_lock(); 1032 /* Check if the hwirq is in the linear revmap. */ 1033 if (hwirq < domain->revmap_size) 1034 data = rcu_dereference(domain->revmap[hwirq]); 1035 else 1036 data = radix_tree_lookup(&domain->revmap_tree, hwirq); 1037 1038 if (likely(data)) { 1039 desc = irq_data_to_desc(data); 1040 if (irq) 1041 *irq = data->irq; 1042 } 1043 1044 rcu_read_unlock(); 1045 return desc; 1046 } 1047 EXPORT_SYMBOL_GPL(__irq_resolve_mapping); 1048 1049 /** 1050 * irq_domain_xlate_onecell() - Generic xlate for direct one cell bindings 1051 * @d: Interrupt domain involved in the translation 1052 * @ctrlr: The device tree node for the device whose interrupt is translated 1053 * @intspec: The interrupt specifier data from the device tree 1054 * @intsize: The number of entries in @intspec 1055 * @out_hwirq: Pointer to storage for the hardware interrupt number 1056 * @out_type: Pointer to storage for the interrupt type 1057 * 1058 * Device Tree IRQ specifier translation function which works with one cell 1059 * bindings where the cell value maps directly to the hwirq number. 1060 */ 1061 int irq_domain_xlate_onecell(struct irq_domain *d, struct device_node *ctrlr, 1062 const u32 *intspec, unsigned int intsize, 1063 unsigned long *out_hwirq, unsigned int *out_type) 1064 { 1065 if (WARN_ON(intsize < 1)) 1066 return -EINVAL; 1067 *out_hwirq = intspec[0]; 1068 *out_type = IRQ_TYPE_NONE; 1069 return 0; 1070 } 1071 EXPORT_SYMBOL_GPL(irq_domain_xlate_onecell); 1072 1073 /** 1074 * irq_domain_xlate_twocell() - Generic xlate for direct two cell bindings 1075 * @d: Interrupt domain involved in the translation 1076 * @ctrlr: The device tree node for the device whose interrupt is translated 1077 * @intspec: The interrupt specifier data from the device tree 1078 * @intsize: The number of entries in @intspec 1079 * @out_hwirq: Pointer to storage for the hardware interrupt number 1080 * @out_type: Pointer to storage for the interrupt type 1081 * 1082 * Device Tree IRQ specifier translation function which works with two cell 1083 * bindings where the cell values map directly to the hwirq number 1084 * and linux irq flags. 1085 */ 1086 int irq_domain_xlate_twocell(struct irq_domain *d, struct device_node *ctrlr, 1087 const u32 *intspec, unsigned int intsize, 1088 irq_hw_number_t *out_hwirq, unsigned int *out_type) 1089 { 1090 struct irq_fwspec fwspec; 1091 1092 of_phandle_args_to_fwspec(ctrlr, intspec, intsize, &fwspec); 1093 return irq_domain_translate_twocell(d, &fwspec, out_hwirq, out_type); 1094 } 1095 EXPORT_SYMBOL_GPL(irq_domain_xlate_twocell); 1096 1097 /** 1098 * irq_domain_xlate_onetwocell() - Generic xlate for one or two cell bindings 1099 * @d: Interrupt domain involved in the translation 1100 * @ctrlr: The device tree node for the device whose interrupt is translated 1101 * @intspec: The interrupt specifier data from the device tree 1102 * @intsize: The number of entries in @intspec 1103 * @out_hwirq: Pointer to storage for the hardware interrupt number 1104 * @out_type: Pointer to storage for the interrupt type 1105 * 1106 * Device Tree IRQ specifier translation function which works with either one 1107 * or two cell bindings where the cell values map directly to the hwirq number 1108 * and linux irq flags. 1109 * 1110 * Note: don't use this function unless your interrupt controller explicitly 1111 * supports both one and two cell bindings. For the majority of controllers 1112 * the _onecell() or _twocell() variants above should be used. 1113 */ 1114 int irq_domain_xlate_onetwocell(struct irq_domain *d, 1115 struct device_node *ctrlr, 1116 const u32 *intspec, unsigned int intsize, 1117 unsigned long *out_hwirq, unsigned int *out_type) 1118 { 1119 if (WARN_ON(intsize < 1)) 1120 return -EINVAL; 1121 *out_hwirq = intspec[0]; 1122 if (intsize > 1) 1123 *out_type = intspec[1] & IRQ_TYPE_SENSE_MASK; 1124 else 1125 *out_type = IRQ_TYPE_NONE; 1126 return 0; 1127 } 1128 EXPORT_SYMBOL_GPL(irq_domain_xlate_onetwocell); 1129 1130 const struct irq_domain_ops irq_domain_simple_ops = { 1131 .xlate = irq_domain_xlate_onetwocell, 1132 }; 1133 EXPORT_SYMBOL_GPL(irq_domain_simple_ops); 1134 1135 /** 1136 * irq_domain_translate_onecell() - Generic translate for direct one cell 1137 * bindings 1138 * @d: Interrupt domain involved in the translation 1139 * @fwspec: The firmware interrupt specifier to translate 1140 * @out_hwirq: Pointer to storage for the hardware interrupt number 1141 * @out_type: Pointer to storage for the interrupt type 1142 */ 1143 int irq_domain_translate_onecell(struct irq_domain *d, 1144 struct irq_fwspec *fwspec, 1145 unsigned long *out_hwirq, 1146 unsigned int *out_type) 1147 { 1148 if (WARN_ON(fwspec->param_count < 1)) 1149 return -EINVAL; 1150 *out_hwirq = fwspec->param[0]; 1151 *out_type = IRQ_TYPE_NONE; 1152 return 0; 1153 } 1154 EXPORT_SYMBOL_GPL(irq_domain_translate_onecell); 1155 1156 /** 1157 * irq_domain_translate_twocell() - Generic translate for direct two cell 1158 * bindings 1159 * @d: Interrupt domain involved in the translation 1160 * @fwspec: The firmware interrupt specifier to translate 1161 * @out_hwirq: Pointer to storage for the hardware interrupt number 1162 * @out_type: Pointer to storage for the interrupt type 1163 * 1164 * Device Tree IRQ specifier translation function which works with two cell 1165 * bindings where the cell values map directly to the hwirq number 1166 * and linux irq flags. 1167 */ 1168 int irq_domain_translate_twocell(struct irq_domain *d, 1169 struct irq_fwspec *fwspec, 1170 unsigned long *out_hwirq, 1171 unsigned int *out_type) 1172 { 1173 if (WARN_ON(fwspec->param_count < 2)) 1174 return -EINVAL; 1175 *out_hwirq = fwspec->param[0]; 1176 *out_type = fwspec->param[1] & IRQ_TYPE_SENSE_MASK; 1177 return 0; 1178 } 1179 EXPORT_SYMBOL_GPL(irq_domain_translate_twocell); 1180 1181 int irq_domain_alloc_descs(int virq, unsigned int cnt, irq_hw_number_t hwirq, 1182 int node, const struct irq_affinity_desc *affinity) 1183 { 1184 unsigned int hint; 1185 1186 if (virq >= 0) { 1187 virq = __irq_alloc_descs(virq, virq, cnt, node, THIS_MODULE, 1188 affinity); 1189 } else { 1190 hint = hwirq % nr_irqs; 1191 if (hint == 0) 1192 hint++; 1193 virq = __irq_alloc_descs(-1, hint, cnt, node, THIS_MODULE, 1194 affinity); 1195 if (virq <= 0 && hint > 1) { 1196 virq = __irq_alloc_descs(-1, 1, cnt, node, THIS_MODULE, 1197 affinity); 1198 } 1199 } 1200 1201 return virq; 1202 } 1203 1204 /** 1205 * irq_domain_reset_irq_data - Clear hwirq, chip and chip_data in @irq_data 1206 * @irq_data: The pointer to irq_data 1207 */ 1208 void irq_domain_reset_irq_data(struct irq_data *irq_data) 1209 { 1210 irq_data->hwirq = 0; 1211 irq_data->chip = &no_irq_chip; 1212 irq_data->chip_data = NULL; 1213 } 1214 EXPORT_SYMBOL_GPL(irq_domain_reset_irq_data); 1215 1216 #ifdef CONFIG_IRQ_DOMAIN_HIERARCHY 1217 /** 1218 * irq_domain_create_hierarchy - Add a irqdomain into the hierarchy 1219 * @parent: Parent irq domain to associate with the new domain 1220 * @flags: Irq domain flags associated to the domain 1221 * @size: Size of the domain. See below 1222 * @fwnode: Optional fwnode of the interrupt controller 1223 * @ops: Pointer to the interrupt domain callbacks 1224 * @host_data: Controller private data pointer 1225 * 1226 * If @size is 0 a tree domain is created, otherwise a linear domain. 1227 * 1228 * If successful the parent is associated to the new domain and the 1229 * domain flags are set. 1230 * Returns pointer to IRQ domain, or NULL on failure. 1231 */ 1232 struct irq_domain *irq_domain_create_hierarchy(struct irq_domain *parent, 1233 unsigned int flags, 1234 unsigned int size, 1235 struct fwnode_handle *fwnode, 1236 const struct irq_domain_ops *ops, 1237 void *host_data) 1238 { 1239 struct irq_domain_info info = { 1240 .fwnode = fwnode, 1241 .size = size, 1242 .hwirq_max = size, 1243 .ops = ops, 1244 .host_data = host_data, 1245 .domain_flags = flags, 1246 .parent = parent, 1247 }; 1248 struct irq_domain *d; 1249 1250 if (!info.size) 1251 info.hwirq_max = ~0U; 1252 1253 d = irq_domain_instantiate(&info); 1254 return IS_ERR(d) ? NULL : d; 1255 } 1256 EXPORT_SYMBOL_GPL(irq_domain_create_hierarchy); 1257 1258 static void irq_domain_insert_irq(int virq) 1259 { 1260 struct irq_data *data; 1261 1262 for (data = irq_get_irq_data(virq); data; data = data->parent_data) { 1263 struct irq_domain *domain = data->domain; 1264 1265 domain->mapcount++; 1266 irq_domain_set_mapping(domain, data->hwirq, data); 1267 } 1268 1269 irq_clear_status_flags(virq, IRQ_NOREQUEST); 1270 } 1271 1272 static void irq_domain_remove_irq(int virq) 1273 { 1274 struct irq_data *data; 1275 1276 irq_set_status_flags(virq, IRQ_NOREQUEST); 1277 irq_set_chip_and_handler(virq, NULL, NULL); 1278 synchronize_irq(virq); 1279 smp_mb(); 1280 1281 for (data = irq_get_irq_data(virq); data; data = data->parent_data) { 1282 struct irq_domain *domain = data->domain; 1283 irq_hw_number_t hwirq = data->hwirq; 1284 1285 domain->mapcount--; 1286 irq_domain_clear_mapping(domain, hwirq); 1287 } 1288 } 1289 1290 static struct irq_data *irq_domain_insert_irq_data(struct irq_domain *domain, 1291 struct irq_data *child) 1292 { 1293 struct irq_data *irq_data; 1294 1295 irq_data = kzalloc_node(sizeof(*irq_data), GFP_KERNEL, 1296 irq_data_get_node(child)); 1297 if (irq_data) { 1298 child->parent_data = irq_data; 1299 irq_data->irq = child->irq; 1300 irq_data->common = child->common; 1301 irq_data->domain = domain; 1302 } 1303 1304 return irq_data; 1305 } 1306 1307 static void __irq_domain_free_hierarchy(struct irq_data *irq_data) 1308 { 1309 struct irq_data *tmp; 1310 1311 while (irq_data) { 1312 tmp = irq_data; 1313 irq_data = irq_data->parent_data; 1314 kfree(tmp); 1315 } 1316 } 1317 1318 static void irq_domain_free_irq_data(unsigned int virq, unsigned int nr_irqs) 1319 { 1320 struct irq_data *irq_data, *tmp; 1321 int i; 1322 1323 for (i = 0; i < nr_irqs; i++) { 1324 irq_data = irq_get_irq_data(virq + i); 1325 tmp = irq_data->parent_data; 1326 irq_data->parent_data = NULL; 1327 irq_data->domain = NULL; 1328 1329 __irq_domain_free_hierarchy(tmp); 1330 } 1331 } 1332 1333 /** 1334 * irq_domain_disconnect_hierarchy - Mark the first unused level of a hierarchy 1335 * @domain: IRQ domain from which the hierarchy is to be disconnected 1336 * @virq: IRQ number where the hierarchy is to be trimmed 1337 * 1338 * Marks the @virq level belonging to @domain as disconnected. 1339 * Returns -EINVAL if @virq doesn't have a valid irq_data pointing 1340 * to @domain. 1341 * 1342 * Its only use is to be able to trim levels of hierarchy that do not 1343 * have any real meaning for this interrupt, and that the driver marks 1344 * as such from its .alloc() callback. 1345 */ 1346 int irq_domain_disconnect_hierarchy(struct irq_domain *domain, 1347 unsigned int virq) 1348 { 1349 struct irq_data *irqd; 1350 1351 irqd = irq_domain_get_irq_data(domain, virq); 1352 if (!irqd) 1353 return -EINVAL; 1354 1355 irqd->chip = ERR_PTR(-ENOTCONN); 1356 return 0; 1357 } 1358 EXPORT_SYMBOL_GPL(irq_domain_disconnect_hierarchy); 1359 1360 static int irq_domain_trim_hierarchy(unsigned int virq) 1361 { 1362 struct irq_data *tail, *irqd, *irq_data; 1363 1364 irq_data = irq_get_irq_data(virq); 1365 tail = NULL; 1366 1367 /* The first entry must have a valid irqchip */ 1368 if (!irq_data->chip || IS_ERR(irq_data->chip)) 1369 return -EINVAL; 1370 1371 /* 1372 * Validate that the irq_data chain is sane in the presence of 1373 * a hierarchy trimming marker. 1374 */ 1375 for (irqd = irq_data->parent_data; irqd; irq_data = irqd, irqd = irqd->parent_data) { 1376 /* Can't have a valid irqchip after a trim marker */ 1377 if (irqd->chip && tail) 1378 return -EINVAL; 1379 1380 /* Can't have an empty irqchip before a trim marker */ 1381 if (!irqd->chip && !tail) 1382 return -EINVAL; 1383 1384 if (IS_ERR(irqd->chip)) { 1385 /* Only -ENOTCONN is a valid trim marker */ 1386 if (PTR_ERR(irqd->chip) != -ENOTCONN) 1387 return -EINVAL; 1388 1389 tail = irq_data; 1390 } 1391 } 1392 1393 /* No trim marker, nothing to do */ 1394 if (!tail) 1395 return 0; 1396 1397 pr_info("IRQ%d: trimming hierarchy from %s\n", 1398 virq, tail->parent_data->domain->name); 1399 1400 /* Sever the inner part of the hierarchy... */ 1401 irqd = tail; 1402 tail = tail->parent_data; 1403 irqd->parent_data = NULL; 1404 __irq_domain_free_hierarchy(tail); 1405 1406 return 0; 1407 } 1408 1409 static int irq_domain_alloc_irq_data(struct irq_domain *domain, 1410 unsigned int virq, unsigned int nr_irqs) 1411 { 1412 struct irq_data *irq_data; 1413 struct irq_domain *parent; 1414 int i; 1415 1416 /* The outermost irq_data is embedded in struct irq_desc */ 1417 for (i = 0; i < nr_irqs; i++) { 1418 irq_data = irq_get_irq_data(virq + i); 1419 irq_data->domain = domain; 1420 1421 for (parent = domain->parent; parent; parent = parent->parent) { 1422 irq_data = irq_domain_insert_irq_data(parent, irq_data); 1423 if (!irq_data) { 1424 irq_domain_free_irq_data(virq, i + 1); 1425 return -ENOMEM; 1426 } 1427 } 1428 } 1429 1430 return 0; 1431 } 1432 1433 /** 1434 * irq_domain_get_irq_data - Get irq_data associated with @virq and @domain 1435 * @domain: domain to match 1436 * @virq: IRQ number to get irq_data 1437 */ 1438 struct irq_data *irq_domain_get_irq_data(struct irq_domain *domain, 1439 unsigned int virq) 1440 { 1441 struct irq_data *irq_data; 1442 1443 for (irq_data = irq_get_irq_data(virq); irq_data; 1444 irq_data = irq_data->parent_data) 1445 if (irq_data->domain == domain) 1446 return irq_data; 1447 1448 return NULL; 1449 } 1450 EXPORT_SYMBOL_GPL(irq_domain_get_irq_data); 1451 1452 /** 1453 * irq_domain_set_hwirq_and_chip - Set hwirq and irqchip of @virq at @domain 1454 * @domain: Interrupt domain to match 1455 * @virq: IRQ number 1456 * @hwirq: The hwirq number 1457 * @chip: The associated interrupt chip 1458 * @chip_data: The associated chip data 1459 */ 1460 int irq_domain_set_hwirq_and_chip(struct irq_domain *domain, unsigned int virq, 1461 irq_hw_number_t hwirq, 1462 const struct irq_chip *chip, 1463 void *chip_data) 1464 { 1465 struct irq_data *irq_data = irq_domain_get_irq_data(domain, virq); 1466 1467 if (!irq_data) 1468 return -ENOENT; 1469 1470 irq_data->hwirq = hwirq; 1471 irq_data->chip = (struct irq_chip *)(chip ? chip : &no_irq_chip); 1472 irq_data->chip_data = chip_data; 1473 1474 return 0; 1475 } 1476 EXPORT_SYMBOL_GPL(irq_domain_set_hwirq_and_chip); 1477 1478 /** 1479 * irq_domain_set_info - Set the complete data for a @virq in @domain 1480 * @domain: Interrupt domain to match 1481 * @virq: IRQ number 1482 * @hwirq: The hardware interrupt number 1483 * @chip: The associated interrupt chip 1484 * @chip_data: The associated interrupt chip data 1485 * @handler: The interrupt flow handler 1486 * @handler_data: The interrupt flow handler data 1487 * @handler_name: The interrupt handler name 1488 */ 1489 void irq_domain_set_info(struct irq_domain *domain, unsigned int virq, 1490 irq_hw_number_t hwirq, const struct irq_chip *chip, 1491 void *chip_data, irq_flow_handler_t handler, 1492 void *handler_data, const char *handler_name) 1493 { 1494 irq_domain_set_hwirq_and_chip(domain, virq, hwirq, chip, chip_data); 1495 __irq_set_handler(virq, handler, 0, handler_name); 1496 irq_set_handler_data(virq, handler_data); 1497 } 1498 EXPORT_SYMBOL(irq_domain_set_info); 1499 1500 /** 1501 * irq_domain_free_irqs_common - Clear irq_data and free the parent 1502 * @domain: Interrupt domain to match 1503 * @virq: IRQ number to start with 1504 * @nr_irqs: The number of irqs to free 1505 */ 1506 void irq_domain_free_irqs_common(struct irq_domain *domain, unsigned int virq, 1507 unsigned int nr_irqs) 1508 { 1509 struct irq_data *irq_data; 1510 int i; 1511 1512 for (i = 0; i < nr_irqs; i++) { 1513 irq_data = irq_domain_get_irq_data(domain, virq + i); 1514 if (irq_data) 1515 irq_domain_reset_irq_data(irq_data); 1516 } 1517 irq_domain_free_irqs_parent(domain, virq, nr_irqs); 1518 } 1519 EXPORT_SYMBOL_GPL(irq_domain_free_irqs_common); 1520 1521 /** 1522 * irq_domain_free_irqs_top - Clear handler and handler data, clear irqdata and free parent 1523 * @domain: Interrupt domain to match 1524 * @virq: IRQ number to start with 1525 * @nr_irqs: The number of irqs to free 1526 */ 1527 void irq_domain_free_irqs_top(struct irq_domain *domain, unsigned int virq, 1528 unsigned int nr_irqs) 1529 { 1530 int i; 1531 1532 for (i = 0; i < nr_irqs; i++) { 1533 irq_set_handler_data(virq + i, NULL); 1534 irq_set_handler(virq + i, NULL); 1535 } 1536 irq_domain_free_irqs_common(domain, virq, nr_irqs); 1537 } 1538 1539 static void irq_domain_free_irqs_hierarchy(struct irq_domain *domain, 1540 unsigned int irq_base, 1541 unsigned int nr_irqs) 1542 { 1543 unsigned int i; 1544 1545 if (!domain->ops->free) 1546 return; 1547 1548 for (i = 0; i < nr_irqs; i++) { 1549 if (irq_domain_get_irq_data(domain, irq_base + i)) 1550 domain->ops->free(domain, irq_base + i, 1); 1551 } 1552 } 1553 1554 int irq_domain_alloc_irqs_hierarchy(struct irq_domain *domain, 1555 unsigned int irq_base, 1556 unsigned int nr_irqs, void *arg) 1557 { 1558 if (!domain->ops->alloc) { 1559 pr_debug("domain->ops->alloc() is NULL\n"); 1560 return -ENOSYS; 1561 } 1562 1563 return domain->ops->alloc(domain, irq_base, nr_irqs, arg); 1564 } 1565 1566 static int irq_domain_alloc_irqs_locked(struct irq_domain *domain, int irq_base, 1567 unsigned int nr_irqs, int node, void *arg, 1568 bool realloc, const struct irq_affinity_desc *affinity) 1569 { 1570 int i, ret, virq; 1571 1572 if (realloc && irq_base >= 0) { 1573 virq = irq_base; 1574 } else { 1575 virq = irq_domain_alloc_descs(irq_base, nr_irqs, 0, node, 1576 affinity); 1577 if (virq < 0) { 1578 pr_debug("cannot allocate IRQ(base %d, count %d)\n", 1579 irq_base, nr_irqs); 1580 return virq; 1581 } 1582 } 1583 1584 if (irq_domain_alloc_irq_data(domain, virq, nr_irqs)) { 1585 pr_debug("cannot allocate memory for IRQ%d\n", virq); 1586 ret = -ENOMEM; 1587 goto out_free_desc; 1588 } 1589 1590 ret = irq_domain_alloc_irqs_hierarchy(domain, virq, nr_irqs, arg); 1591 if (ret < 0) 1592 goto out_free_irq_data; 1593 1594 for (i = 0; i < nr_irqs; i++) { 1595 ret = irq_domain_trim_hierarchy(virq + i); 1596 if (ret) 1597 goto out_free_irq_data; 1598 } 1599 1600 for (i = 0; i < nr_irqs; i++) 1601 irq_domain_insert_irq(virq + i); 1602 1603 return virq; 1604 1605 out_free_irq_data: 1606 irq_domain_free_irq_data(virq, nr_irqs); 1607 out_free_desc: 1608 irq_free_descs(virq, nr_irqs); 1609 return ret; 1610 } 1611 1612 /** 1613 * __irq_domain_alloc_irqs - Allocate IRQs from domain 1614 * @domain: domain to allocate from 1615 * @irq_base: allocate specified IRQ number if irq_base >= 0 1616 * @nr_irqs: number of IRQs to allocate 1617 * @node: NUMA node id for memory allocation 1618 * @arg: domain specific argument 1619 * @realloc: IRQ descriptors have already been allocated if true 1620 * @affinity: Optional irq affinity mask for multiqueue devices 1621 * 1622 * Allocate IRQ numbers and initialized all data structures to support 1623 * hierarchy IRQ domains. 1624 * Parameter @realloc is mainly to support legacy IRQs. 1625 * Returns error code or allocated IRQ number 1626 * 1627 * The whole process to setup an IRQ has been split into two steps. 1628 * The first step, __irq_domain_alloc_irqs(), is to allocate IRQ 1629 * descriptor and required hardware resources. The second step, 1630 * irq_domain_activate_irq(), is to program the hardware with preallocated 1631 * resources. In this way, it's easier to rollback when failing to 1632 * allocate resources. 1633 */ 1634 int __irq_domain_alloc_irqs(struct irq_domain *domain, int irq_base, 1635 unsigned int nr_irqs, int node, void *arg, 1636 bool realloc, const struct irq_affinity_desc *affinity) 1637 { 1638 int ret; 1639 1640 if (domain == NULL) { 1641 domain = irq_default_domain; 1642 if (WARN(!domain, "domain is NULL; cannot allocate IRQ\n")) 1643 return -EINVAL; 1644 } 1645 1646 mutex_lock(&domain->root->mutex); 1647 ret = irq_domain_alloc_irqs_locked(domain, irq_base, nr_irqs, node, arg, 1648 realloc, affinity); 1649 mutex_unlock(&domain->root->mutex); 1650 1651 return ret; 1652 } 1653 EXPORT_SYMBOL_GPL(__irq_domain_alloc_irqs); 1654 1655 /* The irq_data was moved, fix the revmap to refer to the new location */ 1656 static void irq_domain_fix_revmap(struct irq_data *d) 1657 { 1658 void __rcu **slot; 1659 1660 lockdep_assert_held(&d->domain->root->mutex); 1661 1662 if (irq_domain_is_nomap(d->domain)) 1663 return; 1664 1665 /* Fix up the revmap. */ 1666 if (d->hwirq < d->domain->revmap_size) { 1667 /* Not using radix tree */ 1668 rcu_assign_pointer(d->domain->revmap[d->hwirq], d); 1669 } else { 1670 slot = radix_tree_lookup_slot(&d->domain->revmap_tree, d->hwirq); 1671 if (slot) 1672 radix_tree_replace_slot(&d->domain->revmap_tree, slot, d); 1673 } 1674 } 1675 1676 /** 1677 * irq_domain_push_irq() - Push a domain in to the top of a hierarchy. 1678 * @domain: Domain to push. 1679 * @virq: Irq to push the domain in to. 1680 * @arg: Passed to the irq_domain_ops alloc() function. 1681 * 1682 * For an already existing irqdomain hierarchy, as might be obtained 1683 * via a call to pci_enable_msix(), add an additional domain to the 1684 * head of the processing chain. Must be called before request_irq() 1685 * has been called. 1686 */ 1687 int irq_domain_push_irq(struct irq_domain *domain, int virq, void *arg) 1688 { 1689 struct irq_data *irq_data = irq_get_irq_data(virq); 1690 struct irq_data *parent_irq_data; 1691 struct irq_desc *desc; 1692 int rv = 0; 1693 1694 /* 1695 * Check that no action has been set, which indicates the virq 1696 * is in a state where this function doesn't have to deal with 1697 * races between interrupt handling and maintaining the 1698 * hierarchy. This will catch gross misuse. Attempting to 1699 * make the check race free would require holding locks across 1700 * calls to struct irq_domain_ops->alloc(), which could lead 1701 * to deadlock, so we just do a simple check before starting. 1702 */ 1703 desc = irq_to_desc(virq); 1704 if (!desc) 1705 return -EINVAL; 1706 if (WARN_ON(desc->action)) 1707 return -EBUSY; 1708 1709 if (domain == NULL) 1710 return -EINVAL; 1711 1712 if (WARN_ON(!irq_domain_is_hierarchy(domain))) 1713 return -EINVAL; 1714 1715 if (!irq_data) 1716 return -EINVAL; 1717 1718 if (domain->parent != irq_data->domain) 1719 return -EINVAL; 1720 1721 parent_irq_data = kzalloc_node(sizeof(*parent_irq_data), GFP_KERNEL, 1722 irq_data_get_node(irq_data)); 1723 if (!parent_irq_data) 1724 return -ENOMEM; 1725 1726 mutex_lock(&domain->root->mutex); 1727 1728 /* Copy the original irq_data. */ 1729 *parent_irq_data = *irq_data; 1730 1731 /* 1732 * Overwrite the irq_data, which is embedded in struct irq_desc, with 1733 * values for this domain. 1734 */ 1735 irq_data->parent_data = parent_irq_data; 1736 irq_data->domain = domain; 1737 irq_data->mask = 0; 1738 irq_data->hwirq = 0; 1739 irq_data->chip = NULL; 1740 irq_data->chip_data = NULL; 1741 1742 /* May (probably does) set hwirq, chip, etc. */ 1743 rv = irq_domain_alloc_irqs_hierarchy(domain, virq, 1, arg); 1744 if (rv) { 1745 /* Restore the original irq_data. */ 1746 *irq_data = *parent_irq_data; 1747 kfree(parent_irq_data); 1748 goto error; 1749 } 1750 1751 irq_domain_fix_revmap(parent_irq_data); 1752 irq_domain_set_mapping(domain, irq_data->hwirq, irq_data); 1753 error: 1754 mutex_unlock(&domain->root->mutex); 1755 1756 return rv; 1757 } 1758 EXPORT_SYMBOL_GPL(irq_domain_push_irq); 1759 1760 /** 1761 * irq_domain_pop_irq() - Remove a domain from the top of a hierarchy. 1762 * @domain: Domain to remove. 1763 * @virq: Irq to remove the domain from. 1764 * 1765 * Undo the effects of a call to irq_domain_push_irq(). Must be 1766 * called either before request_irq() or after free_irq(). 1767 */ 1768 int irq_domain_pop_irq(struct irq_domain *domain, int virq) 1769 { 1770 struct irq_data *irq_data = irq_get_irq_data(virq); 1771 struct irq_data *parent_irq_data; 1772 struct irq_data *tmp_irq_data; 1773 struct irq_desc *desc; 1774 1775 /* 1776 * Check that no action is set, which indicates the virq is in 1777 * a state where this function doesn't have to deal with races 1778 * between interrupt handling and maintaining the hierarchy. 1779 * This will catch gross misuse. Attempting to make the check 1780 * race free would require holding locks across calls to 1781 * struct irq_domain_ops->free(), which could lead to 1782 * deadlock, so we just do a simple check before starting. 1783 */ 1784 desc = irq_to_desc(virq); 1785 if (!desc) 1786 return -EINVAL; 1787 if (WARN_ON(desc->action)) 1788 return -EBUSY; 1789 1790 if (domain == NULL) 1791 return -EINVAL; 1792 1793 if (!irq_data) 1794 return -EINVAL; 1795 1796 tmp_irq_data = irq_domain_get_irq_data(domain, virq); 1797 1798 /* We can only "pop" if this domain is at the top of the list */ 1799 if (WARN_ON(irq_data != tmp_irq_data)) 1800 return -EINVAL; 1801 1802 if (WARN_ON(irq_data->domain != domain)) 1803 return -EINVAL; 1804 1805 parent_irq_data = irq_data->parent_data; 1806 if (WARN_ON(!parent_irq_data)) 1807 return -EINVAL; 1808 1809 mutex_lock(&domain->root->mutex); 1810 1811 irq_data->parent_data = NULL; 1812 1813 irq_domain_clear_mapping(domain, irq_data->hwirq); 1814 irq_domain_free_irqs_hierarchy(domain, virq, 1); 1815 1816 /* Restore the original irq_data. */ 1817 *irq_data = *parent_irq_data; 1818 1819 irq_domain_fix_revmap(irq_data); 1820 1821 mutex_unlock(&domain->root->mutex); 1822 1823 kfree(parent_irq_data); 1824 1825 return 0; 1826 } 1827 EXPORT_SYMBOL_GPL(irq_domain_pop_irq); 1828 1829 /** 1830 * irq_domain_free_irqs - Free IRQ number and associated data structures 1831 * @virq: base IRQ number 1832 * @nr_irqs: number of IRQs to free 1833 */ 1834 void irq_domain_free_irqs(unsigned int virq, unsigned int nr_irqs) 1835 { 1836 struct irq_data *data = irq_get_irq_data(virq); 1837 struct irq_domain *domain; 1838 int i; 1839 1840 if (WARN(!data || !data->domain || !data->domain->ops->free, 1841 "NULL pointer, cannot free irq\n")) 1842 return; 1843 1844 domain = data->domain; 1845 1846 mutex_lock(&domain->root->mutex); 1847 for (i = 0; i < nr_irqs; i++) 1848 irq_domain_remove_irq(virq + i); 1849 irq_domain_free_irqs_hierarchy(domain, virq, nr_irqs); 1850 mutex_unlock(&domain->root->mutex); 1851 1852 irq_domain_free_irq_data(virq, nr_irqs); 1853 irq_free_descs(virq, nr_irqs); 1854 } 1855 1856 static void irq_domain_free_one_irq(struct irq_domain *domain, unsigned int virq) 1857 { 1858 if (irq_domain_is_msi_device(domain)) 1859 msi_device_domain_free_wired(domain, virq); 1860 else 1861 irq_domain_free_irqs(virq, 1); 1862 } 1863 1864 /** 1865 * irq_domain_alloc_irqs_parent - Allocate interrupts from parent domain 1866 * @domain: Domain below which interrupts must be allocated 1867 * @irq_base: Base IRQ number 1868 * @nr_irqs: Number of IRQs to allocate 1869 * @arg: Allocation data (arch/domain specific) 1870 */ 1871 int irq_domain_alloc_irqs_parent(struct irq_domain *domain, 1872 unsigned int irq_base, unsigned int nr_irqs, 1873 void *arg) 1874 { 1875 if (!domain->parent) 1876 return -ENOSYS; 1877 1878 return irq_domain_alloc_irqs_hierarchy(domain->parent, irq_base, 1879 nr_irqs, arg); 1880 } 1881 EXPORT_SYMBOL_GPL(irq_domain_alloc_irqs_parent); 1882 1883 /** 1884 * irq_domain_free_irqs_parent - Free interrupts from parent domain 1885 * @domain: Domain below which interrupts must be freed 1886 * @irq_base: Base IRQ number 1887 * @nr_irqs: Number of IRQs to free 1888 */ 1889 void irq_domain_free_irqs_parent(struct irq_domain *domain, 1890 unsigned int irq_base, unsigned int nr_irqs) 1891 { 1892 if (!domain->parent) 1893 return; 1894 1895 irq_domain_free_irqs_hierarchy(domain->parent, irq_base, nr_irqs); 1896 } 1897 EXPORT_SYMBOL_GPL(irq_domain_free_irqs_parent); 1898 1899 static void __irq_domain_deactivate_irq(struct irq_data *irq_data) 1900 { 1901 if (irq_data && irq_data->domain) { 1902 struct irq_domain *domain = irq_data->domain; 1903 1904 if (domain->ops->deactivate) 1905 domain->ops->deactivate(domain, irq_data); 1906 if (irq_data->parent_data) 1907 __irq_domain_deactivate_irq(irq_data->parent_data); 1908 } 1909 } 1910 1911 static int __irq_domain_activate_irq(struct irq_data *irqd, bool reserve) 1912 { 1913 int ret = 0; 1914 1915 if (irqd && irqd->domain) { 1916 struct irq_domain *domain = irqd->domain; 1917 1918 if (irqd->parent_data) 1919 ret = __irq_domain_activate_irq(irqd->parent_data, 1920 reserve); 1921 if (!ret && domain->ops->activate) { 1922 ret = domain->ops->activate(domain, irqd, reserve); 1923 /* Rollback in case of error */ 1924 if (ret && irqd->parent_data) 1925 __irq_domain_deactivate_irq(irqd->parent_data); 1926 } 1927 } 1928 return ret; 1929 } 1930 1931 /** 1932 * irq_domain_activate_irq - Call domain_ops->activate recursively to activate 1933 * interrupt 1934 * @irq_data: Outermost irq_data associated with interrupt 1935 * @reserve: If set only reserve an interrupt vector instead of assigning one 1936 * 1937 * This is the second step to call domain_ops->activate to program interrupt 1938 * controllers, so the interrupt could actually get delivered. 1939 */ 1940 int irq_domain_activate_irq(struct irq_data *irq_data, bool reserve) 1941 { 1942 int ret = 0; 1943 1944 if (!irqd_is_activated(irq_data)) 1945 ret = __irq_domain_activate_irq(irq_data, reserve); 1946 if (!ret) 1947 irqd_set_activated(irq_data); 1948 return ret; 1949 } 1950 1951 /** 1952 * irq_domain_deactivate_irq - Call domain_ops->deactivate recursively to 1953 * deactivate interrupt 1954 * @irq_data: outermost irq_data associated with interrupt 1955 * 1956 * It calls domain_ops->deactivate to program interrupt controllers to disable 1957 * interrupt delivery. 1958 */ 1959 void irq_domain_deactivate_irq(struct irq_data *irq_data) 1960 { 1961 if (irqd_is_activated(irq_data)) { 1962 __irq_domain_deactivate_irq(irq_data); 1963 irqd_clr_activated(irq_data); 1964 } 1965 } 1966 1967 static void irq_domain_check_hierarchy(struct irq_domain *domain) 1968 { 1969 /* Hierarchy irq_domains must implement callback alloc() */ 1970 if (domain->ops->alloc) 1971 domain->flags |= IRQ_DOMAIN_FLAG_HIERARCHY; 1972 } 1973 #else /* CONFIG_IRQ_DOMAIN_HIERARCHY */ 1974 /** 1975 * irq_domain_get_irq_data - Get irq_data associated with @virq and @domain 1976 * @domain: domain to match 1977 * @virq: IRQ number to get irq_data 1978 */ 1979 struct irq_data *irq_domain_get_irq_data(struct irq_domain *domain, 1980 unsigned int virq) 1981 { 1982 struct irq_data *irq_data = irq_get_irq_data(virq); 1983 1984 return (irq_data && irq_data->domain == domain) ? irq_data : NULL; 1985 } 1986 EXPORT_SYMBOL_GPL(irq_domain_get_irq_data); 1987 1988 /** 1989 * irq_domain_set_info - Set the complete data for a @virq in @domain 1990 * @domain: Interrupt domain to match 1991 * @virq: IRQ number 1992 * @hwirq: The hardware interrupt number 1993 * @chip: The associated interrupt chip 1994 * @chip_data: The associated interrupt chip data 1995 * @handler: The interrupt flow handler 1996 * @handler_data: The interrupt flow handler data 1997 * @handler_name: The interrupt handler name 1998 */ 1999 void irq_domain_set_info(struct irq_domain *domain, unsigned int virq, 2000 irq_hw_number_t hwirq, const struct irq_chip *chip, 2001 void *chip_data, irq_flow_handler_t handler, 2002 void *handler_data, const char *handler_name) 2003 { 2004 irq_set_chip_and_handler_name(virq, chip, handler, handler_name); 2005 irq_set_chip_data(virq, chip_data); 2006 irq_set_handler_data(virq, handler_data); 2007 } 2008 2009 static int irq_domain_alloc_irqs_locked(struct irq_domain *domain, int irq_base, 2010 unsigned int nr_irqs, int node, void *arg, 2011 bool realloc, const struct irq_affinity_desc *affinity) 2012 { 2013 return -EINVAL; 2014 } 2015 2016 static void irq_domain_check_hierarchy(struct irq_domain *domain) { } 2017 static void irq_domain_free_one_irq(struct irq_domain *domain, unsigned int virq) { } 2018 2019 #endif /* CONFIG_IRQ_DOMAIN_HIERARCHY */ 2020 2021 #ifdef CONFIG_GENERIC_IRQ_DEBUGFS 2022 #include "internals.h" 2023 2024 static struct dentry *domain_dir; 2025 2026 static const struct irq_bit_descr irqdomain_flags[] = { 2027 BIT_MASK_DESCR(IRQ_DOMAIN_FLAG_HIERARCHY), 2028 BIT_MASK_DESCR(IRQ_DOMAIN_NAME_ALLOCATED), 2029 BIT_MASK_DESCR(IRQ_DOMAIN_FLAG_IPI_PER_CPU), 2030 BIT_MASK_DESCR(IRQ_DOMAIN_FLAG_IPI_SINGLE), 2031 BIT_MASK_DESCR(IRQ_DOMAIN_FLAG_MSI), 2032 BIT_MASK_DESCR(IRQ_DOMAIN_FLAG_ISOLATED_MSI), 2033 BIT_MASK_DESCR(IRQ_DOMAIN_FLAG_NO_MAP), 2034 BIT_MASK_DESCR(IRQ_DOMAIN_FLAG_MSI_PARENT), 2035 BIT_MASK_DESCR(IRQ_DOMAIN_FLAG_MSI_DEVICE), 2036 BIT_MASK_DESCR(IRQ_DOMAIN_FLAG_NONCORE), 2037 }; 2038 2039 static void irq_domain_debug_show_one(struct seq_file *m, struct irq_domain *d, int ind) 2040 { 2041 seq_printf(m, "%*sname: %s\n", ind, "", d->name); 2042 seq_printf(m, "%*ssize: %u\n", ind + 1, "", d->revmap_size); 2043 seq_printf(m, "%*smapped: %u\n", ind + 1, "", d->mapcount); 2044 seq_printf(m, "%*sflags: 0x%08x\n", ind +1 , "", d->flags); 2045 irq_debug_show_bits(m, ind, d->flags, irqdomain_flags, ARRAY_SIZE(irqdomain_flags)); 2046 if (d->ops && d->ops->debug_show) 2047 d->ops->debug_show(m, d, NULL, ind + 1); 2048 #ifdef CONFIG_IRQ_DOMAIN_HIERARCHY 2049 if (!d->parent) 2050 return; 2051 seq_printf(m, "%*sparent: %s\n", ind + 1, "", d->parent->name); 2052 irq_domain_debug_show_one(m, d->parent, ind + 4); 2053 #endif 2054 } 2055 2056 static int irq_domain_debug_show(struct seq_file *m, void *p) 2057 { 2058 struct irq_domain *d = m->private; 2059 2060 /* Default domain? Might be NULL */ 2061 if (!d) { 2062 if (!irq_default_domain) 2063 return 0; 2064 d = irq_default_domain; 2065 } 2066 irq_domain_debug_show_one(m, d, 0); 2067 return 0; 2068 } 2069 DEFINE_SHOW_ATTRIBUTE(irq_domain_debug); 2070 2071 static void debugfs_add_domain_dir(struct irq_domain *d) 2072 { 2073 if (!d->name || !domain_dir) 2074 return; 2075 debugfs_create_file(d->name, 0444, domain_dir, d, 2076 &irq_domain_debug_fops); 2077 } 2078 2079 static void debugfs_remove_domain_dir(struct irq_domain *d) 2080 { 2081 debugfs_lookup_and_remove(d->name, domain_dir); 2082 } 2083 2084 void __init irq_domain_debugfs_init(struct dentry *root) 2085 { 2086 struct irq_domain *d; 2087 2088 domain_dir = debugfs_create_dir("domains", root); 2089 2090 debugfs_create_file("default", 0444, domain_dir, NULL, 2091 &irq_domain_debug_fops); 2092 mutex_lock(&irq_domain_mutex); 2093 list_for_each_entry(d, &irq_domain_list, link) 2094 debugfs_add_domain_dir(d); 2095 mutex_unlock(&irq_domain_mutex); 2096 } 2097 #endif 2098
Linux® is a registered trademark of Linus Torvalds in the United States and other countries.
TOMOYO® is a registered trademark of NTT DATA CORPORATION.