|
34 | 34 | #include "dc_bios_types.h"
|
35 | 35 | #include "link_enc_cfg.h"
|
36 | 36 |
|
| 37 | +#include "dc_dmub_srv.h" |
37 | 38 | #include "gpio_service_interface.h"
|
38 | 39 |
|
39 | 40 | #ifndef MIN
|
|
61 | 62 | #define AUX_REG_WRITE(reg_name, val) \
|
62 | 63 | dm_write_reg(CTX, AUX_REG(reg_name), val)
|
63 | 64 |
|
| 65 | +static uint8_t phy_id_from_transmitter(enum transmitter t) |
| 66 | +{ |
| 67 | + uint8_t phy_id; |
| 68 | + |
| 69 | + switch (t) { |
| 70 | + case TRANSMITTER_UNIPHY_A: |
| 71 | + phy_id = 0; |
| 72 | + break; |
| 73 | + case TRANSMITTER_UNIPHY_B: |
| 74 | + phy_id = 1; |
| 75 | + break; |
| 76 | + case TRANSMITTER_UNIPHY_C: |
| 77 | + phy_id = 2; |
| 78 | + break; |
| 79 | + case TRANSMITTER_UNIPHY_D: |
| 80 | + phy_id = 3; |
| 81 | + break; |
| 82 | + case TRANSMITTER_UNIPHY_E: |
| 83 | + phy_id = 4; |
| 84 | + break; |
| 85 | + case TRANSMITTER_UNIPHY_F: |
| 86 | + phy_id = 5; |
| 87 | + break; |
| 88 | + case TRANSMITTER_UNIPHY_G: |
| 89 | + phy_id = 6; |
| 90 | + break; |
| 91 | + default: |
| 92 | + phy_id = 0; |
| 93 | + break; |
| 94 | + } |
| 95 | + return phy_id; |
| 96 | +} |
64 | 97 |
|
65 | 98 | void enc32_hw_init(struct link_encoder *enc)
|
66 | 99 | {
|
@@ -117,38 +150,50 @@ void dcn32_link_encoder_enable_dp_output(
|
117 | 150 | }
|
118 | 151 | }
|
119 | 152 |
|
120 |
| -static bool dcn32_link_encoder_is_in_alt_mode(struct link_encoder *enc) |
| 153 | +static bool query_dp_alt_from_dmub(struct link_encoder *enc, |
| 154 | + union dmub_rb_cmd *cmd) |
121 | 155 | {
|
122 | 156 | struct dcn10_link_encoder *enc10 = TO_DCN10_LINK_ENC(enc);
|
123 |
| - uint32_t dp_alt_mode_disable = 0; |
124 |
| - bool is_usb_c_alt_mode = false; |
125 | 157 |
|
126 |
| - if (enc->features.flags.bits.DP_IS_USB_C) { |
127 |
| - /* if value == 1 alt mode is disabled, otherwise it is enabled */ |
128 |
| - REG_GET(RDPCSPIPE_PHY_CNTL6, RDPCS_PHY_DPALT_DISABLE, &dp_alt_mode_disable); |
129 |
| - is_usb_c_alt_mode = (dp_alt_mode_disable == 0); |
130 |
| - } |
| 158 | + memset(cmd, 0, sizeof(*cmd)); |
| 159 | + cmd->query_dp_alt.header.type = DMUB_CMD__VBIOS; |
| 160 | + cmd->query_dp_alt.header.sub_type = |
| 161 | + DMUB_CMD__VBIOS_TRANSMITTER_QUERY_DP_ALT; |
| 162 | + cmd->query_dp_alt.header.payload_bytes = sizeof(cmd->query_dp_alt.data); |
| 163 | + cmd->query_dp_alt.data.phy_id = phy_id_from_transmitter(enc10->base.transmitter); |
| 164 | + |
| 165 | + if (!dc_wake_and_execute_dmub_cmd(enc->ctx, cmd, DM_DMUB_WAIT_TYPE_WAIT_WITH_REPLY)) |
| 166 | + return false; |
131 | 167 |
|
132 |
| - return is_usb_c_alt_mode; |
| 168 | + return true; |
133 | 169 | }
|
134 | 170 |
|
135 |
| -static void dcn32_link_encoder_get_max_link_cap(struct link_encoder *enc, |
| 171 | +bool dcn32_link_encoder_is_in_alt_mode(struct link_encoder *enc) |
| 172 | +{ |
| 173 | + union dmub_rb_cmd cmd; |
| 174 | + |
| 175 | + if (!query_dp_alt_from_dmub(enc, &cmd)) |
| 176 | + return false; |
| 177 | + |
| 178 | + return (cmd.query_dp_alt.data.is_dp_alt_disable == 0); |
| 179 | +} |
| 180 | + |
| 181 | +void dcn32_link_encoder_get_max_link_cap(struct link_encoder *enc, |
136 | 182 | struct dc_link_settings *link_settings)
|
137 | 183 | {
|
138 |
| - struct dcn10_link_encoder *enc10 = TO_DCN10_LINK_ENC(enc); |
139 |
| - uint32_t is_in_usb_c_dp4_mode = 0; |
| 184 | + union dmub_rb_cmd cmd; |
140 | 185 |
|
141 | 186 | dcn10_link_encoder_get_max_link_cap(enc, link_settings);
|
142 | 187 |
|
143 |
| - /* in usb c dp2 mode, max lane count is 2 */ |
144 |
| - if (enc->funcs->is_in_alt_mode && enc->funcs->is_in_alt_mode(enc)) { |
145 |
| - REG_GET(RDPCSPIPE_PHY_CNTL6, RDPCS_PHY_DPALT_DP4, &is_in_usb_c_dp4_mode); |
146 |
| - if (!is_in_usb_c_dp4_mode) |
147 |
| - link_settings->lane_count = MIN(LANE_COUNT_TWO, link_settings->lane_count); |
148 |
| - } |
| 188 | + if (!query_dp_alt_from_dmub(enc, &cmd)) |
| 189 | + return; |
149 | 190 |
|
| 191 | + if (cmd.query_dp_alt.data.is_usb && |
| 192 | + cmd.query_dp_alt.data.is_dp4 == 0) |
| 193 | + link_settings->lane_count = MIN(LANE_COUNT_TWO, link_settings->lane_count); |
150 | 194 | }
|
151 | 195 |
|
| 196 | + |
152 | 197 | static const struct link_encoder_funcs dcn32_link_enc_funcs = {
|
153 | 198 | .read_state = link_enc2_read_state,
|
154 | 199 | .validate_output_with_stream =
|
@@ -203,13 +248,15 @@ void dcn32_link_encoder_construct(
|
203 | 248 | enc10->base.hpd_source = init_data->hpd_source;
|
204 | 249 | enc10->base.connector = init_data->connector;
|
205 | 250 |
|
206 |
| - |
207 | 251 | enc10->base.preferred_engine = ENGINE_ID_UNKNOWN;
|
208 | 252 |
|
209 | 253 | enc10->base.features = *enc_features;
|
210 | 254 | if (enc10->base.connector.id == CONNECTOR_ID_USBC)
|
211 | 255 | enc10->base.features.flags.bits.DP_IS_USB_C = 1;
|
212 | 256 |
|
| 257 | + if (enc10->base.connector.id == CONNECTOR_ID_USBC) |
| 258 | + enc10->base.features.flags.bits.DP_IS_USB_C = 1; |
| 259 | + |
213 | 260 | enc10->base.transmitter = init_data->transmitter;
|
214 | 261 |
|
215 | 262 | /* set the flag to indicate whether driver poll the I2C data pin
|
|
0 commit comments