提交 71fe2225 编写于 作者: H Hou Zhiqiang 提交者: York Sun

fsl: serdes: ensure accessing the initialized maps of serdes protocol

Up to now, the function is_serdes_configed() doesn't check if the map
of serdes protocol is initialized before accessing it. The function
is_serdes_configed() will get wrong result when it was called before
the serdes protocol maps initialized. As the first element of the map
isn't used for any device, so use it as the flag to indicate if the
map has been initialized.
Signed-off-by: NHou Zhiqiang <Zhiqiang.Hou@nxp.com>
Reviewed-by: NYork Sun <york.sun@nxp.com>
上级 07806e62
...@@ -23,9 +23,15 @@ int is_serdes_configured(enum srds_prtcl device) ...@@ -23,9 +23,15 @@ int is_serdes_configured(enum srds_prtcl device)
u64 ret = 0; u64 ret = 0;
#ifdef CONFIG_SYS_FSL_SRDS_1 #ifdef CONFIG_SYS_FSL_SRDS_1
if (!(serdes1_prtcl_map & (1ULL << NONE)))
fsl_serdes_init();
ret |= (1ULL << device) & serdes1_prtcl_map; ret |= (1ULL << device) & serdes1_prtcl_map;
#endif #endif
#ifdef CONFIG_SYS_FSL_SRDS_2 #ifdef CONFIG_SYS_FSL_SRDS_2
if (!(serdes2_prtcl_map & (1ULL << NONE)))
fsl_serdes_init();
ret |= (1ULL << device) & serdes2_prtcl_map; ret |= (1ULL << device) & serdes2_prtcl_map;
#endif #endif
...@@ -87,19 +93,24 @@ u64 serdes_init(u32 sd, u32 sd_addr, u32 sd_prctl_mask, u32 sd_prctl_shift) ...@@ -87,19 +93,24 @@ u64 serdes_init(u32 sd, u32 sd_addr, u32 sd_prctl_mask, u32 sd_prctl_shift)
serdes_prtcl_map |= (1ULL << lane_prtcl); serdes_prtcl_map |= (1ULL << lane_prtcl);
} }
/* Set the first bit to indicate serdes has been initialized */
serdes_prtcl_map |= (1ULL << NONE);
return serdes_prtcl_map; return serdes_prtcl_map;
} }
void fsl_serdes_init(void) void fsl_serdes_init(void)
{ {
#ifdef CONFIG_SYS_FSL_SRDS_1 #ifdef CONFIG_SYS_FSL_SRDS_1
serdes1_prtcl_map = serdes_init(FSL_SRDS_1, if (!(serdes1_prtcl_map & (1ULL << NONE)))
serdes1_prtcl_map = serdes_init(FSL_SRDS_1,
CONFIG_SYS_FSL_SERDES_ADDR, CONFIG_SYS_FSL_SERDES_ADDR,
RCWSR4_SRDS1_PRTCL_MASK, RCWSR4_SRDS1_PRTCL_MASK,
RCWSR4_SRDS1_PRTCL_SHIFT); RCWSR4_SRDS1_PRTCL_SHIFT);
#endif #endif
#ifdef CONFIG_SYS_FSL_SRDS_2 #ifdef CONFIG_SYS_FSL_SRDS_2
serdes2_prtcl_map = serdes_init(FSL_SRDS_2, if (!(serdes2_prtcl_map & (1ULL << NONE)))
serdes2_prtcl_map = serdes_init(FSL_SRDS_2,
CONFIG_SYS_FSL_SERDES_ADDR + CONFIG_SYS_FSL_SERDES_ADDR +
FSL_SRDS_2 * 0x1000, FSL_SRDS_2 * 0x1000,
RCWSR4_SRDS2_PRTCL_MASK, RCWSR4_SRDS2_PRTCL_MASK,
......
...@@ -22,9 +22,15 @@ int is_serdes_configured(enum srds_prtcl device) ...@@ -22,9 +22,15 @@ int is_serdes_configured(enum srds_prtcl device)
int ret = 0; int ret = 0;
#ifdef CONFIG_SYS_FSL_SRDS_1 #ifdef CONFIG_SYS_FSL_SRDS_1
if (!serdes1_prtcl_map[NONE])
fsl_serdes_init();
ret |= serdes1_prtcl_map[device]; ret |= serdes1_prtcl_map[device];
#endif #endif
#ifdef CONFIG_SYS_FSL_SRDS_2 #ifdef CONFIG_SYS_FSL_SRDS_2
if (!serdes2_prtcl_map[NONE])
fsl_serdes_init();
ret |= serdes2_prtcl_map[device]; ret |= serdes2_prtcl_map[device];
#endif #endif
...@@ -98,6 +104,9 @@ void serdes_init(u32 sd, u32 sd_addr, u32 sd_prctl_mask, u32 sd_prctl_shift, ...@@ -98,6 +104,9 @@ void serdes_init(u32 sd, u32 sd_addr, u32 sd_prctl_mask, u32 sd_prctl_shift,
u32 cfg; u32 cfg;
int lane; int lane;
if (serdes_prtcl_map[NONE])
return;
memset(serdes_prtcl_map, 0, sizeof(u8) * SERDES_PRCTL_COUNT); memset(serdes_prtcl_map, 0, sizeof(u8) * SERDES_PRCTL_COUNT);
cfg = gur_in32(&gur->rcwsr[4]) & sd_prctl_mask; cfg = gur_in32(&gur->rcwsr[4]) & sd_prctl_mask;
...@@ -115,6 +124,9 @@ void serdes_init(u32 sd, u32 sd_addr, u32 sd_prctl_mask, u32 sd_prctl_shift, ...@@ -115,6 +124,9 @@ void serdes_init(u32 sd, u32 sd_addr, u32 sd_prctl_mask, u32 sd_prctl_shift,
else else
serdes_prtcl_map[lane_prtcl] = 1; serdes_prtcl_map[lane_prtcl] = 1;
} }
/* Set the first element to indicate serdes has been initialized */
serdes_prtcl_map[NONE] = 1;
} }
void fsl_serdes_init(void) void fsl_serdes_init(void)
......
...@@ -28,9 +28,15 @@ int is_serdes_configured(enum srds_prtcl device) ...@@ -28,9 +28,15 @@ int is_serdes_configured(enum srds_prtcl device)
int ret = 0; int ret = 0;
#ifdef CONFIG_SYS_FSL_SRDS_1 #ifdef CONFIG_SYS_FSL_SRDS_1
if (!serdes1_prtcl_map[NONE])
fsl_serdes_init();
ret |= serdes1_prtcl_map[device]; ret |= serdes1_prtcl_map[device];
#endif #endif
#ifdef CONFIG_SYS_FSL_SRDS_2 #ifdef CONFIG_SYS_FSL_SRDS_2
if (!serdes2_prtcl_map[NONE])
fsl_serdes_init();
ret |= serdes2_prtcl_map[device]; ret |= serdes2_prtcl_map[device];
#endif #endif
...@@ -79,6 +85,9 @@ void serdes_init(u32 sd, u32 sd_addr, u32 sd_prctl_mask, u32 sd_prctl_shift, ...@@ -79,6 +85,9 @@ void serdes_init(u32 sd, u32 sd_addr, u32 sd_prctl_mask, u32 sd_prctl_shift,
u32 cfg; u32 cfg;
int lane; int lane;
if (serdes_prtcl_map[NONE])
return;
memset(serdes_prtcl_map, 0, sizeof(u8) * SERDES_PRCTL_COUNT); memset(serdes_prtcl_map, 0, sizeof(u8) * SERDES_PRCTL_COUNT);
cfg = gur_in32(&gur->rcwsr[28]) & sd_prctl_mask; cfg = gur_in32(&gur->rcwsr[28]) & sd_prctl_mask;
...@@ -136,6 +145,9 @@ void serdes_init(u32 sd, u32 sd_addr, u32 sd_prctl_mask, u32 sd_prctl_shift, ...@@ -136,6 +145,9 @@ void serdes_init(u32 sd, u32 sd_addr, u32 sd_prctl_mask, u32 sd_prctl_shift,
#endif #endif
} }
} }
/* Set the first element to indicate serdes has been initialized */
serdes_prtcl_map[NONE] = 1;
} }
void fsl_serdes_init(void) void fsl_serdes_init(void)
......
...@@ -11,6 +11,10 @@ ...@@ -11,6 +11,10 @@
#ifdef CONFIG_LS2080A #ifdef CONFIG_LS2080A
enum srds_prtcl { enum srds_prtcl {
/*
* Nobody will check whether the device 'NONE' has been configured,
* So use it to indicate if the serdes_prtcl_map has been initialized.
*/
NONE = 0, NONE = 0,
PCIE1, PCIE1,
PCIE2, PCIE2,
...@@ -57,6 +61,10 @@ enum srds { ...@@ -57,6 +61,10 @@ enum srds {
}; };
#elif defined(CONFIG_FSL_LSCH2) #elif defined(CONFIG_FSL_LSCH2)
enum srds_prtcl { enum srds_prtcl {
/*
* Nobody will check whether the device 'NONE' has been configured,
* So use it to indicate if the serdes_prtcl_map has been initialized.
*/
NONE = 0, NONE = 0,
PCIE1, PCIE1,
PCIE2, PCIE2,
......
...@@ -10,6 +10,10 @@ ...@@ -10,6 +10,10 @@
#include <config.h> #include <config.h>
enum srds_prtcl { enum srds_prtcl {
/*
* Nobody will check whether the device 'NONE' has been configured,
* So use it to indicate if the serdes_prtcl_map has been initialized.
*/
NONE = 0, NONE = 0,
PCIE1, PCIE1,
PCIE2, PCIE2,
......
...@@ -68,6 +68,9 @@ static u8 serdes1_cfg_tbl[][SRDS1_MAX_LANES] = { ...@@ -68,6 +68,9 @@ static u8 serdes1_cfg_tbl[][SRDS1_MAX_LANES] = {
int is_serdes_configured(enum srds_prtcl prtcl) int is_serdes_configured(enum srds_prtcl prtcl)
{ {
if (!(serdes1_prtcl_map & (1 << NONE)))
fsl_serdes_init();
return (1 << prtcl) & serdes1_prtcl_map; return (1 << prtcl) & serdes1_prtcl_map;
} }
...@@ -79,6 +82,9 @@ void fsl_serdes_init(void) ...@@ -79,6 +82,9 @@ void fsl_serdes_init(void)
MPC85xx_PORDEVSR_IO_SEL_SHIFT; MPC85xx_PORDEVSR_IO_SEL_SHIFT;
int lane; int lane;
if (serdes1_prtcl_map & (1 << NONE))
return;
debug("PORDEVSR[IO_SEL_SRDS] = %x\n", srds_cfg); debug("PORDEVSR[IO_SEL_SRDS] = %x\n", srds_cfg);
if (srds_cfg >= ARRAY_SIZE(serdes1_cfg_tbl)) { if (srds_cfg >= ARRAY_SIZE(serdes1_cfg_tbl)) {
...@@ -90,4 +96,7 @@ void fsl_serdes_init(void) ...@@ -90,4 +96,7 @@ void fsl_serdes_init(void)
enum srds_prtcl lane_prtcl = serdes1_cfg_tbl[srds_cfg][lane]; enum srds_prtcl lane_prtcl = serdes1_cfg_tbl[srds_cfg][lane];
serdes1_prtcl_map |= (1 << lane_prtcl); serdes1_prtcl_map |= (1 << lane_prtcl);
} }
/* Set the first bit to indicate serdes has been initialized */
serdes1_prtcl_map |= (1 << NONE);
} }
...@@ -32,6 +32,9 @@ static const struct serdes_config serdes1_cfg_tbl[] = { ...@@ -32,6 +32,9 @@ static const struct serdes_config serdes1_cfg_tbl[] = {
int is_serdes_configured(enum srds_prtcl device) int is_serdes_configured(enum srds_prtcl device)
{ {
if (!(serdes1_prtcl_map & (1 << NONE)))
fsl_serdes_init();
return (1 << device) & serdes1_prtcl_map; return (1 << device) & serdes1_prtcl_map;
} }
...@@ -44,6 +47,9 @@ void fsl_serdes_init(void) ...@@ -44,6 +47,9 @@ void fsl_serdes_init(void)
const struct serdes_config *ptr; const struct serdes_config *ptr;
int lane; int lane;
if (serdes1_prtcl_map & (1 << NONE))
return;
debug("PORDEVSR[IO_SEL_SRDS] = %x\n", srds_cfg); debug("PORDEVSR[IO_SEL_SRDS] = %x\n", srds_cfg);
if (srds_cfg > ARRAY_SIZE(serdes1_cfg_tbl)) { if (srds_cfg > ARRAY_SIZE(serdes1_cfg_tbl)) {
...@@ -59,4 +65,7 @@ void fsl_serdes_init(void) ...@@ -59,4 +65,7 @@ void fsl_serdes_init(void)
enum srds_prtcl lane_prtcl = ptr->lanes[lane]; enum srds_prtcl lane_prtcl = ptr->lanes[lane];
serdes1_prtcl_map |= (1 << lane_prtcl); serdes1_prtcl_map |= (1 << lane_prtcl);
} }
/* Set the first bit to indicate serdes has been initialized */
serdes1_prtcl_map |= (1 << NONE);
} }
...@@ -92,15 +92,27 @@ int is_serdes_configured(enum srds_prtcl device) ...@@ -92,15 +92,27 @@ int is_serdes_configured(enum srds_prtcl device)
int ret = 0; int ret = 0;
#ifdef CONFIG_SYS_FSL_SRDS_1 #ifdef CONFIG_SYS_FSL_SRDS_1
if (!serdes1_prtcl_map[NONE])
fsl_serdes_init();
ret |= serdes1_prtcl_map[device]; ret |= serdes1_prtcl_map[device];
#endif #endif
#ifdef CONFIG_SYS_FSL_SRDS_2 #ifdef CONFIG_SYS_FSL_SRDS_2
if (!serdes2_prtcl_map[NONE])
fsl_serdes_init();
ret |= serdes2_prtcl_map[device]; ret |= serdes2_prtcl_map[device];
#endif #endif
#ifdef CONFIG_SYS_FSL_SRDS_3 #ifdef CONFIG_SYS_FSL_SRDS_3
if (!serdes3_prtcl_map[NONE])
fsl_serdes_init();
ret |= serdes3_prtcl_map[device]; ret |= serdes3_prtcl_map[device];
#endif #endif
#ifdef CONFIG_SYS_FSL_SRDS_4 #ifdef CONFIG_SYS_FSL_SRDS_4
if (!serdes4_prtcl_map[NONE])
fsl_serdes_init();
ret |= serdes4_prtcl_map[device]; ret |= serdes4_prtcl_map[device];
#endif #endif
...@@ -184,6 +196,9 @@ void serdes_init(u32 sd, u32 sd_addr, u32 sd_prctl_mask, u32 sd_prctl_shift, ...@@ -184,6 +196,9 @@ void serdes_init(u32 sd, u32 sd_addr, u32 sd_prctl_mask, u32 sd_prctl_shift,
u32 cfg; u32 cfg;
int lane; int lane;
if (serdes_prtcl_map[NONE])
return;
memset(serdes_prtcl_map, 0, sizeof(u8) * SERDES_PRCTL_COUNT); memset(serdes_prtcl_map, 0, sizeof(u8) * SERDES_PRCTL_COUNT);
#ifdef CONFIG_SYS_FSL_ERRATUM_A007186 #ifdef CONFIG_SYS_FSL_ERRATUM_A007186
struct ccsr_sfp_regs __iomem *sfp_regs = struct ccsr_sfp_regs __iomem *sfp_regs =
...@@ -325,6 +340,9 @@ void serdes_init(u32 sd, u32 sd_addr, u32 sd_prctl_mask, u32 sd_prctl_shift, ...@@ -325,6 +340,9 @@ void serdes_init(u32 sd, u32 sd_addr, u32 sd_prctl_mask, u32 sd_prctl_shift,
else else
serdes_prtcl_map[lane_prtcl] = 1; serdes_prtcl_map[lane_prtcl] = 1;
} }
/* Set the first element to indicate serdes has been initialized */
serdes_prtcl_map[NONE] = 1;
} }
void fsl_serdes_init(void) void fsl_serdes_init(void)
......
...@@ -136,6 +136,9 @@ int is_serdes_configured(enum srds_prtcl device) ...@@ -136,6 +136,9 @@ int is_serdes_configured(enum srds_prtcl device)
if (!(in_be32(&gur->rcwsr[5]) & FSL_CORENET_RCWSR5_SRDS_EN)) if (!(in_be32(&gur->rcwsr[5]) & FSL_CORENET_RCWSR5_SRDS_EN))
return 0; return 0;
if (!(serdes_prtcl_map & (1 << NONE)))
fsl_serdes_init();
return (1 << device) & serdes_prtcl_map; return (1 << device) & serdes_prtcl_map;
} }
...@@ -514,6 +517,8 @@ void fsl_serdes_init(void) ...@@ -514,6 +517,8 @@ void fsl_serdes_init(void)
if (getenv_f("hwconfig", buffer, sizeof(buffer)) > 0) if (getenv_f("hwconfig", buffer, sizeof(buffer)) > 0)
buf = buffer; buf = buffer;
#endif #endif
if (serdes_prtcl_map & (1 << NONE))
return;
/* Is serdes enabled at all? */ /* Is serdes enabled at all? */
if (!(in_be32(&gur->rcwsr[5]) & FSL_CORENET_RCWSR5_SRDS_EN)) if (!(in_be32(&gur->rcwsr[5]) & FSL_CORENET_RCWSR5_SRDS_EN))
...@@ -857,6 +862,9 @@ void fsl_serdes_init(void) ...@@ -857,6 +862,9 @@ void fsl_serdes_init(void)
SRDS_RSTCTL_SDPD); SRDS_RSTCTL_SDPD);
} }
#endif #endif
/* Set the first bit to indicate serdes has been initialized */
serdes_prtcl_map |= (1 << NONE);
} }
const char *serdes_clock_to_string(u32 clock) const char *serdes_clock_to_string(u32 clock)
......
...@@ -71,11 +71,19 @@ static u8 serdes2_cfg_tbl[][SRDS2_MAX_LANES] = { ...@@ -71,11 +71,19 @@ static u8 serdes2_cfg_tbl[][SRDS2_MAX_LANES] = {
int is_serdes_configured(enum srds_prtcl device) int is_serdes_configured(enum srds_prtcl device)
{ {
int ret = (1 << device) & serdes1_prtcl_map; int ret;
if (!(serdes1_prtcl_map & (1 << NONE)))
fsl_serdes_init();
ret = (1 << device) & serdes1_prtcl_map;
if (ret) if (ret)
return ret; return ret;
if (!(serdes2_prtcl_map & (1 << NONE)))
fsl_serdes_init();
return (1 << device) & serdes2_prtcl_map; return (1 << device) & serdes2_prtcl_map;
} }
...@@ -88,6 +96,10 @@ void fsl_serdes_init(void) ...@@ -88,6 +96,10 @@ void fsl_serdes_init(void)
u32 tmp; u32 tmp;
int lane; int lane;
if (serdes1_prtcl_map & (1 << NONE) &&
serdes2_prtcl_map & (1 << NONE))
return;
srds1_io_sel = (pordevsr & MPC85xx_PORDEVSR_IO_SEL) >> srds1_io_sel = (pordevsr & MPC85xx_PORDEVSR_IO_SEL) >>
MPC85xx_PORDEVSR_IO_SEL_SHIFT; MPC85xx_PORDEVSR_IO_SEL_SHIFT;
...@@ -221,6 +233,9 @@ void fsl_serdes_init(void) ...@@ -221,6 +233,9 @@ void fsl_serdes_init(void)
serdes1_prtcl_map |= (1 << lane_prtcl); serdes1_prtcl_map |= (1 << lane_prtcl);
} }
/* Set the first bit to indicate serdes has been initialized */
serdes1_prtcl_map |= (1 << NONE);
if (srds2_io_sel >= ARRAY_SIZE(serdes2_cfg_tbl)) { if (srds2_io_sel >= ARRAY_SIZE(serdes2_cfg_tbl)) {
printf("Invalid PORDEVSR[SRDS2_IO_SEL] = %d\n", srds2_io_sel); printf("Invalid PORDEVSR[SRDS2_IO_SEL] = %d\n", srds2_io_sel);
return; return;
...@@ -230,4 +245,7 @@ void fsl_serdes_init(void) ...@@ -230,4 +245,7 @@ void fsl_serdes_init(void)
enum srds_prtcl lane_prtcl = serdes2_cfg_tbl[srds2_io_sel][lane]; enum srds_prtcl lane_prtcl = serdes2_cfg_tbl[srds2_io_sel][lane];
serdes2_prtcl_map |= (1 << lane_prtcl); serdes2_prtcl_map |= (1 << lane_prtcl);
} }
/* Set the first bit to indicate serdes has been initialized */
serdes2_prtcl_map |= (1 << NONE);
} }
...@@ -34,11 +34,19 @@ static u8 serdes2_cfg_tbl[][SRDS2_MAX_LANES] = { ...@@ -34,11 +34,19 @@ static u8 serdes2_cfg_tbl[][SRDS2_MAX_LANES] = {
int is_serdes_configured(enum srds_prtcl device) int is_serdes_configured(enum srds_prtcl device)
{ {
int ret = (1 << device) & serdes1_prtcl_map; int ret;
if (!(serdes1_prtcl_map & (1 << NONE)))
fsl_serdes_init();
ret = (1 << device) & serdes1_prtcl_map;
if (ret) if (ret)
return ret; return ret;
if (!(serdes2_prtcl_map & (1 << NONE)))
fsl_serdes_init();
return (1 << device) & serdes2_prtcl_map; return (1 << device) & serdes2_prtcl_map;
} }
...@@ -50,6 +58,10 @@ void fsl_serdes_init(void) ...@@ -50,6 +58,10 @@ void fsl_serdes_init(void)
MPC85xx_PORDEVSR_IO_SEL_SHIFT; MPC85xx_PORDEVSR_IO_SEL_SHIFT;
int lane; int lane;
if (serdes1_prtcl_map & (1 << NONE) &&
serdes2_prtcl_map & (1 << NONE))
return;
debug("PORDEVSR[IO_SEL_SRDS] = %x\n", srds_cfg); debug("PORDEVSR[IO_SEL_SRDS] = %x\n", srds_cfg);
if (srds_cfg >= ARRAY_SIZE(serdes1_cfg_tbl)) { if (srds_cfg >= ARRAY_SIZE(serdes1_cfg_tbl)) {
...@@ -61,6 +73,9 @@ void fsl_serdes_init(void) ...@@ -61,6 +73,9 @@ void fsl_serdes_init(void)
serdes1_prtcl_map |= (1 << lane_prtcl); serdes1_prtcl_map |= (1 << lane_prtcl);
} }
/* Set the first bit to indicate serdes has been initialized */
serdes1_prtcl_map |= (1 << NONE);
if (srds_cfg >= ARRAY_SIZE(serdes2_cfg_tbl)) { if (srds_cfg >= ARRAY_SIZE(serdes2_cfg_tbl)) {
printf("Invalid PORDEVSR[IO_SEL_SRDS] = %d\n", srds_cfg); printf("Invalid PORDEVSR[IO_SEL_SRDS] = %d\n", srds_cfg);
return; return;
...@@ -76,4 +91,7 @@ void fsl_serdes_init(void) ...@@ -76,4 +91,7 @@ void fsl_serdes_init(void)
if (pordevsr & MPC85xx_PORDEVSR_SGMII3_DIS) if (pordevsr & MPC85xx_PORDEVSR_SGMII3_DIS)
serdes2_prtcl_map &= ~(1 << SGMII_TSEC3); serdes2_prtcl_map &= ~(1 << SGMII_TSEC3);
/* Set the first bit to indicate serdes has been initialized */
serdes2_prtcl_map |= (1 << NONE);
} }
...@@ -24,6 +24,9 @@ static u8 serdes1_cfg_tbl[][SRDS1_MAX_LANES] = { ...@@ -24,6 +24,9 @@ static u8 serdes1_cfg_tbl[][SRDS1_MAX_LANES] = {
int is_serdes_configured(enum srds_prtcl prtcl) int is_serdes_configured(enum srds_prtcl prtcl)
{ {
if (!(serdes1_prtcl_map & (1 << NONE)))
fsl_serdes_init();
return (1 << prtcl) & serdes1_prtcl_map; return (1 << prtcl) & serdes1_prtcl_map;
} }
...@@ -35,6 +38,9 @@ void fsl_serdes_init(void) ...@@ -35,6 +38,9 @@ void fsl_serdes_init(void)
MPC85xx_PORDEVSR_IO_SEL_SHIFT; MPC85xx_PORDEVSR_IO_SEL_SHIFT;
int lane; int lane;
if (serdes1_prtcl_map & (1 << NONE))
return;
debug("PORDEVSR[IO_SEL] = %x\n", srds1_cfg); debug("PORDEVSR[IO_SEL] = %x\n", srds1_cfg);
if (srds1_cfg >= ARRAY_SIZE(serdes1_cfg_tbl)) { if (srds1_cfg >= ARRAY_SIZE(serdes1_cfg_tbl)) {
...@@ -46,4 +52,7 @@ void fsl_serdes_init(void) ...@@ -46,4 +52,7 @@ void fsl_serdes_init(void)
enum srds_prtcl lane_prtcl = serdes1_cfg_tbl[srds1_cfg][lane]; enum srds_prtcl lane_prtcl = serdes1_cfg_tbl[srds1_cfg][lane];
serdes1_prtcl_map |= (1 << lane_prtcl); serdes1_prtcl_map |= (1 << lane_prtcl);
} }
/* Set the first bit to indicate serdes has been initialized */
serdes1_prtcl_map |= (1 << NONE);
} }
...@@ -24,6 +24,9 @@ static u8 serdes1_cfg_tbl[][SRDS1_MAX_LANES] = { ...@@ -24,6 +24,9 @@ static u8 serdes1_cfg_tbl[][SRDS1_MAX_LANES] = {
int is_serdes_configured(enum srds_prtcl prtcl) int is_serdes_configured(enum srds_prtcl prtcl)
{ {
if (!(serdes1_prtcl_map & (1 << NONE)))
fsl_serdes_init();
return (1 << prtcl) & serdes1_prtcl_map; return (1 << prtcl) & serdes1_prtcl_map;
} }
...@@ -35,6 +38,9 @@ void fsl_serdes_init(void) ...@@ -35,6 +38,9 @@ void fsl_serdes_init(void)
MPC85xx_PORDEVSR_IO_SEL_SHIFT; MPC85xx_PORDEVSR_IO_SEL_SHIFT;
int lane; int lane;
if (serdes1_prtcl_map & (1 << NONE))
return;
debug("PORDEVSR[IO_SEL_SRDS] = %x\n", srds_cfg); debug("PORDEVSR[IO_SEL_SRDS] = %x\n", srds_cfg);
if (srds_cfg >= ARRAY_SIZE(serdes1_cfg_tbl)) { if (srds_cfg >= ARRAY_SIZE(serdes1_cfg_tbl)) {
...@@ -46,4 +52,7 @@ void fsl_serdes_init(void) ...@@ -46,4 +52,7 @@ void fsl_serdes_init(void)
enum srds_prtcl lane_prtcl = serdes1_cfg_tbl[srds_cfg][lane]; enum srds_prtcl lane_prtcl = serdes1_cfg_tbl[srds_cfg][lane];
serdes1_prtcl_map |= (1 << lane_prtcl); serdes1_prtcl_map |= (1 << lane_prtcl);
} }
/* Set the first bit to indicate serdes has been initialized */
serdes1_prtcl_map |= (1 << NONE);
} }
...@@ -33,6 +33,9 @@ static u8 serdes1_cfg_tbl[][SRDS1_MAX_LANES] = { ...@@ -33,6 +33,9 @@ static u8 serdes1_cfg_tbl[][SRDS1_MAX_LANES] = {
int is_serdes_configured(enum srds_prtcl prtcl) int is_serdes_configured(enum srds_prtcl prtcl)
{ {
if (!(serdes1_prtcl_map & (1 << NONE)))
fsl_serdes_init();
return (1 << prtcl) & serdes1_prtcl_map; return (1 << prtcl) & serdes1_prtcl_map;
} }
...@@ -44,6 +47,9 @@ void fsl_serdes_init(void) ...@@ -44,6 +47,9 @@ void fsl_serdes_init(void)
MPC85xx_PORDEVSR_IO_SEL_SHIFT; MPC85xx_PORDEVSR_IO_SEL_SHIFT;
int lane; int lane;
if (serdes1_prtcl_map & (1 << NONE))
return;
debug("PORDEVSR[IO_SEL_SRDS] = %x\n", srds_cfg); debug("PORDEVSR[IO_SEL_SRDS] = %x\n", srds_cfg);
if (srds_cfg >= ARRAY_SIZE(serdes1_cfg_tbl)) { if (srds_cfg >= ARRAY_SIZE(serdes1_cfg_tbl)) {
...@@ -55,4 +61,7 @@ void fsl_serdes_init(void) ...@@ -55,4 +61,7 @@ void fsl_serdes_init(void)
enum srds_prtcl lane_prtcl = serdes1_cfg_tbl[srds_cfg][lane]; enum srds_prtcl lane_prtcl = serdes1_cfg_tbl[srds_cfg][lane];
serdes1_prtcl_map |= (1 << lane_prtcl); serdes1_prtcl_map |= (1 << lane_prtcl);
} }
/* Set the first bit to indicate serdes has been initialized */
serdes1_prtcl_map |= (1 << NONE);
} }
...@@ -28,6 +28,9 @@ static u8 serdes1_cfg_tbl[][SRDS1_MAX_LANES] = { ...@@ -28,6 +28,9 @@ static u8 serdes1_cfg_tbl[][SRDS1_MAX_LANES] = {
int is_serdes_configured(enum srds_prtcl prtcl) int is_serdes_configured(enum srds_prtcl prtcl)
{ {
if (!(serdes1_prtcl_map & (1 << NONE)))
fsl_serdes_init();
return (1 << prtcl) & serdes1_prtcl_map; return (1 << prtcl) & serdes1_prtcl_map;
} }
...@@ -39,6 +42,9 @@ void fsl_serdes_init(void) ...@@ -39,6 +42,9 @@ void fsl_serdes_init(void)
MPC85xx_PORDEVSR_IO_SEL_SHIFT; MPC85xx_PORDEVSR_IO_SEL_SHIFT;
int lane; int lane;
if (serdes1_prtcl_map & (1 << NONE))
return;
debug("PORDEVSR[IO_SEL_SRDS] = %x\n", srds_cfg); debug("PORDEVSR[IO_SEL_SRDS] = %x\n", srds_cfg);
if (srds_cfg >= ARRAY_SIZE(serdes1_cfg_tbl)) { if (srds_cfg >= ARRAY_SIZE(serdes1_cfg_tbl)) {
...@@ -62,4 +68,7 @@ void fsl_serdes_init(void) ...@@ -62,4 +68,7 @@ void fsl_serdes_init(void)
if (!(pordevsr & MPC85xx_PORDEVSR_SGMII4_DIS)) if (!(pordevsr & MPC85xx_PORDEVSR_SGMII4_DIS))
serdes1_prtcl_map |= (1 << SGMII_TSEC4); serdes1_prtcl_map |= (1 << SGMII_TSEC4);
/* Set the first bit to indicate serdes has been initialized */
serdes1_prtcl_map |= (1 << NONE);
} }
...@@ -33,11 +33,19 @@ static const u8 serdes2_cfg_tbl[][SRDS2_MAX_LANES] = { ...@@ -33,11 +33,19 @@ static const u8 serdes2_cfg_tbl[][SRDS2_MAX_LANES] = {
int is_serdes_configured(enum srds_prtcl device) int is_serdes_configured(enum srds_prtcl device)
{ {
int ret = (1 << device) & serdes1_prtcl_map; int ret;
if (!(serdes1_prtcl_map & (1 << NONE)))
fsl_serdes_init();
ret = (1 << device) & serdes1_prtcl_map;
if (ret) if (ret)
return ret; return ret;
if (!(serdes2_prtcl_map & (1 << NONE)))
fsl_serdes_init();
return (1 << device) & serdes2_prtcl_map; return (1 << device) & serdes2_prtcl_map;
} }
...@@ -49,6 +57,10 @@ void fsl_serdes_init(void) ...@@ -49,6 +57,10 @@ void fsl_serdes_init(void)
MPC85xx_PORDEVSR_IO_SEL_SHIFT; MPC85xx_PORDEVSR_IO_SEL_SHIFT;
int lane; int lane;
if (serdes1_prtcl_map & (1 << NONE) &&
serdes2_prtcl_map & (1 << NONE))
return;
debug("PORDEVSR[IO_SEL_SRDS] = %x\n", srds_cfg); debug("PORDEVSR[IO_SEL_SRDS] = %x\n", srds_cfg);
if (srds_cfg >= ARRAY_SIZE(serdes1_cfg_tbl)) { if (srds_cfg >= ARRAY_SIZE(serdes1_cfg_tbl)) {
...@@ -60,6 +72,9 @@ void fsl_serdes_init(void) ...@@ -60,6 +72,9 @@ void fsl_serdes_init(void)
serdes1_prtcl_map |= (1 << lane_prtcl); serdes1_prtcl_map |= (1 << lane_prtcl);
} }
/* Set the first bit to indicate serdes has been initialized */
serdes1_prtcl_map |= (1 << NONE);
if (srds_cfg >= ARRAY_SIZE(serdes2_cfg_tbl)) { if (srds_cfg >= ARRAY_SIZE(serdes2_cfg_tbl)) {
printf("Invalid PORDEVSR[IO_SEL_SRDS] = %d\n", srds_cfg); printf("Invalid PORDEVSR[IO_SEL_SRDS] = %d\n", srds_cfg);
return; return;
...@@ -69,4 +84,7 @@ void fsl_serdes_init(void) ...@@ -69,4 +84,7 @@ void fsl_serdes_init(void)
enum srds_prtcl lane_prtcl = serdes2_cfg_tbl[srds_cfg][lane]; enum srds_prtcl lane_prtcl = serdes2_cfg_tbl[srds_cfg][lane];
serdes2_prtcl_map |= (1 << lane_prtcl); serdes2_prtcl_map |= (1 << lane_prtcl);
} }
/* Set the first bit to indicate serdes has been initialized */
serdes2_prtcl_map |= (1 << NONE);
} }
...@@ -41,6 +41,9 @@ static u8 serdes1_cfg_tbl[][SRDS1_MAX_LANES] = { ...@@ -41,6 +41,9 @@ static u8 serdes1_cfg_tbl[][SRDS1_MAX_LANES] = {
int is_serdes_configured(enum srds_prtcl prtcl) int is_serdes_configured(enum srds_prtcl prtcl)
{ {
if (!(serdes1_prtcl_map & (1 << NONE)))
fsl_serdes_init();
return (1 << prtcl) & serdes1_prtcl_map; return (1 << prtcl) & serdes1_prtcl_map;
} }
...@@ -55,6 +58,9 @@ void fsl_serdes_init(void) ...@@ -55,6 +58,9 @@ void fsl_serdes_init(void)
int lane; int lane;
u32 mask, val; u32 mask, val;
if (serdes1_prtcl_map & (1 << NONE))
return;
debug("PORDEVSR[IO_SEL_SRDS] = %x\n", srds_cfg); debug("PORDEVSR[IO_SEL_SRDS] = %x\n", srds_cfg);
if (srds_cfg >= ARRAY_SIZE(serdes1_cfg_tbl)) { if (srds_cfg >= ARRAY_SIZE(serdes1_cfg_tbl)) {
...@@ -67,6 +73,9 @@ void fsl_serdes_init(void) ...@@ -67,6 +73,9 @@ void fsl_serdes_init(void)
serdes1_prtcl_map |= (1 << lane_prtcl); serdes1_prtcl_map |= (1 << lane_prtcl);
} }
/* Set the first bit to indicate serdes has been initialized */
serdes1_prtcl_map |= (1 << NONE);
/* Init SERDES Receiver electrical idle detection control for PCIe */ /* Init SERDES Receiver electrical idle detection control for PCIe */
/* Lane 0 is always PCIe 1 */ /* Lane 0 is always PCIe 1 */
......
...@@ -72,11 +72,19 @@ static const u8 serdes2_cfg_tbl[][SRDS2_MAX_LANES] = { ...@@ -72,11 +72,19 @@ static const u8 serdes2_cfg_tbl[][SRDS2_MAX_LANES] = {
int is_serdes_configured(enum srds_prtcl device) int is_serdes_configured(enum srds_prtcl device)
{ {
int ret = (1 << device) & serdes1_prtcl_map; int ret;
if (!(serdes1_prtcl_map & (1 << NONE)))
fsl_serdes_init();
ret = (1 << device) & serdes1_prtcl_map;
if (ret) if (ret)
return ret; return ret;
if (!(serdes2_prtcl_map & (1 << NONE)))
fsl_serdes_init();
return (1 << device) & serdes2_prtcl_map; return (1 << device) & serdes2_prtcl_map;
} }
...@@ -88,6 +96,10 @@ void fsl_serdes_init(void) ...@@ -88,6 +96,10 @@ void fsl_serdes_init(void)
MPC85xx_PORDEVSR_IO_SEL_SHIFT; MPC85xx_PORDEVSR_IO_SEL_SHIFT;
int lane; int lane;
if (serdes1_prtcl_map & (1 << NONE) &&
serdes2_prtcl_map & (1 << NONE))
return;
debug("PORDEVSR[IO_SEL_SRDS] = %x\n", srds_cfg); debug("PORDEVSR[IO_SEL_SRDS] = %x\n", srds_cfg);
if (srds_cfg >= ARRAY_SIZE(serdes1_cfg_tbl)) { if (srds_cfg >= ARRAY_SIZE(serdes1_cfg_tbl)) {
...@@ -99,6 +111,9 @@ void fsl_serdes_init(void) ...@@ -99,6 +111,9 @@ void fsl_serdes_init(void)
serdes1_prtcl_map |= (1 << lane_prtcl); serdes1_prtcl_map |= (1 << lane_prtcl);
} }
/* Set the first bit to indicate serdes has been initialized */
serdes1_prtcl_map |= (1 << NONE);
if (srds_cfg >= ARRAY_SIZE(serdes2_cfg_tbl)) { if (srds_cfg >= ARRAY_SIZE(serdes2_cfg_tbl)) {
printf("Invalid PORDEVSR[IO_SEL_SRDS] = %d\n", srds_cfg); printf("Invalid PORDEVSR[IO_SEL_SRDS] = %d\n", srds_cfg);
return; return;
...@@ -108,4 +123,7 @@ void fsl_serdes_init(void) ...@@ -108,4 +123,7 @@ void fsl_serdes_init(void)
enum srds_prtcl lane_prtcl = serdes2_cfg_tbl[srds_cfg][lane]; enum srds_prtcl lane_prtcl = serdes2_cfg_tbl[srds_cfg][lane];
serdes2_prtcl_map |= (1 << lane_prtcl); serdes2_prtcl_map |= (1 << lane_prtcl);
} }
/* Set the first bit to indicate serdes has been initialized */
serdes2_prtcl_map |= (1 << NONE);
} }
...@@ -24,7 +24,12 @@ static const u8 serdes1_cfg_tbl[][SRDS1_MAX_LANES] = { ...@@ -24,7 +24,12 @@ static const u8 serdes1_cfg_tbl[][SRDS1_MAX_LANES] = {
int is_serdes_configured(enum srds_prtcl device) int is_serdes_configured(enum srds_prtcl device)
{ {
int ret = (1 << device) & serdes1_prtcl_map; int ret;
if (!(serdes1_prtcl_map & (1 << NONE)))
fsl_serdes_init();
ret = (1 << device) & serdes1_prtcl_map;
return ret; return ret;
} }
...@@ -36,6 +41,9 @@ void fsl_serdes_init(void) ...@@ -36,6 +41,9 @@ void fsl_serdes_init(void)
MPC85xx_PORDEVSR_IO_SEL_SHIFT; MPC85xx_PORDEVSR_IO_SEL_SHIFT;
int lane; int lane;
if (serdes1_prtcl_map & (1 << NONE))
return;
debug("PORDEVSR[IO_SEL_SRDS] = %x\n", srds_cfg); debug("PORDEVSR[IO_SEL_SRDS] = %x\n", srds_cfg);
if (srds_cfg >= ARRAY_SIZE(serdes1_cfg_tbl)) { if (srds_cfg >= ARRAY_SIZE(serdes1_cfg_tbl)) {
...@@ -47,4 +55,6 @@ void fsl_serdes_init(void) ...@@ -47,4 +55,6 @@ void fsl_serdes_init(void)
serdes1_prtcl_map |= (1 << lane_prtcl); serdes1_prtcl_map |= (1 << lane_prtcl);
} }
/* Set the first bit to indicate serdes has been initialized */
serdes1_prtcl_map |= (1 << NONE);
} }
...@@ -32,6 +32,9 @@ static u8 serdes1_cfg_tbl[][SRDS1_MAX_LANES] = { ...@@ -32,6 +32,9 @@ static u8 serdes1_cfg_tbl[][SRDS1_MAX_LANES] = {
int is_serdes_configured(enum srds_prtcl prtcl) int is_serdes_configured(enum srds_prtcl prtcl)
{ {
if (!(serdes1_prtcl_map & (1 << NONE)))
fsl_serdes_init();
return (1 << prtcl) & serdes1_prtcl_map; return (1 << prtcl) & serdes1_prtcl_map;
} }
...@@ -43,6 +46,9 @@ void fsl_serdes_init(void) ...@@ -43,6 +46,9 @@ void fsl_serdes_init(void)
MPC85xx_PORDEVSR_IO_SEL_SHIFT; MPC85xx_PORDEVSR_IO_SEL_SHIFT;
int lane; int lane;
if (serdes1_prtcl_map & (1 << NONE))
return;
debug("PORDEVSR[IO_SEL_SRDS] = %x\n", srds_cfg); debug("PORDEVSR[IO_SEL_SRDS] = %x\n", srds_cfg);
if (srds_cfg >= ARRAY_SIZE(serdes1_cfg_tbl)) { if (srds_cfg >= ARRAY_SIZE(serdes1_cfg_tbl)) {
...@@ -54,4 +60,7 @@ void fsl_serdes_init(void) ...@@ -54,4 +60,7 @@ void fsl_serdes_init(void)
enum srds_prtcl lane_prtcl = serdes1_cfg_tbl[srds_cfg][lane]; enum srds_prtcl lane_prtcl = serdes1_cfg_tbl[srds_cfg][lane];
serdes1_prtcl_map |= (1 << lane_prtcl); serdes1_prtcl_map |= (1 << lane_prtcl);
} }
/* Set the first bit to indicate serdes has been initialized */
serdes1_prtcl_map |= (1 << NONE);
} }
...@@ -29,11 +29,19 @@ static u8 serdes2_cfg_tbl[][SRDS2_MAX_LANES] = { ...@@ -29,11 +29,19 @@ static u8 serdes2_cfg_tbl[][SRDS2_MAX_LANES] = {
int is_serdes_configured(enum srds_prtcl device) int is_serdes_configured(enum srds_prtcl device)
{ {
int ret = (1 << device) & serdes1_prtcl_map; int ret;
if (!(serdes1_prtcl_map & (1 << NONE)))
fsl_serdes_init();
ret = (1 << device) & serdes1_prtcl_map;
if (ret) if (ret)
return ret; return ret;
if (!(serdes2_prtcl_map & (1 << NONE)))
fsl_serdes_init();
return (1 << device) & serdes2_prtcl_map; return (1 << device) & serdes2_prtcl_map;
} }
...@@ -46,6 +54,10 @@ void fsl_serdes_init(void) ...@@ -46,6 +54,10 @@ void fsl_serdes_init(void)
MPC8610_PORDEVSR_IO_SEL_SHIFT; MPC8610_PORDEVSR_IO_SEL_SHIFT;
int lane; int lane;
if (serdes1_prtcl_map & (1 << NONE) &&
serdes2_prtcl_map & (1 << NONE))
return;
debug("PORDEVSR[IO_SEL_SRDS] = %x\n", srds_cfg); debug("PORDEVSR[IO_SEL_SRDS] = %x\n", srds_cfg);
if (srds_cfg >= ARRAY_SIZE(serdes1_cfg_tbl)) { if (srds_cfg >= ARRAY_SIZE(serdes1_cfg_tbl)) {
...@@ -57,6 +69,9 @@ void fsl_serdes_init(void) ...@@ -57,6 +69,9 @@ void fsl_serdes_init(void)
serdes1_prtcl_map |= (1 << lane_prtcl); serdes1_prtcl_map |= (1 << lane_prtcl);
} }
/* Set the first bit to indicate serdes has been initialized */
serdes1_prtcl_map |= (1 << NONE);
if (srds_cfg >= ARRAY_SIZE(serdes2_cfg_tbl)) { if (srds_cfg >= ARRAY_SIZE(serdes2_cfg_tbl)) {
printf("Invalid PORDEVSR[IO_SEL_SRDS] = %d\n", srds_cfg); printf("Invalid PORDEVSR[IO_SEL_SRDS] = %d\n", srds_cfg);
return; return;
...@@ -66,4 +81,7 @@ void fsl_serdes_init(void) ...@@ -66,4 +81,7 @@ void fsl_serdes_init(void)
enum srds_prtcl lane_prtcl = serdes2_cfg_tbl[srds_cfg][lane]; enum srds_prtcl lane_prtcl = serdes2_cfg_tbl[srds_cfg][lane];
serdes2_prtcl_map |= (1 << lane_prtcl); serdes2_prtcl_map |= (1 << lane_prtcl);
} }
/* Set the first bit to indicate serdes has been initialized */
serdes2_prtcl_map |= (1 << NONE);
} }
...@@ -38,11 +38,19 @@ static u8 serdes2_cfg_tbl[][SRDS2_MAX_LANES] = { ...@@ -38,11 +38,19 @@ static u8 serdes2_cfg_tbl[][SRDS2_MAX_LANES] = {
int is_serdes_configured(enum srds_prtcl device) int is_serdes_configured(enum srds_prtcl device)
{ {
int ret = (1 << device) & serdes1_prtcl_map; int ret;
if (!(serdes1_prtcl_map & (1 << NONE)))
fsl_serdes_init();
ret = (1 << device) & serdes1_prtcl_map;
if (ret) if (ret)
return ret; return ret;
if (!(serdes2_prtcl_map & (1 << NONE)))
fsl_serdes_init();
return (1 << device) & serdes2_prtcl_map; return (1 << device) & serdes2_prtcl_map;
} }
...@@ -55,6 +63,10 @@ void fsl_serdes_init(void) ...@@ -55,6 +63,10 @@ void fsl_serdes_init(void)
MPC8641_PORDEVSR_IO_SEL_SHIFT; MPC8641_PORDEVSR_IO_SEL_SHIFT;
int lane; int lane;
if (serdes1_prtcl_map & (1 << NONE) &&
serdes2_prtcl_map & (1 << NONE))
return;
debug("PORDEVSR[IO_SEL_SRDS] = %x\n", srds_cfg); debug("PORDEVSR[IO_SEL_SRDS] = %x\n", srds_cfg);
if (srds_cfg >= ARRAY_SIZE(serdes1_cfg_tbl)) { if (srds_cfg >= ARRAY_SIZE(serdes1_cfg_tbl)) {
...@@ -66,6 +78,9 @@ void fsl_serdes_init(void) ...@@ -66,6 +78,9 @@ void fsl_serdes_init(void)
serdes1_prtcl_map |= (1 << lane_prtcl); serdes1_prtcl_map |= (1 << lane_prtcl);
} }
/* Set the first bit to indicate serdes has been initialized */
serdes1_prtcl_map |= (1 << NONE);
if (srds_cfg >= ARRAY_SIZE(serdes2_cfg_tbl)) { if (srds_cfg >= ARRAY_SIZE(serdes2_cfg_tbl)) {
printf("Invalid PORDEVSR[IO_SEL_SRDS] = %d\n", srds_cfg); printf("Invalid PORDEVSR[IO_SEL_SRDS] = %d\n", srds_cfg);
return; return;
...@@ -75,4 +90,7 @@ void fsl_serdes_init(void) ...@@ -75,4 +90,7 @@ void fsl_serdes_init(void)
enum srds_prtcl lane_prtcl = serdes2_cfg_tbl[srds_cfg][lane]; enum srds_prtcl lane_prtcl = serdes2_cfg_tbl[srds_cfg][lane];
serdes2_prtcl_map |= (1 << lane_prtcl); serdes2_prtcl_map |= (1 << lane_prtcl);
} }
/* Set the first bit to indicate serdes has been initialized */
serdes2_prtcl_map |= (1 << NONE);
} }
...@@ -10,6 +10,10 @@ ...@@ -10,6 +10,10 @@
#include <config.h> #include <config.h>
enum srds_prtcl { enum srds_prtcl {
/*
* Nobody will check whether the device 'NONE' has been configured,
* So use it to indicate if the serdes_prtcl_map has been initialized.
*/
NONE = 0, NONE = 0,
PCIE1, PCIE1,
PCIE2, PCIE2,
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册