Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

Merge branch 'pci/msi' into next

* pci/msi:
PCI/MSI: Use dev_printk() when possible
of/pci: Remove unused MSI controller helpers
PCI: mvebu: Remove useless MSI enabling code
PCI: aardvark: Move to MSI handling using generic MSI support
PCI/MSI: Make pci_msi_shutdown() and pci_msix_shutdown() static
PCI/MSI: Stop disabling MSI/MSI-X in pci_device_shutdown()

+82 -198
-45
drivers/of/of_pci.c
··· 285 285 EXPORT_SYMBOL_GPL(of_pci_get_host_bridge_resources); 286 286 #endif /* CONFIG_OF_ADDRESS */ 287 287 288 - #ifdef CONFIG_PCI_MSI 289 - 290 - static LIST_HEAD(of_pci_msi_chip_list); 291 - static DEFINE_MUTEX(of_pci_msi_chip_mutex); 292 - 293 - int of_pci_msi_chip_add(struct msi_controller *chip) 294 - { 295 - if (!of_property_read_bool(chip->of_node, "msi-controller")) 296 - return -EINVAL; 297 - 298 - mutex_lock(&of_pci_msi_chip_mutex); 299 - list_add(&chip->list, &of_pci_msi_chip_list); 300 - mutex_unlock(&of_pci_msi_chip_mutex); 301 - 302 - return 0; 303 - } 304 - EXPORT_SYMBOL_GPL(of_pci_msi_chip_add); 305 - 306 - void of_pci_msi_chip_remove(struct msi_controller *chip) 307 - { 308 - mutex_lock(&of_pci_msi_chip_mutex); 309 - list_del(&chip->list); 310 - mutex_unlock(&of_pci_msi_chip_mutex); 311 - } 312 - EXPORT_SYMBOL_GPL(of_pci_msi_chip_remove); 313 - 314 - struct msi_controller *of_pci_find_msi_chip_by_node(struct device_node *of_node) 315 - { 316 - struct msi_controller *c; 317 - 318 - mutex_lock(&of_pci_msi_chip_mutex); 319 - list_for_each_entry(c, &of_pci_msi_chip_list, list) { 320 - if (c->of_node == of_node) { 321 - mutex_unlock(&of_pci_msi_chip_mutex); 322 - return c; 323 - } 324 - } 325 - mutex_unlock(&of_pci_msi_chip_mutex); 326 - 327 - return NULL; 328 - } 329 - EXPORT_SYMBOL_GPL(of_pci_find_msi_chip_by_node); 330 - 331 - #endif /* CONFIG_PCI_MSI */ 332 - 333 288 /** 334 289 * of_pci_map_rid - Translate a requester ID through a downstream mapping. 335 290 * @np: root complex device node.
+76 -115
drivers/pci/host/pci-aardvark.c
··· 200 200 struct list_head resources; 201 201 struct irq_domain *irq_domain; 202 202 struct irq_chip irq_chip; 203 - struct msi_controller msi; 204 203 struct irq_domain *msi_domain; 204 + struct irq_domain *msi_inner_domain; 205 + struct irq_chip msi_bottom_irq_chip; 205 206 struct irq_chip msi_irq_chip; 206 - DECLARE_BITMAP(msi_irq_in_use, MSI_IRQ_NUM); 207 + struct msi_domain_info msi_domain_info; 208 + DECLARE_BITMAP(msi_used, MSI_IRQ_NUM); 207 209 struct mutex msi_used_lock; 208 210 u16 msi_msg; 209 211 int root_bus_nr; ··· 547 545 .write = advk_pcie_wr_conf, 548 546 }; 549 547 550 - static int advk_pcie_alloc_msi(struct advk_pcie *pcie) 548 + static void advk_msi_irq_compose_msi_msg(struct irq_data *data, 549 + struct msi_msg *msg) 551 550 { 552 - int hwirq; 551 + struct advk_pcie *pcie = irq_data_get_irq_chip_data(data); 552 + phys_addr_t msi_msg = virt_to_phys(&pcie->msi_msg); 553 + 554 + msg->address_lo = lower_32_bits(msi_msg); 555 + msg->address_hi = upper_32_bits(msi_msg); 556 + msg->data = data->irq; 557 + } 558 + 559 + static int advk_msi_set_affinity(struct irq_data *irq_data, 560 + const struct cpumask *mask, bool force) 561 + { 562 + return -EINVAL; 563 + } 564 + 565 + static int advk_msi_irq_domain_alloc(struct irq_domain *domain, 566 + unsigned int virq, 567 + unsigned int nr_irqs, void *args) 568 + { 569 + struct advk_pcie *pcie = domain->host_data; 570 + int hwirq, i; 553 571 554 572 mutex_lock(&pcie->msi_used_lock); 555 - hwirq = find_first_zero_bit(pcie->msi_irq_in_use, MSI_IRQ_NUM); 556 - if (hwirq >= MSI_IRQ_NUM) 557 - hwirq = -ENOSPC; 558 - else 559 - set_bit(hwirq, pcie->msi_irq_in_use); 573 + hwirq = bitmap_find_next_zero_area(pcie->msi_used, MSI_IRQ_NUM, 574 + 0, nr_irqs, 0); 575 + if (hwirq >= MSI_IRQ_NUM) { 576 + mutex_unlock(&pcie->msi_used_lock); 577 + return -ENOSPC; 578 + } 579 + 580 + bitmap_set(pcie->msi_used, hwirq, nr_irqs); 560 581 mutex_unlock(&pcie->msi_used_lock); 582 + 583 + for (i = 0; i < nr_irqs; i++) 584 + irq_domain_set_info(domain, virq + i, hwirq + i, 585 + &pcie->msi_bottom_irq_chip, 586 + domain->host_data, handle_simple_irq, 587 + NULL, NULL); 561 588 562 589 return hwirq; 563 590 } 564 591 565 - static void advk_pcie_free_msi(struct advk_pcie *pcie, int hwirq) 592 + static void advk_msi_irq_domain_free(struct irq_domain *domain, 593 + unsigned int virq, unsigned int nr_irqs) 566 594 { 567 - struct device *dev = &pcie->pdev->dev; 595 + struct irq_data *d = irq_domain_get_irq_data(domain, virq); 596 + struct advk_pcie *pcie = domain->host_data; 568 597 569 598 mutex_lock(&pcie->msi_used_lock); 570 - if (!test_bit(hwirq, pcie->msi_irq_in_use)) 571 - dev_err(dev, "trying to free unused MSI#%d\n", hwirq); 572 - else 573 - clear_bit(hwirq, pcie->msi_irq_in_use); 599 + bitmap_clear(pcie->msi_used, d->hwirq, nr_irqs); 574 600 mutex_unlock(&pcie->msi_used_lock); 575 601 } 576 602 577 - static int advk_pcie_setup_msi_irq(struct msi_controller *chip, 578 - struct pci_dev *pdev, 579 - struct msi_desc *desc) 580 - { 581 - struct advk_pcie *pcie = pdev->bus->sysdata; 582 - struct msi_msg msg; 583 - int virq, hwirq; 584 - phys_addr_t msi_msg_phys; 585 - 586 - /* We support MSI, but not MSI-X */ 587 - if (desc->msi_attrib.is_msix) 588 - return -EINVAL; 589 - 590 - hwirq = advk_pcie_alloc_msi(pcie); 591 - if (hwirq < 0) 592 - return hwirq; 593 - 594 - virq = irq_create_mapping(pcie->msi_domain, hwirq); 595 - if (!virq) { 596 - advk_pcie_free_msi(pcie, hwirq); 597 - return -EINVAL; 598 - } 599 - 600 - irq_set_msi_desc(virq, desc); 601 - 602 - msi_msg_phys = virt_to_phys(&pcie->msi_msg); 603 - 604 - msg.address_lo = lower_32_bits(msi_msg_phys); 605 - msg.address_hi = upper_32_bits(msi_msg_phys); 606 - msg.data = virq; 607 - 608 - pci_write_msi_msg(virq, &msg); 609 - 610 - return 0; 611 - } 612 - 613 - static void advk_pcie_teardown_msi_irq(struct msi_controller *chip, 614 - unsigned int irq) 615 - { 616 - struct irq_data *d = irq_get_irq_data(irq); 617 - struct msi_desc *msi = irq_data_get_msi_desc(d); 618 - struct advk_pcie *pcie = msi_desc_to_pci_sysdata(msi); 619 - unsigned long hwirq = d->hwirq; 620 - 621 - irq_dispose_mapping(irq); 622 - advk_pcie_free_msi(pcie, hwirq); 623 - } 624 - 625 - static int advk_pcie_msi_map(struct irq_domain *domain, 626 - unsigned int virq, irq_hw_number_t hw) 627 - { 628 - struct advk_pcie *pcie = domain->host_data; 629 - 630 - irq_set_chip_and_handler(virq, &pcie->msi_irq_chip, 631 - handle_simple_irq); 632 - 633 - return 0; 634 - } 635 - 636 - static const struct irq_domain_ops advk_pcie_msi_irq_ops = { 637 - .map = advk_pcie_msi_map, 603 + static const struct irq_domain_ops advk_msi_domain_ops = { 604 + .alloc = advk_msi_irq_domain_alloc, 605 + .free = advk_msi_irq_domain_free, 638 606 }; 639 607 640 608 static void advk_pcie_irq_mask(struct irq_data *d) ··· 652 680 { 653 681 struct device *dev = &pcie->pdev->dev; 654 682 struct device_node *node = dev->of_node; 655 - struct irq_chip *msi_irq_chip; 656 - struct msi_controller *msi; 683 + struct irq_chip *bottom_ic, *msi_ic; 684 + struct msi_domain_info *msi_di; 657 685 phys_addr_t msi_msg_phys; 658 - int ret; 659 - 660 - msi_irq_chip = &pcie->msi_irq_chip; 661 - 662 - msi_irq_chip->name = devm_kasprintf(dev, GFP_KERNEL, "%s-msi", 663 - dev_name(dev)); 664 - if (!msi_irq_chip->name) 665 - return -ENOMEM; 666 - 667 - msi_irq_chip->irq_enable = pci_msi_unmask_irq; 668 - msi_irq_chip->irq_disable = pci_msi_mask_irq; 669 - msi_irq_chip->irq_mask = pci_msi_mask_irq; 670 - msi_irq_chip->irq_unmask = pci_msi_unmask_irq; 671 - 672 - msi = &pcie->msi; 673 - 674 - msi->setup_irq = advk_pcie_setup_msi_irq; 675 - msi->teardown_irq = advk_pcie_teardown_msi_irq; 676 - msi->of_node = node; 677 686 678 687 mutex_init(&pcie->msi_used_lock); 688 + 689 + bottom_ic = &pcie->msi_bottom_irq_chip; 690 + 691 + bottom_ic->name = "MSI"; 692 + bottom_ic->irq_compose_msi_msg = advk_msi_irq_compose_msi_msg; 693 + bottom_ic->irq_set_affinity = advk_msi_set_affinity; 694 + 695 + msi_ic = &pcie->msi_irq_chip; 696 + msi_ic->name = "advk-MSI"; 697 + 698 + msi_di = &pcie->msi_domain_info; 699 + msi_di->flags = MSI_FLAG_USE_DEF_DOM_OPS | MSI_FLAG_USE_DEF_CHIP_OPS | 700 + MSI_FLAG_MULTI_PCI_MSI; 701 + msi_di->chip = msi_ic; 679 702 680 703 msi_msg_phys = virt_to_phys(&pcie->msi_msg); 681 704 ··· 679 712 advk_writel(pcie, upper_32_bits(msi_msg_phys), 680 713 PCIE_MSI_ADDR_HIGH_REG); 681 714 682 - pcie->msi_domain = 715 + pcie->msi_inner_domain = 683 716 irq_domain_add_linear(NULL, MSI_IRQ_NUM, 684 - &advk_pcie_msi_irq_ops, pcie); 685 - if (!pcie->msi_domain) 717 + &advk_msi_domain_ops, pcie); 718 + if (!pcie->msi_inner_domain) 686 719 return -ENOMEM; 687 720 688 - ret = of_pci_msi_chip_add(msi); 689 - if (ret < 0) { 690 - irq_domain_remove(pcie->msi_domain); 691 - return ret; 721 + pcie->msi_domain = 722 + pci_msi_create_irq_domain(of_node_to_fwnode(node), 723 + msi_di, pcie->msi_inner_domain); 724 + if (!pcie->msi_domain) { 725 + irq_domain_remove(pcie->msi_inner_domain); 726 + return -ENOMEM; 692 727 } 693 728 694 729 return 0; ··· 698 729 699 730 static void advk_pcie_remove_msi_irq_domain(struct advk_pcie *pcie) 700 731 { 701 - of_pci_msi_chip_remove(&pcie->msi); 702 732 irq_domain_remove(pcie->msi_domain); 733 + irq_domain_remove(pcie->msi_inner_domain); 703 734 } 704 735 705 736 static int advk_pcie_init_irq_domain(struct advk_pcie *pcie) ··· 886 917 struct advk_pcie *pcie; 887 918 struct resource *res; 888 919 struct pci_bus *bus, *child; 889 - struct msi_controller *msi; 890 - struct device_node *msi_node; 891 920 int ret, irq; 892 921 893 922 pcie = devm_kzalloc(dev, sizeof(struct advk_pcie), GFP_KERNEL); ··· 929 962 return ret; 930 963 } 931 964 932 - msi_node = of_parse_phandle(dev->of_node, "msi-parent", 0); 933 - if (msi_node) 934 - msi = of_pci_find_msi_chip_by_node(msi_node); 935 - else 936 - msi = NULL; 937 - 938 - bus = pci_scan_root_bus_msi(dev, 0, &advk_pcie_ops, 939 - pcie, &pcie->resources, &pcie->msi); 965 + bus = pci_scan_root_bus(dev, 0, &advk_pcie_ops, 966 + pcie, &pcie->resources); 940 967 if (!bus) { 941 968 advk_pcie_remove_msi_irq_domain(pcie); 942 969 advk_pcie_remove_irq_domain(pcie);
-17
drivers/pci/host/pci-mvebu.c
··· 1006 1006 return -ENOENT; 1007 1007 } 1008 1008 1009 - static void mvebu_pcie_msi_enable(struct mvebu_pcie *pcie) 1010 - { 1011 - struct device_node *msi_node; 1012 - 1013 - msi_node = of_parse_phandle(pcie->pdev->dev.of_node, 1014 - "msi-parent", 0); 1015 - if (!msi_node) 1016 - return; 1017 - 1018 - pcie->msi = of_pci_find_msi_chip_by_node(msi_node); 1019 - of_node_put(msi_node); 1020 - 1021 - if (pcie->msi) 1022 - pcie->msi->dev = &pcie->pdev->dev; 1023 - } 1024 - 1025 1009 #ifdef CONFIG_PM_SLEEP 1026 1010 static int mvebu_pcie_suspend(struct device *dev) 1027 1011 { ··· 1283 1299 for (i = 0; i < (IO_SPACE_LIMIT - SZ_64K); i += SZ_64K) 1284 1300 pci_ioremap_io(i, pcie->io.start + i); 1285 1301 1286 - mvebu_pcie_msi_enable(pcie); 1287 1302 mvebu_pcie_enable(pcie); 1288 1303 1289 1304 platform_set_drvdata(pdev, pcie);
+6 -4
drivers/pci/msi.c
··· 541 541 if (affd) { 542 542 masks = irq_create_affinity_masks(nvec, affd); 543 543 if (!masks) 544 - pr_err("Unable to allocate affinity masks, ignoring\n"); 544 + dev_err(&dev->dev, "can't allocate MSI affinity masks for %d vectors\n", 545 + nvec); 545 546 } 546 547 547 548 /* MSI Entry Initialization */ ··· 682 681 if (affd) { 683 682 masks = irq_create_affinity_masks(nvec, affd); 684 683 if (!masks) 685 - pr_err("Unable to allocate affinity masks, ignoring\n"); 684 + dev_err(&dev->dev, "can't allocate MSI-X affinity masks for %d vectors\n", 685 + nvec); 686 686 } 687 687 688 688 for (i = 0, curmsk = masks; i < nvec; i++) { ··· 884 882 } 885 883 EXPORT_SYMBOL(pci_msi_vec_count); 886 884 887 - void pci_msi_shutdown(struct pci_dev *dev) 885 + static void pci_msi_shutdown(struct pci_dev *dev) 888 886 { 889 887 struct msi_desc *desc; 890 888 u32 mask; ··· 996 994 } 997 995 EXPORT_SYMBOL(pci_enable_msix); 998 996 999 - void pci_msix_shutdown(struct pci_dev *dev) 997 + static void pci_msix_shutdown(struct pci_dev *dev) 1000 998 { 1001 999 struct msi_desc *entry; 1002 1000
-2
drivers/pci/pci-driver.c
··· 461 461 462 462 if (drv && drv->shutdown) 463 463 drv->shutdown(pci_dev); 464 - pci_msi_shutdown(pci_dev); 465 - pci_msix_shutdown(pci_dev); 466 464 467 465 /* 468 466 * If this is a kexec reboot, turn off Bus Master bit on the
-11
include/linux/of_pci.h
··· 85 85 } 86 86 #endif 87 87 88 - #if defined(CONFIG_OF) && defined(CONFIG_PCI_MSI) 89 - int of_pci_msi_chip_add(struct msi_controller *chip); 90 - void of_pci_msi_chip_remove(struct msi_controller *chip); 91 - struct msi_controller *of_pci_find_msi_chip_by_node(struct device_node *of_node); 92 - #else 93 - static inline int of_pci_msi_chip_add(struct msi_controller *chip) { return -EINVAL; } 94 - static inline void of_pci_msi_chip_remove(struct msi_controller *chip) { } 95 - static inline struct msi_controller * 96 - of_pci_find_msi_chip_by_node(struct device_node *of_node) { return NULL; } 97 - #endif 98 - 99 88 #endif
-4
include/linux/pci.h
··· 1292 1292 1293 1293 #ifdef CONFIG_PCI_MSI 1294 1294 int pci_msi_vec_count(struct pci_dev *dev); 1295 - void pci_msi_shutdown(struct pci_dev *dev); 1296 1295 void pci_disable_msi(struct pci_dev *dev); 1297 1296 int pci_msix_vec_count(struct pci_dev *dev); 1298 1297 int pci_enable_msix(struct pci_dev *dev, struct msix_entry *entries, int nvec); 1299 - void pci_msix_shutdown(struct pci_dev *dev); 1300 1298 void pci_disable_msix(struct pci_dev *dev); 1301 1299 void pci_restore_msi_state(struct pci_dev *dev); 1302 1300 int pci_msi_enabled(void); ··· 1320 1322 1321 1323 #else 1322 1324 static inline int pci_msi_vec_count(struct pci_dev *dev) { return -ENOSYS; } 1323 - static inline void pci_msi_shutdown(struct pci_dev *dev) { } 1324 1325 static inline void pci_disable_msi(struct pci_dev *dev) { } 1325 1326 static inline int pci_msix_vec_count(struct pci_dev *dev) { return -ENOSYS; } 1326 1327 static inline int pci_enable_msix(struct pci_dev *dev, 1327 1328 struct msix_entry *entries, int nvec) 1328 1329 { return -ENOSYS; } 1329 - static inline void pci_msix_shutdown(struct pci_dev *dev) { } 1330 1330 static inline void pci_disable_msix(struct pci_dev *dev) { } 1331 1331 static inline void pci_restore_msi_state(struct pci_dev *dev) { } 1332 1332 static inline int pci_msi_enabled(void) { return 0; }