Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit fff37fda authored by Sunil Goutham's avatar Sunil Goutham Committed by David S. Miller
Browse files

net: thunderx: Leave serdes lane config on 81/83xx to firmware



For DLMs and SLMs on 80/81/83xx, many lane configurations
across different boards are coming up. Also kernel doesn't have
any way to identify board type/info and since firmware does,
just get rid of figuring out lane to serdes config and take
whatever has been programmed by low level firmware.

Signed-off-by: default avatarSunil Goutham <sgoutham@cavium.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent fff4ffdd
Loading
Loading
Loading
Loading
+18 −77
Original line number Original line Diff line number Diff line
@@ -894,17 +894,15 @@ static void bgx_print_qlm_mode(struct bgx *bgx, u8 lmacid)
	struct device *dev = &bgx->pdev->dev;
	struct device *dev = &bgx->pdev->dev;
	struct lmac *lmac;
	struct lmac *lmac;
	char str[20];
	char str[20];
	u8 dlm;


	if (lmacid > bgx->max_lmac)
	if (!bgx->is_dlm && lmacid)
		return;
		return;


	lmac = &bgx->lmac[lmacid];
	lmac = &bgx->lmac[lmacid];
	dlm = (lmacid / 2) + (bgx->bgx_id * 2);
	if (!bgx->is_dlm)
	if (!bgx->is_dlm)
		sprintf(str, "BGX%d QLM mode", bgx->bgx_id);
		sprintf(str, "BGX%d QLM mode", bgx->bgx_id);
	else
	else
		sprintf(str, "BGX%d DLM%d mode", bgx->bgx_id, dlm);
		sprintf(str, "BGX%d LMAC%d mode", bgx->bgx_id, lmacid);


	switch (lmac->lmac_type) {
	switch (lmac->lmac_type) {
	case BGX_MODE_SGMII:
	case BGX_MODE_SGMII:
@@ -990,7 +988,6 @@ static void lmac_set_training(struct bgx *bgx, struct lmac *lmac, int lmacid)
static void bgx_set_lmac_config(struct bgx *bgx, u8 idx)
static void bgx_set_lmac_config(struct bgx *bgx, u8 idx)
{
{
	struct lmac *lmac;
	struct lmac *lmac;
	struct lmac *olmac;
	u64 cmr_cfg;
	u64 cmr_cfg;
	u8 lmac_type;
	u8 lmac_type;
	u8 lane_to_sds;
	u8 lane_to_sds;
@@ -1010,62 +1007,26 @@ static void bgx_set_lmac_config(struct bgx *bgx, u8 idx)
		return;
		return;
	}
	}


	/* On 81xx BGX can be split across 2 DLMs
	/* For DLMs or SLMs on 80/81/83xx so many lane configurations
	 * firmware programs lmac_type of LMAC0 and LMAC2
	 * are possible and vary across boards. Also Kernel doesn't have
	 * any way to identify board type/info and since firmware does,
	 * just take lmac type and serdes lane config as is.
	 */
	 */
	if ((idx == 0) || (idx == 2)) {
	cmr_cfg = bgx_reg_read(bgx, idx, BGX_CMRX_CFG);
	cmr_cfg = bgx_reg_read(bgx, idx, BGX_CMRX_CFG);
	lmac_type = (u8)((cmr_cfg >> 8) & 0x07);
	lmac_type = (u8)((cmr_cfg >> 8) & 0x07);
	lane_to_sds = (u8)(cmr_cfg & 0xFF);
	lane_to_sds = (u8)(cmr_cfg & 0xFF);
		/* Check if config is not reset value */
	/* Check if config is reset value */
	if ((lmac_type == 0) && (lane_to_sds == 0xE4))
	if ((lmac_type == 0) && (lane_to_sds == 0xE4))
		lmac->lmac_type = BGX_MODE_INVALID;
		lmac->lmac_type = BGX_MODE_INVALID;
	else
	else
		lmac->lmac_type = lmac_type;
		lmac->lmac_type = lmac_type;
	lmac->lane_to_sds = lane_to_sds;
	lmac_set_training(bgx, lmac, lmac->lmacid);
	lmac_set_training(bgx, lmac, lmac->lmacid);
		lmac_set_lane2sds(bgx, lmac);

		olmac = &bgx->lmac[idx + 1];
		/*  Check if other LMAC on the same DLM is already configured by
		 *  firmware, if so use the same config or else set as same, as
		 *  that of LMAC 0/2.
		 *  This check is needed as on 80xx only one lane of each of the
		 *  DLM of BGX0 is used, so have to rely on firmware for
		 *  distingushing 80xx from 81xx.
		 */
		cmr_cfg = bgx_reg_read(bgx, idx + 1, BGX_CMRX_CFG);
		lmac_type = (u8)((cmr_cfg >> 8) & 0x07);
		lane_to_sds = (u8)(cmr_cfg & 0xFF);
		if ((lmac_type == 0) && (lane_to_sds == 0xE4)) {
			olmac->lmac_type = lmac->lmac_type;
			lmac_set_lane2sds(bgx, olmac);
		} else {
			olmac->lmac_type = lmac_type;
			olmac->lane_to_sds = lane_to_sds;
		}
		lmac_set_training(bgx, olmac, olmac->lmacid);
	}
}

static bool is_dlm0_in_bgx_mode(struct bgx *bgx)
{
	struct lmac *lmac;

	if (!bgx->is_dlm)
		return true;

	lmac = &bgx->lmac[0];
	if (lmac->lmac_type == BGX_MODE_INVALID)
		return false;

	return true;
}
}


static void bgx_get_qlm_mode(struct bgx *bgx)
static void bgx_get_qlm_mode(struct bgx *bgx)
{
{
	struct lmac *lmac;
	struct lmac *lmac;
	struct lmac *lmac01;
	struct lmac *lmac23;
	u8  idx;
	u8  idx;


	/* Init all LMAC's type to invalid */
	/* Init all LMAC's type to invalid */
@@ -1081,29 +1042,9 @@ static void bgx_get_qlm_mode(struct bgx *bgx)
	if (bgx->lmac_count > bgx->max_lmac)
	if (bgx->lmac_count > bgx->max_lmac)
		bgx->lmac_count = bgx->max_lmac;
		bgx->lmac_count = bgx->max_lmac;


	for (idx = 0; idx < bgx->max_lmac; idx++)
		bgx_set_lmac_config(bgx, idx);

	if (!bgx->is_dlm || bgx->is_rgx) {
		bgx_print_qlm_mode(bgx, 0);
		return;
	}

	if (bgx->lmac_count) {
		bgx_print_qlm_mode(bgx, 0);
		bgx_print_qlm_mode(bgx, 2);
	}

	/* If DLM0 is not in BGX mode then LMAC0/1 have
	 * to be configured with serdes lanes of DLM1
	 */
	if (is_dlm0_in_bgx_mode(bgx) || (bgx->lmac_count > 2))
		return;
	for (idx = 0; idx < bgx->lmac_count; idx++) {
	for (idx = 0; idx < bgx->lmac_count; idx++) {
		lmac01 = &bgx->lmac[idx];
		bgx_set_lmac_config(bgx, idx);
		lmac23 = &bgx->lmac[idx + 2];
		bgx_print_qlm_mode(bgx, idx);
		lmac01->lmac_type = lmac23->lmac_type;
		lmac01->lane_to_sds = lmac23->lane_to_sds;
	}
	}
}
}