PCI: tegra: Apply sw fixups to support ASPM-L1 Sub-States

Programs Port Common_Mode_Restore_Time and Port T_POWER_ON values
(from the L1 PM Substates Capabilities Register, PCIe 4.0r0.9, sec 7.8.3.2)
to get them reflected in ASPM-L1 Sub-States capability registers.
Also adjusts internal counter values according to 19.2 MHz clk_m value.

bug 200420606

Change-Id: Ie139255e522e4476fdfbe64aa6250d0293b7ae89
Signed-off-by: Vidya Sagar <vidyas@nvidia.com>
Reviewed-on: https://git-master.nvidia.com/r/1786544
(cherry picked from commit 9ac6211e1a99583618945c86748214ccc33de463)
Reviewed-on: https://git-master.nvidia.com/r/c/linux-5.9/+/2407874
Reviewed-by: automaticguardword <automaticguardword@nvidia.com>
Reviewed-by: Manikanta Maddireddy <mmaddireddy@nvidia.com>
Reviewed-by: Bitan Biswas <bbiswas@nvidia.com>
Reviewed-by: mobile promotions <svcmobile_promotions@nvidia.com>
Tested-by: Manikanta Maddireddy <mmaddireddy@nvidia.com>
Tested-by: mobile promotions <svcmobile_promotions@nvidia.com>
GVS: Gerrit_Virtual_Submit
This commit is contained in:
Vidya Sagar
2017-11-12 18:47:52 +05:30
committed by Thomas Makin
parent 2b7a4256cc
commit b011642f03

View File

