Home | History | Annotate | Download | only in a38x
      1 /* SPDX-License-Identifier: GPL-2.0 */
      2 /*
      3  * Copyright (C) Marvell International Ltd. and its affiliates
      4  */
      5 
      6 #ifndef _HIGH_SPEED_ENV_SPEC_H
      7 #define _HIGH_SPEED_ENV_SPEC_H
      8 
      9 #include "seq_exec.h"
     10 
     11 /*
     12  * For setting or clearing a certain bit (bit is a number between 0 and 31)
     13  * in the data
     14  */
     15 #define SET_BIT(data, bit)		((data) | (0x1 << (bit)))
     16 #define CLEAR_BIT(data, bit)		((data) & (~(0x1 << (bit))))
     17 
     18 #define MAX_SERDES_LANES		7	/* as in a39x */
     19 
     20 /* Serdes revision */
     21 /* Serdes revision 1.2 (for A38x-Z1) */
     22 #define MV_SERDES_REV_1_2		0x0
     23 /* Serdes revision 2.1 (for A39x-Z1, A38x-A0) */
     24 #define MV_SERDES_REV_2_1		0x1
     25 #define MV_SERDES_REV_NA		0xff
     26 
     27 #define	SERDES_REGS_LANE_BASE_OFFSET(lane)	(0x800 * (lane))
     28 
     29 #define PEX_X4_ENABLE_OFFS						\
     30 	(hws_ctrl_serdes_rev_get() == MV_SERDES_REV_1_2 ? 18 : 31)
     31 
     32 /* Serdes lane types */
     33 enum serdes_type {
     34 	PEX0,
     35 	PEX1,
     36 	PEX2,
     37 	PEX3,
     38 	SATA0,
     39 	SATA1,
     40 	SATA2,
     41 	SATA3,
     42 	SGMII0,
     43 	SGMII1,
     44 	SGMII2,
     45 	QSGMII,
     46 	USB3_HOST0,
     47 	USB3_HOST1,
     48 	USB3_DEVICE,
     49 	SGMII3,
     50 	XAUI,
     51 	RXAUI,
     52 	DEFAULT_SERDES,
     53 	LAST_SERDES_TYPE
     54 };
     55 
     56 /* Serdes baud rates */
     57 enum serdes_speed {
     58 	SERDES_SPEED_1_25_GBPS,
     59 	SERDES_SPEED_1_5_GBPS,
     60 	SERDES_SPEED_2_5_GBPS,
     61 	SERDES_SPEED_3_GBPS,
     62 	SERDES_SPEED_3_125_GBPS,
     63 	SERDES_SPEED_5_GBPS,
     64 	SERDES_SPEED_6_GBPS,
     65 	SERDES_SPEED_6_25_GBPS,
     66 	LAST_SERDES_SPEED
     67 };
     68 
     69 /* Serdes modes */
     70 enum serdes_mode {
     71 	PEX_ROOT_COMPLEX_X1,
     72 	PEX_ROOT_COMPLEX_X4,
     73 	PEX_END_POINT_X1,
     74 	PEX_END_POINT_X4,
     75 
     76 	SERDES_DEFAULT_MODE, /* not pex */
     77 
     78 	SERDES_LAST_MODE
     79 };
     80 
     81 struct serdes_map {
     82 	enum serdes_type	serdes_type;
     83 	enum serdes_speed	serdes_speed;
     84 	enum serdes_mode	serdes_mode;
     85 	int			swap_rx;
     86 	int			swap_tx;
     87 };
     88 
     89 /* Serdes ref clock options */
     90 enum ref_clock {
     91 	REF_CLOCK_25MHZ,
     92 	REF_CLOCK_100MHZ,
     93 	REF_CLOCK_40MHZ,
     94 	REF_CLOCK_UNSUPPORTED
     95 };
     96 
     97 /* Serdes sequences */
     98 enum serdes_seq {
     99 	SATA_PORT_0_ONLY_POWER_UP_SEQ,
    100 	SATA_PORT_1_ONLY_POWER_UP_SEQ,
    101 	SATA_POWER_UP_SEQ,
    102 	SATA_1_5_SPEED_CONFIG_SEQ,
    103 	SATA_3_SPEED_CONFIG_SEQ,
    104 	SATA_6_SPEED_CONFIG_SEQ,
    105 	SATA_ELECTRICAL_CONFIG_SEQ,
    106 	SATA_TX_CONFIG_SEQ1,
    107 	SATA_PORT_0_ONLY_TX_CONFIG_SEQ,
    108 	SATA_PORT_1_ONLY_TX_CONFIG_SEQ,
    109 	SATA_TX_CONFIG_SEQ2,
    110 
    111 	SGMII_POWER_UP_SEQ,
    112 	SGMII_1_25_SPEED_CONFIG_SEQ,
    113 	SGMII_3_125_SPEED_CONFIG_SEQ,
    114 	SGMII_ELECTRICAL_CONFIG_SEQ,
    115 	SGMII_TX_CONFIG_SEQ1,
    116 	SGMII_TX_CONFIG_SEQ2,
    117 
    118 	PEX_POWER_UP_SEQ,
    119 	PEX_2_5_SPEED_CONFIG_SEQ,
    120 	PEX_5_SPEED_CONFIG_SEQ,
    121 	PEX_ELECTRICAL_CONFIG_SEQ,
    122 	PEX_TX_CONFIG_SEQ1,
    123 	PEX_TX_CONFIG_SEQ2,
    124 	PEX_TX_CONFIG_SEQ3,
    125 	PEX_BY_4_CONFIG_SEQ,
    126 	PEX_CONFIG_REF_CLOCK_25MHZ_SEQ,
    127 	PEX_CONFIG_REF_CLOCK_100MHZ_SEQ,
    128 	PEX_CONFIG_REF_CLOCK_40MHZ_SEQ,
    129 
    130 	USB3_POWER_UP_SEQ,
    131 	USB3_HOST_SPEED_CONFIG_SEQ,
    132 	USB3_DEVICE_SPEED_CONFIG_SEQ,
    133 	USB3_ELECTRICAL_CONFIG_SEQ,
    134 	USB3_TX_CONFIG_SEQ1,
    135 	USB3_TX_CONFIG_SEQ2,
    136 	USB3_TX_CONFIG_SEQ3,
    137 	USB3_DEVICE_CONFIG_SEQ,
    138 
    139 	USB2_POWER_UP_SEQ,
    140 
    141 	SERDES_POWER_DOWN_SEQ,
    142 
    143 	SGMII3_POWER_UP_SEQ,
    144 	SGMII3_1_25_SPEED_CONFIG_SEQ,
    145 	SGMII3_TX_CONFIG_SEQ1,
    146 	SGMII3_TX_CONFIG_SEQ2,
    147 
    148 	QSGMII_POWER_UP_SEQ,
    149 	QSGMII_5_SPEED_CONFIG_SEQ,
    150 	QSGMII_ELECTRICAL_CONFIG_SEQ,
    151 	QSGMII_TX_CONFIG_SEQ1,
    152 	QSGMII_TX_CONFIG_SEQ2,
    153 
    154 	XAUI_POWER_UP_SEQ,
    155 	XAUI_3_125_SPEED_CONFIG_SEQ,
    156 	XAUI_ELECTRICAL_CONFIG_SEQ,
    157 	XAUI_TX_CONFIG_SEQ1,
    158 	XAUI_TX_CONFIG_SEQ2,
    159 
    160 	RXAUI_POWER_UP_SEQ,
    161 	RXAUI_6_25_SPEED_CONFIG_SEQ,
    162 	RXAUI_ELECTRICAL_CONFIG_SEQ,
    163 	RXAUI_TX_CONFIG_SEQ1,
    164 	RXAUI_TX_CONFIG_SEQ2,
    165 
    166 	SERDES_LAST_SEQ
    167 };
    168 
    169 /* The different sequence types for PEX and USB3 */
    170 enum {
    171 	PEX,
    172 	USB3,
    173 	LAST_PEX_USB_SEQ_TYPE
    174 };
    175 
    176 enum {
    177 	PEXSERDES_SPEED_2_5_GBPS,
    178 	PEXSERDES_SPEED_5_GBPS,
    179 	USB3SERDES_SPEED_5_GBPS_HOST,
    180 	USB3SERDES_SPEED_5_GBPS_DEVICE,
    181 	LAST_PEX_USB_SPEED_SEQ_TYPE
    182 };
    183 
    184 /* The different sequence types for SATA and SGMII */
    185 enum {
    186 	SATA,
    187 	SGMII,
    188 	SGMII_3_125,
    189 	LAST_SATA_SGMII_SEQ_TYPE
    190 };
    191 
    192 enum {
    193 	QSGMII_SEQ_IDX,
    194 	LAST_QSGMII_SEQ_TYPE
    195 };
    196 
    197 enum {
    198 	XAUI_SEQ_IDX,
    199 	RXAUI_SEQ_IDX,
    200 	LAST_XAUI_RXAUI_SEQ_TYPE
    201 };
    202 
    203 enum {
    204 	SATASERDES_SPEED_1_5_GBPS,
    205 	SATASERDES_SPEED_3_GBPS,
    206 	SATASERDES_SPEED_6_GBPS,
    207 	SGMIISERDES_SPEED_1_25_GBPS,
    208 	SGMIISERDES_SPEED_3_125_GBPS,
    209 	LAST_SATA_SGMII_SPEED_SEQ_TYPE
    210 };
    211 
    212 extern u8 selectors_serdes_rev1_map[LAST_SERDES_TYPE][MAX_SERDES_LANES];
    213 extern u8 selectors_serdes_rev2_map[LAST_SERDES_TYPE][MAX_SERDES_LANES];
    214 
    215 u8 hws_ctrl_serdes_rev_get(void);
    216 int mv_update_serdes_select_phy_mode_seq(void);
    217 int hws_board_topology_load(struct serdes_map **serdes_map, u8 *count);
    218 enum serdes_seq serdes_type_and_speed_to_speed_seq(enum serdes_type serdes_type,
    219 						   enum serdes_speed baud_rate);
    220 int hws_serdes_seq_init(void);
    221 int hws_serdes_seq_db_init(void);
    222 int hws_power_up_serdes_lanes(struct serdes_map *serdes_map, u8 count);
    223 int hws_ctrl_high_speed_serdes_phy_config(void);
    224 int serdes_power_up_ctrl(u32 serdes_num, int serdes_power_up,
    225 			 enum serdes_type serdes_type,
    226 			 enum serdes_speed baud_rate,
    227 			 enum serdes_mode serdes_mode,
    228 			 enum ref_clock ref_clock);
    229 int serdes_power_up_ctrl_ext(u32 serdes_num, int serdes_power_up,
    230 			     enum serdes_type serdes_type,
    231 			     enum serdes_speed baud_rate,
    232 			     enum serdes_mode serdes_mode,
    233 			     enum ref_clock ref_clock);
    234 u32 hws_serdes_silicon_ref_clock_get(void);
    235 int hws_serdes_pex_ref_clock_get(enum serdes_type serdes_type,
    236 				 enum ref_clock *ref_clock);
    237 int hws_ref_clock_set(u32 serdes_num, enum serdes_type serdes_type,
    238 		      enum ref_clock ref_clock);
    239 int hws_update_serdes_phy_selectors(struct serdes_map *serdes_map, u8 count);
    240 u32 hws_serdes_get_phy_selector_val(int serdes_num,
    241 				    enum serdes_type serdes_type);
    242 u32 hws_serdes_get_ref_clock_val(enum serdes_type serdes_type);
    243 u32 hws_serdes_get_max_lane(void);
    244 int hws_get_ext_base_addr(u32 serdes_num, u32 base_addr, u32 unit_base_offset,
    245 			  u32 *unit_base_reg, u32 *unit_offset);
    246 int hws_pex_tx_config_seq(const struct serdes_map *serdes_map, u8 count);
    247 u32 hws_get_physical_serdes_num(u32 serdes_num);
    248 int hws_is_serdes_active(u8 lane_num);
    249 
    250 #endif /* _HIGH_SPEED_ENV_SPEC_H */
    251