aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/pci
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/pci')
-rw-r--r--drivers/pci/host/pci-mvebu.c15
-rw-r--r--drivers/pci/host/pcie-designware.c3
-rw-r--r--drivers/pci/host/pcie-rcar.c3
-rw-r--r--drivers/pci/pci.c49
4 files changed, 51 insertions, 19 deletions
diff --git a/drivers/pci/host/pci-mvebu.c b/drivers/pci/host/pci-mvebu.c
index 1dd759596b0a..1309cfbaa719 100644
--- a/drivers/pci/host/pci-mvebu.c
+++ b/drivers/pci/host/pci-mvebu.c
@@ -101,9 +101,7 @@ struct mvebu_pcie {
101 struct mvebu_pcie_port *ports; 101 struct mvebu_pcie_port *ports;
102 struct msi_controller *msi; 102 struct msi_controller *msi;
103 struct resource io; 103 struct resource io;
104 char io_name[30];
105 struct resource realio; 104 struct resource realio;
106 char mem_name[30];
107 struct resource mem; 105 struct resource mem;
108 struct resource busn; 106 struct resource busn;
109 int nports; 107 int nports;
@@ -723,18 +721,9 @@ static int mvebu_pcie_setup(int nr, struct pci_sys_data *sys)
723{ 721{
724 struct mvebu_pcie *pcie = sys_to_pcie(sys); 722 struct mvebu_pcie *pcie = sys_to_pcie(sys);
725 int i; 723 int i;
726 int domain = 0;
727 724
728#ifdef CONFIG_PCI_DOMAINS 725 pcie->mem.name = "PCI MEM";
729 domain = sys->domain; 726 pcie->realio.name = "PCI I/O";
730#endif
731
732 snprintf(pcie->mem_name, sizeof(pcie->mem_name), "PCI MEM %04x",
733 domain);
734 pcie->mem.name = pcie->mem_name;
735
736 snprintf(pcie->io_name, sizeof(pcie->io_name), "PCI I/O %04x", domain);
737 pcie->realio.name = pcie->io_name;
738 727
739 if (request_resource(&iomem_resource, &pcie->mem)) 728 if (request_resource(&iomem_resource, &pcie->mem))
740 return 0; 729 return 0;
diff --git a/drivers/pci/host/pcie-designware.c b/drivers/pci/host/pcie-designware.c
index df781cdf13c1..eef311115899 100644
--- a/drivers/pci/host/pcie-designware.c
+++ b/drivers/pci/host/pcie-designware.c
@@ -508,9 +508,6 @@ int __init dw_pcie_host_init(struct pcie_port *pp)
508 dw_pci.private_data = (void **)&pp; 508 dw_pci.private_data = (void **)&pp;
509 509
510 pci_common_init_dev(pp->dev, &dw_pci); 510 pci_common_init_dev(pp->dev, &dw_pci);
511#ifdef CONFIG_PCI_DOMAINS
512 dw_pci.domain++;
513#endif
514 511
515 return 0; 512 return 0;
516} 513}
diff --git a/drivers/pci/host/pcie-rcar.c b/drivers/pci/host/pcie-rcar.c
index 748786c402fc..ba28078b70e3 100644
--- a/drivers/pci/host/pcie-rcar.c
+++ b/drivers/pci/host/pcie-rcar.c
@@ -397,9 +397,6 @@ static void rcar_pcie_enable(struct rcar_pcie *pcie)
397#endif 397#endif
398 398
399 pci_common_init_dev(&pdev->dev, &rcar_pci); 399 pci_common_init_dev(&pdev->dev, &rcar_pci);
400#ifdef CONFIG_PCI_DOMAINS
401 rcar_pci.domain++;
402#endif
403} 400}
404 401
405static int phy_wait_for_ack(struct rcar_pcie *pcie) 402static int phy_wait_for_ack(struct rcar_pcie *pcie)
diff --git a/drivers/pci/pci.c b/drivers/pci/pci.c
index cab05f31223f..c419554d0b4b 100644
--- a/drivers/pci/pci.c
+++ b/drivers/pci/pci.c
@@ -10,6 +10,8 @@
10#include <linux/kernel.h> 10#include <linux/kernel.h>
11#include <linux/delay.h> 11#include <linux/delay.h>
12#include <linux/init.h> 12#include <linux/init.h>
13#include <linux/of.h>
14#include <linux/of_pci.h>
13#include <linux/pci.h> 15#include <linux/pci.h>
14#include <linux/pm.h> 16#include <linux/pm.h>
15#include <linux/slab.h> 17#include <linux/slab.h>
@@ -4439,6 +4441,53 @@ int pci_get_new_domain_nr(void)
4439{ 4441{
4440 return atomic_inc_return(&__domain_nr); 4442 return atomic_inc_return(&__domain_nr);
4441} 4443}
4444
4445#ifdef CONFIG_PCI_DOMAINS_GENERIC
4446void pci_bus_assign_domain_nr(struct pci_bus *bus, struct device *parent)
4447{
4448 static int use_dt_domains = -1;
4449 int domain = of_get_pci_domain_nr(parent->of_node);
4450
4451 /*
4452 * Check DT domain and use_dt_domains values.
4453 *
4454 * If DT domain property is valid (domain >= 0) and
4455 * use_dt_domains != 0, the DT assignment is valid since this means
4456 * we have not previously allocated a domain number by using
4457 * pci_get_new_domain_nr(); we should also update use_dt_domains to
4458 * 1, to indicate that we have just assigned a domain number from
4459 * DT.
4460 *
4461 * If DT domain property value is not valid (ie domain < 0), and we
4462 * have not previously assigned a domain number from DT
4463 * (use_dt_domains != 1) we should assign a domain number by
4464 * using the:
4465 *
4466 * pci_get_new_domain_nr()
4467 *
4468 * API and update the use_dt_domains value to keep track of method we
4469 * are using to assign domain numbers (use_dt_domains = 0).
4470 *
4471 * All other combinations imply we have a platform that is trying
4472 * to mix domain numbers obtained from DT and pci_get_new_domain_nr(),
4473 * which is a recipe for domain mishandling and it is prevented by
4474 * invalidating the domain value (domain = -1) and printing a
4475 * corresponding error.
4476 */
4477 if (domain >= 0 && use_dt_domains) {
4478 use_dt_domains = 1;
4479 } else if (domain < 0 && use_dt_domains != 1) {
4480 use_dt_domains = 0;
4481 domain = pci_get_new_domain_nr();
4482 } else {
4483 dev_err(parent, "Node %s has inconsistent \"linux,pci-domain\" property in DT\n",
4484 parent->of_node->full_name);
4485 domain = -1;
4486 }
4487
4488 bus->domain_nr = domain;
4489}
4490#endif
4442#endif 4491#endif
4443 4492
4444/** 4493/**