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

Configure Feed

Select the types of activity you want to include in your feed.

drm/i915/ddi: Define LT Phy Swing tables

Define and initialize LT Phy Swing tables for DP 1.4, 2.1 and eDp.
HDMI TMDS is not needed since LT Phy H/w handles that.

Bspec: 74493
Signed-off-by: Suraj Kandpal <suraj.kandpal@intel.com>
Reviewed-by: Arun R Murthy <arun.r.murthy@intel.com>
Link: https://patch.msgid.link/20251101032513.4171255-19-suraj.kandpal@intel.com

+89 -1
+80 -1
drivers/gpu/drm/i915/display/intel_ddi_buf_trans.c
··· 10 10 #include "intel_display_types.h" 11 11 #include "intel_display_utils.h" 12 12 #include "intel_dp.h" 13 + #include "intel_lt_phy.h" 13 14 14 15 /* HDMI/DVI modes ignore everything but the last 2 items. So we share 15 16 * them for both DP and FDI transports, allowing those ports to ··· 1116 1115 .num_entries = ARRAY_SIZE(_mtl_c20_trans_uhbr), 1117 1116 }; 1118 1117 1118 + /* DP1.4 */ 1119 + static const union intel_ddi_buf_trans_entry _xe3plpd_lt_trans_dp14[] = { 1120 + { .lt = { 1, 0, 0, 21, 0 } }, 1121 + { .lt = { 1, 1, 0, 24, 3 } }, 1122 + { .lt = { 1, 2, 0, 28, 7 } }, 1123 + { .lt = { 0, 3, 0, 35, 13 } }, 1124 + { .lt = { 1, 1, 0, 27, 0 } }, 1125 + { .lt = { 1, 2, 0, 31, 4 } }, 1126 + { .lt = { 0, 3, 0, 39, 9 } }, 1127 + { .lt = { 1, 2, 0, 35, 0 } }, 1128 + { .lt = { 0, 3, 0, 41, 7 } }, 1129 + { .lt = { 0, 3, 0, 48, 0 } }, 1130 + }; 1131 + 1132 + /* DP2.1 */ 1133 + static const union intel_ddi_buf_trans_entry _xe3plpd_lt_trans_uhbr[] = { 1134 + { .lt = { 0, 0, 0, 48, 0 } }, 1135 + { .lt = { 0, 0, 0, 43, 5 } }, 1136 + { .lt = { 0, 0, 0, 40, 8 } }, 1137 + { .lt = { 0, 0, 0, 37, 11 } }, 1138 + { .lt = { 0, 0, 0, 33, 15 } }, 1139 + { .lt = { 0, 0, 2, 46, 0 } }, 1140 + { .lt = { 0, 0, 2, 42, 4 } }, 1141 + { .lt = { 0, 0, 2, 38, 8 } }, 1142 + { .lt = { 0, 0, 2, 35, 11 } }, 1143 + { .lt = { 0, 0, 2, 33, 13 } }, 1144 + { .lt = { 0, 0, 4, 44, 0 } }, 1145 + { .lt = { 0, 0, 4, 40, 4 } }, 1146 + { .lt = { 0, 0, 4, 37, 7 } }, 1147 + { .lt = { 0, 0, 4, 33, 11 } }, 1148 + { .lt = { 0, 0, 8, 40, 0 } }, 1149 + { .lt = { 1, 0, 2, 26, 2 } }, 1150 + }; 1151 + 1152 + /* eDp */ 1153 + static const union intel_ddi_buf_trans_entry _xe3plpd_lt_trans_edp[] = { 1154 + { .lt = { 1, 0, 0, 12, 0 } }, 1155 + { .lt = { 1, 1, 0, 13, 1 } }, 1156 + { .lt = { 1, 2, 0, 15, 3 } }, 1157 + { .lt = { 1, 3, 0, 19, 7 } }, 1158 + { .lt = { 1, 1, 0, 14, 0 } }, 1159 + { .lt = { 1, 2, 0, 16, 2 } }, 1160 + { .lt = { 1, 3, 0, 21, 5 } }, 1161 + { .lt = { 1, 2, 0, 18, 0 } }, 1162 + { .lt = { 1, 3, 0, 22, 4 } }, 1163 + { .lt = { 1, 3, 0, 26, 0 } }, 1164 + }; 1165 + 1166 + static const struct intel_ddi_buf_trans xe3plpd_lt_trans_dp14 = { 1167 + .entries = _xe3plpd_lt_trans_dp14, 1168 + .num_entries = ARRAY_SIZE(_xe3plpd_lt_trans_dp14), 1169 + }; 1170 + 1171 + static const struct intel_ddi_buf_trans xe3plpd_lt_trans_uhbr = { 1172 + .entries = _xe3plpd_lt_trans_uhbr, 1173 + .num_entries = ARRAY_SIZE(_xe3plpd_lt_trans_uhbr), 1174 + }; 1175 + 1176 + static const struct intel_ddi_buf_trans xe3plpd_lt_trans_edp = { 1177 + .entries = _xe3plpd_lt_trans_edp, 1178 + .num_entries = ARRAY_SIZE(_xe3plpd_lt_trans_edp), 1179 + }; 1180 + 1119 1181 bool is_hobl_buf_trans(const struct intel_ddi_buf_trans *table) 1120 1182 { 1121 1183 return table == &tgl_combo_phy_trans_edp_hbr2_hobl; ··· 1771 1707 return intel_get_buf_trans(&mtl_c20_trans_dp14, n_entries); 1772 1708 } 1773 1709 1710 + static const struct intel_ddi_buf_trans * 1711 + xe3plpd_get_lt_buf_trans(struct intel_encoder *encoder, 1712 + const struct intel_crtc_state *crtc_state, 1713 + int *n_entries) 1714 + { 1715 + if (intel_crtc_has_dp_encoder(crtc_state) && intel_dp_is_uhbr(crtc_state)) 1716 + return intel_get_buf_trans(&xe3plpd_lt_trans_uhbr, n_entries); 1717 + else if (intel_crtc_has_type(crtc_state, INTEL_OUTPUT_EDP)) 1718 + return intel_get_buf_trans(&xe3plpd_lt_trans_edp, n_entries); 1719 + else 1720 + return intel_get_buf_trans(&xe3plpd_lt_trans_dp14, n_entries); 1721 + } 1722 + 1774 1723 void intel_ddi_buf_trans_init(struct intel_encoder *encoder) 1775 1724 { 1776 1725 struct intel_display *display = to_intel_display(encoder); 1777 1726 1778 - if (DISPLAY_VER(display) >= 14) { 1727 + if (HAS_LT_PHY(display)) { 1728 + encoder->get_buf_trans = xe3plpd_get_lt_buf_trans; 1729 + } else if (DISPLAY_VER(display) >= 14) { 1779 1730 if (intel_encoder_is_c10phy(encoder)) 1780 1731 encoder->get_buf_trans = mtl_get_c10_buf_trans; 1781 1732 else
+9
drivers/gpu/drm/i915/display/intel_ddi_buf_trans.h
··· 50 50 u8 post_cursor; 51 51 }; 52 52 53 + struct xe3plpd_lt_phy_buf_trans { 54 + u8 txswing; 55 + u8 txswing_level; 56 + u8 pre_cursor; 57 + u8 main_cursor; 58 + u8 post_cursor; 59 + }; 60 + 53 61 union intel_ddi_buf_trans_entry { 54 62 struct hsw_ddi_buf_trans hsw; 55 63 struct bxt_ddi_buf_trans bxt; ··· 65 57 struct icl_mg_phy_ddi_buf_trans mg; 66 58 struct tgl_dkl_phy_ddi_buf_trans dkl; 67 59 struct dg2_snps_phy_buf_trans snps; 60 + struct xe3plpd_lt_phy_buf_trans lt; 68 61 }; 69 62 70 63 struct intel_ddi_buf_trans {