diff options
Diffstat (limited to 'drivers/pci/controller/dwc/pcie-qcom-common.c')
| -rw-r--r-- | drivers/pci/controller/dwc/pcie-qcom-common.c | 58 | 
1 files changed, 34 insertions, 24 deletions
| diff --git a/drivers/pci/controller/dwc/pcie-qcom-common.c b/drivers/pci/controller/dwc/pcie-qcom-common.c index 3aad19b56da8..01c5387e53bf 100644 --- a/drivers/pci/controller/dwc/pcie-qcom-common.c +++ b/drivers/pci/controller/dwc/pcie-qcom-common.c @@ -8,9 +8,11 @@  #include "pcie-designware.h"  #include "pcie-qcom-common.h" -void qcom_pcie_common_set_16gt_equalization(struct dw_pcie *pci) +void qcom_pcie_common_set_equalization(struct dw_pcie *pci)  { +	struct device *dev = pci->dev;  	u32 reg; +	u16 speed;  	/*  	 * GEN3_RELATED_OFF register is repurposed to apply equalization @@ -19,32 +21,40 @@ void qcom_pcie_common_set_16gt_equalization(struct dw_pcie *pci)  	 * determines the data rate for which these equalization settings are  	 * applied.  	 */ -	reg = dw_pcie_readl_dbi(pci, GEN3_RELATED_OFF); -	reg &= ~GEN3_RELATED_OFF_GEN3_ZRXDC_NONCOMPL; -	reg &= ~GEN3_RELATED_OFF_RATE_SHADOW_SEL_MASK; -	reg |= FIELD_PREP(GEN3_RELATED_OFF_RATE_SHADOW_SEL_MASK, -			  GEN3_RELATED_OFF_RATE_SHADOW_SEL_16_0GT); -	dw_pcie_writel_dbi(pci, GEN3_RELATED_OFF, reg); -	reg = dw_pcie_readl_dbi(pci, GEN3_EQ_FB_MODE_DIR_CHANGE_OFF); -	reg &= ~(GEN3_EQ_FMDC_T_MIN_PHASE23 | -		GEN3_EQ_FMDC_N_EVALS | -		GEN3_EQ_FMDC_MAX_PRE_CUSROR_DELTA | -		GEN3_EQ_FMDC_MAX_POST_CUSROR_DELTA); -	reg |= FIELD_PREP(GEN3_EQ_FMDC_T_MIN_PHASE23, 0x1) | -		FIELD_PREP(GEN3_EQ_FMDC_N_EVALS, 0xd) | -		FIELD_PREP(GEN3_EQ_FMDC_MAX_PRE_CUSROR_DELTA, 0x5) | -		FIELD_PREP(GEN3_EQ_FMDC_MAX_POST_CUSROR_DELTA, 0x5); -	dw_pcie_writel_dbi(pci, GEN3_EQ_FB_MODE_DIR_CHANGE_OFF, reg); +	for (speed = PCIE_SPEED_8_0GT; speed <= pcie_link_speed[pci->max_link_speed]; speed++) { +		if (speed > PCIE_SPEED_32_0GT) { +			dev_warn(dev, "Skipped equalization settings for unsupported data rate\n"); +			break; +		} -	reg = dw_pcie_readl_dbi(pci, GEN3_EQ_CONTROL_OFF); -	reg &= ~(GEN3_EQ_CONTROL_OFF_FB_MODE | -		GEN3_EQ_CONTROL_OFF_PHASE23_EXIT_MODE | -		GEN3_EQ_CONTROL_OFF_FOM_INC_INITIAL_EVAL | -		GEN3_EQ_CONTROL_OFF_PSET_REQ_VEC); -	dw_pcie_writel_dbi(pci, GEN3_EQ_CONTROL_OFF, reg); +		reg = dw_pcie_readl_dbi(pci, GEN3_RELATED_OFF); +		reg &= ~GEN3_RELATED_OFF_GEN3_ZRXDC_NONCOMPL; +		reg &= ~GEN3_RELATED_OFF_RATE_SHADOW_SEL_MASK; +		reg |= FIELD_PREP(GEN3_RELATED_OFF_RATE_SHADOW_SEL_MASK, +			  speed - PCIE_SPEED_8_0GT); +		dw_pcie_writel_dbi(pci, GEN3_RELATED_OFF, reg); + +		reg = dw_pcie_readl_dbi(pci, GEN3_EQ_FB_MODE_DIR_CHANGE_OFF); +		reg &= ~(GEN3_EQ_FMDC_T_MIN_PHASE23 | +			GEN3_EQ_FMDC_N_EVALS | +			GEN3_EQ_FMDC_MAX_PRE_CURSOR_DELTA | +			GEN3_EQ_FMDC_MAX_POST_CURSOR_DELTA); +		reg |= FIELD_PREP(GEN3_EQ_FMDC_T_MIN_PHASE23, 0x1) | +			FIELD_PREP(GEN3_EQ_FMDC_N_EVALS, 0xd) | +			FIELD_PREP(GEN3_EQ_FMDC_MAX_PRE_CURSOR_DELTA, 0x5) | +			FIELD_PREP(GEN3_EQ_FMDC_MAX_POST_CURSOR_DELTA, 0x5); +		dw_pcie_writel_dbi(pci, GEN3_EQ_FB_MODE_DIR_CHANGE_OFF, reg); + +		reg = dw_pcie_readl_dbi(pci, GEN3_EQ_CONTROL_OFF); +		reg &= ~(GEN3_EQ_CONTROL_OFF_FB_MODE | +			GEN3_EQ_CONTROL_OFF_PHASE23_EXIT_MODE | +			GEN3_EQ_CONTROL_OFF_FOM_INC_INITIAL_EVAL | +			GEN3_EQ_CONTROL_OFF_PSET_REQ_VEC); +		dw_pcie_writel_dbi(pci, GEN3_EQ_CONTROL_OFF, reg); +	}  } -EXPORT_SYMBOL_GPL(qcom_pcie_common_set_16gt_equalization); +EXPORT_SYMBOL_GPL(qcom_pcie_common_set_equalization);  void qcom_pcie_common_set_16gt_lane_margining(struct dw_pcie *pci)  { | 