@@ -167,6 +167,49 @@
#define AFI_PEXBIAS_CTRL_0 0x168 #define AFI_PEXBIAS_CTRL_0 0x168
#define RP_PRIV_XP_DL 0x00000494
#define RP_PRIV_XP_DL_GEN2_UPD_FC_TSHOLD (0x1ff << 1)
#define RP_L1_PM_SUBSTATES_CTL 0xc00
#define RP_L1_PM_SUBSTATES_CTL_CM_RTIME_MASK (0xff << 8)
#define RP_L1_PM_SUBSTATES_CTL_CM_RTIME_SHIFT 8
#define RP_L1_PM_SUBSTATES_CTL_T_PWRN_SCL_MASK (0x3 << 16)
#define RP_L1_PM_SUBSTATES_CTL_T_PWRN_SCL_SHIFT 16
#define RP_L1_PM_SUBSTATES_CTL_T_PWRN_VAL_MASK (0x1f << 19)
#define RP_L1_PM_SUBSTATES_CTL_T_PWRN_VAL_SHIFT 19
#define RP_L1_PM_SUBSTATES_CTL_HIDE_CAP (0x1 << 24)
#define RP_L1_PM_SUBSTATES_1_CTL 0xc04
#define RP_L1_PM_SUBSTATES_1_CTL_PWR_OFF_DLY_MASK 0x1fff
#define RP_L1_PM_SUBSTATES_1_CTL_PWR_OFF_DLY 0x26
#define RP_L1_PM_SUBSTATES_2_CTL 0xc08
#define RP_L1_PM_SUBSTATES_2_CTL_T_L1_2_DLY_MASK 0x1fff
#define RP_L1_PM_SUBSTATES_2_CTL_T_L1_2_DLY 0x4d
#define RP_L1_PM_SUBSTATES_2_CTL_MICROSECOND_MASK (0xff << 13)
#define RP_L1_PM_SUBSTATES_2_CTL_MICROSECOND (0x13 << 13)
#define RP_L1_PM_SUBSTATES_2_CTL_MICROSECOND_COMP_MASK (0xf << 21)
#define RP_L1_PM_SUBSTATES_2_CTL_MICROSECOND_COMP (0x2 << 21)
#define RP_RX_HDR_LIMIT 0x00000e00
#define RP_RX_HDR_LIMIT_PW_MASK (0xff << 8)
#define RP_RX_HDR_LIMIT_PW (0x0e << 8)
#define RP_TIMEOUT0 0xe24
#define RP_TIMEOUT0_PAD_PWRUP_MASK 0xff
#define RP_TIMEOUT0_PAD_PWRUP 0xa
#define RP_TIMEOUT0_PAD_PWRUP_CM_MASK 0xffff00
#define RP_TIMEOUT0_PAD_PWRUP_CM (0x180 << 8)
#define RP_TIMEOUT0_PAD_SPDCHNG_GEN2_MASK (0xff << 24)
#define RP_TIMEOUT0_PAD_SPDCHNG_GEN2 (0xa << 24)
#define RP_TIMEOUT1 0xe28
#define RP_TIMEOUT1_RCVRY_SPD_SUCCESS_EIDLE_MASK (0xff << 16)
#define RP_TIMEOUT1_RCVRY_SPD_SUCCESS_EIDLE (0x10 << 16)
#define RP_TIMEOUT1_RCVRY_SPD_UNSUCCESS_EIDLE_MASK (0xff << 24)
#define RP_TIMEOUT1_RCVRY_SPD_UNSUCCESS_EIDLE (0x74 << 24)
#define RP_ECTL_1_R1 0x00000e80 #define RP_ECTL_1_R1 0x00000e80
#define RP_ECTL_1_R1_TX_DRV_AMP_1C_MASK 0x3f #define RP_ECTL_1_R1_TX_DRV_AMP_1C_MASK 0x3f
@@ -208,6 +251,15 @@
#define RP_VEND_XP1 0xf04 #define RP_VEND_XP1 0xf04
#define RP_VEND_XP1_LINK_PVT_CTL_L1_ASPM_SUPPORT (1 << 21) #define RP_VEND_XP1_LINK_PVT_CTL_L1_ASPM_SUPPORT (1 << 21)
#define RP_XP_REF 0xf30
#define RP_XP_REF_MICROSECOND_LIMIT_MASK 0xff
#define RP_XP_REF_MICROSECOND_LIMIT 0x14
#define RP_XP_REF_MICROSECOND_ENABLE (1 << 8)
#define RP_XP_REF_CPL_TO_OVERRIDE (1 << 13)
#define RP_XP_REF_CPL_TO_CUSTOM_VALUE_MASK (0x1ffff << 14)
#define RP_XP_REF_CPL_TO_CUSTOM_VALUE (0x1770 << 14)
#define RP_VEND_CTL0 0x00000f44 #define RP_VEND_CTL0 0x00000f44
#define RP_VEND_CTL0_DSK_RST_PULSE_WIDTH_MASK (0xf << 12) #define RP_VEND_CTL0_DSK_RST_PULSE_WIDTH_MASK (0xf << 12)
#define RP_VEND_CTL0_DSK_RST_PULSE_WIDTH (0x9 << 12) #define RP_VEND_CTL0_DSK_RST_PULSE_WIDTH (0x9 << 12)
@@ -324,6 +376,7 @@ struct tegra_pcie_soc {
bool has_cache_bars; bool has_cache_bars;
bool enable_wrap; bool enable_wrap;
bool has_aspm_l1; bool has_aspm_l1;
bool has_aspm_l1ss;
struct { struct {
struct { struct {
u32 rp_ectl_1_r1; u32 rp_ectl_1_r1;
@@ -760,6 +813,62 @@ static void tegra_pcie_apply_sw_fixup(struct tegra_pcie_port *port)
if (soc->enable_wrap) if (soc->enable_wrap)
tegra_pcie_enable_wrap(); tegra_pcie_enable_wrap();
if (soc->has_aspm_l1ss) {
/* Set port Common_Mode_Restore_Time to 30us */
value = readl(port->base + RP_L1_PM_SUBSTATES_CTL);
value &= ~RP_L1_PM_SUBSTATES_CTL_CM_RTIME_MASK;
value |= (0x1E << RP_L1_PM_SUBSTATES_CTL_CM_RTIME_SHIFT);
writel(value, port->base + RP_L1_PM_SUBSTATES_CTL);
/* set port T_POWER_ON to 70us */
value = readl(port->base + RP_L1_PM_SUBSTATES_CTL);
value &= ~(RP_L1_PM_SUBSTATES_CTL_T_PWRN_SCL_MASK |
RP_L1_PM_SUBSTATES_CTL_T_PWRN_VAL_MASK);
value |= (1 << RP_L1_PM_SUBSTATES_CTL_T_PWRN_SCL_SHIFT) |
(7 << RP_L1_PM_SUBSTATES_CTL_T_PWRN_VAL_SHIFT);
writel(value, port->base + RP_L1_PM_SUBSTATES_CTL);
/* Following is based on clk_m being 19.2 MHz */
value = readl(port->base + RP_TIMEOUT0);
value &= ~RP_TIMEOUT0_PAD_PWRUP_MASK;
value |= RP_TIMEOUT0_PAD_PWRUP;
value &= ~RP_TIMEOUT0_PAD_PWRUP_CM_MASK;
value |= RP_TIMEOUT0_PAD_PWRUP_CM;
value &= ~RP_TIMEOUT0_PAD_SPDCHNG_GEN2_MASK;
value |= RP_TIMEOUT0_PAD_SPDCHNG_GEN2;
writel(value, port->base + RP_TIMEOUT0);
value = readl(port->base + RP_TIMEOUT1);
value &= ~RP_TIMEOUT1_RCVRY_SPD_SUCCESS_EIDLE_MASK;
value |= RP_TIMEOUT1_RCVRY_SPD_SUCCESS_EIDLE;
value &= ~RP_TIMEOUT1_RCVRY_SPD_UNSUCCESS_EIDLE_MASK;
value |= RP_TIMEOUT1_RCVRY_SPD_UNSUCCESS_EIDLE;
writel(value, port->base + RP_TIMEOUT1);
value = readl(port->base + RP_XP_REF);
value &= ~RP_XP_REF_MICROSECOND_LIMIT_MASK;
value |= RP_XP_REF_MICROSECOND_LIMIT;
value |= RP_XP_REF_MICROSECOND_ENABLE;
value |= RP_XP_REF_CPL_TO_OVERRIDE;
value &= ~RP_XP_REF_CPL_TO_CUSTOM_VALUE_MASK;
value |= RP_XP_REF_CPL_TO_CUSTOM_VALUE;
writel(value, port->base + RP_XP_REF);
value = readl(port->base + RP_L1_PM_SUBSTATES_1_CTL);
value &= ~RP_L1_PM_SUBSTATES_1_CTL_PWR_OFF_DLY_MASK;
value |= RP_L1_PM_SUBSTATES_1_CTL_PWR_OFF_DLY;
writel(value, port->base + RP_L1_PM_SUBSTATES_1_CTL);
value = readl(port->base + RP_L1_PM_SUBSTATES_2_CTL);
value &= ~RP_L1_PM_SUBSTATES_2_CTL_T_L1_2_DLY_MASK;
value |= RP_L1_PM_SUBSTATES_2_CTL_T_L1_2_DLY;
value &= ~RP_L1_PM_SUBSTATES_2_CTL_MICROSECOND_MASK;
value |= RP_L1_PM_SUBSTATES_2_CTL_MICROSECOND;
value &= ~RP_L1_PM_SUBSTATES_2_CTL_MICROSECOND_COMP_MASK;
value |= RP_L1_PM_SUBSTATES_2_CTL_MICROSECOND_COMP;
writel(value, port->base + RP_L1_PM_SUBSTATES_2_CTL);
}
} }
static void tegra_pcie_port_enable(struct tegra_pcie_port *port) static void tegra_pcie_port_enable(struct tegra_pcie_port *port)
@@ -2519,6 +2628,7 @@ static const struct tegra_pcie_soc tegra20_pcie = {
.has_cache_bars = true, .has_cache_bars = true,
.enable_wrap = false, .enable_wrap = false,
.has_aspm_l1 = false, .has_aspm_l1 = false,
.has_aspm_l1ss = false,
.ectl.enable = false, .ectl.enable = false,
}; };
@@ -2550,6 +2660,7 @@ static const struct tegra_pcie_soc tegra30_pcie = {
.has_cache_bars = false, .has_cache_bars = false,
.enable_wrap = false, .enable_wrap = false,
.has_aspm_l1 = true, .has_aspm_l1 = true,
.has_aspm_l1ss = false,
.ectl.enable = false, .ectl.enable = false,
}; };
@@ -2573,6 +2684,7 @@ static const struct tegra_pcie_soc tegra124_pcie = {
.has_cache_bars = false, .has_cache_bars = false,
.enable_wrap = false, .enable_wrap = false,
.has_aspm_l1 = true, .has_aspm_l1 = true,
.has_aspm_l1ss = false,
.ectl.enable = false, .ectl.enable = false,
}; };
@@ -2598,6 +2710,7 @@ static const struct tegra_pcie_soc tegra210_pcie = {
.has_cache_bars = false, .has_cache_bars = false,
.enable_wrap = true, .enable_wrap = true,
.has_aspm_l1 = true, .has_aspm_l1 = true,
.has_aspm_l1ss = true,
.ectl = { .ectl = {
.regs = { .regs = {
.rp_ectl_1_r1 = 0x0000001f, .rp_ectl_1_r1 = 0x0000001f,
@@ -2679,6 +2792,7 @@ static const struct tegra_pcie_soc tegra186_pcie = {
.has_cache_bars = false, .has_cache_bars = false,
.enable_wrap = false, .enable_wrap = false,
.has_aspm_l1 = true, .has_aspm_l1 = true,
.has_aspm_l1ss = true,
.ectl.enable = false, .ectl.enable = false,
}; };