ETHFW-607: j7200_evm: Bypass SerDes config for Eth if already configured
[processor-sdk/pdk.git] / packages / ti / board / src / j7200_evm / board_serdes_cfg.c
1 /******************************************************************************\r
2  * Copyright (c) 2020 Texas Instruments Incorporated - http://www.ti.com\r
3  *\r
4  *  Redistribution and use in source and binary forms, with or without\r
5  *  modification, are permitted provided that the following conditions\r
6  *  are met:\r
7  *\r
8  *    Redistributions of source code must retain the above copyright\r
9  *    notice, this list of conditions and the following disclaimer.\r
10  *\r
11  *    Redistributions in binary form must reproduce the above copyright\r
12  *    notice, this list of conditions and the following disclaimer in the\r
13  *    documentation and/or other materials provided with the\r
14  *    distribution.\r
15  *\r
16  *    Neither the name of Texas Instruments Incorporated nor the names of\r
17  *    its contributors may be used to endorse or promote products derived\r
18  *    from this software without specific prior written permission.\r
19  *\r
20  *  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\r
21  *  "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\r
22  *  LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\r
23  *  A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\r
24  *  OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\r
25  *  SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\r
26  *  LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\r
27  *  DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\r
28  *  THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\r
29  *  (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\r
30  *  OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\r
31  *\r
32  *****************************************************************************/\r
33 /**\r
34  *  \file   board_cfg.c\r
35  *\r
36  *  \brief  EVM serdes configuration file\r
37  *\r
38  *  Configures the serdes module.\r
39  *\r
40  */\r
41 \r
42 #include "board_serdes_cfg.h"\r
43 \r
44 static Board_STATUS Board_serdesInitParams(CSL_SerdesLaneEnableParams *laneParams,\r
45                                            uint32_t phyType)\r
46 {\r
47     laneParams->serdesInstance    = (CSL_SerdesInstance)BOARD_SERDES_INSTANCE;\r
48     laneParams->baseAddr          = CSL_SERDES_10G1_BASE;\r
49     laneParams->refClock          = CSL_SERDES_REF_CLOCK_100M;\r
50     laneParams->refClkSrc         = CSL_SERDES_REF_CLOCK_INT;\r
51     laneParams->numLanes          = 0x4;\r
52     laneParams->laneMask          = 0xf;\r
53     laneParams->SSC_mode          = CSL_SERDES_NO_SSC;\r
54     laneParams->phyType           = phyType;\r
55     laneParams->operatingMode     = CSL_SERDES_FUNCTIONAL_MODE;\r
56     laneParams->phyInstanceNum    = SERDES_LANE_SELECT_CPSW;\r
57 \r
58     laneParams->laneCtrlRate[0]   = CSL_SERDES_LANE_FULL_RATE;\r
59     laneParams->loopbackMode[0]   = CSL_SERDES_LOOPBACK_DISABLED;\r
60 \r
61     laneParams->laneCtrlRate[1]   = CSL_SERDES_LANE_FULL_RATE;\r
62     laneParams->loopbackMode[1]   = CSL_SERDES_LOOPBACK_DISABLED;\r
63 \r
64     if(phyType == CSL_SERDES_PHY_TYPE_SGMII)\r
65     {\r
66         laneParams->pcieGenType       = CSL_SERDES_PCIE_GEN3;\r
67         laneParams->linkRate          = CSL_SERDES_LINK_RATE_1p25G;\r
68     }\r
69     else if (phyType == CSL_SERDES_PHY_TYPE_QSGMII)\r
70     {\r
71         laneParams->pcieGenType       = CSL_SERDES_PCIE_GEN4;\r
72         laneParams->linkRate          = CSL_SERDES_LINK_RATE_5G;\r
73     }\r
74     else\r
75     {\r
76         /* Unsupported phy type */\r
77         return BOARD_FAIL;\r
78     }\r
79 \r
80     return BOARD_SOK;\r
81 }\r
82 \r
83 static Board_STATUS Board_serdesCfgEthernet(uint32_t phyType)\r
84 {\r
85     CSL_SerdesStatus status;\r
86     CSL_SerdesResult result;\r
87     CSL_SerdesLaneEnableStatus laneRetVal = CSL_SERDES_LANE_ENABLE_NO_ERR;\r
88     CSL_SerdesLaneEnableParams serdesLane0EnableParams  = {0};\r
89 \r
90     memset(&serdesLane0EnableParams, 0, sizeof(serdesLane0EnableParams));\r
91 \r
92     Board_serdesInitParams(&serdesLane0EnableParams, phyType);\r
93 \r
94     /* Bail out early if SERDES is already configured */\r
95     status = CSL_serdesConfigStatus(serdesLane0EnableParams.baseAddr);\r
96     if (status == 1U)\r
97     {\r
98         return BOARD_SOK;\r
99     }\r
100 \r
101     CSL_serdesPorReset(serdesLane0EnableParams.baseAddr);\r
102 \r
103     /* Select the IP type, IP instance num, Serdes Lane Number */\r
104     CSL_serdesIPSelect(CSL_CTRL_MMR0_CFG0_BASE,\r
105                        serdesLane0EnableParams.phyType,\r
106                        serdesLane0EnableParams.phyInstanceNum,\r
107                        serdesLane0EnableParams.serdesInstance,\r
108                        BOARD_SERDES_SGMII_LANE_NUM);\r
109 \r
110     result = CSL_serdesRefclkSel(CSL_CTRL_MMR0_CFG0_BASE,\r
111                                  serdesLane0EnableParams.baseAddr,\r
112                                  serdesLane0EnableParams.refClock,\r
113                                  serdesLane0EnableParams.refClkSrc,\r
114                                  serdesLane0EnableParams.serdesInstance,\r
115                                  serdesLane0EnableParams.phyType);\r
116 \r
117     if (result != CSL_SERDES_NO_ERR)\r
118     {\r
119         return BOARD_FAIL;\r
120     }\r
121 \r
122     /* Assert PHY reset and disable all lanes */\r
123     CSL_serdesDisablePllAndLanes(serdesLane0EnableParams.baseAddr, serdesLane0EnableParams.numLanes, serdesLane0EnableParams.laneMask);\r
124 \r
125     /* Load the Serdes Config File */\r
126     result = CSL_serdesEthernetInit(&serdesLane0EnableParams);\r
127     /* Return error if input params are invalid */\r
128     if (result != CSL_SERDES_NO_ERR)\r
129     {\r
130         return BOARD_FAIL;\r
131     }\r
132 \r
133     /* Common Lane Enable API for lane enable, pll enable etc */\r
134     laneRetVal = CSL_serdesLaneEnable(&serdesLane0EnableParams);\r
135     if (laneRetVal != 0)\r
136     {\r
137         return BOARD_FAIL;\r
138     }\r
139 \r
140     return BOARD_SOK;\r
141 }\r
142 \r
143 /**\r
144  *  \brief serdes configurations\r
145  *\r
146  *  The function configures the serdes1 module for one lane pcie interface\r
147  *\r
148  *  \return   BOARD_SOK in case of success or appropriate error code\r
149  *\r
150  */\r
151 Board_STATUS Board_serdesCfgSgmii(void)\r
152 {\r
153     Board_STATUS ret;\r
154 \r
155     /* SERDES0 Initializations */\r
156     ret = Board_serdesCfgEthernet(CSL_SERDES_PHY_TYPE_SGMII);\r
157     if(ret != BOARD_SOK)\r
158     {\r
159         return ret;\r
160     }\r
161 \r
162     return BOARD_SOK;\r
163 }\r
164 \r
165 /**\r
166  *  \brief serdes configurations\r
167  *\r
168  *  The function configures the serdes1 module for one lane pcie interface\r
169  *\r
170  *  \return   BOARD_SOK in case of success or appropriate error code\r
171  *\r
172  */\r
173 Board_STATUS Board_serdesCfgQsgmii(void)\r
174 {\r
175     Board_STATUS ret;\r
176 \r
177     /* SERDES0 Initializations */\r
178     ret = Board_serdesCfgEthernet(CSL_SERDES_PHY_TYPE_QSGMII);\r
179     if(ret != BOARD_SOK)\r
180     {\r
181         return ret;\r
182     }\r
183 \r
184     return BOARD_SOK;\r
185 }\r