Skip to content

Commit dd81c65

Browse files
committed
Merge branch 'pci/controller/link_train_delay'
- Add pci_host_common_link_train_delay() for the mandatory delay after > 5GT/s Link training completes and use it for cadence HPA, j721e, LGA; dwc; aardvark, mediatek-gen3, rzg3s (Hans Zhang) * pci/controller/link_train_delay: PCI: rzg3s-host: Use common pci_host_common_link_train_delay() helper PCI: mediatek-gen3: Add 100 ms delay after link up PCI: aardvark: Add 100 ms delay after link training PCI: dwc: Use common pci_host_common_link_train_delay() helper PCI: cadence-hpa: Add post-link delay PCI: cadence: Add post-link delay for LGA and j721e glue driver PCI: Add pci_host_common_link_train_delay() helper # Conflicts: # drivers/pci/controller/pci-host-common.h
2 parents 01b5f1d + 2b0d1a6 commit dd81c65

10 files changed

Lines changed: 47 additions & 9 deletions

drivers/pci/controller/cadence/pci-j721e.c

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -206,6 +206,7 @@ static int j721e_pcie_set_link_speed(struct j721e_pcie *pcie,
206206
(pcie_get_link_speed(link_speed) == PCI_SPEED_UNKNOWN))
207207
link_speed = 2;
208208

209+
pcie->cdns_pcie->max_link_speed = link_speed;
209210
val = link_speed - 1;
210211
ret = regmap_update_bits(syscon, offset, GENERATION_SEL_MASK, val);
211212
if (ret)

drivers/pci/controller/cadence/pcie-cadence-host-common.c

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@
1414

1515
#include "pcie-cadence.h"
1616
#include "pcie-cadence-host-common.h"
17+
#include "../pci-host-common.h"
1718

1819
#define LINK_RETRAIN_TIMEOUT HZ
1920

@@ -115,6 +116,9 @@ int cdns_pcie_host_start_link(struct cdns_pcie_rc *rc,
115116
if (!ret && rc->quirk_retrain_flag)
116117
ret = cdns_pcie_retrain(pcie, pcie_link_up);
117118

119+
if (!ret)
120+
pci_host_common_link_train_delay(pcie->max_link_speed);
121+
118122
return ret;
119123
}
120124
EXPORT_SYMBOL_GPL(cdns_pcie_host_start_link);

drivers/pci/controller/cadence/pcie-cadence-host-hpa.c

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,8 @@
1515

1616
#include "pcie-cadence.h"
1717
#include "pcie-cadence-host-common.h"
18+
#include "../pci-host-common.h"
19+
#include "../../pci.h"
1820

1921
static u8 bar_aperture_mask[] = {
2022
[RP_BAR0] = 0x3F,
@@ -304,6 +306,8 @@ int cdns_pcie_hpa_host_link_setup(struct cdns_pcie_rc *rc)
304306
ret = cdns_pcie_host_wait_for_link(pcie, cdns_pcie_hpa_link_up);
305307
if (ret)
306308
dev_dbg(dev, "PCIe link never came up\n");
309+
else
310+
pci_host_common_link_train_delay(pcie->max_link_speed);
307311

308312
return ret;
309313
}
@@ -313,6 +317,7 @@ int cdns_pcie_hpa_host_setup(struct cdns_pcie_rc *rc)
313317
{
314318
struct device *dev = rc->pcie.dev;
315319
struct platform_device *pdev = to_platform_device(dev);
320+
struct device_node *np = dev->of_node;
316321
struct pci_host_bridge *bridge;
317322
enum cdns_pcie_rp_bar bar;
318323
struct cdns_pcie *pcie;
@@ -343,6 +348,9 @@ int cdns_pcie_hpa_host_setup(struct cdns_pcie_rc *rc)
343348
rc->cfg_res = res;
344349
}
345350

351+
if (pcie->max_link_speed < 1)
352+
pcie->max_link_speed = of_pci_get_max_link_speed(np);
353+
346354
/* Put EROM Bar aperture to 0 */
347355
cdns_pcie_hpa_writel(pcie, REG_BANK_IP_CFG_CTRL_REG, CDNS_PCIE_EROM, 0x0);
348356

drivers/pci/controller/cadence/pcie-cadence-host.c

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313

1414
#include "pcie-cadence.h"
1515
#include "pcie-cadence-host-common.h"
16+
#include "../../pci.h"
1617

