167a719daSRoy Zang /*
267a719daSRoy Zang * Copyright 2010-2011 Freescale Semiconductor, Inc.
367a719daSRoy Zang * Author: Roy Zang <tie-fei.zang@freescale.com>
467a719daSRoy Zang *
51a459660SWolfgang Denk * SPDX-License-Identifier: GPL-2.0+
667a719daSRoy Zang */
767a719daSRoy Zang
867a719daSRoy Zang #include <config.h>
967a719daSRoy Zang #include <common.h>
1067a719daSRoy Zang #include <asm/io.h>
1167a719daSRoy Zang #include <asm/immap_85xx.h>
1267a719daSRoy Zang #include <asm/fsl_serdes.h>
1367a719daSRoy Zang
1467a719daSRoy Zang #define SRDS1_MAX_LANES 4
1567a719daSRoy Zang
1667a719daSRoy Zang static u32 serdes1_prtcl_map;
1767a719daSRoy Zang
1867a719daSRoy Zang static const u8 serdes1_cfg_tbl[][SRDS1_MAX_LANES] = {
1967a719daSRoy Zang [0x00] = {PCIE1, PCIE2, NONE, NONE},
2067a719daSRoy Zang [0x01] = {PCIE1, PCIE2, PCIE3, NONE},
2167a719daSRoy Zang [0x02] = {PCIE1, PCIE2, PCIE3, SGMII_FM1_DTSEC2},
2267a719daSRoy Zang [0x03] = {PCIE1, PCIE2, SGMII_FM1_DTSEC1, SGMII_FM1_DTSEC2},
2367a719daSRoy Zang };
2467a719daSRoy Zang
is_serdes_configured(enum srds_prtcl device)2567a719daSRoy Zang int is_serdes_configured(enum srds_prtcl device)
2667a719daSRoy Zang {
27*71fe2225SHou Zhiqiang int ret;
28*71fe2225SHou Zhiqiang
29*71fe2225SHou Zhiqiang if (!(serdes1_prtcl_map & (1 << NONE)))
30*71fe2225SHou Zhiqiang fsl_serdes_init();
31*71fe2225SHou Zhiqiang
32*71fe2225SHou Zhiqiang ret = (1 << device) & serdes1_prtcl_map;
3367a719daSRoy Zang return ret;
3467a719daSRoy Zang }
3567a719daSRoy Zang
fsl_serdes_init(void)3667a719daSRoy Zang void fsl_serdes_init(void)
3767a719daSRoy Zang {
3867a719daSRoy Zang ccsr_gur_t *gur = (void *)CONFIG_SYS_MPC85xx_GUTS_ADDR;
3967a719daSRoy Zang u32 pordevsr = in_be32(&gur->pordevsr);
4067a719daSRoy Zang u32 srds_cfg = (pordevsr & MPC85xx_PORDEVSR_IO_SEL) >>
4167a719daSRoy Zang MPC85xx_PORDEVSR_IO_SEL_SHIFT;
4267a719daSRoy Zang int lane;
4367a719daSRoy Zang
44*71fe2225SHou Zhiqiang if (serdes1_prtcl_map & (1 << NONE))
45*71fe2225SHou Zhiqiang return;
46*71fe2225SHou Zhiqiang
4767a719daSRoy Zang debug("PORDEVSR[IO_SEL_SRDS] = %x\n", srds_cfg);
4867a719daSRoy Zang
49e51e47d3SAxel Lin if (srds_cfg >= ARRAY_SIZE(serdes1_cfg_tbl)) {
5067a719daSRoy Zang printf("Invalid PORDEVSR[IO_SEL_SRDS] = %d\n", srds_cfg);
5167a719daSRoy Zang return;
5267a719daSRoy Zang }
5367a719daSRoy Zang for (lane = 0; lane < SRDS1_MAX_LANES; lane++) {
5467a719daSRoy Zang enum srds_prtcl lane_prtcl = serdes1_cfg_tbl[srds_cfg][lane];
5567a719daSRoy Zang serdes1_prtcl_map |= (1 << lane_prtcl);
5667a719daSRoy Zang }
5767a719daSRoy Zang
58*71fe2225SHou Zhiqiang /* Set the first bit to indicate serdes has been initialized */
59*71fe2225SHou Zhiqiang serdes1_prtcl_map |= (1 << NONE);
6067a719daSRoy Zang }
61