mirror of
https://github.com/edk2-porting/linux-next.git
synced 2024-12-27 22:53:55 +08:00
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: Sunil Goutham <sgoutham@cavium.com> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
parent
fff4ffdde1
commit
fff37fdad9
@ -894,17 +894,15 @@ static void bgx_print_qlm_mode(struct bgx *bgx, u8 lmacid)
|
||||
struct device *dev = &bgx->pdev->dev;
|
||||
struct lmac *lmac;
|
||||
char str[20];
|
||||
u8 dlm;
|
||||
|
||||
if (lmacid > bgx->max_lmac)
|
||||
if (!bgx->is_dlm && lmacid)
|
||||
return;
|
||||
|
||||
lmac = &bgx->lmac[lmacid];
|
||||
dlm = (lmacid / 2) + (bgx->bgx_id * 2);
|
||||
if (!bgx->is_dlm)
|
||||
sprintf(str, "BGX%d QLM mode", bgx->bgx_id);
|
||||
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) {
|
||||
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)
|
||||
{
|
||||
struct lmac *lmac;
|
||||
struct lmac *olmac;
|
||||
u64 cmr_cfg;
|
||||
u8 lmac_type;
|
||||
u8 lane_to_sds;
|
||||
@ -1010,62 +1007,26 @@ static void bgx_set_lmac_config(struct bgx *bgx, u8 idx)
|
||||
return;
|
||||
}
|
||||
|
||||
/* On 81xx BGX can be split across 2 DLMs
|
||||
* firmware programs lmac_type of LMAC0 and LMAC2
|
||||
/* For DLMs or SLMs on 80/81/83xx so many lane configurations
|
||||
* 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);
|
||||
lmac_type = (u8)((cmr_cfg >> 8) & 0x07);
|
||||
lane_to_sds = (u8)(cmr_cfg & 0xFF);
|
||||
/* Check if config is not reset value */
|
||||
if ((lmac_type == 0) && (lane_to_sds == 0xE4))
|
||||
lmac->lmac_type = BGX_MODE_INVALID;
|
||||
else
|
||||
lmac->lmac_type = lmac_type;
|
||||
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;
|
||||
cmr_cfg = bgx_reg_read(bgx, idx, BGX_CMRX_CFG);
|
||||
lmac_type = (u8)((cmr_cfg >> 8) & 0x07);
|
||||
lane_to_sds = (u8)(cmr_cfg & 0xFF);
|
||||
/* Check if config is reset value */
|
||||
if ((lmac_type == 0) && (lane_to_sds == 0xE4))
|
||||
lmac->lmac_type = BGX_MODE_INVALID;
|
||||
else
|
||||
lmac->lmac_type = lmac_type;
|
||||
lmac->lane_to_sds = lane_to_sds;
|
||||
lmac_set_training(bgx, lmac, lmac->lmacid);
|
||||
}
|
||||
|
||||
static void bgx_get_qlm_mode(struct bgx *bgx)
|
||||
{
|
||||
struct lmac *lmac;
|
||||
struct lmac *lmac01;
|
||||
struct lmac *lmac23;
|
||||
u8 idx;
|
||||
|
||||
/* 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)
|
||||
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++) {
|
||||
lmac01 = &bgx->lmac[idx];
|
||||
lmac23 = &bgx->lmac[idx + 2];
|
||||
lmac01->lmac_type = lmac23->lmac_type;
|
||||
lmac01->lane_to_sds = lmac23->lane_to_sds;
|
||||
bgx_set_lmac_config(bgx, idx);
|
||||
bgx_print_qlm_mode(bgx, idx);
|
||||
}
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user