1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26 #ifndef __DC_LINK_ENCODER__DCN20_H__
27 #define __DC_LINK_ENCODER__DCN20_H__
28
29 #include "dcn10/dcn10_link_encoder.h"
30
31 #define DCN2_AUX_REG_LIST(id)\
32 AUX_REG_LIST(id), \
33 SRI(AUX_DPHY_TX_CONTROL, DP_AUX, id)
34
35 #define UNIPHY_MASK_SH_LIST(mask_sh)\
36 LE_SF(UNIPHYA_CHANNEL_XBAR_CNTL, UNIPHY_LINK_ENABLE, mask_sh)
37
38 #define LINK_ENCODER_MASK_SH_LIST_DCN20(mask_sh)\
39 LINK_ENCODER_MASK_SH_LIST_DCN10(mask_sh),\
40 LE_SF(DP0_DP_DPHY_CNTL, DPHY_FEC_EN, mask_sh),\
41 LE_SF(DP0_DP_DPHY_CNTL, DPHY_FEC_READY_SHADOW, mask_sh),\
42 LE_SF(DP0_DP_DPHY_CNTL, DPHY_FEC_ACTIVE_STATUS, mask_sh),\
43 LE_SF(DIG0_DIG_LANE_ENABLE, DIG_LANE0EN, mask_sh),\
44 LE_SF(DIG0_DIG_LANE_ENABLE, DIG_LANE1EN, mask_sh),\
45 LE_SF(DIG0_DIG_LANE_ENABLE, DIG_LANE2EN, mask_sh),\
46 LE_SF(DIG0_DIG_LANE_ENABLE, DIG_LANE3EN, mask_sh),\
47 LE_SF(DIG0_DIG_LANE_ENABLE, DIG_CLK_EN, mask_sh),\
48 LE_SF(DIG0_TMDS_CTL_BITS, TMDS_CTL0, mask_sh), \
49 UNIPHY_MASK_SH_LIST(mask_sh),\
50 LE_SF(DP_AUX0_AUX_DPHY_RX_CONTROL0, AUX_RX_START_WINDOW, mask_sh),\
51 LE_SF(DP_AUX0_AUX_DPHY_RX_CONTROL0, AUX_RX_HALF_SYM_DETECT_LEN, mask_sh),\
52 LE_SF(DP_AUX0_AUX_DPHY_RX_CONTROL0, AUX_RX_TRANSITION_FILTER_EN, mask_sh),\
53 LE_SF(DP_AUX0_AUX_DPHY_RX_CONTROL0, AUX_RX_ALLOW_BELOW_THRESHOLD_PHASE_DETECT, mask_sh),\
54 LE_SF(DP_AUX0_AUX_DPHY_RX_CONTROL0, AUX_RX_ALLOW_BELOW_THRESHOLD_START, mask_sh),\
55 LE_SF(DP_AUX0_AUX_DPHY_RX_CONTROL0, AUX_RX_ALLOW_BELOW_THRESHOLD_STOP, mask_sh),\
56 LE_SF(DP_AUX0_AUX_DPHY_RX_CONTROL0, AUX_RX_PHASE_DETECT_LEN, mask_sh),\
57 LE_SF(DP_AUX0_AUX_DPHY_RX_CONTROL0, AUX_RX_DETECTION_THRESHOLD, mask_sh), \
58 LE_SF(DP_AUX0_AUX_DPHY_TX_CONTROL, AUX_TX_PRECHARGE_LEN, mask_sh),\
59 LE_SF(DP_AUX0_AUX_DPHY_TX_CONTROL, AUX_TX_PRECHARGE_SYMBOLS, mask_sh),\
60 LE_SF(DP_AUX0_AUX_DPHY_TX_CONTROL, AUX_MODE_DET_CHECK_DELAY, mask_sh)
61
62 #define UNIPHY_DCN2_REG_LIST(id) \
63 SRI(CLOCK_ENABLE, SYMCLK, id), \
64 SRI(CHANNEL_XBAR_CNTL, UNIPHY, id)
65
66 struct mpll_cfg {
67 uint32_t mpllb_ana_v2i;
68 uint32_t mpllb_ana_freq_vco;
69 uint32_t mpllb_ana_cp_int;
70 uint32_t mpllb_ana_cp_prop;
71 uint32_t mpllb_multiplier;
72 uint32_t ref_clk_mpllb_div;
73 bool mpllb_word_div2_en;
74 bool mpllb_ssc_en;
75 bool mpllb_div5_clk_en;
76 bool mpllb_div_clk_en;
77 bool mpllb_fracn_en;
78 bool mpllb_pmix_en;
79 uint32_t mpllb_div_multiplier;
80 uint32_t mpllb_tx_clk_div;
81 uint32_t mpllb_fracn_quot;
82 uint32_t mpllb_fracn_den;
83 uint32_t mpllb_ssc_peak;
84 uint32_t mpllb_ssc_stepsize;
85 uint32_t mpllb_ssc_up_spread;
86 uint32_t mpllb_fracn_rem;
87 uint32_t mpllb_hdmi_div;
88
89 uint32_t tx_vboost_lvl;
90 uint32_t hdmi_pixel_clk_div;
91 uint32_t ref_range;
92 uint32_t ref_clk;
93 bool hdmimode_enable;
94 };
95
96 struct dpcssys_phy_seq_cfg {
97 bool program_fuse;
98 bool bypass_sram;
99 bool lane_en[4];
100 bool use_calibration_setting;
101 struct mpll_cfg mpll_cfg;
102 bool load_sram_fw;
103 #if 0
104
105 bool hdmimode_enable;
106 bool silver2;
107 bool ext_refclk_en;
108 uint32_t dp_tx0_term_ctrl;
109 uint32_t dp_tx1_term_ctrl;
110 uint32_t dp_tx2_term_ctrl;
111 uint32_t dp_tx3_term_ctrl;
112 uint32_t fw_data[0x1000];
113 uint32_t dp_tx0_width;
114 uint32_t dp_tx1_width;
115 uint32_t dp_tx2_width;
116 uint32_t dp_tx3_width;
117 uint32_t dp_tx0_rate;
118 uint32_t dp_tx1_rate;
119 uint32_t dp_tx2_rate;
120 uint32_t dp_tx3_rate;
121 uint32_t dp_tx0_eq_main;
122 uint32_t dp_tx0_eq_pre;
123 uint32_t dp_tx0_eq_post;
124 uint32_t dp_tx1_eq_main;
125 uint32_t dp_tx1_eq_pre;
126 uint32_t dp_tx1_eq_post;
127 uint32_t dp_tx2_eq_main;
128 uint32_t dp_tx2_eq_pre;
129 uint32_t dp_tx2_eq_post;
130 uint32_t dp_tx3_eq_main;
131 uint32_t dp_tx3_eq_pre;
132 uint32_t dp_tx3_eq_post;
133 bool data_swap_en;
134 bool data_order_invert_en;
135 uint32_t ldpcs_fifo_start_delay;
136 uint32_t rdpcs_fifo_start_delay;
137 bool rdpcs_reg_fifo_error_mask;
138 bool rdpcs_tx_fifo_error_mask;
139 bool rdpcs_dpalt_disable_mask;
140 bool rdpcs_dpalt_4lane_mask;
141 #endif
142 };
143
144 struct dcn20_link_encoder {
145 struct dcn10_link_encoder enc10;
146 struct dpcssys_phy_seq_cfg phy_seq_cfg;
147 };
148
149 void enc2_fec_set_enable(struct link_encoder *enc, bool enable);
150 void enc2_fec_set_ready(struct link_encoder *enc, bool ready);
151 bool enc2_fec_is_active(struct link_encoder *enc);
152 void enc2_hw_init(struct link_encoder *enc);
153
154 #ifdef CONFIG_DRM_AMD_DC_DSC_SUPPORT
155 void link_enc2_read_state(struct link_encoder *enc, struct link_enc_state *s);
156 #endif
157
158 void dcn20_link_encoder_enable_dp_output(
159 struct link_encoder *enc,
160 const struct dc_link_settings *link_settings,
161 enum clock_source_id clock_source);
162
163 void dcn20_link_encoder_construct(
164 struct dcn20_link_encoder *enc20,
165 const struct encoder_init_data *init_data,
166 const struct encoder_feature_support *enc_features,
167 const struct dcn10_link_enc_registers *link_regs,
168 const struct dcn10_link_enc_aux_registers *aux_regs,
169 const struct dcn10_link_enc_hpd_registers *hpd_regs,
170 const struct dcn10_link_enc_shift *link_shift,
171 const struct dcn10_link_enc_mask *link_mask);
172
173 #endif