Commit 4e92d504 authored by Manivannan Sadhasivam's avatar Manivannan Sadhasivam Committed by Vinod Koul
Browse files

phy: qcom: qmp: Add debug prints for register writes



These register prints are useful to validate the init sequence against the
Qcom internal documentation and also to share with the Qcom hw engineers to
debug issues related to PHY.

Sample debug prints:

qcom-qmp-pcie-phy 1c0e000.phy: Writing Reg: QSERDES_V5_COM_SYSCLK_EN_SEL Offset: 0x0094 Val: 0xd9
qcom-qmp-pcie-phy 1c0e000.phy: Writing Reg: QSERDES_V5_COM_HSCLK_SEL Offset: 0x0158 Val: 0x11

Signed-off-by: default avatarManivannan Sadhasivam <manivannan.sadhasivam@linaro.org>
Reviewed-by: default avatarDmitry Baryshkov <dmitry.baryshkov@linaro.org>
Link: https://lore.kernel.org/r/20240731152548.102987-1-manivannan.sadhasivam@linaro.org


Signed-off-by: default avatarVinod Koul <vkoul@kernel.org>
parent f75999c5
Loading
Loading
Loading
Loading
+20 −18
Original line number Diff line number Diff line
@@ -2190,23 +2190,24 @@ static int qmp_combo_dp_serdes_init(struct qmp_combo *qmp)
	void __iomem *serdes = qmp->dp_serdes;
	const struct phy_configure_opts_dp *dp_opts = &qmp->dp_opts;

	qmp_configure(serdes, cfg->dp_serdes_tbl, cfg->dp_serdes_tbl_num);
	qmp_configure(qmp->dev, serdes, cfg->dp_serdes_tbl,
		      cfg->dp_serdes_tbl_num);

	switch (dp_opts->link_rate) {
	case 1620:
		qmp_configure(serdes, cfg->serdes_tbl_rbr,
		qmp_configure(qmp->dev, serdes, cfg->serdes_tbl_rbr,
			      cfg->serdes_tbl_rbr_num);
		break;
	case 2700:
		qmp_configure(serdes, cfg->serdes_tbl_hbr,
		qmp_configure(qmp->dev, serdes, cfg->serdes_tbl_hbr,
			      cfg->serdes_tbl_hbr_num);
		break;
	case 5400:
		qmp_configure(serdes, cfg->serdes_tbl_hbr2,
		qmp_configure(qmp->dev, serdes, cfg->serdes_tbl_hbr2,
			      cfg->serdes_tbl_hbr2_num);
		break;
	case 8100:
		qmp_configure(serdes, cfg->serdes_tbl_hbr3,
		qmp_configure(qmp->dev, serdes, cfg->serdes_tbl_hbr3,
			      cfg->serdes_tbl_hbr3_num);
		break;
	default:
@@ -2807,8 +2808,8 @@ static int qmp_combo_dp_power_on(struct phy *phy)

	qmp_combo_dp_serdes_init(qmp);

	qmp_configure_lane(tx, cfg->dp_tx_tbl, cfg->dp_tx_tbl_num, 1);
	qmp_configure_lane(tx2, cfg->dp_tx_tbl, cfg->dp_tx_tbl_num, 2);
	qmp_configure_lane(qmp->dev, tx, cfg->dp_tx_tbl, cfg->dp_tx_tbl_num, 1);
	qmp_configure_lane(qmp->dev, tx2, cfg->dp_tx_tbl, cfg->dp_tx_tbl_num, 2);

	/* Configure special DP tx tunings */
	cfg->configure_dp_tx(qmp);
@@ -2850,7 +2851,7 @@ static int qmp_combo_usb_power_on(struct phy *phy)
	unsigned int val;
	int ret;

	qmp_configure(serdes, cfg->serdes_tbl, cfg->serdes_tbl_num);
	qmp_configure(qmp->dev, serdes, cfg->serdes_tbl, cfg->serdes_tbl_num);

	ret = clk_prepare_enable(qmp->pipe_clk);
	if (ret) {
@@ -2859,16 +2860,17 @@ static int qmp_combo_usb_power_on(struct phy *phy)
	}

	/* Tx, Rx, and PCS configurations */
	qmp_configure_lane(tx, cfg->tx_tbl, cfg->tx_tbl_num, 1);
	qmp_configure_lane(tx2, cfg->tx_tbl, cfg->tx_tbl_num, 2);
	qmp_configure_lane(qmp->dev, tx, cfg->tx_tbl, cfg->tx_tbl_num, 1);
	qmp_configure_lane(qmp->dev, tx2, cfg->tx_tbl, cfg->tx_tbl_num, 2);

	qmp_configure_lane(rx, cfg->rx_tbl, cfg->rx_tbl_num, 1);
	qmp_configure_lane(rx2, cfg->rx_tbl, cfg->rx_tbl_num, 2);
	qmp_configure_lane(qmp->dev, rx, cfg->rx_tbl, cfg->rx_tbl_num, 1);
	qmp_configure_lane(qmp->dev, rx2, cfg->rx_tbl, cfg->rx_tbl_num, 2);

	qmp_configure(pcs, cfg->pcs_tbl, cfg->pcs_tbl_num);
	qmp_configure(qmp->dev, pcs, cfg->pcs_tbl, cfg->pcs_tbl_num);

	if (pcs_usb)
		qmp_configure(pcs_usb, cfg->pcs_usb_tbl, cfg->pcs_usb_tbl_num);
		qmp_configure(qmp->dev, pcs_usb, cfg->pcs_usb_tbl,
			      cfg->pcs_usb_tbl_num);

	if (cfg->has_pwrdn_delay)
		usleep_range(10, 20);
+11 −8
Original line number Diff line number Diff line
@@ -9,6 +9,7 @@
struct qmp_phy_init_tbl {
	unsigned int offset;
	unsigned int val;
	char *name;
	/*
	 * mask of lanes for which this register is written
	 * for cases when second lane needs different values
@@ -20,6 +21,7 @@ struct qmp_phy_init_tbl {
	{				\
		.offset = o,		\
		.val = v,		\
		.name = #o,		\
		.lane_mask = 0xff,	\
	}

@@ -27,13 +29,13 @@ struct qmp_phy_init_tbl {
	{				\
		.offset = o,		\
		.val = v,		\
		.name = #o,		\
		.lane_mask = l,		\
	}

static inline void qmp_configure_lane(void __iomem *base,
static inline void qmp_configure_lane(struct device *dev, void __iomem *base,
				      const struct qmp_phy_init_tbl tbl[],
					   int num,
					   u8 lane_mask)
				      int num, u8 lane_mask)
{
	int i;
	const struct qmp_phy_init_tbl *t = tbl;
@@ -45,15 +47,16 @@ static inline void qmp_configure_lane(void __iomem *base,
		if (!(t->lane_mask & lane_mask))
			continue;

		dev_dbg(dev, "Writing Reg: %s Offset: 0x%04x Val: 0x%02x\n",
			t->name, t->offset, t->val);
		writel(t->val, base + t->offset);
	}
}

static inline void qmp_configure(void __iomem *base,
				      const struct qmp_phy_init_tbl tbl[],
				      int num)
static inline void qmp_configure(struct device *dev, void __iomem *base,
				 const struct qmp_phy_init_tbl tbl[], int num)
{
	qmp_configure_lane(base, tbl, num, 0xff);
	qmp_configure_lane(dev, base, tbl, num, 0xff);
}

#endif
+4 −4
Original line number Diff line number Diff line
@@ -288,7 +288,7 @@ static int qmp_pcie_msm8996_serdes_init(struct qmp_phy *qphy)
	unsigned int val;
	int ret;

	qmp_configure(serdes, serdes_tbl, serdes_tbl_num);
	qmp_configure(qmp->dev, serdes, serdes_tbl, serdes_tbl_num);

	qphy_clrbits(serdes, cfg->regs[QPHY_COM_SW_RESET], SW_RESET);
	qphy_setbits(serdes, cfg->regs[QPHY_COM_START_CONTROL],
@@ -431,9 +431,9 @@ static int qmp_pcie_msm8996_power_on(struct phy *phy)
	}

	/* Tx, Rx, and PCS configurations */
	qmp_configure_lane(tx, cfg->tx_tbl, cfg->tx_tbl_num, 1);
	qmp_configure_lane(rx, cfg->rx_tbl, cfg->rx_tbl_num, 1);
	qmp_configure(pcs, cfg->pcs_tbl, cfg->pcs_tbl_num);
	qmp_configure_lane(qmp->dev, tx, cfg->tx_tbl, cfg->tx_tbl_num, 1);
	qmp_configure_lane(qmp->dev, rx, cfg->rx_tbl, cfg->rx_tbl_num, 1);
	qmp_configure(qmp->dev, pcs, cfg->pcs_tbl, cfg->pcs_tbl_num);

	/*
	 * Pull out PHY from POWER DOWN state.
+14 −13
Original line number Diff line number Diff line
@@ -3667,11 +3667,11 @@ static void qmp_pcie_init_port_b(struct qmp_pcie *qmp, const struct qmp_phy_cfg_
	tx4 = qmp->port_b + offs->tx2;
	rx4 = qmp->port_b + offs->rx2;

	qmp_configure_lane(tx3, tbls->tx, tbls->tx_num, 1);
	qmp_configure_lane(rx3, tbls->rx, tbls->rx_num, 1);
	qmp_configure_lane(qmp->dev, tx3, tbls->tx, tbls->tx_num, 1);
	qmp_configure_lane(qmp->dev, rx3, tbls->rx, tbls->rx_num, 1);

	qmp_configure_lane(tx4, tbls->tx, tbls->tx_num, 2);
	qmp_configure_lane(rx4, tbls->rx, tbls->rx_num, 2);
	qmp_configure_lane(qmp->dev, tx4, tbls->tx, tbls->tx_num, 2);
	qmp_configure_lane(qmp->dev, rx4, tbls->rx, tbls->rx_num, 2);
}

static void qmp_pcie_init_registers(struct qmp_pcie *qmp, const struct qmp_phy_cfg_tbls *tbls)
@@ -3689,25 +3689,26 @@ static void qmp_pcie_init_registers(struct qmp_pcie *qmp, const struct qmp_phy_c
	if (!tbls)
		return;

	qmp_configure(serdes, tbls->serdes, tbls->serdes_num);
	qmp_configure(qmp->dev, serdes, tbls->serdes, tbls->serdes_num);

	qmp_configure_lane(tx, tbls->tx, tbls->tx_num, 1);
	qmp_configure_lane(rx, tbls->rx, tbls->rx_num, 1);
	qmp_configure_lane(qmp->dev, tx, tbls->tx, tbls->tx_num, 1);
	qmp_configure_lane(qmp->dev, rx, tbls->rx, tbls->rx_num, 1);

	if (cfg->lanes >= 2) {
		qmp_configure_lane(tx2, tbls->tx, tbls->tx_num, 2);
		qmp_configure_lane(rx2, tbls->rx, tbls->rx_num, 2);
		qmp_configure_lane(qmp->dev, tx2, tbls->tx, tbls->tx_num, 2);
		qmp_configure_lane(qmp->dev, rx2, tbls->rx, tbls->rx_num, 2);
	}

	qmp_configure(pcs, tbls->pcs, tbls->pcs_num);
	qmp_configure(pcs_misc, tbls->pcs_misc, tbls->pcs_misc_num);
	qmp_configure(qmp->dev, pcs, tbls->pcs, tbls->pcs_num);
	qmp_configure(qmp->dev, pcs_misc, tbls->pcs_misc, tbls->pcs_misc_num);

	if (cfg->lanes >= 4 && qmp->tcsr_4ln_config) {
		qmp_configure(serdes, cfg->serdes_4ln_tbl, cfg->serdes_4ln_num);
		qmp_configure(qmp->dev, serdes, cfg->serdes_4ln_tbl,
			      cfg->serdes_4ln_num);
		qmp_pcie_init_port_b(qmp, tbls);
	}

	qmp_configure(ln_shrd, tbls->ln_shrd, tbls->ln_shrd_num);
	qmp_configure(qmp->dev, ln_shrd, tbls->ln_shrd, tbls->ln_shrd_num);
}

static int qmp_pcie_init(struct phy *phy)
+6 −6
Original line number Diff line number Diff line
@@ -1527,7 +1527,7 @@ static void qmp_ufs_serdes_init(struct qmp_ufs *qmp, const struct qmp_phy_cfg_tb
{
	void __iomem *serdes = qmp->serdes;

	qmp_configure(serdes, tbls->serdes, tbls->serdes_num);
	qmp_configure(qmp->dev, serdes, tbls->serdes, tbls->serdes_num);
}

static void qmp_ufs_lanes_init(struct qmp_ufs *qmp, const struct qmp_phy_cfg_tbls *tbls)
@@ -1536,12 +1536,12 @@ static void qmp_ufs_lanes_init(struct qmp_ufs *qmp, const struct qmp_phy_cfg_tbl
	void __iomem *tx = qmp->tx;
	void __iomem *rx = qmp->rx;

	qmp_configure_lane(tx, tbls->tx, tbls->tx_num, 1);
	qmp_configure_lane(rx, tbls->rx, tbls->rx_num, 1);
	qmp_configure_lane(qmp->dev, tx, tbls->tx, tbls->tx_num, 1);
	qmp_configure_lane(qmp->dev, rx, tbls->rx, tbls->rx_num, 1);

	if (cfg->lanes >= 2) {
		qmp_configure_lane(qmp->tx2, tbls->tx, tbls->tx_num, 2);
		qmp_configure_lane(qmp->rx2, tbls->rx, tbls->rx_num, 2);
		qmp_configure_lane(qmp->dev, qmp->tx2, tbls->tx, tbls->tx_num, 2);
		qmp_configure_lane(qmp->dev, qmp->rx2, tbls->rx, tbls->rx_num, 2);
	}
}

@@ -1549,7 +1549,7 @@ static void qmp_ufs_pcs_init(struct qmp_ufs *qmp, const struct qmp_phy_cfg_tbls
{
	void __iomem *pcs = qmp->pcs;

	qmp_configure(pcs, tbls->pcs, tbls->pcs_num);
	qmp_configure(qmp->dev, pcs, tbls->pcs, tbls->pcs_num);
}

static int qmp_ufs_get_gear_overlay(struct qmp_ufs *qmp, const struct qmp_phy_cfg *cfg)
Loading