• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 #ifndef __COMPHY_H__
36 #define __COMPHY_H__
37 
38 #include <Library/ArmLib.h>
39 #include <Library/ArmPlatformLib.h>
40 #include <Library/DebugLib.h>
41 #include <Library/PcdLib.h>
42 #include <Library/MemoryAllocationLib.h>
43 #include <Library/IoLib.h>
44 #include <Library/TimerLib.h>
45 #include <Library/ParsePcdLib.h>
46 
47 #define MAX_LANE_OPTIONS          10
48 #define MAX_CHIPS                 4
49 
50 /***** Parsing PCD *****/
51 #define GET_TYPE_STRING(id)       PcdGetPtr(PcdChip##id##Compatible)
52 #define GET_LANE_TYPE(id)         PcdGetPtr(PcdChip##id##ComPhyTypes)
53 #define GET_LANE_SPEED(id)        PcdGetPtr(PcdChip##id##ComPhySpeeds)
54 #define GET_LANE_INV(id)          PcdGetPtr(PcdChip##id##ComPhyInvFlags)
55 #define GET_COMPHY_BASE_ADDR(id)  PcdGet64(PcdChip##id##ComPhyBaseAddress)
56 #define GET_HPIPE3_BASE_ADDR(id)  PcdGet64(PcdChip##id##Hpipe3BaseAddress)
57 #define GET_MUX_BIT_COUNT(id)     PcdGet32(PcdChip##id##ComPhyMuxBitCount)
58 #define GET_MAX_LANES(id)         PcdGet32(PcdChip##id##ComPhyMaxLanes)
59 
60 #define FillLaneMap(chip_struct, lane_struct, id) { \
61   ParsePcdString((CHAR16 *) GET_LANE_TYPE(id), chip_struct[id].LanesCount, NULL, lane_struct[id].TypeStr);     \
62   ParsePcdString((CHAR16 *) GET_LANE_SPEED(id), chip_struct[id].LanesCount, lane_struct[id].SpeedValue, NULL); \
63   ParsePcdString((CHAR16 *) GET_LANE_INV(id), chip_struct[id].LanesCount, lane_struct[id].InvFlag, NULL);      \
64 }
65 
66 #define GetComPhyPcd(chip_struct, lane_struct, id) {               \
67   chip_struct[id].ChipType = (CHAR16 *) GET_TYPE_STRING(id);       \
68   chip_struct[id].ComPhyBaseAddr = GET_COMPHY_BASE_ADDR(id);       \
69   chip_struct[id].Hpipe3BaseAddr = GET_HPIPE3_BASE_ADDR(id);       \
70   chip_struct[id].MuxBitCount = GET_MUX_BIT_COUNT(id);             \
71   chip_struct[id].LanesCount = GET_MAX_LANES(id);                  \
72   FillLaneMap(chip_struct, lane_struct, id);                       \
73 }
74 
75 /***** ComPhy *****/
76 #define PHY_SPEED_ERROR                           0
77 #define PHY_SPEED_1_25G                           1
78 #define PHY_SPEED_1_5G                            2
79 #define PHY_SPEED_2_5G                            3
80 #define PHY_SPEED_3G                              4
81 #define PHY_SPEED_3_125G                          5
82 #define PHY_SPEED_5G                              6
83 #define PHY_SPEED_6G                              7
84 #define PHY_SPEED_6_25G                           8
85 #define PHY_SPEED_10_3125G                        9
86 #define PHY_SPEED_MAX                             10
87 #define PHY_SPEED_INVALID                         0xff
88 
89 #define PHY_TYPE_UNCONNECTED                      0
90 #define PHY_TYPE_PCIE0                            1
91 #define PHY_TYPE_PCIE1                            2
92 #define PHY_TYPE_PCIE2                            3
93 #define PHY_TYPE_PCIE3                            4
94 #define PHY_TYPE_SATA0                            5
95 #define PHY_TYPE_SATA1                            6
96 #define PHY_TYPE_SATA2                            7
97 #define PHY_TYPE_SATA3                            8
98 #define PHY_TYPE_SGMII0                           9
99 #define PHY_TYPE_SGMII1                           10
100 #define PHY_TYPE_SGMII2                           11
101 #define PHY_TYPE_SGMII3                           12
102 #define PHY_TYPE_QSGMII                           13
103 #define PHY_TYPE_USB3_HOST0                       14
104 #define PHY_TYPE_USB3_HOST1                       15
105 #define PHY_TYPE_USB3_DEVICE                      16
106 #define PHY_TYPE_XAUI0                            17
107 #define PHY_TYPE_XAUI1                            18
108 #define PHY_TYPE_XAUI2                            19
109 #define PHY_TYPE_XAUI3                            20
110 #define PHY_TYPE_RXAUI0                           21
111 #define PHY_TYPE_RXAUI1                           22
112 #define PHY_TYPE_KR                               23
113 #define PHY_TYPE_MAX                              24
114 #define PHY_TYPE_INVALID                          0xff
115 
116 #define PHY_POLARITY_NO_INVERT                    0
117 #define PHY_POLARITY_TXD_INVERT                   1
118 #define PHY_POLARITY_RXD_INVERT                   2
119 #define PHY_POLARITY_ALL_INVERT                   (PHY_POLARITY_TXD_INVERT | PHY_POLARITY_RXD_INVERT)
120 
121 /***** SerDes IP registers *****/
122 #define SD_EXTERNAL_CONFIG0_REG                   0
123 #define SD_EXTERNAL_CONFIG0_SD_PU_PLL_OFFSET      1
124 #define SD_EXTERNAL_CONFIG0_SD_PU_PLL_MASK        (1 << SD_EXTERNAL_CONFIG0_SD_PU_PLL_OFFSET)
125 #define SD_EXTERNAL_CONFIG0_SD_PHY_GEN_RX_OFFSET  3
126 #define SD_EXTERNAL_CONFIG0_SD_PHY_GEN_RX_MASK    (0xf << SD_EXTERNAL_CONFIG0_SD_PHY_GEN_RX_OFFSET)
127 #define SD_EXTERNAL_CONFIG0_SD_PHY_GEN_TX_OFFSET  7
128 #define SD_EXTERNAL_CONFIG0_SD_PHY_GEN_TX_MASK    (0xf << SD_EXTERNAL_CONFIG0_SD_PHY_GEN_TX_OFFSET)
129 #define SD_EXTERNAL_CONFIG0_SD_PU_RX_OFFSET       11
130 #define SD_EXTERNAL_CONFIG0_SD_PU_RX_MASK         (1 << SD_EXTERNAL_CONFIG0_SD_PU_RX_OFFSET)
131 #define SD_EXTERNAL_CONFIG0_SD_PU_TX_OFFSET       12
132 #define SD_EXTERNAL_CONFIG0_SD_PU_TX_MASK         (1 << SD_EXTERNAL_CONFIG0_SD_PU_TX_OFFSET)
133 #define SD_EXTERNAL_CONFIG0_HALF_BUS_MODE_OFFSET  14
134 #define SD_EXTERNAL_CONFIG0_HALF_BUS_MODE_MASK    (1 << SD_EXTERNAL_CONFIG0_HALF_BUS_MODE_OFFSET)
135 
136 #define SD_EXTERNAL_CONFIG1_REG                   0x4
137 #define SD_EXTERNAL_CONFIG1_RESET_IN_OFFSET       3
138 #define SD_EXTERNAL_CONFIG1_RESET_IN_MASK         (0x1 << SD_EXTERNAL_CONFIG1_RESET_IN_OFFSET)
139 #define SD_EXTERNAL_CONFIG1_RX_INIT_OFFSET        4
140 #define SD_EXTERNAL_CONFIG1_RX_INIT_MASK          (0x1 << SD_EXTERNAL_CONFIG1_RX_INIT_OFFSET)
141 #define SD_EXTERNAL_CONFIG1_RESET_CORE_OFFSET     5
142 #define SD_EXTERNAL_CONFIG1_RESET_CORE_MASK       (0x1 << SD_EXTERNAL_CONFIG1_RESET_CORE_OFFSET)
143 #define SD_EXTERNAL_CONFIG1_RF_RESET_IN_OFFSET    6
144 #define SD_EXTERNAL_CONFIG1_RF_RESET_IN_MASK      (0x1 << SD_EXTERNAL_CONFIG1_RF_RESET_IN_OFFSET)
145 
146 
147 #define SD_EXTERNAL_STATUS0_REG                   0x18
148 #define SD_EXTERNAL_STATUS0_PLL_TX_OFFSET         2
149 #define SD_EXTERNAL_STATUS0_PLL_TX_MASK           (0x1 << SD_EXTERNAL_STATUS0_PLL_TX_OFFSET)
150 #define SD_EXTERNAL_STATUS0_PLL_RX_OFFSET         3
151 #define SD_EXTERNAL_STATUS0_PLL_RX_MASK           (0x1 << SD_EXTERNAL_STATUS0_PLL_RX_OFFSET)
152 #define SD_EXTERNAL_STATUS0_RX_INIT_OFFSET        4
153 #define SD_EXTERNAL_STATUS0_RX_INIT_MASK          (0x1 << SD_EXTERNAL_STATUS0_RX_INIT_OFFSET)
154 
155 /***** HPIPE registers *****/
156 #define HPIPE_PWR_PLL_REG                         0x4
157 #define HPIPE_PWR_PLL_REF_FREQ_OFFSET             0
158 #define HPIPE_PWR_PLL_REF_FREQ_MASK               (0x1f << HPIPE_PWR_PLL_REF_FREQ_OFFSET)
159 #define HPIPE_PWR_PLL_PHY_MODE_OFFSET             5
160 #define HPIPE_PWR_PLL_PHY_MODE_MASK               (0x7 << HPIPE_PWR_PLL_PHY_MODE_OFFSET)
161 
162 #define HPIPE_KVCO_CALIB_CTRL_REG                 0x8
163 #define HPIPE_KVCO_CALIB_CTRL_MAX_PLL_OFFSET      12
164 #define HPIPE_KVCO_CALIB_CTRL_MAX_PLL_MASK        (0x1 << HPIPE_KVCO_CALIB_CTRL_MAX_PLL_OFFSET)
165 
166 #define HPIPE_SQUELCH_FFE_SETTING_REG             0x018
167 
168 #define HPIPE_DFE_REG0                            0x01C
169 #define HPIPE_DFE_RES_FORCE_OFFSET                15
170 #define HPIPE_DFE_RES_FORCE_MASK                  (0x1 << HPIPE_DFE_RES_FORCE_OFFSET)
171 
172 
173 #define HPIPE_DFE_F3_F5_REG                       0x028
174 #define HPIPE_DFE_F3_F5_DFE_EN_OFFSET             14
175 #define HPIPE_DFE_F3_F5_DFE_EN_MASK               (0x1 << HPIPE_DFE_F3_F5_DFE_EN_OFFSET)
176 #define HPIPE_DFE_F3_F5_DFE_CTRL_OFFSET           15
177 #define HPIPE_DFE_F3_F5_DFE_CTRL_MASK             (0x1 << HPIPE_DFE_F3_F5_DFE_CTRL_OFFSET)
178 
179 #define HPIPE_G1_SET_0_REG                        0x034
180 #define HPIPE_G1_SET_0_G1_TX_EMPH1_OFFSET         7
181 #define HPIPE_G1_SET_0_G1_TX_EMPH1_MASK           (0xf << HPIPE_G1_SET_0_G1_TX_EMPH1_OFFSET)
182 
183 #define HPIPE_G1_SET_1_REG                        0x038
184 #define HPIPE_G1_SET_1_G1_RX_SELMUPI_OFFSET       0
185 #define HPIPE_G1_SET_1_G1_RX_SELMUPI_MASK         (0x7 << HPIPE_G1_SET_1_G1_RX_SELMUPI_OFFSET)
186 #define HPIPE_G1_SET_1_G1_RX_SELMUPP_OFFSET       3
187 #define HPIPE_G1_SET_1_G1_RX_SELMUPP_MASK         (0x7 << HPIPE_G1_SET_1_G1_RX_SELMUPP_OFFSET)
188 #define HPIPE_G1_SET_1_G1_RX_DFE_EN_OFFSET        10
189 #define HPIPE_G1_SET_1_G1_RX_DFE_EN_MASK          (0x1 << HPIPE_G1_SET_1_G1_RX_DFE_EN_OFFSET)
190 
191 #define HPIPE_G2_SETTINGS_1_REG                   0x040
192 
193 #define HPIPE_LOOPBACK_REG                        0x08c
194 #define HPIPE_LOOPBACK_SEL_OFFSET                 1
195 #define HPIPE_LOOPBACK_SEL_MASK                   (0x7 << HPIPE_LOOPBACK_SEL_OFFSET)
196 
197 #define HPIPE_SYNC_PATTERN_REG                    0x090
198 
199 #define HPIPE_INTERFACE_REG                       0x94
200 #define HPIPE_INTERFACE_GEN_MAX_OFFSET            10
201 #define HPIPE_INTERFACE_GEN_MAX_MASK              (0x3 << HPIPE_INTERFACE_GEN_MAX_OFFSET)
202 #define HPIPE_INTERFACE_LINK_TRAIN_OFFSET         14
203 #define HPIPE_INTERFACE_LINK_TRAIN_MASK           (0x1 << HPIPE_INTERFACE_LINK_TRAIN_OFFSET)
204 
205 #define HPIPE_ISOLATE_MODE_REG                    0x98
206 #define HPIPE_ISOLATE_MODE_GEN_RX_OFFSET          0
207 #define HPIPE_ISOLATE_MODE_GEN_RX_MASK            (0xf << HPIPE_ISOLATE_MODE_GEN_RX_OFFSET)
208 #define HPIPE_ISOLATE_MODE_GEN_TX_OFFSET          4
209 #define HPIPE_ISOLATE_MODE_GEN_TX_MASK            (0xf << HPIPE_ISOLATE_MODE_GEN_TX_OFFSET)
210 
211 #define HPIPE_VTHIMPCAL_CTRL_REG                  0x104
212 
213 #define HPIPE_PCIE_REG0                           0x120
214 #define HPIPE_PCIE_IDLE_SYNC_OFFSET               12
215 #define HPIPE_PCIE_IDLE_SYNC_MASK                 (0x1 << HPIPE_PCIE_IDLE_SYNC_OFFSET)
216 #define HPIPE_PCIE_SEL_BITS_OFFSET                13
217 #define HPIPE_PCIE_SEL_BITS_MASK                  (0x3 << HPIPE_PCIE_SEL_BITS_OFFSET)
218 
219 #define HPIPE_LANE_ALIGN_REG                      0x124
220 #define HPIPE_LANE_ALIGN_OFF_OFFSET               12
221 #define HPIPE_LANE_ALIGN_OFF_MASK                 (0x1 << HPIPE_LANE_ALIGN_OFF_OFFSET)
222 
223 #define HPIPE_MISC_REG                            0x13C
224 #define HPIPE_MISC_CLK100M_125M_OFFSET            4
225 #define HPIPE_MISC_CLK100M_125M_MASK              (0x1 << HPIPE_MISC_CLK100M_125M_OFFSET)
226 #define HPIPE_MISC_TXDCLK_2X_OFFSET               6
227 #define HPIPE_MISC_TXDCLK_2X_MASK                 (0x1 << HPIPE_MISC_TXDCLK_2X_OFFSET)
228 #define HPIPE_MISC_CLK500_EN_OFFSET               7
229 #define HPIPE_MISC_CLK500_EN_MASK                 (0x1 << HPIPE_MISC_CLK500_EN_OFFSET)
230 #define HPIPE_MISC_REFCLK_SEL_OFFSET              10
231 #define HPIPE_MISC_REFCLK_SEL_MASK                (0x1 << HPIPE_MISC_REFCLK_SEL_OFFSET)
232 
233 #define HPIPE_RX_CONTROL_1_REG                    0x140
234 #define HPIPE_RX_CONTROL_1_RXCLK2X_SEL_OFFSET     11
235 #define HPIPE_RX_CONTROL_1_RXCLK2X_SEL_MASK       (0x1 << HPIPE_RX_CONTROL_1_RXCLK2X_SEL_OFFSET)
236 #define HPIPE_RX_CONTROL_1_CLK8T_EN_OFFSET        12
237 #define HPIPE_RX_CONTROL_1_CLK8T_EN_MASK          (0x1 << HPIPE_RX_CONTROL_1_CLK8T_EN_OFFSET)
238 
239 #define HPIPE_PWR_CTR_REG                         0x148
240 #define HPIPE_PWR_CTR_RST_DFE_OFFSET              0
241 #define HPIPE_PWR_CTR_RST_DFE_MASK                (0x1 << HPIPE_PWR_CTR_RST_DFE_OFFSET)
242 #define HPIPE_PWR_CTR_SFT_RST_OFFSET              10
243 #define HPIPE_PWR_CTR_SFT_RST_MASK                (0x1 << HPIPE_PWR_CTR_SFT_RST_OFFSET)
244 
245 #define HPIPE_PLLINTP_REG1                        0x150
246 
247 #define HPIPE_PWR_CTR_DTL_REG                     0x184
248 #define HPIPE_PWR_CTR_DTL_FLOOP_EN_OFFSET         0x2
249 #define HPIPE_PWR_CTR_DTL_FLOOP_EN_MASK           (0x1 << HPIPE_PWR_CTR_DTL_FLOOP_EN_OFFSET)
250 
251 #define HPIPE_RX_REG3                             0x188
252 
253 #define HPIPE_TX_TRAIN_CTRL_REG                   0x26C
254 #define HPIPE_TX_TRAIN_CTRL_G1_OFFSET             0
255 #define HPIPE_TX_TRAIN_CTRL_G1_MASK               (0x1 << HPIPE_TX_TRAIN_CTRL_G1_OFFSET)
256 #define HPIPE_TX_TRAIN_CTRL_GN1_OFFSET            1
257 #define HPIPE_TX_TRAIN_CTRL_GN1_MASK              (0x1 << HPIPE_TX_TRAIN_CTRL_GN1_OFFSET)
258 #define HPIPE_TX_TRAIN_CTRL_G0_OFFSET             2
259 #define HPIPE_TX_TRAIN_CTRL_G0_MASK               (0x1 << HPIPE_TX_TRAIN_CTRL_G0_OFFSET)
260 
261 #define HPIPE_PCIE_REG1                           0x288
262 #define HPIPE_PCIE_REG3                           0x290
263 
264 #define HPIPE_TX_TRAIN_REG                        0x31C
265 #define HPIPE_TX_TRAIN_CHK_INIT_OFFSET            4
266 #define HPIPE_TX_TRAIN_CHK_INIT_MASK              (0x1 << HPIPE_TX_TRAIN_CHK_INIT_OFFSET)
267 #define HPIPE_TX_TRAIN_COE_FM_PIN_PCIE3_OFFSET    7
268 #define HPIPE_TX_TRAIN_COE_FM_PIN_PCIE3_MASK      (0x1 << HPIPE_TX_TRAIN_COE_FM_PIN_PCIE3_OFFSET)
269 
270 #define HPIPE_G1_SETTINGS_3_REG                   0x440
271 #define HPIPE_G1_SETTINGS_4_REG                   0x444
272 #define HPIPE_G2_SETTINGS_3_REG                   0x448
273 #define HPIPE_G2_SETTINGS_4_REG                   0x44C
274 
275 #define HPIPE_DFE_CTRL_28_REG                     0x49C
276 #define HPIPE_DFE_CTRL_28_PIPE4_OFFSET            7
277 #define HPIPE_DFE_CTRL_28_PIPE4_MASK              (0x1 << HPIPE_DFE_CTRL_28_PIPE4_OFFSET)
278 
279 #define HPIPE_LANE_CONFIG0_REG                    0x604
280 #define HPIPE_LANE_CONFIG0_MAX_PLL_OFFSET         9
281 #define HPIPE_LANE_CONFIG0_MAX_PLL_MASK           (0x1 << HPIPE_LANE_CONFIG0_MAX_PLL_OFFSET)
282 #define HPIPE_LANE_CONFIG0_GEN2_PLL_OFFSET        10
283 #define HPIPE_LANE_CONFIG0_GEN2_PLL_MASK          (0x1 << HPIPE_LANE_CONFIG0_GEN2_PLL_OFFSET)
284 
285 #define HPIPE_LANE_STATUS0_REG                    0x60C
286 #define HPIPE_LANE_STATUS0_PCLK_EN_OFFSET         0
287 #define HPIPE_LANE_STATUS0_PCLK_EN_MASK           (0x1 << HPIPE_LANE_STATUS0_PCLK_EN_OFFSET)
288 
289 #define HPIPE_LANE_CFG4_REG                       0x620
290 #define HPIPE_LANE_CFG4_DFE_CTRL_OFFSET           0
291 #define HPIPE_LANE_CFG4_DFE_CTRL_MASK             (0x7 << HPIPE_LANE_CFG4_DFE_CTRL_OFFSET)
292 #define HPIPE_LANE_CFG4_DFE_OVER_OFFSET           6
293 #define HPIPE_LANE_CFG4_DFE_OVER_MASK             (0x1 << HPIPE_LANE_CFG4_DFE_OVER_OFFSET)
294 #define HPIPE_LANE_CFG4_SSC_CTRL_OFFSET           7
295 #define HPIPE_LANE_CFG4_SSC_CTRL_MASK             (0x1 << HPIPE_LANE_CFG4_SSC_CTRL_OFFSET)
296 
297 #define HPIPE_LANE_EQ_CFG1_REG                    0x6a0
298 #define HPIPE_CFG_UPDATE_POLARITY_OFFSET          12
299 #define HPIPE_CFG_UPDATE_POLARITY_MASK            (0x1 << HPIPE_CFG_UPDATE_POLARITY_OFFSET)
300 
301 #define HPIPE_RST_CLK_CTRL_REG                    0x704
302 #define HPIPE_RST_CLK_CTRL_PIPE_RST_OFFSET        0
303 #define HPIPE_RST_CLK_CTRL_PIPE_RST_MASK          (0x1 << HPIPE_RST_CLK_CTRL_PIPE_RST_OFFSET)
304 #define HPIPE_RST_CLK_CTRL_FIXED_PCLK_OFFSET      2
305 #define HPIPE_RST_CLK_CTRL_FIXED_PCLK_MASK        (0x1 << HPIPE_RST_CLK_CTRL_FIXED_PCLK_OFFSET)
306 #define HPIPE_RST_CLK_CTRL_PIPE_WIDTH_OFFSET      3
307 #define HPIPE_RST_CLK_CTRL_PIPE_WIDTH_MASK        (0x1 << HPIPE_RST_CLK_CTRL_PIPE_WIDTH_OFFSET)
308 #define HPIPE_RST_CLK_CTRL_CORE_FREQ_SEL_OFFSET   9
309 #define HPIPE_RST_CLK_CTRL_CORE_FREQ_SEL_MASK     (0x1 << HPIPE_RST_CLK_CTRL_CORE_FREQ_SEL_OFFSET)
310 
311 #define HPIPE_CLK_SRC_LO_REG                      0x70c
312 #define HPIPE_CLK_SRC_LO_PLL_RDY_DL_OFFSET        5
313 #define HPIPE_CLK_SRC_LO_PLL_RDY_DL_MASK          (0x7 << HPIPE_CLK_SRC_LO_PLL_RDY_DL_OFFSET)
314 
315 #define HPIPE_CLK_SRC_HI_REG                      0x710
316 #define HPIPE_CLK_SRC_HI_LANE_STRT_OFFSET         0
317 #define HPIPE_CLK_SRC_HI_LANE_STRT_MASK           (0x1 << HPIPE_CLK_SRC_HI_LANE_STRT_OFFSET)
318 #define HPIPE_CLK_SRC_HI_LANE_BREAK_OFFSET        1
319 #define HPIPE_CLK_SRC_HI_LANE_BREAK_MASK          (0x1 << HPIPE_CLK_SRC_HI_LANE_BREAK_OFFSET)
320 #define HPIPE_CLK_SRC_HI_LANE_MASTER_OFFSET       2
321 #define HPIPE_CLK_SRC_HI_LANE_MASTER_MASK         (0x1 << HPIPE_CLK_SRC_HI_LANE_MASTER_OFFSET)
322 #define HPIPE_CLK_SRC_HI_MODE_PIPE_OFFSET         7
323 #define HPIPE_CLK_SRC_HI_MODE_PIPE_MASK           (0x1 << HPIPE_CLK_SRC_HI_MODE_PIPE_OFFSET)
324 
325 #define HPIPE_GLOBAL_MISC_CTRL                    0x718
326 #define HPIPE_GLOBAL_PM_CTRL                      0x740
327 #define HPIPE_GLOBAL_PM_RXDLOZ_WAIT_OFFSET        0
328 #define HPIPE_GLOBAL_PM_RXDLOZ_WAIT_MASK          (0xFF << HPIPE_GLOBAL_PM_RXDLOZ_WAIT_OFFSET)
329 
330 /***** COMPHY registers *****/
331 #define COMMON_PHY_CFG1_REG                       0x0
332 #define COMMON_PHY_CFG1_PWR_UP_OFFSET             1
333 #define COMMON_PHY_CFG1_PWR_UP_MASK               (0x1 << COMMON_PHY_CFG1_PWR_UP_OFFSET)
334 #define COMMON_PHY_CFG1_PIPE_SELECT_OFFSET        2
335 #define COMMON_PHY_CFG1_PIPE_SELECT_MASK          (0x1 << COMMON_PHY_CFG1_PIPE_SELECT_OFFSET)
336 #define COMMON_PHY_CFG1_PWR_ON_RESET_OFFSET       13
337 #define COMMON_PHY_CFG1_PWR_ON_RESET_MASK         (0x1 << COMMON_PHY_CFG1_PWR_ON_RESET_OFFSET)
338 #define COMMON_PHY_CFG1_CORE_RSTN_OFFSET          14
339 #define COMMON_PHY_CFG1_CORE_RSTN_MASK            (0x1 << COMMON_PHY_CFG1_CORE_RSTN_OFFSET)
340 #define COMMON_PHY_PHY_MODE_OFFSET                15
341 #define COMMON_PHY_PHY_MODE_MASK                  (0x1 << COMMON_PHY_PHY_MODE_OFFSET)
342 
343 #define COMMON_PHY_CFG6_REG                       0x14
344 #define COMMON_PHY_CFG6_IF_40_SEL_OFFSET          18
345 #define COMMON_PHY_CFG6_IF_40_SEL_MASK            (0x1 << COMMON_PHY_CFG6_IF_40_SEL_OFFSET)
346 
347 #define COMMON_SELECTOR_PHY_OFFSET                0x140
348 #define COMMON_SELECTOR_PIPE_OFFSET               0x144
349 
350 /***** SATA registers *****/
351 #define SATA3_VENDOR_ADDRESS                      0xA0
352 #define SATA3_VENDOR_ADDR_OFSSET                  0
353 #define SATA3_VENDOR_ADDR_MASK                    (0xFFFFFFFF << SATA3_VENDOR_ADDR_OFSSET)
354 #define SATA3_VENDOR_DATA                         0xA4
355 
356 #define SATA_CONTROL_REG                          0x0
357 #define SATA3_CTRL_SATA0_PD_OFFSET                6
358 #define SATA3_CTRL_SATA0_PD_MASK                  (1 << SATA3_CTRL_SATA0_PD_OFFSET)
359 #define SATA3_CTRL_SATA1_PD_OFFSET                14
360 #define SATA3_CTRL_SATA1_PD_MASK                  (1 << SATA3_CTRL_SATA1_PD_OFFSET)
361 #define SATA3_CTRL_SATA1_ENABLE_OFFSET            22
362 #define SATA3_CTRL_SATA1_ENABLE_MASK              (1 << SATA3_CTRL_SATA1_ENABLE_OFFSET)
363 #define SATA3_CTRL_SATA_SSU_OFFSET                23
364 #define SATA3_CTRL_SATA_SSU_MASK                  (1 << SATA3_CTRL_SATA_SSU_OFFSET)
365 
366 #define SATA_MBUS_SIZE_SELECT_REG                 0x4
367 #define SATA_MBUS_REGRET_EN_OFFSET                7
368 #define SATA_MBUS_REGRET_EN_MASK                  (0x1 << SATA_MBUS_REGRET_EN_OFFSET)
369 
370 /***************************/
371 
372 typedef struct _CHIP_COMPHY_CONFIG CHIP_COMPHY_CONFIG;
373 
374 typedef struct {
375   UINT32 Type;
376   UINT32 MuxValue;
377 } COMPHY_MUX_OPTIONS;
378 
379 typedef struct {
380   UINT32 MaxLaneValues;
381   COMPHY_MUX_OPTIONS MuxValues[MAX_LANE_OPTIONS];
382 } COMPHY_MUX_DATA;
383 
384 typedef struct {
385   UINT32 Type;
386   UINT32 Speed;
387   UINT32 Invert;
388 } COMPHY_MAP;
389 
390 typedef struct {
391   CHAR16 *TypeStr[MAX_LANE_OPTIONS];
392   UINTN SpeedValue[MAX_LANE_OPTIONS];
393   UINTN InvFlag[MAX_LANE_OPTIONS];
394 } PCD_LANE_MAP;
395 
396 typedef
397 EFI_STATUS
398 (*COMPHY_CHIP_INIT) (
399   IN CHIP_COMPHY_CONFIG *PtrChipCfg
400   );
401 
402 struct _CHIP_COMPHY_CONFIG {
403   CHAR16* ChipType;
404   COMPHY_MAP MapData[MAX_LANE_OPTIONS];
405   COMPHY_MUX_DATA *MuxData;
406   EFI_PHYSICAL_ADDRESS ComPhyBaseAddr;
407   EFI_PHYSICAL_ADDRESS Hpipe3BaseAddr;
408   COMPHY_CHIP_INIT Init;
409   UINT32 LanesCount;
410   UINT32 MuxBitCount;
411 };
412 
413 VOID
414 ComPhyMuxInit (
415   IN CHIP_COMPHY_CONFIG *PtrChipCfg,
416   IN COMPHY_MAP *ComPhyMapData,
417   IN EFI_PHYSICAL_ADDRESS SelectorBase
418   );
419 
420 EFI_STATUS
421 ComPhyCp110Init (
422   IN CHIP_COMPHY_CONFIG * First
423   );
424 
425 VOID
426 RegSet (
427   IN EFI_PHYSICAL_ADDRESS Addr,
428   IN UINT32 Data,
429   IN UINT32 Mask
430   );
431 
432 VOID
433 RegSetSilent (
434   IN EFI_PHYSICAL_ADDRESS Addr,
435   IN UINT32 Data,
436   IN UINT32 Mask
437   );
438 
439 VOID
440 RegSet16 (
441   IN EFI_PHYSICAL_ADDRESS Addr,
442   IN UINT16 Data,
443   IN UINT16 Mask
444   );
445 
446 VOID
447 RegSetSilent16(
448   IN EFI_PHYSICAL_ADDRESS Addr,
449   IN UINT16 Data,
450   IN UINT16 Mask
451   );
452 #endif // __COMPHY_H__
453