diff options
Diffstat (limited to 'drivers/pci')
| -rw-r--r-- | drivers/pci/host/pcie-altera.c | 23 | ||||
| -rw-r--r-- | drivers/pci/host/pcie-designware.c | 1 | ||||
| -rw-r--r-- | drivers/pci/host/pcie-hisi.c | 4 | ||||
| -rw-r--r-- | drivers/pci/msi.c | 4 | ||||
| -rw-r--r-- | drivers/pci/pci-driver.c | 16 | ||||
| -rw-r--r-- | drivers/pci/pci-sysfs.c | 5 | ||||
| -rw-r--r-- | drivers/pci/pci.h | 2 |
7 files changed, 38 insertions, 17 deletions
diff --git a/drivers/pci/host/pcie-altera.c b/drivers/pci/host/pcie-altera.c index e5dda38bdde5..99da549d5d06 100644 --- a/drivers/pci/host/pcie-altera.c +++ b/drivers/pci/host/pcie-altera.c | |||
| @@ -55,8 +55,10 @@ | |||
| 55 | #define TLP_CFG_DW2(bus, devfn, offset) \ | 55 | #define TLP_CFG_DW2(bus, devfn, offset) \ |
| 56 | (((bus) << 24) | ((devfn) << 16) | (offset)) | 56 | (((bus) << 24) | ((devfn) << 16) | (offset)) |
| 57 | #define TLP_REQ_ID(bus, devfn) (((bus) << 8) | (devfn)) | 57 | #define TLP_REQ_ID(bus, devfn) (((bus) << 8) | (devfn)) |
| 58 | #define TLP_COMP_STATUS(s) (((s) >> 12) & 7) | ||
| 58 | #define TLP_HDR_SIZE 3 | 59 | #define TLP_HDR_SIZE 3 |
| 59 | #define TLP_LOOP 500 | 60 | #define TLP_LOOP 500 |
| 61 | #define RP_DEVFN 0 | ||
| 60 | 62 | ||
| 61 | #define INTX_NUM 4 | 63 | #define INTX_NUM 4 |
| 62 | 64 | ||
| @@ -166,34 +168,41 @@ static bool altera_pcie_valid_config(struct altera_pcie *pcie, | |||
| 166 | 168 | ||
| 167 | static int tlp_read_packet(struct altera_pcie *pcie, u32 *value) | 169 | static int tlp_read_packet(struct altera_pcie *pcie, u32 *value) |
| 168 | { | 170 | { |
| 169 | u8 loop; | 171 | int i; |
| 170 | bool sop = 0; | 172 | bool sop = 0; |
| 171 | u32 ctrl; | 173 | u32 ctrl; |
| 172 | u32 reg0, reg1; | 174 | u32 reg0, reg1; |
| 175 | u32 comp_status = 1; | ||
| 173 | 176 | ||
| 174 | /* | 177 | /* |
| 175 | * Minimum 2 loops to read TLP headers and 1 loop to read data | 178 | * Minimum 2 loops to read TLP headers and 1 loop to read data |
| 176 | * payload. | 179 | * payload. |
| 177 | */ | 180 | */ |
| 178 | for (loop = 0; loop < TLP_LOOP; loop++) { | 181 | for (i = 0; i < TLP_LOOP; i++) { |
| 179 | ctrl = cra_readl(pcie, RP_RXCPL_STATUS); | 182 | ctrl = cra_readl(pcie, RP_RXCPL_STATUS); |
| 180 | if ((ctrl & RP_RXCPL_SOP) || (ctrl & RP_RXCPL_EOP) || sop) { | 183 | if ((ctrl & RP_RXCPL_SOP) || (ctrl & RP_RXCPL_EOP) || sop) { |
| 181 | reg0 = cra_readl(pcie, RP_RXCPL_REG0); | 184 | reg0 = cra_readl(pcie, RP_RXCPL_REG0); |
| 182 | reg1 = cra_readl(pcie, RP_RXCPL_REG1); | 185 | reg1 = cra_readl(pcie, RP_RXCPL_REG1); |
| 183 | 186 | ||
| 184 | if (ctrl & RP_RXCPL_SOP) | 187 | if (ctrl & RP_RXCPL_SOP) { |
| 185 | sop = true; | 188 | sop = true; |
| 189 | comp_status = TLP_COMP_STATUS(reg1); | ||
| 190 | } | ||
| 186 | 191 | ||
| 187 | if (ctrl & RP_RXCPL_EOP) { | 192 | if (ctrl & RP_RXCPL_EOP) { |
| 193 | if (comp_status) | ||
| 194 | return PCIBIOS_DEVICE_NOT_FOUND; | ||
| 195 | |||
| 188 | if (value) | 196 | if (value) |
| 189 | *value = reg0; | 197 | *value = reg0; |
| 198 | |||
| 190 | return PCIBIOS_SUCCESSFUL; | 199 | return PCIBIOS_SUCCESSFUL; |
| 191 | } | 200 | } |
| 192 | } | 201 | } |
| 193 | udelay(5); | 202 | udelay(5); |
| 194 | } | 203 | } |
| 195 | 204 | ||
| 196 | return -ENOENT; | 205 | return PCIBIOS_DEVICE_NOT_FOUND; |
| 197 | } | 206 | } |
| 198 | 207 | ||
| 199 | static void tlp_write_packet(struct altera_pcie *pcie, u32 *headers, | 208 | static void tlp_write_packet(struct altera_pcie *pcie, u32 *headers, |
| @@ -233,7 +242,7 @@ static int tlp_cfg_dword_read(struct altera_pcie *pcie, u8 bus, u32 devfn, | |||
| 233 | else | 242 | else |
| 234 | headers[0] = TLP_CFG_DW0(TLP_FMTTYPE_CFGRD1); | 243 | headers[0] = TLP_CFG_DW0(TLP_FMTTYPE_CFGRD1); |
| 235 | 244 | ||
| 236 | headers[1] = TLP_CFG_DW1(TLP_REQ_ID(pcie->root_bus_nr, devfn), | 245 | headers[1] = TLP_CFG_DW1(TLP_REQ_ID(pcie->root_bus_nr, RP_DEVFN), |
| 237 | TLP_READ_TAG, byte_en); | 246 | TLP_READ_TAG, byte_en); |
| 238 | headers[2] = TLP_CFG_DW2(bus, devfn, where); | 247 | headers[2] = TLP_CFG_DW2(bus, devfn, where); |
| 239 | 248 | ||
| @@ -253,7 +262,7 @@ static int tlp_cfg_dword_write(struct altera_pcie *pcie, u8 bus, u32 devfn, | |||
| 253 | else | 262 | else |
| 254 | headers[0] = TLP_CFG_DW0(TLP_FMTTYPE_CFGWR1); | 263 | headers[0] = TLP_CFG_DW0(TLP_FMTTYPE_CFGWR1); |
| 255 | 264 | ||
| 256 | headers[1] = TLP_CFG_DW1(TLP_REQ_ID(pcie->root_bus_nr, devfn), | 265 | headers[1] = TLP_CFG_DW1(TLP_REQ_ID(pcie->root_bus_nr, RP_DEVFN), |
| 257 | TLP_WRITE_TAG, byte_en); | 266 | TLP_WRITE_TAG, byte_en); |
| 258 | headers[2] = TLP_CFG_DW2(bus, devfn, where); | 267 | headers[2] = TLP_CFG_DW2(bus, devfn, where); |
| 259 | 268 | ||
| @@ -458,7 +467,7 @@ static int altera_pcie_init_irq_domain(struct altera_pcie *pcie) | |||
| 458 | struct device_node *node = dev->of_node; | 467 | struct device_node *node = dev->of_node; |
| 459 | 468 | ||
| 460 | /* Setup INTx */ | 469 | /* Setup INTx */ |
| 461 | pcie->irq_domain = irq_domain_add_linear(node, INTX_NUM, | 470 | pcie->irq_domain = irq_domain_add_linear(node, INTX_NUM + 1, |
| 462 | &intx_domain_ops, pcie); | 471 | &intx_domain_ops, pcie); |
| 463 | if (!pcie->irq_domain) { | 472 | if (!pcie->irq_domain) { |
| 464 | dev_err(dev, "Failed to get a INTx IRQ domain\n"); | 473 | dev_err(dev, "Failed to get a INTx IRQ domain\n"); |
diff --git a/drivers/pci/host/pcie-designware.c b/drivers/pci/host/pcie-designware.c index 540f077c37ea..02a7452bdf23 100644 --- a/drivers/pci/host/pcie-designware.c +++ b/drivers/pci/host/pcie-designware.c | |||
| @@ -440,7 +440,6 @@ int dw_pcie_host_init(struct pcie_port *pp) | |||
| 440 | ret, pp->io); | 440 | ret, pp->io); |
| 441 | continue; | 441 | continue; |
| 442 | } | 442 | } |
| 443 | pp->io_base = pp->io->start; | ||
| 444 | break; | 443 | break; |
| 445 | case IORESOURCE_MEM: | 444 | case IORESOURCE_MEM: |
| 446 | pp->mem = win->res; | 445 | pp->mem = win->res; |
diff --git a/drivers/pci/host/pcie-hisi.c b/drivers/pci/host/pcie-hisi.c index 35457ecd8e70..163671a4f798 100644 --- a/drivers/pci/host/pcie-hisi.c +++ b/drivers/pci/host/pcie-hisi.c | |||
| @@ -111,7 +111,7 @@ static struct pcie_host_ops hisi_pcie_host_ops = { | |||
| 111 | .link_up = hisi_pcie_link_up, | 111 | .link_up = hisi_pcie_link_up, |
| 112 | }; | 112 | }; |
| 113 | 113 | ||
| 114 | static int __init hisi_add_pcie_port(struct pcie_port *pp, | 114 | static int hisi_add_pcie_port(struct pcie_port *pp, |
| 115 | struct platform_device *pdev) | 115 | struct platform_device *pdev) |
| 116 | { | 116 | { |
| 117 | int ret; | 117 | int ret; |
| @@ -139,7 +139,7 @@ static int __init hisi_add_pcie_port(struct pcie_port *pp, | |||
| 139 | return 0; | 139 | return 0; |
| 140 | } | 140 | } |
| 141 | 141 | ||
| 142 | static int __init hisi_pcie_probe(struct platform_device *pdev) | 142 | static int hisi_pcie_probe(struct platform_device *pdev) |
| 143 | { | 143 | { |
| 144 | struct hisi_pcie *hisi_pcie; | 144 | struct hisi_pcie *hisi_pcie; |
| 145 | struct pcie_port *pp; | 145 | struct pcie_port *pp; |
diff --git a/drivers/pci/msi.c b/drivers/pci/msi.c index 53e463244bb7..7eaa4c87fec7 100644 --- a/drivers/pci/msi.c +++ b/drivers/pci/msi.c | |||
| @@ -54,7 +54,7 @@ static int pci_msi_setup_msi_irqs(struct pci_dev *dev, int nvec, int type) | |||
| 54 | struct irq_domain *domain; | 54 | struct irq_domain *domain; |
| 55 | 55 | ||
| 56 | domain = pci_msi_get_domain(dev); | 56 | domain = pci_msi_get_domain(dev); |
| 57 | if (domain) | 57 | if (domain && irq_domain_is_hierarchy(domain)) |
| 58 | return pci_msi_domain_alloc_irqs(domain, dev, nvec, type); | 58 | return pci_msi_domain_alloc_irqs(domain, dev, nvec, type); |
| 59 | 59 | ||
| 60 | return arch_setup_msi_irqs(dev, nvec, type); | 60 | return arch_setup_msi_irqs(dev, nvec, type); |
| @@ -65,7 +65,7 @@ static void pci_msi_teardown_msi_irqs(struct pci_dev *dev) | |||
| 65 | struct irq_domain *domain; | 65 | struct irq_domain *domain; |
| 66 | 66 | ||
| 67 | domain = pci_msi_get_domain(dev); | 67 | domain = pci_msi_get_domain(dev); |
| 68 | if (domain) | 68 | if (domain && irq_domain_is_hierarchy(domain)) |
| 69 | pci_msi_domain_free_irqs(domain, dev); | 69 | pci_msi_domain_free_irqs(domain, dev); |
| 70 | else | 70 | else |
| 71 | arch_teardown_msi_irqs(dev); | 71 | arch_teardown_msi_irqs(dev); |
diff --git a/drivers/pci/pci-driver.c b/drivers/pci/pci-driver.c index 4446fcb5effd..d7ffd66814bb 100644 --- a/drivers/pci/pci-driver.c +++ b/drivers/pci/pci-driver.c | |||
| @@ -1146,9 +1146,21 @@ static int pci_pm_runtime_suspend(struct device *dev) | |||
| 1146 | pci_dev->state_saved = false; | 1146 | pci_dev->state_saved = false; |
| 1147 | pci_dev->no_d3cold = false; | 1147 | pci_dev->no_d3cold = false; |
| 1148 | error = pm->runtime_suspend(dev); | 1148 | error = pm->runtime_suspend(dev); |
| 1149 | suspend_report_result(pm->runtime_suspend, error); | 1149 | if (error) { |
| 1150 | if (error) | 1150 | /* |
| 1151 | * -EBUSY and -EAGAIN is used to request the runtime PM core | ||
| 1152 | * to schedule a new suspend, so log the event only with debug | ||
| 1153 | * log level. | ||
| 1154 | */ | ||
| 1155 | if (error == -EBUSY || error == -EAGAIN) | ||
| 1156 | dev_dbg(dev, "can't suspend now (%pf returned %d)\n", | ||
| 1157 | pm->runtime_suspend, error); | ||
| 1158 | else | ||
| 1159 | dev_err(dev, "can't suspend (%pf returned %d)\n", | ||
| 1160 | pm->runtime_suspend, error); | ||
| 1161 | |||
| 1151 | return error; | 1162 | return error; |
| 1163 | } | ||
| 1152 | if (!pci_dev->d3cold_allowed) | 1164 | if (!pci_dev->d3cold_allowed) |
| 1153 | pci_dev->no_d3cold = true; | 1165 | pci_dev->no_d3cold = true; |
| 1154 | 1166 | ||
diff --git a/drivers/pci/pci-sysfs.c b/drivers/pci/pci-sysfs.c index 92618686604c..eead54cd01b2 100644 --- a/drivers/pci/pci-sysfs.c +++ b/drivers/pci/pci-sysfs.c | |||
| @@ -216,7 +216,10 @@ static ssize_t numa_node_store(struct device *dev, | |||
| 216 | if (ret) | 216 | if (ret) |
| 217 | return ret; | 217 | return ret; |
| 218 | 218 | ||
| 219 | if (node >= MAX_NUMNODES || !node_online(node)) | 219 | if ((node < 0 && node != NUMA_NO_NODE) || node >= MAX_NUMNODES) |
| 220 | return -EINVAL; | ||
| 221 | |||
| 222 | if (node != NUMA_NO_NODE && !node_online(node)) | ||
| 220 | return -EINVAL; | 223 | return -EINVAL; |
| 221 | 224 | ||
| 222 | add_taint(TAINT_FIRMWARE_WORKAROUND, LOCKDEP_STILL_OK); | 225 | add_taint(TAINT_FIRMWARE_WORKAROUND, LOCKDEP_STILL_OK); |
diff --git a/drivers/pci/pci.h b/drivers/pci/pci.h index fd2f03fa53f3..d390fc1475ec 100644 --- a/drivers/pci/pci.h +++ b/drivers/pci/pci.h | |||
| @@ -337,6 +337,4 @@ static inline int pci_dev_specific_reset(struct pci_dev *dev, int probe) | |||
| 337 | } | 337 | } |
| 338 | #endif | 338 | #endif |
| 339 | 339 | ||
| 340 | struct pci_host_bridge *pci_find_host_bridge(struct pci_bus *bus); | ||
| 341 | |||
| 342 | #endif /* DRIVERS_PCI_H */ | 340 | #endif /* DRIVERS_PCI_H */ |
