Home | History | Annotate | Download | only in mpc85xx
      1 // SPDX-License-Identifier: GPL-2.0+
      2 /*
      3  * Copyright 2013 Freescale Semiconductor, Inc.
      4  *
      5  * Shengzhou Liu <Shengzhou.Liu (at) freescale.com>
      6  */
      7 
      8 #include <common.h>
      9 #include <asm/fsl_serdes.h>
     10 #include <asm/processor.h>
     11 #include "fsl_corenet2_serdes.h"
     12 
     13 struct serdes_config {
     14 	u32 protocol;
     15 	u8 lanes[SRDS_MAX_LANES];
     16 };
     17 
     18 static const struct serdes_config serdes1_cfg_tbl[] = {
     19 	/* SerDes 1 */
     20 	{0x6E, {XFI_FM1_MAC9, XFI_FM1_MAC10,
     21 		SGMII_FM1_DTSEC1, SGMII_FM1_DTSEC2,
     22 		PCIE4, PCIE4, SGMII_FM1_DTSEC5, SGMII_FM1_DTSEC6} },
     23 	{0xBC, {PCIE3, PCIE3, SGMII_FM1_DTSEC1,
     24 		SGMII_FM1_DTSEC2, PCIE4, PCIE4, PCIE4, PCIE4} },
     25 	{0xC8, {PCIE3, SGMII_FM1_DTSEC10, SGMII_FM1_DTSEC1,
     26 		SGMII_FM1_DTSEC2, PCIE4, PCIE4,
     27 		SGMII_FM1_DTSEC5, SGMII_FM1_DTSEC6} },
     28 	{0xD6, {PCIE3, SGMII_FM1_DTSEC10, SGMII_FM1_DTSEC1,
     29 		SGMII_FM1_DTSEC2, PCIE4, PCIE4,
     30 		SGMII_FM1_DTSEC5, SGMII_FM1_DTSEC6} },
     31 	{0xDE, {PCIE3, PCIE3, PCIE3, PCIE3,
     32 		PCIE4, PCIE1, PCIE2, SGMII_FM1_DTSEC6} },
     33 	{0xE0, {PCIE3, PCIE3, PCIE3, PCIE3, PCIE4,
     34 		PCIE1, SGMII_FM1_DTSEC5, SGMII_FM1_DTSEC6} },
     35 	{0xF2, {PCIE3, SGMII_FM1_DTSEC10, SGMII_FM1_DTSEC1,
     36 		SGMII_FM1_DTSEC2, PCIE4, PCIE1, PCIE2, SGMII_FM1_DTSEC6} },
     37 	{0xF8, {PCIE3, SGMII_FM1_DTSEC10, SGMII_FM1_DTSEC1,
     38 		SGMII_FM1_DTSEC2, PCIE4, PCIE1, PCIE2, SGMII_FM1_DTSEC6} },
     39 	{0xFA, {PCIE3, SGMII_FM1_DTSEC10, SGMII_FM1_DTSEC1,
     40 		SGMII_FM1_DTSEC2, PCIE4, PCIE1,
     41 		SGMII_FM1_DTSEC5, SGMII_FM1_DTSEC6} },
     42 	{0x6C, {XFI_FM1_MAC9, XFI_FM1_MAC10,
     43 		SGMII_FM1_DTSEC1, SGMII_FM1_DTSEC2,
     44 		PCIE4, PCIE4, PCIE4, PCIE4} },
     45 	{0x1B, {SGMII_FM1_DTSEC9, SGMII_FM1_DTSEC10,
     46 		SGMII_FM1_DTSEC1, SGMII_FM1_DTSEC2,
     47 		SGMII_FM1_DTSEC3, SGMII_FM1_DTSEC4,
     48 		SGMII_FM1_DTSEC5, SGMII_FM1_DTSEC6} },
     49 	{0x1C, {SGMII_FM1_DTSEC9, SGMII_FM1_DTSEC10,
     50 		SGMII_FM1_DTSEC1, SGMII_FM1_DTSEC2,
     51 		SGMII_FM1_DTSEC3, SGMII_FM1_DTSEC4,
     52 		SGMII_FM1_DTSEC5, SGMII_FM1_DTSEC6} },
     53 	{0x95, {SGMII_FM1_DTSEC9, SGMII_FM1_DTSEC10,
     54 		SGMII_FM1_DTSEC1, SGMII_FM1_DTSEC2,
     55 		SGMII_FM1_DTSEC3, SGMII_FM1_DTSEC4,
     56 		SGMII_FM1_DTSEC5, SGMII_FM1_DTSEC6} },
     57 	{0xA2, {SGMII_FM1_DTSEC9, SGMII_FM1_DTSEC10,
     58 		SGMII_FM1_DTSEC1, SGMII_FM1_DTSEC2,
     59 		SGMII_FM1_DTSEC3, SGMII_FM1_DTSEC4,
     60 		SGMII_FM1_DTSEC5, SGMII_FM1_DTSEC6} },
     61 	{0x94, {SGMII_FM1_DTSEC9, SGMII_FM1_DTSEC10,
     62 		SGMII_FM1_DTSEC1, SGMII_FM1_DTSEC2,
     63 		SGMII_FM1_DTSEC3, SGMII_FM1_DTSEC4,
     64 		SGMII_FM1_DTSEC5, SGMII_FM1_DTSEC6} },
     65 	{0x50, {XAUI_FM1_MAC9, XAUI_FM1_MAC9,
     66 		XAUI_FM1_MAC9, XAUI_FM1_MAC9,
     67 		PCIE4, SGMII_FM1_DTSEC4,
     68 		SGMII_FM1_DTSEC5, SGMII_FM1_DTSEC6} },
     69 	{0x51, {XAUI_FM1_MAC9, XAUI_FM1_MAC9,
     70 		XAUI_FM1_MAC9, XAUI_FM1_MAC9,
     71 		PCIE4, SGMII_FM1_DTSEC4,
     72 		SGMII_FM1_DTSEC5, SGMII_FM1_DTSEC6} },
     73 	{0x5E, {HIGIG_FM1_MAC9, HIGIG_FM1_MAC9,
     74 		HIGIG_FM1_MAC9, HIGIG_FM1_MAC9,
     75 		PCIE4, SGMII_FM1_DTSEC4,
     76 		SGMII_FM1_DTSEC5, SGMII_FM1_DTSEC6} },
     77 	{0x5F, {HIGIG_FM1_MAC9, HIGIG_FM1_MAC9,
     78 		HIGIG_FM1_MAC9, HIGIG_FM1_MAC9,
     79 		PCIE4, SGMII_FM1_DTSEC4,
     80 		SGMII_FM1_DTSEC5, SGMII_FM1_DTSEC6} },
     81 	{0x64, {HIGIG_FM1_MAC9, HIGIG_FM1_MAC9,
     82 		HIGIG_FM1_MAC9, HIGIG_FM1_MAC9,
     83 		PCIE4, SGMII_FM1_DTSEC4,
     84 		SGMII_FM1_DTSEC5, SGMII_FM1_DTSEC6} },
     85 	{0x65, {HIGIG_FM1_MAC9, HIGIG_FM1_MAC9,
     86 		HIGIG_FM1_MAC9, HIGIG_FM1_MAC9,
     87 		PCIE4, SGMII_FM1_DTSEC4,
     88 		SGMII_FM1_DTSEC5, SGMII_FM1_DTSEC6} },
     89 	{0x6A, {XFI_FM1_MAC9, XFI_FM1_MAC10,
     90 		XFI_FM1_MAC1, XFI_FM1_MAC2,
     91 		PCIE4, SGMII_FM1_DTSEC4,
     92 		SGMII_FM1_DTSEC5, SGMII_FM1_DTSEC6} },
     93 	{0x6B, {XFI_FM1_MAC9, XFI_FM1_MAC10,
     94 		XFI_FM1_MAC1, XFI_FM1_MAC2,
     95 		PCIE4, SGMII_FM1_DTSEC4,
     96 		SGMII_FM1_DTSEC5, SGMII_FM1_DTSEC6} },
     97 	{0x6D, {XFI_FM1_MAC9, XFI_FM1_MAC10,
     98 		SGMII_FM1_DTSEC1, SGMII_FM1_DTSEC2,
     99 		PCIE4, PCIE4, PCIE4, PCIE4} },
    100 	{0x71, {XFI_FM1_MAC9, XFI_FM1_MAC10,
    101 		SGMII_FM1_DTSEC1, SGMII_FM1_DTSEC2, PCIE4,
    102 		SGMII_FM1_DTSEC4, SGMII_FM1_DTSEC5, SGMII_FM1_DTSEC6} },
    103 	{0xA6, {SGMII_FM1_DTSEC9, SGMII_FM1_DTSEC10,
    104 		SGMII_FM1_DTSEC1, SGMII_FM1_DTSEC2, PCIE4,
    105 		PCIE4, SGMII_FM1_DTSEC5, SGMII_FM1_DTSEC6} },
    106 	{0x8E, {SGMII_FM1_DTSEC9, SGMII_FM1_DTSEC10,
    107 		SGMII_FM1_DTSEC1, SGMII_FM1_DTSEC2, PCIE4,
    108 		PCIE4, SGMII_FM1_DTSEC5, SGMII_FM1_DTSEC6} },
    109 	{0x8F, {SGMII_FM1_DTSEC9, SGMII_FM1_DTSEC10,
    110 		SGMII_FM1_DTSEC1, SGMII_FM1_DTSEC2, PCIE4,
    111 		PCIE4, SGMII_FM1_DTSEC5, SGMII_FM1_DTSEC6} },
    112 	{0x82, {SGMII_FM1_DTSEC9, SGMII_FM1_DTSEC10,
    113 		SGMII_FM1_DTSEC1, SGMII_FM1_DTSEC2,
    114 		PCIE4, PCIE4, SGMII_FM1_DTSEC5, SGMII_FM1_DTSEC6} },
    115 	{0x83, {SGMII_FM1_DTSEC9, SGMII_FM1_DTSEC10,
    116 		SGMII_FM1_DTSEC1, SGMII_FM1_DTSEC2,
    117 		PCIE4, PCIE4, SGMII_FM1_DTSEC5, SGMII_FM1_DTSEC6} },
    118 	{0xA4, {SGMII_FM1_DTSEC9, SGMII_FM1_DTSEC10,
    119 		SGMII_FM1_DTSEC1, SGMII_FM1_DTSEC2,
    120 		PCIE4, PCIE4, PCIE4, PCIE4} },
    121 	{0x96, {SGMII_FM1_DTSEC9, SGMII_FM1_DTSEC10,
    122 		SGMII_FM1_DTSEC1, SGMII_FM1_DTSEC2,
    123 		PCIE4, PCIE4, PCIE4, PCIE4} },
    124 	{0x8A, {SGMII_FM1_DTSEC9, SGMII_FM1_DTSEC10,
    125 		SGMII_FM1_DTSEC1, SGMII_FM1_DTSEC2,
    126 		PCIE4, PCIE4, PCIE4, PCIE4} },
    127 	{0x67, {XFI_FM1_MAC9, XFI_FM1_MAC10,
    128 		XFI_FM1_MAC1, XFI_FM1_MAC2,
    129 		PCIE4, PCIE4, PCIE4, PCIE4} },
    130 	{0xAB, {PCIE3, PCIE3, PCIE3, PCIE3,
    131 		PCIE4, PCIE4, PCIE4, PCIE4} },
    132 	{0xDA, {PCIE3, PCIE3, PCIE3, PCIE3,
    133 		PCIE3, PCIE3, PCIE3, PCIE3} },
    134 	{0xD9, {PCIE3, SGMII_FM1_DTSEC10, SGMII_FM1_DTSEC1,
    135 		SGMII_FM1_DTSEC2, PCIE4, SGMII_FM1_DTSEC4,
    136 		SGMII_FM1_DTSEC5, SGMII_FM1_DTSEC6} },
    137 	{0xD2, {PCIE3, SGMII_FM1_DTSEC10, SGMII_FM1_DTSEC1,
    138 		SGMII_FM1_DTSEC2, PCIE4, SGMII_FM1_DTSEC4,
    139 		SGMII_FM1_DTSEC5, SGMII_FM1_DTSEC6} },
    140 	{0xD3, {PCIE3, SGMII_FM1_DTSEC10, SGMII_FM1_DTSEC1,
    141 		SGMII_FM1_DTSEC2, PCIE4, SGMII_FM1_DTSEC4,
    142 		SGMII_FM1_DTSEC5, SGMII_FM1_DTSEC6} },
    143 	{0xCB, {PCIE3, SGMII_FM1_DTSEC10, SGMII_FM1_DTSEC1,
    144 		SGMII_FM1_DTSEC2, PCIE4, SGMII_FM1_DTSEC4,
    145 		SGMII_FM1_DTSEC5, SGMII_FM1_DTSEC6} },
    146 	{0xD8, {PCIE3, SGMII_FM1_DTSEC10, SGMII_FM1_DTSEC1,
    147 		SGMII_FM1_DTSEC2, PCIE4, SGMII_FM1_DTSEC4,
    148 		SGMII_FM1_DTSEC5, SGMII_FM1_DTSEC6} },
    149 	{0x66, {XFI_FM1_MAC9, XFI_FM1_MAC10,
    150 		XFI_FM1_MAC1, XFI_FM1_MAC2,
    151 		PCIE4, PCIE4, PCIE4, PCIE4} },
    152 	{0xAA, {PCIE3, PCIE3, PCIE3, PCIE3,
    153 		PCIE4, PCIE4, PCIE4, PCIE4} },
    154 	{0xCA, {PCIE3, SGMII_FM1_DTSEC10, SGMII_FM1_DTSEC1,
    155 		SGMII_FM1_DTSEC2, PCIE4, SGMII_FM1_DTSEC4,
    156 		SGMII_FM1_DTSEC5, SGMII_FM1_DTSEC6} },
    157 	{0x70, {XFI_FM1_MAC9, XFI_FM1_MAC10, SGMII_FM1_DTSEC1,
    158 		SGMII_FM1_DTSEC2, PCIE4, SGMII_FM1_DTSEC4,
    159 		SGMII_FM1_DTSEC5, SGMII_FM1_DTSEC6} },
    160 	{}
    161 };
    162 
    163 #ifndef CONFIG_ARCH_T2081
    164 static const struct serdes_config serdes2_cfg_tbl[] = {
    165 	/* SerDes 2 */
    166 	{0x1F, {PCIE1, PCIE1, PCIE1, PCIE1, PCIE2, PCIE2, PCIE2, PCIE2} },
    167 	{0x16, {PCIE1, PCIE1, PCIE1, PCIE1, PCIE2, PCIE2, SATA1, SATA2} },
    168 	{0x01, {PCIE1, PCIE1, PCIE1, PCIE1, PCIE1, PCIE1, PCIE1, PCIE1} },
    169 	{0x29, {SRIO2, SRIO2, SRIO2, SRIO2, SRIO1, SRIO1, SRIO1, SRIO1} },
    170 	{0x2D, {SRIO2, SRIO2, SRIO2, SRIO2, SRIO1, SRIO1, SRIO1, SRIO1} },
    171 	{0x2E, {SRIO2, SRIO2, SRIO2, SRIO2, SRIO1, SRIO1, SRIO1, SRIO1} },
    172 	{0x15, {PCIE1, PCIE1, PCIE1, PCIE1, PCIE2, PCIE2, SATA1, SATA2} },
    173 	{0x27, {PCIE1, PCIE1, PCIE1, PCIE1, NONE,  NONE,  SATA1, SATA2} },
    174 	{0x18, {PCIE1, PCIE1, PCIE1, PCIE1, AURORA, AURORA, SATA1, SATA2} },
    175 	{0x02, {PCIE1, PCIE1, PCIE1, PCIE1, PCIE1, PCIE1, PCIE1, PCIE1} },
    176 	{0x36, {SRIO2, SRIO2, SRIO2, SRIO2, AURORA, AURORA, SATA1, SATA2} },
    177 	{}
    178 };
    179 #endif
    180 
    181 static const struct serdes_config *serdes_cfg_tbl[] = {
    182 	serdes1_cfg_tbl,
    183 #ifndef CONFIG_ARCH_T2081
    184 	serdes2_cfg_tbl,
    185 #endif
    186 };
    187 
    188 enum srds_prtcl serdes_get_prtcl(int serdes, int cfg, int lane)
    189 {
    190 	const struct serdes_config *ptr;
    191 
    192 	if (serdes >= ARRAY_SIZE(serdes_cfg_tbl))
    193 		return 0;
    194 
    195 	ptr = serdes_cfg_tbl[serdes];
    196 	while (ptr->protocol) {
    197 		if (ptr->protocol == cfg)
    198 			return ptr->lanes[lane];
    199 		ptr++;
    200 	}
    201 	return 0;
    202 }
    203 
    204 int is_serdes_prtcl_valid(int serdes, u32 prtcl)
    205 {
    206 	int i;
    207 	const struct serdes_config *ptr;
    208 
    209 	if (serdes >= ARRAY_SIZE(serdes_cfg_tbl))
    210 		return 0;
    211 
    212 	ptr = serdes_cfg_tbl[serdes];
    213 	while (ptr->protocol) {
    214 		if (ptr->protocol == prtcl)
    215 			break;
    216 		ptr++;
    217 	}
    218 
    219 	if (!ptr->protocol)
    220 		return 0;
    221 
    222 	for (i = 0; i < SRDS_MAX_LANES; i++) {
    223 		if (ptr->lanes[i] != NONE)
    224 			return 1;
    225 	}
    226 
    227 	return 0;
    228 }
    229