Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

Merge tag 'drm-intel-next-2021-07-08' of git://anongit.freedesktop.org/drm/drm-intel into drm-next

drm/i915 changes for v5.15:

Features:
- Enable pipe DMC loading on XE-LPD and ADL-P (Anusha)
- Finally remove JSH and EHL force probe requirement (Tejas)

Refactoring and cleanups:
- Refactor and fix DDI buffer translations (Ville)
- Clean up FBC CFB allocation code (Ville, with a fix from Matthew)
- Finish INTEL_GEN() and friends macro conversions (Lucas)
- Misc display cleanups (Ville)

Fixes:
- PSR fixes and ADL-P workarounds (José)
- Fix drm infoframe state mismatch (Bhanuprakash)
- Force Type-C PHY disconnect during suspend/shutdown (Imre)
- Fix power sequence violation on some Chromebook models (Shawn)
- Fix VGA workaround to avoid screen flicker at boot (Emil)
- Fix display 12+ watermark workaround adjustment (Lucas)

Misc:
- Backmerge drm-next (Jani)

Signed-off-by: Dave Airlie <airlied@redhat.com>

From: Jani Nikula <jani.nikula@intel.com>
Link: https://patchwork.freedesktop.org/patch/msgid/878s2h6t5o.fsf@intel.com

+2348 -1725
+44 -2
drivers/gpu/drm/i915/display/icl_dsi.c
··· 729 729 { 730 730 struct drm_i915_private *dev_priv = to_i915(encoder->base.dev); 731 731 struct intel_dsi *intel_dsi = enc_to_intel_dsi(encoder); 732 - struct intel_crtc *intel_crtc = to_intel_crtc(pipe_config->uapi.crtc); 733 - enum pipe pipe = intel_crtc->pipe; 732 + struct intel_crtc *crtc = to_intel_crtc(pipe_config->uapi.crtc); 733 + enum pipe pipe = crtc->pipe; 734 734 u32 tmp; 735 735 enum port port; 736 736 enum transcoder dsi_trans; ··· 1253 1253 gen11_dsi_set_transcoder_timings(encoder, pipe_config); 1254 1254 } 1255 1255 1256 + /* 1257 + * Wa_1409054076:icl,jsl,ehl 1258 + * When pipe A is disabled and MIPI DSI is enabled on pipe B, 1259 + * the AMT KVMR feature will incorrectly see pipe A as enabled. 1260 + * Set 0x42080 bit 23=1 before enabling DSI on pipe B and leave 1261 + * it set while DSI is enabled on pipe B 1262 + */ 1263 + static void icl_apply_kvmr_pipe_a_wa(struct intel_encoder *encoder, 1264 + enum pipe pipe, bool enable) 1265 + { 1266 + struct drm_i915_private *dev_priv = to_i915(encoder->base.dev); 1267 + 1268 + if (DISPLAY_VER(dev_priv) == 11 && pipe == PIPE_B) 1269 + intel_de_rmw(dev_priv, CHICKEN_PAR1_1, 1270 + IGNORE_KVMR_PIPE_A, 1271 + enable ? IGNORE_KVMR_PIPE_A : 0); 1272 + } 1256 1273 static void gen11_dsi_enable(struct intel_atomic_state *state, 1257 1274 struct intel_encoder *encoder, 1258 1275 const struct intel_crtc_state *crtc_state, 1259 1276 const struct drm_connector_state *conn_state) 1260 1277 { 1261 1278 struct intel_dsi *intel_dsi = enc_to_intel_dsi(encoder); 1279 + struct intel_crtc *crtc = to_intel_crtc(conn_state->crtc); 1262 1280 1263 1281 drm_WARN_ON(state->base.dev, crtc_state->has_pch_encoder); 1282 + 1283 + /* Wa_1409054076:icl,jsl,ehl */ 1284 + icl_apply_kvmr_pipe_a_wa(encoder, crtc->pipe, true); 1264 1285 1265 1286 /* step6d: enable dsi transcoder */ 1266 1287 gen11_dsi_enable_transcoder(encoder); ··· 1436 1415 const struct drm_connector_state *old_conn_state) 1437 1416 { 1438 1417 struct intel_dsi *intel_dsi = enc_to_intel_dsi(encoder); 1418 + struct intel_crtc *crtc = to_intel_crtc(old_conn_state->crtc); 1439 1419 1440 1420 /* step1: turn off backlight */ 1441 1421 intel_dsi_vbt_exec_sequence(intel_dsi, MIPI_SEQ_BACKLIGHT_OFF); ··· 1444 1422 1445 1423 /* step2d,e: disable transcoder and wait */ 1446 1424 gen11_dsi_disable_transcoder(encoder); 1425 + 1426 + /* Wa_1409054076:icl,jsl,ehl */ 1427 + icl_apply_kvmr_pipe_a_wa(encoder, crtc->pipe, false); 1447 1428 1448 1429 /* step2f,g: powerdown panel */ 1449 1430 gen11_dsi_powerdown_panel(encoder); ··· 1571 1546 1572 1547 if (gen11_dsi_is_periodic_cmd_mode(intel_dsi)) 1573 1548 pipe_config->mode_flags |= I915_MODE_FLAG_DSI_PERIODIC_CMD_MODE; 1549 + } 1550 + 1551 + static void gen11_dsi_sync_state(struct intel_encoder *encoder, 1552 + const struct intel_crtc_state *crtc_state) 1553 + { 1554 + struct drm_i915_private *dev_priv = to_i915(encoder->base.dev); 1555 + struct intel_crtc *intel_crtc = to_intel_crtc(crtc_state->uapi.crtc); 1556 + enum pipe pipe = intel_crtc->pipe; 1557 + 1558 + /* wa verify 1409054076:icl,jsl,ehl */ 1559 + if (DISPLAY_VER(dev_priv) == 11 && pipe == PIPE_B && 1560 + !(intel_de_read(dev_priv, CHICKEN_PAR1_1) & IGNORE_KVMR_PIPE_A)) 1561 + drm_dbg_kms(&dev_priv->drm, 1562 + "[ENCODER:%d:%s] BIOS left IGNORE_KVMR_PIPE_A cleared with pipe B enabled\n", 1563 + encoder->base.base.id, 1564 + encoder->base.name); 1574 1565 } 1575 1566 1576 1567 static int gen11_dsi_dsc_compute_config(struct intel_encoder *encoder, ··· 2007 1966 encoder->post_disable = gen11_dsi_post_disable; 2008 1967 encoder->port = port; 2009 1968 encoder->get_config = gen11_dsi_get_config; 1969 + encoder->sync_state = gen11_dsi_sync_state; 2010 1970 encoder->update_pipe = intel_panel_update_backlight; 2011 1971 encoder->compute_config = gen11_dsi_compute_config; 2012 1972 encoder->get_hw_state = gen11_dsi_get_hw_state;
+3
drivers/gpu/drm/i915/display/intel_crt.c
··· 38 38 #include "intel_crt.h" 39 39 #include "intel_crtc.h" 40 40 #include "intel_ddi.h" 41 + #include "intel_ddi_buf_trans.h" 41 42 #include "intel_de.h" 42 43 #include "intel_display_types.h" 43 44 #include "intel_fdi.h" ··· 1082 1081 crt->base.enable_clock = hsw_ddi_enable_clock; 1083 1082 crt->base.disable_clock = hsw_ddi_disable_clock; 1084 1083 crt->base.is_clock_enabled = hsw_ddi_is_clock_enabled; 1084 + 1085 + intel_ddi_buf_trans_init(&crt->base); 1085 1086 } else { 1086 1087 if (HAS_PCH_SPLIT(dev_priv)) { 1087 1088 crt->base.compute_config = pch_crt_compute_config;
+4 -4
drivers/gpu/drm/i915/display/intel_crtc.c
··· 163 163 kfree(crtc); 164 164 } 165 165 166 - static void intel_crtc_destroy(struct drm_crtc *crtc) 166 + static void intel_crtc_destroy(struct drm_crtc *_crtc) 167 167 { 168 - struct intel_crtc *intel_crtc = to_intel_crtc(crtc); 168 + struct intel_crtc *crtc = to_intel_crtc(_crtc); 169 169 170 - drm_crtc_cleanup(crtc); 171 - kfree(intel_crtc); 170 + drm_crtc_cleanup(&crtc->base); 171 + kfree(crtc); 172 172 } 173 173 174 174 static int intel_crtc_late_register(struct drm_crtc *crtc)
+94 -114
drivers/gpu/drm/i915/display/intel_ddi.c
··· 95 95 * values in advance. This function programs the correct values for 96 96 * DP/eDP/FDI use cases. 97 97 */ 98 - void intel_prepare_dp_ddi_buffers(struct intel_encoder *encoder, 99 - const struct intel_crtc_state *crtc_state) 98 + void hsw_prepare_dp_ddi_buffers(struct intel_encoder *encoder, 99 + const struct intel_crtc_state *crtc_state) 100 100 { 101 101 struct drm_i915_private *dev_priv = to_i915(encoder->base.dev); 102 102 u32 iboost_bit = 0; 103 103 int i, n_entries; 104 104 enum port port = encoder->port; 105 - const struct ddi_buf_trans *ddi_translations; 105 + const struct intel_ddi_buf_trans *ddi_translations; 106 106 107 - if (intel_crtc_has_type(crtc_state, INTEL_OUTPUT_ANALOG)) 108 - ddi_translations = intel_ddi_get_buf_trans_fdi(dev_priv, 109 - &n_entries); 110 - else if (intel_crtc_has_type(crtc_state, INTEL_OUTPUT_EDP)) 111 - ddi_translations = intel_ddi_get_buf_trans_edp(encoder, 112 - &n_entries); 113 - else 114 - ddi_translations = intel_ddi_get_buf_trans_dp(encoder, 115 - &n_entries); 107 + ddi_translations = encoder->get_buf_trans(encoder, crtc_state, &n_entries); 108 + if (drm_WARN_ON_ONCE(&dev_priv->drm, !ddi_translations)) 109 + return; 116 110 117 111 /* If we're boosting the current, set bit 31 of trans1 */ 118 112 if (DISPLAY_VER(dev_priv) == 9 && !IS_BROXTON(dev_priv) && ··· 115 121 116 122 for (i = 0; i < n_entries; i++) { 117 123 intel_de_write(dev_priv, DDI_BUF_TRANS_LO(port, i), 118 - ddi_translations[i].trans1 | iboost_bit); 124 + ddi_translations->entries[i].hsw.trans1 | iboost_bit); 119 125 intel_de_write(dev_priv, DDI_BUF_TRANS_HI(port, i), 120 - ddi_translations[i].trans2); 126 + ddi_translations->entries[i].hsw.trans2); 121 127 } 122 128 } 123 129 ··· 126 132 * values in advance. This function programs the correct values for 127 133 * HDMI/DVI use cases. 128 134 */ 129 - static void intel_prepare_hdmi_ddi_buffers(struct intel_encoder *encoder, 130 - int level) 135 + static void hsw_prepare_hdmi_ddi_buffers(struct intel_encoder *encoder, 136 + const struct intel_crtc_state *crtc_state, 137 + int level) 131 138 { 132 139 struct drm_i915_private *dev_priv = to_i915(encoder->base.dev); 133 140 u32 iboost_bit = 0; 134 141 int n_entries; 135 142 enum port port = encoder->port; 136 - const struct ddi_buf_trans *ddi_translations; 143 + const struct intel_ddi_buf_trans *ddi_translations; 137 144 138 - ddi_translations = intel_ddi_get_buf_trans_hdmi(encoder, &n_entries); 139 - 145 + ddi_translations = encoder->get_buf_trans(encoder, crtc_state, &n_entries); 140 146 if (drm_WARN_ON_ONCE(&dev_priv->drm, !ddi_translations)) 141 147 return; 142 148 if (drm_WARN_ON_ONCE(&dev_priv->drm, level >= n_entries)) ··· 149 155 150 156 /* Entry 9 is for HDMI: */ 151 157 intel_de_write(dev_priv, DDI_BUF_TRANS_LO(port, 9), 152 - ddi_translations[level].trans1 | iboost_bit); 158 + ddi_translations->entries[level].hsw.trans1 | iboost_bit); 153 159 intel_de_write(dev_priv, DDI_BUF_TRANS_HI(port, 9), 154 - ddi_translations[level].trans2); 160 + ddi_translations->entries[level].hsw.trans2); 155 161 } 156 162 157 163 void intel_wait_ddi_buf_idle(struct drm_i915_private *dev_priv, ··· 942 948 iboost = intel_bios_encoder_dp_boost_level(encoder->devdata); 943 949 944 950 if (iboost == 0) { 945 - const struct ddi_buf_trans *ddi_translations; 951 + const struct intel_ddi_buf_trans *ddi_translations; 946 952 int n_entries; 947 953 948 - if (intel_crtc_has_type(crtc_state, INTEL_OUTPUT_HDMI)) 949 - ddi_translations = intel_ddi_get_buf_trans_hdmi(encoder, &n_entries); 950 - else if (intel_crtc_has_type(crtc_state, INTEL_OUTPUT_EDP)) 951 - ddi_translations = intel_ddi_get_buf_trans_edp(encoder, &n_entries); 952 - else 953 - ddi_translations = intel_ddi_get_buf_trans_dp(encoder, &n_entries); 954 - 954 + ddi_translations = encoder->get_buf_trans(encoder, crtc_state, &n_entries); 955 955 if (drm_WARN_ON_ONCE(&dev_priv->drm, !ddi_translations)) 956 956 return; 957 957 if (drm_WARN_ON_ONCE(&dev_priv->drm, level >= n_entries)) 958 958 level = n_entries - 1; 959 959 960 - iboost = ddi_translations[level].i_boost; 960 + iboost = ddi_translations->entries[level].hsw.i_boost; 961 961 } 962 962 963 963 /* Make sure that the requested I_boost is valid */ ··· 971 983 int level) 972 984 { 973 985 struct drm_i915_private *dev_priv = to_i915(encoder->base.dev); 974 - const struct bxt_ddi_buf_trans *ddi_translations; 986 + const struct intel_ddi_buf_trans *ddi_translations; 975 987 enum port port = encoder->port; 976 988 int n_entries; 977 989 978 - ddi_translations = bxt_get_buf_trans(encoder, crtc_state, &n_entries); 990 + ddi_translations = encoder->get_buf_trans(encoder, crtc_state, &n_entries); 979 991 if (drm_WARN_ON_ONCE(&dev_priv->drm, !ddi_translations)) 980 992 return; 981 993 if (drm_WARN_ON_ONCE(&dev_priv->drm, level >= n_entries)) 982 994 level = n_entries - 1; 983 995 984 996 bxt_ddi_phy_set_signal_level(dev_priv, port, 985 - ddi_translations[level].margin, 986 - ddi_translations[level].scale, 987 - ddi_translations[level].enable, 988 - ddi_translations[level].deemphasis); 997 + ddi_translations->entries[level].bxt.margin, 998 + ddi_translations->entries[level].bxt.scale, 999 + ddi_translations->entries[level].bxt.enable, 1000 + ddi_translations->entries[level].bxt.deemphasis); 989 1001 } 990 1002 991 1003 static u8 intel_ddi_dp_voltage_max(struct intel_dp *intel_dp, ··· 993 1005 { 994 1006 struct intel_encoder *encoder = &dp_to_dig_port(intel_dp)->base; 995 1007 struct drm_i915_private *dev_priv = to_i915(encoder->base.dev); 996 - enum port port = encoder->port; 997 - enum phy phy = intel_port_to_phy(dev_priv, port); 998 1008 int n_entries; 999 1009 1000 - if (DISPLAY_VER(dev_priv) >= 12) { 1001 - if (intel_phy_is_combo(dev_priv, phy)) 1002 - tgl_get_combo_buf_trans(encoder, crtc_state, &n_entries); 1003 - else if (IS_ALDERLAKE_P(dev_priv)) 1004 - adlp_get_dkl_buf_trans(encoder, crtc_state, &n_entries); 1005 - else 1006 - tgl_get_dkl_buf_trans(encoder, crtc_state, &n_entries); 1007 - } else if (DISPLAY_VER(dev_priv) == 11) { 1008 - if (IS_PLATFORM(dev_priv, INTEL_JASPERLAKE)) 1009 - jsl_get_combo_buf_trans(encoder, crtc_state, &n_entries); 1010 - else if (IS_PLATFORM(dev_priv, INTEL_ELKHARTLAKE)) 1011 - ehl_get_combo_buf_trans(encoder, crtc_state, &n_entries); 1012 - else if (intel_phy_is_combo(dev_priv, phy)) 1013 - icl_get_combo_buf_trans(encoder, crtc_state, &n_entries); 1014 - else 1015 - icl_get_mg_buf_trans(encoder, crtc_state, &n_entries); 1016 - } else if (IS_CANNONLAKE(dev_priv)) { 1017 - cnl_get_buf_trans(encoder, crtc_state, &n_entries); 1018 - } else if (IS_GEMINILAKE(dev_priv) || IS_BROXTON(dev_priv)) { 1019 - bxt_get_buf_trans(encoder, crtc_state, &n_entries); 1020 - } else { 1021 - if (intel_crtc_has_type(crtc_state, INTEL_OUTPUT_EDP)) 1022 - intel_ddi_get_buf_trans_edp(encoder, &n_entries); 1023 - else 1024 - intel_ddi_get_buf_trans_dp(encoder, &n_entries); 1025 - } 1010 + encoder->get_buf_trans(encoder, crtc_state, &n_entries); 1026 1011 1027 1012 if (drm_WARN_ON(&dev_priv->drm, n_entries < 1)) 1028 1013 n_entries = 1; ··· 1022 1061 int level) 1023 1062 { 1024 1063 struct drm_i915_private *dev_priv = to_i915(encoder->base.dev); 1025 - const struct cnl_ddi_buf_trans *ddi_translations; 1064 + const struct intel_ddi_buf_trans *ddi_translations; 1026 1065 enum port port = encoder->port; 1027 1066 int n_entries, ln; 1028 1067 u32 val; 1029 1068 1030 - ddi_translations = cnl_get_buf_trans(encoder, crtc_state, &n_entries); 1031 - 1069 + ddi_translations = encoder->get_buf_trans(encoder, crtc_state, &n_entries); 1032 1070 if (drm_WARN_ON_ONCE(&dev_priv->drm, !ddi_translations)) 1033 1071 return; 1034 1072 if (drm_WARN_ON_ONCE(&dev_priv->drm, level >= n_entries)) ··· 1043 1083 val = intel_de_read(dev_priv, CNL_PORT_TX_DW2_LN0(port)); 1044 1084 val &= ~(SWING_SEL_LOWER_MASK | SWING_SEL_UPPER_MASK | 1045 1085 RCOMP_SCALAR_MASK); 1046 - val |= SWING_SEL_UPPER(ddi_translations[level].dw2_swing_sel); 1047 - val |= SWING_SEL_LOWER(ddi_translations[level].dw2_swing_sel); 1086 + val |= SWING_SEL_UPPER(ddi_translations->entries[level].cnl.dw2_swing_sel); 1087 + val |= SWING_SEL_LOWER(ddi_translations->entries[level].cnl.dw2_swing_sel); 1048 1088 /* Rcomp scalar is fixed as 0x98 for every table entry */ 1049 1089 val |= RCOMP_SCALAR(0x98); 1050 1090 intel_de_write(dev_priv, CNL_PORT_TX_DW2_GRP(port), val); ··· 1055 1095 val = intel_de_read(dev_priv, CNL_PORT_TX_DW4_LN(ln, port)); 1056 1096 val &= ~(POST_CURSOR_1_MASK | POST_CURSOR_2_MASK | 1057 1097 CURSOR_COEFF_MASK); 1058 - val |= POST_CURSOR_1(ddi_translations[level].dw4_post_cursor_1); 1059 - val |= POST_CURSOR_2(ddi_translations[level].dw4_post_cursor_2); 1060 - val |= CURSOR_COEFF(ddi_translations[level].dw4_cursor_coeff); 1098 + val |= POST_CURSOR_1(ddi_translations->entries[level].cnl.dw4_post_cursor_1); 1099 + val |= POST_CURSOR_2(ddi_translations->entries[level].cnl.dw4_post_cursor_2); 1100 + val |= CURSOR_COEFF(ddi_translations->entries[level].cnl.dw4_cursor_coeff); 1061 1101 intel_de_write(dev_priv, CNL_PORT_TX_DW4_LN(ln, port), val); 1062 1102 } 1063 1103 ··· 1072 1112 /* Program PORT_TX_DW7 */ 1073 1113 val = intel_de_read(dev_priv, CNL_PORT_TX_DW7_LN0(port)); 1074 1114 val &= ~N_SCALAR_MASK; 1075 - val |= N_SCALAR(ddi_translations[level].dw7_n_scalar); 1115 + val |= N_SCALAR(ddi_translations->entries[level].cnl.dw7_n_scalar); 1076 1116 intel_de_write(dev_priv, CNL_PORT_TX_DW7_GRP(port), val); 1077 1117 } 1078 1118 ··· 1142 1182 int level) 1143 1183 { 1144 1184 struct drm_i915_private *dev_priv = to_i915(encoder->base.dev); 1145 - const struct cnl_ddi_buf_trans *ddi_translations; 1185 + const struct intel_ddi_buf_trans *ddi_translations; 1146 1186 enum phy phy = intel_port_to_phy(dev_priv, encoder->port); 1147 1187 int n_entries, ln; 1148 1188 u32 val; 1149 1189 1150 - if (DISPLAY_VER(dev_priv) >= 12) 1151 - ddi_translations = tgl_get_combo_buf_trans(encoder, crtc_state, &n_entries); 1152 - else if (IS_PLATFORM(dev_priv, INTEL_JASPERLAKE)) 1153 - ddi_translations = jsl_get_combo_buf_trans(encoder, crtc_state, &n_entries); 1154 - else if (IS_PLATFORM(dev_priv, INTEL_ELKHARTLAKE)) 1155 - ddi_translations = ehl_get_combo_buf_trans(encoder, crtc_state, &n_entries); 1156 - else 1157 - ddi_translations = icl_get_combo_buf_trans(encoder, crtc_state, &n_entries); 1158 - 1190 + ddi_translations = encoder->get_buf_trans(encoder, crtc_state, &n_entries); 1159 1191 if (drm_WARN_ON_ONCE(&dev_priv->drm, !ddi_translations)) 1160 1192 return; 1161 1193 if (drm_WARN_ON_ONCE(&dev_priv->drm, level >= n_entries)) ··· 1175 1223 val = intel_de_read(dev_priv, ICL_PORT_TX_DW2_LN0(phy)); 1176 1224 val &= ~(SWING_SEL_LOWER_MASK | SWING_SEL_UPPER_MASK | 1177 1225 RCOMP_SCALAR_MASK); 1178 - val |= SWING_SEL_UPPER(ddi_translations[level].dw2_swing_sel); 1179 - val |= SWING_SEL_LOWER(ddi_translations[level].dw2_swing_sel); 1226 + val |= SWING_SEL_UPPER(ddi_translations->entries[level].cnl.dw2_swing_sel); 1227 + val |= SWING_SEL_LOWER(ddi_translations->entries[level].cnl.dw2_swing_sel); 1180 1228 /* Program Rcomp scalar for every table entry */ 1181 1229 val |= RCOMP_SCALAR(0x98); 1182 1230 intel_de_write(dev_priv, ICL_PORT_TX_DW2_GRP(phy), val); ··· 1187 1235 val = intel_de_read(dev_priv, ICL_PORT_TX_DW4_LN(ln, phy)); 1188 1236 val &= ~(POST_CURSOR_1_MASK | POST_CURSOR_2_MASK | 1189 1237 CURSOR_COEFF_MASK); 1190 - val |= POST_CURSOR_1(ddi_translations[level].dw4_post_cursor_1); 1191 - val |= POST_CURSOR_2(ddi_translations[level].dw4_post_cursor_2); 1192 - val |= CURSOR_COEFF(ddi_translations[level].dw4_cursor_coeff); 1238 + val |= POST_CURSOR_1(ddi_translations->entries[level].cnl.dw4_post_cursor_1); 1239 + val |= POST_CURSOR_2(ddi_translations->entries[level].cnl.dw4_post_cursor_2); 1240 + val |= CURSOR_COEFF(ddi_translations->entries[level].cnl.dw4_cursor_coeff); 1193 1241 intel_de_write(dev_priv, ICL_PORT_TX_DW4_LN(ln, phy), val); 1194 1242 } 1195 1243 1196 1244 /* Program PORT_TX_DW7 */ 1197 1245 val = intel_de_read(dev_priv, ICL_PORT_TX_DW7_LN0(phy)); 1198 1246 val &= ~N_SCALAR_MASK; 1199 - val |= N_SCALAR(ddi_translations[level].dw7_n_scalar); 1247 + val |= N_SCALAR(ddi_translations->entries[level].cnl.dw7_n_scalar); 1200 1248 intel_de_write(dev_priv, ICL_PORT_TX_DW7_GRP(phy), val); 1201 1249 } 1202 1250 ··· 1267 1315 { 1268 1316 struct drm_i915_private *dev_priv = to_i915(encoder->base.dev); 1269 1317 enum tc_port tc_port = intel_port_to_tc(dev_priv, encoder->port); 1270 - const struct icl_mg_phy_ddi_buf_trans *ddi_translations; 1318 + const struct intel_ddi_buf_trans *ddi_translations; 1271 1319 int n_entries, ln; 1272 1320 u32 val; 1273 1321 1274 1322 if (enc_to_dig_port(encoder)->tc_mode == TC_PORT_TBT_ALT) 1275 1323 return; 1276 1324 1277 - ddi_translations = icl_get_mg_buf_trans(encoder, crtc_state, &n_entries); 1278 - 1325 + ddi_translations = encoder->get_buf_trans(encoder, crtc_state, &n_entries); 1279 1326 if (drm_WARN_ON_ONCE(&dev_priv->drm, !ddi_translations)) 1280 1327 return; 1281 1328 if (drm_WARN_ON_ONCE(&dev_priv->drm, level >= n_entries)) ··· 1296 1345 val = intel_de_read(dev_priv, MG_TX1_SWINGCTRL(ln, tc_port)); 1297 1346 val &= ~CRI_TXDEEMPH_OVERRIDE_17_12_MASK; 1298 1347 val |= CRI_TXDEEMPH_OVERRIDE_17_12( 1299 - ddi_translations[level].cri_txdeemph_override_17_12); 1348 + ddi_translations->entries[level].mg.cri_txdeemph_override_17_12); 1300 1349 intel_de_write(dev_priv, MG_TX1_SWINGCTRL(ln, tc_port), val); 1301 1350 1302 1351 val = intel_de_read(dev_priv, MG_TX2_SWINGCTRL(ln, tc_port)); 1303 1352 val &= ~CRI_TXDEEMPH_OVERRIDE_17_12_MASK; 1304 1353 val |= CRI_TXDEEMPH_OVERRIDE_17_12( 1305 - ddi_translations[level].cri_txdeemph_override_17_12); 1354 + ddi_translations->entries[level].mg.cri_txdeemph_override_17_12); 1306 1355 intel_de_write(dev_priv, MG_TX2_SWINGCTRL(ln, tc_port), val); 1307 1356 } 1308 1357 ··· 1312 1361 val &= ~(CRI_TXDEEMPH_OVERRIDE_11_6_MASK | 1313 1362 CRI_TXDEEMPH_OVERRIDE_5_0_MASK); 1314 1363 val |= CRI_TXDEEMPH_OVERRIDE_5_0( 1315 - ddi_translations[level].cri_txdeemph_override_5_0) | 1364 + ddi_translations->entries[level].mg.cri_txdeemph_override_5_0) | 1316 1365 CRI_TXDEEMPH_OVERRIDE_11_6( 1317 - ddi_translations[level].cri_txdeemph_override_11_6) | 1366 + ddi_translations->entries[level].mg.cri_txdeemph_override_11_6) | 1318 1367 CRI_TXDEEMPH_OVERRIDE_EN; 1319 1368 intel_de_write(dev_priv, MG_TX1_DRVCTRL(ln, tc_port), val); 1320 1369 ··· 1322 1371 val &= ~(CRI_TXDEEMPH_OVERRIDE_11_6_MASK | 1323 1372 CRI_TXDEEMPH_OVERRIDE_5_0_MASK); 1324 1373 val |= CRI_TXDEEMPH_OVERRIDE_5_0( 1325 - ddi_translations[level].cri_txdeemph_override_5_0) | 1374 + ddi_translations->entries[level].mg.cri_txdeemph_override_5_0) | 1326 1375 CRI_TXDEEMPH_OVERRIDE_11_6( 1327 - ddi_translations[level].cri_txdeemph_override_11_6) | 1376 + ddi_translations->entries[level].mg.cri_txdeemph_override_11_6) | 1328 1377 CRI_TXDEEMPH_OVERRIDE_EN; 1329 1378 intel_de_write(dev_priv, MG_TX2_DRVCTRL(ln, tc_port), val); 1330 1379 ··· 1404 1453 { 1405 1454 struct drm_i915_private *dev_priv = to_i915(encoder->base.dev); 1406 1455 enum tc_port tc_port = intel_port_to_tc(dev_priv, encoder->port); 1407 - const struct tgl_dkl_phy_ddi_buf_trans *ddi_translations; 1456 + const struct intel_ddi_buf_trans *ddi_translations; 1408 1457 u32 val, dpcnt_mask, dpcnt_val; 1409 1458 int n_entries, ln; 1410 1459 1411 1460 if (enc_to_dig_port(encoder)->tc_mode == TC_PORT_TBT_ALT) 1412 1461 return; 1413 1462 1414 - if (IS_ALDERLAKE_P(dev_priv)) 1415 - ddi_translations = adlp_get_dkl_buf_trans(encoder, crtc_state, &n_entries); 1416 - else 1417 - ddi_translations = tgl_get_dkl_buf_trans(encoder, crtc_state, &n_entries); 1418 - 1463 + ddi_translations = encoder->get_buf_trans(encoder, crtc_state, &n_entries); 1419 1464 if (drm_WARN_ON_ONCE(&dev_priv->drm, !ddi_translations)) 1420 1465 return; 1421 1466 if (drm_WARN_ON_ONCE(&dev_priv->drm, level >= n_entries)) ··· 1420 1473 dpcnt_mask = (DKL_TX_PRESHOOT_COEFF_MASK | 1421 1474 DKL_TX_DE_EMPAHSIS_COEFF_MASK | 1422 1475 DKL_TX_VSWING_CONTROL_MASK); 1423 - dpcnt_val = DKL_TX_VSWING_CONTROL(ddi_translations[level].dkl_vswing_control); 1424 - dpcnt_val |= DKL_TX_DE_EMPHASIS_COEFF(ddi_translations[level].dkl_de_emphasis_control); 1425 - dpcnt_val |= DKL_TX_PRESHOOT_COEFF(ddi_translations[level].dkl_preshoot_control); 1476 + dpcnt_val = DKL_TX_VSWING_CONTROL(ddi_translations->entries[level].dkl.dkl_vswing_control); 1477 + dpcnt_val |= DKL_TX_DE_EMPHASIS_COEFF(ddi_translations->entries[level].dkl.dkl_de_emphasis_control); 1478 + dpcnt_val |= DKL_TX_PRESHOOT_COEFF(ddi_translations->entries[level].dkl.dkl_preshoot_control); 1426 1479 1427 1480 for (ln = 0; ln < 2; ln++) { 1428 1481 intel_de_write(dev_priv, HIP_INDEX_REG(tc_port), ··· 2662 2715 else if (IS_GEMINILAKE(dev_priv) || IS_BROXTON(dev_priv)) 2663 2716 bxt_ddi_vswing_sequence(encoder, crtc_state, level); 2664 2717 else 2665 - intel_prepare_dp_ddi_buffers(encoder, crtc_state); 2718 + hsw_prepare_dp_ddi_buffers(encoder, crtc_state); 2666 2719 2667 2720 intel_ddi_power_up_lanes(encoder, crtc_state); 2668 2721 ··· 2770 2823 conn_state); 2771 2824 2772 2825 /* FIXME precompute everything properly */ 2826 + /* FIXME how do we turn infoframes off again? */ 2773 2827 if (dig_port->lspcon.active && dig_port->dp.has_hdmi_sink) 2774 2828 dig_port->set_infoframes(encoder, 2775 2829 crtc_state->has_infoframe, ··· 3110 3162 else if (IS_GEMINILAKE(dev_priv) || IS_BROXTON(dev_priv)) 3111 3163 bxt_ddi_vswing_sequence(encoder, crtc_state, level); 3112 3164 else 3113 - intel_prepare_hdmi_ddi_buffers(encoder, level); 3165 + hsw_prepare_hdmi_ddi_buffers(encoder, crtc_state, level); 3114 3166 3115 3167 if (DISPLAY_VER(dev_priv) == 9 && !IS_BROXTON(dev_priv)) 3116 3168 skl_ddi_set_iboost(encoder, crtc_state, level); ··· 3538 3590 struct intel_crtc_state *pipe_config) 3539 3591 { 3540 3592 struct drm_i915_private *dev_priv = to_i915(encoder->base.dev); 3541 - struct intel_crtc *intel_crtc = to_intel_crtc(pipe_config->uapi.crtc); 3593 + struct intel_crtc *crtc = to_intel_crtc(pipe_config->uapi.crtc); 3542 3594 enum transcoder cpu_transcoder = pipe_config->cpu_transcoder; 3543 3595 struct intel_digital_port *dig_port = enc_to_dig_port(encoder); 3544 3596 u32 temp, flags = 0; ··· 3601 3653 pipe_config->output_types |= BIT(INTEL_OUTPUT_DP); 3602 3654 pipe_config->lane_count = 3603 3655 ((temp & DDI_PORT_WIDTH_MASK) >> DDI_PORT_WIDTH_SHIFT) + 1; 3604 - intel_dp_get_m_n(intel_crtc, pipe_config); 3656 + intel_dp_get_m_n(crtc, pipe_config); 3605 3657 3606 3658 if (DISPLAY_VER(dev_priv) >= 11) { 3607 3659 i915_reg_t dp_tp_ctl = dp_tp_ctl_reg(encoder, pipe_config); ··· 3631 3683 pipe_config->mst_master_transcoder = 3632 3684 REG_FIELD_GET(TRANS_DDI_MST_TRANSPORT_SELECT_MASK, temp); 3633 3685 3634 - intel_dp_get_m_n(intel_crtc, pipe_config); 3686 + intel_dp_get_m_n(crtc, pipe_config); 3635 3687 3636 3688 pipe_config->infoframes.enable |= 3637 3689 intel_hdmi_infoframes_enabled(encoder, pipe_config); ··· 4457 4509 return false; 4458 4510 } 4459 4511 4512 + static void intel_ddi_encoder_suspend(struct intel_encoder *encoder) 4513 + { 4514 + struct intel_dp *intel_dp = enc_to_intel_dp(encoder); 4515 + struct drm_i915_private *i915 = dp_to_i915(intel_dp); 4516 + struct intel_digital_port *dig_port = dp_to_dig_port(intel_dp); 4517 + enum phy phy = intel_port_to_phy(i915, encoder->port); 4518 + 4519 + intel_dp_encoder_suspend(encoder); 4520 + 4521 + if (!intel_phy_is_tc(i915, phy)) 4522 + return; 4523 + 4524 + intel_tc_port_disconnect_phy(dig_port); 4525 + } 4526 + 4527 + static void intel_ddi_encoder_shutdown(struct intel_encoder *encoder) 4528 + { 4529 + struct intel_dp *intel_dp = enc_to_intel_dp(encoder); 4530 + struct drm_i915_private *i915 = dp_to_i915(intel_dp); 4531 + struct intel_digital_port *dig_port = dp_to_dig_port(intel_dp); 4532 + enum phy phy = intel_port_to_phy(i915, encoder->port); 4533 + 4534 + intel_dp_encoder_shutdown(encoder); 4535 + 4536 + if (!intel_phy_is_tc(i915, phy)) 4537 + return; 4538 + 4539 + intel_tc_port_disconnect_phy(dig_port); 4540 + } 4541 + 4460 4542 #define port_tc_name(port) ((port) - PORT_TC1 + '1') 4461 4543 #define tc_port_name(tc_port) ((tc_port) - TC_PORT_1 + '1') 4462 4544 ··· 4596 4618 encoder->get_hw_state = intel_ddi_get_hw_state; 4597 4619 encoder->sync_state = intel_ddi_sync_state; 4598 4620 encoder->initial_fastset_check = intel_ddi_initial_fastset_check; 4599 - encoder->suspend = intel_dp_encoder_suspend; 4600 - encoder->shutdown = intel_dp_encoder_shutdown; 4621 + encoder->suspend = intel_ddi_encoder_suspend; 4622 + encoder->shutdown = intel_ddi_encoder_shutdown; 4601 4623 encoder->get_power_domains = intel_ddi_get_power_domains; 4602 4624 4603 4625 encoder->type = INTEL_OUTPUT_DDI; ··· 4664 4686 encoder->is_clock_enabled = hsw_ddi_is_clock_enabled; 4665 4687 encoder->get_config = hsw_ddi_get_config; 4666 4688 } 4689 + 4690 + intel_ddi_buf_trans_init(encoder); 4667 4691 4668 4692 if (DISPLAY_VER(dev_priv) >= 13) 4669 4693 encoder->hpd_pin = xelpd_hpd_pin(dev_priv, port);
+2 -2
drivers/gpu/drm/i915/display/intel_ddi.h
··· 40 40 void hsw_ddi_get_config(struct intel_encoder *encoder, 41 41 struct intel_crtc_state *crtc_state); 42 42 struct intel_shared_dpll *icl_ddi_combo_get_pll(struct intel_encoder *encoder); 43 - void intel_prepare_dp_ddi_buffers(struct intel_encoder *encoder, 44 - const struct intel_crtc_state *crtc_state); 43 + void hsw_prepare_dp_ddi_buffers(struct intel_encoder *encoder, 44 + const struct intel_crtc_state *crtc_state); 45 45 void intel_wait_ddi_buf_idle(struct drm_i915_private *dev_priv, 46 46 enum port port); 47 47 void intel_ddi_init(struct drm_i915_private *dev_priv, enum port port);
+1342 -1005
drivers/gpu/drm/i915/display/intel_ddi_buf_trans.c
··· 13 13 * them for both DP and FDI transports, allowing those ports to 14 14 * automatically adapt to HDMI connections as well 15 15 */ 16 - static const struct ddi_buf_trans hsw_ddi_translations_dp[] = { 17 - { 0x00FFFFFF, 0x0006000E, 0x0 }, 18 - { 0x00D75FFF, 0x0005000A, 0x0 }, 19 - { 0x00C30FFF, 0x00040006, 0x0 }, 20 - { 0x80AAAFFF, 0x000B0000, 0x0 }, 21 - { 0x00FFFFFF, 0x0005000A, 0x0 }, 22 - { 0x00D75FFF, 0x000C0004, 0x0 }, 23 - { 0x80C30FFF, 0x000B0000, 0x0 }, 24 - { 0x00FFFFFF, 0x00040006, 0x0 }, 25 - { 0x80D75FFF, 0x000B0000, 0x0 }, 16 + static const union intel_ddi_buf_trans_entry _hsw_ddi_translations_dp[] = { 17 + { .hsw = { 0x00FFFFFF, 0x0006000E, 0x0 } }, 18 + { .hsw = { 0x00D75FFF, 0x0005000A, 0x0 } }, 19 + { .hsw = { 0x00C30FFF, 0x00040006, 0x0 } }, 20 + { .hsw = { 0x80AAAFFF, 0x000B0000, 0x0 } }, 21 + { .hsw = { 0x00FFFFFF, 0x0005000A, 0x0 } }, 22 + { .hsw = { 0x00D75FFF, 0x000C0004, 0x0 } }, 23 + { .hsw = { 0x80C30FFF, 0x000B0000, 0x0 } }, 24 + { .hsw = { 0x00FFFFFF, 0x00040006, 0x0 } }, 25 + { .hsw = { 0x80D75FFF, 0x000B0000, 0x0 } }, 26 26 }; 27 27 28 - static const struct ddi_buf_trans hsw_ddi_translations_fdi[] = { 29 - { 0x00FFFFFF, 0x0007000E, 0x0 }, 30 - { 0x00D75FFF, 0x000F000A, 0x0 }, 31 - { 0x00C30FFF, 0x00060006, 0x0 }, 32 - { 0x00AAAFFF, 0x001E0000, 0x0 }, 33 - { 0x00FFFFFF, 0x000F000A, 0x0 }, 34 - { 0x00D75FFF, 0x00160004, 0x0 }, 35 - { 0x00C30FFF, 0x001E0000, 0x0 }, 36 - { 0x00FFFFFF, 0x00060006, 0x0 }, 37 - { 0x00D75FFF, 0x001E0000, 0x0 }, 28 + static const struct intel_ddi_buf_trans hsw_ddi_translations_dp = { 29 + .entries = _hsw_ddi_translations_dp, 30 + .num_entries = ARRAY_SIZE(_hsw_ddi_translations_dp), 38 31 }; 39 32 40 - static const struct ddi_buf_trans hsw_ddi_translations_hdmi[] = { 41 - /* Idx NT mV d T mV d db */ 42 - { 0x00FFFFFF, 0x0006000E, 0x0 },/* 0: 400 400 0 */ 43 - { 0x00E79FFF, 0x000E000C, 0x0 },/* 1: 400 500 2 */ 44 - { 0x00D75FFF, 0x0005000A, 0x0 },/* 2: 400 600 3.5 */ 45 - { 0x00FFFFFF, 0x0005000A, 0x0 },/* 3: 600 600 0 */ 46 - { 0x00E79FFF, 0x001D0007, 0x0 },/* 4: 600 750 2 */ 47 - { 0x00D75FFF, 0x000C0004, 0x0 },/* 5: 600 900 3.5 */ 48 - { 0x00FFFFFF, 0x00040006, 0x0 },/* 6: 800 800 0 */ 49 - { 0x80E79FFF, 0x00030002, 0x0 },/* 7: 800 1000 2 */ 50 - { 0x00FFFFFF, 0x00140005, 0x0 },/* 8: 850 850 0 */ 51 - { 0x00FFFFFF, 0x000C0004, 0x0 },/* 9: 900 900 0 */ 52 - { 0x00FFFFFF, 0x001C0003, 0x0 },/* 10: 950 950 0 */ 53 - { 0x80FFFFFF, 0x00030002, 0x0 },/* 11: 1000 1000 0 */ 33 + static const union intel_ddi_buf_trans_entry _hsw_ddi_translations_fdi[] = { 34 + { .hsw = { 0x00FFFFFF, 0x0007000E, 0x0 } }, 35 + { .hsw = { 0x00D75FFF, 0x000F000A, 0x0 } }, 36 + { .hsw = { 0x00C30FFF, 0x00060006, 0x0 } }, 37 + { .hsw = { 0x00AAAFFF, 0x001E0000, 0x0 } }, 38 + { .hsw = { 0x00FFFFFF, 0x000F000A, 0x0 } }, 39 + { .hsw = { 0x00D75FFF, 0x00160004, 0x0 } }, 40 + { .hsw = { 0x00C30FFF, 0x001E0000, 0x0 } }, 41 + { .hsw = { 0x00FFFFFF, 0x00060006, 0x0 } }, 42 + { .hsw = { 0x00D75FFF, 0x001E0000, 0x0 } }, 54 43 }; 55 44 56 - static const struct ddi_buf_trans bdw_ddi_translations_edp[] = { 57 - { 0x00FFFFFF, 0x00000012, 0x0 }, 58 - { 0x00EBAFFF, 0x00020011, 0x0 }, 59 - { 0x00C71FFF, 0x0006000F, 0x0 }, 60 - { 0x00AAAFFF, 0x000E000A, 0x0 }, 61 - { 0x00FFFFFF, 0x00020011, 0x0 }, 62 - { 0x00DB6FFF, 0x0005000F, 0x0 }, 63 - { 0x00BEEFFF, 0x000A000C, 0x0 }, 64 - { 0x00FFFFFF, 0x0005000F, 0x0 }, 65 - { 0x00DB6FFF, 0x000A000C, 0x0 }, 45 + static const struct intel_ddi_buf_trans hsw_ddi_translations_fdi = { 46 + .entries = _hsw_ddi_translations_fdi, 47 + .num_entries = ARRAY_SIZE(_hsw_ddi_translations_fdi), 66 48 }; 67 49 68 - static const struct ddi_buf_trans bdw_ddi_translations_dp[] = { 69 - { 0x00FFFFFF, 0x0007000E, 0x0 }, 70 - { 0x00D75FFF, 0x000E000A, 0x0 }, 71 - { 0x00BEFFFF, 0x00140006, 0x0 }, 72 - { 0x80B2CFFF, 0x001B0002, 0x0 }, 73 - { 0x00FFFFFF, 0x000E000A, 0x0 }, 74 - { 0x00DB6FFF, 0x00160005, 0x0 }, 75 - { 0x80C71FFF, 0x001A0002, 0x0 }, 76 - { 0x00F7DFFF, 0x00180004, 0x0 }, 77 - { 0x80D75FFF, 0x001B0002, 0x0 }, 50 + static const union intel_ddi_buf_trans_entry _hsw_ddi_translations_hdmi[] = { 51 + /* Idx NT mV d T mV d db */ 52 + { .hsw = { 0x00FFFFFF, 0x0006000E, 0x0 } }, /* 0: 400 400 0 */ 53 + { .hsw = { 0x00E79FFF, 0x000E000C, 0x0 } }, /* 1: 400 500 2 */ 54 + { .hsw = { 0x00D75FFF, 0x0005000A, 0x0 } }, /* 2: 400 600 3.5 */ 55 + { .hsw = { 0x00FFFFFF, 0x0005000A, 0x0 } }, /* 3: 600 600 0 */ 56 + { .hsw = { 0x00E79FFF, 0x001D0007, 0x0 } }, /* 4: 600 750 2 */ 57 + { .hsw = { 0x00D75FFF, 0x000C0004, 0x0 } }, /* 5: 600 900 3.5 */ 58 + { .hsw = { 0x00FFFFFF, 0x00040006, 0x0 } }, /* 6: 800 800 0 */ 59 + { .hsw = { 0x80E79FFF, 0x00030002, 0x0 } }, /* 7: 800 1000 2 */ 60 + { .hsw = { 0x00FFFFFF, 0x00140005, 0x0 } }, /* 8: 850 850 0 */ 61 + { .hsw = { 0x00FFFFFF, 0x000C0004, 0x0 } }, /* 9: 900 900 0 */ 62 + { .hsw = { 0x00FFFFFF, 0x001C0003, 0x0 } }, /* 10: 950 950 0 */ 63 + { .hsw = { 0x80FFFFFF, 0x00030002, 0x0 } }, /* 11: 1000 1000 0 */ 78 64 }; 79 65 80 - static const struct ddi_buf_trans bdw_ddi_translations_fdi[] = { 81 - { 0x00FFFFFF, 0x0001000E, 0x0 }, 82 - { 0x00D75FFF, 0x0004000A, 0x0 }, 83 - { 0x00C30FFF, 0x00070006, 0x0 }, 84 - { 0x00AAAFFF, 0x000C0000, 0x0 }, 85 - { 0x00FFFFFF, 0x0004000A, 0x0 }, 86 - { 0x00D75FFF, 0x00090004, 0x0 }, 87 - { 0x00C30FFF, 0x000C0000, 0x0 }, 88 - { 0x00FFFFFF, 0x00070006, 0x0 }, 89 - { 0x00D75FFF, 0x000C0000, 0x0 }, 66 + static const struct intel_ddi_buf_trans hsw_ddi_translations_hdmi = { 67 + .entries = _hsw_ddi_translations_hdmi, 68 + .num_entries = ARRAY_SIZE(_hsw_ddi_translations_hdmi), 69 + .hdmi_default_entry = 6, 90 70 }; 91 71 92 - static const struct ddi_buf_trans bdw_ddi_translations_hdmi[] = { 93 - /* Idx NT mV d T mV df db */ 94 - { 0x00FFFFFF, 0x0007000E, 0x0 },/* 0: 400 400 0 */ 95 - { 0x00D75FFF, 0x000E000A, 0x0 },/* 1: 400 600 3.5 */ 96 - { 0x00BEFFFF, 0x00140006, 0x0 },/* 2: 400 800 6 */ 97 - { 0x00FFFFFF, 0x0009000D, 0x0 },/* 3: 450 450 0 */ 98 - { 0x00FFFFFF, 0x000E000A, 0x0 },/* 4: 600 600 0 */ 99 - { 0x00D7FFFF, 0x00140006, 0x0 },/* 5: 600 800 2.5 */ 100 - { 0x80CB2FFF, 0x001B0002, 0x0 },/* 6: 600 1000 4.5 */ 101 - { 0x00FFFFFF, 0x00140006, 0x0 },/* 7: 800 800 0 */ 102 - { 0x80E79FFF, 0x001B0002, 0x0 },/* 8: 800 1000 2 */ 103 - { 0x80FFFFFF, 0x001B0002, 0x0 },/* 9: 1000 1000 0 */ 72 + static const union intel_ddi_buf_trans_entry _bdw_ddi_translations_edp[] = { 73 + { .hsw = { 0x00FFFFFF, 0x00000012, 0x0 } }, 74 + { .hsw = { 0x00EBAFFF, 0x00020011, 0x0 } }, 75 + { .hsw = { 0x00C71FFF, 0x0006000F, 0x0 } }, 76 + { .hsw = { 0x00AAAFFF, 0x000E000A, 0x0 } }, 77 + { .hsw = { 0x00FFFFFF, 0x00020011, 0x0 } }, 78 + { .hsw = { 0x00DB6FFF, 0x0005000F, 0x0 } }, 79 + { .hsw = { 0x00BEEFFF, 0x000A000C, 0x0 } }, 80 + { .hsw = { 0x00FFFFFF, 0x0005000F, 0x0 } }, 81 + { .hsw = { 0x00DB6FFF, 0x000A000C, 0x0 } }, 82 + }; 83 + 84 + static const struct intel_ddi_buf_trans bdw_ddi_translations_edp = { 85 + .entries = _bdw_ddi_translations_edp, 86 + .num_entries = ARRAY_SIZE(_bdw_ddi_translations_edp), 87 + }; 88 + 89 + static const union intel_ddi_buf_trans_entry _bdw_ddi_translations_dp[] = { 90 + { .hsw = { 0x00FFFFFF, 0x0007000E, 0x0 } }, 91 + { .hsw = { 0x00D75FFF, 0x000E000A, 0x0 } }, 92 + { .hsw = { 0x00BEFFFF, 0x00140006, 0x0 } }, 93 + { .hsw = { 0x80B2CFFF, 0x001B0002, 0x0 } }, 94 + { .hsw = { 0x00FFFFFF, 0x000E000A, 0x0 } }, 95 + { .hsw = { 0x00DB6FFF, 0x00160005, 0x0 } }, 96 + { .hsw = { 0x80C71FFF, 0x001A0002, 0x0 } }, 97 + { .hsw = { 0x00F7DFFF, 0x00180004, 0x0 } }, 98 + { .hsw = { 0x80D75FFF, 0x001B0002, 0x0 } }, 99 + }; 100 + 101 + static const struct intel_ddi_buf_trans bdw_ddi_translations_dp = { 102 + .entries = _bdw_ddi_translations_dp, 103 + .num_entries = ARRAY_SIZE(_bdw_ddi_translations_dp), 104 + }; 105 + 106 + static const union intel_ddi_buf_trans_entry _bdw_ddi_translations_fdi[] = { 107 + { .hsw = { 0x00FFFFFF, 0x0001000E, 0x0 } }, 108 + { .hsw = { 0x00D75FFF, 0x0004000A, 0x0 } }, 109 + { .hsw = { 0x00C30FFF, 0x00070006, 0x0 } }, 110 + { .hsw = { 0x00AAAFFF, 0x000C0000, 0x0 } }, 111 + { .hsw = { 0x00FFFFFF, 0x0004000A, 0x0 } }, 112 + { .hsw = { 0x00D75FFF, 0x00090004, 0x0 } }, 113 + { .hsw = { 0x00C30FFF, 0x000C0000, 0x0 } }, 114 + { .hsw = { 0x00FFFFFF, 0x00070006, 0x0 } }, 115 + { .hsw = { 0x00D75FFF, 0x000C0000, 0x0 } }, 116 + }; 117 + 118 + static const struct intel_ddi_buf_trans bdw_ddi_translations_fdi = { 119 + .entries = _bdw_ddi_translations_fdi, 120 + .num_entries = ARRAY_SIZE(_bdw_ddi_translations_fdi), 121 + }; 122 + 123 + static const union intel_ddi_buf_trans_entry _bdw_ddi_translations_hdmi[] = { 124 + /* Idx NT mV d T mV df db */ 125 + { .hsw = { 0x00FFFFFF, 0x0007000E, 0x0 } }, /* 0: 400 400 0 */ 126 + { .hsw = { 0x00D75FFF, 0x000E000A, 0x0 } }, /* 1: 400 600 3.5 */ 127 + { .hsw = { 0x00BEFFFF, 0x00140006, 0x0 } }, /* 2: 400 800 6 */ 128 + { .hsw = { 0x00FFFFFF, 0x0009000D, 0x0 } }, /* 3: 450 450 0 */ 129 + { .hsw = { 0x00FFFFFF, 0x000E000A, 0x0 } }, /* 4: 600 600 0 */ 130 + { .hsw = { 0x00D7FFFF, 0x00140006, 0x0 } }, /* 5: 600 800 2.5 */ 131 + { .hsw = { 0x80CB2FFF, 0x001B0002, 0x0 } }, /* 6: 600 1000 4.5 */ 132 + { .hsw = { 0x00FFFFFF, 0x00140006, 0x0 } }, /* 7: 800 800 0 */ 133 + { .hsw = { 0x80E79FFF, 0x001B0002, 0x0 } }, /* 8: 800 1000 2 */ 134 + { .hsw = { 0x80FFFFFF, 0x001B0002, 0x0 } }, /* 9: 1000 1000 0 */ 135 + }; 136 + 137 + static const struct intel_ddi_buf_trans bdw_ddi_translations_hdmi = { 138 + .entries = _bdw_ddi_translations_hdmi, 139 + .num_entries = ARRAY_SIZE(_bdw_ddi_translations_hdmi), 140 + .hdmi_default_entry = 7, 104 141 }; 105 142 106 143 /* Skylake H and S */ 107 - static const struct ddi_buf_trans skl_ddi_translations_dp[] = { 108 - { 0x00002016, 0x000000A0, 0x0 }, 109 - { 0x00005012, 0x0000009B, 0x0 }, 110 - { 0x00007011, 0x00000088, 0x0 }, 111 - { 0x80009010, 0x000000C0, 0x1 }, 112 - { 0x00002016, 0x0000009B, 0x0 }, 113 - { 0x00005012, 0x00000088, 0x0 }, 114 - { 0x80007011, 0x000000C0, 0x1 }, 115 - { 0x00002016, 0x000000DF, 0x0 }, 116 - { 0x80005012, 0x000000C0, 0x1 }, 144 + static const union intel_ddi_buf_trans_entry _skl_ddi_translations_dp[] = { 145 + { .hsw = { 0x00002016, 0x000000A0, 0x0 } }, 146 + { .hsw = { 0x00005012, 0x0000009B, 0x0 } }, 147 + { .hsw = { 0x00007011, 0x00000088, 0x0 } }, 148 + { .hsw = { 0x80009010, 0x000000C0, 0x1 } }, 149 + { .hsw = { 0x00002016, 0x0000009B, 0x0 } }, 150 + { .hsw = { 0x00005012, 0x00000088, 0x0 } }, 151 + { .hsw = { 0x80007011, 0x000000C0, 0x1 } }, 152 + { .hsw = { 0x00002016, 0x000000DF, 0x0 } }, 153 + { .hsw = { 0x80005012, 0x000000C0, 0x1 } }, 154 + }; 155 + 156 + static const struct intel_ddi_buf_trans skl_ddi_translations_dp = { 157 + .entries = _skl_ddi_translations_dp, 158 + .num_entries = ARRAY_SIZE(_skl_ddi_translations_dp), 117 159 }; 118 160 119 161 /* Skylake U */ 120 - static const struct ddi_buf_trans skl_u_ddi_translations_dp[] = { 121 - { 0x0000201B, 0x000000A2, 0x0 }, 122 - { 0x00005012, 0x00000088, 0x0 }, 123 - { 0x80007011, 0x000000CD, 0x1 }, 124 - { 0x80009010, 0x000000C0, 0x1 }, 125 - { 0x0000201B, 0x0000009D, 0x0 }, 126 - { 0x80005012, 0x000000C0, 0x1 }, 127 - { 0x80007011, 0x000000C0, 0x1 }, 128 - { 0x00002016, 0x00000088, 0x0 }, 129 - { 0x80005012, 0x000000C0, 0x1 }, 162 + static const union intel_ddi_buf_trans_entry _skl_u_ddi_translations_dp[] = { 163 + { .hsw = { 0x0000201B, 0x000000A2, 0x0 } }, 164 + { .hsw = { 0x00005012, 0x00000088, 0x0 } }, 165 + { .hsw = { 0x80007011, 0x000000CD, 0x1 } }, 166 + { .hsw = { 0x80009010, 0x000000C0, 0x1 } }, 167 + { .hsw = { 0x0000201B, 0x0000009D, 0x0 } }, 168 + { .hsw = { 0x80005012, 0x000000C0, 0x1 } }, 169 + { .hsw = { 0x80007011, 0x000000C0, 0x1 } }, 170 + { .hsw = { 0x00002016, 0x00000088, 0x0 } }, 171 + { .hsw = { 0x80005012, 0x000000C0, 0x1 } }, 172 + }; 173 + 174 + static const struct intel_ddi_buf_trans skl_u_ddi_translations_dp = { 175 + .entries = _skl_u_ddi_translations_dp, 176 + .num_entries = ARRAY_SIZE(_skl_u_ddi_translations_dp), 130 177 }; 131 178 132 179 /* Skylake Y */ 133 - static const struct ddi_buf_trans skl_y_ddi_translations_dp[] = { 134 - { 0x00000018, 0x000000A2, 0x0 }, 135 - { 0x00005012, 0x00000088, 0x0 }, 136 - { 0x80007011, 0x000000CD, 0x3 }, 137 - { 0x80009010, 0x000000C0, 0x3 }, 138 - { 0x00000018, 0x0000009D, 0x0 }, 139 - { 0x80005012, 0x000000C0, 0x3 }, 140 - { 0x80007011, 0x000000C0, 0x3 }, 141 - { 0x00000018, 0x00000088, 0x0 }, 142 - { 0x80005012, 0x000000C0, 0x3 }, 180 + static const union intel_ddi_buf_trans_entry _skl_y_ddi_translations_dp[] = { 181 + { .hsw = { 0x00000018, 0x000000A2, 0x0 } }, 182 + { .hsw = { 0x00005012, 0x00000088, 0x0 } }, 183 + { .hsw = { 0x80007011, 0x000000CD, 0x3 } }, 184 + { .hsw = { 0x80009010, 0x000000C0, 0x3 } }, 185 + { .hsw = { 0x00000018, 0x0000009D, 0x0 } }, 186 + { .hsw = { 0x80005012, 0x000000C0, 0x3 } }, 187 + { .hsw = { 0x80007011, 0x000000C0, 0x3 } }, 188 + { .hsw = { 0x00000018, 0x00000088, 0x0 } }, 189 + { .hsw = { 0x80005012, 0x000000C0, 0x3 } }, 190 + }; 191 + 192 + static const struct intel_ddi_buf_trans skl_y_ddi_translations_dp = { 193 + .entries = _skl_y_ddi_translations_dp, 194 + .num_entries = ARRAY_SIZE(_skl_y_ddi_translations_dp), 143 195 }; 144 196 145 197 /* Kabylake H and S */ 146 - static const struct ddi_buf_trans kbl_ddi_translations_dp[] = { 147 - { 0x00002016, 0x000000A0, 0x0 }, 148 - { 0x00005012, 0x0000009B, 0x0 }, 149 - { 0x00007011, 0x00000088, 0x0 }, 150 - { 0x80009010, 0x000000C0, 0x1 }, 151 - { 0x00002016, 0x0000009B, 0x0 }, 152 - { 0x00005012, 0x00000088, 0x0 }, 153 - { 0x80007011, 0x000000C0, 0x1 }, 154 - { 0x00002016, 0x00000097, 0x0 }, 155 - { 0x80005012, 0x000000C0, 0x1 }, 198 + static const union intel_ddi_buf_trans_entry _kbl_ddi_translations_dp[] = { 199 + { .hsw = { 0x00002016, 0x000000A0, 0x0 } }, 200 + { .hsw = { 0x00005012, 0x0000009B, 0x0 } }, 201 + { .hsw = { 0x00007011, 0x00000088, 0x0 } }, 202 + { .hsw = { 0x80009010, 0x000000C0, 0x1 } }, 203 + { .hsw = { 0x00002016, 0x0000009B, 0x0 } }, 204 + { .hsw = { 0x00005012, 0x00000088, 0x0 } }, 205 + { .hsw = { 0x80007011, 0x000000C0, 0x1 } }, 206 + { .hsw = { 0x00002016, 0x00000097, 0x0 } }, 207 + { .hsw = { 0x80005012, 0x000000C0, 0x1 } }, 208 + }; 209 + 210 + static const struct intel_ddi_buf_trans kbl_ddi_translations_dp = { 211 + .entries = _kbl_ddi_translations_dp, 212 + .num_entries = ARRAY_SIZE(_kbl_ddi_translations_dp), 156 213 }; 157 214 158 215 /* Kabylake U */ 159 - static const struct ddi_buf_trans kbl_u_ddi_translations_dp[] = { 160 - { 0x0000201B, 0x000000A1, 0x0 }, 161 - { 0x00005012, 0x00000088, 0x0 }, 162 - { 0x80007011, 0x000000CD, 0x3 }, 163 - { 0x80009010, 0x000000C0, 0x3 }, 164 - { 0x0000201B, 0x0000009D, 0x0 }, 165 - { 0x80005012, 0x000000C0, 0x3 }, 166 - { 0x80007011, 0x000000C0, 0x3 }, 167 - { 0x00002016, 0x0000004F, 0x0 }, 168 - { 0x80005012, 0x000000C0, 0x3 }, 216 + static const union intel_ddi_buf_trans_entry _kbl_u_ddi_translations_dp[] = { 217 + { .hsw = { 0x0000201B, 0x000000A1, 0x0 } }, 218 + { .hsw = { 0x00005012, 0x00000088, 0x0 } }, 219 + { .hsw = { 0x80007011, 0x000000CD, 0x3 } }, 220 + { .hsw = { 0x80009010, 0x000000C0, 0x3 } }, 221 + { .hsw = { 0x0000201B, 0x0000009D, 0x0 } }, 222 + { .hsw = { 0x80005012, 0x000000C0, 0x3 } }, 223 + { .hsw = { 0x80007011, 0x000000C0, 0x3 } }, 224 + { .hsw = { 0x00002016, 0x0000004F, 0x0 } }, 225 + { .hsw = { 0x80005012, 0x000000C0, 0x3 } }, 226 + }; 227 + 228 + static const struct intel_ddi_buf_trans kbl_u_ddi_translations_dp = { 229 + .entries = _kbl_u_ddi_translations_dp, 230 + .num_entries = ARRAY_SIZE(_kbl_u_ddi_translations_dp), 169 231 }; 170 232 171 233 /* Kabylake Y */ 172 - static const struct ddi_buf_trans kbl_y_ddi_translations_dp[] = { 173 - { 0x00001017, 0x000000A1, 0x0 }, 174 - { 0x00005012, 0x00000088, 0x0 }, 175 - { 0x80007011, 0x000000CD, 0x3 }, 176 - { 0x8000800F, 0x000000C0, 0x3 }, 177 - { 0x00001017, 0x0000009D, 0x0 }, 178 - { 0x80005012, 0x000000C0, 0x3 }, 179 - { 0x80007011, 0x000000C0, 0x3 }, 180 - { 0x00001017, 0x0000004C, 0x0 }, 181 - { 0x80005012, 0x000000C0, 0x3 }, 234 + static const union intel_ddi_buf_trans_entry _kbl_y_ddi_translations_dp[] = { 235 + { .hsw = { 0x00001017, 0x000000A1, 0x0 } }, 236 + { .hsw = { 0x00005012, 0x00000088, 0x0 } }, 237 + { .hsw = { 0x80007011, 0x000000CD, 0x3 } }, 238 + { .hsw = { 0x8000800F, 0x000000C0, 0x3 } }, 239 + { .hsw = { 0x00001017, 0x0000009D, 0x0 } }, 240 + { .hsw = { 0x80005012, 0x000000C0, 0x3 } }, 241 + { .hsw = { 0x80007011, 0x000000C0, 0x3 } }, 242 + { .hsw = { 0x00001017, 0x0000004C, 0x0 } }, 243 + { .hsw = { 0x80005012, 0x000000C0, 0x3 } }, 244 + }; 245 + 246 + static const struct intel_ddi_buf_trans kbl_y_ddi_translations_dp = { 247 + .entries = _kbl_y_ddi_translations_dp, 248 + .num_entries = ARRAY_SIZE(_kbl_y_ddi_translations_dp), 182 249 }; 183 250 184 251 /* 185 252 * Skylake/Kabylake H and S 186 253 * eDP 1.4 low vswing translation parameters 187 254 */ 188 - static const struct ddi_buf_trans skl_ddi_translations_edp[] = { 189 - { 0x00000018, 0x000000A8, 0x0 }, 190 - { 0x00004013, 0x000000A9, 0x0 }, 191 - { 0x00007011, 0x000000A2, 0x0 }, 192 - { 0x00009010, 0x0000009C, 0x0 }, 193 - { 0x00000018, 0x000000A9, 0x0 }, 194 - { 0x00006013, 0x000000A2, 0x0 }, 195 - { 0x00007011, 0x000000A6, 0x0 }, 196 - { 0x00000018, 0x000000AB, 0x0 }, 197 - { 0x00007013, 0x0000009F, 0x0 }, 198 - { 0x00000018, 0x000000DF, 0x0 }, 255 + static const union intel_ddi_buf_trans_entry _skl_ddi_translations_edp[] = { 256 + { .hsw = { 0x00000018, 0x000000A8, 0x0 } }, 257 + { .hsw = { 0x00004013, 0x000000A9, 0x0 } }, 258 + { .hsw = { 0x00007011, 0x000000A2, 0x0 } }, 259 + { .hsw = { 0x00009010, 0x0000009C, 0x0 } }, 260 + { .hsw = { 0x00000018, 0x000000A9, 0x0 } }, 261 + { .hsw = { 0x00006013, 0x000000A2, 0x0 } }, 262 + { .hsw = { 0x00007011, 0x000000A6, 0x0 } }, 263 + { .hsw = { 0x00000018, 0x000000AB, 0x0 } }, 264 + { .hsw = { 0x00007013, 0x0000009F, 0x0 } }, 265 + { .hsw = { 0x00000018, 0x000000DF, 0x0 } }, 266 + }; 267 + 268 + static const struct intel_ddi_buf_trans skl_ddi_translations_edp = { 269 + .entries = _skl_ddi_translations_edp, 270 + .num_entries = ARRAY_SIZE(_skl_ddi_translations_edp), 199 271 }; 200 272 201 273 /* 202 274 * Skylake/Kabylake U 203 275 * eDP 1.4 low vswing translation parameters 204 276 */ 205 - static const struct ddi_buf_trans skl_u_ddi_translations_edp[] = { 206 - { 0x00000018, 0x000000A8, 0x0 }, 207 - { 0x00004013, 0x000000A9, 0x0 }, 208 - { 0x00007011, 0x000000A2, 0x0 }, 209 - { 0x00009010, 0x0000009C, 0x0 }, 210 - { 0x00000018, 0x000000A9, 0x0 }, 211 - { 0x00006013, 0x000000A2, 0x0 }, 212 - { 0x00007011, 0x000000A6, 0x0 }, 213 - { 0x00002016, 0x000000AB, 0x0 }, 214 - { 0x00005013, 0x0000009F, 0x0 }, 215 - { 0x00000018, 0x000000DF, 0x0 }, 277 + static const union intel_ddi_buf_trans_entry _skl_u_ddi_translations_edp[] = { 278 + { .hsw = { 0x00000018, 0x000000A8, 0x0 } }, 279 + { .hsw = { 0x00004013, 0x000000A9, 0x0 } }, 280 + { .hsw = { 0x00007011, 0x000000A2, 0x0 } }, 281 + { .hsw = { 0x00009010, 0x0000009C, 0x0 } }, 282 + { .hsw = { 0x00000018, 0x000000A9, 0x0 } }, 283 + { .hsw = { 0x00006013, 0x000000A2, 0x0 } }, 284 + { .hsw = { 0x00007011, 0x000000A6, 0x0 } }, 285 + { .hsw = { 0x00002016, 0x000000AB, 0x0 } }, 286 + { .hsw = { 0x00005013, 0x0000009F, 0x0 } }, 287 + { .hsw = { 0x00000018, 0x000000DF, 0x0 } }, 288 + }; 289 + 290 + static const struct intel_ddi_buf_trans skl_u_ddi_translations_edp = { 291 + .entries = _skl_u_ddi_translations_edp, 292 + .num_entries = ARRAY_SIZE(_skl_u_ddi_translations_edp), 216 293 }; 217 294 218 295 /* 219 296 * Skylake/Kabylake Y 220 297 * eDP 1.4 low vswing translation parameters 221 298 */ 222 - static const struct ddi_buf_trans skl_y_ddi_translations_edp[] = { 223 - { 0x00000018, 0x000000A8, 0x0 }, 224 - { 0x00004013, 0x000000AB, 0x0 }, 225 - { 0x00007011, 0x000000A4, 0x0 }, 226 - { 0x00009010, 0x000000DF, 0x0 }, 227 - { 0x00000018, 0x000000AA, 0x0 }, 228 - { 0x00006013, 0x000000A4, 0x0 }, 229 - { 0x00007011, 0x0000009D, 0x0 }, 230 - { 0x00000018, 0x000000A0, 0x0 }, 231 - { 0x00006012, 0x000000DF, 0x0 }, 232 - { 0x00000018, 0x0000008A, 0x0 }, 299 + static const union intel_ddi_buf_trans_entry _skl_y_ddi_translations_edp[] = { 300 + { .hsw = { 0x00000018, 0x000000A8, 0x0 } }, 301 + { .hsw = { 0x00004013, 0x000000AB, 0x0 } }, 302 + { .hsw = { 0x00007011, 0x000000A4, 0x0 } }, 303 + { .hsw = { 0x00009010, 0x000000DF, 0x0 } }, 304 + { .hsw = { 0x00000018, 0x000000AA, 0x0 } }, 305 + { .hsw = { 0x00006013, 0x000000A4, 0x0 } }, 306 + { .hsw = { 0x00007011, 0x0000009D, 0x0 } }, 307 + { .hsw = { 0x00000018, 0x000000A0, 0x0 } }, 308 + { .hsw = { 0x00006012, 0x000000DF, 0x0 } }, 309 + { .hsw = { 0x00000018, 0x0000008A, 0x0 } }, 310 + }; 311 + 312 + static const struct intel_ddi_buf_trans skl_y_ddi_translations_edp = { 313 + .entries = _skl_y_ddi_translations_edp, 314 + .num_entries = ARRAY_SIZE(_skl_y_ddi_translations_edp), 233 315 }; 234 316 235 317 /* Skylake/Kabylake U, H and S */ 236 - static const struct ddi_buf_trans skl_ddi_translations_hdmi[] = { 237 - { 0x00000018, 0x000000AC, 0x0 }, 238 - { 0x00005012, 0x0000009D, 0x0 }, 239 - { 0x00007011, 0x00000088, 0x0 }, 240 - { 0x00000018, 0x000000A1, 0x0 }, 241 - { 0x00000018, 0x00000098, 0x0 }, 242 - { 0x00004013, 0x00000088, 0x0 }, 243 - { 0x80006012, 0x000000CD, 0x1 }, 244 - { 0x00000018, 0x000000DF, 0x0 }, 245 - { 0x80003015, 0x000000CD, 0x1 }, /* Default */ 246 - { 0x80003015, 0x000000C0, 0x1 }, 247 - { 0x80000018, 0x000000C0, 0x1 }, 318 + static const union intel_ddi_buf_trans_entry _skl_ddi_translations_hdmi[] = { 319 + { .hsw = { 0x00000018, 0x000000AC, 0x0 } }, 320 + { .hsw = { 0x00005012, 0x0000009D, 0x0 } }, 321 + { .hsw = { 0x00007011, 0x00000088, 0x0 } }, 322 + { .hsw = { 0x00000018, 0x000000A1, 0x0 } }, 323 + { .hsw = { 0x00000018, 0x00000098, 0x0 } }, 324 + { .hsw = { 0x00004013, 0x00000088, 0x0 } }, 325 + { .hsw = { 0x80006012, 0x000000CD, 0x1 } }, 326 + { .hsw = { 0x00000018, 0x000000DF, 0x0 } }, 327 + { .hsw = { 0x80003015, 0x000000CD, 0x1 } }, /* Default */ 328 + { .hsw = { 0x80003015, 0x000000C0, 0x1 } }, 329 + { .hsw = { 0x80000018, 0x000000C0, 0x1 } }, 330 + }; 331 + 332 + static const struct intel_ddi_buf_trans skl_ddi_translations_hdmi = { 333 + .entries = _skl_ddi_translations_hdmi, 334 + .num_entries = ARRAY_SIZE(_skl_ddi_translations_hdmi), 335 + .hdmi_default_entry = 8, 248 336 }; 249 337 250 338 /* Skylake/Kabylake Y */ 251 - static const struct ddi_buf_trans skl_y_ddi_translations_hdmi[] = { 252 - { 0x00000018, 0x000000A1, 0x0 }, 253 - { 0x00005012, 0x000000DF, 0x0 }, 254 - { 0x80007011, 0x000000CB, 0x3 }, 255 - { 0x00000018, 0x000000A4, 0x0 }, 256 - { 0x00000018, 0x0000009D, 0x0 }, 257 - { 0x00004013, 0x00000080, 0x0 }, 258 - { 0x80006013, 0x000000C0, 0x3 }, 259 - { 0x00000018, 0x0000008A, 0x0 }, 260 - { 0x80003015, 0x000000C0, 0x3 }, /* Default */ 261 - { 0x80003015, 0x000000C0, 0x3 }, 262 - { 0x80000018, 0x000000C0, 0x3 }, 339 + static const union intel_ddi_buf_trans_entry _skl_y_ddi_translations_hdmi[] = { 340 + { .hsw = { 0x00000018, 0x000000A1, 0x0 } }, 341 + { .hsw = { 0x00005012, 0x000000DF, 0x0 } }, 342 + { .hsw = { 0x80007011, 0x000000CB, 0x3 } }, 343 + { .hsw = { 0x00000018, 0x000000A4, 0x0 } }, 344 + { .hsw = { 0x00000018, 0x0000009D, 0x0 } }, 345 + { .hsw = { 0x00004013, 0x00000080, 0x0 } }, 346 + { .hsw = { 0x80006013, 0x000000C0, 0x3 } }, 347 + { .hsw = { 0x00000018, 0x0000008A, 0x0 } }, 348 + { .hsw = { 0x80003015, 0x000000C0, 0x3 } }, /* Default */ 349 + { .hsw = { 0x80003015, 0x000000C0, 0x3 } }, 350 + { .hsw = { 0x80000018, 0x000000C0, 0x3 } }, 263 351 }; 264 352 265 - 266 - static const struct bxt_ddi_buf_trans bxt_ddi_translations_dp[] = { 267 - /* Idx NT mV diff db */ 268 - { 52, 0x9A, 0, 128, }, /* 0: 400 0 */ 269 - { 78, 0x9A, 0, 85, }, /* 1: 400 3.5 */ 270 - { 104, 0x9A, 0, 64, }, /* 2: 400 6 */ 271 - { 154, 0x9A, 0, 43, }, /* 3: 400 9.5 */ 272 - { 77, 0x9A, 0, 128, }, /* 4: 600 0 */ 273 - { 116, 0x9A, 0, 85, }, /* 5: 600 3.5 */ 274 - { 154, 0x9A, 0, 64, }, /* 6: 600 6 */ 275 - { 102, 0x9A, 0, 128, }, /* 7: 800 0 */ 276 - { 154, 0x9A, 0, 85, }, /* 8: 800 3.5 */ 277 - { 154, 0x9A, 1, 128, }, /* 9: 1200 0 */ 353 + static const struct intel_ddi_buf_trans skl_y_ddi_translations_hdmi = { 354 + .entries = _skl_y_ddi_translations_hdmi, 355 + .num_entries = ARRAY_SIZE(_skl_y_ddi_translations_hdmi), 356 + .hdmi_default_entry = 8, 278 357 }; 279 358 280 - static const struct bxt_ddi_buf_trans bxt_ddi_translations_edp[] = { 359 + static const union intel_ddi_buf_trans_entry _bxt_ddi_translations_dp[] = { 360 + /* Idx NT mV diff db */ 361 + { .bxt = { 52, 0x9A, 0, 128, } }, /* 0: 400 0 */ 362 + { .bxt = { 78, 0x9A, 0, 85, } }, /* 1: 400 3.5 */ 363 + { .bxt = { 104, 0x9A, 0, 64, } }, /* 2: 400 6 */ 364 + { .bxt = { 154, 0x9A, 0, 43, } }, /* 3: 400 9.5 */ 365 + { .bxt = { 77, 0x9A, 0, 128, } }, /* 4: 600 0 */ 366 + { .bxt = { 116, 0x9A, 0, 85, } }, /* 5: 600 3.5 */ 367 + { .bxt = { 154, 0x9A, 0, 64, } }, /* 6: 600 6 */ 368 + { .bxt = { 102, 0x9A, 0, 128, } }, /* 7: 800 0 */ 369 + { .bxt = { 154, 0x9A, 0, 85, } }, /* 8: 800 3.5 */ 370 + { .bxt = { 154, 0x9A, 1, 128, } }, /* 9: 1200 0 */ 371 + }; 372 + 373 + static const struct intel_ddi_buf_trans bxt_ddi_translations_dp = { 374 + .entries = _bxt_ddi_translations_dp, 375 + .num_entries = ARRAY_SIZE(_bxt_ddi_translations_dp), 376 + }; 377 + 378 + static const union intel_ddi_buf_trans_entry _bxt_ddi_translations_edp[] = { 281 379 /* Idx NT mV diff db */ 282 - { 26, 0, 0, 128, }, /* 0: 200 0 */ 283 - { 38, 0, 0, 112, }, /* 1: 200 1.5 */ 284 - { 48, 0, 0, 96, }, /* 2: 200 4 */ 285 - { 54, 0, 0, 69, }, /* 3: 200 6 */ 286 - { 32, 0, 0, 128, }, /* 4: 250 0 */ 287 - { 48, 0, 0, 104, }, /* 5: 250 1.5 */ 288 - { 54, 0, 0, 85, }, /* 6: 250 4 */ 289 - { 43, 0, 0, 128, }, /* 7: 300 0 */ 290 - { 54, 0, 0, 101, }, /* 8: 300 1.5 */ 291 - { 48, 0, 0, 128, }, /* 9: 300 0 */ 380 + { .bxt = { 26, 0, 0, 128, } }, /* 0: 200 0 */ 381 + { .bxt = { 38, 0, 0, 112, } }, /* 1: 200 1.5 */ 382 + { .bxt = { 48, 0, 0, 96, } }, /* 2: 200 4 */ 383 + { .bxt = { 54, 0, 0, 69, } }, /* 3: 200 6 */ 384 + { .bxt = { 32, 0, 0, 128, } }, /* 4: 250 0 */ 385 + { .bxt = { 48, 0, 0, 104, } }, /* 5: 250 1.5 */ 386 + { .bxt = { 54, 0, 0, 85, } }, /* 6: 250 4 */ 387 + { .bxt = { 43, 0, 0, 128, } }, /* 7: 300 0 */ 388 + { .bxt = { 54, 0, 0, 101, } }, /* 8: 300 1.5 */ 389 + { .bxt = { 48, 0, 0, 128, } }, /* 9: 300 0 */ 390 + }; 391 + 392 + static const struct intel_ddi_buf_trans bxt_ddi_translations_edp = { 393 + .entries = _bxt_ddi_translations_edp, 394 + .num_entries = ARRAY_SIZE(_bxt_ddi_translations_edp), 292 395 }; 293 396 294 397 /* BSpec has 2 recommended values - entries 0 and 8. 295 398 * Using the entry with higher vswing. 296 399 */ 297 - static const struct bxt_ddi_buf_trans bxt_ddi_translations_hdmi[] = { 298 - /* Idx NT mV diff db */ 299 - { 52, 0x9A, 0, 128, }, /* 0: 400 0 */ 300 - { 52, 0x9A, 0, 85, }, /* 1: 400 3.5 */ 301 - { 52, 0x9A, 0, 64, }, /* 2: 400 6 */ 302 - { 42, 0x9A, 0, 43, }, /* 3: 400 9.5 */ 303 - { 77, 0x9A, 0, 128, }, /* 4: 600 0 */ 304 - { 77, 0x9A, 0, 85, }, /* 5: 600 3.5 */ 305 - { 77, 0x9A, 0, 64, }, /* 6: 600 6 */ 306 - { 102, 0x9A, 0, 128, }, /* 7: 800 0 */ 307 - { 102, 0x9A, 0, 85, }, /* 8: 800 3.5 */ 308 - { 154, 0x9A, 1, 128, }, /* 9: 1200 0 */ 400 + static const union intel_ddi_buf_trans_entry _bxt_ddi_translations_hdmi[] = { 401 + /* Idx NT mV diff db */ 402 + { .bxt = { 52, 0x9A, 0, 128, } }, /* 0: 400 0 */ 403 + { .bxt = { 52, 0x9A, 0, 85, } }, /* 1: 400 3.5 */ 404 + { .bxt = { 52, 0x9A, 0, 64, } }, /* 2: 400 6 */ 405 + { .bxt = { 42, 0x9A, 0, 43, } }, /* 3: 400 9.5 */ 406 + { .bxt = { 77, 0x9A, 0, 128, } }, /* 4: 600 0 */ 407 + { .bxt = { 77, 0x9A, 0, 85, } }, /* 5: 600 3.5 */ 408 + { .bxt = { 77, 0x9A, 0, 64, } }, /* 6: 600 6 */ 409 + { .bxt = { 102, 0x9A, 0, 128, } }, /* 7: 800 0 */ 410 + { .bxt = { 102, 0x9A, 0, 85, } }, /* 8: 800 3.5 */ 411 + { .bxt = { 154, 0x9A, 1, 128, } }, /* 9: 1200 0 */ 412 + }; 413 + 414 + static const struct intel_ddi_buf_trans bxt_ddi_translations_hdmi = { 415 + .entries = _bxt_ddi_translations_hdmi, 416 + .num_entries = ARRAY_SIZE(_bxt_ddi_translations_hdmi), 417 + .hdmi_default_entry = ARRAY_SIZE(_bxt_ddi_translations_hdmi) - 1, 309 418 }; 310 419 311 420 /* Voltage Swing Programming for VccIO 0.85V for DP */ 312 - static const struct cnl_ddi_buf_trans cnl_ddi_translations_dp_0_85V[] = { 313 - /* NT mV Trans mV db */ 314 - { 0xA, 0x5D, 0x3F, 0x00, 0x00 }, /* 350 350 0.0 */ 315 - { 0xA, 0x6A, 0x38, 0x00, 0x07 }, /* 350 500 3.1 */ 316 - { 0xB, 0x7A, 0x32, 0x00, 0x0D }, /* 350 700 6.0 */ 317 - { 0x6, 0x7C, 0x2D, 0x00, 0x12 }, /* 350 900 8.2 */ 318 - { 0xA, 0x69, 0x3F, 0x00, 0x00 }, /* 500 500 0.0 */ 319 - { 0xB, 0x7A, 0x36, 0x00, 0x09 }, /* 500 700 2.9 */ 320 - { 0x6, 0x7C, 0x30, 0x00, 0x0F }, /* 500 900 5.1 */ 321 - { 0xB, 0x7D, 0x3C, 0x00, 0x03 }, /* 650 725 0.9 */ 322 - { 0x6, 0x7C, 0x34, 0x00, 0x0B }, /* 600 900 3.5 */ 323 - { 0x6, 0x7B, 0x3F, 0x00, 0x00 }, /* 900 900 0.0 */ 421 + static const union intel_ddi_buf_trans_entry _cnl_ddi_translations_dp_0_85V[] = { 422 + /* NT mV Trans mV db */ 423 + { .cnl = { 0xA, 0x5D, 0x3F, 0x00, 0x00 } }, /* 350 350 0.0 */ 424 + { .cnl = { 0xA, 0x6A, 0x38, 0x00, 0x07 } }, /* 350 500 3.1 */ 425 + { .cnl = { 0xB, 0x7A, 0x32, 0x00, 0x0D } }, /* 350 700 6.0 */ 426 + { .cnl = { 0x6, 0x7C, 0x2D, 0x00, 0x12 } }, /* 350 900 8.2 */ 427 + { .cnl = { 0xA, 0x69, 0x3F, 0x00, 0x00 } }, /* 500 500 0.0 */ 428 + { .cnl = { 0xB, 0x7A, 0x36, 0x00, 0x09 } }, /* 500 700 2.9 */ 429 + { .cnl = { 0x6, 0x7C, 0x30, 0x00, 0x0F } }, /* 500 900 5.1 */ 430 + { .cnl = { 0xB, 0x7D, 0x3C, 0x00, 0x03 } }, /* 650 725 0.9 */ 431 + { .cnl = { 0x6, 0x7C, 0x34, 0x00, 0x0B } }, /* 600 900 3.5 */ 432 + { .cnl = { 0x6, 0x7B, 0x3F, 0x00, 0x00 } }, /* 900 900 0.0 */ 433 + }; 434 + 435 + static const struct intel_ddi_buf_trans cnl_ddi_translations_dp_0_85V = { 436 + .entries = _cnl_ddi_translations_dp_0_85V, 437 + .num_entries = ARRAY_SIZE(_cnl_ddi_translations_dp_0_85V), 324 438 }; 325 439 326 440 /* Voltage Swing Programming for VccIO 0.85V for HDMI */ 327 - static const struct cnl_ddi_buf_trans cnl_ddi_translations_hdmi_0_85V[] = { 328 - /* NT mV Trans mV db */ 329 - { 0xA, 0x60, 0x3F, 0x00, 0x00 }, /* 450 450 0.0 */ 330 - { 0xB, 0x73, 0x36, 0x00, 0x09 }, /* 450 650 3.2 */ 331 - { 0x6, 0x7F, 0x31, 0x00, 0x0E }, /* 450 850 5.5 */ 332 - { 0xB, 0x73, 0x3F, 0x00, 0x00 }, /* 650 650 0.0 */ 333 - { 0x6, 0x7F, 0x37, 0x00, 0x08 }, /* 650 850 2.3 */ 334 - { 0x6, 0x7F, 0x3F, 0x00, 0x00 }, /* 850 850 0.0 */ 335 - { 0x6, 0x7F, 0x35, 0x00, 0x0A }, /* 600 850 3.0 */ 441 + static const union intel_ddi_buf_trans_entry _cnl_ddi_translations_hdmi_0_85V[] = { 442 + /* NT mV Trans mV db */ 443 + { .cnl = { 0xA, 0x60, 0x3F, 0x00, 0x00 } }, /* 450 450 0.0 */ 444 + { .cnl = { 0xB, 0x73, 0x36, 0x00, 0x09 } }, /* 450 650 3.2 */ 445 + { .cnl = { 0x6, 0x7F, 0x31, 0x00, 0x0E } }, /* 450 850 5.5 */ 446 + { .cnl = { 0xB, 0x73, 0x3F, 0x00, 0x00 } }, /* 650 650 0.0 */ 447 + { .cnl = { 0x6, 0x7F, 0x37, 0x00, 0x08 } }, /* 650 850 2.3 */ 448 + { .cnl = { 0x6, 0x7F, 0x3F, 0x00, 0x00 } }, /* 850 850 0.0 */ 449 + { .cnl = { 0x6, 0x7F, 0x35, 0x00, 0x0A } }, /* 600 850 3.0 */ 450 + }; 451 + 452 + static const struct intel_ddi_buf_trans cnl_ddi_translations_hdmi_0_85V = { 453 + .entries = _cnl_ddi_translations_hdmi_0_85V, 454 + .num_entries = ARRAY_SIZE(_cnl_ddi_translations_hdmi_0_85V), 455 + .hdmi_default_entry = ARRAY_SIZE(_cnl_ddi_translations_hdmi_0_85V) - 1, 336 456 }; 337 457 338 458 /* Voltage Swing Programming for VccIO 0.85V for eDP */ 339 - static const struct cnl_ddi_buf_trans cnl_ddi_translations_edp_0_85V[] = { 340 - /* NT mV Trans mV db */ 341 - { 0xA, 0x66, 0x3A, 0x00, 0x05 }, /* 384 500 2.3 */ 342 - { 0x0, 0x7F, 0x38, 0x00, 0x07 }, /* 153 200 2.3 */ 343 - { 0x8, 0x7F, 0x38, 0x00, 0x07 }, /* 192 250 2.3 */ 344 - { 0x1, 0x7F, 0x38, 0x00, 0x07 }, /* 230 300 2.3 */ 345 - { 0x9, 0x7F, 0x38, 0x00, 0x07 }, /* 269 350 2.3 */ 346 - { 0xA, 0x66, 0x3C, 0x00, 0x03 }, /* 446 500 1.0 */ 347 - { 0xB, 0x70, 0x3C, 0x00, 0x03 }, /* 460 600 2.3 */ 348 - { 0xC, 0x75, 0x3C, 0x00, 0x03 }, /* 537 700 2.3 */ 349 - { 0x2, 0x7F, 0x3F, 0x00, 0x00 }, /* 400 400 0.0 */ 459 + static const union intel_ddi_buf_trans_entry _cnl_ddi_translations_edp_0_85V[] = { 460 + /* NT mV Trans mV db */ 461 + { .cnl = { 0xA, 0x66, 0x3A, 0x00, 0x05 } }, /* 384 500 2.3 */ 462 + { .cnl = { 0x0, 0x7F, 0x38, 0x00, 0x07 } }, /* 153 200 2.3 */ 463 + { .cnl = { 0x8, 0x7F, 0x38, 0x00, 0x07 } }, /* 192 250 2.3 */ 464 + { .cnl = { 0x1, 0x7F, 0x38, 0x00, 0x07 } }, /* 230 300 2.3 */ 465 + { .cnl = { 0x9, 0x7F, 0x38, 0x00, 0x07 } }, /* 269 350 2.3 */ 466 + { .cnl = { 0xA, 0x66, 0x3C, 0x00, 0x03 } }, /* 446 500 1.0 */ 467 + { .cnl = { 0xB, 0x70, 0x3C, 0x00, 0x03 } }, /* 460 600 2.3 */ 468 + { .cnl = { 0xC, 0x75, 0x3C, 0x00, 0x03 } }, /* 537 700 2.3 */ 469 + { .cnl = { 0x2, 0x7F, 0x3F, 0x00, 0x00 } }, /* 400 400 0.0 */ 470 + }; 471 + 472 + static const struct intel_ddi_buf_trans cnl_ddi_translations_edp_0_85V = { 473 + .entries = _cnl_ddi_translations_edp_0_85V, 474 + .num_entries = ARRAY_SIZE(_cnl_ddi_translations_edp_0_85V), 350 475 }; 351 476 352 477 /* Voltage Swing Programming for VccIO 0.95V for DP */ 353 - static const struct cnl_ddi_buf_trans cnl_ddi_translations_dp_0_95V[] = { 354 - /* NT mV Trans mV db */ 355 - { 0xA, 0x5D, 0x3F, 0x00, 0x00 }, /* 350 350 0.0 */ 356 - { 0xA, 0x6A, 0x38, 0x00, 0x07 }, /* 350 500 3.1 */ 357 - { 0xB, 0x7A, 0x32, 0x00, 0x0D }, /* 350 700 6.0 */ 358 - { 0x6, 0x7C, 0x2D, 0x00, 0x12 }, /* 350 900 8.2 */ 359 - { 0xA, 0x69, 0x3F, 0x00, 0x00 }, /* 500 500 0.0 */ 360 - { 0xB, 0x7A, 0x36, 0x00, 0x09 }, /* 500 700 2.9 */ 361 - { 0x6, 0x7C, 0x30, 0x00, 0x0F }, /* 500 900 5.1 */ 362 - { 0xB, 0x7D, 0x3C, 0x00, 0x03 }, /* 650 725 0.9 */ 363 - { 0x6, 0x7C, 0x34, 0x00, 0x0B }, /* 600 900 3.5 */ 364 - { 0x6, 0x7B, 0x3F, 0x00, 0x00 }, /* 900 900 0.0 */ 478 + static const union intel_ddi_buf_trans_entry _cnl_ddi_translations_dp_0_95V[] = { 479 + /* NT mV Trans mV db */ 480 + { .cnl = { 0xA, 0x5D, 0x3F, 0x00, 0x00 } }, /* 350 350 0.0 */ 481 + { .cnl = { 0xA, 0x6A, 0x38, 0x00, 0x07 } }, /* 350 500 3.1 */ 482 + { .cnl = { 0xB, 0x7A, 0x32, 0x00, 0x0D } }, /* 350 700 6.0 */ 483 + { .cnl = { 0x6, 0x7C, 0x2D, 0x00, 0x12 } }, /* 350 900 8.2 */ 484 + { .cnl = { 0xA, 0x69, 0x3F, 0x00, 0x00 } }, /* 500 500 0.0 */ 485 + { .cnl = { 0xB, 0x7A, 0x36, 0x00, 0x09 } }, /* 500 700 2.9 */ 486 + { .cnl = { 0x6, 0x7C, 0x30, 0x00, 0x0F } }, /* 500 900 5.1 */ 487 + { .cnl = { 0xB, 0x7D, 0x3C, 0x00, 0x03 } }, /* 650 725 0.9 */ 488 + { .cnl = { 0x6, 0x7C, 0x34, 0x00, 0x0B } }, /* 600 900 3.5 */ 489 + { .cnl = { 0x6, 0x7B, 0x3F, 0x00, 0x00 } }, /* 900 900 0.0 */ 490 + }; 491 + 492 + static const struct intel_ddi_buf_trans cnl_ddi_translations_dp_0_95V = { 493 + .entries = _cnl_ddi_translations_dp_0_95V, 494 + .num_entries = ARRAY_SIZE(_cnl_ddi_translations_dp_0_95V), 365 495 }; 366 496 367 497 /* Voltage Swing Programming for VccIO 0.95V for HDMI */ 368 - static const struct cnl_ddi_buf_trans cnl_ddi_translations_hdmi_0_95V[] = { 369 - /* NT mV Trans mV db */ 370 - { 0xA, 0x5C, 0x3F, 0x00, 0x00 }, /* 400 400 0.0 */ 371 - { 0xB, 0x69, 0x37, 0x00, 0x08 }, /* 400 600 3.5 */ 372 - { 0x5, 0x76, 0x31, 0x00, 0x0E }, /* 400 800 6.0 */ 373 - { 0xA, 0x5E, 0x3F, 0x00, 0x00 }, /* 450 450 0.0 */ 374 - { 0xB, 0x69, 0x3F, 0x00, 0x00 }, /* 600 600 0.0 */ 375 - { 0xB, 0x79, 0x35, 0x00, 0x0A }, /* 600 850 3.0 */ 376 - { 0x6, 0x7D, 0x32, 0x00, 0x0D }, /* 600 1000 4.4 */ 377 - { 0x5, 0x76, 0x3F, 0x00, 0x00 }, /* 800 800 0.0 */ 378 - { 0x6, 0x7D, 0x39, 0x00, 0x06 }, /* 800 1000 1.9 */ 379 - { 0x6, 0x7F, 0x39, 0x00, 0x06 }, /* 850 1050 1.8 */ 380 - { 0x6, 0x7F, 0x3F, 0x00, 0x00 }, /* 1050 1050 0.0 */ 498 + static const union intel_ddi_buf_trans_entry _cnl_ddi_translations_hdmi_0_95V[] = { 499 + /* NT mV Trans mV db */ 500 + { .cnl = { 0xA, 0x5C, 0x3F, 0x00, 0x00 } }, /* 400 400 0.0 */ 501 + { .cnl = { 0xB, 0x69, 0x37, 0x00, 0x08 } }, /* 400 600 3.5 */ 502 + { .cnl = { 0x5, 0x76, 0x31, 0x00, 0x0E } }, /* 400 800 6.0 */ 503 + { .cnl = { 0xA, 0x5E, 0x3F, 0x00, 0x00 } }, /* 450 450 0.0 */ 504 + { .cnl = { 0xB, 0x69, 0x3F, 0x00, 0x00 } }, /* 600 600 0.0 */ 505 + { .cnl = { 0xB, 0x79, 0x35, 0x00, 0x0A } }, /* 600 850 3.0 */ 506 + { .cnl = { 0x6, 0x7D, 0x32, 0x00, 0x0D } }, /* 600 1000 4.4 */ 507 + { .cnl = { 0x5, 0x76, 0x3F, 0x00, 0x00 } }, /* 800 800 0.0 */ 508 + { .cnl = { 0x6, 0x7D, 0x39, 0x00, 0x06 } }, /* 800 1000 1.9 */ 509 + { .cnl = { 0x6, 0x7F, 0x39, 0x00, 0x06 } }, /* 850 1050 1.8 */ 510 + { .cnl = { 0x6, 0x7F, 0x3F, 0x00, 0x00 } }, /* 1050 1050 0.0 */ 511 + }; 512 + 513 + static const struct intel_ddi_buf_trans cnl_ddi_translations_hdmi_0_95V = { 514 + .entries = _cnl_ddi_translations_hdmi_0_95V, 515 + .num_entries = ARRAY_SIZE(_cnl_ddi_translations_hdmi_0_95V), 516 + .hdmi_default_entry = ARRAY_SIZE(_cnl_ddi_translations_hdmi_0_95V) - 1, 381 517 }; 382 518 383 519 /* Voltage Swing Programming for VccIO 0.95V for eDP */ 384 - static const struct cnl_ddi_buf_trans cnl_ddi_translations_edp_0_95V[] = { 385 - /* NT mV Trans mV db */ 386 - { 0xA, 0x61, 0x3A, 0x00, 0x05 }, /* 384 500 2.3 */ 387 - { 0x0, 0x7F, 0x38, 0x00, 0x07 }, /* 153 200 2.3 */ 388 - { 0x8, 0x7F, 0x38, 0x00, 0x07 }, /* 192 250 2.3 */ 389 - { 0x1, 0x7F, 0x38, 0x00, 0x07 }, /* 230 300 2.3 */ 390 - { 0x9, 0x7F, 0x38, 0x00, 0x07 }, /* 269 350 2.3 */ 391 - { 0xA, 0x61, 0x3C, 0x00, 0x03 }, /* 446 500 1.0 */ 392 - { 0xB, 0x68, 0x39, 0x00, 0x06 }, /* 460 600 2.3 */ 393 - { 0xC, 0x6E, 0x39, 0x00, 0x06 }, /* 537 700 2.3 */ 394 - { 0x4, 0x7F, 0x3A, 0x00, 0x05 }, /* 460 600 2.3 */ 395 - { 0x2, 0x7F, 0x3F, 0x00, 0x00 }, /* 400 400 0.0 */ 520 + static const union intel_ddi_buf_trans_entry _cnl_ddi_translations_edp_0_95V[] = { 521 + /* NT mV Trans mV db */ 522 + { .cnl = { 0xA, 0x61, 0x3A, 0x00, 0x05 } }, /* 384 500 2.3 */ 523 + { .cnl = { 0x0, 0x7F, 0x38, 0x00, 0x07 } }, /* 153 200 2.3 */ 524 + { .cnl = { 0x8, 0x7F, 0x38, 0x00, 0x07 } }, /* 192 250 2.3 */ 525 + { .cnl = { 0x1, 0x7F, 0x38, 0x00, 0x07 } }, /* 230 300 2.3 */ 526 + { .cnl = { 0x9, 0x7F, 0x38, 0x00, 0x07 } }, /* 269 350 2.3 */ 527 + { .cnl = { 0xA, 0x61, 0x3C, 0x00, 0x03 } }, /* 446 500 1.0 */ 528 + { .cnl = { 0xB, 0x68, 0x39, 0x00, 0x06 } }, /* 460 600 2.3 */ 529 + { .cnl = { 0xC, 0x6E, 0x39, 0x00, 0x06 } }, /* 537 700 2.3 */ 530 + { .cnl = { 0x4, 0x7F, 0x3A, 0x00, 0x05 } }, /* 460 600 2.3 */ 531 + { .cnl = { 0x2, 0x7F, 0x3F, 0x00, 0x00 } }, /* 400 400 0.0 */ 532 + }; 533 + 534 + static const struct intel_ddi_buf_trans cnl_ddi_translations_edp_0_95V = { 535 + .entries = _cnl_ddi_translations_edp_0_95V, 536 + .num_entries = ARRAY_SIZE(_cnl_ddi_translations_edp_0_95V), 396 537 }; 397 538 398 539 /* Voltage Swing Programming for VccIO 1.05V for DP */ 399 - static const struct cnl_ddi_buf_trans cnl_ddi_translations_dp_1_05V[] = { 400 - /* NT mV Trans mV db */ 401 - { 0xA, 0x58, 0x3F, 0x00, 0x00 }, /* 400 400 0.0 */ 402 - { 0xB, 0x64, 0x37, 0x00, 0x08 }, /* 400 600 3.5 */ 403 - { 0x5, 0x70, 0x31, 0x00, 0x0E }, /* 400 800 6.0 */ 404 - { 0x6, 0x7F, 0x2C, 0x00, 0x13 }, /* 400 1050 8.4 */ 405 - { 0xB, 0x64, 0x3F, 0x00, 0x00 }, /* 600 600 0.0 */ 406 - { 0x5, 0x73, 0x35, 0x00, 0x0A }, /* 600 850 3.0 */ 407 - { 0x6, 0x7F, 0x30, 0x00, 0x0F }, /* 550 1050 5.6 */ 408 - { 0x5, 0x76, 0x3E, 0x00, 0x01 }, /* 850 900 0.5 */ 409 - { 0x6, 0x7F, 0x36, 0x00, 0x09 }, /* 750 1050 2.9 */ 410 - { 0x6, 0x7F, 0x3F, 0x00, 0x00 }, /* 1050 1050 0.0 */ 540 + static const union intel_ddi_buf_trans_entry _cnl_ddi_translations_dp_1_05V[] = { 541 + /* NT mV Trans mV db */ 542 + { .cnl = { 0xA, 0x58, 0x3F, 0x00, 0x00 } }, /* 400 400 0.0 */ 543 + { .cnl = { 0xB, 0x64, 0x37, 0x00, 0x08 } }, /* 400 600 3.5 */ 544 + { .cnl = { 0x5, 0x70, 0x31, 0x00, 0x0E } }, /* 400 800 6.0 */ 545 + { .cnl = { 0x6, 0x7F, 0x2C, 0x00, 0x13 } }, /* 400 1050 8.4 */ 546 + { .cnl = { 0xB, 0x64, 0x3F, 0x00, 0x00 } }, /* 600 600 0.0 */ 547 + { .cnl = { 0x5, 0x73, 0x35, 0x00, 0x0A } }, /* 600 850 3.0 */ 548 + { .cnl = { 0x6, 0x7F, 0x30, 0x00, 0x0F } }, /* 550 1050 5.6 */ 549 + { .cnl = { 0x5, 0x76, 0x3E, 0x00, 0x01 } }, /* 850 900 0.5 */ 550 + { .cnl = { 0x6, 0x7F, 0x36, 0x00, 0x09 } }, /* 750 1050 2.9 */ 551 + { .cnl = { 0x6, 0x7F, 0x3F, 0x00, 0x00 } }, /* 1050 1050 0.0 */ 552 + }; 553 + 554 + static const struct intel_ddi_buf_trans cnl_ddi_translations_dp_1_05V = { 555 + .entries = _cnl_ddi_translations_dp_1_05V, 556 + .num_entries = ARRAY_SIZE(_cnl_ddi_translations_dp_1_05V), 411 557 }; 412 558 413 559 /* Voltage Swing Programming for VccIO 1.05V for HDMI */ 414 - static const struct cnl_ddi_buf_trans cnl_ddi_translations_hdmi_1_05V[] = { 415 - /* NT mV Trans mV db */ 416 - { 0xA, 0x58, 0x3F, 0x00, 0x00 }, /* 400 400 0.0 */ 417 - { 0xB, 0x64, 0x37, 0x00, 0x08 }, /* 400 600 3.5 */ 418 - { 0x5, 0x70, 0x31, 0x00, 0x0E }, /* 400 800 6.0 */ 419 - { 0xA, 0x5B, 0x3F, 0x00, 0x00 }, /* 450 450 0.0 */ 420 - { 0xB, 0x64, 0x3F, 0x00, 0x00 }, /* 600 600 0.0 */ 421 - { 0x5, 0x73, 0x35, 0x00, 0x0A }, /* 600 850 3.0 */ 422 - { 0x6, 0x7C, 0x32, 0x00, 0x0D }, /* 600 1000 4.4 */ 423 - { 0x5, 0x70, 0x3F, 0x00, 0x00 }, /* 800 800 0.0 */ 424 - { 0x6, 0x7C, 0x39, 0x00, 0x06 }, /* 800 1000 1.9 */ 425 - { 0x6, 0x7F, 0x39, 0x00, 0x06 }, /* 850 1050 1.8 */ 426 - { 0x6, 0x7F, 0x3F, 0x00, 0x00 }, /* 1050 1050 0.0 */ 560 + static const union intel_ddi_buf_trans_entry _cnl_ddi_translations_hdmi_1_05V[] = { 561 + /* NT mV Trans mV db */ 562 + { .cnl = { 0xA, 0x58, 0x3F, 0x00, 0x00 } }, /* 400 400 0.0 */ 563 + { .cnl = { 0xB, 0x64, 0x37, 0x00, 0x08 } }, /* 400 600 3.5 */ 564 + { .cnl = { 0x5, 0x70, 0x31, 0x00, 0x0E } }, /* 400 800 6.0 */ 565 + { .cnl = { 0xA, 0x5B, 0x3F, 0x00, 0x00 } }, /* 450 450 0.0 */ 566 + { .cnl = { 0xB, 0x64, 0x3F, 0x00, 0x00 } }, /* 600 600 0.0 */ 567 + { .cnl = { 0x5, 0x73, 0x35, 0x00, 0x0A } }, /* 600 850 3.0 */ 568 + { .cnl = { 0x6, 0x7C, 0x32, 0x00, 0x0D } }, /* 600 1000 4.4 */ 569 + { .cnl = { 0x5, 0x70, 0x3F, 0x00, 0x00 } }, /* 800 800 0.0 */ 570 + { .cnl = { 0x6, 0x7C, 0x39, 0x00, 0x06 } }, /* 800 1000 1.9 */ 571 + { .cnl = { 0x6, 0x7F, 0x39, 0x00, 0x06 } }, /* 850 1050 1.8 */ 572 + { .cnl = { 0x6, 0x7F, 0x3F, 0x00, 0x00 } }, /* 1050 1050 0.0 */ 573 + }; 574 + 575 + static const struct intel_ddi_buf_trans cnl_ddi_translations_hdmi_1_05V = { 576 + .entries = _cnl_ddi_translations_hdmi_1_05V, 577 + .num_entries = ARRAY_SIZE(_cnl_ddi_translations_hdmi_1_05V), 578 + .hdmi_default_entry = ARRAY_SIZE(_cnl_ddi_translations_hdmi_1_05V) - 1, 427 579 }; 428 580 429 581 /* Voltage Swing Programming for VccIO 1.05V for eDP */ 430 - static const struct cnl_ddi_buf_trans cnl_ddi_translations_edp_1_05V[] = { 431 - /* NT mV Trans mV db */ 432 - { 0xA, 0x5E, 0x3A, 0x00, 0x05 }, /* 384 500 2.3 */ 433 - { 0x0, 0x7F, 0x38, 0x00, 0x07 }, /* 153 200 2.3 */ 434 - { 0x8, 0x7F, 0x38, 0x00, 0x07 }, /* 192 250 2.3 */ 435 - { 0x1, 0x7F, 0x38, 0x00, 0x07 }, /* 230 300 2.3 */ 436 - { 0x9, 0x7F, 0x38, 0x00, 0x07 }, /* 269 350 2.3 */ 437 - { 0xA, 0x5E, 0x3C, 0x00, 0x03 }, /* 446 500 1.0 */ 438 - { 0xB, 0x64, 0x39, 0x00, 0x06 }, /* 460 600 2.3 */ 439 - { 0xE, 0x6A, 0x39, 0x00, 0x06 }, /* 537 700 2.3 */ 440 - { 0x2, 0x7F, 0x3F, 0x00, 0x00 }, /* 400 400 0.0 */ 582 + static const union intel_ddi_buf_trans_entry _cnl_ddi_translations_edp_1_05V[] = { 583 + /* NT mV Trans mV db */ 584 + { .cnl = { 0xA, 0x5E, 0x3A, 0x00, 0x05 } }, /* 384 500 2.3 */ 585 + { .cnl = { 0x0, 0x7F, 0x38, 0x00, 0x07 } }, /* 153 200 2.3 */ 586 + { .cnl = { 0x8, 0x7F, 0x38, 0x00, 0x07 } }, /* 192 250 2.3 */ 587 + { .cnl = { 0x1, 0x7F, 0x38, 0x00, 0x07 } }, /* 230 300 2.3 */ 588 + { .cnl = { 0x9, 0x7F, 0x38, 0x00, 0x07 } }, /* 269 350 2.3 */ 589 + { .cnl = { 0xA, 0x5E, 0x3C, 0x00, 0x03 } }, /* 446 500 1.0 */ 590 + { .cnl = { 0xB, 0x64, 0x39, 0x00, 0x06 } }, /* 460 600 2.3 */ 591 + { .cnl = { 0xE, 0x6A, 0x39, 0x00, 0x06 } }, /* 537 700 2.3 */ 592 + { .cnl = { 0x2, 0x7F, 0x3F, 0x00, 0x00 } }, /* 400 400 0.0 */ 593 + }; 594 + 595 + static const struct intel_ddi_buf_trans cnl_ddi_translations_edp_1_05V = { 596 + .entries = _cnl_ddi_translations_edp_1_05V, 597 + .num_entries = ARRAY_SIZE(_cnl_ddi_translations_edp_1_05V), 441 598 }; 442 599 443 600 /* icl_combo_phy_ddi_translations */ 444 - static const struct cnl_ddi_buf_trans icl_combo_phy_ddi_translations_dp_hbr2[] = { 445 - /* NT mV Trans mV db */ 446 - { 0xA, 0x35, 0x3F, 0x00, 0x00 }, /* 350 350 0.0 */ 447 - { 0xA, 0x4F, 0x37, 0x00, 0x08 }, /* 350 500 3.1 */ 448 - { 0xC, 0x71, 0x2F, 0x00, 0x10 }, /* 350 700 6.0 */ 449 - { 0x6, 0x7F, 0x2B, 0x00, 0x14 }, /* 350 900 8.2 */ 450 - { 0xA, 0x4C, 0x3F, 0x00, 0x00 }, /* 500 500 0.0 */ 451 - { 0xC, 0x73, 0x34, 0x00, 0x0B }, /* 500 700 2.9 */ 452 - { 0x6, 0x7F, 0x2F, 0x00, 0x10 }, /* 500 900 5.1 */ 453 - { 0xC, 0x6C, 0x3C, 0x00, 0x03 }, /* 650 700 0.6 */ 454 - { 0x6, 0x7F, 0x35, 0x00, 0x0A }, /* 600 900 3.5 */ 455 - { 0x6, 0x7F, 0x3F, 0x00, 0x00 }, /* 900 900 0.0 */ 601 + static const union intel_ddi_buf_trans_entry _icl_combo_phy_ddi_translations_dp_hbr2_edp_hbr3[] = { 602 + /* NT mV Trans mV db */ 603 + { .cnl = { 0xA, 0x35, 0x3F, 0x00, 0x00 } }, /* 350 350 0.0 */ 604 + { .cnl = { 0xA, 0x4F, 0x37, 0x00, 0x08 } }, /* 350 500 3.1 */ 605 + { .cnl = { 0xC, 0x71, 0x2F, 0x00, 0x10 } }, /* 350 700 6.0 */ 606 + { .cnl = { 0x6, 0x7F, 0x2B, 0x00, 0x14 } }, /* 350 900 8.2 */ 607 + { .cnl = { 0xA, 0x4C, 0x3F, 0x00, 0x00 } }, /* 500 500 0.0 */ 608 + { .cnl = { 0xC, 0x73, 0x34, 0x00, 0x0B } }, /* 500 700 2.9 */ 609 + { .cnl = { 0x6, 0x7F, 0x2F, 0x00, 0x10 } }, /* 500 900 5.1 */ 610 + { .cnl = { 0xC, 0x6C, 0x3C, 0x00, 0x03 } }, /* 650 700 0.6 */ 611 + { .cnl = { 0x6, 0x7F, 0x35, 0x00, 0x0A } }, /* 600 900 3.5 */ 612 + { .cnl = { 0x6, 0x7F, 0x3F, 0x00, 0x00 } }, /* 900 900 0.0 */ 456 613 }; 457 614 458 - static const struct cnl_ddi_buf_trans icl_combo_phy_ddi_translations_edp_hbr2[] = { 459 - /* NT mV Trans mV db */ 460 - { 0x0, 0x7F, 0x3F, 0x00, 0x00 }, /* 200 200 0.0 */ 461 - { 0x8, 0x7F, 0x38, 0x00, 0x07 }, /* 200 250 1.9 */ 462 - { 0x1, 0x7F, 0x33, 0x00, 0x0C }, /* 200 300 3.5 */ 463 - { 0x9, 0x7F, 0x31, 0x00, 0x0E }, /* 200 350 4.9 */ 464 - { 0x8, 0x7F, 0x3F, 0x00, 0x00 }, /* 250 250 0.0 */ 465 - { 0x1, 0x7F, 0x38, 0x00, 0x07 }, /* 250 300 1.6 */ 466 - { 0x9, 0x7F, 0x35, 0x00, 0x0A }, /* 250 350 2.9 */ 467 - { 0x1, 0x7F, 0x3F, 0x00, 0x00 }, /* 300 300 0.0 */ 468 - { 0x9, 0x7F, 0x38, 0x00, 0x07 }, /* 300 350 1.3 */ 469 - { 0x9, 0x7F, 0x3F, 0x00, 0x00 }, /* 350 350 0.0 */ 615 + static const struct intel_ddi_buf_trans icl_combo_phy_ddi_translations_dp_hbr2_edp_hbr3 = { 616 + .entries = _icl_combo_phy_ddi_translations_dp_hbr2_edp_hbr3, 617 + .num_entries = ARRAY_SIZE(_icl_combo_phy_ddi_translations_dp_hbr2_edp_hbr3), 470 618 }; 471 619 472 - static const struct cnl_ddi_buf_trans icl_combo_phy_ddi_translations_edp_hbr3[] = { 473 - /* NT mV Trans mV db */ 474 - { 0xA, 0x35, 0x3F, 0x00, 0x00 }, /* 350 350 0.0 */ 475 - { 0xA, 0x4F, 0x37, 0x00, 0x08 }, /* 350 500 3.1 */ 476 - { 0xC, 0x71, 0x2F, 0x00, 0x10 }, /* 350 700 6.0 */ 477 - { 0x6, 0x7F, 0x2B, 0x00, 0x14 }, /* 350 900 8.2 */ 478 - { 0xA, 0x4C, 0x3F, 0x00, 0x00 }, /* 500 500 0.0 */ 479 - { 0xC, 0x73, 0x34, 0x00, 0x0B }, /* 500 700 2.9 */ 480 - { 0x6, 0x7F, 0x2F, 0x00, 0x10 }, /* 500 900 5.1 */ 481 - { 0xC, 0x6C, 0x3C, 0x00, 0x03 }, /* 650 700 0.6 */ 482 - { 0x6, 0x7F, 0x35, 0x00, 0x0A }, /* 600 900 3.5 */ 483 - { 0x6, 0x7F, 0x3F, 0x00, 0x00 }, /* 900 900 0.0 */ 620 + static const union intel_ddi_buf_trans_entry _icl_combo_phy_ddi_translations_edp_hbr2[] = { 621 + /* NT mV Trans mV db */ 622 + { .cnl = { 0x0, 0x7F, 0x3F, 0x00, 0x00 } }, /* 200 200 0.0 */ 623 + { .cnl = { 0x8, 0x7F, 0x38, 0x00, 0x07 } }, /* 200 250 1.9 */ 624 + { .cnl = { 0x1, 0x7F, 0x33, 0x00, 0x0C } }, /* 200 300 3.5 */ 625 + { .cnl = { 0x9, 0x7F, 0x31, 0x00, 0x0E } }, /* 200 350 4.9 */ 626 + { .cnl = { 0x8, 0x7F, 0x3F, 0x00, 0x00 } }, /* 250 250 0.0 */ 627 + { .cnl = { 0x1, 0x7F, 0x38, 0x00, 0x07 } }, /* 250 300 1.6 */ 628 + { .cnl = { 0x9, 0x7F, 0x35, 0x00, 0x0A } }, /* 250 350 2.9 */ 629 + { .cnl = { 0x1, 0x7F, 0x3F, 0x00, 0x00 } }, /* 300 300 0.0 */ 630 + { .cnl = { 0x9, 0x7F, 0x38, 0x00, 0x07 } }, /* 300 350 1.3 */ 631 + { .cnl = { 0x9, 0x7F, 0x3F, 0x00, 0x00 } }, /* 350 350 0.0 */ 484 632 }; 485 633 486 - static const struct cnl_ddi_buf_trans icl_combo_phy_ddi_translations_hdmi[] = { 487 - /* NT mV Trans mV db */ 488 - { 0xA, 0x60, 0x3F, 0x00, 0x00 }, /* 450 450 0.0 */ 489 - { 0xB, 0x73, 0x36, 0x00, 0x09 }, /* 450 650 3.2 */ 490 - { 0x6, 0x7F, 0x31, 0x00, 0x0E }, /* 450 850 5.5 */ 491 - { 0xB, 0x73, 0x3F, 0x00, 0x00 }, /* 650 650 0.0 ALS */ 492 - { 0x6, 0x7F, 0x37, 0x00, 0x08 }, /* 650 850 2.3 */ 493 - { 0x6, 0x7F, 0x3F, 0x00, 0x00 }, /* 850 850 0.0 */ 494 - { 0x6, 0x7F, 0x35, 0x00, 0x0A }, /* 600 850 3.0 */ 634 + static const struct intel_ddi_buf_trans icl_combo_phy_ddi_translations_edp_hbr2 = { 635 + .entries = _icl_combo_phy_ddi_translations_edp_hbr2, 636 + .num_entries = ARRAY_SIZE(_icl_combo_phy_ddi_translations_edp_hbr2), 495 637 }; 496 638 497 - static const struct cnl_ddi_buf_trans ehl_combo_phy_ddi_translations_dp[] = { 498 - /* NT mV Trans mV db */ 499 - { 0xA, 0x33, 0x3F, 0x00, 0x00 }, /* 350 350 0.0 */ 500 - { 0xA, 0x47, 0x36, 0x00, 0x09 }, /* 350 500 3.1 */ 501 - { 0xC, 0x64, 0x34, 0x00, 0x0B }, /* 350 700 6.0 */ 502 - { 0x6, 0x7F, 0x30, 0x00, 0x0F }, /* 350 900 8.2 */ 503 - { 0xA, 0x46, 0x3F, 0x00, 0x00 }, /* 500 500 0.0 */ 504 - { 0xC, 0x64, 0x38, 0x00, 0x07 }, /* 500 700 2.9 */ 505 - { 0x6, 0x7F, 0x32, 0x00, 0x0D }, /* 500 900 5.1 */ 506 - { 0xC, 0x61, 0x3F, 0x00, 0x00 }, /* 650 700 0.6 */ 507 - { 0x6, 0x7F, 0x38, 0x00, 0x07 }, /* 600 900 3.5 */ 508 - { 0x6, 0x7F, 0x3F, 0x00, 0x00 }, /* 900 900 0.0 */ 639 + static const union intel_ddi_buf_trans_entry _icl_combo_phy_ddi_translations_hdmi[] = { 640 + /* NT mV Trans mV db */ 641 + { .cnl = { 0xA, 0x60, 0x3F, 0x00, 0x00 } }, /* 450 450 0.0 */ 642 + { .cnl = { 0xB, 0x73, 0x36, 0x00, 0x09 } }, /* 450 650 3.2 */ 643 + { .cnl = { 0x6, 0x7F, 0x31, 0x00, 0x0E } }, /* 450 850 5.5 */ 644 + { .cnl = { 0xB, 0x73, 0x3F, 0x00, 0x00 } }, /* 650 650 0.0 ALS */ 645 + { .cnl = { 0x6, 0x7F, 0x37, 0x00, 0x08 } }, /* 650 850 2.3 */ 646 + { .cnl = { 0x6, 0x7F, 0x3F, 0x00, 0x00 } }, /* 850 850 0.0 */ 647 + { .cnl = { 0x6, 0x7F, 0x35, 0x00, 0x0A } }, /* 600 850 3.0 */ 509 648 }; 510 649 511 - static const struct cnl_ddi_buf_trans jsl_combo_phy_ddi_translations_edp_hbr[] = { 512 - /* NT mV Trans mV db */ 513 - { 0x8, 0x7F, 0x3F, 0x00, 0x00 }, /* 200 200 0.0 */ 514 - { 0x8, 0x7F, 0x38, 0x00, 0x07 }, /* 200 250 1.9 */ 515 - { 0x1, 0x7F, 0x33, 0x00, 0x0C }, /* 200 300 3.5 */ 516 - { 0xA, 0x35, 0x36, 0x00, 0x09 }, /* 200 350 4.9 */ 517 - { 0x8, 0x7F, 0x3F, 0x00, 0x00 }, /* 250 250 0.0 */ 518 - { 0x1, 0x7F, 0x38, 0x00, 0x07 }, /* 250 300 1.6 */ 519 - { 0xA, 0x35, 0x35, 0x00, 0x0A }, /* 250 350 2.9 */ 520 - { 0x1, 0x7F, 0x3F, 0x00, 0x00 }, /* 300 300 0.0 */ 521 - { 0xA, 0x35, 0x38, 0x00, 0x07 }, /* 300 350 1.3 */ 522 - { 0xA, 0x35, 0x3F, 0x00, 0x00 }, /* 350 350 0.0 */ 650 + static const struct intel_ddi_buf_trans icl_combo_phy_ddi_translations_hdmi = { 651 + .entries = _icl_combo_phy_ddi_translations_hdmi, 652 + .num_entries = ARRAY_SIZE(_icl_combo_phy_ddi_translations_hdmi), 653 + .hdmi_default_entry = ARRAY_SIZE(_icl_combo_phy_ddi_translations_hdmi) - 1, 523 654 }; 524 655 525 - static const struct cnl_ddi_buf_trans jsl_combo_phy_ddi_translations_edp_hbr2[] = { 526 - /* NT mV Trans mV db */ 527 - { 0x8, 0x7F, 0x3F, 0x00, 0x00 }, /* 200 200 0.0 */ 528 - { 0x8, 0x7F, 0x3F, 0x00, 0x00 }, /* 200 250 1.9 */ 529 - { 0x1, 0x7F, 0x3D, 0x00, 0x02 }, /* 200 300 3.5 */ 530 - { 0xA, 0x35, 0x38, 0x00, 0x07 }, /* 200 350 4.9 */ 531 - { 0x8, 0x7F, 0x3F, 0x00, 0x00 }, /* 250 250 0.0 */ 532 - { 0x1, 0x7F, 0x3F, 0x00, 0x00 }, /* 250 300 1.6 */ 533 - { 0xA, 0x35, 0x3A, 0x00, 0x05 }, /* 250 350 2.9 */ 534 - { 0x1, 0x7F, 0x3F, 0x00, 0x00 }, /* 300 300 0.0 */ 535 - { 0xA, 0x35, 0x38, 0x00, 0x07 }, /* 300 350 1.3 */ 536 - { 0xA, 0x35, 0x3F, 0x00, 0x00 }, /* 350 350 0.0 */ 656 + static const union intel_ddi_buf_trans_entry _ehl_combo_phy_ddi_translations_dp[] = { 657 + /* NT mV Trans mV db */ 658 + { .cnl = { 0xA, 0x33, 0x3F, 0x00, 0x00 } }, /* 350 350 0.0 */ 659 + { .cnl = { 0xA, 0x47, 0x36, 0x00, 0x09 } }, /* 350 500 3.1 */ 660 + { .cnl = { 0xC, 0x64, 0x34, 0x00, 0x0B } }, /* 350 700 6.0 */ 661 + { .cnl = { 0x6, 0x7F, 0x30, 0x00, 0x0F } }, /* 350 900 8.2 */ 662 + { .cnl = { 0xA, 0x46, 0x3F, 0x00, 0x00 } }, /* 500 500 0.0 */ 663 + { .cnl = { 0xC, 0x64, 0x38, 0x00, 0x07 } }, /* 500 700 2.9 */ 664 + { .cnl = { 0x6, 0x7F, 0x32, 0x00, 0x0D } }, /* 500 900 5.1 */ 665 + { .cnl = { 0xC, 0x61, 0x3F, 0x00, 0x00 } }, /* 650 700 0.6 */ 666 + { .cnl = { 0x6, 0x7F, 0x38, 0x00, 0x07 } }, /* 600 900 3.5 */ 667 + { .cnl = { 0x6, 0x7F, 0x3F, 0x00, 0x00 } }, /* 900 900 0.0 */ 537 668 }; 538 669 539 - static const struct cnl_ddi_buf_trans dg1_combo_phy_ddi_translations_dp_rbr_hbr[] = { 540 - /* NT mV Trans mV db */ 541 - { 0xA, 0x32, 0x3F, 0x00, 0x00 }, /* 350 350 0.0 */ 542 - { 0xA, 0x48, 0x35, 0x00, 0x0A }, /* 350 500 3.1 */ 543 - { 0xC, 0x63, 0x2F, 0x00, 0x10 }, /* 350 700 6.0 */ 544 - { 0x6, 0x7F, 0x2C, 0x00, 0x13 }, /* 350 900 8.2 */ 545 - { 0xA, 0x43, 0x3F, 0x00, 0x00 }, /* 500 500 0.0 */ 546 - { 0xC, 0x60, 0x36, 0x00, 0x09 }, /* 500 700 2.9 */ 547 - { 0x6, 0x7F, 0x30, 0x00, 0x0F }, /* 500 900 5.1 */ 548 - { 0xC, 0x60, 0x3F, 0x00, 0x00 }, /* 650 700 0.6 */ 549 - { 0x6, 0x7F, 0x37, 0x00, 0x08 }, /* 600 900 3.5 */ 550 - { 0x6, 0x7F, 0x3F, 0x00, 0x00 }, /* 900 900 0.0 */ 670 + static const struct intel_ddi_buf_trans ehl_combo_phy_ddi_translations_dp = { 671 + .entries = _ehl_combo_phy_ddi_translations_dp, 672 + .num_entries = ARRAY_SIZE(_ehl_combo_phy_ddi_translations_dp), 551 673 }; 552 674 553 - static const struct cnl_ddi_buf_trans dg1_combo_phy_ddi_translations_dp_hbr2_hbr3[] = { 554 - /* NT mV Trans mV db */ 555 - { 0xA, 0x32, 0x3F, 0x00, 0x00 }, /* 350 350 0.0 */ 556 - { 0xA, 0x48, 0x35, 0x00, 0x0A }, /* 350 500 3.1 */ 557 - { 0xC, 0x63, 0x2F, 0x00, 0x10 }, /* 350 700 6.0 */ 558 - { 0x6, 0x7F, 0x2C, 0x00, 0x13 }, /* 350 900 8.2 */ 559 - { 0xA, 0x43, 0x3F, 0x00, 0x00 }, /* 500 500 0.0 */ 560 - { 0xC, 0x60, 0x36, 0x00, 0x09 }, /* 500 700 2.9 */ 561 - { 0x6, 0x7F, 0x30, 0x00, 0x0F }, /* 500 900 5.1 */ 562 - { 0xC, 0x58, 0x3F, 0x00, 0x00 }, /* 650 700 0.6 */ 563 - { 0x6, 0x7F, 0x35, 0x00, 0x0A }, /* 600 900 3.5 */ 564 - { 0x6, 0x7F, 0x3F, 0x00, 0x00 }, /* 900 900 0.0 */ 675 + static const union intel_ddi_buf_trans_entry _ehl_combo_phy_ddi_translations_edp_hbr2[] = { 676 + /* NT mV Trans mV db */ 677 + { .cnl = { 0x8, 0x7F, 0x3F, 0x00, 0x00 } }, /* 200 200 0.0 */ 678 + { .cnl = { 0x8, 0x7F, 0x3F, 0x00, 0x00 } }, /* 200 250 1.9 */ 679 + { .cnl = { 0x1, 0x7F, 0x3D, 0x00, 0x02 } }, /* 200 300 3.5 */ 680 + { .cnl = { 0xA, 0x35, 0x39, 0x00, 0x06 } }, /* 200 350 4.9 */ 681 + { .cnl = { 0x8, 0x7F, 0x3F, 0x00, 0x00 } }, /* 250 250 0.0 */ 682 + { .cnl = { 0x1, 0x7F, 0x3C, 0x00, 0x03 } }, /* 250 300 1.6 */ 683 + { .cnl = { 0xA, 0x35, 0x39, 0x00, 0x06 } }, /* 250 350 2.9 */ 684 + { .cnl = { 0x1, 0x7F, 0x3F, 0x00, 0x00 } }, /* 300 300 0.0 */ 685 + { .cnl = { 0xA, 0x35, 0x38, 0x00, 0x07 } }, /* 300 350 1.3 */ 686 + { .cnl = { 0xA, 0x35, 0x3F, 0x00, 0x00 } }, /* 350 350 0.0 */ 565 687 }; 566 688 567 - static const struct icl_mg_phy_ddi_buf_trans icl_mg_phy_ddi_translations_rbr_hbr[] = { 568 - /* Voltage swing pre-emphasis */ 569 - { 0x18, 0x00, 0x00 }, /* 0 0 */ 570 - { 0x1D, 0x00, 0x05 }, /* 0 1 */ 571 - { 0x24, 0x00, 0x0C }, /* 0 2 */ 572 - { 0x2B, 0x00, 0x14 }, /* 0 3 */ 573 - { 0x21, 0x00, 0x00 }, /* 1 0 */ 574 - { 0x2B, 0x00, 0x08 }, /* 1 1 */ 575 - { 0x30, 0x00, 0x0F }, /* 1 2 */ 576 - { 0x31, 0x00, 0x03 }, /* 2 0 */ 577 - { 0x34, 0x00, 0x0B }, /* 2 1 */ 578 - { 0x3F, 0x00, 0x00 }, /* 3 0 */ 689 + static const struct intel_ddi_buf_trans ehl_combo_phy_ddi_translations_edp_hbr2 = { 690 + .entries = _ehl_combo_phy_ddi_translations_edp_hbr2, 691 + .num_entries = ARRAY_SIZE(_ehl_combo_phy_ddi_translations_edp_hbr2), 579 692 }; 580 693 581 - static const struct icl_mg_phy_ddi_buf_trans icl_mg_phy_ddi_translations_hbr2_hbr3[] = { 582 - /* Voltage swing pre-emphasis */ 583 - { 0x18, 0x00, 0x00 }, /* 0 0 */ 584 - { 0x1D, 0x00, 0x05 }, /* 0 1 */ 585 - { 0x24, 0x00, 0x0C }, /* 0 2 */ 586 - { 0x2B, 0x00, 0x14 }, /* 0 3 */ 587 - { 0x26, 0x00, 0x00 }, /* 1 0 */ 588 - { 0x2C, 0x00, 0x07 }, /* 1 1 */ 589 - { 0x33, 0x00, 0x0C }, /* 1 2 */ 590 - { 0x2E, 0x00, 0x00 }, /* 2 0 */ 591 - { 0x36, 0x00, 0x09 }, /* 2 1 */ 592 - { 0x3F, 0x00, 0x00 }, /* 3 0 */ 694 + static const union intel_ddi_buf_trans_entry _jsl_combo_phy_ddi_translations_edp_hbr[] = { 695 + /* NT mV Trans mV db */ 696 + { .cnl = { 0x8, 0x7F, 0x3F, 0x00, 0x00 } }, /* 200 200 0.0 */ 697 + { .cnl = { 0x8, 0x7F, 0x38, 0x00, 0x07 } }, /* 200 250 1.9 */ 698 + { .cnl = { 0x1, 0x7F, 0x33, 0x00, 0x0C } }, /* 200 300 3.5 */ 699 + { .cnl = { 0xA, 0x35, 0x36, 0x00, 0x09 } }, /* 200 350 4.9 */ 700 + { .cnl = { 0x8, 0x7F, 0x3F, 0x00, 0x00 } }, /* 250 250 0.0 */ 701 + { .cnl = { 0x1, 0x7F, 0x38, 0x00, 0x07 } }, /* 250 300 1.6 */ 702 + { .cnl = { 0xA, 0x35, 0x35, 0x00, 0x0A } }, /* 250 350 2.9 */ 703 + { .cnl = { 0x1, 0x7F, 0x3F, 0x00, 0x00 } }, /* 300 300 0.0 */ 704 + { .cnl = { 0xA, 0x35, 0x38, 0x00, 0x07 } }, /* 300 350 1.3 */ 705 + { .cnl = { 0xA, 0x35, 0x3F, 0x00, 0x00 } }, /* 350 350 0.0 */ 593 706 }; 594 707 595 - static const struct icl_mg_phy_ddi_buf_trans icl_mg_phy_ddi_translations_hdmi[] = { 596 - /* HDMI Preset VS Pre-emph */ 597 - { 0x1A, 0x0, 0x0 }, /* 1 400mV 0dB */ 598 - { 0x20, 0x0, 0x0 }, /* 2 500mV 0dB */ 599 - { 0x29, 0x0, 0x0 }, /* 3 650mV 0dB */ 600 - { 0x32, 0x0, 0x0 }, /* 4 800mV 0dB */ 601 - { 0x3F, 0x0, 0x0 }, /* 5 1000mV 0dB */ 602 - { 0x3A, 0x0, 0x5 }, /* 6 Full -1.5 dB */ 603 - { 0x39, 0x0, 0x6 }, /* 7 Full -1.8 dB */ 604 - { 0x38, 0x0, 0x7 }, /* 8 Full -2 dB */ 605 - { 0x37, 0x0, 0x8 }, /* 9 Full -2.5 dB */ 606 - { 0x36, 0x0, 0x9 }, /* 10 Full -3 dB */ 708 + static const struct intel_ddi_buf_trans jsl_combo_phy_ddi_translations_edp_hbr = { 709 + .entries = _jsl_combo_phy_ddi_translations_edp_hbr, 710 + .num_entries = ARRAY_SIZE(_jsl_combo_phy_ddi_translations_edp_hbr), 607 711 }; 608 712 609 - static const struct tgl_dkl_phy_ddi_buf_trans tgl_dkl_phy_dp_ddi_trans[] = { 610 - /* VS pre-emp Non-trans mV Pre-emph dB */ 611 - { 0x7, 0x0, 0x00 }, /* 0 0 400mV 0 dB */ 612 - { 0x5, 0x0, 0x05 }, /* 0 1 400mV 3.5 dB */ 613 - { 0x2, 0x0, 0x0B }, /* 0 2 400mV 6 dB */ 614 - { 0x0, 0x0, 0x18 }, /* 0 3 400mV 9.5 dB */ 615 - { 0x5, 0x0, 0x00 }, /* 1 0 600mV 0 dB */ 616 - { 0x2, 0x0, 0x08 }, /* 1 1 600mV 3.5 dB */ 617 - { 0x0, 0x0, 0x14 }, /* 1 2 600mV 6 dB */ 618 - { 0x2, 0x0, 0x00 }, /* 2 0 800mV 0 dB */ 619 - { 0x0, 0x0, 0x0B }, /* 2 1 800mV 3.5 dB */ 620 - { 0x0, 0x0, 0x00 }, /* 3 0 1200mV 0 dB HDMI default */ 713 + static const union intel_ddi_buf_trans_entry _jsl_combo_phy_ddi_translations_edp_hbr2[] = { 714 + /* NT mV Trans mV db */ 715 + { .cnl = { 0x8, 0x7F, 0x3F, 0x00, 0x00 } }, /* 200 200 0.0 */ 716 + { .cnl = { 0x8, 0x7F, 0x3F, 0x00, 0x00 } }, /* 200 250 1.9 */ 717 + { .cnl = { 0x1, 0x7F, 0x3D, 0x00, 0x02 } }, /* 200 300 3.5 */ 718 + { .cnl = { 0xA, 0x35, 0x38, 0x00, 0x07 } }, /* 200 350 4.9 */ 719 + { .cnl = { 0x8, 0x7F, 0x3F, 0x00, 0x00 } }, /* 250 250 0.0 */ 720 + { .cnl = { 0x1, 0x7F, 0x3F, 0x00, 0x00 } }, /* 250 300 1.6 */ 721 + { .cnl = { 0xA, 0x35, 0x3A, 0x00, 0x05 } }, /* 250 350 2.9 */ 722 + { .cnl = { 0x1, 0x7F, 0x3F, 0x00, 0x00 } }, /* 300 300 0.0 */ 723 + { .cnl = { 0xA, 0x35, 0x38, 0x00, 0x07 } }, /* 300 350 1.3 */ 724 + { .cnl = { 0xA, 0x35, 0x3F, 0x00, 0x00 } }, /* 350 350 0.0 */ 621 725 }; 622 726 623 - static const struct tgl_dkl_phy_ddi_buf_trans tgl_dkl_phy_dp_ddi_trans_hbr2[] = { 624 - /* VS pre-emp Non-trans mV Pre-emph dB */ 625 - { 0x7, 0x0, 0x00 }, /* 0 0 400mV 0 dB */ 626 - { 0x5, 0x0, 0x05 }, /* 0 1 400mV 3.5 dB */ 627 - { 0x2, 0x0, 0x0B }, /* 0 2 400mV 6 dB */ 628 - { 0x0, 0x0, 0x19 }, /* 0 3 400mV 9.5 dB */ 629 - { 0x5, 0x0, 0x00 }, /* 1 0 600mV 0 dB */ 630 - { 0x2, 0x0, 0x08 }, /* 1 1 600mV 3.5 dB */ 631 - { 0x0, 0x0, 0x14 }, /* 1 2 600mV 6 dB */ 632 - { 0x2, 0x0, 0x00 }, /* 2 0 800mV 0 dB */ 633 - { 0x0, 0x0, 0x0B }, /* 2 1 800mV 3.5 dB */ 634 - { 0x0, 0x0, 0x00 }, /* 3 0 1200mV 0 dB HDMI default */ 727 + static const struct intel_ddi_buf_trans jsl_combo_phy_ddi_translations_edp_hbr2 = { 728 + .entries = _jsl_combo_phy_ddi_translations_edp_hbr2, 729 + .num_entries = ARRAY_SIZE(_jsl_combo_phy_ddi_translations_edp_hbr2), 635 730 }; 636 731 637 - static const struct tgl_dkl_phy_ddi_buf_trans tgl_dkl_phy_hdmi_ddi_trans[] = { 638 - /* HDMI Preset VS Pre-emph */ 639 - { 0x7, 0x0, 0x0 }, /* 1 400mV 0dB */ 640 - { 0x6, 0x0, 0x0 }, /* 2 500mV 0dB */ 641 - { 0x4, 0x0, 0x0 }, /* 3 650mV 0dB */ 642 - { 0x2, 0x0, 0x0 }, /* 4 800mV 0dB */ 643 - { 0x0, 0x0, 0x0 }, /* 5 1000mV 0dB */ 644 - { 0x0, 0x0, 0x5 }, /* 6 Full -1.5 dB */ 645 - { 0x0, 0x0, 0x6 }, /* 7 Full -1.8 dB */ 646 - { 0x0, 0x0, 0x7 }, /* 8 Full -2 dB */ 647 - { 0x0, 0x0, 0x8 }, /* 9 Full -2.5 dB */ 648 - { 0x0, 0x0, 0xA }, /* 10 Full -3 dB */ 732 + static const union intel_ddi_buf_trans_entry _dg1_combo_phy_ddi_translations_dp_rbr_hbr[] = { 733 + /* NT mV Trans mV db */ 734 + { .cnl = { 0xA, 0x32, 0x3F, 0x00, 0x00 } }, /* 350 350 0.0 */ 735 + { .cnl = { 0xA, 0x48, 0x35, 0x00, 0x0A } }, /* 350 500 3.1 */ 736 + { .cnl = { 0xC, 0x63, 0x2F, 0x00, 0x10 } }, /* 350 700 6.0 */ 737 + { .cnl = { 0x6, 0x7F, 0x2C, 0x00, 0x13 } }, /* 350 900 8.2 */ 738 + { .cnl = { 0xA, 0x43, 0x3F, 0x00, 0x00 } }, /* 500 500 0.0 */ 739 + { .cnl = { 0xC, 0x60, 0x36, 0x00, 0x09 } }, /* 500 700 2.9 */ 740 + { .cnl = { 0x6, 0x7F, 0x30, 0x00, 0x0F } }, /* 500 900 5.1 */ 741 + { .cnl = { 0xC, 0x60, 0x3F, 0x00, 0x00 } }, /* 650 700 0.6 */ 742 + { .cnl = { 0x6, 0x7F, 0x37, 0x00, 0x08 } }, /* 600 900 3.5 */ 743 + { .cnl = { 0x6, 0x7F, 0x3F, 0x00, 0x00 } }, /* 900 900 0.0 */ 649 744 }; 650 745 651 - static const struct cnl_ddi_buf_trans tgl_combo_phy_ddi_translations_dp_hbr[] = { 652 - /* NT mV Trans mV db */ 653 - { 0xA, 0x32, 0x3F, 0x00, 0x00 }, /* 350 350 0.0 */ 654 - { 0xA, 0x4F, 0x37, 0x00, 0x08 }, /* 350 500 3.1 */ 655 - { 0xC, 0x71, 0x2F, 0x00, 0x10 }, /* 350 700 6.0 */ 656 - { 0x6, 0x7D, 0x2B, 0x00, 0x14 }, /* 350 900 8.2 */ 657 - { 0xA, 0x4C, 0x3F, 0x00, 0x00 }, /* 500 500 0.0 */ 658 - { 0xC, 0x73, 0x34, 0x00, 0x0B }, /* 500 700 2.9 */ 659 - { 0x6, 0x7F, 0x2F, 0x00, 0x10 }, /* 500 900 5.1 */ 660 - { 0xC, 0x6C, 0x3C, 0x00, 0x03 }, /* 650 700 0.6 */ 661 - { 0x6, 0x7F, 0x35, 0x00, 0x0A }, /* 600 900 3.5 */ 662 - { 0x6, 0x7F, 0x3F, 0x00, 0x00 }, /* 900 900 0.0 */ 746 + static const struct intel_ddi_buf_trans dg1_combo_phy_ddi_translations_dp_rbr_hbr = { 747 + .entries = _dg1_combo_phy_ddi_translations_dp_rbr_hbr, 748 + .num_entries = ARRAY_SIZE(_dg1_combo_phy_ddi_translations_dp_rbr_hbr), 663 749 }; 664 750 665 - static const struct cnl_ddi_buf_trans tgl_combo_phy_ddi_translations_dp_hbr2[] = { 666 - /* NT mV Trans mV db */ 667 - { 0xA, 0x35, 0x3F, 0x00, 0x00 }, /* 350 350 0.0 */ 668 - { 0xA, 0x4F, 0x37, 0x00, 0x08 }, /* 350 500 3.1 */ 669 - { 0xC, 0x63, 0x2F, 0x00, 0x10 }, /* 350 700 6.0 */ 670 - { 0x6, 0x7F, 0x2B, 0x00, 0x14 }, /* 350 900 8.2 */ 671 - { 0xA, 0x47, 0x3F, 0x00, 0x00 }, /* 500 500 0.0 */ 672 - { 0xC, 0x63, 0x34, 0x00, 0x0B }, /* 500 700 2.9 */ 673 - { 0x6, 0x7F, 0x2F, 0x00, 0x10 }, /* 500 900 5.1 */ 674 - { 0xC, 0x61, 0x3C, 0x00, 0x03 }, /* 650 700 0.6 */ 675 - { 0x6, 0x7B, 0x35, 0x00, 0x0A }, /* 600 900 3.5 */ 676 - { 0x6, 0x7F, 0x3F, 0x00, 0x00 }, /* 900 900 0.0 */ 751 + static const union intel_ddi_buf_trans_entry _dg1_combo_phy_ddi_translations_dp_hbr2_hbr3[] = { 752 + /* NT mV Trans mV db */ 753 + { .cnl = { 0xA, 0x32, 0x3F, 0x00, 0x00 } }, /* 350 350 0.0 */ 754 + { .cnl = { 0xA, 0x48, 0x35, 0x00, 0x0A } }, /* 350 500 3.1 */ 755 + { .cnl = { 0xC, 0x63, 0x2F, 0x00, 0x10 } }, /* 350 700 6.0 */ 756 + { .cnl = { 0x6, 0x7F, 0x2C, 0x00, 0x13 } }, /* 350 900 8.2 */ 757 + { .cnl = { 0xA, 0x43, 0x3F, 0x00, 0x00 } }, /* 500 500 0.0 */ 758 + { .cnl = { 0xC, 0x60, 0x36, 0x00, 0x09 } }, /* 500 700 2.9 */ 759 + { .cnl = { 0x6, 0x7F, 0x30, 0x00, 0x0F } }, /* 500 900 5.1 */ 760 + { .cnl = { 0xC, 0x58, 0x3F, 0x00, 0x00 } }, /* 650 700 0.6 */ 761 + { .cnl = { 0x6, 0x7F, 0x35, 0x00, 0x0A } }, /* 600 900 3.5 */ 762 + { .cnl = { 0x6, 0x7F, 0x3F, 0x00, 0x00 } }, /* 900 900 0.0 */ 677 763 }; 678 764 679 - static const struct cnl_ddi_buf_trans tgl_uy_combo_phy_ddi_translations_dp_hbr2[] = { 680 - /* NT mV Trans mV db */ 681 - { 0xA, 0x35, 0x3F, 0x00, 0x00 }, /* 350 350 0.0 */ 682 - { 0xA, 0x4F, 0x36, 0x00, 0x09 }, /* 350 500 3.1 */ 683 - { 0xC, 0x60, 0x32, 0x00, 0x0D }, /* 350 700 6.0 */ 684 - { 0xC, 0x7F, 0x2D, 0x00, 0x12 }, /* 350 900 8.2 */ 685 - { 0xC, 0x47, 0x3F, 0x00, 0x00 }, /* 500 500 0.0 */ 686 - { 0xC, 0x6F, 0x36, 0x00, 0x09 }, /* 500 700 2.9 */ 687 - { 0x6, 0x7D, 0x32, 0x00, 0x0D }, /* 500 900 5.1 */ 688 - { 0x6, 0x60, 0x3C, 0x00, 0x03 }, /* 650 700 0.6 */ 689 - { 0x6, 0x7F, 0x34, 0x00, 0x0B }, /* 600 900 3.5 */ 690 - { 0x6, 0x7F, 0x3F, 0x00, 0x00 }, /* 900 900 0.0 */ 765 + static const struct intel_ddi_buf_trans dg1_combo_phy_ddi_translations_dp_hbr2_hbr3 = { 766 + .entries = _dg1_combo_phy_ddi_translations_dp_hbr2_hbr3, 767 + .num_entries = ARRAY_SIZE(_dg1_combo_phy_ddi_translations_dp_hbr2_hbr3), 768 + }; 769 + 770 + static const union intel_ddi_buf_trans_entry _icl_mg_phy_ddi_translations_rbr_hbr[] = { 771 + /* Voltage swing pre-emphasis */ 772 + { .mg = { 0x18, 0x00, 0x00 } }, /* 0 0 */ 773 + { .mg = { 0x1D, 0x00, 0x05 } }, /* 0 1 */ 774 + { .mg = { 0x24, 0x00, 0x0C } }, /* 0 2 */ 775 + { .mg = { 0x2B, 0x00, 0x14 } }, /* 0 3 */ 776 + { .mg = { 0x21, 0x00, 0x00 } }, /* 1 0 */ 777 + { .mg = { 0x2B, 0x00, 0x08 } }, /* 1 1 */ 778 + { .mg = { 0x30, 0x00, 0x0F } }, /* 1 2 */ 779 + { .mg = { 0x31, 0x00, 0x03 } }, /* 2 0 */ 780 + { .mg = { 0x34, 0x00, 0x0B } }, /* 2 1 */ 781 + { .mg = { 0x3F, 0x00, 0x00 } }, /* 3 0 */ 782 + }; 783 + 784 + static const struct intel_ddi_buf_trans icl_mg_phy_ddi_translations_rbr_hbr = { 785 + .entries = _icl_mg_phy_ddi_translations_rbr_hbr, 786 + .num_entries = ARRAY_SIZE(_icl_mg_phy_ddi_translations_rbr_hbr), 787 + }; 788 + 789 + static const union intel_ddi_buf_trans_entry _icl_mg_phy_ddi_translations_hbr2_hbr3[] = { 790 + /* Voltage swing pre-emphasis */ 791 + { .mg = { 0x18, 0x00, 0x00 } }, /* 0 0 */ 792 + { .mg = { 0x1D, 0x00, 0x05 } }, /* 0 1 */ 793 + { .mg = { 0x24, 0x00, 0x0C } }, /* 0 2 */ 794 + { .mg = { 0x2B, 0x00, 0x14 } }, /* 0 3 */ 795 + { .mg = { 0x26, 0x00, 0x00 } }, /* 1 0 */ 796 + { .mg = { 0x2C, 0x00, 0x07 } }, /* 1 1 */ 797 + { .mg = { 0x33, 0x00, 0x0C } }, /* 1 2 */ 798 + { .mg = { 0x2E, 0x00, 0x00 } }, /* 2 0 */ 799 + { .mg = { 0x36, 0x00, 0x09 } }, /* 2 1 */ 800 + { .mg = { 0x3F, 0x00, 0x00 } }, /* 3 0 */ 801 + }; 802 + 803 + static const struct intel_ddi_buf_trans icl_mg_phy_ddi_translations_hbr2_hbr3 = { 804 + .entries = _icl_mg_phy_ddi_translations_hbr2_hbr3, 805 + .num_entries = ARRAY_SIZE(_icl_mg_phy_ddi_translations_hbr2_hbr3), 806 + }; 807 + 808 + static const union intel_ddi_buf_trans_entry _icl_mg_phy_ddi_translations_hdmi[] = { 809 + /* HDMI Preset VS Pre-emph */ 810 + { .mg = { 0x1A, 0x0, 0x0 } }, /* 1 400mV 0dB */ 811 + { .mg = { 0x20, 0x0, 0x0 } }, /* 2 500mV 0dB */ 812 + { .mg = { 0x29, 0x0, 0x0 } }, /* 3 650mV 0dB */ 813 + { .mg = { 0x32, 0x0, 0x0 } }, /* 4 800mV 0dB */ 814 + { .mg = { 0x3F, 0x0, 0x0 } }, /* 5 1000mV 0dB */ 815 + { .mg = { 0x3A, 0x0, 0x5 } }, /* 6 Full -1.5 dB */ 816 + { .mg = { 0x39, 0x0, 0x6 } }, /* 7 Full -1.8 dB */ 817 + { .mg = { 0x38, 0x0, 0x7 } }, /* 8 Full -2 dB */ 818 + { .mg = { 0x37, 0x0, 0x8 } }, /* 9 Full -2.5 dB */ 819 + { .mg = { 0x36, 0x0, 0x9 } }, /* 10 Full -3 dB */ 820 + }; 821 + 822 + static const struct intel_ddi_buf_trans icl_mg_phy_ddi_translations_hdmi = { 823 + .entries = _icl_mg_phy_ddi_translations_hdmi, 824 + .num_entries = ARRAY_SIZE(_icl_mg_phy_ddi_translations_hdmi), 825 + .hdmi_default_entry = ARRAY_SIZE(_icl_mg_phy_ddi_translations_hdmi) - 1, 826 + }; 827 + 828 + static const union intel_ddi_buf_trans_entry _tgl_dkl_phy_ddi_translations_dp_hbr[] = { 829 + /* VS pre-emp Non-trans mV Pre-emph dB */ 830 + { .dkl = { 0x7, 0x0, 0x00 } }, /* 0 0 400mV 0 dB */ 831 + { .dkl = { 0x5, 0x0, 0x05 } }, /* 0 1 400mV 3.5 dB */ 832 + { .dkl = { 0x2, 0x0, 0x0B } }, /* 0 2 400mV 6 dB */ 833 + { .dkl = { 0x0, 0x0, 0x18 } }, /* 0 3 400mV 9.5 dB */ 834 + { .dkl = { 0x5, 0x0, 0x00 } }, /* 1 0 600mV 0 dB */ 835 + { .dkl = { 0x2, 0x0, 0x08 } }, /* 1 1 600mV 3.5 dB */ 836 + { .dkl = { 0x0, 0x0, 0x14 } }, /* 1 2 600mV 6 dB */ 837 + { .dkl = { 0x2, 0x0, 0x00 } }, /* 2 0 800mV 0 dB */ 838 + { .dkl = { 0x0, 0x0, 0x0B } }, /* 2 1 800mV 3.5 dB */ 839 + { .dkl = { 0x0, 0x0, 0x00 } }, /* 3 0 1200mV 0 dB HDMI default */ 840 + }; 841 + 842 + static const struct intel_ddi_buf_trans tgl_dkl_phy_ddi_translations_dp_hbr = { 843 + .entries = _tgl_dkl_phy_ddi_translations_dp_hbr, 844 + .num_entries = ARRAY_SIZE(_tgl_dkl_phy_ddi_translations_dp_hbr), 845 + }; 846 + 847 + static const union intel_ddi_buf_trans_entry _tgl_dkl_phy_ddi_translations_dp_hbr2[] = { 848 + /* VS pre-emp Non-trans mV Pre-emph dB */ 849 + { .dkl = { 0x7, 0x0, 0x00 } }, /* 0 0 400mV 0 dB */ 850 + { .dkl = { 0x5, 0x0, 0x05 } }, /* 0 1 400mV 3.5 dB */ 851 + { .dkl = { 0x2, 0x0, 0x0B } }, /* 0 2 400mV 6 dB */ 852 + { .dkl = { 0x0, 0x0, 0x19 } }, /* 0 3 400mV 9.5 dB */ 853 + { .dkl = { 0x5, 0x0, 0x00 } }, /* 1 0 600mV 0 dB */ 854 + { .dkl = { 0x2, 0x0, 0x08 } }, /* 1 1 600mV 3.5 dB */ 855 + { .dkl = { 0x0, 0x0, 0x14 } }, /* 1 2 600mV 6 dB */ 856 + { .dkl = { 0x2, 0x0, 0x00 } }, /* 2 0 800mV 0 dB */ 857 + { .dkl = { 0x0, 0x0, 0x0B } }, /* 2 1 800mV 3.5 dB */ 858 + { .dkl = { 0x0, 0x0, 0x00 } }, /* 3 0 1200mV 0 dB HDMI default */ 859 + }; 860 + 861 + static const struct intel_ddi_buf_trans tgl_dkl_phy_ddi_translations_dp_hbr2 = { 862 + .entries = _tgl_dkl_phy_ddi_translations_dp_hbr2, 863 + .num_entries = ARRAY_SIZE(_tgl_dkl_phy_ddi_translations_dp_hbr2), 864 + }; 865 + 866 + static const union intel_ddi_buf_trans_entry _tgl_dkl_phy_ddi_translations_hdmi[] = { 867 + /* HDMI Preset VS Pre-emph */ 868 + { .dkl = { 0x7, 0x0, 0x0 } }, /* 1 400mV 0dB */ 869 + { .dkl = { 0x6, 0x0, 0x0 } }, /* 2 500mV 0dB */ 870 + { .dkl = { 0x4, 0x0, 0x0 } }, /* 3 650mV 0dB */ 871 + { .dkl = { 0x2, 0x0, 0x0 } }, /* 4 800mV 0dB */ 872 + { .dkl = { 0x0, 0x0, 0x0 } }, /* 5 1000mV 0dB */ 873 + { .dkl = { 0x0, 0x0, 0x5 } }, /* 6 Full -1.5 dB */ 874 + { .dkl = { 0x0, 0x0, 0x6 } }, /* 7 Full -1.8 dB */ 875 + { .dkl = { 0x0, 0x0, 0x7 } }, /* 8 Full -2 dB */ 876 + { .dkl = { 0x0, 0x0, 0x8 } }, /* 9 Full -2.5 dB */ 877 + { .dkl = { 0x0, 0x0, 0xA } }, /* 10 Full -3 dB */ 878 + }; 879 + 880 + static const struct intel_ddi_buf_trans tgl_dkl_phy_ddi_translations_hdmi = { 881 + .entries = _tgl_dkl_phy_ddi_translations_hdmi, 882 + .num_entries = ARRAY_SIZE(_tgl_dkl_phy_ddi_translations_hdmi), 883 + .hdmi_default_entry = ARRAY_SIZE(_tgl_dkl_phy_ddi_translations_hdmi) - 1, 884 + }; 885 + 886 + static const union intel_ddi_buf_trans_entry _tgl_combo_phy_ddi_translations_dp_hbr[] = { 887 + /* NT mV Trans mV db */ 888 + { .cnl = { 0xA, 0x32, 0x3F, 0x00, 0x00 } }, /* 350 350 0.0 */ 889 + { .cnl = { 0xA, 0x4F, 0x37, 0x00, 0x08 } }, /* 350 500 3.1 */ 890 + { .cnl = { 0xC, 0x71, 0x2F, 0x00, 0x10 } }, /* 350 700 6.0 */ 891 + { .cnl = { 0x6, 0x7D, 0x2B, 0x00, 0x14 } }, /* 350 900 8.2 */ 892 + { .cnl = { 0xA, 0x4C, 0x3F, 0x00, 0x00 } }, /* 500 500 0.0 */ 893 + { .cnl = { 0xC, 0x73, 0x34, 0x00, 0x0B } }, /* 500 700 2.9 */ 894 + { .cnl = { 0x6, 0x7F, 0x2F, 0x00, 0x10 } }, /* 500 900 5.1 */ 895 + { .cnl = { 0xC, 0x6C, 0x3C, 0x00, 0x03 } }, /* 650 700 0.6 */ 896 + { .cnl = { 0x6, 0x7F, 0x35, 0x00, 0x0A } }, /* 600 900 3.5 */ 897 + { .cnl = { 0x6, 0x7F, 0x3F, 0x00, 0x00 } }, /* 900 900 0.0 */ 898 + }; 899 + 900 + static const struct intel_ddi_buf_trans tgl_combo_phy_ddi_translations_dp_hbr = { 901 + .entries = _tgl_combo_phy_ddi_translations_dp_hbr, 902 + .num_entries = ARRAY_SIZE(_tgl_combo_phy_ddi_translations_dp_hbr), 903 + }; 904 + 905 + static const union intel_ddi_buf_trans_entry _tgl_combo_phy_ddi_translations_dp_hbr2[] = { 906 + /* NT mV Trans mV db */ 907 + { .cnl = { 0xA, 0x35, 0x3F, 0x00, 0x00 } }, /* 350 350 0.0 */ 908 + { .cnl = { 0xA, 0x4F, 0x37, 0x00, 0x08 } }, /* 350 500 3.1 */ 909 + { .cnl = { 0xC, 0x63, 0x2F, 0x00, 0x10 } }, /* 350 700 6.0 */ 910 + { .cnl = { 0x6, 0x7F, 0x2B, 0x00, 0x14 } }, /* 350 900 8.2 */ 911 + { .cnl = { 0xA, 0x47, 0x3F, 0x00, 0x00 } }, /* 500 500 0.0 */ 912 + { .cnl = { 0xC, 0x63, 0x34, 0x00, 0x0B } }, /* 500 700 2.9 */ 913 + { .cnl = { 0x6, 0x7F, 0x2F, 0x00, 0x10 } }, /* 500 900 5.1 */ 914 + { .cnl = { 0xC, 0x61, 0x3C, 0x00, 0x03 } }, /* 650 700 0.6 */ 915 + { .cnl = { 0x6, 0x7B, 0x35, 0x00, 0x0A } }, /* 600 900 3.5 */ 916 + { .cnl = { 0x6, 0x7F, 0x3F, 0x00, 0x00 } }, /* 900 900 0.0 */ 917 + }; 918 + 919 + static const struct intel_ddi_buf_trans tgl_combo_phy_ddi_translations_dp_hbr2 = { 920 + .entries = _tgl_combo_phy_ddi_translations_dp_hbr2, 921 + .num_entries = ARRAY_SIZE(_tgl_combo_phy_ddi_translations_dp_hbr2), 922 + }; 923 + 924 + static const union intel_ddi_buf_trans_entry _tgl_uy_combo_phy_ddi_translations_dp_hbr2[] = { 925 + /* NT mV Trans mV db */ 926 + { .cnl = { 0xA, 0x35, 0x3F, 0x00, 0x00 } }, /* 350 350 0.0 */ 927 + { .cnl = { 0xA, 0x4F, 0x36, 0x00, 0x09 } }, /* 350 500 3.1 */ 928 + { .cnl = { 0xC, 0x60, 0x32, 0x00, 0x0D } }, /* 350 700 6.0 */ 929 + { .cnl = { 0xC, 0x7F, 0x2D, 0x00, 0x12 } }, /* 350 900 8.2 */ 930 + { .cnl = { 0xC, 0x47, 0x3F, 0x00, 0x00 } }, /* 500 500 0.0 */ 931 + { .cnl = { 0xC, 0x6F, 0x36, 0x00, 0x09 } }, /* 500 700 2.9 */ 932 + { .cnl = { 0x6, 0x7D, 0x32, 0x00, 0x0D } }, /* 500 900 5.1 */ 933 + { .cnl = { 0x6, 0x60, 0x3C, 0x00, 0x03 } }, /* 650 700 0.6 */ 934 + { .cnl = { 0x6, 0x7F, 0x34, 0x00, 0x0B } }, /* 600 900 3.5 */ 935 + { .cnl = { 0x6, 0x7F, 0x3F, 0x00, 0x00 } }, /* 900 900 0.0 */ 936 + }; 937 + 938 + static const struct intel_ddi_buf_trans tgl_uy_combo_phy_ddi_translations_dp_hbr2 = { 939 + .entries = _tgl_uy_combo_phy_ddi_translations_dp_hbr2, 940 + .num_entries = ARRAY_SIZE(_tgl_uy_combo_phy_ddi_translations_dp_hbr2), 691 941 }; 692 942 693 943 /* 694 944 * Cloned the HOBL entry to comply with the voltage and pre-emphasis entries 695 945 * that DisplayPort specification requires 696 946 */ 697 - static const struct cnl_ddi_buf_trans tgl_combo_phy_ddi_translations_edp_hbr2_hobl[] = { 698 - /* VS pre-emp */ 699 - { 0x6, 0x7F, 0x3F, 0x00, 0x00 }, /* 0 0 */ 700 - { 0x6, 0x7F, 0x3F, 0x00, 0x00 }, /* 0 1 */ 701 - { 0x6, 0x7F, 0x3F, 0x00, 0x00 }, /* 0 2 */ 702 - { 0x6, 0x7F, 0x3F, 0x00, 0x00 }, /* 0 3 */ 703 - { 0x6, 0x7F, 0x3F, 0x00, 0x00 }, /* 1 0 */ 704 - { 0x6, 0x7F, 0x3F, 0x00, 0x00 }, /* 1 1 */ 705 - { 0x6, 0x7F, 0x3F, 0x00, 0x00 }, /* 1 2 */ 706 - { 0x6, 0x7F, 0x3F, 0x00, 0x00 }, /* 2 0 */ 707 - { 0x6, 0x7F, 0x3F, 0x00, 0x00 }, /* 2 1 */ 947 + static const union intel_ddi_buf_trans_entry _tgl_combo_phy_ddi_translations_edp_hbr2_hobl[] = { 948 + /* VS pre-emp */ 949 + { .cnl = { 0x6, 0x7F, 0x3F, 0x00, 0x00 } }, /* 0 0 */ 950 + { .cnl = { 0x6, 0x7F, 0x3F, 0x00, 0x00 } }, /* 0 1 */ 951 + { .cnl = { 0x6, 0x7F, 0x3F, 0x00, 0x00 } }, /* 0 2 */ 952 + { .cnl = { 0x6, 0x7F, 0x3F, 0x00, 0x00 } }, /* 0 3 */ 953 + { .cnl = { 0x6, 0x7F, 0x3F, 0x00, 0x00 } }, /* 1 0 */ 954 + { .cnl = { 0x6, 0x7F, 0x3F, 0x00, 0x00 } }, /* 1 1 */ 955 + { .cnl = { 0x6, 0x7F, 0x3F, 0x00, 0x00 } }, /* 1 2 */ 956 + { .cnl = { 0x6, 0x7F, 0x3F, 0x00, 0x00 } }, /* 2 0 */ 957 + { .cnl = { 0x6, 0x7F, 0x3F, 0x00, 0x00 } }, /* 2 1 */ 708 958 }; 709 959 710 - static const struct cnl_ddi_buf_trans rkl_combo_phy_ddi_translations_dp_hbr[] = { 711 - /* NT mV Trans mV db */ 712 - { 0xA, 0x2F, 0x3F, 0x00, 0x00 }, /* 350 350 0.0 */ 713 - { 0xA, 0x4F, 0x37, 0x00, 0x08 }, /* 350 500 3.1 */ 714 - { 0xC, 0x63, 0x2F, 0x00, 0x10 }, /* 350 700 6.0 */ 715 - { 0x6, 0x7D, 0x2A, 0x00, 0x15 }, /* 350 900 8.2 */ 716 - { 0xA, 0x4C, 0x3F, 0x00, 0x00 }, /* 500 500 0.0 */ 717 - { 0xC, 0x73, 0x34, 0x00, 0x0B }, /* 500 700 2.9 */ 718 - { 0x6, 0x7F, 0x2F, 0x00, 0x10 }, /* 500 900 5.1 */ 719 - { 0xC, 0x6E, 0x3E, 0x00, 0x01 }, /* 650 700 0.6 */ 720 - { 0x6, 0x7F, 0x35, 0x00, 0x0A }, /* 600 900 3.5 */ 721 - { 0x6, 0x7F, 0x3F, 0x00, 0x00 }, /* 900 900 0.0 */ 960 + static const struct intel_ddi_buf_trans tgl_combo_phy_ddi_translations_edp_hbr2_hobl = { 961 + .entries = _tgl_combo_phy_ddi_translations_edp_hbr2_hobl, 962 + .num_entries = ARRAY_SIZE(_tgl_combo_phy_ddi_translations_edp_hbr2_hobl), 722 963 }; 723 964 724 - static const struct cnl_ddi_buf_trans rkl_combo_phy_ddi_translations_dp_hbr2_hbr3[] = { 725 - /* NT mV Trans mV db */ 726 - { 0xA, 0x35, 0x3F, 0x00, 0x00 }, /* 350 350 0.0 */ 727 - { 0xA, 0x50, 0x38, 0x00, 0x07 }, /* 350 500 3.1 */ 728 - { 0xC, 0x61, 0x33, 0x00, 0x0C }, /* 350 700 6.0 */ 729 - { 0x6, 0x7F, 0x2E, 0x00, 0x11 }, /* 350 900 8.2 */ 730 - { 0xA, 0x47, 0x3F, 0x00, 0x00 }, /* 500 500 0.0 */ 731 - { 0xC, 0x5F, 0x38, 0x00, 0x07 }, /* 500 700 2.9 */ 732 - { 0x6, 0x7F, 0x2F, 0x00, 0x10 }, /* 500 900 5.1 */ 733 - { 0xC, 0x5F, 0x3F, 0x00, 0x00 }, /* 650 700 0.6 */ 734 - { 0x6, 0x7E, 0x36, 0x00, 0x09 }, /* 600 900 3.5 */ 735 - { 0x6, 0x7F, 0x3F, 0x00, 0x00 }, /* 900 900 0.0 */ 965 + static const union intel_ddi_buf_trans_entry _rkl_combo_phy_ddi_translations_dp_hbr[] = { 966 + /* NT mV Trans mV db */ 967 + { .cnl = { 0xA, 0x2F, 0x3F, 0x00, 0x00 } }, /* 350 350 0.0 */ 968 + { .cnl = { 0xA, 0x4F, 0x37, 0x00, 0x08 } }, /* 350 500 3.1 */ 969 + { .cnl = { 0xC, 0x63, 0x2F, 0x00, 0x10 } }, /* 350 700 6.0 */ 970 + { .cnl = { 0x6, 0x7D, 0x2A, 0x00, 0x15 } }, /* 350 900 8.2 */ 971 + { .cnl = { 0xA, 0x4C, 0x3F, 0x00, 0x00 } }, /* 500 500 0.0 */ 972 + { .cnl = { 0xC, 0x73, 0x34, 0x00, 0x0B } }, /* 500 700 2.9 */ 973 + { .cnl = { 0x6, 0x7F, 0x2F, 0x00, 0x10 } }, /* 500 900 5.1 */ 974 + { .cnl = { 0xC, 0x6E, 0x3E, 0x00, 0x01 } }, /* 650 700 0.6 */ 975 + { .cnl = { 0x6, 0x7F, 0x35, 0x00, 0x0A } }, /* 600 900 3.5 */ 976 + { .cnl = { 0x6, 0x7F, 0x3F, 0x00, 0x00 } }, /* 900 900 0.0 */ 736 977 }; 737 978 738 - static const struct tgl_dkl_phy_ddi_buf_trans adlp_dkl_phy_dp_ddi_trans_hbr[] = { 739 - /* VS pre-emp Non-trans mV Pre-emph dB */ 740 - { 0x7, 0x0, 0x01 }, /* 0 0 400mV 0 dB */ 741 - { 0x5, 0x0, 0x06 }, /* 0 1 400mV 3.5 dB */ 742 - { 0x2, 0x0, 0x0B }, /* 0 2 400mV 6 dB */ 743 - { 0x0, 0x0, 0x17 }, /* 0 3 400mV 9.5 dB */ 744 - { 0x5, 0x0, 0x00 }, /* 1 0 600mV 0 dB */ 745 - { 0x2, 0x0, 0x08 }, /* 1 1 600mV 3.5 dB */ 746 - { 0x0, 0x0, 0x14 }, /* 1 2 600mV 6 dB */ 747 - { 0x2, 0x0, 0x00 }, /* 2 0 800mV 0 dB */ 748 - { 0x0, 0x0, 0x0B }, /* 2 1 800mV 3.5 dB */ 749 - { 0x0, 0x0, 0x00 }, /* 3 0 1200mV 0 dB */ 979 + static const struct intel_ddi_buf_trans rkl_combo_phy_ddi_translations_dp_hbr = { 980 + .entries = _rkl_combo_phy_ddi_translations_dp_hbr, 981 + .num_entries = ARRAY_SIZE(_rkl_combo_phy_ddi_translations_dp_hbr), 750 982 }; 751 983 752 - static const struct tgl_dkl_phy_ddi_buf_trans adlp_dkl_phy_dp_ddi_trans_hbr2_hbr3[] = { 753 - /* VS pre-emp Non-trans mV Pre-emph dB */ 754 - { 0x7, 0x0, 0x00 }, /* 0 0 400mV 0 dB */ 755 - { 0x5, 0x0, 0x04 }, /* 0 1 400mV 3.5 dB */ 756 - { 0x2, 0x0, 0x0A }, /* 0 2 400mV 6 dB */ 757 - { 0x0, 0x0, 0x18 }, /* 0 3 400mV 9.5 dB */ 758 - { 0x5, 0x0, 0x00 }, /* 1 0 600mV 0 dB */ 759 - { 0x2, 0x0, 0x06 }, /* 1 1 600mV 3.5 dB */ 760 - { 0x0, 0x0, 0x14 }, /* 1 2 600mV 6 dB */ 761 - { 0x2, 0x0, 0x00 }, /* 2 0 800mV 0 dB */ 762 - { 0x0, 0x0, 0x09 }, /* 2 1 800mV 3.5 dB */ 763 - { 0x0, 0x0, 0x00 }, /* 3 0 1200mV 0 dB */ 984 + static const union intel_ddi_buf_trans_entry _rkl_combo_phy_ddi_translations_dp_hbr2_hbr3[] = { 985 + /* NT mV Trans mV db */ 986 + { .cnl = { 0xA, 0x35, 0x3F, 0x00, 0x00 } }, /* 350 350 0.0 */ 987 + { .cnl = { 0xA, 0x50, 0x38, 0x00, 0x07 } }, /* 350 500 3.1 */ 988 + { .cnl = { 0xC, 0x61, 0x33, 0x00, 0x0C } }, /* 350 700 6.0 */ 989 + { .cnl = { 0x6, 0x7F, 0x2E, 0x00, 0x11 } }, /* 350 900 8.2 */ 990 + { .cnl = { 0xA, 0x47, 0x3F, 0x00, 0x00 } }, /* 500 500 0.0 */ 991 + { .cnl = { 0xC, 0x5F, 0x38, 0x00, 0x07 } }, /* 500 700 2.9 */ 992 + { .cnl = { 0x6, 0x7F, 0x2F, 0x00, 0x10 } }, /* 500 900 5.1 */ 993 + { .cnl = { 0xC, 0x5F, 0x3F, 0x00, 0x00 } }, /* 650 700 0.6 */ 994 + { .cnl = { 0x6, 0x7E, 0x36, 0x00, 0x09 } }, /* 600 900 3.5 */ 995 + { .cnl = { 0x6, 0x7F, 0x3F, 0x00, 0x00 } }, /* 900 900 0.0 */ 764 996 }; 765 997 766 - bool is_hobl_buf_trans(const struct cnl_ddi_buf_trans *table) 998 + static const struct intel_ddi_buf_trans rkl_combo_phy_ddi_translations_dp_hbr2_hbr3 = { 999 + .entries = _rkl_combo_phy_ddi_translations_dp_hbr2_hbr3, 1000 + .num_entries = ARRAY_SIZE(_rkl_combo_phy_ddi_translations_dp_hbr2_hbr3), 1001 + }; 1002 + 1003 + static const union intel_ddi_buf_trans_entry _adls_combo_phy_ddi_translations_dp_hbr2_hbr3[] = { 1004 + /* NT mV Trans mV db */ 1005 + { .cnl = { 0xA, 0x35, 0x3F, 0x00, 0x00 } }, /* 350 350 0.0 */ 1006 + { .cnl = { 0xA, 0x4F, 0x37, 0x00, 0x08 } }, /* 350 500 3.1 */ 1007 + { .cnl = { 0xC, 0x63, 0x30, 0x00, 0x0F } }, /* 350 700 6.0 */ 1008 + { .cnl = { 0x6, 0x7F, 0x2B, 0x00, 0x14 } }, /* 350 900 8.2 */ 1009 + { .cnl = { 0xA, 0x47, 0x3F, 0x00, 0x00 } }, /* 500 500 0.0 */ 1010 + { .cnl = { 0xC, 0x63, 0x37, 0x00, 0x08 } }, /* 500 700 2.9 */ 1011 + { .cnl = { 0x6, 0x7F, 0x31, 0x00, 0x0E } }, /* 500 900 5.1 */ 1012 + { .cnl = { 0xC, 0x61, 0x3C, 0x00, 0x03 } }, /* 650 700 0.6 */ 1013 + { .cnl = { 0x6, 0x7B, 0x35, 0x00, 0x0A } }, /* 600 900 3.5 */ 1014 + { .cnl = { 0x6, 0x7F, 0x3F, 0x00, 0x00 } }, /* 900 900 0.0 */ 1015 + }; 1016 + 1017 + static const struct intel_ddi_buf_trans adls_combo_phy_ddi_translations_dp_hbr2_hbr3 = { 1018 + .entries = _adls_combo_phy_ddi_translations_dp_hbr2_hbr3, 1019 + .num_entries = ARRAY_SIZE(_adls_combo_phy_ddi_translations_dp_hbr2_hbr3), 1020 + }; 1021 + 1022 + static const union intel_ddi_buf_trans_entry _adls_combo_phy_ddi_translations_edp_hbr2[] = { 1023 + /* NT mV Trans mV db */ 1024 + { .cnl = { 0x9, 0x70, 0x3C, 0x00, 0x03 } }, /* 200 200 0.0 */ 1025 + { .cnl = { 0x9, 0x6D, 0x3A, 0x00, 0x05 } }, /* 200 250 1.9 */ 1026 + { .cnl = { 0x9, 0x7F, 0x36, 0x00, 0x09 } }, /* 200 300 3.5 */ 1027 + { .cnl = { 0x4, 0x59, 0x32, 0x00, 0x0D } }, /* 200 350 4.9 */ 1028 + { .cnl = { 0x2, 0x77, 0x3A, 0x00, 0x05 } }, /* 250 250 0.0 */ 1029 + { .cnl = { 0x2, 0x7F, 0x38, 0x00, 0x07 } }, /* 250 300 1.6 */ 1030 + { .cnl = { 0x4, 0x5A, 0x36, 0x00, 0x09 } }, /* 250 350 2.9 */ 1031 + { .cnl = { 0x4, 0x5E, 0x3D, 0x00, 0x04 } }, /* 300 300 0.0 */ 1032 + { .cnl = { 0x4, 0x65, 0x38, 0x00, 0x07 } }, /* 300 350 1.3 */ 1033 + { .cnl = { 0x4, 0x6F, 0x3A, 0x00, 0x05 } }, /* 350 350 0.0 */ 1034 + }; 1035 + 1036 + static const struct intel_ddi_buf_trans adls_combo_phy_ddi_translations_edp_hbr2 = { 1037 + .entries = _adls_combo_phy_ddi_translations_edp_hbr2, 1038 + .num_entries = ARRAY_SIZE(_adls_combo_phy_ddi_translations_edp_hbr2), 1039 + }; 1040 + 1041 + static const union intel_ddi_buf_trans_entry _adls_combo_phy_ddi_translations_edp_hbr3[] = { 1042 + /* NT mV Trans mV db */ 1043 + { .cnl = { 0xA, 0x5E, 0x34, 0x00, 0x0B } }, /* 350 350 0.0 */ 1044 + { .cnl = { 0xA, 0x69, 0x32, 0x00, 0x0D } }, /* 350 500 3.1 */ 1045 + { .cnl = { 0xC, 0x74, 0x31, 0x00, 0x0E } }, /* 350 700 6.0 */ 1046 + { .cnl = { 0x6, 0x7F, 0x2E, 0x00, 0x11 } }, /* 350 900 8.2 */ 1047 + { .cnl = { 0xA, 0x5C, 0x3F, 0x00, 0x00 } }, /* 500 500 0.0 */ 1048 + { .cnl = { 0xC, 0x7F, 0x34, 0x00, 0x0B } }, /* 500 700 2.9 */ 1049 + { .cnl = { 0x6, 0x7F, 0x33, 0x00, 0x0C } }, /* 500 900 5.1 */ 1050 + { .cnl = { 0xC, 0x7F, 0x3F, 0x00, 0x00 } }, /* 650 700 0.6 */ 1051 + { .cnl = { 0x6, 0x7F, 0x3C, 0x00, 0x03 } }, /* 600 900 3.5 */ 1052 + { .cnl = { 0x6, 0x7F, 0x3F, 0x00, 0x00 } }, /* 900 900 0.0 */ 1053 + }; 1054 + 1055 + static const struct intel_ddi_buf_trans adls_combo_phy_ddi_translations_edp_hbr3 = { 1056 + .entries = _adls_combo_phy_ddi_translations_edp_hbr3, 1057 + .num_entries = ARRAY_SIZE(_adls_combo_phy_ddi_translations_edp_hbr3), 1058 + }; 1059 + 1060 + static const union intel_ddi_buf_trans_entry _adlp_dkl_phy_ddi_translations_dp_hbr[] = { 1061 + /* VS pre-emp Non-trans mV Pre-emph dB */ 1062 + { .dkl = { 0x7, 0x0, 0x01 } }, /* 0 0 400mV 0 dB */ 1063 + { .dkl = { 0x5, 0x0, 0x06 } }, /* 0 1 400mV 3.5 dB */ 1064 + { .dkl = { 0x2, 0x0, 0x0B } }, /* 0 2 400mV 6 dB */ 1065 + { .dkl = { 0x0, 0x0, 0x17 } }, /* 0 3 400mV 9.5 dB */ 1066 + { .dkl = { 0x5, 0x0, 0x00 } }, /* 1 0 600mV 0 dB */ 1067 + { .dkl = { 0x2, 0x0, 0x08 } }, /* 1 1 600mV 3.5 dB */ 1068 + { .dkl = { 0x0, 0x0, 0x14 } }, /* 1 2 600mV 6 dB */ 1069 + { .dkl = { 0x2, 0x0, 0x00 } }, /* 2 0 800mV 0 dB */ 1070 + { .dkl = { 0x0, 0x0, 0x0B } }, /* 2 1 800mV 3.5 dB */ 1071 + { .dkl = { 0x0, 0x0, 0x00 } }, /* 3 0 1200mV 0 dB */ 1072 + }; 1073 + 1074 + static const struct intel_ddi_buf_trans adlp_dkl_phy_ddi_translations_dp_hbr = { 1075 + .entries = _adlp_dkl_phy_ddi_translations_dp_hbr, 1076 + .num_entries = ARRAY_SIZE(_adlp_dkl_phy_ddi_translations_dp_hbr), 1077 + }; 1078 + 1079 + static const union intel_ddi_buf_trans_entry _adlp_dkl_phy_ddi_translations_dp_hbr2_hbr3[] = { 1080 + /* VS pre-emp Non-trans mV Pre-emph dB */ 1081 + { .dkl = { 0x7, 0x0, 0x00 } }, /* 0 0 400mV 0 dB */ 1082 + { .dkl = { 0x5, 0x0, 0x04 } }, /* 0 1 400mV 3.5 dB */ 1083 + { .dkl = { 0x2, 0x0, 0x0A } }, /* 0 2 400mV 6 dB */ 1084 + { .dkl = { 0x0, 0x0, 0x18 } }, /* 0 3 400mV 9.5 dB */ 1085 + { .dkl = { 0x5, 0x0, 0x00 } }, /* 1 0 600mV 0 dB */ 1086 + { .dkl = { 0x2, 0x0, 0x06 } }, /* 1 1 600mV 3.5 dB */ 1087 + { .dkl = { 0x0, 0x0, 0x14 } }, /* 1 2 600mV 6 dB */ 1088 + { .dkl = { 0x2, 0x0, 0x00 } }, /* 2 0 800mV 0 dB */ 1089 + { .dkl = { 0x0, 0x0, 0x09 } }, /* 2 1 800mV 3.5 dB */ 1090 + { .dkl = { 0x0, 0x0, 0x00 } }, /* 3 0 1200mV 0 dB */ 1091 + }; 1092 + 1093 + static const struct intel_ddi_buf_trans adlp_dkl_phy_ddi_translations_dp_hbr2_hbr3 = { 1094 + .entries = _adlp_dkl_phy_ddi_translations_dp_hbr2_hbr3, 1095 + .num_entries = ARRAY_SIZE(_adlp_dkl_phy_ddi_translations_dp_hbr2_hbr3), 1096 + }; 1097 + 1098 + bool is_hobl_buf_trans(const struct intel_ddi_buf_trans *table) 767 1099 { 768 - return table == tgl_combo_phy_ddi_translations_edp_hbr2_hobl; 1100 + return table == &tgl_combo_phy_ddi_translations_edp_hbr2_hobl; 769 1101 } 770 1102 771 - static const struct ddi_buf_trans * 772 - bdw_get_buf_trans_edp(struct intel_encoder *encoder, int *n_entries) 1103 + static const struct intel_ddi_buf_trans * 1104 + intel_get_buf_trans(const struct intel_ddi_buf_trans *ddi_translations, int *num_entries) 773 1105 { 774 - struct drm_i915_private *dev_priv = to_i915(encoder->base.dev); 775 - 776 - if (dev_priv->vbt.edp.low_vswing) { 777 - *n_entries = ARRAY_SIZE(bdw_ddi_translations_edp); 778 - return bdw_ddi_translations_edp; 779 - } else { 780 - *n_entries = ARRAY_SIZE(bdw_ddi_translations_dp); 781 - return bdw_ddi_translations_dp; 782 - } 1106 + *num_entries = ddi_translations->num_entries; 1107 + return ddi_translations; 783 1108 } 784 1109 785 - static const struct ddi_buf_trans * 786 - skl_get_buf_trans_dp(struct intel_encoder *encoder, int *n_entries) 1110 + static const struct intel_ddi_buf_trans * 1111 + hsw_get_buf_trans(struct intel_encoder *encoder, 1112 + const struct intel_crtc_state *crtc_state, 1113 + int *n_entries) 787 1114 { 788 - struct drm_i915_private *dev_priv = to_i915(encoder->base.dev); 789 - 790 - if (IS_SKL_ULX(dev_priv)) { 791 - *n_entries = ARRAY_SIZE(skl_y_ddi_translations_dp); 792 - return skl_y_ddi_translations_dp; 793 - } else if (IS_SKL_ULT(dev_priv)) { 794 - *n_entries = ARRAY_SIZE(skl_u_ddi_translations_dp); 795 - return skl_u_ddi_translations_dp; 796 - } else { 797 - *n_entries = ARRAY_SIZE(skl_ddi_translations_dp); 798 - return skl_ddi_translations_dp; 799 - } 800 - } 801 - 802 - static const struct ddi_buf_trans * 803 - kbl_get_buf_trans_dp(struct intel_encoder *encoder, int *n_entries) 804 - { 805 - struct drm_i915_private *dev_priv = to_i915(encoder->base.dev); 806 - 807 - if (IS_KBL_ULX(dev_priv) || 808 - IS_CFL_ULX(dev_priv) || 809 - IS_CML_ULX(dev_priv)) { 810 - *n_entries = ARRAY_SIZE(kbl_y_ddi_translations_dp); 811 - return kbl_y_ddi_translations_dp; 812 - } else if (IS_KBL_ULT(dev_priv) || 813 - IS_CFL_ULT(dev_priv) || 814 - IS_CML_ULT(dev_priv)) { 815 - *n_entries = ARRAY_SIZE(kbl_u_ddi_translations_dp); 816 - return kbl_u_ddi_translations_dp; 817 - } else { 818 - *n_entries = ARRAY_SIZE(kbl_ddi_translations_dp); 819 - return kbl_ddi_translations_dp; 820 - } 821 - } 822 - 823 - static const struct ddi_buf_trans * 824 - skl_get_buf_trans_edp(struct intel_encoder *encoder, int *n_entries) 825 - { 826 - struct drm_i915_private *dev_priv = to_i915(encoder->base.dev); 827 - 828 - if (dev_priv->vbt.edp.low_vswing) { 829 - if (IS_SKL_ULX(dev_priv) || 830 - IS_KBL_ULX(dev_priv) || 831 - IS_CFL_ULX(dev_priv) || 832 - IS_CML_ULX(dev_priv)) { 833 - *n_entries = ARRAY_SIZE(skl_y_ddi_translations_edp); 834 - return skl_y_ddi_translations_edp; 835 - } else if (IS_SKL_ULT(dev_priv) || 836 - IS_KBL_ULT(dev_priv) || 837 - IS_CFL_ULT(dev_priv) || 838 - IS_CML_ULT(dev_priv)) { 839 - *n_entries = ARRAY_SIZE(skl_u_ddi_translations_edp); 840 - return skl_u_ddi_translations_edp; 841 - } else { 842 - *n_entries = ARRAY_SIZE(skl_ddi_translations_edp); 843 - return skl_ddi_translations_edp; 844 - } 845 - } 846 - 847 - if (IS_KABYLAKE(dev_priv) || 848 - IS_COFFEELAKE(dev_priv) || 849 - IS_COMETLAKE(dev_priv)) 850 - return kbl_get_buf_trans_dp(encoder, n_entries); 1115 + if (intel_crtc_has_type(crtc_state, INTEL_OUTPUT_ANALOG)) 1116 + return intel_get_buf_trans(&hsw_ddi_translations_fdi, n_entries); 1117 + else if (intel_crtc_has_type(crtc_state, INTEL_OUTPUT_HDMI)) 1118 + return intel_get_buf_trans(&hsw_ddi_translations_hdmi, n_entries); 851 1119 else 852 - return skl_get_buf_trans_dp(encoder, n_entries); 1120 + return intel_get_buf_trans(&hsw_ddi_translations_dp, n_entries); 853 1121 } 854 1122 855 - static const struct ddi_buf_trans * 856 - skl_get_buf_trans_hdmi(struct drm_i915_private *dev_priv, int *n_entries) 1123 + static const struct intel_ddi_buf_trans * 1124 + bdw_get_buf_trans(struct intel_encoder *encoder, 1125 + const struct intel_crtc_state *crtc_state, 1126 + int *n_entries) 857 1127 { 858 - if (IS_SKL_ULX(dev_priv) || 859 - IS_KBL_ULX(dev_priv) || 860 - IS_CFL_ULX(dev_priv) || 861 - IS_CML_ULX(dev_priv)) { 862 - *n_entries = ARRAY_SIZE(skl_y_ddi_translations_hdmi); 863 - return skl_y_ddi_translations_hdmi; 864 - } else { 865 - *n_entries = ARRAY_SIZE(skl_ddi_translations_hdmi); 866 - return skl_ddi_translations_hdmi; 867 - } 1128 + struct drm_i915_private *i915 = to_i915(encoder->base.dev); 1129 + 1130 + if (intel_crtc_has_type(crtc_state, INTEL_OUTPUT_ANALOG)) 1131 + return intel_get_buf_trans(&bdw_ddi_translations_fdi, n_entries); 1132 + else if (intel_crtc_has_type(crtc_state, INTEL_OUTPUT_HDMI)) 1133 + return intel_get_buf_trans(&bdw_ddi_translations_hdmi, n_entries); 1134 + else if (intel_crtc_has_type(crtc_state, INTEL_OUTPUT_EDP) && 1135 + i915->vbt.edp.low_vswing) 1136 + return intel_get_buf_trans(&bdw_ddi_translations_edp, n_entries); 1137 + else 1138 + return intel_get_buf_trans(&bdw_ddi_translations_dp, n_entries); 868 1139 } 869 1140 870 1141 static int skl_buf_trans_num_entries(enum port port, int n_entries) ··· 1147 876 return min(n_entries, 9); 1148 877 } 1149 878 1150 - const struct ddi_buf_trans * 1151 - intel_ddi_get_buf_trans_dp(struct intel_encoder *encoder, int *n_entries) 879 + static const struct intel_ddi_buf_trans * 880 + _skl_get_buf_trans_dp(struct intel_encoder *encoder, 881 + const struct intel_ddi_buf_trans *ddi_translations, 882 + int *n_entries) 1152 883 { 1153 - struct drm_i915_private *dev_priv = to_i915(encoder->base.dev); 1154 - 1155 - if (IS_KABYLAKE(dev_priv) || 1156 - IS_COFFEELAKE(dev_priv) || 1157 - IS_COMETLAKE(dev_priv)) { 1158 - const struct ddi_buf_trans *ddi_translations = 1159 - kbl_get_buf_trans_dp(encoder, n_entries); 1160 - *n_entries = skl_buf_trans_num_entries(encoder->port, *n_entries); 1161 - return ddi_translations; 1162 - } else if (IS_SKYLAKE(dev_priv)) { 1163 - const struct ddi_buf_trans *ddi_translations = 1164 - skl_get_buf_trans_dp(encoder, n_entries); 1165 - *n_entries = skl_buf_trans_num_entries(encoder->port, *n_entries); 1166 - return ddi_translations; 1167 - } else if (IS_BROADWELL(dev_priv)) { 1168 - *n_entries = ARRAY_SIZE(bdw_ddi_translations_dp); 1169 - return bdw_ddi_translations_dp; 1170 - } else if (IS_HASWELL(dev_priv)) { 1171 - *n_entries = ARRAY_SIZE(hsw_ddi_translations_dp); 1172 - return hsw_ddi_translations_dp; 1173 - } 1174 - 1175 - *n_entries = 0; 1176 - return NULL; 884 + ddi_translations = intel_get_buf_trans(ddi_translations, n_entries); 885 + *n_entries = skl_buf_trans_num_entries(encoder->port, *n_entries); 886 + return ddi_translations; 1177 887 } 1178 888 1179 - const struct ddi_buf_trans * 1180 - intel_ddi_get_buf_trans_edp(struct intel_encoder *encoder, int *n_entries) 889 + static const struct intel_ddi_buf_trans * 890 + skl_y_get_buf_trans(struct intel_encoder *encoder, 891 + const struct intel_crtc_state *crtc_state, 892 + int *n_entries) 1181 893 { 1182 - struct drm_i915_private *dev_priv = to_i915(encoder->base.dev); 894 + struct drm_i915_private *i915 = to_i915(encoder->base.dev); 1183 895 1184 - if (DISPLAY_VER(dev_priv) == 9 && !IS_BROXTON(dev_priv)) { 1185 - const struct ddi_buf_trans *ddi_translations = 1186 - skl_get_buf_trans_edp(encoder, n_entries); 1187 - *n_entries = skl_buf_trans_num_entries(encoder->port, *n_entries); 1188 - return ddi_translations; 1189 - } else if (IS_BROADWELL(dev_priv)) { 1190 - return bdw_get_buf_trans_edp(encoder, n_entries); 1191 - } else if (IS_HASWELL(dev_priv)) { 1192 - *n_entries = ARRAY_SIZE(hsw_ddi_translations_dp); 1193 - return hsw_ddi_translations_dp; 1194 - } 1195 - 1196 - *n_entries = 0; 1197 - return NULL; 896 + if (intel_crtc_has_type(crtc_state, INTEL_OUTPUT_HDMI)) 897 + return intel_get_buf_trans(&skl_y_ddi_translations_hdmi, n_entries); 898 + else if (intel_crtc_has_type(crtc_state, INTEL_OUTPUT_EDP) && 899 + i915->vbt.edp.low_vswing) 900 + return _skl_get_buf_trans_dp(encoder, &skl_y_ddi_translations_edp, n_entries); 901 + else 902 + return _skl_get_buf_trans_dp(encoder, &skl_y_ddi_translations_dp, n_entries); 1198 903 } 1199 904 1200 - const struct ddi_buf_trans * 1201 - intel_ddi_get_buf_trans_fdi(struct drm_i915_private *dev_priv, 1202 - int *n_entries) 905 + static const struct intel_ddi_buf_trans * 906 + skl_u_get_buf_trans(struct intel_encoder *encoder, 907 + const struct intel_crtc_state *crtc_state, 908 + int *n_entries) 1203 909 { 1204 - if (IS_BROADWELL(dev_priv)) { 1205 - *n_entries = ARRAY_SIZE(bdw_ddi_translations_fdi); 1206 - return bdw_ddi_translations_fdi; 1207 - } else if (IS_HASWELL(dev_priv)) { 1208 - *n_entries = ARRAY_SIZE(hsw_ddi_translations_fdi); 1209 - return hsw_ddi_translations_fdi; 1210 - } 910 + struct drm_i915_private *i915 = to_i915(encoder->base.dev); 1211 911 1212 - *n_entries = 0; 1213 - return NULL; 912 + if (intel_crtc_has_type(crtc_state, INTEL_OUTPUT_HDMI)) 913 + return intel_get_buf_trans(&skl_ddi_translations_hdmi, n_entries); 914 + else if (intel_crtc_has_type(crtc_state, INTEL_OUTPUT_EDP) && 915 + i915->vbt.edp.low_vswing) 916 + return _skl_get_buf_trans_dp(encoder, &skl_u_ddi_translations_edp, n_entries); 917 + else 918 + return _skl_get_buf_trans_dp(encoder, &skl_u_ddi_translations_dp, n_entries); 1214 919 } 1215 920 1216 - const struct ddi_buf_trans * 1217 - intel_ddi_get_buf_trans_hdmi(struct intel_encoder *encoder, 1218 - int *n_entries) 921 + static const struct intel_ddi_buf_trans * 922 + skl_get_buf_trans(struct intel_encoder *encoder, 923 + const struct intel_crtc_state *crtc_state, 924 + int *n_entries) 1219 925 { 1220 - struct drm_i915_private *dev_priv = to_i915(encoder->base.dev); 926 + struct drm_i915_private *i915 = to_i915(encoder->base.dev); 1221 927 1222 - if (DISPLAY_VER(dev_priv) == 9 && !IS_BROXTON(dev_priv)) { 1223 - return skl_get_buf_trans_hdmi(dev_priv, n_entries); 1224 - } else if (IS_BROADWELL(dev_priv)) { 1225 - *n_entries = ARRAY_SIZE(bdw_ddi_translations_hdmi); 1226 - return bdw_ddi_translations_hdmi; 1227 - } else if (IS_HASWELL(dev_priv)) { 1228 - *n_entries = ARRAY_SIZE(hsw_ddi_translations_hdmi); 1229 - return hsw_ddi_translations_hdmi; 1230 - } 1231 - 1232 - *n_entries = 0; 1233 - return NULL; 928 + if (intel_crtc_has_type(crtc_state, INTEL_OUTPUT_HDMI)) 929 + return intel_get_buf_trans(&skl_ddi_translations_hdmi, n_entries); 930 + else if (intel_crtc_has_type(crtc_state, INTEL_OUTPUT_EDP) && 931 + i915->vbt.edp.low_vswing) 932 + return _skl_get_buf_trans_dp(encoder, &skl_ddi_translations_edp, n_entries); 933 + else 934 + return _skl_get_buf_trans_dp(encoder, &skl_ddi_translations_dp, n_entries); 1234 935 } 1235 936 1236 - static const struct bxt_ddi_buf_trans * 1237 - bxt_get_buf_trans_dp(struct intel_encoder *encoder, int *n_entries) 937 + static const struct intel_ddi_buf_trans * 938 + kbl_y_get_buf_trans(struct intel_encoder *encoder, 939 + const struct intel_crtc_state *crtc_state, 940 + int *n_entries) 1238 941 { 1239 - *n_entries = ARRAY_SIZE(bxt_ddi_translations_dp); 1240 - return bxt_ddi_translations_dp; 942 + struct drm_i915_private *i915 = to_i915(encoder->base.dev); 943 + 944 + if (intel_crtc_has_type(crtc_state, INTEL_OUTPUT_HDMI)) 945 + return intel_get_buf_trans(&skl_y_ddi_translations_hdmi, n_entries); 946 + else if (intel_crtc_has_type(crtc_state, INTEL_OUTPUT_EDP) && 947 + i915->vbt.edp.low_vswing) 948 + return _skl_get_buf_trans_dp(encoder, &skl_y_ddi_translations_edp, n_entries); 949 + else 950 + return _skl_get_buf_trans_dp(encoder, &kbl_y_ddi_translations_dp, n_entries); 1241 951 } 1242 952 1243 - static const struct bxt_ddi_buf_trans * 1244 - bxt_get_buf_trans_edp(struct intel_encoder *encoder, int *n_entries) 953 + static const struct intel_ddi_buf_trans * 954 + kbl_u_get_buf_trans(struct intel_encoder *encoder, 955 + const struct intel_crtc_state *crtc_state, 956 + int *n_entries) 1245 957 { 1246 - struct drm_i915_private *dev_priv = to_i915(encoder->base.dev); 958 + struct drm_i915_private *i915 = to_i915(encoder->base.dev); 1247 959 1248 - if (dev_priv->vbt.edp.low_vswing) { 1249 - *n_entries = ARRAY_SIZE(bxt_ddi_translations_edp); 1250 - return bxt_ddi_translations_edp; 1251 - } 1252 - 1253 - return bxt_get_buf_trans_dp(encoder, n_entries); 960 + if (intel_crtc_has_type(crtc_state, INTEL_OUTPUT_HDMI)) 961 + return intel_get_buf_trans(&skl_ddi_translations_hdmi, n_entries); 962 + else if (intel_crtc_has_type(crtc_state, INTEL_OUTPUT_EDP) && 963 + i915->vbt.edp.low_vswing) 964 + return _skl_get_buf_trans_dp(encoder, &skl_u_ddi_translations_edp, n_entries); 965 + else 966 + return _skl_get_buf_trans_dp(encoder, &kbl_u_ddi_translations_dp, n_entries); 1254 967 } 1255 968 1256 - static const struct bxt_ddi_buf_trans * 1257 - bxt_get_buf_trans_hdmi(struct intel_encoder *encoder, int *n_entries) 969 + static const struct intel_ddi_buf_trans * 970 + kbl_get_buf_trans(struct intel_encoder *encoder, 971 + const struct intel_crtc_state *crtc_state, 972 + int *n_entries) 1258 973 { 1259 - *n_entries = ARRAY_SIZE(bxt_ddi_translations_hdmi); 1260 - return bxt_ddi_translations_hdmi; 974 + struct drm_i915_private *i915 = to_i915(encoder->base.dev); 975 + 976 + if (intel_crtc_has_type(crtc_state, INTEL_OUTPUT_HDMI)) 977 + return intel_get_buf_trans(&skl_ddi_translations_hdmi, n_entries); 978 + else if (intel_crtc_has_type(crtc_state, INTEL_OUTPUT_EDP) && 979 + i915->vbt.edp.low_vswing) 980 + return _skl_get_buf_trans_dp(encoder, &skl_ddi_translations_edp, n_entries); 981 + else 982 + return _skl_get_buf_trans_dp(encoder, &kbl_ddi_translations_dp, n_entries); 1261 983 } 1262 984 1263 - const struct bxt_ddi_buf_trans * 985 + static const struct intel_ddi_buf_trans * 1264 986 bxt_get_buf_trans(struct intel_encoder *encoder, 1265 987 const struct intel_crtc_state *crtc_state, 1266 988 int *n_entries) 1267 989 { 990 + struct drm_i915_private *i915 = to_i915(encoder->base.dev); 991 + 1268 992 if (intel_crtc_has_type(crtc_state, INTEL_OUTPUT_HDMI)) 1269 - return bxt_get_buf_trans_hdmi(encoder, n_entries); 1270 - if (intel_crtc_has_type(crtc_state, INTEL_OUTPUT_EDP)) 1271 - return bxt_get_buf_trans_edp(encoder, n_entries); 1272 - return bxt_get_buf_trans_dp(encoder, n_entries); 993 + return intel_get_buf_trans(&bxt_ddi_translations_hdmi, n_entries); 994 + else if (intel_crtc_has_type(crtc_state, INTEL_OUTPUT_EDP) && 995 + i915->vbt.edp.low_vswing) 996 + return intel_get_buf_trans(&bxt_ddi_translations_edp, n_entries); 997 + else 998 + return intel_get_buf_trans(&bxt_ddi_translations_dp, n_entries); 1273 999 } 1274 1000 1275 - static const struct cnl_ddi_buf_trans * 1001 + static const struct intel_ddi_buf_trans * 1276 1002 cnl_get_buf_trans_hdmi(struct intel_encoder *encoder, int *n_entries) 1277 1003 { 1278 1004 struct drm_i915_private *dev_priv = to_i915(encoder->base.dev); 1279 1005 u32 voltage = intel_de_read(dev_priv, CNL_PORT_COMP_DW3) & VOLTAGE_INFO_MASK; 1280 1006 1281 1007 if (voltage == VOLTAGE_INFO_0_85V) { 1282 - *n_entries = ARRAY_SIZE(cnl_ddi_translations_hdmi_0_85V); 1283 - return cnl_ddi_translations_hdmi_0_85V; 1008 + return intel_get_buf_trans(&cnl_ddi_translations_hdmi_0_85V, 1009 + n_entries); 1284 1010 } else if (voltage == VOLTAGE_INFO_0_95V) { 1285 - *n_entries = ARRAY_SIZE(cnl_ddi_translations_hdmi_0_95V); 1286 - return cnl_ddi_translations_hdmi_0_95V; 1011 + return intel_get_buf_trans(&cnl_ddi_translations_hdmi_0_95V, 1012 + n_entries); 1287 1013 } else if (voltage == VOLTAGE_INFO_1_05V) { 1288 - *n_entries = ARRAY_SIZE(cnl_ddi_translations_hdmi_1_05V); 1289 - return cnl_ddi_translations_hdmi_1_05V; 1014 + return intel_get_buf_trans(&cnl_ddi_translations_hdmi_1_05V, 1015 + n_entries); 1290 1016 } else { 1291 1017 *n_entries = 1; /* shut up gcc */ 1292 1018 MISSING_CASE(voltage); ··· 1291 1023 return NULL; 1292 1024 } 1293 1025 1294 - static const struct cnl_ddi_buf_trans * 1026 + static const struct intel_ddi_buf_trans * 1295 1027 cnl_get_buf_trans_dp(struct intel_encoder *encoder, int *n_entries) 1296 1028 { 1297 1029 struct drm_i915_private *dev_priv = to_i915(encoder->base.dev); 1298 1030 u32 voltage = intel_de_read(dev_priv, CNL_PORT_COMP_DW3) & VOLTAGE_INFO_MASK; 1299 1031 1300 1032 if (voltage == VOLTAGE_INFO_0_85V) { 1301 - *n_entries = ARRAY_SIZE(cnl_ddi_translations_dp_0_85V); 1302 - return cnl_ddi_translations_dp_0_85V; 1033 + return intel_get_buf_trans(&cnl_ddi_translations_dp_0_85V, 1034 + n_entries); 1303 1035 } else if (voltage == VOLTAGE_INFO_0_95V) { 1304 - *n_entries = ARRAY_SIZE(cnl_ddi_translations_dp_0_95V); 1305 - return cnl_ddi_translations_dp_0_95V; 1036 + return intel_get_buf_trans(&cnl_ddi_translations_dp_0_95V, 1037 + n_entries); 1306 1038 } else if (voltage == VOLTAGE_INFO_1_05V) { 1307 - *n_entries = ARRAY_SIZE(cnl_ddi_translations_dp_1_05V); 1308 - return cnl_ddi_translations_dp_1_05V; 1039 + return intel_get_buf_trans(&cnl_ddi_translations_dp_1_05V, 1040 + n_entries); 1309 1041 } else { 1310 1042 *n_entries = 1; /* shut up gcc */ 1311 1043 MISSING_CASE(voltage); ··· 1313 1045 return NULL; 1314 1046 } 1315 1047 1316 - static const struct cnl_ddi_buf_trans * 1048 + static const struct intel_ddi_buf_trans * 1317 1049 cnl_get_buf_trans_edp(struct intel_encoder *encoder, int *n_entries) 1318 1050 { 1319 1051 struct drm_i915_private *dev_priv = to_i915(encoder->base.dev); ··· 1321 1053 1322 1054 if (dev_priv->vbt.edp.low_vswing) { 1323 1055 if (voltage == VOLTAGE_INFO_0_85V) { 1324 - *n_entries = ARRAY_SIZE(cnl_ddi_translations_edp_0_85V); 1325 - return cnl_ddi_translations_edp_0_85V; 1056 + return intel_get_buf_trans(&cnl_ddi_translations_edp_0_85V, 1057 + n_entries); 1326 1058 } else if (voltage == VOLTAGE_INFO_0_95V) { 1327 - *n_entries = ARRAY_SIZE(cnl_ddi_translations_edp_0_95V); 1328 - return cnl_ddi_translations_edp_0_95V; 1059 + return intel_get_buf_trans(&cnl_ddi_translations_edp_0_95V, 1060 + n_entries); 1329 1061 } else if (voltage == VOLTAGE_INFO_1_05V) { 1330 - *n_entries = ARRAY_SIZE(cnl_ddi_translations_edp_1_05V); 1331 - return cnl_ddi_translations_edp_1_05V; 1062 + return intel_get_buf_trans(&cnl_ddi_translations_edp_1_05V, 1063 + n_entries); 1332 1064 } else { 1333 1065 *n_entries = 1; /* shut up gcc */ 1334 1066 MISSING_CASE(voltage); ··· 1339 1071 } 1340 1072 } 1341 1073 1342 - const struct cnl_ddi_buf_trans * 1074 + static const struct intel_ddi_buf_trans * 1343 1075 cnl_get_buf_trans(struct intel_encoder *encoder, 1344 1076 const struct intel_crtc_state *crtc_state, 1345 1077 int *n_entries) ··· 1351 1083 return cnl_get_buf_trans_dp(encoder, n_entries); 1352 1084 } 1353 1085 1354 - static const struct cnl_ddi_buf_trans * 1355 - icl_get_combo_buf_trans_hdmi(struct intel_encoder *encoder, 1356 - const struct intel_crtc_state *crtc_state, 1357 - int *n_entries) 1358 - { 1359 - *n_entries = ARRAY_SIZE(icl_combo_phy_ddi_translations_hdmi); 1360 - return icl_combo_phy_ddi_translations_hdmi; 1361 - } 1362 - 1363 - static const struct cnl_ddi_buf_trans * 1086 + static const struct intel_ddi_buf_trans * 1364 1087 icl_get_combo_buf_trans_dp(struct intel_encoder *encoder, 1365 1088 const struct intel_crtc_state *crtc_state, 1366 1089 int *n_entries) 1367 1090 { 1368 - *n_entries = ARRAY_SIZE(icl_combo_phy_ddi_translations_dp_hbr2); 1369 - return icl_combo_phy_ddi_translations_dp_hbr2; 1091 + return intel_get_buf_trans(&icl_combo_phy_ddi_translations_dp_hbr2_edp_hbr3, 1092 + n_entries); 1370 1093 } 1371 1094 1372 - static const struct cnl_ddi_buf_trans * 1095 + static const struct intel_ddi_buf_trans * 1373 1096 icl_get_combo_buf_trans_edp(struct intel_encoder *encoder, 1374 1097 const struct intel_crtc_state *crtc_state, 1375 1098 int *n_entries) ··· 1368 1109 struct drm_i915_private *dev_priv = to_i915(encoder->base.dev); 1369 1110 1370 1111 if (crtc_state->port_clock > 540000) { 1371 - *n_entries = ARRAY_SIZE(icl_combo_phy_ddi_translations_edp_hbr3); 1372 - return icl_combo_phy_ddi_translations_edp_hbr3; 1112 + return intel_get_buf_trans(&icl_combo_phy_ddi_translations_dp_hbr2_edp_hbr3, 1113 + n_entries); 1373 1114 } else if (dev_priv->vbt.edp.low_vswing) { 1374 - *n_entries = ARRAY_SIZE(icl_combo_phy_ddi_translations_edp_hbr2); 1375 - return icl_combo_phy_ddi_translations_edp_hbr2; 1376 - } else if (IS_DG1(dev_priv) && crtc_state->port_clock > 270000) { 1377 - *n_entries = ARRAY_SIZE(dg1_combo_phy_ddi_translations_dp_hbr2_hbr3); 1378 - return dg1_combo_phy_ddi_translations_dp_hbr2_hbr3; 1379 - } else if (IS_DG1(dev_priv)) { 1380 - *n_entries = ARRAY_SIZE(dg1_combo_phy_ddi_translations_dp_rbr_hbr); 1381 - return dg1_combo_phy_ddi_translations_dp_rbr_hbr; 1115 + return intel_get_buf_trans(&icl_combo_phy_ddi_translations_edp_hbr2, 1116 + n_entries); 1382 1117 } 1383 1118 1384 1119 return icl_get_combo_buf_trans_dp(encoder, crtc_state, n_entries); 1385 1120 } 1386 1121 1387 - const struct cnl_ddi_buf_trans * 1122 + static const struct intel_ddi_buf_trans * 1388 1123 icl_get_combo_buf_trans(struct intel_encoder *encoder, 1389 1124 const struct intel_crtc_state *crtc_state, 1390 1125 int *n_entries) 1391 1126 { 1392 1127 if (intel_crtc_has_type(crtc_state, INTEL_OUTPUT_HDMI)) 1393 - return icl_get_combo_buf_trans_hdmi(encoder, crtc_state, n_entries); 1128 + return intel_get_buf_trans(&icl_combo_phy_ddi_translations_hdmi, n_entries); 1394 1129 else if (intel_crtc_has_type(crtc_state, INTEL_OUTPUT_EDP)) 1395 1130 return icl_get_combo_buf_trans_edp(encoder, crtc_state, n_entries); 1396 1131 else 1397 1132 return icl_get_combo_buf_trans_dp(encoder, crtc_state, n_entries); 1398 1133 } 1399 1134 1400 - static const struct icl_mg_phy_ddi_buf_trans * 1401 - icl_get_mg_buf_trans_hdmi(struct intel_encoder *encoder, 1402 - const struct intel_crtc_state *crtc_state, 1403 - int *n_entries) 1404 - { 1405 - *n_entries = ARRAY_SIZE(icl_mg_phy_ddi_translations_hdmi); 1406 - return icl_mg_phy_ddi_translations_hdmi; 1407 - } 1408 - 1409 - static const struct icl_mg_phy_ddi_buf_trans * 1135 + static const struct intel_ddi_buf_trans * 1410 1136 icl_get_mg_buf_trans_dp(struct intel_encoder *encoder, 1411 1137 const struct intel_crtc_state *crtc_state, 1412 1138 int *n_entries) 1413 1139 { 1414 1140 if (crtc_state->port_clock > 270000) { 1415 - *n_entries = ARRAY_SIZE(icl_mg_phy_ddi_translations_hbr2_hbr3); 1416 - return icl_mg_phy_ddi_translations_hbr2_hbr3; 1141 + return intel_get_buf_trans(&icl_mg_phy_ddi_translations_hbr2_hbr3, 1142 + n_entries); 1417 1143 } else { 1418 - *n_entries = ARRAY_SIZE(icl_mg_phy_ddi_translations_rbr_hbr); 1419 - return icl_mg_phy_ddi_translations_rbr_hbr; 1144 + return intel_get_buf_trans(&icl_mg_phy_ddi_translations_rbr_hbr, 1145 + n_entries); 1420 1146 } 1421 1147 } 1422 1148 1423 - const struct icl_mg_phy_ddi_buf_trans * 1149 + static const struct intel_ddi_buf_trans * 1424 1150 icl_get_mg_buf_trans(struct intel_encoder *encoder, 1425 1151 const struct intel_crtc_state *crtc_state, 1426 1152 int *n_entries) 1427 1153 { 1428 1154 if (intel_crtc_has_type(crtc_state, INTEL_OUTPUT_HDMI)) 1429 - return icl_get_mg_buf_trans_hdmi(encoder, crtc_state, n_entries); 1155 + return intel_get_buf_trans(&icl_mg_phy_ddi_translations_hdmi, n_entries); 1430 1156 else 1431 1157 return icl_get_mg_buf_trans_dp(encoder, crtc_state, n_entries); 1432 1158 } 1433 1159 1434 - static const struct cnl_ddi_buf_trans * 1435 - ehl_get_combo_buf_trans_hdmi(struct intel_encoder *encoder, 1436 - const struct intel_crtc_state *crtc_state, 1437 - int *n_entries) 1438 - { 1439 - *n_entries = ARRAY_SIZE(icl_combo_phy_ddi_translations_hdmi); 1440 - return icl_combo_phy_ddi_translations_hdmi; 1441 - } 1442 - 1443 - static const struct cnl_ddi_buf_trans * 1444 - ehl_get_combo_buf_trans_dp(struct intel_encoder *encoder, 1445 - const struct intel_crtc_state *crtc_state, 1446 - int *n_entries) 1447 - { 1448 - *n_entries = ARRAY_SIZE(ehl_combo_phy_ddi_translations_dp); 1449 - return ehl_combo_phy_ddi_translations_dp; 1450 - } 1451 - 1452 - static const struct cnl_ddi_buf_trans * 1160 + static const struct intel_ddi_buf_trans * 1453 1161 ehl_get_combo_buf_trans_edp(struct intel_encoder *encoder, 1454 1162 const struct intel_crtc_state *crtc_state, 1455 1163 int *n_entries) 1456 1164 { 1457 - struct drm_i915_private *dev_priv = to_i915(encoder->base.dev); 1458 - 1459 - if (dev_priv->vbt.edp.low_vswing) { 1460 - *n_entries = ARRAY_SIZE(icl_combo_phy_ddi_translations_edp_hbr2); 1461 - return icl_combo_phy_ddi_translations_edp_hbr2; 1462 - } 1463 - 1464 - return ehl_get_combo_buf_trans_dp(encoder, crtc_state, n_entries); 1165 + if (crtc_state->port_clock > 270000) 1166 + return intel_get_buf_trans(&ehl_combo_phy_ddi_translations_edp_hbr2, n_entries); 1167 + else 1168 + return intel_get_buf_trans(&icl_combo_phy_ddi_translations_edp_hbr2, n_entries); 1465 1169 } 1466 1170 1467 - const struct cnl_ddi_buf_trans * 1171 + static const struct intel_ddi_buf_trans * 1468 1172 ehl_get_combo_buf_trans(struct intel_encoder *encoder, 1469 1173 const struct intel_crtc_state *crtc_state, 1470 1174 int *n_entries) 1471 1175 { 1176 + struct drm_i915_private *dev_priv = to_i915(encoder->base.dev); 1177 + 1472 1178 if (intel_crtc_has_type(crtc_state, INTEL_OUTPUT_HDMI)) 1473 - return ehl_get_combo_buf_trans_hdmi(encoder, crtc_state, n_entries); 1474 - else if (intel_crtc_has_type(crtc_state, INTEL_OUTPUT_EDP)) 1179 + return intel_get_buf_trans(&icl_combo_phy_ddi_translations_hdmi, n_entries); 1180 + else if (intel_crtc_has_type(crtc_state, INTEL_OUTPUT_EDP) && 1181 + dev_priv->vbt.edp.low_vswing) 1475 1182 return ehl_get_combo_buf_trans_edp(encoder, crtc_state, n_entries); 1476 1183 else 1477 - return ehl_get_combo_buf_trans_dp(encoder, crtc_state, n_entries); 1184 + return intel_get_buf_trans(&ehl_combo_phy_ddi_translations_dp, n_entries); 1478 1185 } 1479 1186 1480 - static const struct cnl_ddi_buf_trans * 1481 - jsl_get_combo_buf_trans_hdmi(struct intel_encoder *encoder, 1482 - const struct intel_crtc_state *crtc_state, 1483 - int *n_entries) 1484 - { 1485 - *n_entries = ARRAY_SIZE(icl_combo_phy_ddi_translations_hdmi); 1486 - return icl_combo_phy_ddi_translations_hdmi; 1487 - } 1488 - 1489 - static const struct cnl_ddi_buf_trans * 1490 - jsl_get_combo_buf_trans_dp(struct intel_encoder *encoder, 1491 - const struct intel_crtc_state *crtc_state, 1492 - int *n_entries) 1493 - { 1494 - *n_entries = ARRAY_SIZE(icl_combo_phy_ddi_translations_dp_hbr2); 1495 - return icl_combo_phy_ddi_translations_dp_hbr2; 1496 - } 1497 - 1498 - static const struct cnl_ddi_buf_trans * 1187 + static const struct intel_ddi_buf_trans * 1499 1188 jsl_get_combo_buf_trans_edp(struct intel_encoder *encoder, 1500 1189 const struct intel_crtc_state *crtc_state, 1501 1190 int *n_entries) 1502 1191 { 1503 - struct drm_i915_private *dev_priv = to_i915(encoder->base.dev); 1504 - 1505 - if (dev_priv->vbt.edp.low_vswing) { 1506 - if (crtc_state->port_clock > 270000) { 1507 - *n_entries = ARRAY_SIZE(jsl_combo_phy_ddi_translations_edp_hbr2); 1508 - return jsl_combo_phy_ddi_translations_edp_hbr2; 1509 - } else { 1510 - *n_entries = ARRAY_SIZE(jsl_combo_phy_ddi_translations_edp_hbr); 1511 - return jsl_combo_phy_ddi_translations_edp_hbr; 1512 - } 1513 - } 1514 - 1515 - return jsl_get_combo_buf_trans_dp(encoder, crtc_state, n_entries); 1192 + if (crtc_state->port_clock > 270000) 1193 + return intel_get_buf_trans(&jsl_combo_phy_ddi_translations_edp_hbr2, n_entries); 1194 + else 1195 + return intel_get_buf_trans(&jsl_combo_phy_ddi_translations_edp_hbr, n_entries); 1516 1196 } 1517 1197 1518 - const struct cnl_ddi_buf_trans * 1198 + static const struct intel_ddi_buf_trans * 1519 1199 jsl_get_combo_buf_trans(struct intel_encoder *encoder, 1520 1200 const struct intel_crtc_state *crtc_state, 1521 1201 int *n_entries) 1522 1202 { 1203 + struct drm_i915_private *dev_priv = to_i915(encoder->base.dev); 1204 + 1523 1205 if (intel_crtc_has_type(crtc_state, INTEL_OUTPUT_HDMI)) 1524 - return jsl_get_combo_buf_trans_hdmi(encoder, crtc_state, n_entries); 1525 - else if (intel_crtc_has_type(crtc_state, INTEL_OUTPUT_EDP)) 1206 + return intel_get_buf_trans(&icl_combo_phy_ddi_translations_hdmi, n_entries); 1207 + else if (intel_crtc_has_type(crtc_state, INTEL_OUTPUT_EDP) && 1208 + dev_priv->vbt.edp.low_vswing) 1526 1209 return jsl_get_combo_buf_trans_edp(encoder, crtc_state, n_entries); 1527 1210 else 1528 - return jsl_get_combo_buf_trans_dp(encoder, crtc_state, n_entries); 1211 + return intel_get_buf_trans(&icl_combo_phy_ddi_translations_dp_hbr2_edp_hbr3, n_entries); 1529 1212 } 1530 1213 1531 - static const struct cnl_ddi_buf_trans * 1532 - tgl_get_combo_buf_trans_hdmi(struct intel_encoder *encoder, 1533 - const struct intel_crtc_state *crtc_state, 1534 - int *n_entries) 1535 - { 1536 - *n_entries = ARRAY_SIZE(icl_combo_phy_ddi_translations_hdmi); 1537 - return icl_combo_phy_ddi_translations_hdmi; 1538 - } 1539 - 1540 - static const struct cnl_ddi_buf_trans * 1214 + static const struct intel_ddi_buf_trans * 1541 1215 tgl_get_combo_buf_trans_dp(struct intel_encoder *encoder, 1542 1216 const struct intel_crtc_state *crtc_state, 1543 1217 int *n_entries) ··· 1478 1286 struct drm_i915_private *dev_priv = to_i915(encoder->base.dev); 1479 1287 1480 1288 if (crtc_state->port_clock > 270000) { 1481 - if (IS_ROCKETLAKE(dev_priv)) { 1482 - *n_entries = ARRAY_SIZE(rkl_combo_phy_ddi_translations_dp_hbr2_hbr3); 1483 - return rkl_combo_phy_ddi_translations_dp_hbr2_hbr3; 1484 - } else if (IS_TGL_U(dev_priv) || IS_TGL_Y(dev_priv)) { 1485 - *n_entries = ARRAY_SIZE(tgl_uy_combo_phy_ddi_translations_dp_hbr2); 1486 - return tgl_uy_combo_phy_ddi_translations_dp_hbr2; 1289 + if (IS_TGL_U(dev_priv) || IS_TGL_Y(dev_priv)) { 1290 + return intel_get_buf_trans(&tgl_uy_combo_phy_ddi_translations_dp_hbr2, 1291 + n_entries); 1487 1292 } else { 1488 - *n_entries = ARRAY_SIZE(tgl_combo_phy_ddi_translations_dp_hbr2); 1489 - return tgl_combo_phy_ddi_translations_dp_hbr2; 1293 + return intel_get_buf_trans(&tgl_combo_phy_ddi_translations_dp_hbr2, 1294 + n_entries); 1490 1295 } 1491 1296 } else { 1492 - if (IS_ROCKETLAKE(dev_priv)) { 1493 - *n_entries = ARRAY_SIZE(rkl_combo_phy_ddi_translations_dp_hbr); 1494 - return rkl_combo_phy_ddi_translations_dp_hbr; 1495 - } else { 1496 - *n_entries = ARRAY_SIZE(tgl_combo_phy_ddi_translations_dp_hbr); 1497 - return tgl_combo_phy_ddi_translations_dp_hbr; 1498 - } 1297 + return intel_get_buf_trans(&tgl_combo_phy_ddi_translations_dp_hbr, 1298 + n_entries); 1499 1299 } 1500 1300 } 1501 1301 1502 - static const struct cnl_ddi_buf_trans * 1302 + static const struct intel_ddi_buf_trans * 1503 1303 tgl_get_combo_buf_trans_edp(struct intel_encoder *encoder, 1504 1304 const struct intel_crtc_state *crtc_state, 1505 1305 int *n_entries) ··· 1500 1316 struct intel_dp *intel_dp = enc_to_intel_dp(encoder); 1501 1317 1502 1318 if (crtc_state->port_clock > 540000) { 1503 - *n_entries = ARRAY_SIZE(icl_combo_phy_ddi_translations_edp_hbr3); 1504 - return icl_combo_phy_ddi_translations_edp_hbr3; 1319 + return intel_get_buf_trans(&icl_combo_phy_ddi_translations_dp_hbr2_edp_hbr3, 1320 + n_entries); 1505 1321 } else if (dev_priv->vbt.edp.hobl && !intel_dp->hobl_failed) { 1506 - *n_entries = ARRAY_SIZE(tgl_combo_phy_ddi_translations_edp_hbr2_hobl); 1507 - return tgl_combo_phy_ddi_translations_edp_hbr2_hobl; 1322 + return intel_get_buf_trans(&tgl_combo_phy_ddi_translations_edp_hbr2_hobl, 1323 + n_entries); 1508 1324 } else if (dev_priv->vbt.edp.low_vswing) { 1509 - *n_entries = ARRAY_SIZE(icl_combo_phy_ddi_translations_edp_hbr2); 1510 - return icl_combo_phy_ddi_translations_edp_hbr2; 1325 + return intel_get_buf_trans(&icl_combo_phy_ddi_translations_edp_hbr2, 1326 + n_entries); 1511 1327 } 1512 1328 1513 1329 return tgl_get_combo_buf_trans_dp(encoder, crtc_state, n_entries); 1514 1330 } 1515 1331 1516 - const struct cnl_ddi_buf_trans * 1332 + static const struct intel_ddi_buf_trans * 1517 1333 tgl_get_combo_buf_trans(struct intel_encoder *encoder, 1518 1334 const struct intel_crtc_state *crtc_state, 1519 1335 int *n_entries) 1520 1336 { 1521 1337 if (intel_crtc_has_type(crtc_state, INTEL_OUTPUT_HDMI)) 1522 - return tgl_get_combo_buf_trans_hdmi(encoder, crtc_state, n_entries); 1338 + return intel_get_buf_trans(&icl_combo_phy_ddi_translations_hdmi, n_entries); 1523 1339 else if (intel_crtc_has_type(crtc_state, INTEL_OUTPUT_EDP)) 1524 1340 return tgl_get_combo_buf_trans_edp(encoder, crtc_state, n_entries); 1525 1341 else 1526 1342 return tgl_get_combo_buf_trans_dp(encoder, crtc_state, n_entries); 1527 1343 } 1528 1344 1529 - static const struct tgl_dkl_phy_ddi_buf_trans * 1530 - tgl_get_dkl_buf_trans_hdmi(struct intel_encoder *encoder, 1345 + static const struct intel_ddi_buf_trans * 1346 + dg1_get_combo_buf_trans_dp(struct intel_encoder *encoder, 1531 1347 const struct intel_crtc_state *crtc_state, 1532 1348 int *n_entries) 1533 1349 { 1534 - *n_entries = ARRAY_SIZE(tgl_dkl_phy_hdmi_ddi_trans); 1535 - return tgl_dkl_phy_hdmi_ddi_trans; 1350 + if (crtc_state->port_clock > 270000) 1351 + return intel_get_buf_trans(&dg1_combo_phy_ddi_translations_dp_hbr2_hbr3, 1352 + n_entries); 1353 + else 1354 + return intel_get_buf_trans(&dg1_combo_phy_ddi_translations_dp_rbr_hbr, 1355 + n_entries); 1536 1356 } 1537 1357 1538 - static const struct tgl_dkl_phy_ddi_buf_trans * 1358 + static const struct intel_ddi_buf_trans * 1359 + dg1_get_combo_buf_trans_edp(struct intel_encoder *encoder, 1360 + const struct intel_crtc_state *crtc_state, 1361 + int *n_entries) 1362 + { 1363 + struct drm_i915_private *dev_priv = to_i915(encoder->base.dev); 1364 + struct intel_dp *intel_dp = enc_to_intel_dp(encoder); 1365 + 1366 + if (crtc_state->port_clock > 540000) 1367 + return intel_get_buf_trans(&icl_combo_phy_ddi_translations_dp_hbr2_edp_hbr3, 1368 + n_entries); 1369 + else if (dev_priv->vbt.edp.hobl && !intel_dp->hobl_failed) 1370 + return intel_get_buf_trans(&tgl_combo_phy_ddi_translations_edp_hbr2_hobl, 1371 + n_entries); 1372 + else if (dev_priv->vbt.edp.low_vswing) 1373 + return intel_get_buf_trans(&icl_combo_phy_ddi_translations_edp_hbr2, 1374 + n_entries); 1375 + else 1376 + return dg1_get_combo_buf_trans_dp(encoder, crtc_state, n_entries); 1377 + } 1378 + 1379 + static const struct intel_ddi_buf_trans * 1380 + dg1_get_combo_buf_trans(struct intel_encoder *encoder, 1381 + const struct intel_crtc_state *crtc_state, 1382 + int *n_entries) 1383 + { 1384 + if (intel_crtc_has_type(crtc_state, INTEL_OUTPUT_HDMI)) 1385 + return intel_get_buf_trans(&icl_combo_phy_ddi_translations_hdmi, n_entries); 1386 + else if (intel_crtc_has_type(crtc_state, INTEL_OUTPUT_EDP)) 1387 + return dg1_get_combo_buf_trans_edp(encoder, crtc_state, n_entries); 1388 + else 1389 + return dg1_get_combo_buf_trans_dp(encoder, crtc_state, n_entries); 1390 + } 1391 + 1392 + static const struct intel_ddi_buf_trans * 1393 + rkl_get_combo_buf_trans_dp(struct intel_encoder *encoder, 1394 + const struct intel_crtc_state *crtc_state, 1395 + int *n_entries) 1396 + { 1397 + if (crtc_state->port_clock > 270000) 1398 + return intel_get_buf_trans(&rkl_combo_phy_ddi_translations_dp_hbr2_hbr3, n_entries); 1399 + else 1400 + return intel_get_buf_trans(&rkl_combo_phy_ddi_translations_dp_hbr, n_entries); 1401 + } 1402 + 1403 + static const struct intel_ddi_buf_trans * 1404 + rkl_get_combo_buf_trans_edp(struct intel_encoder *encoder, 1405 + const struct intel_crtc_state *crtc_state, 1406 + int *n_entries) 1407 + { 1408 + struct drm_i915_private *dev_priv = to_i915(encoder->base.dev); 1409 + struct intel_dp *intel_dp = enc_to_intel_dp(encoder); 1410 + 1411 + if (crtc_state->port_clock > 540000) { 1412 + return intel_get_buf_trans(&icl_combo_phy_ddi_translations_dp_hbr2_edp_hbr3, 1413 + n_entries); 1414 + } else if (dev_priv->vbt.edp.hobl && !intel_dp->hobl_failed) { 1415 + return intel_get_buf_trans(&tgl_combo_phy_ddi_translations_edp_hbr2_hobl, 1416 + n_entries); 1417 + } else if (dev_priv->vbt.edp.low_vswing) { 1418 + return intel_get_buf_trans(&icl_combo_phy_ddi_translations_edp_hbr2, 1419 + n_entries); 1420 + } 1421 + 1422 + return rkl_get_combo_buf_trans_dp(encoder, crtc_state, n_entries); 1423 + } 1424 + 1425 + static const struct intel_ddi_buf_trans * 1426 + rkl_get_combo_buf_trans(struct intel_encoder *encoder, 1427 + const struct intel_crtc_state *crtc_state, 1428 + int *n_entries) 1429 + { 1430 + if (intel_crtc_has_type(crtc_state, INTEL_OUTPUT_HDMI)) 1431 + return intel_get_buf_trans(&icl_combo_phy_ddi_translations_hdmi, n_entries); 1432 + else if (intel_crtc_has_type(crtc_state, INTEL_OUTPUT_EDP)) 1433 + return rkl_get_combo_buf_trans_edp(encoder, crtc_state, n_entries); 1434 + else 1435 + return rkl_get_combo_buf_trans_dp(encoder, crtc_state, n_entries); 1436 + } 1437 + 1438 + static const struct intel_ddi_buf_trans * 1439 + adls_get_combo_buf_trans_dp(struct intel_encoder *encoder, 1440 + const struct intel_crtc_state *crtc_state, 1441 + int *n_entries) 1442 + { 1443 + if (crtc_state->port_clock > 270000) 1444 + return intel_get_buf_trans(&adls_combo_phy_ddi_translations_dp_hbr2_hbr3, n_entries); 1445 + else 1446 + return intel_get_buf_trans(&tgl_combo_phy_ddi_translations_dp_hbr, n_entries); 1447 + } 1448 + 1449 + static const struct intel_ddi_buf_trans * 1450 + adls_get_combo_buf_trans_edp(struct intel_encoder *encoder, 1451 + const struct intel_crtc_state *crtc_state, 1452 + int *n_entries) 1453 + { 1454 + struct drm_i915_private *i915 = to_i915(encoder->base.dev); 1455 + struct intel_dp *intel_dp = enc_to_intel_dp(encoder); 1456 + 1457 + if (crtc_state->port_clock > 540000) 1458 + return intel_get_buf_trans(&adls_combo_phy_ddi_translations_edp_hbr3, n_entries); 1459 + else if (i915->vbt.edp.hobl && !intel_dp->hobl_failed) 1460 + return intel_get_buf_trans(&tgl_combo_phy_ddi_translations_edp_hbr2_hobl, n_entries); 1461 + else if (i915->vbt.edp.low_vswing) 1462 + return intel_get_buf_trans(&adls_combo_phy_ddi_translations_edp_hbr2, n_entries); 1463 + else 1464 + return adls_get_combo_buf_trans_dp(encoder, crtc_state, n_entries); 1465 + } 1466 + 1467 + static const struct intel_ddi_buf_trans * 1468 + adls_get_combo_buf_trans(struct intel_encoder *encoder, 1469 + const struct intel_crtc_state *crtc_state, 1470 + int *n_entries) 1471 + { 1472 + if (intel_crtc_has_type(crtc_state, INTEL_OUTPUT_HDMI)) 1473 + return intel_get_buf_trans(&icl_combo_phy_ddi_translations_hdmi, n_entries); 1474 + else if (intel_crtc_has_type(crtc_state, INTEL_OUTPUT_EDP)) 1475 + return adls_get_combo_buf_trans_edp(encoder, crtc_state, n_entries); 1476 + else 1477 + return adls_get_combo_buf_trans_dp(encoder, crtc_state, n_entries); 1478 + } 1479 + 1480 + static const struct intel_ddi_buf_trans * 1539 1481 tgl_get_dkl_buf_trans_dp(struct intel_encoder *encoder, 1540 1482 const struct intel_crtc_state *crtc_state, 1541 1483 int *n_entries) 1542 1484 { 1543 1485 if (crtc_state->port_clock > 270000) { 1544 - *n_entries = ARRAY_SIZE(tgl_dkl_phy_dp_ddi_trans_hbr2); 1545 - return tgl_dkl_phy_dp_ddi_trans_hbr2; 1486 + return intel_get_buf_trans(&tgl_dkl_phy_ddi_translations_dp_hbr2, 1487 + n_entries); 1546 1488 } else { 1547 - *n_entries = ARRAY_SIZE(tgl_dkl_phy_dp_ddi_trans); 1548 - return tgl_dkl_phy_dp_ddi_trans; 1489 + return intel_get_buf_trans(&tgl_dkl_phy_ddi_translations_dp_hbr, 1490 + n_entries); 1549 1491 } 1550 1492 } 1551 1493 1552 - const struct tgl_dkl_phy_ddi_buf_trans * 1494 + static const struct intel_ddi_buf_trans * 1553 1495 tgl_get_dkl_buf_trans(struct intel_encoder *encoder, 1554 1496 const struct intel_crtc_state *crtc_state, 1555 1497 int *n_entries) 1556 1498 { 1557 1499 if (intel_crtc_has_type(crtc_state, INTEL_OUTPUT_HDMI)) 1558 - return tgl_get_dkl_buf_trans_hdmi(encoder, crtc_state, n_entries); 1500 + return intel_get_buf_trans(&tgl_dkl_phy_ddi_translations_hdmi, n_entries); 1559 1501 else 1560 1502 return tgl_get_dkl_buf_trans_dp(encoder, crtc_state, n_entries); 1561 1503 } 1562 1504 1563 - static const struct tgl_dkl_phy_ddi_buf_trans * 1505 + static const struct intel_ddi_buf_trans * 1564 1506 adlp_get_dkl_buf_trans_dp(struct intel_encoder *encoder, 1565 1507 const struct intel_crtc_state *crtc_state, 1566 1508 int *n_entries) 1567 1509 { 1568 1510 if (crtc_state->port_clock > 270000) { 1569 - *n_entries = ARRAY_SIZE(adlp_dkl_phy_dp_ddi_trans_hbr2_hbr3); 1570 - return adlp_dkl_phy_dp_ddi_trans_hbr2_hbr3; 1511 + return intel_get_buf_trans(&adlp_dkl_phy_ddi_translations_dp_hbr2_hbr3, 1512 + n_entries); 1513 + } else { 1514 + return intel_get_buf_trans(&adlp_dkl_phy_ddi_translations_dp_hbr, 1515 + n_entries); 1571 1516 } 1572 - 1573 - *n_entries = ARRAY_SIZE(adlp_dkl_phy_dp_ddi_trans_hbr); 1574 - return adlp_dkl_phy_dp_ddi_trans_hbr; 1575 1517 } 1576 1518 1577 - const struct tgl_dkl_phy_ddi_buf_trans * 1519 + static const struct intel_ddi_buf_trans * 1578 1520 adlp_get_dkl_buf_trans(struct intel_encoder *encoder, 1579 1521 const struct intel_crtc_state *crtc_state, 1580 1522 int *n_entries) 1581 1523 { 1582 1524 if (intel_crtc_has_type(crtc_state, INTEL_OUTPUT_HDMI)) 1583 - return tgl_get_dkl_buf_trans_hdmi(encoder, crtc_state, n_entries); 1525 + return intel_get_buf_trans(&tgl_dkl_phy_ddi_translations_hdmi, n_entries); 1584 1526 else 1585 1527 return adlp_get_dkl_buf_trans_dp(encoder, crtc_state, n_entries); 1586 1528 } ··· 1716 1406 int *default_entry) 1717 1407 { 1718 1408 struct drm_i915_private *dev_priv = to_i915(encoder->base.dev); 1719 - enum phy phy = intel_port_to_phy(dev_priv, encoder->port); 1409 + const struct intel_ddi_buf_trans *ddi_translations; 1720 1410 int n_entries; 1721 1411 1722 - if (DISPLAY_VER(dev_priv) >= 12) { 1723 - if (intel_phy_is_combo(dev_priv, phy)) 1724 - tgl_get_combo_buf_trans_hdmi(encoder, crtc_state, &n_entries); 1725 - else 1726 - tgl_get_dkl_buf_trans_hdmi(encoder, crtc_state, &n_entries); 1727 - *default_entry = n_entries - 1; 1728 - } else if (DISPLAY_VER(dev_priv) == 11) { 1729 - if (intel_phy_is_combo(dev_priv, phy)) 1730 - icl_get_combo_buf_trans_hdmi(encoder, crtc_state, &n_entries); 1731 - else 1732 - icl_get_mg_buf_trans_hdmi(encoder, crtc_state, &n_entries); 1733 - *default_entry = n_entries - 1; 1734 - } else if (IS_CANNONLAKE(dev_priv)) { 1735 - cnl_get_buf_trans_hdmi(encoder, &n_entries); 1736 - *default_entry = n_entries - 1; 1737 - } else if (IS_GEMINILAKE(dev_priv) || IS_BROXTON(dev_priv)) { 1738 - bxt_get_buf_trans_hdmi(encoder, &n_entries); 1739 - *default_entry = n_entries - 1; 1740 - } else if (DISPLAY_VER(dev_priv) == 9) { 1741 - intel_ddi_get_buf_trans_hdmi(encoder, &n_entries); 1742 - *default_entry = 8; 1743 - } else if (IS_BROADWELL(dev_priv)) { 1744 - intel_ddi_get_buf_trans_hdmi(encoder, &n_entries); 1745 - *default_entry = 7; 1746 - } else if (IS_HASWELL(dev_priv)) { 1747 - intel_ddi_get_buf_trans_hdmi(encoder, &n_entries); 1748 - *default_entry = 6; 1749 - } else { 1750 - drm_WARN(&dev_priv->drm, 1, "ddi translation table missing\n"); 1412 + ddi_translations = encoder->get_buf_trans(encoder, crtc_state, &n_entries); 1413 + 1414 + if (drm_WARN_ON(&dev_priv->drm, !ddi_translations)) { 1415 + *default_entry = 0; 1751 1416 return 0; 1752 1417 } 1753 1418 1754 - if (drm_WARN_ON_ONCE(&dev_priv->drm, n_entries == 0)) 1755 - return 0; 1419 + *default_entry = ddi_translations->hdmi_default_entry; 1756 1420 1757 1421 return n_entries; 1422 + } 1423 + 1424 + void intel_ddi_buf_trans_init(struct intel_encoder *encoder) 1425 + { 1426 + struct drm_i915_private *i915 = to_i915(encoder->base.dev); 1427 + enum phy phy = intel_port_to_phy(i915, encoder->port); 1428 + 1429 + if (IS_ALDERLAKE_P(i915)) { 1430 + if (intel_phy_is_combo(i915, phy)) 1431 + encoder->get_buf_trans = tgl_get_combo_buf_trans; 1432 + else 1433 + encoder->get_buf_trans = adlp_get_dkl_buf_trans; 1434 + } else if (IS_ALDERLAKE_S(i915)) { 1435 + encoder->get_buf_trans = adls_get_combo_buf_trans; 1436 + } else if (IS_ROCKETLAKE(i915)) { 1437 + encoder->get_buf_trans = rkl_get_combo_buf_trans; 1438 + } else if (IS_DG1(i915)) { 1439 + encoder->get_buf_trans = dg1_get_combo_buf_trans; 1440 + } else if (DISPLAY_VER(i915) >= 12) { 1441 + if (intel_phy_is_combo(i915, phy)) 1442 + encoder->get_buf_trans = tgl_get_combo_buf_trans; 1443 + else 1444 + encoder->get_buf_trans = tgl_get_dkl_buf_trans; 1445 + } else if (DISPLAY_VER(i915) == 11) { 1446 + if (IS_PLATFORM(i915, INTEL_JASPERLAKE)) 1447 + encoder->get_buf_trans = jsl_get_combo_buf_trans; 1448 + else if (IS_PLATFORM(i915, INTEL_ELKHARTLAKE)) 1449 + encoder->get_buf_trans = ehl_get_combo_buf_trans; 1450 + else if (intel_phy_is_combo(i915, phy)) 1451 + encoder->get_buf_trans = icl_get_combo_buf_trans; 1452 + else 1453 + encoder->get_buf_trans = icl_get_mg_buf_trans; 1454 + } else if (IS_CANNONLAKE(i915)) { 1455 + encoder->get_buf_trans = cnl_get_buf_trans; 1456 + } else if (IS_GEMINILAKE(i915) || IS_BROXTON(i915)) { 1457 + encoder->get_buf_trans = bxt_get_buf_trans; 1458 + } else if (IS_CML_ULX(i915) || IS_CFL_ULX(i915) || IS_KBL_ULX(i915)) { 1459 + encoder->get_buf_trans = kbl_y_get_buf_trans; 1460 + } else if (IS_CML_ULT(i915) || IS_CFL_ULT(i915) || IS_KBL_ULT(i915)) { 1461 + encoder->get_buf_trans = kbl_u_get_buf_trans; 1462 + } else if (IS_COMETLAKE(i915) || IS_COFFEELAKE(i915) || IS_KABYLAKE(i915)) { 1463 + encoder->get_buf_trans = kbl_get_buf_trans; 1464 + } else if (IS_SKL_ULX(i915)) { 1465 + encoder->get_buf_trans = skl_y_get_buf_trans; 1466 + } else if (IS_SKL_ULT(i915)) { 1467 + encoder->get_buf_trans = skl_u_get_buf_trans; 1468 + } else if (IS_SKYLAKE(i915)) { 1469 + encoder->get_buf_trans = skl_get_buf_trans; 1470 + } else if (IS_BROADWELL(i915)) { 1471 + encoder->get_buf_trans = bdw_get_buf_trans; 1472 + } else { 1473 + encoder->get_buf_trans = hsw_get_buf_trans; 1474 + } 1758 1475 }
+17 -51
drivers/gpu/drm/i915/display/intel_ddi_buf_trans.h
··· 12 12 struct intel_encoder; 13 13 struct intel_crtc_state; 14 14 15 - struct ddi_buf_trans { 15 + struct hsw_ddi_buf_trans { 16 16 u32 trans1; /* balance leg enable, de-emph level */ 17 17 u32 trans2; /* vref sel, vswing */ 18 18 u8 i_boost; /* SKL: I_boost; valid: 0x0, 0x1, 0x3, 0x7 */ ··· 45 45 u32 dkl_de_emphasis_control; 46 46 }; 47 47 48 - bool is_hobl_buf_trans(const struct cnl_ddi_buf_trans *table); 48 + union intel_ddi_buf_trans_entry { 49 + struct hsw_ddi_buf_trans hsw; 50 + struct bxt_ddi_buf_trans bxt; 51 + struct cnl_ddi_buf_trans cnl; 52 + struct icl_mg_phy_ddi_buf_trans mg; 53 + struct tgl_dkl_phy_ddi_buf_trans dkl; 54 + }; 55 + 56 + struct intel_ddi_buf_trans { 57 + const union intel_ddi_buf_trans_entry *entries; 58 + u8 num_entries; 59 + u8 hdmi_default_entry; 60 + }; 61 + 62 + bool is_hobl_buf_trans(const struct intel_ddi_buf_trans *table); 49 63 50 64 int intel_ddi_hdmi_num_entries(struct intel_encoder *encoder, 51 65 const struct intel_crtc_state *crtc_state, 52 66 int *default_entry); 53 67 54 - const struct ddi_buf_trans * 55 - intel_ddi_get_buf_trans_edp(struct intel_encoder *encoder, int *n_entries); 56 - const struct ddi_buf_trans * 57 - intel_ddi_get_buf_trans_fdi(struct drm_i915_private *dev_priv, 58 - int *n_entries); 59 - const struct ddi_buf_trans * 60 - intel_ddi_get_buf_trans_hdmi(struct intel_encoder *encoder, 61 - int *n_entries); 62 - const struct ddi_buf_trans * 63 - intel_ddi_get_buf_trans_dp(struct intel_encoder *encoder, int *n_entries); 64 - 65 - const struct bxt_ddi_buf_trans * 66 - bxt_get_buf_trans(struct intel_encoder *encoder, 67 - const struct intel_crtc_state *crtc_state, 68 - int *n_entries); 69 - 70 - const struct tgl_dkl_phy_ddi_buf_trans * 71 - adlp_get_dkl_buf_trans(struct intel_encoder *encoder, 72 - const struct intel_crtc_state *crtc_state, 73 - int *n_entries); 74 - const struct cnl_ddi_buf_trans * 75 - tgl_get_combo_buf_trans(struct intel_encoder *encoder, 76 - const struct intel_crtc_state *crtc_state, 77 - int *n_entries); 78 - const struct tgl_dkl_phy_ddi_buf_trans * 79 - tgl_get_dkl_buf_trans(struct intel_encoder *encoder, 80 - const struct intel_crtc_state *crtc_state, 81 - int *n_entries); 82 - const struct cnl_ddi_buf_trans * 83 - jsl_get_combo_buf_trans(struct intel_encoder *encoder, 84 - const struct intel_crtc_state *crtc_state, 85 - int *n_entries); 86 - const struct cnl_ddi_buf_trans * 87 - ehl_get_combo_buf_trans(struct intel_encoder *encoder, 88 - const struct intel_crtc_state *crtc_state, 89 - int *n_entries); 90 - const struct cnl_ddi_buf_trans * 91 - icl_get_combo_buf_trans(struct intel_encoder *encoder, 92 - const struct intel_crtc_state *crtc_state, 93 - int *n_entries); 94 - const struct icl_mg_phy_ddi_buf_trans * 95 - icl_get_mg_buf_trans(struct intel_encoder *encoder, 96 - const struct intel_crtc_state *crtc_state, 97 - int *n_entries); 98 - 99 - const struct cnl_ddi_buf_trans * 100 - cnl_get_buf_trans(struct intel_encoder *encoder, 101 - const struct intel_crtc_state *crtc_state, 102 - int *n_entries); 68 + void intel_ddi_buf_trans_init(struct intel_encoder *encoder); 103 69 104 70 #endif
+88 -80
drivers/gpu/drm/i915/display/intel_display.c
··· 1914 1914 i915_vma_put(dpt->vma); 1915 1915 } 1916 1916 1917 + static bool 1918 + intel_reuse_initial_plane_obj(struct drm_i915_private *i915, 1919 + const struct intel_initial_plane_config *plane_config, 1920 + struct drm_framebuffer **fb, 1921 + struct i915_vma **vma) 1922 + { 1923 + struct intel_crtc *crtc; 1924 + 1925 + for_each_intel_crtc(&i915->drm, crtc) { 1926 + struct intel_crtc_state *crtc_state = 1927 + to_intel_crtc_state(crtc->base.state); 1928 + struct intel_plane *plane = 1929 + to_intel_plane(crtc->base.primary); 1930 + struct intel_plane_state *plane_state = 1931 + to_intel_plane_state(plane->base.state); 1932 + 1933 + if (!crtc_state->uapi.active) 1934 + continue; 1935 + 1936 + if (!plane_state->ggtt_vma) 1937 + continue; 1938 + 1939 + if (intel_plane_ggtt_offset(plane_state) == plane_config->base) { 1940 + *fb = plane_state->hw.fb; 1941 + *vma = plane_state->ggtt_vma; 1942 + return true; 1943 + } 1944 + } 1945 + 1946 + return false; 1947 + } 1948 + 1917 1949 static void 1918 - intel_find_initial_plane_obj(struct intel_crtc *intel_crtc, 1950 + intel_find_initial_plane_obj(struct intel_crtc *crtc, 1919 1951 struct intel_initial_plane_config *plane_config) 1920 1952 { 1921 - struct drm_device *dev = intel_crtc->base.dev; 1953 + struct drm_device *dev = crtc->base.dev; 1922 1954 struct drm_i915_private *dev_priv = to_i915(dev); 1923 - struct drm_crtc *c; 1924 - struct drm_plane *primary = intel_crtc->base.primary; 1925 - struct drm_plane_state *plane_state = primary->state; 1926 - struct intel_plane *intel_plane = to_intel_plane(primary); 1927 - struct intel_plane_state *intel_state = 1928 - to_intel_plane_state(plane_state); 1929 1955 struct intel_crtc_state *crtc_state = 1930 - to_intel_crtc_state(intel_crtc->base.state); 1956 + to_intel_crtc_state(crtc->base.state); 1957 + struct intel_plane *plane = 1958 + to_intel_plane(crtc->base.primary); 1959 + struct intel_plane_state *plane_state = 1960 + to_intel_plane_state(plane->base.state); 1931 1961 struct drm_framebuffer *fb; 1932 1962 struct i915_vma *vma; 1933 1963 ··· 1969 1939 if (!plane_config->fb) 1970 1940 return; 1971 1941 1972 - if (intel_alloc_initial_plane_obj(intel_crtc, plane_config)) { 1942 + if (intel_alloc_initial_plane_obj(crtc, plane_config)) { 1973 1943 fb = &plane_config->fb->base; 1974 1944 vma = plane_config->vma; 1975 1945 goto valid_fb; ··· 1979 1949 * Failed to alloc the obj, check to see if we should share 1980 1950 * an fb with another CRTC instead 1981 1951 */ 1982 - for_each_crtc(dev, c) { 1983 - struct intel_plane_state *state; 1984 - 1985 - if (c == &intel_crtc->base) 1986 - continue; 1987 - 1988 - if (!to_intel_crtc_state(c->state)->uapi.active) 1989 - continue; 1990 - 1991 - state = to_intel_plane_state(c->primary->state); 1992 - if (!state->ggtt_vma) 1993 - continue; 1994 - 1995 - if (intel_plane_ggtt_offset(state) == plane_config->base) { 1996 - fb = state->hw.fb; 1997 - vma = state->ggtt_vma; 1998 - goto valid_fb; 1999 - } 2000 - } 1952 + if (intel_reuse_initial_plane_obj(dev_priv, plane_config, &fb, &vma)) 1953 + goto valid_fb; 2001 1954 2002 1955 /* 2003 1956 * We've failed to reconstruct the BIOS FB. Current display state ··· 1989 1976 * simplest solution is to just disable the primary plane now and 1990 1977 * pretend the BIOS never had it enabled. 1991 1978 */ 1992 - intel_plane_disable_noatomic(intel_crtc, intel_plane); 1979 + intel_plane_disable_noatomic(crtc, plane); 1993 1980 if (crtc_state->bigjoiner) { 1994 1981 struct intel_crtc *slave = 1995 1982 crtc_state->bigjoiner_linked_crtc; ··· 1999 1986 return; 2000 1987 2001 1988 valid_fb: 2002 - plane_state->rotation = plane_config->rotation; 2003 - intel_fb_fill_view(to_intel_framebuffer(fb), plane_state->rotation, 2004 - &intel_state->view); 1989 + plane_state->uapi.rotation = plane_config->rotation; 1990 + intel_fb_fill_view(to_intel_framebuffer(fb), 1991 + plane_state->uapi.rotation, &plane_state->view); 2005 1992 2006 1993 __i915_vma_pin(vma); 2007 - intel_state->ggtt_vma = i915_vma_get(vma); 2008 - if (intel_plane_uses_fence(intel_state) && i915_vma_pin_fence(vma) == 0) 2009 - if (vma->fence) 2010 - intel_state->flags |= PLANE_HAS_FENCE; 1994 + plane_state->ggtt_vma = i915_vma_get(vma); 1995 + if (intel_plane_uses_fence(plane_state) && 1996 + i915_vma_pin_fence(vma) == 0 && vma->fence) 1997 + plane_state->flags |= PLANE_HAS_FENCE; 2011 1998 2012 - plane_state->src_x = 0; 2013 - plane_state->src_y = 0; 2014 - plane_state->src_w = fb->width << 16; 2015 - plane_state->src_h = fb->height << 16; 1999 + plane_state->uapi.src_x = 0; 2000 + plane_state->uapi.src_y = 0; 2001 + plane_state->uapi.src_w = fb->width << 16; 2002 + plane_state->uapi.src_h = fb->height << 16; 2016 2003 2017 - plane_state->crtc_x = 0; 2018 - plane_state->crtc_y = 0; 2019 - plane_state->crtc_w = fb->width; 2020 - plane_state->crtc_h = fb->height; 2004 + plane_state->uapi.crtc_x = 0; 2005 + plane_state->uapi.crtc_y = 0; 2006 + plane_state->uapi.crtc_w = fb->width; 2007 + plane_state->uapi.crtc_h = fb->height; 2021 2008 2022 2009 if (plane_config->tiling) 2023 2010 dev_priv->preserve_bios_swizzle = true; 2024 2011 2025 - plane_state->fb = fb; 2012 + plane_state->uapi.fb = fb; 2026 2013 drm_framebuffer_get(fb); 2027 2014 2028 - plane_state->crtc = &intel_crtc->base; 2029 - intel_plane_copy_uapi_to_hw_state(intel_state, intel_state, 2030 - intel_crtc); 2015 + plane_state->uapi.crtc = &crtc->base; 2016 + intel_plane_copy_uapi_to_hw_state(plane_state, plane_state, crtc); 2031 2017 2032 2018 intel_frontbuffer_flush(to_intel_frontbuffer(fb), ORIGIN_DIRTYFB); 2033 2019 2034 - atomic_or(to_intel_plane(primary)->frontbuffer_bit, 2035 - &to_intel_frontbuffer(fb)->bits); 2020 + atomic_or(plane->frontbuffer_bit, &to_intel_frontbuffer(fb)->bits); 2036 2021 } 2037 2022 2038 2023 unsigned int ··· 2717 2706 intel_wait_for_vblank(dev_priv, crtc->pipe); 2718 2707 } 2719 2708 2720 - static void intel_crtc_dpms_overlay_disable(struct intel_crtc *intel_crtc) 2709 + static void intel_crtc_dpms_overlay_disable(struct intel_crtc *crtc) 2721 2710 { 2722 - if (intel_crtc->overlay) 2723 - (void) intel_overlay_switch_off(intel_crtc->overlay); 2711 + if (crtc->overlay) 2712 + (void) intel_overlay_switch_off(crtc->overlay); 2724 2713 2725 2714 /* Let userspace switch the overlay on again. In most cases userspace 2726 2715 * has to recompute where to put it anyway. ··· 6484 6473 struct intel_load_detect_pipe *old, 6485 6474 struct drm_modeset_acquire_ctx *ctx) 6486 6475 { 6487 - struct intel_crtc *intel_crtc; 6488 - struct intel_encoder *intel_encoder = 6476 + struct intel_encoder *encoder = 6489 6477 intel_attached_encoder(to_intel_connector(connector)); 6490 - struct drm_crtc *possible_crtc; 6491 - struct drm_encoder *encoder = &intel_encoder->base; 6492 - struct drm_crtc *crtc = NULL; 6493 - struct drm_device *dev = encoder->dev; 6478 + struct intel_crtc *possible_crtc; 6479 + struct intel_crtc *crtc = NULL; 6480 + struct drm_device *dev = encoder->base.dev; 6494 6481 struct drm_i915_private *dev_priv = to_i915(dev); 6495 6482 struct drm_mode_config *config = &dev->mode_config; 6496 6483 struct drm_atomic_state *state = NULL, *restore_state = NULL; 6497 6484 struct drm_connector_state *connector_state; 6498 6485 struct intel_crtc_state *crtc_state; 6499 - int ret, i = -1; 6486 + int ret; 6500 6487 6501 6488 drm_dbg_kms(&dev_priv->drm, "[CONNECTOR:%d:%s], [ENCODER:%d:%s]\n", 6502 6489 connector->base.id, connector->name, 6503 - encoder->base.id, encoder->name); 6490 + encoder->base.base.id, encoder->base.name); 6504 6491 6505 6492 old->restore_state = NULL; 6506 6493 ··· 6516 6507 6517 6508 /* See if we already have a CRTC for this connector */ 6518 6509 if (connector->state->crtc) { 6519 - crtc = connector->state->crtc; 6510 + crtc = to_intel_crtc(connector->state->crtc); 6520 6511 6521 - ret = drm_modeset_lock(&crtc->mutex, ctx); 6512 + ret = drm_modeset_lock(&crtc->base.mutex, ctx); 6522 6513 if (ret) 6523 6514 goto fail; 6524 6515 ··· 6527 6518 } 6528 6519 6529 6520 /* Find an unused one (if possible) */ 6530 - for_each_crtc(dev, possible_crtc) { 6531 - i++; 6532 - if (!(encoder->possible_crtcs & (1 << i))) 6521 + for_each_intel_crtc(dev, possible_crtc) { 6522 + if (!(encoder->base.possible_crtcs & 6523 + drm_crtc_mask(&possible_crtc->base))) 6533 6524 continue; 6534 6525 6535 - ret = drm_modeset_lock(&possible_crtc->mutex, ctx); 6526 + ret = drm_modeset_lock(&possible_crtc->base.mutex, ctx); 6536 6527 if (ret) 6537 6528 goto fail; 6538 6529 6539 - if (possible_crtc->state->enable) { 6540 - drm_modeset_unlock(&possible_crtc->mutex); 6530 + if (possible_crtc->base.state->enable) { 6531 + drm_modeset_unlock(&possible_crtc->base.mutex); 6541 6532 continue; 6542 6533 } 6543 6534 ··· 6556 6547 } 6557 6548 6558 6549 found: 6559 - intel_crtc = to_intel_crtc(crtc); 6560 - 6561 6550 state = drm_atomic_state_alloc(dev); 6562 6551 restore_state = drm_atomic_state_alloc(dev); 6563 6552 if (!state || !restore_state) { ··· 6572 6565 goto fail; 6573 6566 } 6574 6567 6575 - ret = drm_atomic_set_crtc_for_connector(connector_state, crtc); 6568 + ret = drm_atomic_set_crtc_for_connector(connector_state, &crtc->base); 6576 6569 if (ret) 6577 6570 goto fail; 6578 6571 6579 - crtc_state = intel_atomic_get_crtc_state(state, intel_crtc); 6572 + crtc_state = intel_atomic_get_crtc_state(state, crtc); 6580 6573 if (IS_ERR(crtc_state)) { 6581 6574 ret = PTR_ERR(crtc_state); 6582 6575 goto fail; ··· 6589 6582 if (ret) 6590 6583 goto fail; 6591 6584 6592 - ret = intel_modeset_disable_planes(state, crtc); 6585 + ret = intel_modeset_disable_planes(state, &crtc->base); 6593 6586 if (ret) 6594 6587 goto fail; 6595 6588 6596 6589 ret = PTR_ERR_OR_ZERO(drm_atomic_get_connector_state(restore_state, connector)); 6597 6590 if (!ret) 6598 - ret = PTR_ERR_OR_ZERO(drm_atomic_get_crtc_state(restore_state, crtc)); 6591 + ret = PTR_ERR_OR_ZERO(drm_atomic_get_crtc_state(restore_state, &crtc->base)); 6599 6592 if (!ret) 6600 - ret = drm_atomic_add_affected_planes(restore_state, crtc); 6593 + ret = drm_atomic_add_affected_planes(restore_state, &crtc->base); 6601 6594 if (ret) { 6602 6595 drm_dbg_kms(&dev_priv->drm, 6603 6596 "Failed to create a copy of old state to restore: %i\n", ··· 6616 6609 drm_atomic_state_put(state); 6617 6610 6618 6611 /* let the connector get through one full cycle before testing */ 6619 - intel_wait_for_vblank(dev_priv, intel_crtc->pipe); 6612 + intel_wait_for_vblank(dev_priv, crtc->pipe); 6620 6613 return true; 6621 6614 6622 6615 fail: ··· 7288 7281 } 7289 7282 7290 7283 if (dev_priv->display.compute_pipe_wm) { 7291 - ret = dev_priv->display.compute_pipe_wm(crtc_state); 7284 + ret = dev_priv->display.compute_pipe_wm(state, crtc); 7292 7285 if (ret) { 7293 7286 drm_dbg_kms(&dev_priv->drm, 7294 7287 "Target pipe watermarks are invalid\n"); 7295 7288 return ret; 7296 7289 } 7290 + 7297 7291 } 7298 7292 7299 7293 if (dev_priv->display.compute_intermediate_wm) { ··· 7307 7299 * old state and the new state. We can program these 7308 7300 * immediately. 7309 7301 */ 7310 - ret = dev_priv->display.compute_intermediate_wm(crtc_state); 7302 + ret = dev_priv->display.compute_intermediate_wm(state, crtc); 7311 7303 if (ret) { 7312 7304 drm_dbg_kms(&dev_priv->drm, 7313 7305 "No valid intermediate pipe watermarks are possible\n");
+20 -15
drivers/gpu/drm/i915/display/intel_display_debugfs.c
··· 544 544 545 545 seq_printf(m, "fw loaded: %s\n", yesno(intel_dmc_has_payload(dev_priv))); 546 546 seq_printf(m, "path: %s\n", dmc->fw_path); 547 + seq_printf(m, "Pipe A fw support: %s\n", 548 + yesno(GRAPHICS_VER(dev_priv) >= 12)); 549 + seq_printf(m, "Pipe A fw loaded: %s\n", yesno(dmc->dmc_info[DMC_FW_PIPEA].payload)); 550 + seq_printf(m, "Pipe B fw support: %s\n", yesno(IS_ALDERLAKE_P(dev_priv))); 551 + seq_printf(m, "Pipe B fw loaded: %s\n", yesno(dmc->dmc_info[DMC_FW_PIPEB].payload)); 547 552 548 553 if (!intel_dmc_has_payload(dev_priv)) 549 554 goto out; ··· 587 582 588 583 out: 589 584 seq_printf(m, "program base: 0x%08x\n", 590 - intel_de_read(dev_priv, DMC_PROGRAM(0))); 585 + intel_de_read(dev_priv, DMC_PROGRAM(dmc->dmc_info[DMC_FW_MAIN].start_mmioaddr, 0))); 591 586 seq_printf(m, "ssp base: 0x%08x\n", 592 587 intel_de_read(dev_priv, DMC_SSP_BASE)); 593 588 seq_printf(m, "htp: 0x%08x\n", intel_de_read(dev_priv, DMC_HTP_SKL)); ··· 1230 1225 1231 1226 static void drrs_status_per_crtc(struct seq_file *m, 1232 1227 struct drm_device *dev, 1233 - struct intel_crtc *intel_crtc) 1228 + struct intel_crtc *crtc) 1234 1229 { 1235 1230 struct drm_i915_private *dev_priv = to_i915(dev); 1236 1231 struct i915_drrs *drrs = &dev_priv->drrs; ··· 1242 1237 drm_for_each_connector_iter(connector, &conn_iter) { 1243 1238 bool supported = false; 1244 1239 1245 - if (connector->state->crtc != &intel_crtc->base) 1240 + if (connector->state->crtc != &crtc->base) 1246 1241 continue; 1247 1242 1248 1243 seq_printf(m, "%s:\n", connector->name); ··· 1257 1252 1258 1253 seq_puts(m, "\n"); 1259 1254 1260 - if (to_intel_crtc_state(intel_crtc->base.state)->has_drrs) { 1255 + if (to_intel_crtc_state(crtc->base.state)->has_drrs) { 1261 1256 struct intel_panel *panel; 1262 1257 1263 1258 mutex_lock(&drrs->mutex); ··· 1303 1298 { 1304 1299 struct drm_i915_private *dev_priv = node_to_i915(m->private); 1305 1300 struct drm_device *dev = &dev_priv->drm; 1306 - struct intel_crtc *intel_crtc; 1301 + struct intel_crtc *crtc; 1307 1302 int active_crtc_cnt = 0; 1308 1303 1309 1304 drm_modeset_lock_all(dev); 1310 - for_each_intel_crtc(dev, intel_crtc) { 1311 - if (intel_crtc->base.state->active) { 1305 + for_each_intel_crtc(dev, crtc) { 1306 + if (crtc->base.state->active) { 1312 1307 active_crtc_cnt++; 1313 1308 seq_printf(m, "\nCRTC %d: ", active_crtc_cnt); 1314 1309 1315 - drrs_status_per_crtc(m, dev, intel_crtc); 1310 + drrs_status_per_crtc(m, dev, crtc); 1316 1311 } 1317 1312 } 1318 1313 drm_modeset_unlock_all(dev); ··· 2069 2064 size_t cnt, loff_t *ppos) 2070 2065 { 2071 2066 struct drm_i915_private *dev_priv = filp->private_data; 2072 - struct intel_crtc *intel_crtc; 2067 + struct intel_crtc *crtc; 2073 2068 struct drm_device *dev = &dev_priv->drm; 2074 2069 int ret; 2075 2070 bool reset; ··· 2081 2076 if (!reset) 2082 2077 return cnt; 2083 2078 2084 - for_each_intel_crtc(dev, intel_crtc) { 2079 + for_each_intel_crtc(dev, crtc) { 2085 2080 struct drm_crtc_commit *commit; 2086 2081 struct intel_crtc_state *crtc_state; 2087 2082 2088 - ret = drm_modeset_lock_single_interruptible(&intel_crtc->base.mutex); 2083 + ret = drm_modeset_lock_single_interruptible(&crtc->base.mutex); 2089 2084 if (ret) 2090 2085 return ret; 2091 2086 2092 - crtc_state = to_intel_crtc_state(intel_crtc->base.state); 2087 + crtc_state = to_intel_crtc_state(crtc->base.state); 2093 2088 commit = crtc_state->uapi.commit; 2094 2089 if (commit) { 2095 2090 ret = wait_for_completion_interruptible(&commit->hw_done); ··· 2100 2095 if (!ret && crtc_state->hw.active) { 2101 2096 drm_dbg_kms(&dev_priv->drm, 2102 2097 "Re-arming FIFO underruns on pipe %c\n", 2103 - pipe_name(intel_crtc->pipe)); 2098 + pipe_name(crtc->pipe)); 2104 2099 2105 - intel_crtc_arm_fifo_underrun(intel_crtc, crtc_state); 2100 + intel_crtc_arm_fifo_underrun(crtc, crtc_state); 2106 2101 } 2107 2102 2108 - drm_modeset_unlock(&intel_crtc->base.mutex); 2103 + drm_modeset_unlock(&crtc->base.mutex); 2109 2104 2110 2105 if (ret) 2111 2106 return ret;
+3 -2
drivers/gpu/drm/i915/display/intel_display_power.c
··· 961 961 static void assert_dmc_loaded(struct drm_i915_private *dev_priv) 962 962 { 963 963 drm_WARN_ONCE(&dev_priv->drm, 964 - !intel_de_read(dev_priv, DMC_PROGRAM(0)), 965 - "DMC program storage start is NULL\n"); 964 + !intel_de_read(dev_priv, 965 + DMC_PROGRAM(dev_priv->dmc.dmc_info[DMC_FW_MAIN].start_mmioaddr, 0)), 966 + "DMC program storage start is NULL\n"); 966 967 drm_WARN_ONCE(&dev_priv->drm, !intel_de_read(dev_priv, DMC_SSP_BASE), 967 968 "DMC SSP Base Not fine\n"); 968 969 drm_WARN_ONCE(&dev_priv->drm, !intel_de_read(dev_priv, DMC_HTP_SKL),
+9 -1
drivers/gpu/drm/i915/display/intel_display_types.h
··· 48 48 49 49 struct drm_printer; 50 50 struct __intel_global_objs_state; 51 + struct intel_ddi_buf_trans; 51 52 52 53 /* 53 54 * Display related stuff ··· 264 263 * Returns whether the port clock is enabled or not. 265 264 */ 266 265 bool (*is_clock_enabled)(struct intel_encoder *encoder); 266 + const struct intel_ddi_buf_trans *(*get_buf_trans)(struct intel_encoder *encoder, 267 + const struct intel_crtc_state *crtc_state, 268 + int *n_entries); 267 269 enum hpd_pin hpd_pin; 268 270 enum intel_display_power_domain power_domain; 269 271 /* for communication with audio component; protected by av_mutex */ ··· 1044 1040 bool has_psr; 1045 1041 bool has_psr2; 1046 1042 bool enable_psr2_sel_fetch; 1043 + bool req_psr2_sdp_prior_scanline; 1047 1044 u32 dc3co_exitline; 1045 + u16 su_y_granularity; 1048 1046 1049 1047 /* 1050 1048 * Frequence the dpll for the port should run at. Differs from the ··· 1499 1493 bool colorimetry_support; 1500 1494 bool psr2_enabled; 1501 1495 bool psr2_sel_fetch_enabled; 1496 + bool req_psr2_sdp_prior_scanline; 1502 1497 u8 sink_sync_latency; 1503 1498 ktime_t last_entry_attempt; 1504 1499 ktime_t last_exit; 1505 1500 bool sink_not_reliable; 1506 1501 bool irq_aux_error; 1507 - u16 su_x_granularity; 1502 + u16 su_w_granularity; 1503 + u16 su_y_granularity; 1508 1504 u32 dc3co_exitline; 1509 1505 u32 dc3co_exit_delay; 1510 1506 struct delayed_work dc3co_work;
+98 -71
drivers/gpu/drm/i915/display/intel_dmc.c
··· 45 45 46 46 #define GEN12_DMC_MAX_FW_SIZE ICL_DMC_MAX_FW_SIZE 47 47 48 + #define ADLP_DMC_PATH DMC_PATH(adlp, 2, 10) 49 + #define ADLP_DMC_VERSION_REQUIRED DMC_VERSION(2, 10) 50 + MODULE_FIRMWARE(ADLP_DMC_PATH); 51 + 48 52 #define ADLS_DMC_PATH DMC_PATH(adls, 2, 01) 49 53 #define ADLS_DMC_VERSION_REQUIRED DMC_VERSION(2, 1) 50 54 MODULE_FIRMWARE(ADLS_DMC_PATH); ··· 100 96 #define PACKAGE_V2_MAX_FW_INFO_ENTRIES 32 101 97 #define DMC_V1_MAX_MMIO_COUNT 8 102 98 #define DMC_V3_MAX_MMIO_COUNT 20 99 + #define DMC_V1_MMIO_START_RANGE 0x80000 103 100 104 101 struct intel_css_header { 105 102 /* 0x09 for DMC */ ··· 244 239 245 240 bool intel_dmc_has_payload(struct drm_i915_private *i915) 246 241 { 247 - return i915->dmc.dmc_payload; 242 + return i915->dmc.dmc_info[DMC_FW_MAIN].payload; 248 243 } 249 244 250 245 static const struct stepping_info skl_stepping_info[] = { ··· 321 316 */ 322 317 void intel_dmc_load_program(struct drm_i915_private *dev_priv) 323 318 { 324 - u32 *payload = dev_priv->dmc.dmc_payload; 325 - u32 i, fw_size; 319 + struct intel_dmc *dmc = &dev_priv->dmc; 320 + u32 id, i; 326 321 327 322 if (!HAS_DMC(dev_priv)) { 328 323 drm_err(&dev_priv->drm, ··· 330 325 return; 331 326 } 332 327 333 - if (!intel_dmc_has_payload(dev_priv)) { 328 + if (!dev_priv->dmc.dmc_info[DMC_FW_MAIN].payload) { 334 329 drm_err(&dev_priv->drm, 335 330 "Tried to program CSR with empty payload\n"); 336 331 return; 337 332 } 338 333 339 - fw_size = dev_priv->dmc.dmc_fw_size; 340 334 assert_rpm_wakelock_held(&dev_priv->runtime_pm); 341 335 342 336 preempt_disable(); 343 337 344 - for (i = 0; i < fw_size; i++) 345 - intel_uncore_write_fw(&dev_priv->uncore, DMC_PROGRAM(i), 346 - payload[i]); 338 + for (id = 0; id < DMC_FW_MAX; id++) { 339 + for (i = 0; i < dmc->dmc_info[id].dmc_fw_size; i++) { 340 + intel_uncore_write_fw(&dev_priv->uncore, 341 + DMC_PROGRAM(dmc->dmc_info[id].start_mmioaddr, i), 342 + dmc->dmc_info[id].payload[i]); 343 + } 344 + } 347 345 348 346 preempt_enable(); 349 347 350 - for (i = 0; i < dev_priv->dmc.mmio_count; i++) { 351 - intel_de_write(dev_priv, dev_priv->dmc.mmioaddr[i], 352 - dev_priv->dmc.mmiodata[i]); 348 + for (id = 0; id < DMC_FW_MAX; id++) { 349 + for (i = 0; i < dmc->dmc_info[id].mmio_count; i++) { 350 + intel_de_write(dev_priv, dmc->dmc_info[id].mmioaddr[i], 351 + dmc->dmc_info[id].mmiodata[i]); 352 + } 353 353 } 354 354 355 355 dev_priv->dmc.dc_state = 0; ··· 362 352 gen9_set_dc_state_debugmask(dev_priv); 363 353 } 364 354 355 + static bool fw_info_matches_stepping(const struct intel_fw_info *fw_info, 356 + const struct stepping_info *si) 357 + { 358 + if ((fw_info->substepping == '*' && si->stepping == fw_info->stepping) || 359 + (si->stepping == fw_info->stepping && si->substepping == fw_info->substepping) || 360 + /* 361 + * If we don't find a more specific one from above two checks, we 362 + * then check for the generic one to be sure to work even with 363 + * "broken firmware" 364 + */ 365 + (si->stepping == '*' && si->substepping == fw_info->substepping) || 366 + (fw_info->stepping == '*' && fw_info->substepping == '*')) 367 + return true; 368 + 369 + return false; 370 + } 371 + 365 372 /* 366 373 * Search fw_info table for dmc_offset to find firmware binary: num_entries is 367 374 * already sanitized. 368 375 */ 369 - static u32 find_dmc_fw_offset(const struct intel_fw_info *fw_info, 376 + static void dmc_set_fw_offset(struct intel_dmc *dmc, 377 + const struct intel_fw_info *fw_info, 370 378 unsigned int num_entries, 371 379 const struct stepping_info *si, 372 380 u8 package_ver) 373 381 { 374 - u32 dmc_offset = DMC_DEFAULT_FW_OFFSET; 375 - unsigned int i; 382 + unsigned int i, id; 383 + 384 + struct drm_i915_private *i915 = container_of(dmc, typeof(*i915), dmc); 376 385 377 386 for (i = 0; i < num_entries; i++) { 378 - if (package_ver > 1 && fw_info[i].dmc_id != 0) 387 + id = package_ver <= 1 ? DMC_FW_MAIN : fw_info[i].dmc_id; 388 + 389 + if (id >= DMC_FW_MAX) { 390 + drm_dbg(&i915->drm, "Unsupported firmware id: %u\n", id); 391 + continue; 392 + } 393 + 394 + /* More specific versions come first, so we don't even have to 395 + * check for the stepping since we already found a previous FW 396 + * for this id. 397 + */ 398 + if (dmc->dmc_info[id].present) 379 399 continue; 380 400 381 - if (fw_info[i].substepping == '*' && 382 - si->stepping == fw_info[i].stepping) { 383 - dmc_offset = fw_info[i].offset; 384 - break; 385 - } 386 - 387 - if (si->stepping == fw_info[i].stepping && 388 - si->substepping == fw_info[i].substepping) { 389 - dmc_offset = fw_info[i].offset; 390 - break; 391 - } 392 - 393 - if (fw_info[i].stepping == '*' && 394 - fw_info[i].substepping == '*') { 395 - /* 396 - * In theory we should stop the search as generic 397 - * entries should always come after the more specific 398 - * ones, but let's continue to make sure to work even 399 - * with "broken" firmwares. If we don't find a more 400 - * specific one, then we use this entry 401 - */ 402 - dmc_offset = fw_info[i].offset; 401 + if (fw_info_matches_stepping(&fw_info[i], si)) { 402 + dmc->dmc_info[id].present = true; 403 + dmc->dmc_info[id].dmc_offset = fw_info[i].offset; 403 404 } 404 405 } 405 - 406 - return dmc_offset; 407 406 } 408 407 409 408 static u32 parse_dmc_fw_header(struct intel_dmc *dmc, 410 409 const struct intel_dmc_header_base *dmc_header, 411 - size_t rem_size) 410 + size_t rem_size, u8 dmc_id) 412 411 { 413 412 struct drm_i915_private *i915 = container_of(dmc, typeof(*i915), dmc); 413 + struct dmc_fw_info *dmc_info = &dmc->dmc_info[dmc_id]; 414 414 unsigned int header_len_bytes, dmc_header_size, payload_size, i; 415 415 const u32 *mmioaddr, *mmiodata; 416 - u32 mmio_count, mmio_count_max; 416 + u32 mmio_count, mmio_count_max, start_mmioaddr; 417 417 u8 *payload; 418 418 419 - BUILD_BUG_ON(ARRAY_SIZE(dmc->mmioaddr) < DMC_V3_MAX_MMIO_COUNT || 420 - ARRAY_SIZE(dmc->mmioaddr) < DMC_V1_MAX_MMIO_COUNT); 419 + BUILD_BUG_ON(ARRAY_SIZE(dmc_info->mmioaddr) < DMC_V3_MAX_MMIO_COUNT || 420 + ARRAY_SIZE(dmc_info->mmioaddr) < DMC_V1_MAX_MMIO_COUNT); 421 421 422 422 /* 423 423 * Check if we can access common fields, we will checkc again below ··· 450 430 mmio_count_max = DMC_V3_MAX_MMIO_COUNT; 451 431 /* header_len is in dwords */ 452 432 header_len_bytes = dmc_header->header_len * 4; 433 + start_mmioaddr = v3->start_mmioaddr; 453 434 dmc_header_size = sizeof(*v3); 454 435 } else if (dmc_header->header_ver == 1) { 455 436 const struct intel_dmc_header_v1 *v1 = ··· 464 443 mmio_count = v1->mmio_count; 465 444 mmio_count_max = DMC_V1_MAX_MMIO_COUNT; 466 445 header_len_bytes = dmc_header->header_len; 446 + start_mmioaddr = DMC_V1_MMIO_START_RANGE; 467 447 dmc_header_size = sizeof(*v1); 468 448 } else { 469 449 drm_err(&i915->drm, "Unknown DMC fw header version: %u\n", ··· 485 463 } 486 464 487 465 for (i = 0; i < mmio_count; i++) { 488 - if (mmioaddr[i] < DMC_MMIO_START_RANGE || 489 - mmioaddr[i] > DMC_MMIO_END_RANGE) { 490 - drm_err(&i915->drm, "DMC firmware has wrong mmio address 0x%x\n", 491 - mmioaddr[i]); 492 - return 0; 493 - } 494 - dmc->mmioaddr[i] = _MMIO(mmioaddr[i]); 495 - dmc->mmiodata[i] = mmiodata[i]; 466 + dmc_info->mmioaddr[i] = _MMIO(mmioaddr[i]); 467 + dmc_info->mmiodata[i] = mmiodata[i]; 496 468 } 497 - dmc->mmio_count = mmio_count; 469 + dmc_info->mmio_count = mmio_count; 470 + dmc_info->start_mmioaddr = start_mmioaddr; 498 471 499 472 rem_size -= header_len_bytes; 500 473 ··· 502 485 drm_err(&i915->drm, "DMC FW too big (%u bytes)\n", payload_size); 503 486 return 0; 504 487 } 505 - dmc->dmc_fw_size = dmc_header->fw_size; 488 + dmc_info->dmc_fw_size = dmc_header->fw_size; 506 489 507 - dmc->dmc_payload = kmalloc(payload_size, GFP_KERNEL); 508 - if (!dmc->dmc_payload) 490 + dmc_info->payload = kmalloc(payload_size, GFP_KERNEL); 491 + if (!dmc_info->payload) 509 492 return 0; 510 493 511 494 payload = (u8 *)(dmc_header) + header_len_bytes; 512 - memcpy(dmc->dmc_payload, payload, payload_size); 495 + memcpy(dmc_info->payload, payload, payload_size); 513 496 514 497 return header_len_bytes + payload_size; 515 498 ··· 526 509 { 527 510 struct drm_i915_private *i915 = container_of(dmc, typeof(*i915), dmc); 528 511 u32 package_size = sizeof(struct intel_package_header); 529 - u32 num_entries, max_entries, dmc_offset; 512 + u32 num_entries, max_entries; 530 513 const struct intel_fw_info *fw_info; 531 514 532 515 if (rem_size < package_size) ··· 562 545 563 546 fw_info = (const struct intel_fw_info *) 564 547 ((u8 *)package_header + sizeof(*package_header)); 565 - dmc_offset = find_dmc_fw_offset(fw_info, num_entries, si, 566 - package_header->header_ver); 567 - if (dmc_offset == DMC_DEFAULT_FW_OFFSET) { 568 - drm_err(&i915->drm, "DMC firmware not supported for %c stepping\n", 569 - si->stepping); 570 - return 0; 571 - } 548 + dmc_set_fw_offset(dmc, fw_info, num_entries, si, 549 + package_header->header_ver); 572 550 573 551 /* dmc_offset is in dwords */ 574 - return package_size + dmc_offset * 4; 552 + return package_size; 575 553 576 554 error_truncated: 577 555 drm_err(&i915->drm, "Truncated DMC firmware, refusing.\n"); ··· 618 606 struct intel_dmc *dmc = &dev_priv->dmc; 619 607 const struct stepping_info *si = intel_get_stepping_info(dev_priv); 620 608 u32 readcount = 0; 621 - u32 r; 609 + u32 r, offset; 610 + int id; 622 611 623 612 if (!fw) 624 613 return; ··· 640 627 641 628 readcount += r; 642 629 643 - /* Extract dmc_header information */ 644 - dmc_header = (struct intel_dmc_header_base *)&fw->data[readcount]; 645 - parse_dmc_fw_header(dmc, dmc_header, fw->size - readcount); 630 + for (id = 0; id < DMC_FW_MAX; id++) { 631 + if (!dev_priv->dmc.dmc_info[id].present) 632 + continue; 633 + 634 + offset = readcount + dmc->dmc_info[id].dmc_offset * 4; 635 + if (fw->size - offset < 0) { 636 + drm_err(&dev_priv->drm, "Reading beyond the fw_size\n"); 637 + continue; 638 + } 639 + 640 + dmc_header = (struct intel_dmc_header_base *)&fw->data[offset]; 641 + parse_dmc_fw_header(dmc, dmc_header, fw->size - offset, id); 642 + } 646 643 } 647 644 648 645 static void intel_dmc_runtime_pm_get(struct drm_i915_private *dev_priv) ··· 728 705 */ 729 706 intel_dmc_runtime_pm_get(dev_priv); 730 707 731 - if (IS_ALDERLAKE_S(dev_priv)) { 708 + if (IS_ALDERLAKE_P(dev_priv)) { 709 + dmc->fw_path = ADLP_DMC_PATH; 710 + dmc->required_version = ADLP_DMC_VERSION_REQUIRED; 711 + dmc->max_fw_size = GEN12_DMC_MAX_FW_SIZE; 712 + } else if (IS_ALDERLAKE_S(dev_priv)) { 732 713 dmc->fw_path = ADLS_DMC_PATH; 733 714 dmc->required_version = ADLS_DMC_VERSION_REQUIRED; 734 715 dmc->max_fw_size = GEN12_DMC_MAX_FW_SIZE; ··· 854 827 intel_dmc_ucode_suspend(dev_priv); 855 828 drm_WARN_ON(&dev_priv->drm, dev_priv->dmc.wakeref); 856 829 857 - kfree(dev_priv->dmc.dmc_payload); 830 + kfree(dev_priv->dmc.dmc_info[DMC_FW_MAIN].payload); 858 831 }
+18 -5
drivers/gpu/drm/i915/display/intel_dmc.h
··· 16 16 #define DMC_VERSION_MAJOR(version) ((version) >> 16) 17 17 #define DMC_VERSION_MINOR(version) ((version) & 0xffff) 18 18 19 + enum { 20 + DMC_FW_MAIN = 0, 21 + DMC_FW_PIPEA, 22 + DMC_FW_PIPEB, 23 + DMC_FW_MAX 24 + }; 25 + 19 26 struct intel_dmc { 20 27 struct work_struct work; 21 28 const char *fw_path; 22 29 u32 required_version; 23 30 u32 max_fw_size; /* bytes */ 24 - u32 *dmc_payload; 25 - u32 dmc_fw_size; /* dwords */ 26 31 u32 version; 27 - u32 mmio_count; 28 - i915_reg_t mmioaddr[20]; 29 - u32 mmiodata[20]; 32 + struct dmc_fw_info { 33 + u32 mmio_count; 34 + i915_reg_t mmioaddr[20]; 35 + u32 mmiodata[20]; 36 + u32 dmc_offset; 37 + u32 start_mmioaddr; 38 + u32 dmc_fw_size; /*dwords */ 39 + u32 *payload; 40 + bool present; 41 + } dmc_info[DMC_FW_MAX]; 42 + 30 43 u32 dc_state; 31 44 u32 target_dc_state; 32 45 u32 allowed_dc_mask;
+4 -6
drivers/gpu/drm/i915/display/intel_dp.c
··· 3031 3031 struct intel_crtc_state *crtc_state, 3032 3032 unsigned int type) 3033 3033 { 3034 - if (encoder->type != INTEL_OUTPUT_DDI) 3035 - return; 3036 - 3037 3034 switch (type) { 3038 3035 case DP_SDP_VSC: 3039 3036 intel_read_dp_vsc_sdp(encoder, crtc_state, ··· 4738 4741 int refresh_rate) 4739 4742 { 4740 4743 struct intel_dp *intel_dp = dev_priv->drrs.dp; 4741 - struct intel_crtc *intel_crtc = to_intel_crtc(crtc_state->uapi.crtc); 4744 + struct intel_crtc *crtc = to_intel_crtc(crtc_state->uapi.crtc); 4742 4745 enum drrs_refresh_rate_type index = DRRS_HIGH_RR; 4743 4746 4744 4747 if (refresh_rate <= 0) { ··· 4752 4755 return; 4753 4756 } 4754 4757 4755 - if (!intel_crtc) { 4758 + if (!crtc) { 4756 4759 drm_dbg_kms(&dev_priv->drm, 4757 4760 "DRRS: intel_crtc not initialized\n"); 4758 4761 return; ··· 5235 5238 } 5236 5239 5237 5240 intel_panel_init(&intel_connector->panel, fixed_mode, downclock_mode); 5238 - intel_connector->panel.backlight.power = intel_pps_backlight_power; 5241 + if (!(dev_priv->quirks & QUIRK_NO_PPS_BACKLIGHT_POWER_HOOK)) 5242 + intel_connector->panel.backlight.power = intel_pps_backlight_power; 5239 5243 intel_panel_setup_backlight(connector, pipe); 5240 5244 5241 5245 if (fixed_mode) {
+6 -9
drivers/gpu/drm/i915/display/intel_dp_mst.c
··· 308 308 * connector 309 309 */ 310 310 if (new_crtc) { 311 - struct intel_crtc *intel_crtc = to_intel_crtc(new_crtc); 311 + struct intel_crtc *crtc = to_intel_crtc(new_crtc); 312 312 struct intel_crtc_state *crtc_state = 313 - intel_atomic_get_new_crtc_state(state, intel_crtc); 313 + intel_atomic_get_new_crtc_state(state, crtc); 314 314 315 315 if (!crtc_state || 316 316 !drm_atomic_crtc_needs_modeset(&crtc_state->uapi) || ··· 835 835 intel_attach_force_audio_property(connector); 836 836 intel_attach_broadcast_rgb_property(connector); 837 837 838 - if (DISPLAY_VER(dev_priv) <= 12) { 839 - ret = intel_dp_hdcp_init(dig_port, intel_connector); 840 - if (ret) 841 - drm_dbg_kms(&dev_priv->drm, "[%s:%d] HDCP MST init failed, skipping.\n", 842 - connector->name, connector->base.id); 843 - } 844 - 838 + ret = intel_dp_hdcp_init(dig_port, intel_connector); 839 + if (ret) 840 + drm_dbg_kms(&dev_priv->drm, "[%s:%d] HDCP MST init failed, skipping.\n", 841 + connector->name, connector->base.id); 845 842 /* 846 843 * Reuse the prop from the SST connector because we're 847 844 * not allowed to create new props after device registration.
+105 -110
drivers/gpu/drm/i915/display/intel_fbc.c
··· 104 104 int i; 105 105 u32 fbc_ctl; 106 106 107 - /* Note: fbc.threshold == 1 for i8xx */ 107 + /* Note: fbc.limit == 1 for i8xx */ 108 108 cfb_pitch = params->cfb_size / FBC_LL_SIZE; 109 109 if (params->fb.stride < cfb_pitch) 110 110 cfb_pitch = params->fb.stride; ··· 148 148 return intel_de_read(dev_priv, FBC_CONTROL) & FBC_CTL_EN; 149 149 } 150 150 151 + static u32 g4x_dpfc_ctl_limit(struct drm_i915_private *i915) 152 + { 153 + const struct intel_fbc_reg_params *params = &i915->fbc.params; 154 + int limit = i915->fbc.limit; 155 + 156 + if (params->fb.format->cpp[0] == 2) 157 + limit <<= 1; 158 + 159 + switch (limit) { 160 + default: 161 + MISSING_CASE(limit); 162 + fallthrough; 163 + case 1: 164 + return DPFC_CTL_LIMIT_1X; 165 + case 2: 166 + return DPFC_CTL_LIMIT_2X; 167 + case 4: 168 + return DPFC_CTL_LIMIT_4X; 169 + } 170 + } 171 + 151 172 static void g4x_fbc_activate(struct drm_i915_private *dev_priv) 152 173 { 153 174 struct intel_fbc_reg_params *params = &dev_priv->fbc.params; 154 175 u32 dpfc_ctl; 155 176 156 177 dpfc_ctl = DPFC_CTL_PLANE(params->crtc.i9xx_plane) | DPFC_SR_EN; 157 - if (params->fb.format->cpp[0] == 2) 158 - dpfc_ctl |= DPFC_CTL_LIMIT_2X; 159 - else 160 - dpfc_ctl |= DPFC_CTL_LIMIT_1X; 178 + 179 + dpfc_ctl |= g4x_dpfc_ctl_limit(dev_priv); 161 180 162 181 if (params->fence_id >= 0) { 163 182 dpfc_ctl |= DPFC_CTL_FENCE_EN | params->fence_id; ··· 254 235 { 255 236 struct intel_fbc_reg_params *params = &dev_priv->fbc.params; 256 237 u32 dpfc_ctl; 257 - int threshold = dev_priv->fbc.threshold; 258 238 259 239 dpfc_ctl = DPFC_CTL_PLANE(params->crtc.i9xx_plane); 260 - if (params->fb.format->cpp[0] == 2) 261 - threshold++; 262 240 263 - switch (threshold) { 264 - case 4: 265 - case 3: 266 - dpfc_ctl |= DPFC_CTL_LIMIT_4X; 267 - break; 268 - case 2: 269 - dpfc_ctl |= DPFC_CTL_LIMIT_2X; 270 - break; 271 - case 1: 272 - dpfc_ctl |= DPFC_CTL_LIMIT_1X; 273 - break; 274 - } 241 + dpfc_ctl |= g4x_dpfc_ctl_limit(dev_priv); 275 242 276 243 if (params->fence_id >= 0) { 277 244 dpfc_ctl |= DPFC_CTL_FENCE_EN; ··· 305 300 { 306 301 struct intel_fbc_reg_params *params = &dev_priv->fbc.params; 307 302 u32 dpfc_ctl; 308 - int threshold = dev_priv->fbc.threshold; 309 303 310 304 /* Display WA #0529: skl, kbl, bxt. */ 311 305 if (DISPLAY_VER(dev_priv) == 9) { ··· 322 318 if (IS_IVYBRIDGE(dev_priv)) 323 319 dpfc_ctl |= IVB_DPFC_CTL_PLANE(params->crtc.i9xx_plane); 324 320 325 - if (params->fb.format->cpp[0] == 2) 326 - threshold++; 327 - 328 - switch (threshold) { 329 - case 4: 330 - case 3: 331 - dpfc_ctl |= DPFC_CTL_LIMIT_4X; 332 - break; 333 - case 2: 334 - dpfc_ctl |= DPFC_CTL_LIMIT_2X; 335 - break; 336 - case 1: 337 - dpfc_ctl |= DPFC_CTL_LIMIT_1X; 338 - break; 339 - } 321 + dpfc_ctl |= g4x_dpfc_ctl_limit(dev_priv); 340 322 341 323 if (params->fence_id >= 0) { 342 324 dpfc_ctl |= IVB_DPFC_CTL_FENCE_EN; ··· 423 433 return BIT_ULL(32); 424 434 } 425 435 426 - static int find_compression_threshold(struct drm_i915_private *dev_priv, 427 - struct drm_mm_node *node, 428 - unsigned int size, 429 - unsigned int fb_cpp) 436 + static u64 intel_fbc_stolen_end(struct drm_i915_private *dev_priv) 430 437 { 431 - int compression_threshold = 1; 432 - int ret; 433 438 u64 end; 434 439 435 440 /* The FBC hardware for BDW/SKL doesn't have access to the stolen ··· 437 452 else 438 453 end = U64_MAX; 439 454 440 - end = min(end, intel_fbc_cfb_base_max(dev_priv)); 455 + return min(end, intel_fbc_cfb_base_max(dev_priv)); 456 + } 441 457 442 - /* HACK: This code depends on what we will do in *_enable_fbc. If that 443 - * code changes, this code needs to change as well. 444 - * 445 - * The enable_fbc code will attempt to use one of our 2 compression 446 - * thresholds, therefore, in that case, we only have 1 resort. 458 + static int intel_fbc_max_limit(struct drm_i915_private *dev_priv, int fb_cpp) 459 + { 460 + /* 461 + * FIXME: FBC1 can have arbitrary cfb stride, 462 + * so we could support different compression ratios. 447 463 */ 464 + if (DISPLAY_VER(dev_priv) < 5 && !IS_G4X(dev_priv)) 465 + return 1; 466 + 467 + /* WaFbcOnly1to1Ratio:ctg */ 468 + if (IS_G4X(dev_priv)) 469 + return 1; 470 + 471 + /* FBC2 can only do 1:1, 1:2, 1:4 */ 472 + return fb_cpp == 2 ? 2 : 4; 473 + } 474 + 475 + static int find_compression_limit(struct drm_i915_private *dev_priv, 476 + unsigned int size, 477 + unsigned int fb_cpp) 478 + { 479 + struct intel_fbc *fbc = &dev_priv->fbc; 480 + u64 end = intel_fbc_stolen_end(dev_priv); 481 + int ret, limit = 1; 448 482 449 483 /* Try to over-allocate to reduce reallocations and fragmentation. */ 450 - ret = i915_gem_stolen_insert_node_in_range(dev_priv, node, size <<= 1, 451 - 4096, 0, end); 484 + ret = i915_gem_stolen_insert_node_in_range(dev_priv, &fbc->compressed_fb, 485 + size <<= 1, 4096, 0, end); 452 486 if (ret == 0) 453 - return compression_threshold; 487 + return limit; 454 488 455 - again: 456 - /* HW's ability to limit the CFB is 1:4 */ 457 - if (compression_threshold > 4 || 458 - (fb_cpp == 2 && compression_threshold == 2)) 459 - return 0; 460 - 461 - ret = i915_gem_stolen_insert_node_in_range(dev_priv, node, size >>= 1, 462 - 4096, 0, end); 463 - if (ret && DISPLAY_VER(dev_priv) <= 4) { 464 - return 0; 465 - } else if (ret) { 466 - compression_threshold <<= 1; 467 - goto again; 468 - } else { 469 - return compression_threshold; 489 + for (; limit <= intel_fbc_max_limit(dev_priv, fb_cpp); limit <<= 1) { 490 + ret = i915_gem_stolen_insert_node_in_range(dev_priv, &fbc->compressed_fb, 491 + size >>= 1, 4096, 0, end); 492 + if (ret == 0) 493 + return limit; 470 494 } 495 + 496 + return 0; 471 497 } 472 498 473 499 static int intel_fbc_alloc_cfb(struct drm_i915_private *dev_priv, 474 500 unsigned int size, unsigned int fb_cpp) 475 501 { 476 502 struct intel_fbc *fbc = &dev_priv->fbc; 477 - struct drm_mm_node *compressed_llb; 478 503 int ret; 479 504 480 505 drm_WARN_ON(&dev_priv->drm, 481 506 drm_mm_node_allocated(&fbc->compressed_fb)); 507 + drm_WARN_ON(&dev_priv->drm, 508 + drm_mm_node_allocated(&fbc->compressed_llb)); 482 509 483 - ret = find_compression_threshold(dev_priv, &fbc->compressed_fb, 484 - size, fb_cpp); 510 + if (DISPLAY_VER(dev_priv) < 5 && !IS_G4X(dev_priv)) { 511 + ret = i915_gem_stolen_insert_node(dev_priv, &fbc->compressed_llb, 512 + 4096, 4096); 513 + if (ret) 514 + goto err; 515 + } 516 + 517 + ret = find_compression_limit(dev_priv, size, fb_cpp); 485 518 if (!ret) 486 519 goto err_llb; 487 520 else if (ret > 1) { ··· 507 504 "Reducing the compressed framebuffer size. This may lead to less power savings than a non-reduced-size. Try to increase stolen memory size if available in BIOS.\n"); 508 505 } 509 506 510 - fbc->threshold = ret; 507 + fbc->limit = ret; 511 508 512 - if (DISPLAY_VER(dev_priv) >= 5) 509 + drm_dbg_kms(&dev_priv->drm, 510 + "reserved %llu bytes of contiguous stolen space for FBC, limit: %d\n", 511 + fbc->compressed_fb.size, fbc->limit); 512 + 513 + return 0; 514 + 515 + err_llb: 516 + if (drm_mm_node_allocated(&fbc->compressed_llb)) 517 + i915_gem_stolen_remove_node(dev_priv, &fbc->compressed_llb); 518 + err: 519 + if (drm_mm_initialized(&dev_priv->mm.stolen)) 520 + drm_info_once(&dev_priv->drm, "not enough stolen space for compressed buffer (need %d more bytes), disabling. Hint: you may be able to increase stolen memory size in the BIOS to avoid this.\n", size); 521 + return -ENOSPC; 522 + } 523 + 524 + static void intel_fbc_program_cfb(struct drm_i915_private *dev_priv) 525 + { 526 + struct intel_fbc *fbc = &dev_priv->fbc; 527 + 528 + if (DISPLAY_VER(dev_priv) >= 5) { 513 529 intel_de_write(dev_priv, ILK_DPFC_CB_BASE, 514 530 fbc->compressed_fb.start); 515 - else if (IS_GM45(dev_priv)) { 531 + } else if (IS_GM45(dev_priv)) { 516 532 intel_de_write(dev_priv, DPFC_CB_BASE, 517 533 fbc->compressed_fb.start); 518 534 } else { 519 - compressed_llb = kzalloc(sizeof(*compressed_llb), GFP_KERNEL); 520 - if (!compressed_llb) 521 - goto err_fb; 522 - 523 - ret = i915_gem_stolen_insert_node(dev_priv, compressed_llb, 524 - 4096, 4096); 525 - if (ret) 526 - goto err_fb; 527 - 528 - fbc->compressed_llb = compressed_llb; 529 - 530 535 GEM_BUG_ON(range_overflows_end_t(u64, dev_priv->dsm.start, 531 536 fbc->compressed_fb.start, 532 537 U32_MAX)); 533 538 GEM_BUG_ON(range_overflows_end_t(u64, dev_priv->dsm.start, 534 - fbc->compressed_llb->start, 539 + fbc->compressed_llb.start, 535 540 U32_MAX)); 541 + 536 542 intel_de_write(dev_priv, FBC_CFB_BASE, 537 543 dev_priv->dsm.start + fbc->compressed_fb.start); 538 544 intel_de_write(dev_priv, FBC_LL_BASE, 539 - dev_priv->dsm.start + compressed_llb->start); 545 + dev_priv->dsm.start + fbc->compressed_llb.start); 540 546 } 541 - 542 - drm_dbg_kms(&dev_priv->drm, 543 - "reserved %llu bytes of contiguous stolen space for FBC, threshold: %d\n", 544 - fbc->compressed_fb.size, fbc->threshold); 545 - 546 - return 0; 547 - 548 - err_fb: 549 - kfree(compressed_llb); 550 - i915_gem_stolen_remove_node(dev_priv, &fbc->compressed_fb); 551 - err_llb: 552 - if (drm_mm_initialized(&dev_priv->mm.stolen)) 553 - drm_info_once(&dev_priv->drm, "not enough stolen space for compressed buffer (need %d more bytes), disabling. Hint: you may be able to increase stolen memory size in the BIOS to avoid this.\n", size); 554 - return -ENOSPC; 555 547 } 556 548 557 549 static void __intel_fbc_cleanup_cfb(struct drm_i915_private *dev_priv) ··· 556 558 if (WARN_ON(intel_fbc_hw_is_active(dev_priv))) 557 559 return; 558 560 559 - if (!drm_mm_node_allocated(&fbc->compressed_fb)) 560 - return; 561 - 562 - if (fbc->compressed_llb) { 563 - i915_gem_stolen_remove_node(dev_priv, fbc->compressed_llb); 564 - kfree(fbc->compressed_llb); 565 - } 566 - 567 - i915_gem_stolen_remove_node(dev_priv, &fbc->compressed_fb); 561 + if (drm_mm_node_allocated(&fbc->compressed_llb)) 562 + i915_gem_stolen_remove_node(dev_priv, &fbc->compressed_llb); 563 + if (drm_mm_node_allocated(&fbc->compressed_fb)) 564 + i915_gem_stolen_remove_node(dev_priv, &fbc->compressed_fb); 568 565 } 569 566 570 567 void intel_fbc_cleanup_cfb(struct drm_i915_private *dev_priv) ··· 746 753 struct intel_fbc *fbc = &dev_priv->fbc; 747 754 748 755 return intel_fbc_calculate_cfb_size(dev_priv, &fbc->state_cache) > 749 - fbc->compressed_fb.size * fbc->threshold; 756 + fbc->compressed_fb.size * fbc->limit; 750 757 } 751 758 752 759 static u16 intel_fbc_gen9_wa_cfb_stride(struct drm_i915_private *dev_priv) ··· 756 763 757 764 if ((DISPLAY_VER(dev_priv) == 9) && 758 765 cache->fb.modifier != I915_FORMAT_MOD_X_TILED) 759 - return DIV_ROUND_UP(cache->plane.src_w, 32 * fbc->threshold) * 8; 766 + return DIV_ROUND_UP(cache->plane.src_w, 32 * fbc->limit) * 8; 760 767 else 761 768 return 0; 762 769 } ··· 1295 1302 fbc->no_fbc_reason = "FBC enabled but not active yet\n"; 1296 1303 1297 1304 fbc->crtc = crtc; 1305 + 1306 + intel_fbc_program_cfb(dev_priv); 1298 1307 out: 1299 1308 mutex_unlock(&fbc->lock); 1300 1309 }
+56 -38
drivers/gpu/drm/i915/display/intel_fbdev.c
··· 335 335 * fbcon), so we just find the biggest and use that. 336 336 */ 337 337 static bool intel_fbdev_init_bios(struct drm_device *dev, 338 - struct intel_fbdev *ifbdev) 338 + struct intel_fbdev *ifbdev) 339 339 { 340 340 struct drm_i915_private *i915 = to_i915(dev); 341 341 struct intel_framebuffer *fb = NULL; 342 - struct drm_crtc *crtc; 343 - struct intel_crtc *intel_crtc; 342 + struct intel_crtc *crtc; 344 343 unsigned int max_size = 0; 345 344 346 345 /* Find the largest fb */ 347 - for_each_crtc(dev, crtc) { 346 + for_each_intel_crtc(dev, crtc) { 347 + struct intel_crtc_state *crtc_state = 348 + to_intel_crtc_state(crtc->base.state); 349 + struct intel_plane *plane = 350 + to_intel_plane(crtc->base.primary); 351 + struct intel_plane_state *plane_state = 352 + to_intel_plane_state(plane->base.state); 348 353 struct drm_i915_gem_object *obj = 349 - intel_fb_obj(crtc->primary->state->fb); 350 - intel_crtc = to_intel_crtc(crtc); 354 + intel_fb_obj(plane_state->uapi.fb); 351 355 352 - if (!crtc->state->active || !obj) { 356 + if (!crtc_state->uapi.active) { 353 357 drm_dbg_kms(&i915->drm, 354 - "pipe %c not active or no fb, skipping\n", 355 - pipe_name(intel_crtc->pipe)); 358 + "[CRTC:%d:%s] not active, skipping\n", 359 + crtc->base.base.id, crtc->base.name); 360 + continue; 361 + } 362 + 363 + if (!obj) { 364 + drm_dbg_kms(&i915->drm, 365 + "[PLANE:%d:%s] no fb, skipping\n", 366 + plane->base.base.id, plane->base.name); 356 367 continue; 357 368 } 358 369 359 370 if (obj->base.size > max_size) { 360 371 drm_dbg_kms(&i915->drm, 361 - "found possible fb from plane %c\n", 362 - pipe_name(intel_crtc->pipe)); 363 - fb = to_intel_framebuffer(crtc->primary->state->fb); 372 + "found possible fb from [PLANE:%d:%s]\n", 373 + plane->base.base.id, plane->base.name); 374 + fb = to_intel_framebuffer(plane_state->uapi.fb); 364 375 max_size = obj->base.size; 365 376 } 366 377 } ··· 383 372 } 384 373 385 374 /* Now make sure all the pipes will fit into it */ 386 - for_each_crtc(dev, crtc) { 375 + for_each_intel_crtc(dev, crtc) { 376 + struct intel_crtc_state *crtc_state = 377 + to_intel_crtc_state(crtc->base.state); 378 + struct intel_plane *plane = 379 + to_intel_plane(crtc->base.primary); 387 380 unsigned int cur_size; 388 381 389 - intel_crtc = to_intel_crtc(crtc); 390 - 391 - if (!crtc->state->active) { 382 + if (!crtc_state->uapi.active) { 392 383 drm_dbg_kms(&i915->drm, 393 - "pipe %c not active, skipping\n", 394 - pipe_name(intel_crtc->pipe)); 384 + "[CRTC:%d:%s] not active, skipping\n", 385 + crtc->base.base.id, crtc->base.name); 395 386 continue; 396 387 } 397 388 398 - drm_dbg_kms(&i915->drm, "checking plane %c for BIOS fb\n", 399 - pipe_name(intel_crtc->pipe)); 389 + drm_dbg_kms(&i915->drm, "checking [PLANE:%d:%s] for BIOS fb\n", 390 + plane->base.base.id, plane->base.name); 400 391 401 392 /* 402 393 * See if the plane fb we found above will fit on this 403 394 * pipe. Note we need to use the selected fb's pitch and bpp 404 395 * rather than the current pipe's, since they differ. 405 396 */ 406 - cur_size = crtc->state->adjusted_mode.crtc_hdisplay; 397 + cur_size = crtc_state->uapi.adjusted_mode.crtc_hdisplay; 407 398 cur_size = cur_size * fb->base.format->cpp[0]; 408 399 if (fb->base.pitches[0] < cur_size) { 409 400 drm_dbg_kms(&i915->drm, 410 - "fb not wide enough for plane %c (%d vs %d)\n", 411 - pipe_name(intel_crtc->pipe), 401 + "fb not wide enough for [PLANE:%d:%s] (%d vs %d)\n", 402 + plane->base.base.id, plane->base.name, 412 403 cur_size, fb->base.pitches[0]); 413 404 fb = NULL; 414 405 break; 415 406 } 416 407 417 - cur_size = crtc->state->adjusted_mode.crtc_vdisplay; 408 + cur_size = crtc_state->uapi.adjusted_mode.crtc_vdisplay; 418 409 cur_size = intel_fb_align_height(&fb->base, 0, cur_size); 419 410 cur_size *= fb->base.pitches[0]; 420 411 drm_dbg_kms(&i915->drm, 421 - "pipe %c area: %dx%d, bpp: %d, size: %d\n", 422 - pipe_name(intel_crtc->pipe), 423 - crtc->state->adjusted_mode.crtc_hdisplay, 424 - crtc->state->adjusted_mode.crtc_vdisplay, 412 + "[CRTC:%d:%s] area: %dx%d, bpp: %d, size: %d\n", 413 + crtc->base.base.id, crtc->base.name, 414 + crtc_state->uapi.adjusted_mode.crtc_hdisplay, 415 + crtc_state->uapi.adjusted_mode.crtc_vdisplay, 425 416 fb->base.format->cpp[0] * 8, 426 417 cur_size); 427 418 428 419 if (cur_size > max_size) { 429 420 drm_dbg_kms(&i915->drm, 430 - "fb not big enough for plane %c (%d vs %d)\n", 431 - pipe_name(intel_crtc->pipe), 421 + "fb not big enough for [PLANE:%d:%s] (%d vs %d)\n", 422 + plane->base.base.id, plane->base.name, 432 423 cur_size, max_size); 433 424 fb = NULL; 434 425 break; 435 426 } 436 427 437 428 drm_dbg_kms(&i915->drm, 438 - "fb big enough for plane %c (%d >= %d)\n", 439 - pipe_name(intel_crtc->pipe), 429 + "fb big enough [PLANE:%d:%s] (%d >= %d)\n", 430 + plane->base.base.id, plane->base.name, 440 431 max_size, cur_size); 441 432 } 442 433 ··· 454 441 drm_framebuffer_get(&ifbdev->fb->base); 455 442 456 443 /* Final pass to check if any active pipes don't have fbs */ 457 - for_each_crtc(dev, crtc) { 458 - intel_crtc = to_intel_crtc(crtc); 444 + for_each_intel_crtc(dev, crtc) { 445 + struct intel_crtc_state *crtc_state = 446 + to_intel_crtc_state(crtc->base.state); 447 + struct intel_plane *plane = 448 + to_intel_plane(crtc->base.primary); 449 + struct intel_plane_state *plane_state = 450 + to_intel_plane_state(plane->base.state); 459 451 460 - if (!crtc->state->active) 452 + if (!crtc_state->uapi.active) 461 453 continue; 462 454 463 - drm_WARN(dev, !crtc->primary->state->fb, 464 - "re-used BIOS config but lost an fb on crtc %d\n", 465 - crtc->base.id); 455 + drm_WARN(dev, !plane_state->uapi.fb, 456 + "re-used BIOS config but lost an fb on [PLANE:%d:%s]\n", 457 + plane->base.base.id, plane->base.name); 466 458 } 467 459 468 460
+12 -13
drivers/gpu/drm/i915/display/intel_fdi.c
··· 4 4 */ 5 5 #include "intel_atomic.h" 6 6 #include "intel_ddi.h" 7 - #include "intel_ddi_buf_trans.h" 8 7 #include "intel_de.h" 9 8 #include "intel_display_types.h" 10 9 #include "intel_fdi.h" ··· 95 96 } 96 97 } 97 98 98 - int ilk_fdi_compute_config(struct intel_crtc *intel_crtc, 99 - struct intel_crtc_state *pipe_config) 99 + int ilk_fdi_compute_config(struct intel_crtc *crtc, 100 + struct intel_crtc_state *pipe_config) 100 101 { 101 - struct drm_device *dev = intel_crtc->base.dev; 102 + struct drm_device *dev = crtc->base.dev; 102 103 struct drm_i915_private *i915 = to_i915(dev); 103 104 const struct drm_display_mode *adjusted_mode = &pipe_config->hw.adjusted_mode; 104 105 int lane, link_bw, fdi_dotclock, ret; ··· 124 125 intel_link_compute_m_n(pipe_config->pipe_bpp, lane, fdi_dotclock, 125 126 link_bw, &pipe_config->fdi_m_n, false, false); 126 127 127 - ret = ilk_check_fdi_lanes(dev, intel_crtc->pipe, pipe_config); 128 + ret = ilk_check_fdi_lanes(dev, crtc->pipe, pipe_config); 128 129 if (ret == -EDEADLK) 129 130 return ret; 130 131 ··· 568 569 u32 temp, i, rx_ctl_val; 569 570 int n_entries; 570 571 571 - intel_ddi_get_buf_trans_fdi(dev_priv, &n_entries); 572 + encoder->get_buf_trans(encoder, crtc_state, &n_entries); 572 573 573 - intel_prepare_dp_ddi_buffers(encoder, crtc_state); 574 + hsw_prepare_dp_ddi_buffers(encoder, crtc_state); 574 575 575 576 /* Set the FDI_RX_MISC pwrdn lanes and the 2 workarounds listed at the 576 577 * mode set "sequence for CRT port" document: ··· 690 691 691 692 void ilk_fdi_pll_enable(const struct intel_crtc_state *crtc_state) 692 693 { 693 - struct intel_crtc *intel_crtc = to_intel_crtc(crtc_state->uapi.crtc); 694 - struct drm_i915_private *dev_priv = to_i915(intel_crtc->base.dev); 695 - enum pipe pipe = intel_crtc->pipe; 694 + struct intel_crtc *crtc = to_intel_crtc(crtc_state->uapi.crtc); 695 + struct drm_i915_private *dev_priv = to_i915(crtc->base.dev); 696 + enum pipe pipe = crtc->pipe; 696 697 i915_reg_t reg; 697 698 u32 temp; 698 699 ··· 725 726 } 726 727 } 727 728 728 - void ilk_fdi_pll_disable(struct intel_crtc *intel_crtc) 729 + void ilk_fdi_pll_disable(struct intel_crtc *crtc) 729 730 { 730 - struct drm_device *dev = intel_crtc->base.dev; 731 + struct drm_device *dev = crtc->base.dev; 731 732 struct drm_i915_private *dev_priv = to_i915(dev); 732 - enum pipe pipe = intel_crtc->pipe; 733 + enum pipe pipe = crtc->pipe; 733 734 i915_reg_t reg; 734 735 u32 temp; 735 736
+20 -22
drivers/gpu/drm/i915/display/intel_hdmi.c
··· 270 270 { 271 271 const u32 *data = frame; 272 272 struct drm_i915_private *dev_priv = to_i915(encoder->base.dev); 273 - struct intel_crtc *intel_crtc = to_intel_crtc(crtc_state->uapi.crtc); 274 - i915_reg_t reg = TVIDEO_DIP_CTL(intel_crtc->pipe); 273 + struct intel_crtc *crtc = to_intel_crtc(crtc_state->uapi.crtc); 274 + i915_reg_t reg = TVIDEO_DIP_CTL(crtc->pipe); 275 275 u32 val = intel_de_read(dev_priv, reg); 276 276 int i; 277 277 ··· 286 286 intel_de_write(dev_priv, reg, val); 287 287 288 288 for (i = 0; i < len; i += 4) { 289 - intel_de_write(dev_priv, TVIDEO_DIP_DATA(intel_crtc->pipe), 289 + intel_de_write(dev_priv, TVIDEO_DIP_DATA(crtc->pipe), 290 290 *data); 291 291 data++; 292 292 } 293 293 /* Write every possible data byte to force correct ECC calculation. */ 294 294 for (; i < VIDEO_DIP_DATA_SIZE; i += 4) 295 - intel_de_write(dev_priv, TVIDEO_DIP_DATA(intel_crtc->pipe), 0); 295 + intel_de_write(dev_priv, TVIDEO_DIP_DATA(crtc->pipe), 0); 296 296 297 297 val |= g4x_infoframe_enable(type); 298 298 val &= ~VIDEO_DIP_FREQ_MASK; ··· 349 349 { 350 350 const u32 *data = frame; 351 351 struct drm_i915_private *dev_priv = to_i915(encoder->base.dev); 352 - struct intel_crtc *intel_crtc = to_intel_crtc(crtc_state->uapi.crtc); 353 - i915_reg_t reg = TVIDEO_DIP_CTL(intel_crtc->pipe); 352 + struct intel_crtc *crtc = to_intel_crtc(crtc_state->uapi.crtc); 353 + i915_reg_t reg = TVIDEO_DIP_CTL(crtc->pipe); 354 354 u32 val = intel_de_read(dev_priv, reg); 355 355 int i; 356 356 ··· 368 368 intel_de_write(dev_priv, reg, val); 369 369 370 370 for (i = 0; i < len; i += 4) { 371 - intel_de_write(dev_priv, TVIDEO_DIP_DATA(intel_crtc->pipe), 371 + intel_de_write(dev_priv, TVIDEO_DIP_DATA(crtc->pipe), 372 372 *data); 373 373 data++; 374 374 } 375 375 /* Write every possible data byte to force correct ECC calculation. */ 376 376 for (; i < VIDEO_DIP_DATA_SIZE; i += 4) 377 - intel_de_write(dev_priv, TVIDEO_DIP_DATA(intel_crtc->pipe), 0); 377 + intel_de_write(dev_priv, TVIDEO_DIP_DATA(crtc->pipe), 0); 378 378 379 379 val |= g4x_infoframe_enable(type); 380 380 val &= ~VIDEO_DIP_FREQ_MASK; ··· 427 427 { 428 428 const u32 *data = frame; 429 429 struct drm_i915_private *dev_priv = to_i915(encoder->base.dev); 430 - struct intel_crtc *intel_crtc = to_intel_crtc(crtc_state->uapi.crtc); 431 - i915_reg_t reg = VLV_TVIDEO_DIP_CTL(intel_crtc->pipe); 430 + struct intel_crtc *crtc = to_intel_crtc(crtc_state->uapi.crtc); 431 + i915_reg_t reg = VLV_TVIDEO_DIP_CTL(crtc->pipe); 432 432 u32 val = intel_de_read(dev_priv, reg); 433 433 int i; 434 434 ··· 444 444 445 445 for (i = 0; i < len; i += 4) { 446 446 intel_de_write(dev_priv, 447 - VLV_TVIDEO_DIP_DATA(intel_crtc->pipe), *data); 447 + VLV_TVIDEO_DIP_DATA(crtc->pipe), *data); 448 448 data++; 449 449 } 450 450 /* Write every possible data byte to force correct ECC calculation. */ 451 451 for (; i < VIDEO_DIP_DATA_SIZE; i += 4) 452 452 intel_de_write(dev_priv, 453 - VLV_TVIDEO_DIP_DATA(intel_crtc->pipe), 0); 453 + VLV_TVIDEO_DIP_DATA(crtc->pipe), 0); 454 454 455 455 val |= g4x_infoframe_enable(type); 456 456 val &= ~VIDEO_DIP_FREQ_MASK; ··· 1040 1040 const struct drm_connector_state *conn_state) 1041 1041 { 1042 1042 struct drm_i915_private *dev_priv = to_i915(encoder->base.dev); 1043 - struct intel_crtc *intel_crtc = to_intel_crtc(crtc_state->uapi.crtc); 1043 + struct intel_crtc *crtc = to_intel_crtc(crtc_state->uapi.crtc); 1044 1044 struct intel_digital_port *dig_port = enc_to_dig_port(encoder); 1045 1045 struct intel_hdmi *intel_hdmi = &dig_port->hdmi; 1046 - i915_reg_t reg = TVIDEO_DIP_CTL(intel_crtc->pipe); 1046 + i915_reg_t reg = TVIDEO_DIP_CTL(crtc->pipe); 1047 1047 u32 val = intel_de_read(dev_priv, reg); 1048 1048 u32 port = VIDEO_DIP_PORT(encoder->port); 1049 1049 ··· 1099 1099 const struct drm_connector_state *conn_state) 1100 1100 { 1101 1101 struct drm_i915_private *dev_priv = to_i915(encoder->base.dev); 1102 - struct intel_crtc *intel_crtc = to_intel_crtc(crtc_state->uapi.crtc); 1102 + struct intel_crtc *crtc = to_intel_crtc(crtc_state->uapi.crtc); 1103 1103 struct intel_hdmi *intel_hdmi = enc_to_intel_hdmi(encoder); 1104 - i915_reg_t reg = TVIDEO_DIP_CTL(intel_crtc->pipe); 1104 + i915_reg_t reg = TVIDEO_DIP_CTL(crtc->pipe); 1105 1105 u32 val = intel_de_read(dev_priv, reg); 1106 1106 1107 1107 assert_hdmi_port_disabled(intel_hdmi); ··· 1148 1148 const struct drm_connector_state *conn_state) 1149 1149 { 1150 1150 struct drm_i915_private *dev_priv = to_i915(encoder->base.dev); 1151 - struct intel_crtc *intel_crtc = to_intel_crtc(crtc_state->uapi.crtc); 1151 + struct intel_crtc *crtc = to_intel_crtc(crtc_state->uapi.crtc); 1152 1152 struct intel_hdmi *intel_hdmi = enc_to_intel_hdmi(encoder); 1153 - i915_reg_t reg = VLV_TVIDEO_DIP_CTL(intel_crtc->pipe); 1153 + i915_reg_t reg = VLV_TVIDEO_DIP_CTL(crtc->pipe); 1154 1154 u32 val = intel_de_read(dev_priv, reg); 1155 1155 u32 port = VIDEO_DIP_PORT(encoder->port); 1156 1156 ··· 1465 1465 { 1466 1466 struct drm_i915_private *dev_priv = to_i915(connector->base.dev); 1467 1467 struct intel_digital_port *dig_port = intel_attached_dig_port(connector); 1468 - struct drm_crtc *crtc = connector->base.state->crtc; 1469 - struct intel_crtc *intel_crtc = container_of(crtc, 1470 - struct intel_crtc, base); 1468 + struct intel_crtc *crtc = to_intel_crtc(connector->base.state->crtc); 1471 1469 u32 scanline; 1472 1470 int ret; 1473 1471 1474 1472 for (;;) { 1475 - scanline = intel_de_read(dev_priv, PIPEDSL(intel_crtc->pipe)); 1473 + scanline = intel_de_read(dev_priv, PIPEDSL(crtc->pipe)); 1476 1474 if (scanline > 100 && scanline < 200) 1477 1475 break; 1478 1476 usleep_range(25, 50);
+2 -2
drivers/gpu/drm/i915/display/intel_lvds.c
··· 411 411 struct intel_connector *intel_connector = 412 412 lvds_encoder->attached_connector; 413 413 struct drm_display_mode *adjusted_mode = &pipe_config->hw.adjusted_mode; 414 - struct intel_crtc *intel_crtc = to_intel_crtc(pipe_config->uapi.crtc); 414 + struct intel_crtc *crtc = to_intel_crtc(pipe_config->uapi.crtc); 415 415 unsigned int lvds_bpp; 416 416 int ret; 417 417 418 418 /* Should never happen!! */ 419 - if (DISPLAY_VER(dev_priv) < 4 && intel_crtc->pipe == 0) { 419 + if (DISPLAY_VER(dev_priv) < 4 && crtc->pipe == 0) { 420 420 drm_err(&dev_priv->drm, "Can't support LVDS on pipe A\n"); 421 421 return -EINVAL; 422 422 }
+168 -33
drivers/gpu/drm/i915/display/intel_psr.c
··· 265 265 return val; 266 266 } 267 267 268 - static u16 intel_dp_get_su_x_granulartiy(struct intel_dp *intel_dp) 268 + static void intel_dp_get_su_granularity(struct intel_dp *intel_dp) 269 269 { 270 270 struct drm_i915_private *i915 = dp_to_i915(intel_dp); 271 - u16 val; 272 271 ssize_t r; 272 + u16 w; 273 + u8 y; 273 274 274 - /* 275 - * Returning the default X granularity if granularity not required or 276 - * if DPCD read fails 277 - */ 278 - if (!(intel_dp->psr_dpcd[1] & DP_PSR2_SU_GRANULARITY_REQUIRED)) 279 - return 4; 275 + /* If sink don't have specific granularity requirements set legacy ones */ 276 + if (!(intel_dp->psr_dpcd[1] & DP_PSR2_SU_GRANULARITY_REQUIRED)) { 277 + /* As PSR2 HW sends full lines, we do not care about x granularity */ 278 + w = 4; 279 + y = 4; 280 + goto exit; 281 + } 280 282 281 - r = drm_dp_dpcd_read(&intel_dp->aux, DP_PSR2_SU_X_GRANULARITY, &val, 2); 283 + r = drm_dp_dpcd_read(&intel_dp->aux, DP_PSR2_SU_X_GRANULARITY, &w, 2); 282 284 if (r != 2) 283 285 drm_dbg_kms(&i915->drm, 284 286 "Unable to read DP_PSR2_SU_X_GRANULARITY\n"); 285 - 286 287 /* 287 288 * Spec says that if the value read is 0 the default granularity should 288 289 * be used instead. 289 290 */ 290 - if (r != 2 || val == 0) 291 - val = 4; 291 + if (r != 2 || w == 0) 292 + w = 4; 292 293 293 - return val; 294 + r = drm_dp_dpcd_read(&intel_dp->aux, DP_PSR2_SU_Y_GRANULARITY, &y, 1); 295 + if (r != 1) { 296 + drm_dbg_kms(&i915->drm, 297 + "Unable to read DP_PSR2_SU_Y_GRANULARITY\n"); 298 + y = 4; 299 + } 300 + if (y == 0) 301 + y = 1; 302 + 303 + exit: 304 + intel_dp->psr.su_w_granularity = w; 305 + intel_dp->psr.su_y_granularity = y; 294 306 } 295 307 296 308 void intel_psr_init_dpcd(struct intel_dp *intel_dp) ··· 358 346 if (intel_dp->psr.sink_psr2_support) { 359 347 intel_dp->psr.colorimetry_support = 360 348 intel_dp_get_colorimetry_status(intel_dp); 361 - intel_dp->psr.su_x_granularity = 362 - intel_dp_get_su_x_granulartiy(intel_dp); 349 + intel_dp_get_su_granularity(intel_dp); 363 350 } 364 351 } 365 352 } ··· 417 406 if (DISPLAY_VER(dev_priv) >= 8) 418 407 dpcd_val |= DP_PSR_CRC_VERIFICATION; 419 408 } 409 + 410 + if (intel_dp->psr.req_psr2_sdp_prior_scanline) 411 + dpcd_val |= DP_PSR_SU_REGION_SCANLINE_CAPTURE; 420 412 421 413 drm_dp_dpcd_writeb(&intel_dp->aux, DP_PSR_EN_CFG, dpcd_val); 422 414 ··· 545 531 val |= EDP_PSR2_FRAME_BEFORE_SU(intel_dp->psr.sink_sync_latency + 1); 546 532 val |= intel_psr2_get_tp_time(intel_dp); 547 533 548 - if (DISPLAY_VER(dev_priv) >= 12) { 534 + /* Wa_22012278275:adlp */ 535 + if (IS_ADLP_DISPLAY_STEP(dev_priv, STEP_A0, STEP_D1)) { 536 + static const u8 map[] = { 537 + 2, /* 5 lines */ 538 + 1, /* 6 lines */ 539 + 0, /* 7 lines */ 540 + 3, /* 8 lines */ 541 + 6, /* 9 lines */ 542 + 5, /* 10 lines */ 543 + 4, /* 11 lines */ 544 + 7, /* 12 lines */ 545 + }; 546 + /* 547 + * Still using the default IO_BUFFER_WAKE and FAST_WAKE, see 548 + * comments bellow for more information 549 + */ 550 + u32 tmp, lines = 7; 551 + 552 + val |= TGL_EDP_PSR2_BLOCK_COUNT_NUM_2; 553 + 554 + tmp = map[lines - TGL_EDP_PSR2_IO_BUFFER_WAKE_MIN_LINES]; 555 + tmp = tmp << TGL_EDP_PSR2_IO_BUFFER_WAKE_SHIFT; 556 + val |= tmp; 557 + 558 + tmp = map[lines - TGL_EDP_PSR2_FAST_WAKE_MIN_LINES]; 559 + tmp = tmp << TGL_EDP_PSR2_FAST_WAKE_MIN_SHIFT; 560 + val |= tmp; 561 + } else if (DISPLAY_VER(dev_priv) >= 12) { 549 562 /* 550 563 * TODO: 7 lines of IO_BUFFER_WAKE and FAST_WAKE are default 551 564 * values from BSpec. In order to setting an optimal power ··· 587 546 val |= EDP_PSR2_IO_BUFFER_WAKE(7); 588 547 val |= EDP_PSR2_FAST_WAKE(7); 589 548 } 549 + 550 + if (intel_dp->psr.req_psr2_sdp_prior_scanline) 551 + val |= EDP_PSR2_SU_SDP_SCANLINE; 590 552 591 553 if (intel_dp->psr.psr2_sel_fetch_enabled) { 592 554 /* WA 1408330847 */ ··· 733 689 if (!dc3co_is_pipe_port_compatible(intel_dp, crtc_state)) 734 690 return; 735 691 692 + /* Wa_16011303918:adlp */ 693 + if (IS_ADLP_DISPLAY_STEP(dev_priv, STEP_A0, STEP_A0)) 694 + return; 695 + 736 696 /* 737 697 * DC3CO Exit time 200us B.Spec 49196 738 698 * PSR2 transcoder Early Exit scanlines = ROUNDUP(200 / line time) + 1 ··· 788 740 } 789 741 790 742 return crtc_state->enable_psr2_sel_fetch = true; 743 + } 744 + 745 + static bool psr2_granularity_check(struct intel_dp *intel_dp, 746 + struct intel_crtc_state *crtc_state) 747 + { 748 + const int crtc_hdisplay = crtc_state->hw.adjusted_mode.crtc_hdisplay; 749 + const int crtc_vdisplay = crtc_state->hw.adjusted_mode.crtc_vdisplay; 750 + u16 y_granularity = 0; 751 + 752 + /* PSR2 HW only send full lines so we only need to validate the width */ 753 + if (crtc_hdisplay % intel_dp->psr.su_w_granularity) 754 + return false; 755 + 756 + if (crtc_vdisplay % intel_dp->psr.su_y_granularity) 757 + return false; 758 + 759 + /* HW tracking is only aligned to 4 lines */ 760 + if (!crtc_state->enable_psr2_sel_fetch) 761 + return intel_dp->psr.su_y_granularity == 4; 762 + 763 + /* 764 + * For SW tracking we can adjust the y to match sink requirement if 765 + * multiple of 4 766 + */ 767 + if (intel_dp->psr.su_y_granularity <= 2) 768 + y_granularity = 4; 769 + else if ((intel_dp->psr.su_y_granularity % 4) == 0) 770 + y_granularity = intel_dp->psr.su_y_granularity; 771 + 772 + if (y_granularity == 0 || crtc_vdisplay % y_granularity) 773 + return false; 774 + 775 + crtc_state->su_y_granularity = y_granularity; 776 + return true; 777 + } 778 + 779 + static bool _compute_psr2_sdp_prior_scanline_indication(struct intel_dp *intel_dp, 780 + struct intel_crtc_state *crtc_state) 781 + { 782 + const struct drm_display_mode *adjusted_mode = &crtc_state->uapi.adjusted_mode; 783 + struct drm_i915_private *dev_priv = dp_to_i915(intel_dp); 784 + u32 hblank_total, hblank_ns, req_ns; 785 + 786 + hblank_total = adjusted_mode->crtc_hblank_end - adjusted_mode->crtc_hblank_start; 787 + hblank_ns = div_u64(1000000ULL * hblank_total, adjusted_mode->crtc_clock); 788 + 789 + /* From spec: (72 / number of lanes) * 1000 / symbol clock frequency MHz */ 790 + req_ns = (72 / crtc_state->lane_count) * 1000 / (crtc_state->port_clock / 1000); 791 + 792 + if ((hblank_ns - req_ns) > 100) 793 + return true; 794 + 795 + if (DISPLAY_VER(dev_priv) < 13 || intel_dp->edp_dpcd[0] < DP_EDP_14b) 796 + return false; 797 + 798 + crtc_state->req_psr2_sdp_prior_scanline = true; 799 + return true; 791 800 } 792 801 793 802 static bool intel_psr2_config_valid(struct intel_dp *intel_dp, ··· 929 824 return false; 930 825 } 931 826 932 - /* 933 - * HW sends SU blocks of size four scan lines, which means the starting 934 - * X coordinate and Y granularity requirements will always be met. We 935 - * only need to validate the SU block width is a multiple of 936 - * x granularity. 937 - */ 938 - if (crtc_hdisplay % intel_dp->psr.su_x_granularity) { 939 - drm_dbg_kms(&dev_priv->drm, 940 - "PSR2 not enabled, hdisplay(%d) not multiple of %d\n", 941 - crtc_hdisplay, intel_dp->psr.su_x_granularity); 942 - return false; 943 - } 944 - 945 827 if (HAS_PSR2_SEL_FETCH(dev_priv)) { 946 828 if (!intel_psr2_sel_fetch_config_valid(intel_dp, crtc_state) && 947 829 !HAS_PSR_HW_TRACKING(dev_priv)) { ··· 945 853 return false; 946 854 } 947 855 856 + if (!psr2_granularity_check(intel_dp, crtc_state)) { 857 + drm_dbg_kms(&dev_priv->drm, "PSR2 not enabled, SU granularity not compatible\n"); 858 + return false; 859 + } 860 + 948 861 if (!crtc_state->enable_psr2_sel_fetch && 949 862 (crtc_hdisplay > psr_max_h || crtc_vdisplay > psr_max_v)) { 950 863 drm_dbg_kms(&dev_priv->drm, 951 864 "PSR2 not enabled, resolution %dx%d > max supported %dx%d\n", 952 865 crtc_hdisplay, crtc_vdisplay, 953 866 psr_max_h, psr_max_v); 867 + return false; 868 + } 869 + 870 + if (!_compute_psr2_sdp_prior_scanline_indication(intel_dp, crtc_state)) { 871 + drm_dbg_kms(&dev_priv->drm, 872 + "PSR2 not enabled, PSR2 SDP indication do not fit in hblank\n"); 873 + return false; 874 + } 875 + 876 + /* Wa_16011303918:adlp */ 877 + if (crtc_state->vrr.enable && 878 + IS_ADLP_DISPLAY_STEP(dev_priv, STEP_A0, STEP_A0)) { 879 + drm_dbg_kms(&dev_priv->drm, 880 + "PSR2 not enabled, not compatible with HW stepping + VRR\n"); 954 881 return false; 955 882 } 956 883 ··· 1159 1048 intel_de_rmw(dev_priv, CHICKEN_PAR1_1, IGNORE_PSR2_HW_TRACKING, 1160 1049 intel_dp->psr.psr2_sel_fetch_enabled ? 1161 1050 IGNORE_PSR2_HW_TRACKING : 0); 1051 + 1052 + /* Wa_16011168373:adlp */ 1053 + if (IS_ADLP_DISPLAY_STEP(dev_priv, STEP_A0, STEP_A0) && 1054 + intel_dp->psr.psr2_enabled) 1055 + intel_de_rmw(dev_priv, 1056 + TRANS_SET_CONTEXT_LATENCY(intel_dp->psr.transcoder), 1057 + TRANS_SET_CONTEXT_LATENCY_MASK, 1058 + TRANS_SET_CONTEXT_LATENCY_VALUE(1)); 1162 1059 } 1163 1060 1164 1061 static bool psr_interrupt_error_check(struct intel_dp *intel_dp) ··· 1220 1101 intel_dp->psr.dc3co_exit_delay = val; 1221 1102 intel_dp->psr.dc3co_exitline = crtc_state->dc3co_exitline; 1222 1103 intel_dp->psr.psr2_sel_fetch_enabled = crtc_state->enable_psr2_sel_fetch; 1104 + intel_dp->psr.req_psr2_sdp_prior_scanline = 1105 + crtc_state->req_psr2_sdp_prior_scanline; 1223 1106 1224 1107 if (!psr_interrupt_error_check(intel_dp)) 1225 1108 return; ··· 1345 1224 IS_RKL_REVID(dev_priv, RKL_REVID_A0, RKL_REVID_A0))) 1346 1225 intel_de_rmw(dev_priv, CHICKEN_PAR1_1, 1347 1226 DIS_RAM_BYPASS_PSR2_MAN_TRACK, 0); 1227 + 1228 + /* Wa_16011168373:adlp */ 1229 + if (IS_ADLP_DISPLAY_STEP(dev_priv, STEP_A0, STEP_A0) && 1230 + intel_dp->psr.psr2_enabled) 1231 + intel_de_rmw(dev_priv, 1232 + TRANS_SET_CONTEXT_LATENCY(intel_dp->psr.transcoder), 1233 + TRANS_SET_CONTEXT_LATENCY_MASK, 0); 1348 1234 1349 1235 /* Disable PSR on Sink */ 1350 1236 drm_dp_dpcd_writeb(&intel_dp->aux, DP_PSR_EN_CFG, 0); ··· 1560 1432 overlap_damage_area->y2 = damage_area->y2; 1561 1433 } 1562 1434 1435 + static void intel_psr2_sel_fetch_pipe_alignment(const struct intel_crtc_state *crtc_state, 1436 + struct drm_rect *pipe_clip) 1437 + { 1438 + const u16 y_alignment = crtc_state->su_y_granularity; 1439 + 1440 + pipe_clip->y1 -= pipe_clip->y1 % y_alignment; 1441 + if (pipe_clip->y2 % y_alignment) 1442 + pipe_clip->y2 = ((pipe_clip->y2 / y_alignment) + 1) * y_alignment; 1443 + } 1444 + 1563 1445 int intel_psr2_sel_fetch_update(struct intel_atomic_state *state, 1564 1446 struct intel_crtc *crtc) 1565 1447 { ··· 1678 1540 if (full_update) 1679 1541 goto skip_sel_fetch_set_loop; 1680 1542 1681 - /* It must be aligned to 4 lines */ 1682 - pipe_clip.y1 -= pipe_clip.y1 % 4; 1683 - if (pipe_clip.y2 % 4) 1684 - pipe_clip.y2 = ((pipe_clip.y2 / 4) + 1) * 4; 1543 + intel_psr2_sel_fetch_pipe_alignment(crtc_state, &pipe_clip); 1685 1544 1686 1545 /* 1687 1546 * Now that we have the pipe damaged area check if it intersect with
+34
drivers/gpu/drm/i915/display/intel_quirks.c
··· 53 53 drm_info(&i915->drm, "Applying Increase DDI Disabled quirk\n"); 54 54 } 55 55 56 + static void quirk_no_pps_backlight_power_hook(struct drm_i915_private *i915) 57 + { 58 + i915->quirks |= QUIRK_NO_PPS_BACKLIGHT_POWER_HOOK; 59 + drm_info(&i915->drm, "Applying no pps backlight power quirk\n"); 60 + } 61 + 56 62 struct intel_quirk { 57 63 int device; 58 64 int subsystem_vendor; ··· 75 69 static int intel_dmi_reverse_brightness(const struct dmi_system_id *id) 76 70 { 77 71 DRM_INFO("Backlight polarity reversed on %s\n", id->ident); 72 + return 1; 73 + } 74 + 75 + static int intel_dmi_no_pps_backlight(const struct dmi_system_id *id) 76 + { 77 + DRM_INFO("No pps backlight support on %s\n", id->ident); 78 78 return 1; 79 79 } 80 80 ··· 107 95 { } /* terminating entry */ 108 96 }, 109 97 .hook = quirk_invert_brightness, 98 + }, 99 + { 100 + .dmi_id_list = &(const struct dmi_system_id[]) { 101 + { 102 + .callback = intel_dmi_no_pps_backlight, 103 + .ident = "Google Lillipup sku524294", 104 + .matches = {DMI_EXACT_MATCH(DMI_BOARD_VENDOR, "Google"), 105 + DMI_EXACT_MATCH(DMI_BOARD_NAME, "Lindar"), 106 + DMI_EXACT_MATCH(DMI_PRODUCT_SKU, "sku524294"), 107 + }, 108 + }, 109 + { 110 + .callback = intel_dmi_no_pps_backlight, 111 + .ident = "Google Lillipup sku524295", 112 + .matches = {DMI_EXACT_MATCH(DMI_BOARD_VENDOR, "Google"), 113 + DMI_EXACT_MATCH(DMI_BOARD_NAME, "Lindar"), 114 + DMI_EXACT_MATCH(DMI_PRODUCT_SKU, "sku524295"), 115 + }, 116 + }, 117 + { } 118 + }, 119 + .hook = quirk_no_pps_backlight_power_hook, 110 120 }, 111 121 }; 112 122
+2 -2
drivers/gpu/drm/i915/display/intel_sdvo.c
··· 1824 1824 struct drm_device *dev = encoder->base.dev; 1825 1825 struct drm_i915_private *dev_priv = to_i915(dev); 1826 1826 struct intel_sdvo *intel_sdvo = to_sdvo(encoder); 1827 - struct intel_crtc *intel_crtc = to_intel_crtc(pipe_config->uapi.crtc); 1827 + struct intel_crtc *crtc = to_intel_crtc(pipe_config->uapi.crtc); 1828 1828 u32 temp; 1829 1829 bool input1, input2; 1830 1830 int i; ··· 1835 1835 intel_sdvo_write_sdvox(intel_sdvo, temp); 1836 1836 1837 1837 for (i = 0; i < 2; i++) 1838 - intel_wait_for_vblank(dev_priv, intel_crtc->pipe); 1838 + intel_wait_for_vblank(dev_priv, crtc->pipe); 1839 1839 1840 1840 success = intel_sdvo_get_trained_inputs(intel_sdvo, &input1, &input2); 1841 1841 /*
+27 -7
drivers/gpu/drm/i915/display/intel_tc.c
··· 556 556 } 557 557 558 558 static void intel_tc_port_reset_mode(struct intel_digital_port *dig_port, 559 - int required_lanes) 559 + int required_lanes, bool force_disconnect) 560 560 { 561 561 struct drm_i915_private *i915 = to_i915(dig_port->base.base.dev); 562 562 enum tc_port_mode old_tc_mode = dig_port->tc_mode; ··· 572 572 } 573 573 574 574 icl_tc_phy_disconnect(dig_port); 575 - icl_tc_phy_connect(dig_port, required_lanes); 575 + if (!force_disconnect) 576 + icl_tc_phy_connect(dig_port, required_lanes); 576 577 577 578 drm_dbg_kms(&i915->drm, "Port %s: TC port mode reset (%s -> %s)\n", 578 579 dig_port->tc_port_name, ··· 663 662 } 664 663 665 664 static void __intel_tc_port_lock(struct intel_digital_port *dig_port, 666 - int required_lanes) 665 + int required_lanes, bool force_disconnect) 667 666 { 668 667 struct drm_i915_private *i915 = to_i915(dig_port->base.base.dev); 669 668 intel_wakeref_t wakeref; ··· 677 676 678 677 tc_cold_wref = tc_cold_block(dig_port); 679 678 680 - if (intel_tc_port_needs_reset(dig_port)) 681 - intel_tc_port_reset_mode(dig_port, required_lanes); 679 + if (force_disconnect || intel_tc_port_needs_reset(dig_port)) 680 + intel_tc_port_reset_mode(dig_port, required_lanes, 681 + force_disconnect); 682 682 683 683 tc_cold_unblock(dig_port, tc_cold_wref); 684 684 } ··· 690 688 691 689 void intel_tc_port_lock(struct intel_digital_port *dig_port) 692 690 { 693 - __intel_tc_port_lock(dig_port, 1); 691 + __intel_tc_port_lock(dig_port, 1, false); 694 692 } 695 693 696 694 void intel_tc_port_unlock(struct intel_digital_port *dig_port) ··· 704 702 wakeref); 705 703 } 706 704 705 + /** 706 + * intel_tc_port_disconnect_phy: disconnect TypeC PHY from display port 707 + * @dig_port: digital port 708 + * 709 + * Disconnect the given digital port from its TypeC PHY (handing back the 710 + * control of the PHY to the TypeC subsystem). The only purpose of this 711 + * function is to force the disconnect even with a TypeC display output still 712 + * plugged to the TypeC connector, which is required by the TypeC firmwares 713 + * during system suspend and shutdown. Otherwise - during the unplug event 714 + * handling - the PHY ownership is released automatically by 715 + * intel_tc_port_reset_mode(), when calling this function is not required. 716 + */ 717 + void intel_tc_port_disconnect_phy(struct intel_digital_port *dig_port) 718 + { 719 + __intel_tc_port_lock(dig_port, 1, true); 720 + intel_tc_port_unlock(dig_port); 721 + } 722 + 707 723 bool intel_tc_port_ref_held(struct intel_digital_port *dig_port) 708 724 { 709 725 return mutex_is_locked(&dig_port->tc_lock) || ··· 731 711 void intel_tc_port_get_link(struct intel_digital_port *dig_port, 732 712 int required_lanes) 733 713 { 734 - __intel_tc_port_lock(dig_port, required_lanes); 714 + __intel_tc_port_lock(dig_port, required_lanes, false); 735 715 dig_port->tc_link_refcount++; 736 716 intel_tc_port_unlock(dig_port); 737 717 }
+2
drivers/gpu/drm/i915/display/intel_tc.h
··· 13 13 struct intel_encoder; 14 14 15 15 bool intel_tc_port_connected(struct intel_encoder *encoder); 16 + void intel_tc_port_disconnect_phy(struct intel_digital_port *dig_port); 17 + 16 18 u32 intel_tc_port_get_lane_mask(struct intel_digital_port *dig_port); 17 19 u32 intel_tc_port_get_pin_assignment_mask(struct intel_digital_port *dig_port); 18 20 int intel_tc_port_fia_max_lane_count(struct intel_digital_port *dig_port);
+6 -7
drivers/gpu/drm/i915/display/intel_tv.c
··· 1420 1420 const struct drm_connector_state *conn_state) 1421 1421 { 1422 1422 struct drm_i915_private *dev_priv = to_i915(encoder->base.dev); 1423 - struct intel_crtc *intel_crtc = to_intel_crtc(pipe_config->uapi.crtc); 1423 + struct intel_crtc *crtc = to_intel_crtc(pipe_config->uapi.crtc); 1424 1424 struct intel_tv *intel_tv = enc_to_tv(encoder); 1425 1425 const struct intel_tv_connector_state *tv_conn_state = 1426 1426 to_intel_tv_connector_state(conn_state); ··· 1466 1466 break; 1467 1467 } 1468 1468 1469 - tv_ctl |= TV_ENC_PIPE_SEL(intel_crtc->pipe); 1469 + tv_ctl |= TV_ENC_PIPE_SEL(crtc->pipe); 1470 1470 1471 1471 switch (tv_mode->oversample) { 1472 1472 case 8: ··· 1571 1571 intel_tv_detect_type(struct intel_tv *intel_tv, 1572 1572 struct drm_connector *connector) 1573 1573 { 1574 - struct drm_crtc *crtc = connector->state->crtc; 1575 - struct intel_crtc *intel_crtc = to_intel_crtc(crtc); 1574 + struct intel_crtc *crtc = to_intel_crtc(connector->state->crtc); 1576 1575 struct drm_device *dev = connector->dev; 1577 1576 struct drm_i915_private *dev_priv = to_i915(dev); 1578 1577 u32 tv_ctl, save_tv_ctl; ··· 1593 1594 /* Poll for TV detection */ 1594 1595 tv_ctl &= ~(TV_ENC_ENABLE | TV_ENC_PIPE_SEL_MASK | TV_TEST_MODE_MASK); 1595 1596 tv_ctl |= TV_TEST_MODE_MONITOR_DETECT; 1596 - tv_ctl |= TV_ENC_PIPE_SEL(intel_crtc->pipe); 1597 + tv_ctl |= TV_ENC_PIPE_SEL(crtc->pipe); 1597 1598 1598 1599 tv_dac &= ~(TVDAC_SENSE_MASK | DAC_A_MASK | DAC_B_MASK | DAC_C_MASK); 1599 1600 tv_dac |= (TVDAC_STATE_CHG_EN | ··· 1618 1619 intel_de_write(dev_priv, TV_DAC, tv_dac); 1619 1620 intel_de_posting_read(dev_priv, TV_DAC); 1620 1621 1621 - intel_wait_for_vblank(dev_priv, intel_crtc->pipe); 1622 + intel_wait_for_vblank(dev_priv, crtc->pipe); 1622 1623 1623 1624 type = -1; 1624 1625 tv_dac = intel_de_read(dev_priv, TV_DAC); ··· 1651 1652 intel_de_posting_read(dev_priv, TV_CTL); 1652 1653 1653 1654 /* For unknown reasons the hw barfs if we don't do this vblank wait. */ 1654 - intel_wait_for_vblank(dev_priv, intel_crtc->pipe); 1655 + intel_wait_for_vblank(dev_priv, crtc->pipe); 1655 1656 1656 1657 /* Restore interrupt config */ 1657 1658 if (connector->polled & DRM_CONNECTOR_POLL_HPD) {
+3
drivers/gpu/drm/i915/display/intel_vga.c
··· 29 29 i915_reg_t vga_reg = intel_vga_cntrl_reg(dev_priv); 30 30 u8 sr1; 31 31 32 + if (intel_de_read(dev_priv, vga_reg) & VGA_DISP_DISABLE) 33 + return; 34 + 32 35 /* WaEnableVGAAccessThroughIOPort:ctg,elk,ilk,snb,ivb,vlv,hsw */ 33 36 vga_get_uninterruptible(pdev, VGA_RSRC_LEGACY_IO); 34 37 outb(SR01, VGA_SR_INDEX);
+13 -14
drivers/gpu/drm/i915/display/skl_scaler.c
··· 96 96 { 97 97 struct intel_crtc_scaler_state *scaler_state = 98 98 &crtc_state->scaler_state; 99 - struct intel_crtc *intel_crtc = 100 - to_intel_crtc(crtc_state->uapi.crtc); 101 - struct drm_i915_private *dev_priv = to_i915(intel_crtc->base.dev); 99 + struct intel_crtc *crtc = to_intel_crtc(crtc_state->uapi.crtc); 100 + struct drm_i915_private *dev_priv = to_i915(crtc->base.dev); 102 101 const struct drm_display_mode *adjusted_mode = 103 102 &crtc_state->hw.adjusted_mode; 104 103 ··· 140 141 drm_dbg_kms(&dev_priv->drm, 141 142 "scaler_user index %u.%u: " 142 143 "Staged freeing scaler id %d scaler_users = 0x%x\n", 143 - intel_crtc->pipe, scaler_user, *scaler_id, 144 + crtc->pipe, scaler_user, *scaler_id, 144 145 scaler_state->scaler_users); 145 146 *scaler_id = -1; 146 147 } ··· 166 167 drm_dbg_kms(&dev_priv->drm, 167 168 "scaler_user index %u.%u: src %ux%u dst %ux%u " 168 169 "size is out of scaler range\n", 169 - intel_crtc->pipe, scaler_user, src_w, src_h, 170 + crtc->pipe, scaler_user, src_w, src_h, 170 171 dst_w, dst_h); 171 172 return -EINVAL; 172 173 } ··· 175 176 scaler_state->scaler_users |= (1 << scaler_user); 176 177 drm_dbg_kms(&dev_priv->drm, "scaler_user index %u.%u: " 177 178 "staged scaling request for %ux%u->%ux%u scaler_users = 0x%x\n", 178 - intel_crtc->pipe, scaler_user, src_w, src_h, dst_w, dst_h, 179 + crtc->pipe, scaler_user, src_w, src_h, dst_w, dst_h, 179 180 scaler_state->scaler_users); 180 181 181 182 return 0; ··· 514 515 (crtc_w << 16) | crtc_h); 515 516 } 516 517 517 - static void skl_detach_scaler(struct intel_crtc *intel_crtc, int id) 518 + static void skl_detach_scaler(struct intel_crtc *crtc, int id) 518 519 { 519 - struct drm_device *dev = intel_crtc->base.dev; 520 + struct drm_device *dev = crtc->base.dev; 520 521 struct drm_i915_private *dev_priv = to_i915(dev); 521 522 unsigned long irqflags; 522 523 523 524 spin_lock_irqsave(&dev_priv->uncore.lock, irqflags); 524 525 525 - intel_de_write_fw(dev_priv, SKL_PS_CTRL(intel_crtc->pipe, id), 0); 526 - intel_de_write_fw(dev_priv, SKL_PS_WIN_POS(intel_crtc->pipe, id), 0); 527 - intel_de_write_fw(dev_priv, SKL_PS_WIN_SZ(intel_crtc->pipe, id), 0); 526 + intel_de_write_fw(dev_priv, SKL_PS_CTRL(crtc->pipe, id), 0); 527 + intel_de_write_fw(dev_priv, SKL_PS_WIN_POS(crtc->pipe, id), 0); 528 + intel_de_write_fw(dev_priv, SKL_PS_WIN_SZ(crtc->pipe, id), 0); 528 529 529 530 spin_unlock_irqrestore(&dev_priv->uncore.lock, irqflags); 530 531 } ··· 534 535 */ 535 536 void skl_detach_scalers(const struct intel_crtc_state *crtc_state) 536 537 { 537 - struct intel_crtc *intel_crtc = to_intel_crtc(crtc_state->uapi.crtc); 538 + struct intel_crtc *crtc = to_intel_crtc(crtc_state->uapi.crtc); 538 539 const struct intel_crtc_scaler_state *scaler_state = 539 540 &crtc_state->scaler_state; 540 541 int i; 541 542 542 543 /* loop through and disable scalers that aren't in use */ 543 - for (i = 0; i < intel_crtc->num_scalers; i++) { 544 + for (i = 0; i < crtc->num_scalers; i++) { 544 545 if (!scaler_state->scalers[i].in_use) 545 - skl_detach_scaler(intel_crtc, i); 546 + skl_detach_scaler(crtc, i); 546 547 } 547 548 } 548 549
+6 -7
drivers/gpu/drm/i915/display/vlv_dsi.c
··· 780 780 const struct drm_connector_state *conn_state) 781 781 { 782 782 struct intel_dsi *intel_dsi = enc_to_intel_dsi(encoder); 783 - struct drm_crtc *crtc = pipe_config->uapi.crtc; 784 - struct drm_i915_private *dev_priv = to_i915(crtc->dev); 785 - struct intel_crtc *intel_crtc = to_intel_crtc(crtc); 786 - enum pipe pipe = intel_crtc->pipe; 783 + struct intel_crtc *crtc = to_intel_crtc(pipe_config->uapi.crtc); 784 + struct drm_i915_private *dev_priv = to_i915(crtc->base.dev); 785 + enum pipe pipe = crtc->pipe; 787 786 enum port port; 788 787 u32 val; 789 788 bool glk_cold_boot = false; ··· 1388 1389 struct drm_encoder *encoder = &intel_encoder->base; 1389 1390 struct drm_device *dev = encoder->dev; 1390 1391 struct drm_i915_private *dev_priv = to_i915(dev); 1391 - struct intel_crtc *intel_crtc = to_intel_crtc(pipe_config->uapi.crtc); 1392 + struct intel_crtc *crtc = to_intel_crtc(pipe_config->uapi.crtc); 1392 1393 struct intel_dsi *intel_dsi = enc_to_intel_dsi(to_intel_encoder(encoder)); 1393 1394 const struct drm_display_mode *adjusted_mode = &pipe_config->hw.adjusted_mode; 1394 1395 enum port port; ··· 1396 1397 u32 val, tmp; 1397 1398 u16 mode_hdisplay; 1398 1399 1399 - drm_dbg_kms(&dev_priv->drm, "pipe %c\n", pipe_name(intel_crtc->pipe)); 1400 + drm_dbg_kms(&dev_priv->drm, "pipe %c\n", pipe_name(crtc->pipe)); 1400 1401 1401 1402 mode_hdisplay = adjusted_mode->crtc_hdisplay; 1402 1403 ··· 1423 1424 intel_de_write(dev_priv, MIPI_CTRL(port), 1424 1425 tmp | READ_REQUEST_PRIORITY_HIGH); 1425 1426 } else if (IS_GEMINILAKE(dev_priv) || IS_BROXTON(dev_priv)) { 1426 - enum pipe pipe = intel_crtc->pipe; 1427 + enum pipe pipe = crtc->pipe; 1427 1428 1428 1429 tmp = intel_de_read(dev_priv, MIPI_CTRL(port)); 1429 1430 tmp &= ~BXT_PIPE_SELECT_MASK;
+1 -1
drivers/gpu/drm/i915/i915_debugfs.c
··· 636 636 intel_uncore_read16(uncore, C0DRB3_BW)); 637 637 seq_printf(m, "C1DRB3 = 0x%04x\n", 638 638 intel_uncore_read16(uncore, C1DRB3_BW)); 639 - } else if (INTEL_GEN(dev_priv) >= 6) { 639 + } else if (GRAPHICS_VER(dev_priv) >= 6) { 640 640 seq_printf(m, "MAD_DIMM_C0 = 0x%08x\n", 641 641 intel_uncore_read(uncore, MAD_DIMM_C0)); 642 642 seq_printf(m, "MAD_DIMM_C1 = 0x%08x\n",
+8 -19
drivers/gpu/drm/i915/i915_drv.h
··· 270 270 int (*bw_calc_min_cdclk)(struct intel_atomic_state *state); 271 271 int (*get_fifo_size)(struct drm_i915_private *dev_priv, 272 272 enum i9xx_plane_id i9xx_plane); 273 - int (*compute_pipe_wm)(struct intel_crtc_state *crtc_state); 274 - int (*compute_intermediate_wm)(struct intel_crtc_state *crtc_state); 273 + int (*compute_pipe_wm)(struct intel_atomic_state *state, 274 + struct intel_crtc *crtc); 275 + int (*compute_intermediate_wm)(struct intel_atomic_state *state, 276 + struct intel_crtc *crtc); 275 277 void (*initial_watermarks)(struct intel_atomic_state *state, 276 278 struct intel_crtc *crtc); 277 279 void (*atomic_update_watermarks)(struct intel_atomic_state *state, ··· 348 346 /* This is always the inner lock when overlapping with struct_mutex and 349 347 * it's the outer lock when overlapping with stolen_lock. */ 350 348 struct mutex lock; 351 - unsigned threshold; 352 349 unsigned int possible_framebuffer_bits; 353 350 unsigned int busy_bits; 354 351 struct intel_crtc *crtc; 355 352 356 353 struct drm_mm_node compressed_fb; 357 - struct drm_mm_node *compressed_llb; 354 + struct drm_mm_node compressed_llb; 355 + 356 + u8 limit; 358 357 359 358 bool false_color; 360 359 ··· 470 467 #define QUIRK_PIN_SWIZZLED_PAGES (1<<5) 471 468 #define QUIRK_INCREASE_T12_DELAY (1<<6) 472 469 #define QUIRK_INCREASE_DDI_DISABLED_TIME (1<<7) 470 + #define QUIRK_NO_PPS_BACKLIGHT_POWER_HOOK (1<<8) 473 471 474 472 struct intel_fbdev; 475 473 struct intel_fbc_work; ··· 1240 1236 #define DRIVER_CAPS(dev_priv) (&(dev_priv)->caps) 1241 1237 1242 1238 #define INTEL_DEVID(dev_priv) (RUNTIME_INFO(dev_priv)->device_id) 1243 - 1244 - /* 1245 - * Deprecated: this will be replaced by individual IP checks: 1246 - * GRAPHICS_VER(), MEDIA_VER() and DISPLAY_VER() 1247 - */ 1248 - #define INTEL_GEN(dev_priv) GRAPHICS_VER(dev_priv) 1249 - /* 1250 - * Deprecated: use IS_GRAPHICS_VER(), IS_MEDIA_VER() and IS_DISPLAY_VER() as 1251 - * appropriate. 1252 - */ 1253 - #define IS_GEN_RANGE(dev_priv, s, e) IS_GRAPHICS_VER(dev_priv, (s), (e)) 1254 - /* 1255 - * Deprecated: use GRAPHICS_VER(), MEDIA_VER() and DISPLAY_VER() as appropriate. 1256 - */ 1257 - #define IS_GEN(dev_priv, n) (GRAPHICS_VER(dev_priv) == (n)) 1258 1239 1259 1240 #define GRAPHICS_VER(i915) (INTEL_INFO(i915)->graphics_ver) 1260 1241 #define IS_GRAPHICS_VER(i915, from, until) \
+11 -11
drivers/gpu/drm/i915/i915_irq.c
··· 2880 2880 return true; 2881 2881 } 2882 2882 2883 - int bdw_enable_vblank(struct drm_crtc *crtc) 2883 + int bdw_enable_vblank(struct drm_crtc *_crtc) 2884 2884 { 2885 - struct drm_i915_private *dev_priv = to_i915(crtc->dev); 2886 - struct intel_crtc *intel_crtc = to_intel_crtc(crtc); 2887 - enum pipe pipe = intel_crtc->pipe; 2885 + struct intel_crtc *crtc = to_intel_crtc(_crtc); 2886 + struct drm_i915_private *dev_priv = to_i915(crtc->base.dev); 2887 + enum pipe pipe = crtc->pipe; 2888 2888 unsigned long irqflags; 2889 2889 2890 - if (gen11_dsi_configure_te(intel_crtc, true)) 2890 + if (gen11_dsi_configure_te(crtc, true)) 2891 2891 return 0; 2892 2892 2893 2893 spin_lock_irqsave(&dev_priv->irq_lock, irqflags); ··· 2898 2898 * PSR is active as no frames are generated, so check only for PSR. 2899 2899 */ 2900 2900 if (HAS_PSR(dev_priv)) 2901 - drm_crtc_vblank_restore(crtc); 2901 + drm_crtc_vblank_restore(&crtc->base); 2902 2902 2903 2903 return 0; 2904 2904 } ··· 2952 2952 spin_unlock_irqrestore(&dev_priv->irq_lock, irqflags); 2953 2953 } 2954 2954 2955 - void bdw_disable_vblank(struct drm_crtc *crtc) 2955 + void bdw_disable_vblank(struct drm_crtc *_crtc) 2956 2956 { 2957 - struct drm_i915_private *dev_priv = to_i915(crtc->dev); 2958 - struct intel_crtc *intel_crtc = to_intel_crtc(crtc); 2959 - enum pipe pipe = intel_crtc->pipe; 2957 + struct intel_crtc *crtc = to_intel_crtc(_crtc); 2958 + struct drm_i915_private *dev_priv = to_i915(crtc->base.dev); 2959 + enum pipe pipe = crtc->pipe; 2960 2960 unsigned long irqflags; 2961 2961 2962 - if (gen11_dsi_configure_te(intel_crtc, false)) 2962 + if (gen11_dsi_configure_te(crtc, false)) 2963 2963 return; 2964 2964 2965 2965 spin_lock_irqsave(&dev_priv->irq_lock, irqflags);
+42 -10
drivers/gpu/drm/i915/i915_pci.c
··· 845 845 static const struct intel_device_info ehl_info = { 846 846 GEN11_FEATURES, 847 847 PLATFORM(INTEL_ELKHARTLAKE), 848 - .require_force_probe = 1, 849 848 .platform_engine_mask = BIT(RCS0) | BIT(BCS0) | BIT(VCS0) | BIT(VECS0), 850 849 .ppgtt_size = 36, 851 850 }; ··· 852 853 static const struct intel_device_info jsl_info = { 853 854 GEN11_FEATURES, 854 855 PLATFORM(INTEL_JASPERLAKE), 855 - .require_force_probe = 1, 856 856 .platform_engine_mask = BIT(RCS0) | BIT(BCS0) | BIT(VCS0) | BIT(VECS0), 857 857 .ppgtt_size = 36, 858 858 }; ··· 937 939 .dma_mask_size = 46, 938 940 }; 939 941 942 + #define XE_LPD_CURSOR_OFFSETS \ 943 + .cursor_offsets = { \ 944 + [PIPE_A] = CURSOR_A_OFFSET, \ 945 + [PIPE_B] = IVB_CURSOR_B_OFFSET, \ 946 + [PIPE_C] = IVB_CURSOR_C_OFFSET, \ 947 + [PIPE_D] = TGL_CURSOR_D_OFFSET, \ 948 + } 949 + 940 950 #define XE_LPD_FEATURES \ 941 - .display.ver = 13, \ 942 - .display.has_psr_hw_tracking = 0, \ 943 - .abox_mask = GENMASK(1, 0), \ 944 - .pipe_mask = BIT(PIPE_A) | BIT(PIPE_B) | BIT(PIPE_C) | BIT(PIPE_D), \ 945 - .cpu_transcoder_mask = BIT(TRANSCODER_A) | BIT(TRANSCODER_B) | \ 946 - BIT(TRANSCODER_C) | BIT(TRANSCODER_D), \ 947 - .dbuf.size = 4096, \ 948 - .dbuf.slice_mask = BIT(DBUF_S1) | BIT(DBUF_S2) | BIT(DBUF_S3) | BIT(DBUF_S4) 951 + .abox_mask = GENMASK(1, 0), \ 952 + .color = { .degamma_lut_size = 33, .gamma_lut_size = 262145 }, \ 953 + .cpu_transcoder_mask = BIT(TRANSCODER_A) | BIT(TRANSCODER_B) | \ 954 + BIT(TRANSCODER_C) | BIT(TRANSCODER_D), \ 955 + .dbuf.size = 4096, \ 956 + .dbuf.slice_mask = BIT(DBUF_S1) | BIT(DBUF_S2) | BIT(DBUF_S3) | \ 957 + BIT(DBUF_S4), \ 958 + .display.has_ddi = 1, \ 959 + .display.has_dmc = 1, \ 960 + .display.has_dp_mst = 1, \ 961 + .display.has_dsb = 1, \ 962 + .display.has_dsc = 1, \ 963 + .display.has_fbc = 1, \ 964 + .display.has_fpga_dbg = 1, \ 965 + .display.has_hdcp = 1, \ 966 + .display.has_hotplug = 1, \ 967 + .display.has_ipc = 1, \ 968 + .display.has_psr = 1, \ 969 + .display.ver = 13, \ 970 + .pipe_mask = BIT(PIPE_A) | BIT(PIPE_B) | BIT(PIPE_C) | BIT(PIPE_D), \ 971 + .pipe_offsets = { \ 972 + [TRANSCODER_A] = PIPE_A_OFFSET, \ 973 + [TRANSCODER_B] = PIPE_B_OFFSET, \ 974 + [TRANSCODER_C] = PIPE_C_OFFSET, \ 975 + [TRANSCODER_D] = PIPE_D_OFFSET, \ 976 + }, \ 977 + .trans_offsets = { \ 978 + [TRANSCODER_A] = TRANSCODER_A_OFFSET, \ 979 + [TRANSCODER_B] = TRANSCODER_B_OFFSET, \ 980 + [TRANSCODER_C] = TRANSCODER_C_OFFSET, \ 981 + [TRANSCODER_D] = TRANSCODER_D_OFFSET, \ 982 + }, \ 983 + XE_LPD_CURSOR_OFFSETS 949 984 950 985 static const struct intel_device_info adl_p_info = { 951 986 GEN12_FEATURES, ··· 987 956 .has_cdclk_crawl = 1, 988 957 .require_force_probe = 1, 989 958 .display.has_modular_fia = 1, 959 + .display.has_psr_hw_tracking = 0, 990 960 .platform_engine_mask = 991 961 BIT(RCS0) | BIT(BCS0) | BIT(VECS0) | BIT(VCS0) | BIT(VCS2), 992 962 .ppgtt_size = 48,
+15 -3
drivers/gpu/drm/i915/i915_reg.h
··· 4590 4590 #define TGL_EDP_PSR2_BLOCK_COUNT_NUM_2 (0 << 28) 4591 4591 #define TGL_EDP_PSR2_BLOCK_COUNT_NUM_3 (1 << 28) 4592 4592 #define EDP_Y_COORDINATE_ENABLE REG_BIT(25) /* display 10, 11 and 12 */ 4593 + #define EDP_PSR2_SU_SDP_SCANLINE REG_BIT(25) /* display 13+ */ 4593 4594 #define EDP_MAX_SU_DISABLE_TIME(t) ((t) << 20) 4594 4595 #define EDP_MAX_SU_DISABLE_TIME_MASK (0x1f << 20) 4595 4596 #define EDP_PSR2_IO_BUFFER_WAKE_MAX_LINES 8 4596 4597 #define EDP_PSR2_IO_BUFFER_WAKE(lines) ((EDP_PSR2_IO_BUFFER_WAKE_MAX_LINES - (lines)) << 13) 4597 4598 #define EDP_PSR2_IO_BUFFER_WAKE_MASK (3 << 13) 4598 4599 #define TGL_EDP_PSR2_IO_BUFFER_WAKE_MIN_LINES 5 4599 - #define TGL_EDP_PSR2_IO_BUFFER_WAKE(lines) (((lines) - TGL_EDP_PSR2_IO_BUFFER_WAKE_MIN_LINES) << 13) 4600 + #define TGL_EDP_PSR2_IO_BUFFER_WAKE_SHIFT 13 4601 + #define TGL_EDP_PSR2_IO_BUFFER_WAKE(lines) (((lines) - TGL_EDP_PSR2_IO_BUFFER_WAKE_MIN_LINES) << TGL_EDP_PSR2_IO_BUFFER_WAKE_SHIFT) 4600 4602 #define TGL_EDP_PSR2_IO_BUFFER_WAKE_MASK (7 << 13) 4601 4603 #define EDP_PSR2_FAST_WAKE_MAX_LINES 8 4602 4604 #define EDP_PSR2_FAST_WAKE(lines) ((EDP_PSR2_FAST_WAKE_MAX_LINES - (lines)) << 11) 4603 4605 #define EDP_PSR2_FAST_WAKE_MASK (3 << 11) 4604 4606 #define TGL_EDP_PSR2_FAST_WAKE_MIN_LINES 5 4605 - #define TGL_EDP_PSR2_FAST_WAKE(lines) (((lines) - TGL_EDP_PSR2_FAST_WAKE_MIN_LINES) << 10) 4607 + #define TGL_EDP_PSR2_FAST_WAKE_MIN_SHIFT 10 4608 + #define TGL_EDP_PSR2_FAST_WAKE(lines) (((lines) - TGL_EDP_PSR2_FAST_WAKE_MIN_LINES) << TGL_EDP_PSR2_FAST_WAKE_MIN_SHIFT) 4606 4609 #define TGL_EDP_PSR2_FAST_WAKE_MASK (7 << 10) 4607 4610 #define EDP_PSR2_TP2_TIME_500us (0 << 8) 4608 4611 #define EDP_PSR2_TP2_TIME_100us (1 << 8) ··· 7754 7751 #define GAMMA_MODE_MODE_12BIT_MULTI_SEGMENTED (3 << 0) /* icl + */ 7755 7752 7756 7753 /* DMC */ 7757 - #define DMC_PROGRAM(i) _MMIO(0x80000 + (i) * 4) 7754 + #define DMC_PROGRAM(addr, i) _MMIO((addr) + (i) * 4) 7758 7755 #define DMC_SSP_BASE_ADDR_GEN9 0x00002FC0 7759 7756 #define DMC_HTP_ADDR_SKL 0x00500034 7760 7757 #define DMC_SSP_BASE _MMIO(0x8F074) ··· 8110 8107 # define CHICKEN3_DGMG_DONE_FIX_DISABLE (1 << 2) 8111 8108 8112 8109 #define CHICKEN_PAR1_1 _MMIO(0x42080) 8110 + #define IGNORE_KVMR_PIPE_A REG_BIT(23) 8113 8111 #define KBL_ARB_FILL_SPARE_22 REG_BIT(22) 8114 8112 #define DIS_RAM_BYPASS_PSR2_MAN_TRACK (1 << 16) 8115 8113 #define SKL_DE_COMPRESSED_HASH_MODE (1 << 15) ··· 10368 10364 #define _TRANS_EDP_MSA_MISC 0x6f410 10369 10365 #define TRANS_MSA_MISC(tran) _MMIO_TRANS2(tran, _TRANSA_MSA_MISC) 10370 10366 /* See DP_MSA_MISC_* for the bit definitions */ 10367 + 10368 + #define _TRANS_A_SET_CONTEXT_LATENCY 0x6007C 10369 + #define _TRANS_B_SET_CONTEXT_LATENCY 0x6107C 10370 + #define _TRANS_C_SET_CONTEXT_LATENCY 0x6207C 10371 + #define _TRANS_D_SET_CONTEXT_LATENCY 0x6307C 10372 + #define TRANS_SET_CONTEXT_LATENCY(tran) _MMIO_TRANS2(tran, _TRANS_A_SET_CONTEXT_LATENCY) 10373 + #define TRANS_SET_CONTEXT_LATENCY_MASK REG_GENMASK(15, 0) 10374 + #define TRANS_SET_CONTEXT_LATENCY_VALUE(x) REG_FIELD_PREP(TRANS_SET_CONTEXT_LATENCY_MASK, (x)) 10371 10375 10372 10376 /* LCPLL Control */ 10373 10377 #define LCPLL_CTL _MMIO(0x130040)
+1 -2
drivers/gpu/drm/i915/intel_dram.c
··· 484 484 485 485 static int gen12_get_dram_info(struct drm_i915_private *i915) 486 486 { 487 - /* Always needed for GEN12+ */ 488 - i915->dram_info.wm_lv_0_adjust_needed = true; 487 + i915->dram_info.wm_lv_0_adjust_needed = false; 489 488 490 489 return icl_pcode_read_mem_global_info(i915); 491 490 }
+61 -56
drivers/gpu/drm/i915/intel_pm.c
··· 1370 1370 return true; 1371 1371 } 1372 1372 1373 - static int g4x_compute_pipe_wm(struct intel_crtc_state *crtc_state) 1373 + static int g4x_compute_pipe_wm(struct intel_atomic_state *state, 1374 + struct intel_crtc *crtc) 1374 1375 { 1375 - struct intel_crtc *crtc = to_intel_crtc(crtc_state->uapi.crtc); 1376 - struct intel_atomic_state *state = 1377 - to_intel_atomic_state(crtc_state->uapi.state); 1376 + struct intel_crtc_state *crtc_state = 1377 + intel_atomic_get_new_crtc_state(state, crtc); 1378 1378 struct g4x_wm_state *wm_state = &crtc_state->wm.g4x.optimal; 1379 1379 int num_active_planes = hweight8(crtc_state->active_planes & 1380 1380 ~BIT(PLANE_CURSOR)); ··· 1451 1451 return 0; 1452 1452 } 1453 1453 1454 - static int g4x_compute_intermediate_wm(struct intel_crtc_state *new_crtc_state) 1454 + static int g4x_compute_intermediate_wm(struct intel_atomic_state *state, 1455 + struct intel_crtc *crtc) 1455 1456 { 1456 - struct intel_crtc *crtc = to_intel_crtc(new_crtc_state->uapi.crtc); 1457 1457 struct drm_i915_private *dev_priv = to_i915(crtc->base.dev); 1458 + struct intel_crtc_state *new_crtc_state = 1459 + intel_atomic_get_new_crtc_state(state, crtc); 1460 + const struct intel_crtc_state *old_crtc_state = 1461 + intel_atomic_get_old_crtc_state(state, crtc); 1458 1462 struct g4x_wm_state *intermediate = &new_crtc_state->wm.g4x.intermediate; 1459 1463 const struct g4x_wm_state *optimal = &new_crtc_state->wm.g4x.optimal; 1460 - struct intel_atomic_state *intel_state = 1461 - to_intel_atomic_state(new_crtc_state->uapi.state); 1462 - const struct intel_crtc_state *old_crtc_state = 1463 - intel_atomic_get_old_crtc_state(intel_state, crtc); 1464 1464 const struct g4x_wm_state *active = &old_crtc_state->wm.g4x.optimal; 1465 1465 enum plane_id plane_id; 1466 1466 1467 - if (!new_crtc_state->hw.active || drm_atomic_crtc_needs_modeset(&new_crtc_state->uapi)) { 1467 + if (!new_crtc_state->hw.active || 1468 + drm_atomic_crtc_needs_modeset(&new_crtc_state->uapi)) { 1468 1469 *intermediate = *optimal; 1469 1470 1470 1471 intermediate->cxsr = false; ··· 1891 1890 vlv_raw_plane_wm_is_valid(crtc_state, PLANE_CURSOR, level); 1892 1891 } 1893 1892 1894 - static int vlv_compute_pipe_wm(struct intel_crtc_state *crtc_state) 1893 + static int vlv_compute_pipe_wm(struct intel_atomic_state *state, 1894 + struct intel_crtc *crtc) 1895 1895 { 1896 - struct intel_crtc *crtc = to_intel_crtc(crtc_state->uapi.crtc); 1897 1896 struct drm_i915_private *dev_priv = to_i915(crtc->base.dev); 1898 - struct intel_atomic_state *state = 1899 - to_intel_atomic_state(crtc_state->uapi.state); 1897 + struct intel_crtc_state *crtc_state = 1898 + intel_atomic_get_new_crtc_state(state, crtc); 1900 1899 struct vlv_wm_state *wm_state = &crtc_state->wm.vlv.optimal; 1901 1900 const struct vlv_fifo_state *fifo_state = 1902 1901 &crtc_state->wm.vlv.fifo_state; ··· 2096 2095 2097 2096 #undef VLV_FIFO 2098 2097 2099 - static int vlv_compute_intermediate_wm(struct intel_crtc_state *new_crtc_state) 2098 + static int vlv_compute_intermediate_wm(struct intel_atomic_state *state, 2099 + struct intel_crtc *crtc) 2100 2100 { 2101 - struct intel_crtc *crtc = to_intel_crtc(new_crtc_state->uapi.crtc); 2101 + struct intel_crtc_state *new_crtc_state = 2102 + intel_atomic_get_new_crtc_state(state, crtc); 2103 + const struct intel_crtc_state *old_crtc_state = 2104 + intel_atomic_get_old_crtc_state(state, crtc); 2102 2105 struct vlv_wm_state *intermediate = &new_crtc_state->wm.vlv.intermediate; 2103 2106 const struct vlv_wm_state *optimal = &new_crtc_state->wm.vlv.optimal; 2104 - struct intel_atomic_state *intel_state = 2105 - to_intel_atomic_state(new_crtc_state->uapi.state); 2106 - const struct intel_crtc_state *old_crtc_state = 2107 - intel_atomic_get_old_crtc_state(intel_state, crtc); 2108 2107 const struct vlv_wm_state *active = &old_crtc_state->wm.vlv.optimal; 2109 2108 int level; 2110 2109 2111 - if (!new_crtc_state->hw.active || drm_atomic_crtc_needs_modeset(&new_crtc_state->uapi)) { 2110 + if (!new_crtc_state->hw.active || 2111 + drm_atomic_crtc_needs_modeset(&new_crtc_state->uapi)) { 2112 2112 *intermediate = *optimal; 2113 2113 2114 2114 intermediate->cxsr = false; ··· 2908 2906 if (wm[level] == 0) { 2909 2907 for (i = level + 1; i <= max_level; i++) 2910 2908 wm[i] = 0; 2909 + 2910 + max_level = level - 1; 2911 + 2911 2912 break; 2912 2913 } 2913 2914 } 2914 2915 2915 2916 /* 2916 - * WaWmMemoryReadLatency:skl+,glk 2917 + * WaWmMemoryReadLatency 2917 2918 * 2918 2919 * punit doesn't take into account the read latency so we need 2919 - * to add 2us to the various latency levels we retrieve from the 2920 - * punit when level 0 response data us 0us. 2920 + * to add proper adjustement to each valid level we retrieve 2921 + * from the punit when level 0 response data is 0us. 2921 2922 */ 2922 2923 if (wm[0] == 0) { 2923 - wm[0] += 2; 2924 - for (level = 1; level <= max_level; level++) { 2925 - if (wm[level] == 0) 2926 - break; 2927 - wm[level] += 2; 2928 - } 2924 + u8 adjust = DISPLAY_VER(dev_priv) >= 12 ? 3 : 2; 2925 + 2926 + for (level = 0; level <= max_level; level++) 2927 + wm[level] += adjust; 2929 2928 } 2930 2929 2931 2930 /* ··· 2937 2934 */ 2938 2935 if (dev_priv->dram_info.wm_lv_0_adjust_needed) 2939 2936 wm[0] += 1; 2940 - 2941 2937 } else if (IS_HASWELL(dev_priv) || IS_BROADWELL(dev_priv)) { 2942 2938 u64 sskpd = intel_uncore_read64(uncore, MCH_SSKPD); 2943 2939 ··· 3146 3144 } 3147 3145 3148 3146 /* Compute new watermarks for the pipe */ 3149 - static int ilk_compute_pipe_wm(struct intel_crtc_state *crtc_state) 3147 + static int ilk_compute_pipe_wm(struct intel_atomic_state *state, 3148 + struct intel_crtc *crtc) 3150 3149 { 3151 - struct drm_i915_private *dev_priv = to_i915(crtc_state->uapi.crtc->dev); 3152 - struct intel_crtc *crtc = to_intel_crtc(crtc_state->uapi.crtc); 3150 + struct drm_i915_private *dev_priv = to_i915(state->base.dev); 3151 + struct intel_crtc_state *crtc_state = 3152 + intel_atomic_get_new_crtc_state(state, crtc); 3153 3153 struct intel_pipe_wm *pipe_wm; 3154 3154 struct intel_plane *plane; 3155 3155 const struct intel_plane_state *plane_state; ··· 3224 3220 * state and the new state. These can be programmed to the hardware 3225 3221 * immediately. 3226 3222 */ 3227 - static int ilk_compute_intermediate_wm(struct intel_crtc_state *newstate) 3223 + static int ilk_compute_intermediate_wm(struct intel_atomic_state *state, 3224 + struct intel_crtc *crtc) 3228 3225 { 3229 - struct intel_crtc *intel_crtc = to_intel_crtc(newstate->uapi.crtc); 3230 - struct drm_i915_private *dev_priv = to_i915(intel_crtc->base.dev); 3231 - struct intel_pipe_wm *a = &newstate->wm.ilk.intermediate; 3232 - struct intel_atomic_state *intel_state = 3233 - to_intel_atomic_state(newstate->uapi.state); 3234 - const struct intel_crtc_state *oldstate = 3235 - intel_atomic_get_old_crtc_state(intel_state, intel_crtc); 3236 - const struct intel_pipe_wm *b = &oldstate->wm.ilk.optimal; 3226 + struct drm_i915_private *dev_priv = to_i915(crtc->base.dev); 3227 + struct intel_crtc_state *new_crtc_state = 3228 + intel_atomic_get_new_crtc_state(state, crtc); 3229 + const struct intel_crtc_state *old_crtc_state = 3230 + intel_atomic_get_old_crtc_state(state, crtc); 3231 + struct intel_pipe_wm *a = &new_crtc_state->wm.ilk.intermediate; 3232 + const struct intel_pipe_wm *b = &old_crtc_state->wm.ilk.optimal; 3237 3233 int level, max_level = ilk_wm_max_level(dev_priv); 3238 3234 3239 3235 /* ··· 3241 3237 * currently active watermarks to get values that are safe both before 3242 3238 * and after the vblank. 3243 3239 */ 3244 - *a = newstate->wm.ilk.optimal; 3245 - if (!newstate->hw.active || drm_atomic_crtc_needs_modeset(&newstate->uapi) || 3246 - intel_state->skip_intermediate_wm) 3240 + *a = new_crtc_state->wm.ilk.optimal; 3241 + if (!new_crtc_state->hw.active || 3242 + drm_atomic_crtc_needs_modeset(&new_crtc_state->uapi) || 3243 + state->skip_intermediate_wm) 3247 3244 return 0; 3248 3245 3249 3246 a->pipe_enabled |= b->pipe_enabled; ··· 3275 3270 * If our intermediate WM are identical to the final WM, then we can 3276 3271 * omit the post-vblank programming; only update if it's different. 3277 3272 */ 3278 - if (memcmp(a, &newstate->wm.ilk.optimal, sizeof(*a)) != 0) 3279 - newstate->wm.need_postvbl_update = true; 3273 + if (memcmp(a, &new_crtc_state->wm.ilk.optimal, sizeof(*a)) != 0) 3274 + new_crtc_state->wm.need_postvbl_update = true; 3280 3275 3281 3276 return 0; 3282 3277 } ··· 3288 3283 int level, 3289 3284 struct intel_wm_level *ret_wm) 3290 3285 { 3291 - const struct intel_crtc *intel_crtc; 3286 + const struct intel_crtc *crtc; 3292 3287 3293 3288 ret_wm->enable = true; 3294 3289 3295 - for_each_intel_crtc(&dev_priv->drm, intel_crtc) { 3296 - const struct intel_pipe_wm *active = &intel_crtc->wm.active.ilk; 3290 + for_each_intel_crtc(&dev_priv->drm, crtc) { 3291 + const struct intel_pipe_wm *active = &crtc->wm.active.ilk; 3297 3292 const struct intel_wm_level *wm = &active->wm[level]; 3298 3293 3299 3294 if (!active->pipe_enabled) ··· 3393 3388 enum intel_ddb_partitioning partitioning, 3394 3389 struct ilk_wm_values *results) 3395 3390 { 3396 - struct intel_crtc *intel_crtc; 3391 + struct intel_crtc *crtc; 3397 3392 int level, wm_lp; 3398 3393 3399 3394 results->enable_fbc_wm = merged->fbc_wm_enabled; ··· 3438 3433 } 3439 3434 3440 3435 /* LP0 register values */ 3441 - for_each_intel_crtc(&dev_priv->drm, intel_crtc) { 3442 - enum pipe pipe = intel_crtc->pipe; 3443 - const struct intel_pipe_wm *pipe_wm = &intel_crtc->wm.active.ilk; 3436 + for_each_intel_crtc(&dev_priv->drm, crtc) { 3437 + enum pipe pipe = crtc->pipe; 3438 + const struct intel_pipe_wm *pipe_wm = &crtc->wm.active.ilk; 3444 3439 const struct intel_wm_level *r = &pipe_wm->wm[0]; 3445 3440 3446 3441 if (drm_WARN_ON(&dev_priv->drm, !r->enable))
+1 -1
drivers/gpu/drm/i915/intel_uncore.c
··· 1929 1929 return -ENODEV; 1930 1930 } 1931 1931 1932 - if (INTEL_GEN(i915) > 5 && !intel_vgpu_active(i915)) 1932 + if (GRAPHICS_VER(i915) > 5 && !intel_vgpu_active(i915)) 1933 1933 uncore->flags |= UNCORE_HAS_FORCEWAKE; 1934 1934 1935 1935 if (!intel_uncore_has_forcewake(uncore)) {