1718
static u8 bar_aperture_mask[] = {
1819
[RP_BAR0] = 0x1F,
@@ -397,6 +398,9 @@ int cdns_pcie_host_setup(struct cdns_pcie_rc *rc)
397398
rc->device_id = 0xffff;
398399
of_property_read_u32(np, "device-id", &rc->device_id);
399400

401+
if (pcie->max_link_speed < 1)
402+
pcie->max_link_speed = of_pci_get_max_link_speed(np);
403+
400404
pcie->reg_base = devm_platform_ioremap_resource_byname(pdev, "reg");
401405
if (IS_ERR(pcie->reg_base)) {
402406
dev_err(dev, "missing \"reg\"\n");

drivers/pci/controller/cadence/pcie-cadence.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -86,6 +86,7 @@ struct cdns_plat_pcie_of_data {
8686
* @ops: Platform-specific ops to control various inputs from Cadence PCIe
8787
* wrapper
8888
* @cdns_pcie_reg_offsets: Register bank offsets for different SoC
89+
* @max_link_speed: Maximum supported link speed
8990
*/
9091
struct cdns_pcie {
9192
void __iomem *reg_base;
@@ -98,6 +99,7 @@ struct cdns_pcie {
9899
struct device_link **link;
99100
const struct cdns_pcie_ops *ops;
100101
const struct cdns_plat_pcie_of_data *cdns_pcie_reg_offsets;
102+
int max_link_speed;
101103
};
102104

103105
/**

drivers/pci/controller/dwc/pcie-designware.c

Lines changed: 2 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@
2222
#include <linux/sizes.h>
2323
#include <linux/types.h>
2424

25+
#include "../pci-host-common.h"
2526
#include "../../pci.h"
2627
#include "pcie-designware.h"
2728

@@ -803,13 +804,7 @@ int dw_pcie_wait_for_link(struct dw_pcie *pci)
803804
return -ETIMEDOUT;
804805
}
805806

806-
/*
807-
* As per PCIe r6.0, sec 6.6.1, a Downstream Port that supports Link
808-
* speeds greater than 5.0 GT/s, software must wait a minimum of 100 ms
809-
* after Link training completes before sending a Configuration Request.
810-
*/
811-
if (pci->max_link_speed > 2)
812-
msleep(PCIE_RESET_CONFIG_WAIT_MS);
807+
pci_host_common_link_train_delay(pci->max_link_speed);
813808

814809
offset = dw_pcie_find_capability(pci, PCI_CAP_ID_EXP);
815810
val = dw_pcie_readw_dbi(pci, offset + PCI_EXP_LNKSTA);

drivers/pci/controller/pci-aardvark.c

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@
2626
#include <linux/of_address.h>
2727
#include <linux/of_pci.h>
2828

29+
#include "pci-host-common.h"
2930
#include "../pci.h"
3031
#include "../pci-bridge-emul.h"
3132

@@ -350,8 +351,10 @@ static int advk_pcie_wait_for_link(struct advk_pcie *pcie)
350351

351352
/* check if the link is up or not */
352353
for (retries = 0; retries < LINK_WAIT_MAX_RETRIES; retries++) {
353-
if (advk_pcie_link_up(pcie))
354+
if (advk_pcie_link_up(pcie)) {
355+
pci_host_common_link_train_delay(pcie->link_gen);
354356
return 0;
357+
}
355358

356359
usleep_range(LINK_WAIT_USLEEP_MIN, LINK_WAIT_USLEEP_MAX);
357360
}

drivers/pci/controller/pci-host-common.h

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,9 @@
1010
#ifndef _PCI_HOST_COMMON_H
1111
#define _PCI_HOST_COMMON_H
1212

13+
#include <linux/delay.h>
14+
#include "../pci.h"
15+
1316
struct pci_ecam_ops;
1417

1518
/**
@@ -51,4 +54,18 @@ struct pci_config_window *pci_host_common_ecam_create(struct device *dev,
5154

5255
bool pci_host_common_d3cold_possible(struct pci_host_bridge *bridge,
5356
bool *pme_capable);
57+
58+
/**
59+
* pci_host_common_link_train_delay - Wait 100 ms if link speed > 5 GT/s
60+
* @max_link_speed: the maximum link speed (2 = 5.0 GT/s, 3 = 8.0 GT/s, ...)
61+
*
62+
* Must be called after Link training completes and before the first
63+
* Configuration Request is sent.
64+
*/
65+
static inline void pci_host_common_link_train_delay(int max_link_speed)
66+
{
67+
if (max_link_speed > 2)
68+
msleep(PCIE_RESET_CONFIG_WAIT_MS);
69+
}
70+
5471
#endif

drivers/pci/controller/pcie-mediatek-gen3.c

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@
3030
#include <linux/regmap.h>
3131
#include <linux/reset.h>
3232

33+
#include "pci-host-common.h"
3334
#include "../pci.h"
3435

3536
#define PCIE_BASE_CFG_REG 0x14
@@ -590,6 +591,8 @@ static int mtk_pcie_startup_port(struct mtk_gen3_pcie *pcie)
590591
goto err_power_down_device;
591592
}
592593

594+
pci_host_common_link_train_delay(pcie->max_link_speed);
595+
593596
return 0;
594597

595598
err_power_down_device:

drivers/pci/controller/pcie-rzg3s-host.c

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,7 @@
3535
#include <linux/slab.h>
3636
#include <linux/units.h>
3737

38+
#include "pci-host-common.h"
3839
#include "../pci.h"
3940

4041
/* AXI registers */
@@ -1663,7 +1664,7 @@ rzg3s_pcie_host_setup(struct rzg3s_pcie_host *host,
16631664
if (ret)
16641665
dev_info(dev, "Failed to set max link speed\n");
16651666

1666-
msleep(PCIE_RESET_CONFIG_WAIT_MS);
1667+
pci_host_common_link_train_delay(host->max_link_speed);
16671668

16681669
return 0;
16691670

0 commit comments

Comments
 (0)