1 /******************************************************************************** 2 Copyright (C) 2016 Marvell International Ltd. 3 4 Marvell BSD License Option 5 6 If you received this File from Marvell, you may opt to use, redistribute and/or 7 modify this File under the following licensing terms. 8 Redistribution and use in source and binary forms, with or without modification, 9 are permitted provided that the following conditions are met: 10 11 * Redistributions of source code must Retain the above copyright notice, 12 this list of conditions and the following disclaimer. 13 14 * Redistributions in binary form must reproduce the above copyright 15 notice, this list of conditions and the following disclaimer in the 16 documentation and/or other materials provided with the distribution. 17 18 * Neither the name of Marvell nor the names of its contributors may be 19 used to endorse or promote products derived from this software without 20 specific prior written permission. 21 22 THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND 23 ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED 24 WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE 25 DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR 26 ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES 27 (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; 28 LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON 29 ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 30 (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS 31 SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 32 33 *******************************************************************************/ 34 35 #include "ComPhyLib.h" 36 37 #define SD_LANE_ADDR_WIDTH 0x1000 38 #define HPIPE_ADDR_OFFSET 0x800 39 #define COMPHY_ADDR_LANE_WIDTH 0x28 40 #define SD_ADDR(base, Lane) (base + SD_LANE_ADDR_WIDTH * Lane) 41 #define HPIPE_ADDR(base, Lane) (SD_ADDR(base, Lane) + HPIPE_ADDR_OFFSET) 42 #define COMPHY_ADDR(base, Lane) (base + COMPHY_ADDR_LANE_WIDTH * Lane) 43 44 /* 45 * For CP-110 we have 2 Selector registers "PHY Selectors" 46 * and " PIPE Selectors". 47 * PIPE selector include USB and PCIe options. 48 * PHY selector include the Ethernet and SATA options, every Ethernet option 49 * has different options, for example: serdes Lane2 had option Eth_port_0 50 * that include (SGMII0, XAUI0, RXAUI0, KR) 51 */ 52 COMPHY_MUX_DATA Cp110ComPhyMuxData[] = { 53 /* Lane 0 */ 54 {4, {{PHY_TYPE_UNCONNECTED, 0x0}, {PHY_TYPE_SGMII2, 0x1}, 55 {PHY_TYPE_XAUI2, 0x1}, {PHY_TYPE_SATA1, 0x4} } }, 56 /* Lane 1 */ 57 {4, {{PHY_TYPE_UNCONNECTED, 0x0}, {PHY_TYPE_SGMII3, 0x1}, 58 {PHY_TYPE_XAUI3, 0x1}, {PHY_TYPE_SATA1, 0x4} } }, 59 /* Lane 2 */ 60 {6, {{PHY_TYPE_UNCONNECTED, 0x0}, {PHY_TYPE_SGMII0, 0x1}, 61 {PHY_TYPE_XAUI0, 0x1}, {PHY_TYPE_RXAUI0, 0x1}, {PHY_TYPE_KR, 0x1}, 62 {PHY_TYPE_SATA0, 0x4} } }, 63 /* Lane 3 */ 64 {8, {{PHY_TYPE_UNCONNECTED, 0x0}, {PHY_TYPE_SGMII0, 0x1}, 65 {PHY_TYPE_XAUI0, 0x1}, {PHY_TYPE_RXAUI0, 0x1}, {PHY_TYPE_KR, 0x1}, 66 {PHY_TYPE_XAUI1, 0x1}, {PHY_TYPE_RXAUI1, 0x1}, {PHY_TYPE_SATA1, 0x4} } }, 67 /* Lane 4 */ 68 {7, {{PHY_TYPE_UNCONNECTED, 0x0}, {PHY_TYPE_SGMII0, 0x2}, 69 {PHY_TYPE_XAUI0, 0x1}, {PHY_TYPE_RXAUI0, 0x1}, {PHY_TYPE_KR, 0x1}, 70 {PHY_TYPE_SGMII2, 0x1}, {PHY_TYPE_XAUI2, 0x1} } }, 71 /* Lane 5 */ 72 {6, {{PHY_TYPE_UNCONNECTED, 0x0}, {PHY_TYPE_XAUI1, 0x1}, 73 {PHY_TYPE_RXAUI1, 0x1}, {PHY_TYPE_SGMII3, 0x1}, {PHY_TYPE_XAUI3, 0x1}, 74 {PHY_TYPE_SATA1, 0x4} } }, 75 }; 76 77 COMPHY_MUX_DATA Cp110ComPhyPipeMuxData[] = { 78 /* Lane 0 */ 79 {2, {{PHY_TYPE_UNCONNECTED, 0x0}, {PHY_TYPE_PCIE0, 0x4} } }, 80 /* Lane 1 */ 81 {4, {{PHY_TYPE_UNCONNECTED, 0x0}, {PHY_TYPE_USB3_HOST0, 0x1}, 82 {PHY_TYPE_USB3_DEVICE, 0x2}, {PHY_TYPE_PCIE0, 0x4} } }, 83 /* Lane 2 */ 84 {3, {{PHY_TYPE_UNCONNECTED, 0x0}, {PHY_TYPE_USB3_HOST0, 0x1}, 85 {PHY_TYPE_PCIE0, 0x4} } }, 86 /* Lane 3 */ 87 {3, {{PHY_TYPE_UNCONNECTED, 0x0}, {PHY_TYPE_USB3_HOST1, 0x1}, 88 {PHY_TYPE_PCIE0, 0x4} } }, 89 /* Lane 4 */ 90 {4, {{PHY_TYPE_UNCONNECTED, 0x0}, {PHY_TYPE_USB3_HOST1, 0x1}, 91 {PHY_TYPE_USB3_DEVICE, 0x2}, {PHY_TYPE_PCIE1, 0x4} } }, 92 /* Lane 5 */ 93 {2, {{PHY_TYPE_UNCONNECTED, 0x0}, {PHY_TYPE_PCIE2, 0x4} } }, 94 }; 95 96 STATIC 97 VOID 98 ComPhyPcieRFUConfiguration ( 99 IN EFI_PHYSICAL_ADDRESS ComPhyAddr 100 ) 101 { 102 UINT32 Mask, Data; 103 104 /* RFU configurations - hard reset ComPhy */ 105 Mask = COMMON_PHY_CFG1_PWR_UP_MASK; 106 Data = 0x1 << COMMON_PHY_CFG1_PWR_UP_OFFSET; 107 Mask |= COMMON_PHY_CFG1_PIPE_SELECT_MASK; 108 Data |= 0x1 << COMMON_PHY_CFG1_PIPE_SELECT_OFFSET; 109 Mask |= COMMON_PHY_CFG1_PWR_ON_RESET_MASK; 110 Data |= 0x0 << COMMON_PHY_CFG1_PWR_ON_RESET_OFFSET; 111 Mask |= COMMON_PHY_CFG1_CORE_RSTN_MASK; 112 Data |= 0x0 << COMMON_PHY_CFG1_CORE_RSTN_OFFSET; 113 Mask |= COMMON_PHY_PHY_MODE_MASK; 114 Data |= 0x0 << COMMON_PHY_PHY_MODE_OFFSET; 115 RegSet (ComPhyAddr + COMMON_PHY_CFG1_REG, Data, Mask); 116 117 /* Release from hard reset */ 118 Mask = COMMON_PHY_CFG1_PWR_ON_RESET_MASK; 119 Data = 0x1 << COMMON_PHY_CFG1_PWR_ON_RESET_OFFSET; 120 Mask |= COMMON_PHY_CFG1_CORE_RSTN_MASK; 121 Data |= 0x1 << COMMON_PHY_CFG1_CORE_RSTN_OFFSET; 122 RegSet (ComPhyAddr + COMMON_PHY_CFG1_REG, Data, Mask); 123 124 /* Wait 1ms - until band gap and ref clock ready */ 125 MicroSecondDelay (1000); 126 MemoryFence (); 127 } 128 129 STATIC 130 VOID 131 ComPhyPciePhyConfiguration ( 132 IN EFI_PHYSICAL_ADDRESS ComPhyAddr, 133 IN EFI_PHYSICAL_ADDRESS HpipeAddr 134 ) 135 { 136 UINT32 Mask, Data, PcieClk = 0; 137 138 /* Set PIPE soft reset */ 139 Mask = HPIPE_RST_CLK_CTRL_PIPE_RST_MASK; 140 Data = 0x1 << HPIPE_RST_CLK_CTRL_PIPE_RST_OFFSET; 141 142 /* Set PHY Datapath width mode for V0 */ 143 Mask |= HPIPE_RST_CLK_CTRL_FIXED_PCLK_MASK; 144 Data |= 0x1 << HPIPE_RST_CLK_CTRL_FIXED_PCLK_OFFSET; 145 146 /* Set Data bus width USB mode for V0 */ 147 Mask |= HPIPE_RST_CLK_CTRL_PIPE_WIDTH_MASK; 148 Data |= 0x0 << HPIPE_RST_CLK_CTRL_PIPE_WIDTH_OFFSET; 149 150 /* Set CORE_CLK output frequency for 250Mhz */ 151 Mask |= HPIPE_RST_CLK_CTRL_CORE_FREQ_SEL_MASK; 152 Data |= 0x0 << HPIPE_RST_CLK_CTRL_CORE_FREQ_SEL_OFFSET; 153 RegSet (HpipeAddr + HPIPE_RST_CLK_CTRL_REG, Data, Mask); 154 155 /* Set PLL ready delay for 0x2 */ 156 RegSet (HpipeAddr + HPIPE_CLK_SRC_LO_REG, 157 0x2 << HPIPE_CLK_SRC_LO_PLL_RDY_DL_OFFSET, 158 HPIPE_CLK_SRC_LO_PLL_RDY_DL_MASK); 159 160 /* Set PIPE mode interface to PCIe3 - 0x1 */ 161 RegSet (HpipeAddr + HPIPE_CLK_SRC_HI_REG, 162 0x1 << HPIPE_CLK_SRC_HI_MODE_PIPE_OFFSET, HPIPE_CLK_SRC_HI_MODE_PIPE_MASK); 163 164 /* Config update polarity equalization */ 165 RegSet (HpipeAddr + HPIPE_LANE_EQ_CFG1_REG, 166 0x1 << HPIPE_CFG_UPDATE_POLARITY_OFFSET, HPIPE_CFG_UPDATE_POLARITY_MASK); 167 168 /* Set PIPE version 4 to mode enable */ 169 RegSet (HpipeAddr + HPIPE_DFE_CTRL_28_REG, 170 0x1 << HPIPE_DFE_CTRL_28_PIPE4_OFFSET, HPIPE_DFE_CTRL_28_PIPE4_MASK); 171 172 /* Enable PIN clock 100M_125M */ 173 Mask = HPIPE_MISC_CLK100M_125M_MASK; 174 Data = 0x1 << HPIPE_MISC_CLK100M_125M_OFFSET; 175 176 /* Set PIN_TXDCLK_2X Clock Frequency Selection for outputs 500MHz clock */ 177 Mask |= HPIPE_MISC_TXDCLK_2X_MASK; 178 Data |= 0x0 << HPIPE_MISC_TXDCLK_2X_OFFSET; 179 180 /* Enable 500MHz Clock */ 181 Mask |= HPIPE_MISC_CLK500_EN_MASK; 182 Data |= 0x1 << HPIPE_MISC_CLK500_EN_OFFSET; 183 184 if (PcieClk) { 185 /* Set reference clock comes from group 1 */ 186 Mask |= HPIPE_MISC_REFCLK_SEL_MASK; 187 Data |= 0x0 << HPIPE_MISC_REFCLK_SEL_OFFSET; 188 } else { 189 /* Set reference clock comes from group 2 */ 190 Mask |= HPIPE_MISC_REFCLK_SEL_MASK; 191 Data |= 0x1 << HPIPE_MISC_REFCLK_SEL_OFFSET; 192 } 193 RegSet (HpipeAddr + HPIPE_MISC_REG, Data, Mask); 194 195 if (PcieClk) { 196 /* Set reference frequcency select - 0x2 for 25MHz*/ 197 Mask = HPIPE_PWR_PLL_REF_FREQ_MASK; 198 Data = 0x2 << HPIPE_PWR_PLL_REF_FREQ_OFFSET; 199 } else { 200 /* Set reference frequcency select - 0x0 for 100MHz*/ 201 Mask = HPIPE_PWR_PLL_REF_FREQ_MASK; 202 Data = 0x0 << HPIPE_PWR_PLL_REF_FREQ_OFFSET; 203 } 204 205 /* Set PHY mode to PCIe */ 206 Mask |= HPIPE_PWR_PLL_PHY_MODE_MASK; 207 Data |= 0x3 << HPIPE_PWR_PLL_PHY_MODE_OFFSET; 208 RegSet (HpipeAddr + HPIPE_PWR_PLL_REG, Data, Mask); 209 210 /* 211 * Set the amount of time spent in the LoZ state - set 212 * for 0x7 only if the PCIe clock is output 213 */ 214 if (PcieClk) 215 RegSet (HpipeAddr + HPIPE_GLOBAL_PM_CTRL, 216 0x7 << HPIPE_GLOBAL_PM_RXDLOZ_WAIT_OFFSET, 217 HPIPE_GLOBAL_PM_RXDLOZ_WAIT_MASK); 218 219 /* Set Maximal PHY Generation Setting (8Gbps) */ 220 Mask = HPIPE_INTERFACE_GEN_MAX_MASK; 221 Data = 0x2 << HPIPE_INTERFACE_GEN_MAX_OFFSET; 222 223 /* Set Link Train Mode (Tx training control pins are used) */ 224 Mask |= HPIPE_INTERFACE_LINK_TRAIN_MASK; 225 Data |= 0x1 << HPIPE_INTERFACE_LINK_TRAIN_OFFSET; 226 RegSet (HpipeAddr + HPIPE_INTERFACE_REG, Data, Mask); 227 228 /* Set Idle_sync enable */ 229 Mask = HPIPE_PCIE_IDLE_SYNC_MASK; 230 Data = 0x1 << HPIPE_PCIE_IDLE_SYNC_OFFSET; 231 232 /* Select bits for PCIE Gen3(32bit) */ 233 Mask |= HPIPE_PCIE_SEL_BITS_MASK; 234 Data |= 0x2 << HPIPE_PCIE_SEL_BITS_OFFSET; 235 RegSet (HpipeAddr + HPIPE_PCIE_REG0, Data, Mask); 236 237 /* Enable Tx_adapt_g1 */ 238 Mask = HPIPE_TX_TRAIN_CTRL_G1_MASK; 239 Data = 0x1 << HPIPE_TX_TRAIN_CTRL_G1_OFFSET; 240 241 /* Enable Tx_adapt_gn1 */ 242 Mask |= HPIPE_TX_TRAIN_CTRL_GN1_MASK; 243 Data |= 0x1 << HPIPE_TX_TRAIN_CTRL_GN1_OFFSET; 244 245 /* Disable Tx_adapt_g0 */ 246 Mask |= HPIPE_TX_TRAIN_CTRL_G0_MASK; 247 Data |= 0x0 << HPIPE_TX_TRAIN_CTRL_G0_OFFSET; 248 RegSet (HpipeAddr + HPIPE_TX_TRAIN_CTRL_REG, Data, Mask); 249 250 /* Set reg_tx_train_chk_init */ 251 Mask = HPIPE_TX_TRAIN_CHK_INIT_MASK; 252 Data = 0x0 << HPIPE_TX_TRAIN_CHK_INIT_OFFSET; 253 254 /* Enable TX_COE_FM_PIN_PCIE3_EN */ 255 Mask |= HPIPE_TX_TRAIN_COE_FM_PIN_PCIE3_MASK; 256 Data |= 0x1 << HPIPE_TX_TRAIN_COE_FM_PIN_PCIE3_OFFSET; 257 RegSet (HpipeAddr + HPIPE_TX_TRAIN_REG, Data, Mask); 258 } 259 260 STATIC 261 VOID 262 ComPhyPciePhyPowerUp ( 263 IN EFI_PHYSICAL_ADDRESS HpipeAddr 264 ) 265 { 266 /* Release from PIPE soft reset */ 267 RegSet (HpipeAddr + HPIPE_RST_CLK_CTRL_REG, 268 0x0 << HPIPE_RST_CLK_CTRL_PIPE_RST_OFFSET, 269 HPIPE_RST_CLK_CTRL_PIPE_RST_MASK); 270 271 /* Wait 15ms - for ComPhy calibration done */ 272 MicroSecondDelay (15000); 273 MemoryFence (); 274 } 275 276 STATIC 277 EFI_STATUS 278 ComPhyPcieCheckPll ( 279 IN EFI_PHYSICAL_ADDRESS HpipeAddr 280 ) 281 { 282 EFI_STATUS Status = EFI_SUCCESS; 283 UINT32 Data; 284 285 /* Read Lane status */ 286 Data = MmioRead32 (HpipeAddr + HPIPE_LANE_STATUS0_REG); 287 if ((Data & HPIPE_LANE_STATUS0_PCLK_EN_MASK) == 0) { 288 DEBUG((DEBUG_INFO, "ComPhy: Read from reg = %p - value = 0x%x\n", 289 HpipeAddr + HPIPE_LANE_STATUS0_REG, Data)); 290 DEBUG((DEBUG_INFO, "ComPhy: HPIPE_LANE_STATUS0_PCLK_EN_MASK is 0\n")); 291 Status = EFI_D_ERROR; 292 } 293 294 return Status; 295 } 296 297 STATIC 298 EFI_STATUS 299 ComPhyPciePowerUp ( 300 IN UINT32 Lane, 301 IN UINT32 PcieBy4, 302 IN EFI_PHYSICAL_ADDRESS HpipeBase, 303 IN EFI_PHYSICAL_ADDRESS ComPhyBase 304 ) 305 { 306 EFI_STATUS Status = EFI_SUCCESS; 307 EFI_PHYSICAL_ADDRESS HpipeAddr = HPIPE_ADDR(HpipeBase, Lane); 308 EFI_PHYSICAL_ADDRESS ComPhyAddr = COMPHY_ADDR(ComPhyBase, Lane); 309 310 DEBUG((DEBUG_INFO, "ComPhy: stage: RFU configurations - hard reset ComPhy\n")); 311 312 ComPhyPcieRFUConfiguration (ComPhyAddr); 313 314 DEBUG((DEBUG_INFO, "ComPhy: stage: ComPhy configuration\n")); 315 316 ComPhyPciePhyConfiguration (ComPhyAddr, HpipeAddr); 317 318 DEBUG((DEBUG_INFO, "ComPhy: stage: ComPhy power up\n")); 319 320 ComPhyPciePhyPowerUp (HpipeAddr); 321 322 DEBUG((DEBUG_INFO, "ComPhy: stage: Check PLL\n")); 323 324 Status = ComPhyPcieCheckPll (HpipeAddr); 325 326 return Status; 327 } 328 329 STATIC 330 VOID 331 ComPhyUsb3RFUConfiguration ( 332 IN EFI_PHYSICAL_ADDRESS ComPhyAddr 333 ) 334 { 335 UINT32 Mask, Data; 336 337 /* RFU configurations - hard reset ComPhy */ 338 Mask = COMMON_PHY_CFG1_PWR_UP_MASK; 339 Data = 0x1 << COMMON_PHY_CFG1_PWR_UP_OFFSET; 340 Mask |= COMMON_PHY_CFG1_PIPE_SELECT_MASK; 341 Data |= 0x1 << COMMON_PHY_CFG1_PIPE_SELECT_OFFSET; 342 Mask |= COMMON_PHY_CFG1_PWR_ON_RESET_MASK; 343 Data |= 0x0 << COMMON_PHY_CFG1_PWR_ON_RESET_OFFSET; 344 Mask |= COMMON_PHY_CFG1_CORE_RSTN_MASK; 345 Data |= 0x0 << COMMON_PHY_CFG1_CORE_RSTN_OFFSET; 346 Mask |= COMMON_PHY_PHY_MODE_MASK; 347 Data |= 0x1 << COMMON_PHY_PHY_MODE_OFFSET; 348 RegSet (ComPhyAddr + COMMON_PHY_CFG1_REG, Data, Mask); 349 350 /* Release from hard reset */ 351 Mask = COMMON_PHY_CFG1_PWR_ON_RESET_MASK; 352 Data = 0x1 << COMMON_PHY_CFG1_PWR_ON_RESET_OFFSET; 353 Mask |= COMMON_PHY_CFG1_CORE_RSTN_MASK; 354 Data |= 0x1 << COMMON_PHY_CFG1_CORE_RSTN_OFFSET; 355 RegSet (ComPhyAddr + COMMON_PHY_CFG1_REG, Data, Mask); 356 357 /* Wait 1ms - until band gap and ref clock ready */ 358 MicroSecondDelay (1000); 359 MemoryFence (); 360 } 361 362 STATIC 363 VOID 364 ComPhyUsb3PhyConfiguration ( 365 IN EFI_PHYSICAL_ADDRESS HpipeAddr 366 ) 367 { 368 UINT32 Mask, Data; 369 370 /* Set PIPE soft reset */ 371 Mask = HPIPE_RST_CLK_CTRL_PIPE_RST_MASK; 372 Data = 0x1 << HPIPE_RST_CLK_CTRL_PIPE_RST_OFFSET; 373 374 /* Set PHY Datapath width mode for V0 */ 375 Mask |= HPIPE_RST_CLK_CTRL_FIXED_PCLK_MASK; 376 Data |= 0x0 << HPIPE_RST_CLK_CTRL_FIXED_PCLK_OFFSET; 377 378 /* Set Data bus width USB mode for V0 */ 379 Mask |= HPIPE_RST_CLK_CTRL_PIPE_WIDTH_MASK; 380 Data |= 0x0 << HPIPE_RST_CLK_CTRL_PIPE_WIDTH_OFFSET; 381 382 /* Set CORE_CLK output frequency for 250Mhz */ 383 Mask |= HPIPE_RST_CLK_CTRL_CORE_FREQ_SEL_MASK; 384 Data |= 0x0 << HPIPE_RST_CLK_CTRL_CORE_FREQ_SEL_OFFSET; 385 RegSet (HpipeAddr + HPIPE_RST_CLK_CTRL_REG, Data, Mask); 386 387 /* Set PLL ready delay for 0x2 */ 388 RegSet (HpipeAddr + HPIPE_CLK_SRC_LO_REG, 389 0x2 << HPIPE_CLK_SRC_LO_PLL_RDY_DL_OFFSET, 390 HPIPE_CLK_SRC_LO_PLL_RDY_DL_MASK); 391 392 /* Set reference clock to come from group 1 - 25Mhz */ 393 RegSet (HpipeAddr + HPIPE_MISC_REG, 0x0 << HPIPE_MISC_REFCLK_SEL_OFFSET, 394 HPIPE_MISC_REFCLK_SEL_MASK); 395 396 /* Set reference frequcency select - 0x2 */ 397 Mask = HPIPE_PWR_PLL_REF_FREQ_MASK; 398 Data = 0x2 << HPIPE_PWR_PLL_REF_FREQ_OFFSET; 399 400 /* Set PHY mode to USB - 0x5 */ 401 Mask |= HPIPE_PWR_PLL_PHY_MODE_MASK; 402 Data |= 0x5 << HPIPE_PWR_PLL_PHY_MODE_OFFSET; 403 RegSet (HpipeAddr + HPIPE_PWR_PLL_REG, Data, Mask); 404 405 /* Set the amount of time spent in the LoZ state - set for 0x7 */ 406 RegSet (HpipeAddr + HPIPE_GLOBAL_PM_CTRL, 407 0x7 << HPIPE_GLOBAL_PM_RXDLOZ_WAIT_OFFSET, 408 HPIPE_GLOBAL_PM_RXDLOZ_WAIT_MASK); 409 410 /* Set max PHY generation setting - 5Gbps */ 411 RegSet (HpipeAddr + HPIPE_INTERFACE_REG, 412 0x1 << HPIPE_INTERFACE_GEN_MAX_OFFSET, HPIPE_INTERFACE_GEN_MAX_MASK); 413 414 /* Set select Data width 20Bit (SEL_BITS[2:0]) */ 415 RegSet (HpipeAddr + HPIPE_LOOPBACK_REG, 416 0x1 << HPIPE_LOOPBACK_SEL_OFFSET, HPIPE_LOOPBACK_SEL_MASK); 417 } 418 419 STATIC 420 VOID 421 ComPhyUsb3SetAnalogParameters ( 422 IN EFI_PHYSICAL_ADDRESS HpipeAddr 423 ) 424 { 425 UINT32 Data, Mask; 426 427 /* Set Pin DFE_PAT_DIS -> Bit[1]: PIN_DFE_PAT_DIS = 0x0 */ 428 Mask = HPIPE_LANE_CFG4_DFE_CTRL_MASK; 429 Data = 0x1 << HPIPE_LANE_CFG4_DFE_CTRL_OFFSET; 430 431 /* Set Override PHY DFE control pins for 0x1 */ 432 Mask |= HPIPE_LANE_CFG4_DFE_OVER_MASK; 433 Data |= 0x1 << HPIPE_LANE_CFG4_DFE_OVER_OFFSET; 434 435 /* Set Spread Spectrum Clock Enable fot 0x1 */ 436 Mask |= HPIPE_LANE_CFG4_SSC_CTRL_MASK; 437 Data |= 0x1 << HPIPE_LANE_CFG4_SSC_CTRL_OFFSET; 438 RegSet (HpipeAddr + HPIPE_LANE_CFG4_REG, Data, Mask); 439 } 440 441 STATIC 442 UINTN 443 ComphyUsb3PowerUp ( 444 UINT32 Lane, 445 EFI_PHYSICAL_ADDRESS HpipeBase, 446 EFI_PHYSICAL_ADDRESS ComPhyBase 447 ) 448 { 449 EFI_STATUS Status = EFI_SUCCESS; 450 UINT32 Data; 451 EFI_PHYSICAL_ADDRESS HpipeAddr = HPIPE_ADDR(HpipeBase, Lane); 452 EFI_PHYSICAL_ADDRESS ComPhyAddr = COMPHY_ADDR(ComPhyBase, Lane); 453 454 DEBUG((DEBUG_INFO, "ComPhy: stage: RFU configurations - hard reset ComPhy\n")); 455 456 ComPhyUsb3RFUConfiguration (ComPhyAddr); 457 458 /* Start ComPhy Configuration */ 459 DEBUG((DEBUG_INFO, "stage: Comphy configuration\n")); 460 461 ComPhyUsb3PhyConfiguration (HpipeAddr); 462 463 /* Start analog paramters from ETP(HW) */ 464 DEBUG((DEBUG_INFO, "ComPhy: stage: Analog paramters from ETP(HW)\n")); 465 466 ComPhyUsb3SetAnalogParameters (HpipeAddr); 467 468 DEBUG((DEBUG_INFO, "ComPhy: stage: Comphy power up\n")); 469 470 /* Release from PIPE soft reset */ 471 RegSet (HpipeAddr + HPIPE_RST_CLK_CTRL_REG, 472 0x0 << HPIPE_RST_CLK_CTRL_PIPE_RST_OFFSET, 473 HPIPE_RST_CLK_CTRL_PIPE_RST_MASK); 474 475 /* Wait 15ms - for ComPhy calibration done */ 476 MicroSecondDelay (15000); 477 MemoryFence (); 478 479 DEBUG((DEBUG_INFO, "ComPhy: stage: Check PLL\n")); 480 481 /* Read Lane status */ 482 Data = MmioRead32 (HpipeAddr + HPIPE_LANE_STATUS0_REG); 483 if ((Data & HPIPE_LANE_STATUS0_PCLK_EN_MASK) == 0) { 484 DEBUG((DEBUG_ERROR, "ComPhy: HPIPE_LANE_STATUS0_PCLK_EN_MASK is 0\n")); 485 Status = EFI_D_ERROR; 486 } 487 488 return Status; 489 } 490 491 STATIC 492 UINT32 493 PollingWithTimeout ( 494 IN EFI_PHYSICAL_ADDRESS Addr, 495 IN UINT32 Val, 496 IN UINT32 Mask, 497 IN UINT64 Usec_timeout 498 ) 499 { 500 UINT32 Data; 501 502 do { 503 MicroSecondDelay(1); 504 Data = MmioRead32(Addr) & Mask; 505 } while (Data != Val && --Usec_timeout > 0); 506 507 if (Usec_timeout == 0) 508 return Data; 509 return 0; 510 } 511 512 STATIC 513 VOID 514 ComPhySataMacPowerDown ( 515 IN EFI_PHYSICAL_ADDRESS SataBase 516 ) 517 { 518 UINT32 Mask, Data; 519 520 /* 521 * MAC configuration - power down ComPhy 522 * Use indirect address for vendor specific SATA control register 523 */ 524 RegSet (SataBase + SATA3_VENDOR_ADDRESS, 525 SATA_CONTROL_REG << SATA3_VENDOR_ADDR_OFSSET, SATA3_VENDOR_ADDR_MASK); 526 527 /* SATA 0 power down */ 528 Mask = SATA3_CTRL_SATA0_PD_MASK; 529 Data = 0x1 << SATA3_CTRL_SATA0_PD_OFFSET; 530 531 /* SATA 1 power down */ 532 Mask |= SATA3_CTRL_SATA1_PD_MASK; 533 Data |= 0x1 << SATA3_CTRL_SATA1_PD_OFFSET; 534 535 /* SATA SSU disable */ 536 Mask |= SATA3_CTRL_SATA1_ENABLE_MASK; 537 Data |= 0x0 << SATA3_CTRL_SATA1_ENABLE_OFFSET; 538 539 /* SATA port 1 disable */ 540 Mask |= SATA3_CTRL_SATA_SSU_MASK; 541 Data |= 0x0 << SATA3_CTRL_SATA_SSU_OFFSET; 542 RegSet (SataBase + SATA3_VENDOR_DATA, Data, Mask); 543 } 544 545 STATIC 546 VOID 547 ComPhySataRFUConfiguration ( 548 IN EFI_PHYSICAL_ADDRESS ComPhyAddr, 549 IN EFI_PHYSICAL_ADDRESS SdIpAddr 550 ) 551 { 552 UINT32 Mask, Data; 553 554 /* RFU configurations - hard reset ComPhy */ 555 Mask = COMMON_PHY_CFG1_PWR_UP_MASK; 556 Data = 0x1 << COMMON_PHY_CFG1_PWR_UP_OFFSET; 557 Mask |= COMMON_PHY_CFG1_PIPE_SELECT_MASK; 558 Data |= 0x0 << COMMON_PHY_CFG1_PIPE_SELECT_OFFSET; 559 Mask |= COMMON_PHY_CFG1_PWR_ON_RESET_MASK; 560 Data |= 0x0 << COMMON_PHY_CFG1_PWR_ON_RESET_OFFSET; 561 Mask |= COMMON_PHY_CFG1_CORE_RSTN_MASK; 562 Data |= 0x0 << COMMON_PHY_CFG1_CORE_RSTN_OFFSET; 563 RegSet (ComPhyAddr + COMMON_PHY_CFG1_REG, Data, Mask); 564 565 /* Set select Data width 40Bit - SATA mode only */ 566 RegSet (ComPhyAddr + COMMON_PHY_CFG6_REG, 567 0x1 << COMMON_PHY_CFG6_IF_40_SEL_OFFSET, COMMON_PHY_CFG6_IF_40_SEL_MASK); 568 569 /* Release from hard reset in SD external */ 570 Mask = SD_EXTERNAL_CONFIG1_RESET_IN_MASK; 571 Data = 0x1 << SD_EXTERNAL_CONFIG1_RESET_IN_OFFSET; 572 Mask |= SD_EXTERNAL_CONFIG1_RESET_CORE_MASK; 573 Data |= 0x1 << SD_EXTERNAL_CONFIG1_RESET_CORE_OFFSET; 574 RegSet (SdIpAddr + SD_EXTERNAL_CONFIG1_REG, Data, Mask); 575 576 /* Wait 1ms - until band gap and ref clock ready */ 577 MicroSecondDelay (1000); 578 MemoryFence (); 579 } 580 581 STATIC 582 VOID 583 ComPhySataPhyConfiguration ( 584 IN EFI_PHYSICAL_ADDRESS HpipeAddr 585 ) 586 { 587 UINT32 Mask, Data; 588 589 /* Set reference clock to comes from group 1 - choose 25Mhz */ 590 RegSet (HpipeAddr + HPIPE_MISC_REG, 591 0x0 << HPIPE_MISC_REFCLK_SEL_OFFSET, HPIPE_MISC_REFCLK_SEL_MASK); 592 593 /* Reference frequency select set 1 (for SATA = 25Mhz) */ 594 Mask = HPIPE_PWR_PLL_REF_FREQ_MASK; 595 Data = 0x1 << HPIPE_PWR_PLL_REF_FREQ_OFFSET; 596 597 /* PHY mode select (set SATA = 0x0 */ 598 Mask |= HPIPE_PWR_PLL_PHY_MODE_MASK; 599 Data |= 0x0 << HPIPE_PWR_PLL_PHY_MODE_OFFSET; 600 RegSet (HpipeAddr + HPIPE_PWR_PLL_REG, Data, Mask); 601 602 /* Set max PHY generation setting - 6Gbps */ 603 RegSet (HpipeAddr + HPIPE_INTERFACE_REG, 604 0x2 << HPIPE_INTERFACE_GEN_MAX_OFFSET, HPIPE_INTERFACE_GEN_MAX_MASK); 605 606 /* Set select Data width 40Bit (SEL_BITS[2:0]) */ 607 RegSet (HpipeAddr + HPIPE_LOOPBACK_REG, 608 0x2 << HPIPE_LOOPBACK_SEL_OFFSET, HPIPE_LOOPBACK_SEL_MASK); 609 } 610 611 STATIC 612 VOID 613 ComPhySataSetAnalogParameters ( 614 IN EFI_PHYSICAL_ADDRESS HpipeAddr 615 ) 616 { 617 /* DFE reset sequence */ 618 RegSet (HpipeAddr + HPIPE_PWR_CTR_REG, 619 0x1 << HPIPE_PWR_CTR_RST_DFE_OFFSET, HPIPE_PWR_CTR_RST_DFE_MASK); 620 RegSet (HpipeAddr + HPIPE_PWR_CTR_REG, 621 0x0 << HPIPE_PWR_CTR_RST_DFE_OFFSET, HPIPE_PWR_CTR_RST_DFE_MASK); 622 623 /* SW reset for interupt logic */ 624 RegSet (HpipeAddr + HPIPE_PWR_CTR_REG, 625 0x1 << HPIPE_PWR_CTR_SFT_RST_OFFSET, HPIPE_PWR_CTR_SFT_RST_MASK); 626 RegSet (HpipeAddr + HPIPE_PWR_CTR_REG, 627 0x0 << HPIPE_PWR_CTR_SFT_RST_OFFSET, HPIPE_PWR_CTR_SFT_RST_MASK); 628 } 629 630 STATIC 631 VOID 632 ComPhySataPhyPowerUp ( 633 IN EFI_PHYSICAL_ADDRESS SataBase 634 ) 635 { 636 UINT32 Data, Mask; 637 638 /* 639 * MAC configuration - power up ComPhy - power up PLL/TX/RX 640 * Use indirect address for vendor specific SATA control register 641 */ 642 RegSet (SataBase + SATA3_VENDOR_ADDRESS, 643 SATA_CONTROL_REG << SATA3_VENDOR_ADDR_OFSSET, SATA3_VENDOR_ADDR_MASK); 644 645 /* SATA 0 power up */ 646 Mask = SATA3_CTRL_SATA0_PD_MASK; 647 Data = 0x0 << SATA3_CTRL_SATA0_PD_OFFSET; 648 649 /* SATA 1 power up */ 650 Mask |= SATA3_CTRL_SATA1_PD_MASK; 651 Data |= 0x0 << SATA3_CTRL_SATA1_PD_OFFSET; 652 653 /* SATA SSU enable */ 654 Mask |= SATA3_CTRL_SATA1_ENABLE_MASK; 655 Data |= 0x1 << SATA3_CTRL_SATA1_ENABLE_OFFSET; 656 657 /* SATA port 1 enable */ 658 Mask |= SATA3_CTRL_SATA_SSU_MASK; 659 Data |= 0x1 << SATA3_CTRL_SATA_SSU_OFFSET; 660 RegSet (SataBase + SATA3_VENDOR_DATA, Data, Mask); 661 662 /* MBUS request size and interface select register */ 663 RegSet (SataBase + SATA3_VENDOR_ADDRESS, 664 SATA_MBUS_SIZE_SELECT_REG << SATA3_VENDOR_ADDR_OFSSET, 665 SATA3_VENDOR_ADDR_MASK); 666 667 /* Mbus regret enable */ 668 RegSet (SataBase + SATA3_VENDOR_DATA, 0x1 << SATA_MBUS_REGRET_EN_OFFSET, 669 SATA_MBUS_REGRET_EN_MASK); 670 } 671 672 STATIC 673 EFI_STATUS 674 ComPhySataCheckPll ( 675 IN EFI_PHYSICAL_ADDRESS HpipeAddr, 676 IN EFI_PHYSICAL_ADDRESS SdIpAddr 677 ) 678 { 679 EFI_STATUS Status = EFI_SUCCESS; 680 UINT32 Data,Mask; 681 IN EFI_PHYSICAL_ADDRESS Addr; 682 683 Addr = SdIpAddr + SD_EXTERNAL_STATUS0_REG; 684 Data = SD_EXTERNAL_STATUS0_PLL_TX_MASK & SD_EXTERNAL_STATUS0_PLL_RX_MASK; 685 Mask = Data; 686 Data = PollingWithTimeout (Addr, Data, Mask, 15000); 687 688 if (Data != 0) { 689 DEBUG((DEBUG_INFO, "ComPhy: Read from reg = %p - value = 0x%x\n", 690 HpipeAddr + HPIPE_LANE_STATUS0_REG, Data)); 691 DEBUG((DEBUG_ERROR, "ComPhy: SD_EXTERNAL_STATUS0_PLL_TX is %d, SD_EXTERNAL_STATUS0_PLL_RX is %d\n", 692 (Data & SD_EXTERNAL_STATUS0_PLL_TX_MASK), 693 (Data & SD_EXTERNAL_STATUS0_PLL_RX_MASK))); 694 Status = EFI_D_ERROR; 695 } 696 697 return Status; 698 } 699 700 STATIC 701 UINTN 702 ComPhySataPowerUp ( 703 IN UINT32 Lane, 704 IN EFI_PHYSICAL_ADDRESS HpipeBase, 705 IN EFI_PHYSICAL_ADDRESS ComPhyBase 706 ) 707 { 708 EFI_STATUS Status; 709 EFI_PHYSICAL_ADDRESS HpipeAddr = HPIPE_ADDR(HpipeBase, Lane); 710 EFI_PHYSICAL_ADDRESS SdIpAddr = SD_ADDR(HpipeBase, Lane); 711 EFI_PHYSICAL_ADDRESS ComPhyAddr = COMPHY_ADDR(ComPhyBase, Lane); 712 EFI_PHYSICAL_ADDRESS SataBase; 713 714 SataBase = PcdGet32 (PcdSataBaseAddress); 715 if (SataBase == 0) { 716 DEBUG((DEBUG_INFO, "ComPhy: SATA address not defined\n")); 717 return EFI_D_ERROR; 718 } 719 720 DEBUG((DEBUG_INFO, "ComPhySataPowerUp: stage: MAC configuration - power down ComPhy\n")); 721 722 ComPhySataMacPowerDown (SataBase); 723 724 DEBUG((DEBUG_INFO, "ComPhy: stage: RFU configurations - hard reset ComPhy\n")); 725 726 ComPhySataRFUConfiguration (ComPhyAddr, SdIpAddr); 727 728 DEBUG((DEBUG_INFO, "ComPhy: stage: Comphy configuration\n")); 729 730 ComPhySataPhyConfiguration (HpipeAddr); 731 732 DEBUG((DEBUG_INFO, "ComPhy: stage: Analog paramters from ETP(HW)\n")); 733 734 ComPhySataSetAnalogParameters (HpipeAddr); 735 736 DEBUG((DEBUG_INFO, "ComPhy: stage: ComPhy power up\n")); 737 738 ComPhySataPhyPowerUp (SataBase); 739 740 DEBUG((DEBUG_INFO, "ComPhy: stage: Check PLL\n")); 741 742 Status = ComPhySataCheckPll (HpipeAddr, SdIpAddr); 743 744 return Status; 745 } 746 747 STATIC 748 VOID 749 ComPhySgmiiRFUConfiguration ( 750 IN EFI_PHYSICAL_ADDRESS ComPhyAddr, 751 IN EFI_PHYSICAL_ADDRESS SdIpAddr, 752 IN UINT32 SgmiiSpeed 753 ) 754 { 755 UINT32 Mask, Data; 756 757 Mask = COMMON_PHY_CFG1_PWR_UP_MASK; 758 Data = 0x1 << COMMON_PHY_CFG1_PWR_UP_OFFSET; 759 Mask |= COMMON_PHY_CFG1_PIPE_SELECT_MASK; 760 Data |= 0x0 << COMMON_PHY_CFG1_PIPE_SELECT_OFFSET; 761 RegSet (ComPhyAddr + COMMON_PHY_CFG1_REG, Data, Mask); 762 763 /* Select Baud Rate of Comphy And PD_PLL/Tx/Rx */ 764 Mask = SD_EXTERNAL_CONFIG0_SD_PU_PLL_MASK; 765 Data = 0x0 << SD_EXTERNAL_CONFIG0_SD_PU_PLL_OFFSET; 766 Mask |= SD_EXTERNAL_CONFIG0_SD_PHY_GEN_RX_MASK; 767 Mask |= SD_EXTERNAL_CONFIG0_SD_PHY_GEN_TX_MASK; 768 if (SgmiiSpeed == PHY_SPEED_1_25G) { 769 Data |= 0x6 << SD_EXTERNAL_CONFIG0_SD_PHY_GEN_RX_OFFSET; 770 Data |= 0x6 << SD_EXTERNAL_CONFIG0_SD_PHY_GEN_TX_OFFSET; 771 } else { 772 /* 3.125G */ 773 Data |= 0x8 << SD_EXTERNAL_CONFIG0_SD_PHY_GEN_RX_OFFSET; 774 Data |= 0x8 << SD_EXTERNAL_CONFIG0_SD_PHY_GEN_TX_OFFSET; 775 } 776 Mask |= SD_EXTERNAL_CONFIG0_SD_PU_RX_MASK; 777 Data |= 0 << SD_EXTERNAL_CONFIG0_SD_PU_RX_OFFSET; 778 Mask |= SD_EXTERNAL_CONFIG0_SD_PU_TX_MASK; 779 Data |= 0 << SD_EXTERNAL_CONFIG0_SD_PU_TX_OFFSET; 780 Mask |= SD_EXTERNAL_CONFIG0_HALF_BUS_MODE_MASK; 781 Data |= 1 << SD_EXTERNAL_CONFIG0_HALF_BUS_MODE_OFFSET; 782 RegSet (SdIpAddr + SD_EXTERNAL_CONFIG0_REG, Data, Mask); 783 784 /* Release from hard reset */ 785 Mask = SD_EXTERNAL_CONFIG1_RESET_IN_MASK; 786 Data = 0x0 << SD_EXTERNAL_CONFIG1_RESET_IN_OFFSET; 787 Mask |= SD_EXTERNAL_CONFIG1_RESET_CORE_MASK; 788 Data |= 0x0 << SD_EXTERNAL_CONFIG1_RESET_CORE_OFFSET; 789 Mask |= SD_EXTERNAL_CONFIG1_RF_RESET_IN_MASK; 790 Data |= 0x0 << SD_EXTERNAL_CONFIG1_RF_RESET_IN_OFFSET; 791 RegSet (SdIpAddr + SD_EXTERNAL_CONFIG1_REG, Data, Mask); 792 793 /* Release from hard reset */ 794 Mask = SD_EXTERNAL_CONFIG1_RESET_IN_MASK; 795 Data = 0x1 << SD_EXTERNAL_CONFIG1_RESET_IN_OFFSET; 796 Mask |= SD_EXTERNAL_CONFIG1_RESET_CORE_MASK; 797 Data |= 0x1 << SD_EXTERNAL_CONFIG1_RESET_CORE_OFFSET; 798 RegSet (SdIpAddr+ SD_EXTERNAL_CONFIG1_REG, Data, Mask); 799 800 /* Wait 1ms - until band gap and ref clock ready */ 801 MicroSecondDelay (1000); 802 MemoryFence (); 803 } 804 805 STATIC 806 VOID 807 ComPhySgmiiPhyConfiguration ( 808 IN EFI_PHYSICAL_ADDRESS HpipeAddr 809 ) 810 { 811 UINT32 Mask, Data; 812 813 /* Set reference clock */ 814 Mask = HPIPE_MISC_REFCLK_SEL_MASK; 815 Data = 0x0 << HPIPE_MISC_REFCLK_SEL_OFFSET; 816 RegSet (HpipeAddr + HPIPE_MISC_REG, Data, Mask); 817 818 /* Power and PLL Control */ 819 Mask = HPIPE_PWR_PLL_REF_FREQ_MASK; 820 Data = 0x1 << HPIPE_PWR_PLL_REF_FREQ_OFFSET; 821 Mask |= HPIPE_PWR_PLL_PHY_MODE_MASK; 822 Data |= 0x4 << HPIPE_PWR_PLL_PHY_MODE_OFFSET; 823 RegSet (HpipeAddr + HPIPE_PWR_PLL_REG, Data, Mask); 824 825 /* Loopback register */ 826 Mask = HPIPE_LOOPBACK_SEL_MASK; 827 Data = 0x1 << HPIPE_LOOPBACK_SEL_OFFSET; 828 RegSet (HpipeAddr + HPIPE_LOOPBACK_REG, Data, Mask); 829 830 /* Rx control 1 */ 831 Mask = HPIPE_RX_CONTROL_1_RXCLK2X_SEL_MASK; 832 Data = 0x1 << HPIPE_RX_CONTROL_1_RXCLK2X_SEL_OFFSET; 833 Mask |= HPIPE_RX_CONTROL_1_CLK8T_EN_MASK; 834 Data |= 0x0 << HPIPE_RX_CONTROL_1_CLK8T_EN_OFFSET; 835 RegSet (HpipeAddr + HPIPE_RX_CONTROL_1_REG, Data, Mask); 836 837 /* DTL Control */ 838 Mask = HPIPE_PWR_CTR_DTL_FLOOP_EN_MASK; 839 Data = 0x0 << HPIPE_PWR_CTR_DTL_FLOOP_EN_OFFSET; 840 RegSet (HpipeAddr + HPIPE_PWR_CTR_DTL_REG, Data, Mask); 841 } 842 843 STATIC 844 EFI_STATUS 845 ComPhySgmiiRFUPowerUp ( 846 IN EFI_PHYSICAL_ADDRESS SdIpAddr 847 ) 848 { 849 EFI_STATUS Status = EFI_SUCCESS; 850 UINT32 Mask, Data; 851 EFI_PHYSICAL_ADDRESS Addr; 852 853 /* SerDes External Configuration */ 854 Mask = SD_EXTERNAL_CONFIG0_SD_PU_PLL_MASK; 855 Data = 0x1 << SD_EXTERNAL_CONFIG0_SD_PU_PLL_OFFSET; 856 Mask |= SD_EXTERNAL_CONFIG0_SD_PU_RX_MASK; 857 Data |= 0x1 << SD_EXTERNAL_CONFIG0_SD_PU_RX_OFFSET; 858 Mask |= SD_EXTERNAL_CONFIG0_SD_PU_TX_MASK; 859 Data |= 0x1 << SD_EXTERNAL_CONFIG0_SD_PU_TX_OFFSET; 860 RegSet (SdIpAddr + SD_EXTERNAL_CONFIG0_REG, Data, Mask); 861 862 /* Check PLL rx & tx ready */ 863 Addr = SdIpAddr + SD_EXTERNAL_STATUS0_REG; 864 Data = SD_EXTERNAL_STATUS0_PLL_RX_MASK | SD_EXTERNAL_STATUS0_PLL_TX_MASK; 865 Mask = Data; 866 Data = PollingWithTimeout (Addr, Data, Mask, 15000); 867 if (Data != 0) { 868 DEBUG((DEBUG_ERROR, "ComPhy: Read from reg = %p - value = 0x%x\n", 869 SdIpAddr + SD_EXTERNAL_STATUS0_REG, Data)); 870 DEBUG((DEBUG_ERROR, "ComPhy: SD_EXTERNAL_STATUS0_PLL_RX is %d, SD_EXTERNAL_STATUS0_PLL_TX is %d\n", 871 (Data & SD_EXTERNAL_STATUS0_PLL_RX_MASK), 872 (Data & SD_EXTERNAL_STATUS0_PLL_TX_MASK))); 873 Status = EFI_D_ERROR; 874 } 875 876 /* RX init */ 877 Mask = SD_EXTERNAL_CONFIG1_RX_INIT_MASK; 878 Data = 0x1 << SD_EXTERNAL_CONFIG1_RX_INIT_OFFSET; 879 RegSet (SdIpAddr + SD_EXTERNAL_CONFIG1_REG, Data, Mask); 880 881 /* Check that RX init done */ 882 Addr = SdIpAddr + SD_EXTERNAL_STATUS0_REG; 883 Data = SD_EXTERNAL_STATUS0_RX_INIT_MASK; 884 Mask = Data; 885 Data = PollingWithTimeout (Addr, Data, Mask, 100); 886 if (Data != 0) { 887 DEBUG((DEBUG_ERROR, "ComPhy: Read from reg = %p - value = 0x%x\n", 888 SdIpAddr + SD_EXTERNAL_STATUS0_REG, Data)); 889 DEBUG((DEBUG_ERROR, "ComPhy: SD_EXTERNAL_STATUS0_RX_INIT is 0\n")); 890 Status = EFI_D_ERROR; 891 } 892 Mask = SD_EXTERNAL_CONFIG1_RX_INIT_MASK; 893 Data = 0x0 << SD_EXTERNAL_CONFIG1_RX_INIT_OFFSET; 894 Mask |= SD_EXTERNAL_CONFIG1_RF_RESET_IN_MASK; 895 Data |= 0x1 << SD_EXTERNAL_CONFIG1_RF_RESET_IN_OFFSET; 896 RegSet (SdIpAddr + SD_EXTERNAL_CONFIG1_REG, Data, Mask); 897 898 return Status; 899 } 900 901 STATIC 902 UINTN 903 ComPhySgmiiPowerUp ( 904 IN UINT32 Lane, 905 IN UINT32 SgmiiSpeed, 906 IN EFI_PHYSICAL_ADDRESS HpipeBase, 907 IN EFI_PHYSICAL_ADDRESS ComPhyBase 908 ) 909 { 910 EFI_STATUS Status = EFI_SUCCESS; 911 EFI_PHYSICAL_ADDRESS HpipeAddr = HPIPE_ADDR(HpipeBase, Lane); 912 EFI_PHYSICAL_ADDRESS SdIpAddr = SD_ADDR(HpipeBase, Lane); 913 EFI_PHYSICAL_ADDRESS ComPhyAddr = COMPHY_ADDR(ComPhyBase, Lane); 914 915 DEBUG((DEBUG_INFO, "ComPhy: stage: RFU configurations - hard reset ComPhy\n")); 916 917 ComPhySgmiiRFUConfiguration (ComPhyAddr, SdIpAddr, SgmiiSpeed); 918 919 DEBUG((DEBUG_INFO, "ComPhy: stage: ComPhy configuration\n")); 920 921 ComPhySgmiiPhyConfiguration (HpipeAddr); 922 923 /* Set analog paramters from ETP(HW) - for now use the default data */ 924 DEBUG((DEBUG_INFO, "ComPhy: stage: Analog paramters from ETP(HW)\n")); 925 926 RegSet (HpipeAddr + HPIPE_G1_SET_0_REG, 927 0x1 << HPIPE_G1_SET_0_G1_TX_EMPH1_OFFSET, HPIPE_G1_SET_0_G1_TX_EMPH1_MASK); 928 929 DEBUG((DEBUG_INFO, "ComPhy: stage: RFU configurations - Power Up PLL,Tx,Rx\n")); 930 931 Status = ComPhySgmiiRFUPowerUp (SdIpAddr); 932 933 return Status; 934 } 935 936 STATIC 937 VOID 938 ComPhyMuxCp110 ( 939 IN CHIP_COMPHY_CONFIG *PtrChipCfg, 940 IN COMPHY_MAP *SerdesMap 941 ) 942 { 943 EFI_PHYSICAL_ADDRESS ComPhyBaseAddr; 944 COMPHY_MAP ComPhyMapPipeData[MAX_LANE_OPTIONS]; 945 COMPHY_MAP ComPhyMapPhyData[MAX_LANE_OPTIONS]; 946 UINT32 Lane, ComPhyMaxCount; 947 948 ComPhyMaxCount = PtrChipCfg->LanesCount; 949 ComPhyBaseAddr = PtrChipCfg->ComPhyBaseAddr; 950 951 /* 952 * Copy the SerDes map configuration for PIPE map and PHY map. 953 * The ComPhyMuxInit modifies the Type of the Lane if the Type is not valid. 954 * Because we have 2 selectors, run the ComPhyMuxInit twice and after 955 * that, update the original SerdesMap. 956 */ 957 for (Lane = 0; Lane < ComPhyMaxCount; Lane++) { 958 ComPhyMapPipeData[Lane].Type = SerdesMap[Lane].Type; 959 ComPhyMapPipeData[Lane].Speed = SerdesMap[Lane].Speed; 960 ComPhyMapPhyData[Lane].Type = SerdesMap[Lane].Type; 961 ComPhyMapPhyData[Lane].Speed = SerdesMap[Lane].Speed; 962 } 963 PtrChipCfg->MuxData = Cp110ComPhyMuxData; 964 ComPhyMuxInit(PtrChipCfg, ComPhyMapPhyData, ComPhyBaseAddr + 965 COMMON_SELECTOR_PHY_OFFSET); 966 967 PtrChipCfg->MuxData = Cp110ComPhyPipeMuxData; 968 ComPhyMuxInit(PtrChipCfg, ComPhyMapPipeData, ComPhyBaseAddr + 969 COMMON_SELECTOR_PIPE_OFFSET); 970 971 /* Fix the Type after check the PHY and PIPE configuration */ 972 for (Lane = 0; Lane < ComPhyMaxCount; Lane++) 973 if ((ComPhyMapPipeData[Lane].Type == PHY_TYPE_UNCONNECTED) && 974 (ComPhyMapPhyData[Lane].Type == PHY_TYPE_UNCONNECTED)) 975 SerdesMap[Lane].Type = PHY_TYPE_UNCONNECTED; 976 } 977 978 EFI_STATUS 979 ComPhyCp110Init ( 980 IN CHIP_COMPHY_CONFIG *PtrChipCfg 981 ) 982 { 983 EFI_STATUS Status; 984 COMPHY_MAP *PtrComPhyMap, *SerdesMap; 985 EFI_PHYSICAL_ADDRESS ComPhyBaseAddr, HpipeBaseAddr; 986 UINT32 ComPhyMaxCount, Lane; 987 UINT32 PcieBy4 = 1; // Indicating if first 4 lanes set to PCIE 988 989 ComPhyMaxCount = PtrChipCfg->LanesCount; 990 ComPhyBaseAddr = PtrChipCfg->ComPhyBaseAddr; 991 HpipeBaseAddr = PtrChipCfg->Hpipe3BaseAddr; 992 SerdesMap = PtrChipCfg->MapData; 993 994 /* Config Comphy mux configuration */ 995 ComPhyMuxCp110(PtrChipCfg, SerdesMap); 996 997 /* Check if the first 4 Lanes configured as By-4 */ 998 for (Lane = 0, PtrComPhyMap = SerdesMap; Lane < 4; Lane++, PtrComPhyMap++) { 999 if (PtrComPhyMap->Type != PHY_TYPE_PCIE0) { 1000 PcieBy4 = 0; 1001 break; 1002 } 1003 } 1004 1005 for (Lane = 0, PtrComPhyMap = SerdesMap; Lane < ComPhyMaxCount; 1006 Lane++, PtrComPhyMap++) { 1007 DEBUG((DEBUG_INFO, "ComPhy: Initialize serdes number %d\n", Lane)); 1008 DEBUG((DEBUG_INFO, "ComPhy: Serdes Type = 0x%x\n", PtrComPhyMap->Type)); 1009 switch (PtrComPhyMap->Type) { 1010 case PHY_TYPE_UNCONNECTED: 1011 continue; 1012 break; 1013 case PHY_TYPE_PCIE0: 1014 case PHY_TYPE_PCIE1: 1015 case PHY_TYPE_PCIE2: 1016 case PHY_TYPE_PCIE3: 1017 Status = ComPhyPciePowerUp(Lane, PcieBy4, HpipeBaseAddr, ComPhyBaseAddr); 1018 break; 1019 case PHY_TYPE_SATA0: 1020 case PHY_TYPE_SATA1: 1021 case PHY_TYPE_SATA2: 1022 case PHY_TYPE_SATA3: 1023 Status = ComPhySataPowerUp(Lane, HpipeBaseAddr, ComPhyBaseAddr); 1024 break; 1025 case PHY_TYPE_USB3_HOST0: 1026 case PHY_TYPE_USB3_HOST1: 1027 Status = ComphyUsb3PowerUp(Lane, HpipeBaseAddr, ComPhyBaseAddr); 1028 break; 1029 case PHY_TYPE_SGMII0: 1030 case PHY_TYPE_SGMII1: 1031 case PHY_TYPE_SGMII2: 1032 case PHY_TYPE_SGMII3: 1033 Status = ComPhySgmiiPowerUp(Lane, PtrComPhyMap->Speed, HpipeBaseAddr, 1034 ComPhyBaseAddr); 1035 break; 1036 default: 1037 DEBUG((DEBUG_ERROR, "Unknown SerDes Type, skip initialize SerDes %d\n", 1038 Lane)); 1039 break; 1040 } 1041 if (EFI_ERROR(Status)) 1042 DEBUG((DEBUG_ERROR, "PLL is not locked - Failed to initialize Lane %d\n", 1043 Lane)); 1044 } 1045 1046 return EFI_SUCCESS; 1047 } 1048