diff options
Diffstat (limited to 'drivers/gpu/drm/i915/display/intel_ddi.c')
| -rw-r--r-- | drivers/gpu/drm/i915/display/intel_ddi.c | 2785 | 
1 files changed, 915 insertions, 1870 deletions
| diff --git a/drivers/gpu/drm/i915/display/intel_ddi.c b/drivers/gpu/drm/i915/display/intel_ddi.c index 1bb40ec5fe5d..953de42e277c 100644 --- a/drivers/gpu/drm/i915/display/intel_ddi.c +++ b/drivers/gpu/drm/i915/display/intel_ddi.c @@ -28,17 +28,18 @@  #include <drm/drm_scdc_helper.h>  #include "i915_drv.h" -#include "i915_trace.h"  #include "intel_audio.h"  #include "intel_combo_phy.h"  #include "intel_connector.h"  #include "intel_ddi.h" +#include "intel_ddi_buf_trans.h"  #include "intel_display_types.h"  #include "intel_dp.h" -#include "intel_dp_mst.h"  #include "intel_dp_link_training.h" +#include "intel_dp_mst.h"  #include "intel_dpio_phy.h"  #include "intel_dsi.h" +#include "intel_fdi.h"  #include "intel_fifo_underrun.h"  #include "intel_gmbus.h"  #include "intel_hdcp.h" @@ -52,12 +53,8 @@  #include "intel_tc.h"  #include "intel_vdsc.h"  #include "intel_vrr.h" - -struct ddi_buf_trans { -	u32 trans1;	/* balance leg enable, de-emph level */ -	u32 trans2;	/* vref sel, vswing */ -	u8 i_boost;	/* SKL: I_boost; valid: 0x0, 0x1, 0x3, 0x7 */ -}; +#include "skl_scaler.h" +#include "skl_universal_plane.h"  static const u8 index_to_dp_signal_levels[] = {  	[0] = DP_TRAIN_VOLTAGE_SWING_LEVEL_0 | DP_TRAIN_PRE_EMPH_LEVEL_0, @@ -72,1389 +69,15 @@ static const u8 index_to_dp_signal_levels[] = {  	[9] = DP_TRAIN_VOLTAGE_SWING_LEVEL_3 | DP_TRAIN_PRE_EMPH_LEVEL_0,  }; -/* HDMI/DVI modes ignore everything but the last 2 items. So we share - * them for both DP and FDI transports, allowing those ports to - * automatically adapt to HDMI connections as well - */ -static const struct ddi_buf_trans hsw_ddi_translations_dp[] = { -	{ 0x00FFFFFF, 0x0006000E, 0x0 }, -	{ 0x00D75FFF, 0x0005000A, 0x0 }, -	{ 0x00C30FFF, 0x00040006, 0x0 }, -	{ 0x80AAAFFF, 0x000B0000, 0x0 }, -	{ 0x00FFFFFF, 0x0005000A, 0x0 }, -	{ 0x00D75FFF, 0x000C0004, 0x0 }, -	{ 0x80C30FFF, 0x000B0000, 0x0 }, -	{ 0x00FFFFFF, 0x00040006, 0x0 }, -	{ 0x80D75FFF, 0x000B0000, 0x0 }, -}; - -static const struct ddi_buf_trans hsw_ddi_translations_fdi[] = { -	{ 0x00FFFFFF, 0x0007000E, 0x0 }, -	{ 0x00D75FFF, 0x000F000A, 0x0 }, -	{ 0x00C30FFF, 0x00060006, 0x0 }, -	{ 0x00AAAFFF, 0x001E0000, 0x0 }, -	{ 0x00FFFFFF, 0x000F000A, 0x0 }, -	{ 0x00D75FFF, 0x00160004, 0x0 }, -	{ 0x00C30FFF, 0x001E0000, 0x0 }, -	{ 0x00FFFFFF, 0x00060006, 0x0 }, -	{ 0x00D75FFF, 0x001E0000, 0x0 }, -}; - -static const struct ddi_buf_trans hsw_ddi_translations_hdmi[] = { -					/* Idx	NT mV d	T mV d	db	*/ -	{ 0x00FFFFFF, 0x0006000E, 0x0 },/* 0:	400	400	0	*/ -	{ 0x00E79FFF, 0x000E000C, 0x0 },/* 1:	400	500	2	*/ -	{ 0x00D75FFF, 0x0005000A, 0x0 },/* 2:	400	600	3.5	*/ -	{ 0x00FFFFFF, 0x0005000A, 0x0 },/* 3:	600	600	0	*/ -	{ 0x00E79FFF, 0x001D0007, 0x0 },/* 4:	600	750	2	*/ -	{ 0x00D75FFF, 0x000C0004, 0x0 },/* 5:	600	900	3.5	*/ -	{ 0x00FFFFFF, 0x00040006, 0x0 },/* 6:	800	800	0	*/ -	{ 0x80E79FFF, 0x00030002, 0x0 },/* 7:	800	1000	2	*/ -	{ 0x00FFFFFF, 0x00140005, 0x0 },/* 8:	850	850	0	*/ -	{ 0x00FFFFFF, 0x000C0004, 0x0 },/* 9:	900	900	0	*/ -	{ 0x00FFFFFF, 0x001C0003, 0x0 },/* 10:	950	950	0	*/ -	{ 0x80FFFFFF, 0x00030002, 0x0 },/* 11:	1000	1000	0	*/ -}; - -static const struct ddi_buf_trans bdw_ddi_translations_edp[] = { -	{ 0x00FFFFFF, 0x00000012, 0x0 }, -	{ 0x00EBAFFF, 0x00020011, 0x0 }, -	{ 0x00C71FFF, 0x0006000F, 0x0 }, -	{ 0x00AAAFFF, 0x000E000A, 0x0 }, -	{ 0x00FFFFFF, 0x00020011, 0x0 }, -	{ 0x00DB6FFF, 0x0005000F, 0x0 }, -	{ 0x00BEEFFF, 0x000A000C, 0x0 }, -	{ 0x00FFFFFF, 0x0005000F, 0x0 }, -	{ 0x00DB6FFF, 0x000A000C, 0x0 }, -}; - -static const struct ddi_buf_trans bdw_ddi_translations_dp[] = { -	{ 0x00FFFFFF, 0x0007000E, 0x0 }, -	{ 0x00D75FFF, 0x000E000A, 0x0 }, -	{ 0x00BEFFFF, 0x00140006, 0x0 }, -	{ 0x80B2CFFF, 0x001B0002, 0x0 }, -	{ 0x00FFFFFF, 0x000E000A, 0x0 }, -	{ 0x00DB6FFF, 0x00160005, 0x0 }, -	{ 0x80C71FFF, 0x001A0002, 0x0 }, -	{ 0x00F7DFFF, 0x00180004, 0x0 }, -	{ 0x80D75FFF, 0x001B0002, 0x0 }, -}; - -static const struct ddi_buf_trans bdw_ddi_translations_fdi[] = { -	{ 0x00FFFFFF, 0x0001000E, 0x0 }, -	{ 0x00D75FFF, 0x0004000A, 0x0 }, -	{ 0x00C30FFF, 0x00070006, 0x0 }, -	{ 0x00AAAFFF, 0x000C0000, 0x0 }, -	{ 0x00FFFFFF, 0x0004000A, 0x0 }, -	{ 0x00D75FFF, 0x00090004, 0x0 }, -	{ 0x00C30FFF, 0x000C0000, 0x0 }, -	{ 0x00FFFFFF, 0x00070006, 0x0 }, -	{ 0x00D75FFF, 0x000C0000, 0x0 }, -}; - -static const struct ddi_buf_trans bdw_ddi_translations_hdmi[] = { -					/* Idx	NT mV d	T mV df	db	*/ -	{ 0x00FFFFFF, 0x0007000E, 0x0 },/* 0:	400	400	0	*/ -	{ 0x00D75FFF, 0x000E000A, 0x0 },/* 1:	400	600	3.5	*/ -	{ 0x00BEFFFF, 0x00140006, 0x0 },/* 2:	400	800	6	*/ -	{ 0x00FFFFFF, 0x0009000D, 0x0 },/* 3:	450	450	0	*/ -	{ 0x00FFFFFF, 0x000E000A, 0x0 },/* 4:	600	600	0	*/ -	{ 0x00D7FFFF, 0x00140006, 0x0 },/* 5:	600	800	2.5	*/ -	{ 0x80CB2FFF, 0x001B0002, 0x0 },/* 6:	600	1000	4.5	*/ -	{ 0x00FFFFFF, 0x00140006, 0x0 },/* 7:	800	800	0	*/ -	{ 0x80E79FFF, 0x001B0002, 0x0 },/* 8:	800	1000	2	*/ -	{ 0x80FFFFFF, 0x001B0002, 0x0 },/* 9:	1000	1000	0	*/ -}; - -/* Skylake H and S */ -static const struct ddi_buf_trans skl_ddi_translations_dp[] = { -	{ 0x00002016, 0x000000A0, 0x0 }, -	{ 0x00005012, 0x0000009B, 0x0 }, -	{ 0x00007011, 0x00000088, 0x0 }, -	{ 0x80009010, 0x000000C0, 0x1 }, -	{ 0x00002016, 0x0000009B, 0x0 }, -	{ 0x00005012, 0x00000088, 0x0 }, -	{ 0x80007011, 0x000000C0, 0x1 }, -	{ 0x00002016, 0x000000DF, 0x0 }, -	{ 0x80005012, 0x000000C0, 0x1 }, -}; - -/* Skylake U */ -static const struct ddi_buf_trans skl_u_ddi_translations_dp[] = { -	{ 0x0000201B, 0x000000A2, 0x0 }, -	{ 0x00005012, 0x00000088, 0x0 }, -	{ 0x80007011, 0x000000CD, 0x1 }, -	{ 0x80009010, 0x000000C0, 0x1 }, -	{ 0x0000201B, 0x0000009D, 0x0 }, -	{ 0x80005012, 0x000000C0, 0x1 }, -	{ 0x80007011, 0x000000C0, 0x1 }, -	{ 0x00002016, 0x00000088, 0x0 }, -	{ 0x80005012, 0x000000C0, 0x1 }, -}; - -/* Skylake Y */ -static const struct ddi_buf_trans skl_y_ddi_translations_dp[] = { -	{ 0x00000018, 0x000000A2, 0x0 }, -	{ 0x00005012, 0x00000088, 0x0 }, -	{ 0x80007011, 0x000000CD, 0x3 }, -	{ 0x80009010, 0x000000C0, 0x3 }, -	{ 0x00000018, 0x0000009D, 0x0 }, -	{ 0x80005012, 0x000000C0, 0x3 }, -	{ 0x80007011, 0x000000C0, 0x3 }, -	{ 0x00000018, 0x00000088, 0x0 }, -	{ 0x80005012, 0x000000C0, 0x3 }, -}; - -/* Kabylake H and S */ -static const struct ddi_buf_trans kbl_ddi_translations_dp[] = { -	{ 0x00002016, 0x000000A0, 0x0 }, -	{ 0x00005012, 0x0000009B, 0x0 }, -	{ 0x00007011, 0x00000088, 0x0 }, -	{ 0x80009010, 0x000000C0, 0x1 }, -	{ 0x00002016, 0x0000009B, 0x0 }, -	{ 0x00005012, 0x00000088, 0x0 }, -	{ 0x80007011, 0x000000C0, 0x1 }, -	{ 0x00002016, 0x00000097, 0x0 }, -	{ 0x80005012, 0x000000C0, 0x1 }, -}; - -/* Kabylake U */ -static const struct ddi_buf_trans kbl_u_ddi_translations_dp[] = { -	{ 0x0000201B, 0x000000A1, 0x0 }, -	{ 0x00005012, 0x00000088, 0x0 }, -	{ 0x80007011, 0x000000CD, 0x3 }, -	{ 0x80009010, 0x000000C0, 0x3 }, -	{ 0x0000201B, 0x0000009D, 0x0 }, -	{ 0x80005012, 0x000000C0, 0x3 }, -	{ 0x80007011, 0x000000C0, 0x3 }, -	{ 0x00002016, 0x0000004F, 0x0 }, -	{ 0x80005012, 0x000000C0, 0x3 }, -}; - -/* Kabylake Y */ -static const struct ddi_buf_trans kbl_y_ddi_translations_dp[] = { -	{ 0x00001017, 0x000000A1, 0x0 }, -	{ 0x00005012, 0x00000088, 0x0 }, -	{ 0x80007011, 0x000000CD, 0x3 }, -	{ 0x8000800F, 0x000000C0, 0x3 }, -	{ 0x00001017, 0x0000009D, 0x0 }, -	{ 0x80005012, 0x000000C0, 0x3 }, -	{ 0x80007011, 0x000000C0, 0x3 }, -	{ 0x00001017, 0x0000004C, 0x0 }, -	{ 0x80005012, 0x000000C0, 0x3 }, -}; - -/* - * Skylake/Kabylake H and S - * eDP 1.4 low vswing translation parameters - */ -static const struct ddi_buf_trans skl_ddi_translations_edp[] = { -	{ 0x00000018, 0x000000A8, 0x0 }, -	{ 0x00004013, 0x000000A9, 0x0 }, -	{ 0x00007011, 0x000000A2, 0x0 }, -	{ 0x00009010, 0x0000009C, 0x0 }, -	{ 0x00000018, 0x000000A9, 0x0 }, -	{ 0x00006013, 0x000000A2, 0x0 }, -	{ 0x00007011, 0x000000A6, 0x0 }, -	{ 0x00000018, 0x000000AB, 0x0 }, -	{ 0x00007013, 0x0000009F, 0x0 }, -	{ 0x00000018, 0x000000DF, 0x0 }, -}; - -/* - * Skylake/Kabylake U - * eDP 1.4 low vswing translation parameters - */ -static const struct ddi_buf_trans skl_u_ddi_translations_edp[] = { -	{ 0x00000018, 0x000000A8, 0x0 }, -	{ 0x00004013, 0x000000A9, 0x0 }, -	{ 0x00007011, 0x000000A2, 0x0 }, -	{ 0x00009010, 0x0000009C, 0x0 }, -	{ 0x00000018, 0x000000A9, 0x0 }, -	{ 0x00006013, 0x000000A2, 0x0 }, -	{ 0x00007011, 0x000000A6, 0x0 }, -	{ 0x00002016, 0x000000AB, 0x0 }, -	{ 0x00005013, 0x0000009F, 0x0 }, -	{ 0x00000018, 0x000000DF, 0x0 }, -}; - -/* - * Skylake/Kabylake Y - * eDP 1.4 low vswing translation parameters - */ -static const struct ddi_buf_trans skl_y_ddi_translations_edp[] = { -	{ 0x00000018, 0x000000A8, 0x0 }, -	{ 0x00004013, 0x000000AB, 0x0 }, -	{ 0x00007011, 0x000000A4, 0x0 }, -	{ 0x00009010, 0x000000DF, 0x0 }, -	{ 0x00000018, 0x000000AA, 0x0 }, -	{ 0x00006013, 0x000000A4, 0x0 }, -	{ 0x00007011, 0x0000009D, 0x0 }, -	{ 0x00000018, 0x000000A0, 0x0 }, -	{ 0x00006012, 0x000000DF, 0x0 }, -	{ 0x00000018, 0x0000008A, 0x0 }, -}; - -/* Skylake/Kabylake U, H and S */ -static const struct ddi_buf_trans skl_ddi_translations_hdmi[] = { -	{ 0x00000018, 0x000000AC, 0x0 }, -	{ 0x00005012, 0x0000009D, 0x0 }, -	{ 0x00007011, 0x00000088, 0x0 }, -	{ 0x00000018, 0x000000A1, 0x0 }, -	{ 0x00000018, 0x00000098, 0x0 }, -	{ 0x00004013, 0x00000088, 0x0 }, -	{ 0x80006012, 0x000000CD, 0x1 }, -	{ 0x00000018, 0x000000DF, 0x0 }, -	{ 0x80003015, 0x000000CD, 0x1 },	/* Default */ -	{ 0x80003015, 0x000000C0, 0x1 }, -	{ 0x80000018, 0x000000C0, 0x1 }, -}; - -/* Skylake/Kabylake Y */ -static const struct ddi_buf_trans skl_y_ddi_translations_hdmi[] = { -	{ 0x00000018, 0x000000A1, 0x0 }, -	{ 0x00005012, 0x000000DF, 0x0 }, -	{ 0x80007011, 0x000000CB, 0x3 }, -	{ 0x00000018, 0x000000A4, 0x0 }, -	{ 0x00000018, 0x0000009D, 0x0 }, -	{ 0x00004013, 0x00000080, 0x0 }, -	{ 0x80006013, 0x000000C0, 0x3 }, -	{ 0x00000018, 0x0000008A, 0x0 }, -	{ 0x80003015, 0x000000C0, 0x3 },	/* Default */ -	{ 0x80003015, 0x000000C0, 0x3 }, -	{ 0x80000018, 0x000000C0, 0x3 }, -}; - -struct bxt_ddi_buf_trans { -	u8 margin;	/* swing value */ -	u8 scale;	/* scale value */ -	u8 enable;	/* scale enable */ -	u8 deemphasis; -}; - -static const struct bxt_ddi_buf_trans bxt_ddi_translations_dp[] = { -					/* Idx	NT mV diff	db  */ -	{ 52,  0x9A, 0, 128, },	/* 0:	400		0   */ -	{ 78,  0x9A, 0, 85,  },	/* 1:	400		3.5 */ -	{ 104, 0x9A, 0, 64,  },	/* 2:	400		6   */ -	{ 154, 0x9A, 0, 43,  },	/* 3:	400		9.5 */ -	{ 77,  0x9A, 0, 128, },	/* 4:	600		0   */ -	{ 116, 0x9A, 0, 85,  },	/* 5:	600		3.5 */ -	{ 154, 0x9A, 0, 64,  },	/* 6:	600		6   */ -	{ 102, 0x9A, 0, 128, },	/* 7:	800		0   */ -	{ 154, 0x9A, 0, 85,  },	/* 8:	800		3.5 */ -	{ 154, 0x9A, 1, 128, },	/* 9:	1200		0   */ -}; - -static const struct bxt_ddi_buf_trans bxt_ddi_translations_edp[] = { -					/* Idx	NT mV diff	db  */ -	{ 26, 0, 0, 128, },	/* 0:	200		0   */ -	{ 38, 0, 0, 112, },	/* 1:	200		1.5 */ -	{ 48, 0, 0, 96,  },	/* 2:	200		4   */ -	{ 54, 0, 0, 69,  },	/* 3:	200		6   */ -	{ 32, 0, 0, 128, },	/* 4:	250		0   */ -	{ 48, 0, 0, 104, },	/* 5:	250		1.5 */ -	{ 54, 0, 0, 85,  },	/* 6:	250		4   */ -	{ 43, 0, 0, 128, },	/* 7:	300		0   */ -	{ 54, 0, 0, 101, },	/* 8:	300		1.5 */ -	{ 48, 0, 0, 128, },	/* 9:	300		0   */ -}; - -/* BSpec has 2 recommended values - entries 0 and 8. - * Using the entry with higher vswing. - */ -static const struct bxt_ddi_buf_trans bxt_ddi_translations_hdmi[] = { -					/* Idx	NT mV diff	db  */ -	{ 52,  0x9A, 0, 128, },	/* 0:	400		0   */ -	{ 52,  0x9A, 0, 85,  },	/* 1:	400		3.5 */ -	{ 52,  0x9A, 0, 64,  },	/* 2:	400		6   */ -	{ 42,  0x9A, 0, 43,  },	/* 3:	400		9.5 */ -	{ 77,  0x9A, 0, 128, },	/* 4:	600		0   */ -	{ 77,  0x9A, 0, 85,  },	/* 5:	600		3.5 */ -	{ 77,  0x9A, 0, 64,  },	/* 6:	600		6   */ -	{ 102, 0x9A, 0, 128, },	/* 7:	800		0   */ -	{ 102, 0x9A, 0, 85,  },	/* 8:	800		3.5 */ -	{ 154, 0x9A, 1, 128, },	/* 9:	1200		0   */ -}; - -struct cnl_ddi_buf_trans { -	u8 dw2_swing_sel; -	u8 dw7_n_scalar; -	u8 dw4_cursor_coeff; -	u8 dw4_post_cursor_2; -	u8 dw4_post_cursor_1; -}; - -/* Voltage Swing Programming for VccIO 0.85V for DP */ -static const struct cnl_ddi_buf_trans cnl_ddi_translations_dp_0_85V[] = { -						/* NT mV Trans mV db    */ -	{ 0xA, 0x5D, 0x3F, 0x00, 0x00 },	/* 350   350      0.0   */ -	{ 0xA, 0x6A, 0x38, 0x00, 0x07 },	/* 350   500      3.1   */ -	{ 0xB, 0x7A, 0x32, 0x00, 0x0D },	/* 350   700      6.0   */ -	{ 0x6, 0x7C, 0x2D, 0x00, 0x12 },	/* 350   900      8.2   */ -	{ 0xA, 0x69, 0x3F, 0x00, 0x00 },	/* 500   500      0.0   */ -	{ 0xB, 0x7A, 0x36, 0x00, 0x09 },	/* 500   700      2.9   */ -	{ 0x6, 0x7C, 0x30, 0x00, 0x0F },	/* 500   900      5.1   */ -	{ 0xB, 0x7D, 0x3C, 0x00, 0x03 },	/* 650   725      0.9   */ -	{ 0x6, 0x7C, 0x34, 0x00, 0x0B },	/* 600   900      3.5   */ -	{ 0x6, 0x7B, 0x3F, 0x00, 0x00 },	/* 900   900      0.0   */ -}; - -/* Voltage Swing Programming for VccIO 0.85V for HDMI */ -static const struct cnl_ddi_buf_trans cnl_ddi_translations_hdmi_0_85V[] = { -						/* NT mV Trans mV db    */ -	{ 0xA, 0x60, 0x3F, 0x00, 0x00 },	/* 450   450      0.0   */ -	{ 0xB, 0x73, 0x36, 0x00, 0x09 },	/* 450   650      3.2   */ -	{ 0x6, 0x7F, 0x31, 0x00, 0x0E },	/* 450   850      5.5   */ -	{ 0xB, 0x73, 0x3F, 0x00, 0x00 },	/* 650   650      0.0   */ -	{ 0x6, 0x7F, 0x37, 0x00, 0x08 },	/* 650   850      2.3   */ -	{ 0x6, 0x7F, 0x3F, 0x00, 0x00 },	/* 850   850      0.0   */ -	{ 0x6, 0x7F, 0x35, 0x00, 0x0A },	/* 600   850      3.0   */ -}; - -/* Voltage Swing Programming for VccIO 0.85V for eDP */ -static const struct cnl_ddi_buf_trans cnl_ddi_translations_edp_0_85V[] = { -						/* NT mV Trans mV db    */ -	{ 0xA, 0x66, 0x3A, 0x00, 0x05 },	/* 384   500      2.3   */ -	{ 0x0, 0x7F, 0x38, 0x00, 0x07 },	/* 153   200      2.3   */ -	{ 0x8, 0x7F, 0x38, 0x00, 0x07 },	/* 192   250      2.3   */ -	{ 0x1, 0x7F, 0x38, 0x00, 0x07 },	/* 230   300      2.3   */ -	{ 0x9, 0x7F, 0x38, 0x00, 0x07 },	/* 269   350      2.3   */ -	{ 0xA, 0x66, 0x3C, 0x00, 0x03 },	/* 446   500      1.0   */ -	{ 0xB, 0x70, 0x3C, 0x00, 0x03 },	/* 460   600      2.3   */ -	{ 0xC, 0x75, 0x3C, 0x00, 0x03 },	/* 537   700      2.3   */ -	{ 0x2, 0x7F, 0x3F, 0x00, 0x00 },	/* 400   400      0.0   */ -}; - -/* Voltage Swing Programming for VccIO 0.95V for DP */ -static const struct cnl_ddi_buf_trans cnl_ddi_translations_dp_0_95V[] = { -						/* NT mV Trans mV db    */ -	{ 0xA, 0x5D, 0x3F, 0x00, 0x00 },	/* 350   350      0.0   */ -	{ 0xA, 0x6A, 0x38, 0x00, 0x07 },	/* 350   500      3.1   */ -	{ 0xB, 0x7A, 0x32, 0x00, 0x0D },	/* 350   700      6.0   */ -	{ 0x6, 0x7C, 0x2D, 0x00, 0x12 },	/* 350   900      8.2   */ -	{ 0xA, 0x69, 0x3F, 0x00, 0x00 },	/* 500   500      0.0   */ -	{ 0xB, 0x7A, 0x36, 0x00, 0x09 },	/* 500   700      2.9   */ -	{ 0x6, 0x7C, 0x30, 0x00, 0x0F },	/* 500   900      5.1   */ -	{ 0xB, 0x7D, 0x3C, 0x00, 0x03 },	/* 650   725      0.9   */ -	{ 0x6, 0x7C, 0x34, 0x00, 0x0B },	/* 600   900      3.5   */ -	{ 0x6, 0x7B, 0x3F, 0x00, 0x00 },	/* 900   900      0.0   */ -}; - -/* Voltage Swing Programming for VccIO 0.95V for HDMI */ -static const struct cnl_ddi_buf_trans cnl_ddi_translations_hdmi_0_95V[] = { -						/* NT mV Trans mV db    */ -	{ 0xA, 0x5C, 0x3F, 0x00, 0x00 },	/* 400   400      0.0   */ -	{ 0xB, 0x69, 0x37, 0x00, 0x08 },	/* 400   600      3.5   */ -	{ 0x5, 0x76, 0x31, 0x00, 0x0E },	/* 400   800      6.0   */ -	{ 0xA, 0x5E, 0x3F, 0x00, 0x00 },	/* 450   450      0.0   */ -	{ 0xB, 0x69, 0x3F, 0x00, 0x00 },	/* 600   600      0.0   */ -	{ 0xB, 0x79, 0x35, 0x00, 0x0A },	/* 600   850      3.0   */ -	{ 0x6, 0x7D, 0x32, 0x00, 0x0D },	/* 600   1000     4.4   */ -	{ 0x5, 0x76, 0x3F, 0x00, 0x00 },	/* 800   800      0.0   */ -	{ 0x6, 0x7D, 0x39, 0x00, 0x06 },	/* 800   1000     1.9   */ -	{ 0x6, 0x7F, 0x39, 0x00, 0x06 },	/* 850   1050     1.8   */ -	{ 0x6, 0x7F, 0x3F, 0x00, 0x00 },	/* 1050  1050     0.0   */ -}; - -/* Voltage Swing Programming for VccIO 0.95V for eDP */ -static const struct cnl_ddi_buf_trans cnl_ddi_translations_edp_0_95V[] = { -						/* NT mV Trans mV db    */ -	{ 0xA, 0x61, 0x3A, 0x00, 0x05 },	/* 384   500      2.3   */ -	{ 0x0, 0x7F, 0x38, 0x00, 0x07 },	/* 153   200      2.3   */ -	{ 0x8, 0x7F, 0x38, 0x00, 0x07 },	/* 192   250      2.3   */ -	{ 0x1, 0x7F, 0x38, 0x00, 0x07 },	/* 230   300      2.3   */ -	{ 0x9, 0x7F, 0x38, 0x00, 0x07 },	/* 269   350      2.3   */ -	{ 0xA, 0x61, 0x3C, 0x00, 0x03 },	/* 446   500      1.0   */ -	{ 0xB, 0x68, 0x39, 0x00, 0x06 },	/* 460   600      2.3   */ -	{ 0xC, 0x6E, 0x39, 0x00, 0x06 },	/* 537   700      2.3   */ -	{ 0x4, 0x7F, 0x3A, 0x00, 0x05 },	/* 460   600      2.3   */ -	{ 0x2, 0x7F, 0x3F, 0x00, 0x00 },	/* 400   400      0.0   */ -}; - -/* Voltage Swing Programming for VccIO 1.05V for DP */ -static const struct cnl_ddi_buf_trans cnl_ddi_translations_dp_1_05V[] = { -						/* NT mV Trans mV db    */ -	{ 0xA, 0x58, 0x3F, 0x00, 0x00 },	/* 400   400      0.0   */ -	{ 0xB, 0x64, 0x37, 0x00, 0x08 },	/* 400   600      3.5   */ -	{ 0x5, 0x70, 0x31, 0x00, 0x0E },	/* 400   800      6.0   */ -	{ 0x6, 0x7F, 0x2C, 0x00, 0x13 },	/* 400   1050     8.4   */ -	{ 0xB, 0x64, 0x3F, 0x00, 0x00 },	/* 600   600      0.0   */ -	{ 0x5, 0x73, 0x35, 0x00, 0x0A },	/* 600   850      3.0   */ -	{ 0x6, 0x7F, 0x30, 0x00, 0x0F },	/* 550   1050     5.6   */ -	{ 0x5, 0x76, 0x3E, 0x00, 0x01 },	/* 850   900      0.5   */ -	{ 0x6, 0x7F, 0x36, 0x00, 0x09 },	/* 750   1050     2.9   */ -	{ 0x6, 0x7F, 0x3F, 0x00, 0x00 },	/* 1050  1050     0.0   */ -}; - -/* Voltage Swing Programming for VccIO 1.05V for HDMI */ -static const struct cnl_ddi_buf_trans cnl_ddi_translations_hdmi_1_05V[] = { -						/* NT mV Trans mV db    */ -	{ 0xA, 0x58, 0x3F, 0x00, 0x00 },	/* 400   400      0.0   */ -	{ 0xB, 0x64, 0x37, 0x00, 0x08 },	/* 400   600      3.5   */ -	{ 0x5, 0x70, 0x31, 0x00, 0x0E },	/* 400   800      6.0   */ -	{ 0xA, 0x5B, 0x3F, 0x00, 0x00 },	/* 450   450      0.0   */ -	{ 0xB, 0x64, 0x3F, 0x00, 0x00 },	/* 600   600      0.0   */ -	{ 0x5, 0x73, 0x35, 0x00, 0x0A },	/* 600   850      3.0   */ -	{ 0x6, 0x7C, 0x32, 0x00, 0x0D },	/* 600   1000     4.4   */ -	{ 0x5, 0x70, 0x3F, 0x00, 0x00 },	/* 800   800      0.0   */ -	{ 0x6, 0x7C, 0x39, 0x00, 0x06 },	/* 800   1000     1.9   */ -	{ 0x6, 0x7F, 0x39, 0x00, 0x06 },	/* 850   1050     1.8   */ -	{ 0x6, 0x7F, 0x3F, 0x00, 0x00 },	/* 1050  1050     0.0   */ -}; - -/* Voltage Swing Programming for VccIO 1.05V for eDP */ -static const struct cnl_ddi_buf_trans cnl_ddi_translations_edp_1_05V[] = { -						/* NT mV Trans mV db    */ -	{ 0xA, 0x5E, 0x3A, 0x00, 0x05 },	/* 384   500      2.3   */ -	{ 0x0, 0x7F, 0x38, 0x00, 0x07 },	/* 153   200      2.3   */ -	{ 0x8, 0x7F, 0x38, 0x00, 0x07 },	/* 192   250      2.3   */ -	{ 0x1, 0x7F, 0x38, 0x00, 0x07 },	/* 230   300      2.3   */ -	{ 0x9, 0x7F, 0x38, 0x00, 0x07 },	/* 269   350      2.3   */ -	{ 0xA, 0x5E, 0x3C, 0x00, 0x03 },	/* 446   500      1.0   */ -	{ 0xB, 0x64, 0x39, 0x00, 0x06 },	/* 460   600      2.3   */ -	{ 0xE, 0x6A, 0x39, 0x00, 0x06 },	/* 537   700      2.3   */ -	{ 0x2, 0x7F, 0x3F, 0x00, 0x00 },	/* 400   400      0.0   */ -}; - -/* icl_combo_phy_ddi_translations */ -static const struct cnl_ddi_buf_trans icl_combo_phy_ddi_translations_dp_hbr2[] = { -						/* NT mV Trans mV db    */ -	{ 0xA, 0x35, 0x3F, 0x00, 0x00 },	/* 350   350      0.0   */ -	{ 0xA, 0x4F, 0x37, 0x00, 0x08 },	/* 350   500      3.1   */ -	{ 0xC, 0x71, 0x2F, 0x00, 0x10 },	/* 350   700      6.0   */ -	{ 0x6, 0x7F, 0x2B, 0x00, 0x14 },	/* 350   900      8.2   */ -	{ 0xA, 0x4C, 0x3F, 0x00, 0x00 },	/* 500   500      0.0   */ -	{ 0xC, 0x73, 0x34, 0x00, 0x0B },	/* 500   700      2.9   */ -	{ 0x6, 0x7F, 0x2F, 0x00, 0x10 },	/* 500   900      5.1   */ -	{ 0xC, 0x6C, 0x3C, 0x00, 0x03 },	/* 650   700      0.6   */ -	{ 0x6, 0x7F, 0x35, 0x00, 0x0A },	/* 600   900      3.5   */ -	{ 0x6, 0x7F, 0x3F, 0x00, 0x00 },	/* 900   900      0.0   */ -}; - -static const struct cnl_ddi_buf_trans icl_combo_phy_ddi_translations_edp_hbr2[] = { -						/* NT mV Trans mV db    */ -	{ 0x0, 0x7F, 0x3F, 0x00, 0x00 },	/* 200   200      0.0   */ -	{ 0x8, 0x7F, 0x38, 0x00, 0x07 },	/* 200   250      1.9   */ -	{ 0x1, 0x7F, 0x33, 0x00, 0x0C },	/* 200   300      3.5   */ -	{ 0x9, 0x7F, 0x31, 0x00, 0x0E },	/* 200   350      4.9   */ -	{ 0x8, 0x7F, 0x3F, 0x00, 0x00 },	/* 250   250      0.0   */ -	{ 0x1, 0x7F, 0x38, 0x00, 0x07 },	/* 250   300      1.6   */ -	{ 0x9, 0x7F, 0x35, 0x00, 0x0A },	/* 250   350      2.9   */ -	{ 0x1, 0x7F, 0x3F, 0x00, 0x00 },	/* 300   300      0.0   */ -	{ 0x9, 0x7F, 0x38, 0x00, 0x07 },	/* 300   350      1.3   */ -	{ 0x9, 0x7F, 0x3F, 0x00, 0x00 },	/* 350   350      0.0   */ -}; - -static const struct cnl_ddi_buf_trans icl_combo_phy_ddi_translations_edp_hbr3[] = { -						/* NT mV Trans mV db    */ -	{ 0xA, 0x35, 0x3F, 0x00, 0x00 },	/* 350   350      0.0   */ -	{ 0xA, 0x4F, 0x37, 0x00, 0x08 },	/* 350   500      3.1   */ -	{ 0xC, 0x71, 0x2F, 0x00, 0x10 },	/* 350   700      6.0   */ -	{ 0x6, 0x7F, 0x2B, 0x00, 0x14 },	/* 350   900      8.2   */ -	{ 0xA, 0x4C, 0x3F, 0x00, 0x00 },	/* 500   500      0.0   */ -	{ 0xC, 0x73, 0x34, 0x00, 0x0B },	/* 500   700      2.9   */ -	{ 0x6, 0x7F, 0x2F, 0x00, 0x10 },	/* 500   900      5.1   */ -	{ 0xC, 0x6C, 0x3C, 0x00, 0x03 },	/* 650   700      0.6   */ -	{ 0x6, 0x7F, 0x35, 0x00, 0x0A },	/* 600   900      3.5   */ -	{ 0x6, 0x7F, 0x3F, 0x00, 0x00 },	/* 900   900      0.0   */ -}; - -static const struct cnl_ddi_buf_trans icl_combo_phy_ddi_translations_hdmi[] = { -						/* NT mV Trans mV db    */ -	{ 0xA, 0x60, 0x3F, 0x00, 0x00 },	/* 450   450      0.0   */ -	{ 0xB, 0x73, 0x36, 0x00, 0x09 },	/* 450   650      3.2   */ -	{ 0x6, 0x7F, 0x31, 0x00, 0x0E },	/* 450   850      5.5   */ -	{ 0xB, 0x73, 0x3F, 0x00, 0x00 },	/* 650   650      0.0   ALS */ -	{ 0x6, 0x7F, 0x37, 0x00, 0x08 },	/* 650   850      2.3   */ -	{ 0x6, 0x7F, 0x3F, 0x00, 0x00 },	/* 850   850      0.0   */ -	{ 0x6, 0x7F, 0x35, 0x00, 0x0A },	/* 600   850      3.0   */ -}; - -static const struct cnl_ddi_buf_trans ehl_combo_phy_ddi_translations_dp[] = { -						/* NT mV Trans mV db    */ -	{ 0xA, 0x33, 0x3F, 0x00, 0x00 },	/* 350   350      0.0   */ -	{ 0xA, 0x47, 0x36, 0x00, 0x09 },	/* 350   500      3.1   */ -	{ 0xC, 0x64, 0x34, 0x00, 0x0B },	/* 350   700      6.0   */ -	{ 0x6, 0x7F, 0x30, 0x00, 0x0F },	/* 350   900      8.2   */ -	{ 0xA, 0x46, 0x3F, 0x00, 0x00 },	/* 500   500      0.0   */ -	{ 0xC, 0x64, 0x38, 0x00, 0x07 },	/* 500   700      2.9   */ -	{ 0x6, 0x7F, 0x32, 0x00, 0x0D },	/* 500   900      5.1   */ -	{ 0xC, 0x61, 0x3F, 0x00, 0x00 },	/* 650   700      0.6   */ -	{ 0x6, 0x7F, 0x38, 0x00, 0x07 },	/* 600   900      3.5   */ -	{ 0x6, 0x7F, 0x3F, 0x00, 0x00 },	/* 900   900      0.0   */ -}; - -static const struct cnl_ddi_buf_trans jsl_combo_phy_ddi_translations_edp_hbr[] = { -						/* NT mV Trans mV db    */ -	{ 0x8, 0x7F, 0x3F, 0x00, 0x00 },        /* 200   200      0.0   */ -	{ 0x8, 0x7F, 0x38, 0x00, 0x07 },        /* 200   250      1.9   */ -	{ 0x1, 0x7F, 0x33, 0x00, 0x0C },        /* 200   300      3.5   */ -	{ 0xA, 0x35, 0x36, 0x00, 0x09 },        /* 200   350      4.9   */ -	{ 0x8, 0x7F, 0x3F, 0x00, 0x00 },        /* 250   250      0.0   */ -	{ 0x1, 0x7F, 0x38, 0x00, 0x07 },        /* 250   300      1.6   */ -	{ 0xA, 0x35, 0x35, 0x00, 0x0A },        /* 250   350      2.9   */ -	{ 0x1, 0x7F, 0x3F, 0x00, 0x00 },        /* 300   300      0.0   */ -	{ 0xA, 0x35, 0x38, 0x00, 0x07 },        /* 300   350      1.3   */ -	{ 0xA, 0x35, 0x3F, 0x00, 0x00 },        /* 350   350      0.0   */ -}; - -static const struct cnl_ddi_buf_trans jsl_combo_phy_ddi_translations_edp_hbr2[] = { -						/* NT mV Trans mV db    */ -	{ 0x8, 0x7F, 0x3F, 0x00, 0x00 },        /* 200   200      0.0   */ -	{ 0x8, 0x7F, 0x3F, 0x00, 0x00 },        /* 200   250      1.9   */ -	{ 0x1, 0x7F, 0x3D, 0x00, 0x02 },        /* 200   300      3.5   */ -	{ 0xA, 0x35, 0x38, 0x00, 0x07 },        /* 200   350      4.9   */ -	{ 0x8, 0x7F, 0x3F, 0x00, 0x00 },        /* 250   250      0.0   */ -	{ 0x1, 0x7F, 0x3F, 0x00, 0x00 },        /* 250   300      1.6   */ -	{ 0xA, 0x35, 0x3A, 0x00, 0x05 },        /* 250   350      2.9   */ -	{ 0x1, 0x7F, 0x3F, 0x00, 0x00 },        /* 300   300      0.0   */ -	{ 0xA, 0x35, 0x38, 0x00, 0x07 },        /* 300   350      1.3   */ -	{ 0xA, 0x35, 0x3F, 0x00, 0x00 },        /* 350   350      0.0   */ -}; - -static const struct cnl_ddi_buf_trans dg1_combo_phy_ddi_translations_dp_rbr_hbr[] = { -						/* NT mV Trans mV db    */ -	{ 0xA, 0x32, 0x3F, 0x00, 0x00 },	/* 350   350      0.0   */ -	{ 0xA, 0x48, 0x35, 0x00, 0x0A },	/* 350   500      3.1   */ -	{ 0xC, 0x63, 0x2F, 0x00, 0x10 },	/* 350   700      6.0   */ -	{ 0x6, 0x7F, 0x2C, 0x00, 0x13 },	/* 350   900      8.2   */ -	{ 0xA, 0x43, 0x3F, 0x00, 0x00 },	/* 500   500      0.0   */ -	{ 0xC, 0x60, 0x36, 0x00, 0x09 },	/* 500   700      2.9   */ -	{ 0x6, 0x7F, 0x30, 0x00, 0x0F },	/* 500   900      5.1   */ -	{ 0xC, 0x60, 0x3F, 0x00, 0x00 },	/* 650   700      0.6   */ -	{ 0x6, 0x7F, 0x37, 0x00, 0x08 },	/* 600   900      3.5   */ -	{ 0x6, 0x7F, 0x3F, 0x00, 0x00 },	/* 900   900      0.0   */ -}; - -static const struct cnl_ddi_buf_trans dg1_combo_phy_ddi_translations_dp_hbr2_hbr3[] = { -						/* NT mV Trans mV db    */ -	{ 0xA, 0x32, 0x3F, 0x00, 0x00 },	/* 350   350      0.0   */ -	{ 0xA, 0x48, 0x35, 0x00, 0x0A },	/* 350   500      3.1   */ -	{ 0xC, 0x63, 0x2F, 0x00, 0x10 },	/* 350   700      6.0   */ -	{ 0x6, 0x7F, 0x2C, 0x00, 0x13 },	/* 350   900      8.2   */ -	{ 0xA, 0x43, 0x3F, 0x00, 0x00 },	/* 500   500      0.0   */ -	{ 0xC, 0x60, 0x36, 0x00, 0x09 },	/* 500   700      2.9   */ -	{ 0x6, 0x7F, 0x30, 0x00, 0x0F },	/* 500   900      5.1   */ -	{ 0xC, 0x58, 0x3F, 0x00, 0x00 },	/* 650   700      0.6   */ -	{ 0x6, 0x7F, 0x35, 0x00, 0x0A },	/* 600   900      3.5   */ -	{ 0x6, 0x7F, 0x3F, 0x00, 0x00 },	/* 900   900      0.0   */ -}; - -struct icl_mg_phy_ddi_buf_trans { -	u32 cri_txdeemph_override_11_6; -	u32 cri_txdeemph_override_5_0; -	u32 cri_txdeemph_override_17_12; -}; - -static const struct icl_mg_phy_ddi_buf_trans icl_mg_phy_ddi_translations_rbr_hbr[] = { -				/* Voltage swing  pre-emphasis */ -	{ 0x18, 0x00, 0x00 },	/* 0              0   */ -	{ 0x1D, 0x00, 0x05 },	/* 0              1   */ -	{ 0x24, 0x00, 0x0C },	/* 0              2   */ -	{ 0x2B, 0x00, 0x14 },	/* 0              3   */ -	{ 0x21, 0x00, 0x00 },	/* 1              0   */ -	{ 0x2B, 0x00, 0x08 },	/* 1              1   */ -	{ 0x30, 0x00, 0x0F },	/* 1              2   */ -	{ 0x31, 0x00, 0x03 },	/* 2              0   */ -	{ 0x34, 0x00, 0x0B },	/* 2              1   */ -	{ 0x3F, 0x00, 0x00 },	/* 3              0   */ -}; - -static const struct icl_mg_phy_ddi_buf_trans icl_mg_phy_ddi_translations_hbr2_hbr3[] = { -				/* Voltage swing  pre-emphasis */ -	{ 0x18, 0x00, 0x00 },	/* 0              0   */ -	{ 0x1D, 0x00, 0x05 },	/* 0              1   */ -	{ 0x24, 0x00, 0x0C },	/* 0              2   */ -	{ 0x2B, 0x00, 0x14 },	/* 0              3   */ -	{ 0x26, 0x00, 0x00 },	/* 1              0   */ -	{ 0x2C, 0x00, 0x07 },	/* 1              1   */ -	{ 0x33, 0x00, 0x0C },	/* 1              2   */ -	{ 0x2E, 0x00, 0x00 },	/* 2              0   */ -	{ 0x36, 0x00, 0x09 },	/* 2              1   */ -	{ 0x3F, 0x00, 0x00 },	/* 3              0   */ -}; - -static const struct icl_mg_phy_ddi_buf_trans icl_mg_phy_ddi_translations_hdmi[] = { -				/* HDMI Preset	VS	Pre-emph */ -	{ 0x1A, 0x0, 0x0 },	/* 1		400mV	0dB */ -	{ 0x20, 0x0, 0x0 },	/* 2		500mV	0dB */ -	{ 0x29, 0x0, 0x0 },	/* 3		650mV	0dB */ -	{ 0x32, 0x0, 0x0 },	/* 4		800mV	0dB */ -	{ 0x3F, 0x0, 0x0 },	/* 5		1000mV	0dB */ -	{ 0x3A, 0x0, 0x5 },	/* 6		Full	-1.5 dB */ -	{ 0x39, 0x0, 0x6 },	/* 7		Full	-1.8 dB */ -	{ 0x38, 0x0, 0x7 },	/* 8		Full	-2 dB */ -	{ 0x37, 0x0, 0x8 },	/* 9		Full	-2.5 dB */ -	{ 0x36, 0x0, 0x9 },	/* 10		Full	-3 dB */ -}; - -struct tgl_dkl_phy_ddi_buf_trans { -	u32 dkl_vswing_control; -	u32 dkl_preshoot_control; -	u32 dkl_de_emphasis_control; -}; - -static const struct tgl_dkl_phy_ddi_buf_trans tgl_dkl_phy_dp_ddi_trans[] = { -				/* VS	pre-emp	Non-trans mV	Pre-emph dB */ -	{ 0x7, 0x0, 0x00 },	/* 0	0	400mV		0 dB */ -	{ 0x5, 0x0, 0x05 },	/* 0	1	400mV		3.5 dB */ -	{ 0x2, 0x0, 0x0B },	/* 0	2	400mV		6 dB */ -	{ 0x0, 0x0, 0x18 },	/* 0	3	400mV		9.5 dB */ -	{ 0x5, 0x0, 0x00 },	/* 1	0	600mV		0 dB */ -	{ 0x2, 0x0, 0x08 },	/* 1	1	600mV		3.5 dB */ -	{ 0x0, 0x0, 0x14 },	/* 1	2	600mV		6 dB */ -	{ 0x2, 0x0, 0x00 },	/* 2	0	800mV		0 dB */ -	{ 0x0, 0x0, 0x0B },	/* 2	1	800mV		3.5 dB */ -	{ 0x0, 0x0, 0x00 },	/* 3	0	1200mV		0 dB HDMI default */ -}; - -static const struct tgl_dkl_phy_ddi_buf_trans tgl_dkl_phy_dp_ddi_trans_hbr2[] = { -				/* VS	pre-emp	Non-trans mV	Pre-emph dB */ -	{ 0x7, 0x0, 0x00 },	/* 0	0	400mV		0 dB */ -	{ 0x5, 0x0, 0x05 },	/* 0	1	400mV		3.5 dB */ -	{ 0x2, 0x0, 0x0B },	/* 0	2	400mV		6 dB */ -	{ 0x0, 0x0, 0x19 },	/* 0	3	400mV		9.5 dB */ -	{ 0x5, 0x0, 0x00 },	/* 1	0	600mV		0 dB */ -	{ 0x2, 0x0, 0x08 },	/* 1	1	600mV		3.5 dB */ -	{ 0x0, 0x0, 0x14 },	/* 1	2	600mV		6 dB */ -	{ 0x2, 0x0, 0x00 },	/* 2	0	800mV		0 dB */ -	{ 0x0, 0x0, 0x0B },	/* 2	1	800mV		3.5 dB */ -	{ 0x0, 0x0, 0x00 },	/* 3	0	1200mV		0 dB HDMI default */ -}; - -static const struct tgl_dkl_phy_ddi_buf_trans tgl_dkl_phy_hdmi_ddi_trans[] = { -				/* HDMI Preset	VS	Pre-emph */ -	{ 0x7, 0x0, 0x0 },	/* 1		400mV	0dB */ -	{ 0x6, 0x0, 0x0 },	/* 2		500mV	0dB */ -	{ 0x4, 0x0, 0x0 },	/* 3		650mV	0dB */ -	{ 0x2, 0x0, 0x0 },	/* 4		800mV	0dB */ -	{ 0x0, 0x0, 0x0 },	/* 5		1000mV	0dB */ -	{ 0x0, 0x0, 0x5 },	/* 6		Full	-1.5 dB */ -	{ 0x0, 0x0, 0x6 },	/* 7		Full	-1.8 dB */ -	{ 0x0, 0x0, 0x7 },	/* 8		Full	-2 dB */ -	{ 0x0, 0x0, 0x8 },	/* 9		Full	-2.5 dB */ -	{ 0x0, 0x0, 0xA },	/* 10		Full	-3 dB */ -}; - -static const struct cnl_ddi_buf_trans tgl_combo_phy_ddi_translations_dp_hbr[] = { -						/* NT mV Trans mV db    */ -	{ 0xA, 0x32, 0x3F, 0x00, 0x00 },	/* 350   350      0.0   */ -	{ 0xA, 0x4F, 0x37, 0x00, 0x08 },	/* 350   500      3.1   */ -	{ 0xC, 0x71, 0x2F, 0x00, 0x10 },	/* 350   700      6.0   */ -	{ 0x6, 0x7D, 0x2B, 0x00, 0x14 },	/* 350   900      8.2   */ -	{ 0xA, 0x4C, 0x3F, 0x00, 0x00 },	/* 500   500      0.0   */ -	{ 0xC, 0x73, 0x34, 0x00, 0x0B },	/* 500   700      2.9   */ -	{ 0x6, 0x7F, 0x2F, 0x00, 0x10 },	/* 500   900      5.1   */ -	{ 0xC, 0x6C, 0x3C, 0x00, 0x03 },	/* 650   700      0.6   */ -	{ 0x6, 0x7F, 0x35, 0x00, 0x0A },	/* 600   900      3.5   */ -	{ 0x6, 0x7F, 0x3F, 0x00, 0x00 },	/* 900   900      0.0   */ -}; - -static const struct cnl_ddi_buf_trans tgl_combo_phy_ddi_translations_dp_hbr2[] = { -						/* NT mV Trans mV db    */ -	{ 0xA, 0x35, 0x3F, 0x00, 0x00 },	/* 350   350      0.0   */ -	{ 0xA, 0x4F, 0x37, 0x00, 0x08 },	/* 350   500      3.1   */ -	{ 0xC, 0x63, 0x2F, 0x00, 0x10 },	/* 350   700      6.0   */ -	{ 0x6, 0x7F, 0x2B, 0x00, 0x14 },	/* 350   900      8.2   */ -	{ 0xA, 0x47, 0x3F, 0x00, 0x00 },	/* 500   500      0.0   */ -	{ 0xC, 0x63, 0x34, 0x00, 0x0B },	/* 500   700      2.9   */ -	{ 0x6, 0x7F, 0x2F, 0x00, 0x10 },	/* 500   900      5.1   */ -	{ 0xC, 0x61, 0x3C, 0x00, 0x03 },	/* 650   700      0.6   */ -	{ 0x6, 0x7B, 0x35, 0x00, 0x0A },	/* 600   900      3.5   */ -	{ 0x6, 0x7F, 0x3F, 0x00, 0x00 },	/* 900   900      0.0   */ -}; - -static const struct cnl_ddi_buf_trans tgl_uy_combo_phy_ddi_translations_dp_hbr2[] = { -						/* NT mV Trans mV db    */ -	{ 0xA, 0x35, 0x3F, 0x00, 0x00 },	/* 350   350      0.0   */ -	{ 0xA, 0x4F, 0x36, 0x00, 0x09 },	/* 350   500      3.1   */ -	{ 0xC, 0x60, 0x32, 0x00, 0x0D },	/* 350   700      6.0   */ -	{ 0xC, 0x7F, 0x2D, 0x00, 0x12 },	/* 350   900      8.2   */ -	{ 0xC, 0x47, 0x3F, 0x00, 0x00 },	/* 500   500      0.0   */ -	{ 0xC, 0x6F, 0x36, 0x00, 0x09 },	/* 500   700      2.9   */ -	{ 0x6, 0x7D, 0x32, 0x00, 0x0D },	/* 500   900      5.1   */ -	{ 0x6, 0x60, 0x3C, 0x00, 0x03 },	/* 650   700      0.6   */ -	{ 0x6, 0x7F, 0x34, 0x00, 0x0B },	/* 600   900      3.5   */ -	{ 0x6, 0x7F, 0x3F, 0x00, 0x00 },	/* 900   900      0.0   */ -}; - -/* - * Cloned the HOBL entry to comply with the voltage and pre-emphasis entries - * that DisplayPort specification requires - */ -static const struct cnl_ddi_buf_trans tgl_combo_phy_ddi_translations_edp_hbr2_hobl[] = { -						/* VS	pre-emp	*/ -	{ 0x6, 0x7F, 0x3F, 0x00, 0x00 },	/* 0	0	*/ -	{ 0x6, 0x7F, 0x3F, 0x00, 0x00 },	/* 0	1	*/ -	{ 0x6, 0x7F, 0x3F, 0x00, 0x00 },	/* 0	2	*/ -	{ 0x6, 0x7F, 0x3F, 0x00, 0x00 },	/* 0	3	*/ -	{ 0x6, 0x7F, 0x3F, 0x00, 0x00 },	/* 1	0	*/ -	{ 0x6, 0x7F, 0x3F, 0x00, 0x00 },	/* 1	1	*/ -	{ 0x6, 0x7F, 0x3F, 0x00, 0x00 },	/* 1	2	*/ -	{ 0x6, 0x7F, 0x3F, 0x00, 0x00 },	/* 2	0	*/ -	{ 0x6, 0x7F, 0x3F, 0x00, 0x00 },	/* 2	1	*/ -}; - -static const struct cnl_ddi_buf_trans rkl_combo_phy_ddi_translations_dp_hbr[] = { -						/* NT mV Trans mV db    */ -	{ 0xA, 0x2F, 0x3F, 0x00, 0x00 },	/* 350   350      0.0   */ -	{ 0xA, 0x4F, 0x37, 0x00, 0x08 },	/* 350   500      3.1   */ -	{ 0xC, 0x63, 0x2F, 0x00, 0x10 },	/* 350   700      6.0   */ -	{ 0x6, 0x7D, 0x2A, 0x00, 0x15 },	/* 350   900      8.2   */ -	{ 0xA, 0x4C, 0x3F, 0x00, 0x00 },	/* 500   500      0.0   */ -	{ 0xC, 0x73, 0x34, 0x00, 0x0B },	/* 500   700      2.9   */ -	{ 0x6, 0x7F, 0x2F, 0x00, 0x10 },	/* 500   900      5.1   */ -	{ 0xC, 0x6E, 0x3E, 0x00, 0x01 },	/* 650   700      0.6   */ -	{ 0x6, 0x7F, 0x35, 0x00, 0x0A },	/* 600   900      3.5   */ -	{ 0x6, 0x7F, 0x3F, 0x00, 0x00 },	/* 900   900      0.0   */ -}; - -static const struct cnl_ddi_buf_trans rkl_combo_phy_ddi_translations_dp_hbr2_hbr3[] = { -						/* NT mV Trans mV db    */ -	{ 0xA, 0x35, 0x3F, 0x00, 0x00 },	/* 350   350      0.0   */ -	{ 0xA, 0x50, 0x38, 0x00, 0x07 },	/* 350   500      3.1   */ -	{ 0xC, 0x61, 0x33, 0x00, 0x0C },	/* 350   700      6.0   */ -	{ 0x6, 0x7F, 0x2E, 0x00, 0x11 },	/* 350   900      8.2   */ -	{ 0xA, 0x47, 0x3F, 0x00, 0x00 },	/* 500   500      0.0   */ -	{ 0xC, 0x5F, 0x38, 0x00, 0x07 },	/* 500   700      2.9   */ -	{ 0x6, 0x7F, 0x2F, 0x00, 0x10 },	/* 500   900      5.1   */ -	{ 0xC, 0x5F, 0x3F, 0x00, 0x00 },	/* 650   700      0.6   */ -	{ 0x6, 0x7E, 0x36, 0x00, 0x09 },	/* 600   900      3.5   */ -	{ 0x6, 0x7F, 0x3F, 0x00, 0x00 },	/* 900   900      0.0   */ -}; - -static bool is_hobl_buf_trans(const struct cnl_ddi_buf_trans *table) -{ -	return table == tgl_combo_phy_ddi_translations_edp_hbr2_hobl; -} - -static const struct ddi_buf_trans * -bdw_get_buf_trans_edp(struct intel_encoder *encoder, int *n_entries) -{ -	struct drm_i915_private *dev_priv = to_i915(encoder->base.dev); - -	if (dev_priv->vbt.edp.low_vswing) { -		*n_entries = ARRAY_SIZE(bdw_ddi_translations_edp); -		return bdw_ddi_translations_edp; -	} else { -		*n_entries = ARRAY_SIZE(bdw_ddi_translations_dp); -		return bdw_ddi_translations_dp; -	} -} - -static const struct ddi_buf_trans * -skl_get_buf_trans_dp(struct intel_encoder *encoder, int *n_entries) -{ -	struct drm_i915_private *dev_priv = to_i915(encoder->base.dev); - -	if (IS_SKL_ULX(dev_priv)) { -		*n_entries = ARRAY_SIZE(skl_y_ddi_translations_dp); -		return skl_y_ddi_translations_dp; -	} else if (IS_SKL_ULT(dev_priv)) { -		*n_entries = ARRAY_SIZE(skl_u_ddi_translations_dp); -		return skl_u_ddi_translations_dp; -	} else { -		*n_entries = ARRAY_SIZE(skl_ddi_translations_dp); -		return skl_ddi_translations_dp; -	} -} - -static const struct ddi_buf_trans * -kbl_get_buf_trans_dp(struct intel_encoder *encoder, int *n_entries) -{ -	struct drm_i915_private *dev_priv = to_i915(encoder->base.dev); - -	if (IS_KBL_ULX(dev_priv) || -	    IS_CFL_ULX(dev_priv) || -	    IS_CML_ULX(dev_priv)) { -		*n_entries = ARRAY_SIZE(kbl_y_ddi_translations_dp); -		return kbl_y_ddi_translations_dp; -	} else if (IS_KBL_ULT(dev_priv) || -		   IS_CFL_ULT(dev_priv) || -		   IS_CML_ULT(dev_priv)) { -		*n_entries = ARRAY_SIZE(kbl_u_ddi_translations_dp); -		return kbl_u_ddi_translations_dp; -	} else { -		*n_entries = ARRAY_SIZE(kbl_ddi_translations_dp); -		return kbl_ddi_translations_dp; -	} -} - -static const struct ddi_buf_trans * -skl_get_buf_trans_edp(struct intel_encoder *encoder, int *n_entries) -{ -	struct drm_i915_private *dev_priv = to_i915(encoder->base.dev); - -	if (dev_priv->vbt.edp.low_vswing) { -		if (IS_SKL_ULX(dev_priv) || -		    IS_KBL_ULX(dev_priv) || -		    IS_CFL_ULX(dev_priv) || -		    IS_CML_ULX(dev_priv)) { -			*n_entries = ARRAY_SIZE(skl_y_ddi_translations_edp); -			return skl_y_ddi_translations_edp; -		} else if (IS_SKL_ULT(dev_priv) || -			   IS_KBL_ULT(dev_priv) || -			   IS_CFL_ULT(dev_priv) || -			   IS_CML_ULT(dev_priv)) { -			*n_entries = ARRAY_SIZE(skl_u_ddi_translations_edp); -			return skl_u_ddi_translations_edp; -		} else { -			*n_entries = ARRAY_SIZE(skl_ddi_translations_edp); -			return skl_ddi_translations_edp; -		} -	} - -	if (IS_KABYLAKE(dev_priv) || -	    IS_COFFEELAKE(dev_priv) || -	    IS_COMETLAKE(dev_priv)) -		return kbl_get_buf_trans_dp(encoder, n_entries); -	else -		return skl_get_buf_trans_dp(encoder, n_entries); -} - -static const struct ddi_buf_trans * -skl_get_buf_trans_hdmi(struct drm_i915_private *dev_priv, int *n_entries) -{ -	if (IS_SKL_ULX(dev_priv) || -	    IS_KBL_ULX(dev_priv) || -	    IS_CFL_ULX(dev_priv) || -	    IS_CML_ULX(dev_priv)) { -		*n_entries = ARRAY_SIZE(skl_y_ddi_translations_hdmi); -		return skl_y_ddi_translations_hdmi; -	} else { -		*n_entries = ARRAY_SIZE(skl_ddi_translations_hdmi); -		return skl_ddi_translations_hdmi; -	} -} - -static int skl_buf_trans_num_entries(enum port port, int n_entries) -{ -	/* Only DDIA and DDIE can select the 10th register with DP */ -	if (port == PORT_A || port == PORT_E) -		return min(n_entries, 10); -	else -		return min(n_entries, 9); -} - -static const struct ddi_buf_trans * -intel_ddi_get_buf_trans_dp(struct intel_encoder *encoder, int *n_entries) -{ -	struct drm_i915_private *dev_priv = to_i915(encoder->base.dev); - -	if (IS_KABYLAKE(dev_priv) || -	    IS_COFFEELAKE(dev_priv) || -	    IS_COMETLAKE(dev_priv)) { -		const struct ddi_buf_trans *ddi_translations = -			kbl_get_buf_trans_dp(encoder, n_entries); -		*n_entries = skl_buf_trans_num_entries(encoder->port, *n_entries); -		return ddi_translations; -	} else if (IS_SKYLAKE(dev_priv)) { -		const struct ddi_buf_trans *ddi_translations = -			skl_get_buf_trans_dp(encoder, n_entries); -		*n_entries = skl_buf_trans_num_entries(encoder->port, *n_entries); -		return ddi_translations; -	} else if (IS_BROADWELL(dev_priv)) { -		*n_entries = ARRAY_SIZE(bdw_ddi_translations_dp); -		return  bdw_ddi_translations_dp; -	} else if (IS_HASWELL(dev_priv)) { -		*n_entries = ARRAY_SIZE(hsw_ddi_translations_dp); -		return hsw_ddi_translations_dp; -	} - -	*n_entries = 0; -	return NULL; -} - -static const struct ddi_buf_trans * -intel_ddi_get_buf_trans_edp(struct intel_encoder *encoder, int *n_entries) -{ -	struct drm_i915_private *dev_priv = to_i915(encoder->base.dev); - -	if (IS_GEN9_BC(dev_priv)) { -		const struct ddi_buf_trans *ddi_translations = -			skl_get_buf_trans_edp(encoder, n_entries); -		*n_entries = skl_buf_trans_num_entries(encoder->port, *n_entries); -		return ddi_translations; -	} else if (IS_BROADWELL(dev_priv)) { -		return bdw_get_buf_trans_edp(encoder, n_entries); -	} else if (IS_HASWELL(dev_priv)) { -		*n_entries = ARRAY_SIZE(hsw_ddi_translations_dp); -		return hsw_ddi_translations_dp; -	} - -	*n_entries = 0; -	return NULL; -} - -static const struct ddi_buf_trans * -intel_ddi_get_buf_trans_fdi(struct drm_i915_private *dev_priv, -			    int *n_entries) -{ -	if (IS_BROADWELL(dev_priv)) { -		*n_entries = ARRAY_SIZE(bdw_ddi_translations_fdi); -		return bdw_ddi_translations_fdi; -	} else if (IS_HASWELL(dev_priv)) { -		*n_entries = ARRAY_SIZE(hsw_ddi_translations_fdi); -		return hsw_ddi_translations_fdi; -	} - -	*n_entries = 0; -	return NULL; -} - -static const struct ddi_buf_trans * -intel_ddi_get_buf_trans_hdmi(struct intel_encoder *encoder, -			     int *n_entries) -{ -	struct drm_i915_private *dev_priv = to_i915(encoder->base.dev); - -	if (IS_GEN9_BC(dev_priv)) { -		return skl_get_buf_trans_hdmi(dev_priv, n_entries); -	} else if (IS_BROADWELL(dev_priv)) { -		*n_entries = ARRAY_SIZE(bdw_ddi_translations_hdmi); -		return bdw_ddi_translations_hdmi; -	} else if (IS_HASWELL(dev_priv)) { -		*n_entries = ARRAY_SIZE(hsw_ddi_translations_hdmi); -		return hsw_ddi_translations_hdmi; -	} - -	*n_entries = 0; -	return NULL; -} - -static const struct bxt_ddi_buf_trans * -bxt_get_buf_trans_dp(struct intel_encoder *encoder, int *n_entries) -{ -	*n_entries = ARRAY_SIZE(bxt_ddi_translations_dp); -	return bxt_ddi_translations_dp; -} - -static const struct bxt_ddi_buf_trans * -bxt_get_buf_trans_edp(struct intel_encoder *encoder, int *n_entries) -{ -	struct drm_i915_private *dev_priv = to_i915(encoder->base.dev); - -	if (dev_priv->vbt.edp.low_vswing) { -		*n_entries = ARRAY_SIZE(bxt_ddi_translations_edp); -		return bxt_ddi_translations_edp; -	} - -	return bxt_get_buf_trans_dp(encoder, n_entries); -} - -static const struct bxt_ddi_buf_trans * -bxt_get_buf_trans_hdmi(struct intel_encoder *encoder, int *n_entries) -{ -	*n_entries = ARRAY_SIZE(bxt_ddi_translations_hdmi); -	return bxt_ddi_translations_hdmi; -} - -static const struct cnl_ddi_buf_trans * -cnl_get_buf_trans_hdmi(struct intel_encoder *encoder, int *n_entries) -{ -	struct drm_i915_private *dev_priv = to_i915(encoder->base.dev); -	u32 voltage = intel_de_read(dev_priv, CNL_PORT_COMP_DW3) & VOLTAGE_INFO_MASK; - -	if (voltage == VOLTAGE_INFO_0_85V) { -		*n_entries = ARRAY_SIZE(cnl_ddi_translations_hdmi_0_85V); -		return cnl_ddi_translations_hdmi_0_85V; -	} else if (voltage == VOLTAGE_INFO_0_95V) { -		*n_entries = ARRAY_SIZE(cnl_ddi_translations_hdmi_0_95V); -		return cnl_ddi_translations_hdmi_0_95V; -	} else if (voltage == VOLTAGE_INFO_1_05V) { -		*n_entries = ARRAY_SIZE(cnl_ddi_translations_hdmi_1_05V); -		return cnl_ddi_translations_hdmi_1_05V; -	} else { -		*n_entries = 1; /* shut up gcc */ -		MISSING_CASE(voltage); -	} -	return NULL; -} - -static const struct cnl_ddi_buf_trans * -cnl_get_buf_trans_dp(struct intel_encoder *encoder, int *n_entries) -{ -	struct drm_i915_private *dev_priv = to_i915(encoder->base.dev); -	u32 voltage = intel_de_read(dev_priv, CNL_PORT_COMP_DW3) & VOLTAGE_INFO_MASK; - -	if (voltage == VOLTAGE_INFO_0_85V) { -		*n_entries = ARRAY_SIZE(cnl_ddi_translations_dp_0_85V); -		return cnl_ddi_translations_dp_0_85V; -	} else if (voltage == VOLTAGE_INFO_0_95V) { -		*n_entries = ARRAY_SIZE(cnl_ddi_translations_dp_0_95V); -		return cnl_ddi_translations_dp_0_95V; -	} else if (voltage == VOLTAGE_INFO_1_05V) { -		*n_entries = ARRAY_SIZE(cnl_ddi_translations_dp_1_05V); -		return cnl_ddi_translations_dp_1_05V; -	} else { -		*n_entries = 1; /* shut up gcc */ -		MISSING_CASE(voltage); -	} -	return NULL; -} - -static const struct cnl_ddi_buf_trans * -cnl_get_buf_trans_edp(struct intel_encoder *encoder, int *n_entries) -{ -	struct drm_i915_private *dev_priv = to_i915(encoder->base.dev); -	u32 voltage = intel_de_read(dev_priv, CNL_PORT_COMP_DW3) & VOLTAGE_INFO_MASK; - -	if (dev_priv->vbt.edp.low_vswing) { -		if (voltage == VOLTAGE_INFO_0_85V) { -			*n_entries = ARRAY_SIZE(cnl_ddi_translations_edp_0_85V); -			return cnl_ddi_translations_edp_0_85V; -		} else if (voltage == VOLTAGE_INFO_0_95V) { -			*n_entries = ARRAY_SIZE(cnl_ddi_translations_edp_0_95V); -			return cnl_ddi_translations_edp_0_95V; -		} else if (voltage == VOLTAGE_INFO_1_05V) { -			*n_entries = ARRAY_SIZE(cnl_ddi_translations_edp_1_05V); -			return cnl_ddi_translations_edp_1_05V; -		} else { -			*n_entries = 1; /* shut up gcc */ -			MISSING_CASE(voltage); -		} -		return NULL; -	} else { -		return cnl_get_buf_trans_dp(encoder, n_entries); -	} -} - -static const struct cnl_ddi_buf_trans * -icl_get_combo_buf_trans_hdmi(struct intel_encoder *encoder, -			     const struct intel_crtc_state *crtc_state, -			     int *n_entries) -{ -	*n_entries = ARRAY_SIZE(icl_combo_phy_ddi_translations_hdmi); -	return icl_combo_phy_ddi_translations_hdmi; -} - -static const struct cnl_ddi_buf_trans * -icl_get_combo_buf_trans_dp(struct intel_encoder *encoder, -			   const struct intel_crtc_state *crtc_state, -			   int *n_entries) -{ -	*n_entries = ARRAY_SIZE(icl_combo_phy_ddi_translations_dp_hbr2); -	return icl_combo_phy_ddi_translations_dp_hbr2; -} - -static const struct cnl_ddi_buf_trans * -icl_get_combo_buf_trans_edp(struct intel_encoder *encoder, -			    const struct intel_crtc_state *crtc_state, -			    int *n_entries) -{ -	struct drm_i915_private *dev_priv = to_i915(encoder->base.dev); - -	if (crtc_state->port_clock > 540000) { -		*n_entries = ARRAY_SIZE(icl_combo_phy_ddi_translations_edp_hbr3); -		return icl_combo_phy_ddi_translations_edp_hbr3; -	} else if (dev_priv->vbt.edp.low_vswing) { -		*n_entries = ARRAY_SIZE(icl_combo_phy_ddi_translations_edp_hbr2); -		return icl_combo_phy_ddi_translations_edp_hbr2; -	} else if (IS_DG1(dev_priv) && crtc_state->port_clock > 270000) { -		*n_entries = ARRAY_SIZE(dg1_combo_phy_ddi_translations_dp_hbr2_hbr3); -		return dg1_combo_phy_ddi_translations_dp_hbr2_hbr3; -	} else if (IS_DG1(dev_priv)) { -		*n_entries = ARRAY_SIZE(dg1_combo_phy_ddi_translations_dp_rbr_hbr); -		return dg1_combo_phy_ddi_translations_dp_rbr_hbr; -	} - -	return icl_get_combo_buf_trans_dp(encoder, crtc_state, n_entries); -} - -static const struct cnl_ddi_buf_trans * -icl_get_combo_buf_trans(struct intel_encoder *encoder, -			const struct intel_crtc_state *crtc_state, -			int *n_entries) -{ -	if (intel_crtc_has_type(crtc_state, INTEL_OUTPUT_HDMI)) -		return icl_get_combo_buf_trans_hdmi(encoder, crtc_state, n_entries); -	else if (intel_crtc_has_type(crtc_state, INTEL_OUTPUT_EDP)) -		return icl_get_combo_buf_trans_edp(encoder, crtc_state, n_entries); -	else -		return icl_get_combo_buf_trans_dp(encoder, crtc_state, n_entries); -} - -static const struct icl_mg_phy_ddi_buf_trans * -icl_get_mg_buf_trans_hdmi(struct intel_encoder *encoder, -			  const struct intel_crtc_state *crtc_state, -			  int *n_entries) -{ -	*n_entries = ARRAY_SIZE(icl_mg_phy_ddi_translations_hdmi); -	return icl_mg_phy_ddi_translations_hdmi; -} - -static const struct icl_mg_phy_ddi_buf_trans * -icl_get_mg_buf_trans_dp(struct intel_encoder *encoder, -			const struct intel_crtc_state *crtc_state, -			int *n_entries) -{ -	if (crtc_state->port_clock > 270000) { -		*n_entries = ARRAY_SIZE(icl_mg_phy_ddi_translations_hbr2_hbr3); -		return icl_mg_phy_ddi_translations_hbr2_hbr3; -	} else { -		*n_entries = ARRAY_SIZE(icl_mg_phy_ddi_translations_rbr_hbr); -		return icl_mg_phy_ddi_translations_rbr_hbr; -	} -} - -static const struct icl_mg_phy_ddi_buf_trans * -icl_get_mg_buf_trans(struct intel_encoder *encoder, -		     const struct intel_crtc_state *crtc_state, -		     int *n_entries) -{ -	if (intel_crtc_has_type(crtc_state, INTEL_OUTPUT_HDMI)) -		return icl_get_mg_buf_trans_hdmi(encoder, crtc_state, n_entries); -	else -		return icl_get_mg_buf_trans_dp(encoder, crtc_state, n_entries); -} - -static const struct cnl_ddi_buf_trans * -ehl_get_combo_buf_trans_hdmi(struct intel_encoder *encoder, -			     const struct intel_crtc_state *crtc_state, -			     int *n_entries) -{ -	*n_entries = ARRAY_SIZE(icl_combo_phy_ddi_translations_hdmi); -	return icl_combo_phy_ddi_translations_hdmi; -} - -static const struct cnl_ddi_buf_trans * -ehl_get_combo_buf_trans_dp(struct intel_encoder *encoder, -			   const struct intel_crtc_state *crtc_state, -			   int *n_entries) -{ -	*n_entries = ARRAY_SIZE(ehl_combo_phy_ddi_translations_dp); -	return ehl_combo_phy_ddi_translations_dp; -} - -static const struct cnl_ddi_buf_trans * -ehl_get_combo_buf_trans_edp(struct intel_encoder *encoder, -			    const struct intel_crtc_state *crtc_state, -			    int *n_entries) -{ -	struct drm_i915_private *dev_priv = to_i915(encoder->base.dev); - -	if (dev_priv->vbt.edp.low_vswing) { -		*n_entries = ARRAY_SIZE(icl_combo_phy_ddi_translations_edp_hbr2); -		return icl_combo_phy_ddi_translations_edp_hbr2; -	} - -	return ehl_get_combo_buf_trans_dp(encoder, crtc_state, n_entries); -} - -static const struct cnl_ddi_buf_trans * -ehl_get_combo_buf_trans(struct intel_encoder *encoder, -			const struct intel_crtc_state *crtc_state, -			int *n_entries) -{ -	if (intel_crtc_has_type(crtc_state, INTEL_OUTPUT_HDMI)) -		return ehl_get_combo_buf_trans_hdmi(encoder, crtc_state, n_entries); -	else if (intel_crtc_has_type(crtc_state, INTEL_OUTPUT_EDP)) -		return ehl_get_combo_buf_trans_edp(encoder, crtc_state, n_entries); -	else -		return ehl_get_combo_buf_trans_dp(encoder, crtc_state, n_entries); -} - -static const struct cnl_ddi_buf_trans * -jsl_get_combo_buf_trans_hdmi(struct intel_encoder *encoder, -			     const struct intel_crtc_state *crtc_state, -			     int *n_entries) -{ -	*n_entries = ARRAY_SIZE(icl_combo_phy_ddi_translations_hdmi); -	return icl_combo_phy_ddi_translations_hdmi; -} - -static const struct cnl_ddi_buf_trans * -jsl_get_combo_buf_trans_dp(struct intel_encoder *encoder, -			   const struct intel_crtc_state *crtc_state, -			   int *n_entries) -{ -	*n_entries = ARRAY_SIZE(icl_combo_phy_ddi_translations_dp_hbr2); -	return icl_combo_phy_ddi_translations_dp_hbr2; -} - -static const struct cnl_ddi_buf_trans * -jsl_get_combo_buf_trans_edp(struct intel_encoder *encoder, -			    const struct intel_crtc_state *crtc_state, -			    int *n_entries) -{ -	struct drm_i915_private *dev_priv = to_i915(encoder->base.dev); - -	if (dev_priv->vbt.edp.low_vswing) { -		if (crtc_state->port_clock > 270000) { -			*n_entries = ARRAY_SIZE(jsl_combo_phy_ddi_translations_edp_hbr2); -			return jsl_combo_phy_ddi_translations_edp_hbr2; -		} else { -			*n_entries = ARRAY_SIZE(jsl_combo_phy_ddi_translations_edp_hbr); -			return jsl_combo_phy_ddi_translations_edp_hbr; -		} -	} - -	return jsl_get_combo_buf_trans_dp(encoder, crtc_state, n_entries); -} - -static const struct cnl_ddi_buf_trans * -jsl_get_combo_buf_trans(struct intel_encoder *encoder, -			const struct intel_crtc_state *crtc_state, -			int *n_entries) -{ -	if (intel_crtc_has_type(crtc_state, INTEL_OUTPUT_HDMI)) -		return jsl_get_combo_buf_trans_hdmi(encoder, crtc_state, n_entries); -	else if (intel_crtc_has_type(crtc_state, INTEL_OUTPUT_EDP)) -		return jsl_get_combo_buf_trans_edp(encoder, crtc_state, n_entries); -	else -		return jsl_get_combo_buf_trans_dp(encoder, crtc_state, n_entries); -} - -static const struct cnl_ddi_buf_trans * -tgl_get_combo_buf_trans_hdmi(struct intel_encoder *encoder, -			     const struct intel_crtc_state *crtc_state, -			     int *n_entries) -{ -	*n_entries = ARRAY_SIZE(icl_combo_phy_ddi_translations_hdmi); -	return icl_combo_phy_ddi_translations_hdmi; -} - -static const struct cnl_ddi_buf_trans * -tgl_get_combo_buf_trans_dp(struct intel_encoder *encoder, -			   const struct intel_crtc_state *crtc_state, -			   int *n_entries) -{ -	struct drm_i915_private *dev_priv = to_i915(encoder->base.dev); - -	if (crtc_state->port_clock > 270000) { -		if (IS_ROCKETLAKE(dev_priv)) { -			*n_entries = ARRAY_SIZE(rkl_combo_phy_ddi_translations_dp_hbr2_hbr3); -			return rkl_combo_phy_ddi_translations_dp_hbr2_hbr3; -		} else if (IS_TGL_U(dev_priv) || IS_TGL_Y(dev_priv)) { -			*n_entries = ARRAY_SIZE(tgl_uy_combo_phy_ddi_translations_dp_hbr2); -			return tgl_uy_combo_phy_ddi_translations_dp_hbr2; -		} else { -			*n_entries = ARRAY_SIZE(tgl_combo_phy_ddi_translations_dp_hbr2); -			return tgl_combo_phy_ddi_translations_dp_hbr2; -		} -	} else { -		if (IS_ROCKETLAKE(dev_priv)) { -			*n_entries = ARRAY_SIZE(rkl_combo_phy_ddi_translations_dp_hbr); -			return rkl_combo_phy_ddi_translations_dp_hbr; -		} else { -			*n_entries = ARRAY_SIZE(tgl_combo_phy_ddi_translations_dp_hbr); -			return tgl_combo_phy_ddi_translations_dp_hbr; -		} -	} -} - -static const struct cnl_ddi_buf_trans * -tgl_get_combo_buf_trans_edp(struct intel_encoder *encoder, -			    const struct intel_crtc_state *crtc_state, -			    int *n_entries) -{ -	struct drm_i915_private *dev_priv = to_i915(encoder->base.dev); -	struct intel_dp *intel_dp = enc_to_intel_dp(encoder); - -	if (crtc_state->port_clock > 540000) { -		*n_entries = ARRAY_SIZE(icl_combo_phy_ddi_translations_edp_hbr3); -		return icl_combo_phy_ddi_translations_edp_hbr3; -	} else if (dev_priv->vbt.edp.hobl && !intel_dp->hobl_failed) { -		*n_entries = ARRAY_SIZE(tgl_combo_phy_ddi_translations_edp_hbr2_hobl); -		return tgl_combo_phy_ddi_translations_edp_hbr2_hobl; -	} else if (dev_priv->vbt.edp.low_vswing) { -		*n_entries = ARRAY_SIZE(icl_combo_phy_ddi_translations_edp_hbr2); -		return icl_combo_phy_ddi_translations_edp_hbr2; -	} - -	return tgl_get_combo_buf_trans_dp(encoder, crtc_state, n_entries); -} - -static const struct cnl_ddi_buf_trans * -tgl_get_combo_buf_trans(struct intel_encoder *encoder, -			const struct intel_crtc_state *crtc_state, -			int *n_entries) -{ -	if (intel_crtc_has_type(crtc_state, INTEL_OUTPUT_HDMI)) -		return tgl_get_combo_buf_trans_hdmi(encoder, crtc_state, n_entries); -	else if (intel_crtc_has_type(crtc_state, INTEL_OUTPUT_EDP)) -		return tgl_get_combo_buf_trans_edp(encoder, crtc_state, n_entries); -	else -		return tgl_get_combo_buf_trans_dp(encoder, crtc_state, n_entries); -} - -static const struct tgl_dkl_phy_ddi_buf_trans * -tgl_get_dkl_buf_trans_hdmi(struct intel_encoder *encoder, -			   const struct intel_crtc_state *crtc_state, -			   int *n_entries) -{ -	*n_entries = ARRAY_SIZE(tgl_dkl_phy_hdmi_ddi_trans); -	return tgl_dkl_phy_hdmi_ddi_trans; -} - -static const struct tgl_dkl_phy_ddi_buf_trans * -tgl_get_dkl_buf_trans_dp(struct intel_encoder *encoder, -			 const struct intel_crtc_state *crtc_state, -			 int *n_entries) -{ -	if (crtc_state->port_clock > 270000) { -		*n_entries = ARRAY_SIZE(tgl_dkl_phy_dp_ddi_trans_hbr2); -		return tgl_dkl_phy_dp_ddi_trans_hbr2; -	} else { -		*n_entries = ARRAY_SIZE(tgl_dkl_phy_dp_ddi_trans); -		return tgl_dkl_phy_dp_ddi_trans; -	} -} - -static const struct tgl_dkl_phy_ddi_buf_trans * -tgl_get_dkl_buf_trans(struct intel_encoder *encoder, -		      const struct intel_crtc_state *crtc_state, -		      int *n_entries) -{ -	if (intel_crtc_has_type(crtc_state, INTEL_OUTPUT_HDMI)) -		return tgl_get_dkl_buf_trans_hdmi(encoder, crtc_state, n_entries); -	else -		return tgl_get_dkl_buf_trans_dp(encoder, crtc_state, n_entries); -} -  static int intel_ddi_hdmi_level(struct intel_encoder *encoder,  				const struct intel_crtc_state *crtc_state)  {  	struct drm_i915_private *dev_priv = to_i915(encoder->base.dev);  	int n_entries, level, default_entry; -	enum phy phy = intel_port_to_phy(dev_priv, encoder->port); -	if (INTEL_GEN(dev_priv) >= 12) { -		if (intel_phy_is_combo(dev_priv, phy)) -			tgl_get_combo_buf_trans_hdmi(encoder, crtc_state, &n_entries); -		else -			tgl_get_dkl_buf_trans_hdmi(encoder, crtc_state, &n_entries); -		default_entry = n_entries - 1; -	} else if (INTEL_GEN(dev_priv) == 11) { -		if (intel_phy_is_combo(dev_priv, phy)) -			icl_get_combo_buf_trans_hdmi(encoder, crtc_state, &n_entries); -		else -			icl_get_mg_buf_trans_hdmi(encoder, crtc_state, &n_entries); -		default_entry = n_entries - 1; -	} else if (IS_CANNONLAKE(dev_priv)) { -		cnl_get_buf_trans_hdmi(encoder, &n_entries); -		default_entry = n_entries - 1; -	} else if (IS_GEN9_LP(dev_priv)) { -		bxt_get_buf_trans_hdmi(encoder, &n_entries); -		default_entry = n_entries - 1; -	} else if (IS_GEN9_BC(dev_priv)) { -		intel_ddi_get_buf_trans_hdmi(encoder, &n_entries); -		default_entry = 8; -	} else if (IS_BROADWELL(dev_priv)) { -		intel_ddi_get_buf_trans_hdmi(encoder, &n_entries); -		default_entry = 7; -	} else if (IS_HASWELL(dev_priv)) { -		intel_ddi_get_buf_trans_hdmi(encoder, &n_entries); -		default_entry = 6; -	} else { -		drm_WARN(&dev_priv->drm, 1, "ddi translation table missing\n"); +	n_entries = intel_ddi_hdmi_num_entries(encoder, crtc_state, &default_entry); +	if (n_entries == 0)  		return 0; -	} - -	if (drm_WARN_ON_ONCE(&dev_priv->drm, n_entries == 0)) -		return 0; -  	level = intel_bios_hdmi_level_shift(encoder);  	if (level < 0)  		level = default_entry; @@ -1470,8 +93,8 @@ static int intel_ddi_hdmi_level(struct intel_encoder *encoder,   * values in advance. This function programs the correct values for   * DP/eDP/FDI use cases.   */ -static void intel_prepare_dp_ddi_buffers(struct intel_encoder *encoder, -					 const struct intel_crtc_state *crtc_state) +void intel_prepare_dp_ddi_buffers(struct intel_encoder *encoder, +				  const struct intel_crtc_state *crtc_state)  {  	struct drm_i915_private *dev_priv = to_i915(encoder->base.dev);  	u32 iboost_bit = 0; @@ -1490,7 +113,7 @@ static void intel_prepare_dp_ddi_buffers(struct intel_encoder *encoder,  							      &n_entries);  	/* If we're boosting the current, set bit 31 of trans1 */ -	if (IS_GEN9_BC(dev_priv) && intel_bios_dp_boost_level(encoder)) +	if (IS_GEN9_BC(dev_priv) && intel_bios_encoder_dp_boost_level(encoder->devdata))  		iboost_bit = DDI_BUF_BALANCE_LEG_ENABLE;  	for (i = 0; i < n_entries; i++) { @@ -1523,7 +146,7 @@ static void intel_prepare_hdmi_ddi_buffers(struct intel_encoder *encoder,  		level = n_entries - 1;  	/* If we're boosting the current, set bit 31 of trans1 */ -	if (IS_GEN9_BC(dev_priv) && intel_bios_hdmi_boost_level(encoder)) +	if (IS_GEN9_BC(dev_priv) && intel_bios_encoder_hdmi_boost_level(encoder->devdata))  		iboost_bit = DDI_BUF_BALANCE_LEG_ENABLE;  	/* Entry 9 is for HDMI: */ @@ -1533,8 +156,8 @@ static void intel_prepare_hdmi_ddi_buffers(struct intel_encoder *encoder,  		       ddi_translations[level].trans2);  } -static void intel_wait_ddi_buf_idle(struct drm_i915_private *dev_priv, -				    enum port port) +void intel_wait_ddi_buf_idle(struct drm_i915_private *dev_priv, +			     enum port port)  {  	if (IS_BROXTON(dev_priv)) {  		udelay(16); @@ -1551,7 +174,7 @@ static void intel_wait_ddi_buf_active(struct drm_i915_private *dev_priv,  				      enum port port)  {  	/* Wait > 518 usecs for DDI_BUF_CTL to be non idle */ -	if (INTEL_GEN(dev_priv) < 10 && !IS_GEMINILAKE(dev_priv)) { +	if (DISPLAY_VER(dev_priv) < 10 && !IS_GEMINILAKE(dev_priv)) {  		usleep_range(518, 1000);  		return;  	} @@ -1622,141 +245,6 @@ static u32 icl_pll_to_ddi_clk_sel(struct intel_encoder *encoder,  	}  } -/* Starting with Haswell, different DDI ports can work in FDI mode for - * connection to the PCH-located connectors. For this, it is necessary to train - * both the DDI port and PCH receiver for the desired DDI buffer settings. - * - * The recommended port to work in FDI mode is DDI E, which we use here. Also, - * please note that when FDI mode is active on DDI E, it shares 2 lines with - * DDI A (which is used for eDP) - */ - -void hsw_fdi_link_train(struct intel_encoder *encoder, -			const struct intel_crtc_state *crtc_state) -{ -	struct intel_crtc *crtc = to_intel_crtc(crtc_state->uapi.crtc); -	struct drm_i915_private *dev_priv = to_i915(crtc->base.dev); -	u32 temp, i, rx_ctl_val, ddi_pll_sel; - -	intel_prepare_dp_ddi_buffers(encoder, crtc_state); - -	/* Set the FDI_RX_MISC pwrdn lanes and the 2 workarounds listed at the -	 * mode set "sequence for CRT port" document: -	 * - TP1 to TP2 time with the default value -	 * - FDI delay to 90h -	 * -	 * WaFDIAutoLinkSetTimingOverrride:hsw -	 */ -	intel_de_write(dev_priv, FDI_RX_MISC(PIPE_A), -		       FDI_RX_PWRDN_LANE1_VAL(2) | FDI_RX_PWRDN_LANE0_VAL(2) | FDI_RX_TP1_TO_TP2_48 | FDI_RX_FDI_DELAY_90); - -	/* Enable the PCH Receiver FDI PLL */ -	rx_ctl_val = dev_priv->fdi_rx_config | FDI_RX_ENHANCE_FRAME_ENABLE | -		     FDI_RX_PLL_ENABLE | -		     FDI_DP_PORT_WIDTH(crtc_state->fdi_lanes); -	intel_de_write(dev_priv, FDI_RX_CTL(PIPE_A), rx_ctl_val); -	intel_de_posting_read(dev_priv, FDI_RX_CTL(PIPE_A)); -	udelay(220); - -	/* Switch from Rawclk to PCDclk */ -	rx_ctl_val |= FDI_PCDCLK; -	intel_de_write(dev_priv, FDI_RX_CTL(PIPE_A), rx_ctl_val); - -	/* Configure Port Clock Select */ -	ddi_pll_sel = hsw_pll_to_ddi_pll_sel(crtc_state->shared_dpll); -	intel_de_write(dev_priv, PORT_CLK_SEL(PORT_E), ddi_pll_sel); -	drm_WARN_ON(&dev_priv->drm, ddi_pll_sel != PORT_CLK_SEL_SPLL); - -	/* Start the training iterating through available voltages and emphasis, -	 * testing each value twice. */ -	for (i = 0; i < ARRAY_SIZE(hsw_ddi_translations_fdi) * 2; i++) { -		/* Configure DP_TP_CTL with auto-training */ -		intel_de_write(dev_priv, DP_TP_CTL(PORT_E), -			       DP_TP_CTL_FDI_AUTOTRAIN | -			       DP_TP_CTL_ENHANCED_FRAME_ENABLE | -			       DP_TP_CTL_LINK_TRAIN_PAT1 | -			       DP_TP_CTL_ENABLE); - -		/* Configure and enable DDI_BUF_CTL for DDI E with next voltage. -		 * DDI E does not support port reversal, the functionality is -		 * achieved on the PCH side in FDI_RX_CTL, so no need to set the -		 * port reversal bit */ -		intel_de_write(dev_priv, DDI_BUF_CTL(PORT_E), -			       DDI_BUF_CTL_ENABLE | ((crtc_state->fdi_lanes - 1) << 1) | DDI_BUF_TRANS_SELECT(i / 2)); -		intel_de_posting_read(dev_priv, DDI_BUF_CTL(PORT_E)); - -		udelay(600); - -		/* Program PCH FDI Receiver TU */ -		intel_de_write(dev_priv, FDI_RX_TUSIZE1(PIPE_A), TU_SIZE(64)); - -		/* Enable PCH FDI Receiver with auto-training */ -		rx_ctl_val |= FDI_RX_ENABLE | FDI_LINK_TRAIN_AUTO; -		intel_de_write(dev_priv, FDI_RX_CTL(PIPE_A), rx_ctl_val); -		intel_de_posting_read(dev_priv, FDI_RX_CTL(PIPE_A)); - -		/* Wait for FDI receiver lane calibration */ -		udelay(30); - -		/* Unset FDI_RX_MISC pwrdn lanes */ -		temp = intel_de_read(dev_priv, FDI_RX_MISC(PIPE_A)); -		temp &= ~(FDI_RX_PWRDN_LANE1_MASK | FDI_RX_PWRDN_LANE0_MASK); -		intel_de_write(dev_priv, FDI_RX_MISC(PIPE_A), temp); -		intel_de_posting_read(dev_priv, FDI_RX_MISC(PIPE_A)); - -		/* Wait for FDI auto training time */ -		udelay(5); - -		temp = intel_de_read(dev_priv, DP_TP_STATUS(PORT_E)); -		if (temp & DP_TP_STATUS_AUTOTRAIN_DONE) { -			drm_dbg_kms(&dev_priv->drm, -				    "FDI link training done on step %d\n", i); -			break; -		} - -		/* -		 * Leave things enabled even if we failed to train FDI. -		 * Results in less fireworks from the state checker. -		 */ -		if (i == ARRAY_SIZE(hsw_ddi_translations_fdi) * 2 - 1) { -			drm_err(&dev_priv->drm, "FDI link training failed!\n"); -			break; -		} - -		rx_ctl_val &= ~FDI_RX_ENABLE; -		intel_de_write(dev_priv, FDI_RX_CTL(PIPE_A), rx_ctl_val); -		intel_de_posting_read(dev_priv, FDI_RX_CTL(PIPE_A)); - -		temp = intel_de_read(dev_priv, DDI_BUF_CTL(PORT_E)); -		temp &= ~DDI_BUF_CTL_ENABLE; -		intel_de_write(dev_priv, DDI_BUF_CTL(PORT_E), temp); -		intel_de_posting_read(dev_priv, DDI_BUF_CTL(PORT_E)); - -		/* Disable DP_TP_CTL and FDI_RX_CTL and retry */ -		temp = intel_de_read(dev_priv, DP_TP_CTL(PORT_E)); -		temp &= ~(DP_TP_CTL_ENABLE | DP_TP_CTL_LINK_TRAIN_MASK); -		temp |= DP_TP_CTL_LINK_TRAIN_PAT1; -		intel_de_write(dev_priv, DP_TP_CTL(PORT_E), temp); -		intel_de_posting_read(dev_priv, DP_TP_CTL(PORT_E)); - -		intel_wait_ddi_buf_idle(dev_priv, PORT_E); - -		/* Reset FDI_RX_MISC pwrdn lanes */ -		temp = intel_de_read(dev_priv, FDI_RX_MISC(PIPE_A)); -		temp &= ~(FDI_RX_PWRDN_LANE1_MASK | FDI_RX_PWRDN_LANE0_MASK); -		temp |= FDI_RX_PWRDN_LANE1_VAL(2) | FDI_RX_PWRDN_LANE0_VAL(2); -		intel_de_write(dev_priv, FDI_RX_MISC(PIPE_A), temp); -		intel_de_posting_read(dev_priv, FDI_RX_MISC(PIPE_A)); -	} - -	/* Enable normal pixel sending for FDI */ -	intel_de_write(dev_priv, DP_TP_CTL(PORT_E), -		       DP_TP_CTL_FDI_AUTOTRAIN | -		       DP_TP_CTL_LINK_TRAIN_NORMAL | -		       DP_TP_CTL_ENHANCED_FRAME_ENABLE | -		       DP_TP_CTL_ENABLE); -} -  static void intel_ddi_init_dp_buf_reg(struct intel_encoder *encoder,  				      const struct intel_crtc_state *crtc_state)  { @@ -1815,25 +303,6 @@ static void ddi_dotclock_get(struct intel_crtc_state *pipe_config)  	pipe_config->hw.adjusted_mode.crtc_clock = dotclock;  } -static void intel_ddi_clock_get(struct intel_encoder *encoder, -				struct intel_crtc_state *pipe_config) -{ -	struct drm_i915_private *dev_priv = to_i915(encoder->base.dev); -	enum phy phy = intel_port_to_phy(dev_priv, encoder->port); - -	if (intel_phy_is_tc(dev_priv, phy) && -	    intel_get_shared_dpll_id(dev_priv, pipe_config->shared_dpll) == -	    DPLL_ID_ICL_TBTPLL) -		pipe_config->port_clock = icl_calc_tbt_pll_link(dev_priv, -								encoder->port); -	else -		pipe_config->port_clock = -			intel_dpll_get_freq(dev_priv, pipe_config->shared_dpll, -					    &pipe_config->dpll_hw_state); - -	ddi_dotclock_get(pipe_config); -} -  void intel_ddi_set_dp_msa(const struct intel_crtc_state *crtc_state,  			  const struct drm_connector_state *conn_state)  { @@ -1921,7 +390,7 @@ intel_ddi_transcoder_func_reg_val_get(struct intel_encoder *encoder,  	/* Enable TRANS_DDI_FUNC_CTL for the pipe to work in HDMI mode */  	temp = TRANS_DDI_FUNC_ENABLE; -	if (INTEL_GEN(dev_priv) >= 12) +	if (DISPLAY_VER(dev_priv) >= 12)  		temp |= TGL_TRANS_DDI_SELECT_PORT(port);  	else  		temp |= TRANS_DDI_SELECT_PORT(port); @@ -1989,7 +458,7 @@ intel_ddi_transcoder_func_reg_val_get(struct intel_encoder *encoder,  		temp |= TRANS_DDI_MODE_SELECT_DP_MST;  		temp |= DDI_PORT_WIDTH(crtc_state->lane_count); -		if (INTEL_GEN(dev_priv) >= 12) { +		if (DISPLAY_VER(dev_priv) >= 12) {  			enum transcoder master;  			master = crtc_state->mst_master_transcoder; @@ -2002,7 +471,7 @@ intel_ddi_transcoder_func_reg_val_get(struct intel_encoder *encoder,  		temp |= DDI_PORT_WIDTH(crtc_state->lane_count);  	} -	if (IS_GEN_RANGE(dev_priv, 8, 10) && +	if (IS_DISPLAY_RANGE(dev_priv, 8, 10) &&  	    crtc_state->master_transcoder != INVALID_TRANSCODER) {  		u8 master_select =  			bdw_trans_port_sync_master_select(crtc_state->master_transcoder); @@ -2021,7 +490,7 @@ void intel_ddi_enable_transcoder_func(struct intel_encoder *encoder,  	struct drm_i915_private *dev_priv = to_i915(crtc->base.dev);  	enum transcoder cpu_transcoder = crtc_state->cpu_transcoder; -	if (INTEL_GEN(dev_priv) >= 11) { +	if (DISPLAY_VER(dev_priv) >= 11) {  		enum transcoder master_transcoder = crtc_state->master_transcoder;  		u32 ctl2 = 0; @@ -2067,7 +536,7 @@ void intel_ddi_disable_transcoder_func(const struct intel_crtc_state *crtc_state  	enum transcoder cpu_transcoder = crtc_state->cpu_transcoder;  	u32 ctl; -	if (INTEL_GEN(dev_priv) >= 11) +	if (DISPLAY_VER(dev_priv) >= 11)  		intel_de_write(dev_priv,  			       TRANS_DDI_FUNC_CTL2(cpu_transcoder), 0); @@ -2077,11 +546,11 @@ void intel_ddi_disable_transcoder_func(const struct intel_crtc_state *crtc_state  	ctl &= ~TRANS_DDI_FUNC_ENABLE; -	if (IS_GEN_RANGE(dev_priv, 8, 10)) +	if (IS_DISPLAY_RANGE(dev_priv, 8, 10))  		ctl &= ~(TRANS_DDI_PORT_SYNC_ENABLE |  			 TRANS_DDI_PORT_SYNC_MASTER_SELECT_MASK); -	if (INTEL_GEN(dev_priv) >= 12) { +	if (DISPLAY_VER(dev_priv) >= 12) {  		if (!intel_dp_mst_is_master_trans(crtc_state)) {  			ctl &= ~(TGL_TRANS_DDI_PORT_MASK |  				 TRANS_DDI_MODE_SELECT_MASK); @@ -2245,7 +714,7 @@ static void intel_ddi_get_encoder_pipes(struct intel_encoder *encoder,  		if (!trans_wakeref)  			continue; -		if (INTEL_GEN(dev_priv) >= 12) { +		if (DISPLAY_VER(dev_priv) >= 12) {  			port_mask = TGL_TRANS_DDI_PORT_MASK;  			ddi_select = TGL_TRANS_DDI_SELECT_PORT(port);  		} else { @@ -2385,7 +854,7 @@ void intel_ddi_enable_pipe_clock(struct intel_encoder *encoder,  	enum transcoder cpu_transcoder = crtc_state->cpu_transcoder;  	if (cpu_transcoder != TRANSCODER_EDP) { -		if (INTEL_GEN(dev_priv) >= 12) +		if (DISPLAY_VER(dev_priv) >= 12)  			intel_de_write(dev_priv,  				       TRANS_CLK_SEL(cpu_transcoder),  				       TGL_TRANS_CLK_SEL_PORT(port)); @@ -2402,7 +871,7 @@ void intel_ddi_disable_pipe_clock(const struct intel_crtc_state *crtc_state)  	enum transcoder cpu_transcoder = crtc_state->cpu_transcoder;  	if (cpu_transcoder != TRANSCODER_EDP) { -		if (INTEL_GEN(dev_priv) >= 12) +		if (DISPLAY_VER(dev_priv) >= 12)  			intel_de_write(dev_priv,  				       TRANS_CLK_SEL(cpu_transcoder),  				       TGL_TRANS_CLK_SEL_DISABLED); @@ -2436,9 +905,9 @@ static void skl_ddi_set_iboost(struct intel_encoder *encoder,  	u8 iboost;  	if (intel_crtc_has_type(crtc_state, INTEL_OUTPUT_HDMI)) -		iboost = intel_bios_hdmi_boost_level(encoder); +		iboost = intel_bios_encoder_hdmi_boost_level(encoder->devdata);  	else -		iboost = intel_bios_dp_boost_level(encoder); +		iboost = intel_bios_encoder_dp_boost_level(encoder->devdata);  	if (iboost == 0) {  		const struct ddi_buf_trans *ddi_translations; @@ -2480,13 +949,7 @@ static void bxt_ddi_vswing_sequence(struct intel_encoder *encoder,  	enum port port = encoder->port;  	int n_entries; -	if (intel_crtc_has_type(crtc_state, INTEL_OUTPUT_HDMI)) -		ddi_translations = bxt_get_buf_trans_hdmi(encoder, &n_entries); -	else if (intel_crtc_has_type(crtc_state, INTEL_OUTPUT_EDP)) -		ddi_translations = bxt_get_buf_trans_edp(encoder, &n_entries); -	else -		ddi_translations = bxt_get_buf_trans_dp(encoder, &n_entries); - +	ddi_translations = bxt_get_buf_trans(encoder, crtc_state, &n_entries);  	if (drm_WARN_ON_ONCE(&dev_priv->drm, !ddi_translations))  		return;  	if (drm_WARN_ON_ONCE(&dev_priv->drm, level >= n_entries)) @@ -2508,12 +971,12 @@ static u8 intel_ddi_dp_voltage_max(struct intel_dp *intel_dp,  	enum phy phy = intel_port_to_phy(dev_priv, port);  	int n_entries; -	if (INTEL_GEN(dev_priv) >= 12) { +	if (DISPLAY_VER(dev_priv) >= 12) {  		if (intel_phy_is_combo(dev_priv, phy))  			tgl_get_combo_buf_trans(encoder, crtc_state, &n_entries);  		else  			tgl_get_dkl_buf_trans(encoder, crtc_state, &n_entries); -	} else if (INTEL_GEN(dev_priv) == 11) { +	} else if (IS_DISPLAY_VER(dev_priv, 11)) {  		if (IS_PLATFORM(dev_priv, INTEL_JASPERLAKE))  			jsl_get_combo_buf_trans(encoder, crtc_state, &n_entries);  		else if (IS_PLATFORM(dev_priv, INTEL_ELKHARTLAKE)) @@ -2523,15 +986,9 @@ static u8 intel_ddi_dp_voltage_max(struct intel_dp *intel_dp,  		else  			icl_get_mg_buf_trans(encoder, crtc_state, &n_entries);  	} else if (IS_CANNONLAKE(dev_priv)) { -		if (intel_crtc_has_type(crtc_state, INTEL_OUTPUT_EDP)) -			cnl_get_buf_trans_edp(encoder, &n_entries); -		else -			cnl_get_buf_trans_dp(encoder, &n_entries); +		cnl_get_buf_trans(encoder, crtc_state, &n_entries);  	} else if (IS_GEN9_LP(dev_priv)) { -		if (intel_crtc_has_type(crtc_state, INTEL_OUTPUT_EDP)) -			bxt_get_buf_trans_edp(encoder, &n_entries); -		else -			bxt_get_buf_trans_dp(encoder, &n_entries); +		bxt_get_buf_trans(encoder, crtc_state, &n_entries);  	} else {  		if (intel_crtc_has_type(crtc_state, INTEL_OUTPUT_EDP))  			intel_ddi_get_buf_trans_edp(encoder, &n_entries); @@ -2569,12 +1026,7 @@ static void cnl_ddi_vswing_program(struct intel_encoder *encoder,  	int n_entries, ln;  	u32 val; -	if (intel_crtc_has_type(crtc_state, INTEL_OUTPUT_HDMI)) -		ddi_translations = cnl_get_buf_trans_hdmi(encoder, &n_entries); -	else if (intel_crtc_has_type(crtc_state, INTEL_OUTPUT_EDP)) -		ddi_translations = cnl_get_buf_trans_edp(encoder, &n_entries); -	else -		ddi_translations = cnl_get_buf_trans_dp(encoder, &n_entries); +	ddi_translations = cnl_get_buf_trans(encoder, crtc_state, &n_entries);  	if (drm_WARN_ON_ONCE(&dev_priv->drm, !ddi_translations))  		return; @@ -2695,7 +1147,7 @@ static void icl_ddi_combo_vswing_program(struct intel_encoder *encoder,  	int n_entries, ln;  	u32 val; -	if (INTEL_GEN(dev_priv) >= 12) +	if (DISPLAY_VER(dev_priv) >= 12)  		ddi_translations = tgl_get_combo_buf_trans(encoder, crtc_state, &n_entries);  	else if (IS_PLATFORM(dev_priv, INTEL_JASPERLAKE))  		ddi_translations = jsl_get_combo_buf_trans(encoder, crtc_state, &n_entries); @@ -3110,196 +1562,580 @@ hsw_set_signal_levels(struct intel_dp *intel_dp,  	intel_de_posting_read(dev_priv, DDI_BUF_CTL(port));  } -static u32 icl_dpclka_cfgcr0_clk_off(struct drm_i915_private *dev_priv, -				     enum phy phy) +static void _cnl_ddi_enable_clock(struct drm_i915_private *i915, i915_reg_t reg, +				  u32 clk_sel_mask, u32 clk_sel, u32 clk_off)  { -	if (IS_ROCKETLAKE(dev_priv)) { -		return RKL_DPCLKA_CFGCR0_DDI_CLK_OFF(phy); -	} else if (intel_phy_is_combo(dev_priv, phy)) { -		return ICL_DPCLKA_CFGCR0_DDI_CLK_OFF(phy); -	} else if (intel_phy_is_tc(dev_priv, phy)) { -		enum tc_port tc_port = intel_port_to_tc(dev_priv, -							(enum port)phy); +	mutex_lock(&i915->dpll.lock); -		return ICL_DPCLKA_CFGCR0_TC_CLK_OFF(tc_port); -	} +	intel_de_rmw(i915, reg, clk_sel_mask, clk_sel); -	return 0; +	/* +	 * "This step and the step before must be +	 *  done with separate register writes." +	 */ +	intel_de_rmw(i915, reg, clk_off, 0); + +	mutex_unlock(&i915->dpll.lock); +} + +static void _cnl_ddi_disable_clock(struct drm_i915_private *i915, i915_reg_t reg, +				   u32 clk_off) +{ +	mutex_lock(&i915->dpll.lock); + +	intel_de_rmw(i915, reg, 0, clk_off); + +	mutex_unlock(&i915->dpll.lock); +} + +static bool _cnl_ddi_is_clock_enabled(struct drm_i915_private *i915, i915_reg_t reg, +				      u32 clk_off) +{ +	return !(intel_de_read(i915, reg) & clk_off); +} + +static struct intel_shared_dpll * +_cnl_ddi_get_pll(struct drm_i915_private *i915, i915_reg_t reg, +		 u32 clk_sel_mask, u32 clk_sel_shift) +{ +	enum intel_dpll_id id; + +	id = (intel_de_read(i915, reg) & clk_sel_mask) >> clk_sel_shift; + +	return intel_get_shared_dpll_by_id(i915, id);  } -static void dg1_map_plls_to_ports(struct intel_encoder *encoder, +static void adls_ddi_enable_clock(struct intel_encoder *encoder,  				  const struct intel_crtc_state *crtc_state)  { -	struct drm_i915_private *dev_priv = to_i915(encoder->base.dev); -	struct intel_shared_dpll *pll = crtc_state->shared_dpll; -	enum phy phy = intel_port_to_phy(dev_priv, encoder->port); -	u32 val; +	struct drm_i915_private *i915 = to_i915(encoder->base.dev); +	const struct intel_shared_dpll *pll = crtc_state->shared_dpll; +	enum phy phy = intel_port_to_phy(i915, encoder->port); + +	if (drm_WARN_ON(&i915->drm, !pll)) +		return; + +	_cnl_ddi_enable_clock(i915, ADLS_DPCLKA_CFGCR(phy), +			      ADLS_DPCLKA_CFGCR_DDI_CLK_SEL_MASK(phy), +			      pll->info->id << ADLS_DPCLKA_CFGCR_DDI_SHIFT(phy), +			      ICL_DPCLKA_CFGCR0_DDI_CLK_OFF(phy)); +} + +static void adls_ddi_disable_clock(struct intel_encoder *encoder) +{ +	struct drm_i915_private *i915 = to_i915(encoder->base.dev); +	enum phy phy = intel_port_to_phy(i915, encoder->port); + +	_cnl_ddi_disable_clock(i915, ADLS_DPCLKA_CFGCR(phy), +			       ICL_DPCLKA_CFGCR0_DDI_CLK_OFF(phy)); +} + +static bool adls_ddi_is_clock_enabled(struct intel_encoder *encoder) +{ +	struct drm_i915_private *i915 = to_i915(encoder->base.dev); +	enum phy phy = intel_port_to_phy(i915, encoder->port); + +	return _cnl_ddi_is_clock_enabled(i915, ADLS_DPCLKA_CFGCR(phy), +					 ICL_DPCLKA_CFGCR0_DDI_CLK_OFF(phy)); +} + +static struct intel_shared_dpll *adls_ddi_get_pll(struct intel_encoder *encoder) +{ +	struct drm_i915_private *i915 = to_i915(encoder->base.dev); +	enum phy phy = intel_port_to_phy(i915, encoder->port); + +	return _cnl_ddi_get_pll(i915, ADLS_DPCLKA_CFGCR(phy), +				ADLS_DPCLKA_CFGCR_DDI_CLK_SEL_MASK(phy), +				ADLS_DPCLKA_CFGCR_DDI_SHIFT(phy)); +} + +static void rkl_ddi_enable_clock(struct intel_encoder *encoder, +				 const struct intel_crtc_state *crtc_state) +{ +	struct drm_i915_private *i915 = to_i915(encoder->base.dev); +	const struct intel_shared_dpll *pll = crtc_state->shared_dpll; +	enum phy phy = intel_port_to_phy(i915, encoder->port); + +	if (drm_WARN_ON(&i915->drm, !pll)) +		return; + +	_cnl_ddi_enable_clock(i915, ICL_DPCLKA_CFGCR0, +			      RKL_DPCLKA_CFGCR0_DDI_CLK_SEL_MASK(phy), +			      RKL_DPCLKA_CFGCR0_DDI_CLK_SEL(pll->info->id, phy), +			      RKL_DPCLKA_CFGCR0_DDI_CLK_OFF(phy)); +} + +static void rkl_ddi_disable_clock(struct intel_encoder *encoder) +{ +	struct drm_i915_private *i915 = to_i915(encoder->base.dev); +	enum phy phy = intel_port_to_phy(i915, encoder->port); + +	_cnl_ddi_disable_clock(i915, ICL_DPCLKA_CFGCR0, +			       RKL_DPCLKA_CFGCR0_DDI_CLK_OFF(phy)); +} + +static bool rkl_ddi_is_clock_enabled(struct intel_encoder *encoder) +{ +	struct drm_i915_private *i915 = to_i915(encoder->base.dev); +	enum phy phy = intel_port_to_phy(i915, encoder->port); + +	return _cnl_ddi_is_clock_enabled(i915, ICL_DPCLKA_CFGCR0, +					 RKL_DPCLKA_CFGCR0_DDI_CLK_OFF(phy)); +} + +static struct intel_shared_dpll *rkl_ddi_get_pll(struct intel_encoder *encoder) +{ +	struct drm_i915_private *i915 = to_i915(encoder->base.dev); +	enum phy phy = intel_port_to_phy(i915, encoder->port); + +	return _cnl_ddi_get_pll(i915, ICL_DPCLKA_CFGCR0, +				RKL_DPCLKA_CFGCR0_DDI_CLK_SEL_MASK(phy), +				RKL_DPCLKA_CFGCR0_DDI_CLK_SEL_SHIFT(phy)); +} + +static void dg1_ddi_enable_clock(struct intel_encoder *encoder, +				 const struct intel_crtc_state *crtc_state) +{ +	struct drm_i915_private *i915 = to_i915(encoder->base.dev); +	const struct intel_shared_dpll *pll = crtc_state->shared_dpll; +	enum phy phy = intel_port_to_phy(i915, encoder->port); + +	if (drm_WARN_ON(&i915->drm, !pll)) +		return;  	/*  	 * If we fail this, something went very wrong: first 2 PLLs should be  	 * used by first 2 phys and last 2 PLLs by last phys  	 */ -	if (drm_WARN_ON(&dev_priv->drm, +	if (drm_WARN_ON(&i915->drm,  			(pll->info->id < DPLL_ID_DG1_DPLL2 && phy >= PHY_C) ||  			(pll->info->id >= DPLL_ID_DG1_DPLL2 && phy < PHY_C)))  		return; -	mutex_lock(&dev_priv->dpll.lock); +	_cnl_ddi_enable_clock(i915, DG1_DPCLKA_CFGCR0(phy), +			      DG1_DPCLKA_CFGCR0_DDI_CLK_SEL_MASK(phy), +			      DG1_DPCLKA_CFGCR0_DDI_CLK_SEL(pll->info->id, phy), +			      DG1_DPCLKA_CFGCR0_DDI_CLK_OFF(phy)); +} -	val = intel_de_read(dev_priv, DG1_DPCLKA_CFGCR0(phy)); -	drm_WARN_ON(&dev_priv->drm, -		    (val & DG1_DPCLKA_CFGCR0_DDI_CLK_OFF(phy)) == 0); +static void dg1_ddi_disable_clock(struct intel_encoder *encoder) +{ +	struct drm_i915_private *i915 = to_i915(encoder->base.dev); +	enum phy phy = intel_port_to_phy(i915, encoder->port); -	val &= ~DG1_DPCLKA_CFGCR0_DDI_CLK_SEL_MASK(phy); -	val |= DG1_DPCLKA_CFGCR0_DDI_CLK_SEL(pll->info->id, phy); -	intel_de_write(dev_priv, DG1_DPCLKA_CFGCR0(phy), val); -	intel_de_posting_read(dev_priv, DG1_DPCLKA_CFGCR0(phy)); +	_cnl_ddi_disable_clock(i915, DG1_DPCLKA_CFGCR0(phy), +			       DG1_DPCLKA_CFGCR0_DDI_CLK_OFF(phy)); +} -	val &= ~DG1_DPCLKA_CFGCR0_DDI_CLK_OFF(phy); -	intel_de_write(dev_priv, DG1_DPCLKA_CFGCR0(phy), val); +static bool dg1_ddi_is_clock_enabled(struct intel_encoder *encoder) +{ +	struct drm_i915_private *i915 = to_i915(encoder->base.dev); +	enum phy phy = intel_port_to_phy(i915, encoder->port); -	mutex_unlock(&dev_priv->dpll.lock); +	return _cnl_ddi_is_clock_enabled(i915, DG1_DPCLKA_CFGCR0(phy), +					 DG1_DPCLKA_CFGCR0_DDI_CLK_OFF(phy));  } -static void icl_map_plls_to_ports(struct intel_encoder *encoder, -				  const struct intel_crtc_state *crtc_state) +static struct intel_shared_dpll *dg1_ddi_get_pll(struct intel_encoder *encoder)  { -	struct drm_i915_private *dev_priv = to_i915(encoder->base.dev); -	struct intel_shared_dpll *pll = crtc_state->shared_dpll; -	enum phy phy = intel_port_to_phy(dev_priv, encoder->port); -	u32 val; +	struct drm_i915_private *i915 = to_i915(encoder->base.dev); +	enum phy phy = intel_port_to_phy(i915, encoder->port); -	mutex_lock(&dev_priv->dpll.lock); +	return _cnl_ddi_get_pll(i915, DG1_DPCLKA_CFGCR0(phy), +				DG1_DPCLKA_CFGCR0_DDI_CLK_SEL_MASK(phy), +				DG1_DPCLKA_CFGCR0_DDI_CLK_SEL_SHIFT(phy)); +} -	val = intel_de_read(dev_priv, ICL_DPCLKA_CFGCR0); -	drm_WARN_ON(&dev_priv->drm, -		    (val & icl_dpclka_cfgcr0_clk_off(dev_priv, phy)) == 0); +static void icl_ddi_combo_enable_clock(struct intel_encoder *encoder, +				       const struct intel_crtc_state *crtc_state) +{ +	struct drm_i915_private *i915 = to_i915(encoder->base.dev); +	const struct intel_shared_dpll *pll = crtc_state->shared_dpll; +	enum phy phy = intel_port_to_phy(i915, encoder->port); -	if (intel_phy_is_combo(dev_priv, phy)) { -		u32 mask, sel; +	if (drm_WARN_ON(&i915->drm, !pll)) +		return; -		if (IS_ROCKETLAKE(dev_priv)) { -			mask = RKL_DPCLKA_CFGCR0_DDI_CLK_SEL_MASK(phy); -			sel = RKL_DPCLKA_CFGCR0_DDI_CLK_SEL(pll->info->id, phy); -		} else { -			mask = ICL_DPCLKA_CFGCR0_DDI_CLK_SEL_MASK(phy); -			sel = ICL_DPCLKA_CFGCR0_DDI_CLK_SEL(pll->info->id, phy); -		} +	_cnl_ddi_enable_clock(i915, ICL_DPCLKA_CFGCR0, +			      ICL_DPCLKA_CFGCR0_DDI_CLK_SEL_MASK(phy), +			      ICL_DPCLKA_CFGCR0_DDI_CLK_SEL(pll->info->id, phy), +			      ICL_DPCLKA_CFGCR0_DDI_CLK_OFF(phy)); +} -		/* -		 * Even though this register references DDIs, note that we -		 * want to pass the PHY rather than the port (DDI).  For -		 * ICL, port=phy in all cases so it doesn't matter, but for -		 * EHL the bspec notes the following: -		 * -		 *   "DDID clock tied to DDIA clock, so DPCLKA_CFGCR0 DDIA -		 *   Clock Select chooses the PLL for both DDIA and DDID and -		 *   drives port A in all cases." -		 */ -		val &= ~mask; -		val |= sel; -		intel_de_write(dev_priv, ICL_DPCLKA_CFGCR0, val); -		intel_de_posting_read(dev_priv, ICL_DPCLKA_CFGCR0); -	} +static void icl_ddi_combo_disable_clock(struct intel_encoder *encoder) +{ +	struct drm_i915_private *i915 = to_i915(encoder->base.dev); +	enum phy phy = intel_port_to_phy(i915, encoder->port); -	val &= ~icl_dpclka_cfgcr0_clk_off(dev_priv, phy); -	intel_de_write(dev_priv, ICL_DPCLKA_CFGCR0, val); +	_cnl_ddi_disable_clock(i915, ICL_DPCLKA_CFGCR0, +			       ICL_DPCLKA_CFGCR0_DDI_CLK_OFF(phy)); +} -	mutex_unlock(&dev_priv->dpll.lock); +static bool icl_ddi_combo_is_clock_enabled(struct intel_encoder *encoder) +{ +	struct drm_i915_private *i915 = to_i915(encoder->base.dev); +	enum phy phy = intel_port_to_phy(i915, encoder->port); + +	return _cnl_ddi_is_clock_enabled(i915, ICL_DPCLKA_CFGCR0, +					 ICL_DPCLKA_CFGCR0_DDI_CLK_OFF(phy));  } -static void dg1_unmap_plls_to_ports(struct intel_encoder *encoder) +struct intel_shared_dpll *icl_ddi_combo_get_pll(struct intel_encoder *encoder)  { -	struct drm_i915_private *dev_priv = to_i915(encoder->base.dev); -	enum phy phy = intel_port_to_phy(dev_priv, encoder->port); +	struct drm_i915_private *i915 = to_i915(encoder->base.dev); +	enum phy phy = intel_port_to_phy(i915, encoder->port); + +	return _cnl_ddi_get_pll(i915, ICL_DPCLKA_CFGCR0, +				ICL_DPCLKA_CFGCR0_DDI_CLK_SEL_MASK(phy), +				ICL_DPCLKA_CFGCR0_DDI_CLK_SEL_SHIFT(phy)); +} -	mutex_lock(&dev_priv->dpll.lock); +static void jsl_ddi_tc_enable_clock(struct intel_encoder *encoder, +				    const struct intel_crtc_state *crtc_state) +{ +	struct drm_i915_private *i915 = to_i915(encoder->base.dev); +	const struct intel_shared_dpll *pll = crtc_state->shared_dpll; +	enum port port = encoder->port; -	intel_de_rmw(dev_priv, DG1_DPCLKA_CFGCR0(phy), 0, -		     DG1_DPCLKA_CFGCR0_DDI_CLK_OFF(phy)); +	if (drm_WARN_ON(&i915->drm, !pll)) +		return; -	mutex_unlock(&dev_priv->dpll.lock); +	/* +	 * "For DDIC and DDID, program DDI_CLK_SEL to map the MG clock to the port. +	 *  MG does not exist, but the programming is required to ungate DDIC and DDID." +	 */ +	intel_de_write(i915, DDI_CLK_SEL(port), DDI_CLK_SEL_MG); + +	icl_ddi_combo_enable_clock(encoder, crtc_state);  } -static void icl_unmap_plls_to_ports(struct intel_encoder *encoder) +static void jsl_ddi_tc_disable_clock(struct intel_encoder *encoder)  { -	struct drm_i915_private *dev_priv = to_i915(encoder->base.dev); -	enum phy phy = intel_port_to_phy(dev_priv, encoder->port); -	u32 val; +	struct drm_i915_private *i915 = to_i915(encoder->base.dev); +	enum port port = encoder->port; + +	icl_ddi_combo_disable_clock(encoder); + +	intel_de_write(i915, DDI_CLK_SEL(port), DDI_CLK_SEL_NONE); +} + +static bool jsl_ddi_tc_is_clock_enabled(struct intel_encoder *encoder) +{ +	struct drm_i915_private *i915 = to_i915(encoder->base.dev); +	enum port port = encoder->port; +	u32 tmp; -	mutex_lock(&dev_priv->dpll.lock); +	tmp = intel_de_read(i915, DDI_CLK_SEL(port)); -	val = intel_de_read(dev_priv, ICL_DPCLKA_CFGCR0); -	val |= icl_dpclka_cfgcr0_clk_off(dev_priv, phy); -	intel_de_write(dev_priv, ICL_DPCLKA_CFGCR0, val); +	if ((tmp & DDI_CLK_SEL_MASK) == DDI_CLK_SEL_NONE) +		return false; -	mutex_unlock(&dev_priv->dpll.lock); +	return icl_ddi_combo_is_clock_enabled(encoder);  } -static void dg1_sanitize_port_clk_off(struct drm_i915_private *dev_priv, -				      u32 port_mask, bool ddi_clk_needed) +static void icl_ddi_tc_enable_clock(struct intel_encoder *encoder, +				    const struct intel_crtc_state *crtc_state)  { -	enum port port; -	u32 val; +	struct drm_i915_private *i915 = to_i915(encoder->base.dev); +	const struct intel_shared_dpll *pll = crtc_state->shared_dpll; +	enum tc_port tc_port = intel_port_to_tc(i915, encoder->port); +	enum port port = encoder->port; -	for_each_port_masked(port, port_mask) { -		enum phy phy = intel_port_to_phy(dev_priv, port); -		bool ddi_clk_off; +	if (drm_WARN_ON(&i915->drm, !pll)) +		return; -		val = intel_de_read(dev_priv, DG1_DPCLKA_CFGCR0(phy)); -		ddi_clk_off = val & DG1_DPCLKA_CFGCR0_DDI_CLK_OFF(phy); +	intel_de_write(i915, DDI_CLK_SEL(port), +		       icl_pll_to_ddi_clk_sel(encoder, crtc_state)); -		if (ddi_clk_needed == !ddi_clk_off) -			continue; +	mutex_lock(&i915->dpll.lock); -		/* -		 * Punt on the case now where clock is gated, but it would -		 * be needed by the port. Something else is really broken then. -		 */ -		if (drm_WARN_ON(&dev_priv->drm, ddi_clk_needed)) -			continue; +	intel_de_rmw(i915, ICL_DPCLKA_CFGCR0, +		     ICL_DPCLKA_CFGCR0_TC_CLK_OFF(tc_port), 0); + +	mutex_unlock(&i915->dpll.lock); +} + +static void icl_ddi_tc_disable_clock(struct intel_encoder *encoder) +{ +	struct drm_i915_private *i915 = to_i915(encoder->base.dev); +	enum tc_port tc_port = intel_port_to_tc(i915, encoder->port); +	enum port port = encoder->port; + +	mutex_lock(&i915->dpll.lock); + +	intel_de_rmw(i915, ICL_DPCLKA_CFGCR0, +		     0, ICL_DPCLKA_CFGCR0_TC_CLK_OFF(tc_port)); + +	mutex_unlock(&i915->dpll.lock); + +	intel_de_write(i915, DDI_CLK_SEL(port), DDI_CLK_SEL_NONE); +} + +static bool icl_ddi_tc_is_clock_enabled(struct intel_encoder *encoder) +{ +	struct drm_i915_private *i915 = to_i915(encoder->base.dev); +	enum tc_port tc_port = intel_port_to_tc(i915, encoder->port); +	enum port port = encoder->port; +	u32 tmp; + +	tmp = intel_de_read(i915, DDI_CLK_SEL(port)); + +	if ((tmp & DDI_CLK_SEL_MASK) == DDI_CLK_SEL_NONE) +		return false; -		drm_notice(&dev_priv->drm, -			   "PHY %c is disabled with an ungated DDI clock, gate it\n", -			   phy_name(phy)); -		val |= DG1_DPCLKA_CFGCR0_DDI_CLK_OFF(phy); -		intel_de_write(dev_priv, DG1_DPCLKA_CFGCR0(phy), val); +	tmp = intel_de_read(i915, ICL_DPCLKA_CFGCR0); + +	return !(tmp & ICL_DPCLKA_CFGCR0_TC_CLK_OFF(tc_port)); +} + +static struct intel_shared_dpll *icl_ddi_tc_get_pll(struct intel_encoder *encoder) +{ +	struct drm_i915_private *i915 = to_i915(encoder->base.dev); +	enum tc_port tc_port = intel_port_to_tc(i915, encoder->port); +	enum port port = encoder->port; +	enum intel_dpll_id id; +	u32 tmp; + +	tmp = intel_de_read(i915, DDI_CLK_SEL(port)); + +	switch (tmp & DDI_CLK_SEL_MASK) { +	case DDI_CLK_SEL_TBT_162: +	case DDI_CLK_SEL_TBT_270: +	case DDI_CLK_SEL_TBT_540: +	case DDI_CLK_SEL_TBT_810: +		id = DPLL_ID_ICL_TBTPLL; +		break; +	case DDI_CLK_SEL_MG: +		id = icl_tc_port_to_pll_id(tc_port); +		break; +	default: +		MISSING_CASE(tmp); +		fallthrough; +	case DDI_CLK_SEL_NONE: +		return NULL;  	} + +	return intel_get_shared_dpll_by_id(i915, id);  } -static void icl_sanitize_port_clk_off(struct drm_i915_private *dev_priv, -				      u32 port_mask, bool ddi_clk_needed) +static void cnl_ddi_enable_clock(struct intel_encoder *encoder, +				 const struct intel_crtc_state *crtc_state)  { -	enum port port; -	u32 val; +	struct drm_i915_private *i915 = to_i915(encoder->base.dev); +	const struct intel_shared_dpll *pll = crtc_state->shared_dpll; +	enum port port = encoder->port; -	val = intel_de_read(dev_priv, ICL_DPCLKA_CFGCR0); -	for_each_port_masked(port, port_mask) { -		enum phy phy = intel_port_to_phy(dev_priv, port); -		bool ddi_clk_off = val & icl_dpclka_cfgcr0_clk_off(dev_priv, -								   phy); +	if (drm_WARN_ON(&i915->drm, !pll)) +		return; -		if (ddi_clk_needed == !ddi_clk_off) -			continue; +	_cnl_ddi_enable_clock(i915, DPCLKA_CFGCR0, +			      DPCLKA_CFGCR0_DDI_CLK_SEL_MASK(port), +			      DPCLKA_CFGCR0_DDI_CLK_SEL(pll->info->id, port), +			      DPCLKA_CFGCR0_DDI_CLK_OFF(port)); +} -		/* -		 * Punt on the case now where clock is gated, but it would -		 * be needed by the port. Something else is really broken then. -		 */ -		if (drm_WARN_ON(&dev_priv->drm, ddi_clk_needed)) -			continue; +static void cnl_ddi_disable_clock(struct intel_encoder *encoder) +{ +	struct drm_i915_private *i915 = to_i915(encoder->base.dev); +	enum port port = encoder->port; + +	_cnl_ddi_disable_clock(i915, DPCLKA_CFGCR0, +			       DPCLKA_CFGCR0_DDI_CLK_OFF(port)); +} -		drm_notice(&dev_priv->drm, -			   "PHY %c is disabled/in DSI mode with an ungated DDI clock, gate it\n", -			   phy_name(phy)); -		val |= icl_dpclka_cfgcr0_clk_off(dev_priv, phy); -		intel_de_write(dev_priv, ICL_DPCLKA_CFGCR0, val); +static bool cnl_ddi_is_clock_enabled(struct intel_encoder *encoder) +{ +	struct drm_i915_private *i915 = to_i915(encoder->base.dev); +	enum port port = encoder->port; + +	return _cnl_ddi_is_clock_enabled(i915, DPCLKA_CFGCR0, +					 DPCLKA_CFGCR0_DDI_CLK_OFF(port)); +} + +static struct intel_shared_dpll *cnl_ddi_get_pll(struct intel_encoder *encoder) +{ +	struct drm_i915_private *i915 = to_i915(encoder->base.dev); +	enum port port = encoder->port; + +	return _cnl_ddi_get_pll(i915, DPCLKA_CFGCR0, +				DPCLKA_CFGCR0_DDI_CLK_SEL_MASK(port), +				DPCLKA_CFGCR0_DDI_CLK_SEL_SHIFT(port)); +} + +static struct intel_shared_dpll *bxt_ddi_get_pll(struct intel_encoder *encoder) +{ +	struct drm_i915_private *i915 = to_i915(encoder->base.dev); +	enum intel_dpll_id id; + +	switch (encoder->port) { +	case PORT_A: +		id = DPLL_ID_SKL_DPLL0; +		break; +	case PORT_B: +		id = DPLL_ID_SKL_DPLL1; +		break; +	case PORT_C: +		id = DPLL_ID_SKL_DPLL2; +		break; +	default: +		MISSING_CASE(encoder->port); +		return NULL;  	} + +	return intel_get_shared_dpll_by_id(i915, id);  } -void icl_sanitize_encoder_pll_mapping(struct intel_encoder *encoder) +static void skl_ddi_enable_clock(struct intel_encoder *encoder, +				 const struct intel_crtc_state *crtc_state)  { -	struct drm_i915_private *dev_priv = to_i915(encoder->base.dev); +	struct drm_i915_private *i915 = to_i915(encoder->base.dev); +	const struct intel_shared_dpll *pll = crtc_state->shared_dpll; +	enum port port = encoder->port; + +	if (drm_WARN_ON(&i915->drm, !pll)) +		return; + +	mutex_lock(&i915->dpll.lock); + +	intel_de_rmw(i915, DPLL_CTRL2, +		     DPLL_CTRL2_DDI_CLK_OFF(port) | +		     DPLL_CTRL2_DDI_CLK_SEL_MASK(port), +		     DPLL_CTRL2_DDI_CLK_SEL(pll->info->id, port) | +		     DPLL_CTRL2_DDI_SEL_OVERRIDE(port)); + +	mutex_unlock(&i915->dpll.lock); +} + +static void skl_ddi_disable_clock(struct intel_encoder *encoder) +{ +	struct drm_i915_private *i915 = to_i915(encoder->base.dev); +	enum port port = encoder->port; + +	mutex_lock(&i915->dpll.lock); + +	intel_de_rmw(i915, DPLL_CTRL2, +		     0, DPLL_CTRL2_DDI_CLK_OFF(port)); + +	mutex_unlock(&i915->dpll.lock); +} + +static bool skl_ddi_is_clock_enabled(struct intel_encoder *encoder) +{ +	struct drm_i915_private *i915 = to_i915(encoder->base.dev); +	enum port port = encoder->port; + +	/* +	 * FIXME Not sure if the override affects both +	 * the PLL selection and the CLK_OFF bit. +	 */ +	return !(intel_de_read(i915, DPLL_CTRL2) & DPLL_CTRL2_DDI_CLK_OFF(port)); +} + +static struct intel_shared_dpll *skl_ddi_get_pll(struct intel_encoder *encoder) +{ +	struct drm_i915_private *i915 = to_i915(encoder->base.dev); +	enum port port = encoder->port; +	enum intel_dpll_id id; +	u32 tmp; + +	tmp = intel_de_read(i915, DPLL_CTRL2); + +	/* +	 * FIXME Not sure if the override affects both +	 * the PLL selection and the CLK_OFF bit. +	 */ +	if ((tmp & DPLL_CTRL2_DDI_SEL_OVERRIDE(port)) == 0) +		return NULL; + +	id = (tmp & DPLL_CTRL2_DDI_CLK_SEL_MASK(port)) >> +		DPLL_CTRL2_DDI_CLK_SEL_SHIFT(port); + +	return intel_get_shared_dpll_by_id(i915, id); +} + +void hsw_ddi_enable_clock(struct intel_encoder *encoder, +			  const struct intel_crtc_state *crtc_state) +{ +	struct drm_i915_private *i915 = to_i915(encoder->base.dev); +	const struct intel_shared_dpll *pll = crtc_state->shared_dpll; +	enum port port = encoder->port; + +	if (drm_WARN_ON(&i915->drm, !pll)) +		return; + +	intel_de_write(i915, PORT_CLK_SEL(port), hsw_pll_to_ddi_pll_sel(pll)); +} + +void hsw_ddi_disable_clock(struct intel_encoder *encoder) +{ +	struct drm_i915_private *i915 = to_i915(encoder->base.dev); +	enum port port = encoder->port; + +	intel_de_write(i915, PORT_CLK_SEL(port), PORT_CLK_SEL_NONE); +} + +bool hsw_ddi_is_clock_enabled(struct intel_encoder *encoder) +{ +	struct drm_i915_private *i915 = to_i915(encoder->base.dev); +	enum port port = encoder->port; + +	return intel_de_read(i915, PORT_CLK_SEL(port)) != PORT_CLK_SEL_NONE; +} + +static struct intel_shared_dpll *hsw_ddi_get_pll(struct intel_encoder *encoder) +{ +	struct drm_i915_private *i915 = to_i915(encoder->base.dev); +	enum port port = encoder->port; +	enum intel_dpll_id id; +	u32 tmp; + +	tmp = intel_de_read(i915, PORT_CLK_SEL(port)); + +	switch (tmp & PORT_CLK_SEL_MASK) { +	case PORT_CLK_SEL_WRPLL1: +		id = DPLL_ID_WRPLL1; +		break; +	case PORT_CLK_SEL_WRPLL2: +		id = DPLL_ID_WRPLL2; +		break; +	case PORT_CLK_SEL_SPLL: +		id = DPLL_ID_SPLL; +		break; +	case PORT_CLK_SEL_LCPLL_810: +		id = DPLL_ID_LCPLL_810; +		break; +	case PORT_CLK_SEL_LCPLL_1350: +		id = DPLL_ID_LCPLL_1350; +		break; +	case PORT_CLK_SEL_LCPLL_2700: +		id = DPLL_ID_LCPLL_2700; +		break; +	default: +		MISSING_CASE(tmp); +		fallthrough; +	case PORT_CLK_SEL_NONE: +		return NULL; +	} + +	return intel_get_shared_dpll_by_id(i915, id); +} + +void intel_ddi_enable_clock(struct intel_encoder *encoder, +			    const struct intel_crtc_state *crtc_state) +{ +	if (encoder->enable_clock) +		encoder->enable_clock(encoder, crtc_state); +} + +static void intel_ddi_disable_clock(struct intel_encoder *encoder) +{ +	if (encoder->disable_clock) +		encoder->disable_clock(encoder); +} + +void intel_ddi_sanitize_encoder_pll_mapping(struct intel_encoder *encoder) +{ +	struct drm_i915_private *i915 = to_i915(encoder->base.dev);  	u32 port_mask;  	bool ddi_clk_needed; @@ -3319,7 +2155,7 @@ void icl_sanitize_encoder_pll_mapping(struct intel_encoder *encoder)  		 * In the unlikely case that BIOS enables DP in MST mode, just  		 * warn since our MST HW readout is incomplete.  		 */ -		if (drm_WARN_ON(&dev_priv->drm, is_mst)) +		if (drm_WARN_ON(&i915->drm, is_mst))  			return;  	} @@ -3334,11 +2170,11 @@ void icl_sanitize_encoder_pll_mapping(struct intel_encoder *encoder)  		 * Sanity check that we haven't incorrectly registered another  		 * encoder using any of the ports of this DSI encoder.  		 */ -		for_each_intel_encoder(&dev_priv->drm, other_encoder) { +		for_each_intel_encoder(&i915->drm, other_encoder) {  			if (other_encoder == encoder)  				continue; -			if (drm_WARN_ON(&dev_priv->drm, +			if (drm_WARN_ON(&i915->drm,  					port_mask & BIT(other_encoder->port)))  				return;  		} @@ -3349,92 +2185,15 @@ void icl_sanitize_encoder_pll_mapping(struct intel_encoder *encoder)  		ddi_clk_needed = false;  	} -	if (IS_DG1(dev_priv)) -		dg1_sanitize_port_clk_off(dev_priv, port_mask, ddi_clk_needed); -	else -		icl_sanitize_port_clk_off(dev_priv, port_mask, ddi_clk_needed); -} - -static void intel_ddi_clk_select(struct intel_encoder *encoder, -				 const struct intel_crtc_state *crtc_state) -{ -	struct drm_i915_private *dev_priv = to_i915(encoder->base.dev); -	enum port port = encoder->port; -	enum phy phy = intel_port_to_phy(dev_priv, port); -	u32 val; -	const struct intel_shared_dpll *pll = crtc_state->shared_dpll; - -	if (drm_WARN_ON(&dev_priv->drm, !pll)) +	if (ddi_clk_needed || !encoder->disable_clock || +	    !encoder->is_clock_enabled(encoder))  		return; -	mutex_lock(&dev_priv->dpll.lock); - -	if (INTEL_GEN(dev_priv) >= 11) { -		if (!intel_phy_is_combo(dev_priv, phy)) -			intel_de_write(dev_priv, DDI_CLK_SEL(port), -				       icl_pll_to_ddi_clk_sel(encoder, crtc_state)); -		else if (IS_JSL_EHL(dev_priv) && port >= PORT_C) -			/* -			 * MG does not exist but the programming is required -			 * to ungate DDIC and DDID -			 */ -			intel_de_write(dev_priv, DDI_CLK_SEL(port), -				       DDI_CLK_SEL_MG); -	} else if (IS_CANNONLAKE(dev_priv)) { -		/* Configure DPCLKA_CFGCR0 to map the DPLL to the DDI. */ -		val = intel_de_read(dev_priv, DPCLKA_CFGCR0); -		val &= ~DPCLKA_CFGCR0_DDI_CLK_SEL_MASK(port); -		val |= DPCLKA_CFGCR0_DDI_CLK_SEL(pll->info->id, port); -		intel_de_write(dev_priv, DPCLKA_CFGCR0, val); - -		/* -		 * Configure DPCLKA_CFGCR0 to turn on the clock for the DDI. -		 * This step and the step before must be done with separate -		 * register writes. -		 */ -		val = intel_de_read(dev_priv, DPCLKA_CFGCR0); -		val &= ~DPCLKA_CFGCR0_DDI_CLK_OFF(port); -		intel_de_write(dev_priv, DPCLKA_CFGCR0, val); -	} else if (IS_GEN9_BC(dev_priv)) { -		/* DDI -> PLL mapping  */ -		val = intel_de_read(dev_priv, DPLL_CTRL2); - -		val &= ~(DPLL_CTRL2_DDI_CLK_OFF(port) | -			 DPLL_CTRL2_DDI_CLK_SEL_MASK(port)); -		val |= (DPLL_CTRL2_DDI_CLK_SEL(pll->info->id, port) | -			DPLL_CTRL2_DDI_SEL_OVERRIDE(port)); - -		intel_de_write(dev_priv, DPLL_CTRL2, val); +	drm_notice(&i915->drm, +		   "[ENCODER:%d:%s] is disabled/in DSI mode with an ungated DDI clock, gate it\n", +		   encoder->base.base.id, encoder->base.name); -	} else if (INTEL_GEN(dev_priv) < 9) { -		intel_de_write(dev_priv, PORT_CLK_SEL(port), -			       hsw_pll_to_ddi_pll_sel(pll)); -	} - -	mutex_unlock(&dev_priv->dpll.lock); -} - -static void intel_ddi_clk_disable(struct intel_encoder *encoder) -{ -	struct drm_i915_private *dev_priv = to_i915(encoder->base.dev); -	enum port port = encoder->port; -	enum phy phy = intel_port_to_phy(dev_priv, port); - -	if (INTEL_GEN(dev_priv) >= 11) { -		if (!intel_phy_is_combo(dev_priv, phy) || -		    (IS_JSL_EHL(dev_priv) && port >= PORT_C)) -			intel_de_write(dev_priv, DDI_CLK_SEL(port), -				       DDI_CLK_SEL_NONE); -	} else if (IS_CANNONLAKE(dev_priv)) { -		intel_de_write(dev_priv, DPCLKA_CFGCR0, -			       intel_de_read(dev_priv, DPCLKA_CFGCR0) | DPCLKA_CFGCR0_DDI_CLK_OFF(port)); -	} else if (IS_GEN9_BC(dev_priv)) { -		intel_de_write(dev_priv, DPLL_CTRL2, -			       intel_de_read(dev_priv, DPLL_CTRL2) | DPLL_CTRL2_DDI_CLK_OFF(port)); -	} else if (INTEL_GEN(dev_priv) < 9) { -		intel_de_write(dev_priv, PORT_CLK_SEL(port), -			       PORT_CLK_SEL_NONE); -	} +	encoder->disable_clock(encoder);  }  static void @@ -3443,13 +2202,15 @@ icl_program_mg_dp_mode(struct intel_digital_port *dig_port,  {  	struct drm_i915_private *dev_priv = to_i915(dig_port->base.base.dev);  	enum tc_port tc_port = intel_port_to_tc(dev_priv, dig_port->base.port); +	enum phy phy = intel_port_to_phy(dev_priv, dig_port->base.port);  	u32 ln0, ln1, pin_assignment;  	u8 width; -	if (dig_port->tc_mode == TC_PORT_TBT_ALT) +	if (!intel_phy_is_tc(dev_priv, phy) || +	    dig_port->tc_mode == TC_PORT_TBT_ALT)  		return; -	if (INTEL_GEN(dev_priv) >= 12) { +	if (DISPLAY_VER(dev_priv) >= 12) {  		intel_de_write(dev_priv, HIP_INDEX_REG(tc_port),  			       HIP_INDEX_VAL(tc_port, 0x0));  		ln0 = intel_de_read(dev_priv, DKL_DP_MODE(tc_port)); @@ -3515,7 +2276,7 @@ icl_program_mg_dp_mode(struct intel_digital_port *dig_port,  		MISSING_CASE(pin_assignment);  	} -	if (INTEL_GEN(dev_priv) >= 12) { +	if (DISPLAY_VER(dev_priv) >= 12) {  		intel_de_write(dev_priv, HIP_INDEX_REG(tc_port),  			       HIP_INDEX_VAL(tc_port, 0x0));  		intel_de_write(dev_priv, DKL_DP_MODE(tc_port), ln0); @@ -3542,7 +2303,7 @@ i915_reg_t dp_tp_ctl_reg(struct intel_encoder *encoder,  {  	struct drm_i915_private *dev_priv = to_i915(encoder->base.dev); -	if (INTEL_GEN(dev_priv) >= 12) +	if (DISPLAY_VER(dev_priv) >= 12)  		return TGL_DP_TP_CTL(tgl_dp_tp_transcoder(crtc_state));  	else  		return DP_TP_CTL(encoder->port); @@ -3553,7 +2314,7 @@ i915_reg_t dp_tp_status_reg(struct intel_encoder *encoder,  {  	struct drm_i915_private *dev_priv = to_i915(encoder->base.dev); -	if (INTEL_GEN(dev_priv) >= 12) +	if (DISPLAY_VER(dev_priv) >= 12)  		return TGL_DP_TP_STATUS(tgl_dp_tp_transcoder(crtc_state));  	else  		return DP_TP_STATUS(encoder->port); @@ -3638,6 +2399,73 @@ static void intel_ddi_power_up_lanes(struct intel_encoder *encoder,  	}  } +static void intel_ddi_mso_get_config(struct intel_encoder *encoder, +				     struct intel_crtc_state *pipe_config) +{ +	struct intel_crtc *crtc = to_intel_crtc(pipe_config->uapi.crtc); +	struct drm_i915_private *i915 = to_i915(crtc->base.dev); +	enum pipe pipe = crtc->pipe; +	u32 dss1; + +	if (!HAS_MSO(i915)) +		return; + +	dss1 = intel_de_read(i915, ICL_PIPE_DSS_CTL1(pipe)); + +	pipe_config->splitter.enable = dss1 & SPLITTER_ENABLE; +	if (!pipe_config->splitter.enable) +		return; + +	/* Splitter enable is supported for pipe A only. */ +	if (drm_WARN_ON(&i915->drm, pipe != PIPE_A)) { +		pipe_config->splitter.enable = false; +		return; +	} + +	switch (dss1 & SPLITTER_CONFIGURATION_MASK) { +	default: +		drm_WARN(&i915->drm, true, +			 "Invalid splitter configuration, dss1=0x%08x\n", dss1); +		fallthrough; +	case SPLITTER_CONFIGURATION_2_SEGMENT: +		pipe_config->splitter.link_count = 2; +		break; +	case SPLITTER_CONFIGURATION_4_SEGMENT: +		pipe_config->splitter.link_count = 4; +		break; +	} + +	pipe_config->splitter.pixel_overlap = REG_FIELD_GET(OVERLAP_PIXELS_MASK, dss1); +} + +static void intel_ddi_mso_configure(const struct intel_crtc_state *crtc_state) +{ +	struct intel_crtc *crtc = to_intel_crtc(crtc_state->uapi.crtc); +	struct drm_i915_private *i915 = to_i915(crtc->base.dev); +	enum pipe pipe = crtc->pipe; +	u32 dss1 = 0; + +	if (!HAS_MSO(i915)) +		return; + +	if (crtc_state->splitter.enable) { +		/* Splitter enable is supported for pipe A only. */ +		if (drm_WARN_ON(&i915->drm, pipe != PIPE_A)) +			return; + +		dss1 |= SPLITTER_ENABLE; +		dss1 |= OVERLAP_PIXELS(crtc_state->splitter.pixel_overlap); +		if (crtc_state->splitter.link_count == 2) +			dss1 |= SPLITTER_CONFIGURATION_2_SEGMENT; +		else +			dss1 |= SPLITTER_CONFIGURATION_4_SEGMENT; +	} + +	intel_de_rmw(i915, ICL_PIPE_DSS_CTL1(pipe), +		     SPLITTER_ENABLE | SPLITTER_CONFIGURATION_MASK | +		     OVERLAP_PIXELS_MASK, dss1); +} +  static void tgl_ddi_pre_enable_dp(struct intel_atomic_state *state,  				  struct intel_encoder *encoder,  				  const struct intel_crtc_state *crtc_state, @@ -3679,7 +2507,7 @@ static void tgl_ddi_pre_enable_dp(struct intel_atomic_state *state,  	 * hsw_crtc_enable()->intel_enable_shared_dpll().  We need only  	 * configure the PLL to port mapping here.  	 */ -	intel_ddi_clk_select(encoder, crtc_state); +	intel_ddi_enable_clock(encoder, crtc_state);  	/* 5. If IO power is controlled through PWR_WELL_CTL, Enable IO Power */  	if (!intel_phy_is_tc(dev_priv, phy) || @@ -3732,6 +2560,11 @@ static void tgl_ddi_pre_enable_dp(struct intel_atomic_state *state,  	intel_ddi_power_up_lanes(encoder, crtc_state);  	/* +	 * 7.g Program CoG/MSO configuration bits in DSS_CTL1 if selected. +	 */ +	intel_ddi_mso_configure(crtc_state); + +	/*  	 * 7.g Configure and enable DDI_BUF_CTL  	 * 7.h Wait for DDI_BUF_CTL DDI Idle Status = 0b (Not Idle), timeout  	 *     after 500 us. @@ -3788,7 +2621,7 @@ static void hsw_ddi_pre_enable_dp(struct intel_atomic_state *state,  	bool is_mst = intel_crtc_has_type(crtc_state, INTEL_OUTPUT_DP_MST);  	int level = intel_ddi_dp_level(intel_dp); -	if (INTEL_GEN(dev_priv) < 11) +	if (DISPLAY_VER(dev_priv) < 11)  		drm_WARN_ON(&dev_priv->drm,  			    is_mst && (port == PORT_A || port == PORT_E));  	else @@ -3800,7 +2633,7 @@ static void hsw_ddi_pre_enable_dp(struct intel_atomic_state *state,  	intel_pps_on(intel_dp); -	intel_ddi_clk_select(encoder, crtc_state); +	intel_ddi_enable_clock(encoder, crtc_state);  	if (!intel_phy_is_tc(dev_priv, phy) ||  	    dig_port->tc_mode != TC_PORT_TBT_ALT) { @@ -3811,7 +2644,7 @@ static void hsw_ddi_pre_enable_dp(struct intel_atomic_state *state,  	icl_program_mg_dp_mode(dig_port, crtc_state); -	if (INTEL_GEN(dev_priv) >= 11) +	if (DISPLAY_VER(dev_priv) >= 11)  		icl_ddi_vswing_sequence(encoder, crtc_state, level);  	else if (IS_CANNONLAKE(dev_priv))  		cnl_ddi_vswing_sequence(encoder, crtc_state, level); @@ -3830,7 +2663,7 @@ static void hsw_ddi_pre_enable_dp(struct intel_atomic_state *state,  					      true);  	intel_dp_sink_set_fec_ready(intel_dp, crtc_state);  	intel_dp_start_link_train(intel_dp, crtc_state); -	if ((port != PORT_A || INTEL_GEN(dev_priv) >= 9) && +	if ((port != PORT_A || DISPLAY_VER(dev_priv) >= 9) &&  	    !is_trans_port_sync_mode(crtc_state))  		intel_dp_stop_link_train(intel_dp, crtc_state); @@ -3850,7 +2683,7 @@ static void intel_ddi_pre_enable_dp(struct intel_atomic_state *state,  {  	struct drm_i915_private *dev_priv = to_i915(encoder->base.dev); -	if (INTEL_GEN(dev_priv) >= 12) +	if (DISPLAY_VER(dev_priv) >= 12)  		tgl_ddi_pre_enable_dp(state, encoder, crtc_state, conn_state);  	else  		hsw_ddi_pre_enable_dp(state, encoder, crtc_state, conn_state); @@ -3873,10 +2706,9 @@ static void intel_ddi_pre_enable_hdmi(struct intel_atomic_state *state,  	struct intel_digital_port *dig_port = enc_to_dig_port(encoder);  	struct intel_hdmi *intel_hdmi = &dig_port->hdmi;  	struct drm_i915_private *dev_priv = to_i915(encoder->base.dev); -	int level = intel_ddi_hdmi_level(encoder, crtc_state);  	intel_dp_dual_mode_set_tmds_output(intel_hdmi, true); -	intel_ddi_clk_select(encoder, crtc_state); +	intel_ddi_enable_clock(encoder, crtc_state);  	drm_WARN_ON(&dev_priv->drm, dig_port->ddi_io_wakeref);  	dig_port->ddi_io_wakeref = intel_display_power_get(dev_priv, @@ -3884,20 +2716,6 @@ static void intel_ddi_pre_enable_hdmi(struct intel_atomic_state *state,  	icl_program_mg_dp_mode(dig_port, crtc_state); -	if (INTEL_GEN(dev_priv) >= 12) -		tgl_ddi_vswing_sequence(encoder, crtc_state, level); -	else if (INTEL_GEN(dev_priv) == 11) -		icl_ddi_vswing_sequence(encoder, crtc_state, level); -	else if (IS_CANNONLAKE(dev_priv)) -		cnl_ddi_vswing_sequence(encoder, crtc_state, level); -	else if (IS_GEN9_LP(dev_priv)) -		bxt_ddi_vswing_sequence(encoder, crtc_state, level); -	else -		intel_prepare_hdmi_ddi_buffers(encoder, level); - -	if (IS_GEN9_BC(dev_priv)) -		skl_ddi_set_iboost(encoder, crtc_state, level); -  	intel_ddi_enable_pipe_clock(encoder, crtc_state);  	dig_port->set_infoframes(encoder, @@ -3929,11 +2747,6 @@ static void intel_ddi_pre_enable(struct intel_atomic_state *state,  	drm_WARN_ON(&dev_priv->drm, crtc_state->has_pch_encoder); -	if (IS_DG1(dev_priv)) -		dg1_map_plls_to_ports(encoder, crtc_state); -	else if (INTEL_GEN(dev_priv) >= 11) -		icl_map_plls_to_ports(encoder, crtc_state); -  	intel_set_cpu_fifo_underrun_reporting(dev_priv, pipe, true);  	if (intel_crtc_has_type(crtc_state, INTEL_OUTPUT_HDMI)) { @@ -4005,7 +2818,7 @@ static void intel_ddi_post_disable_dp(struct intel_atomic_state *state,  	 */  	intel_dp_set_power(intel_dp, DP_SET_POWER_D3); -	if (INTEL_GEN(dev_priv) >= 12) { +	if (DISPLAY_VER(dev_priv) >= 12) {  		if (is_mst) {  			enum transcoder cpu_transcoder = old_crtc_state->cpu_transcoder;  			u32 val; @@ -4030,7 +2843,7 @@ static void intel_ddi_post_disable_dp(struct intel_atomic_state *state,  	 * Configure Transcoder Clock select to direct no clock to the  	 * transcoder"  	 */ -	if (INTEL_GEN(dev_priv) >= 12) +	if (DISPLAY_VER(dev_priv) >= 12)  		intel_ddi_disable_pipe_clock(old_crtc_state);  	intel_pps_vdd_on(intel_dp); @@ -4042,7 +2855,7 @@ static void intel_ddi_post_disable_dp(struct intel_atomic_state *state,  					dig_port->ddi_io_power_domain,  					fetch_and_zero(&dig_port->ddi_io_wakeref)); -	intel_ddi_clk_disable(encoder); +	intel_ddi_disable_clock(encoder);  }  static void intel_ddi_post_disable_hdmi(struct intel_atomic_state *state, @@ -4065,7 +2878,7 @@ static void intel_ddi_post_disable_hdmi(struct intel_atomic_state *state,  				dig_port->ddi_io_power_domain,  				fetch_and_zero(&dig_port->ddi_io_wakeref)); -	intel_ddi_clk_disable(encoder); +	intel_ddi_disable_clock(encoder);  	intel_dp_dual_mode_set_tmds_output(intel_hdmi, false);  } @@ -4091,7 +2904,7 @@ static void intel_ddi_post_disable(struct intel_atomic_state *state,  		intel_dsc_disable(old_crtc_state); -		if (INTEL_GEN(dev_priv) >= 9) +		if (DISPLAY_VER(dev_priv) >= 9)  			skl_scaler_disable(old_crtc_state);  		else  			ilk_pfit_disable(old_crtc_state); @@ -4106,7 +2919,6 @@ static void intel_ddi_post_disable(struct intel_atomic_state *state,  			intel_atomic_get_old_crtc_state(state, slave);  		intel_crtc_vblank_off(old_slave_crtc_state); -		trace_intel_pipe_disable(slave);  		intel_dsc_disable(old_slave_crtc_state);  		skl_scaler_disable(old_slave_crtc_state); @@ -4132,11 +2944,6 @@ static void intel_ddi_post_disable(struct intel_atomic_state *state,  		intel_ddi_post_disable_dp(state, encoder, old_crtc_state,  					  old_conn_state); -	if (IS_DG1(dev_priv)) -		dg1_unmap_plls_to_ports(encoder); -	else if (INTEL_GEN(dev_priv) >= 11) -		icl_unmap_plls_to_ports(encoder); -  	if (intel_crtc_has_dp_encoder(old_crtc_state) || is_tc_port)  		intel_display_power_put(dev_priv,  					intel_ddi_main_link_aux_domain(dig_port), @@ -4165,7 +2972,7 @@ void intel_ddi_fdi_post_disable(struct intel_atomic_state *state,  	intel_de_write(dev_priv, FDI_RX_CTL(PIPE_A), val);  	intel_disable_ddi_buf(encoder, old_crtc_state); -	intel_ddi_clk_disable(encoder); +	intel_ddi_disable_clock(encoder);  	val = intel_de_read(dev_priv, FDI_RX_MISC(PIPE_A));  	val &= ~(FDI_RX_PWRDN_LANE1_MASK | FDI_RX_PWRDN_LANE0_MASK); @@ -4228,7 +3035,7 @@ static void intel_enable_ddi_dp(struct intel_atomic_state *state,  	struct intel_digital_port *dig_port = enc_to_dig_port(encoder);  	enum port port = encoder->port; -	if (port == PORT_A && INTEL_GEN(dev_priv) < 9) +	if (port == PORT_A && DISPLAY_VER(dev_priv) < 9)  		intel_dp_stop_link_train(intel_dp, crtc_state);  	intel_edp_backlight_on(crtc_state, conn_state); @@ -4257,7 +3064,7 @@ gen9_chicken_trans_reg_by_port(struct drm_i915_private *dev_priv,  		[PORT_E] = TRANSCODER_A,  	}; -	drm_WARN_ON(&dev_priv->drm, INTEL_GEN(dev_priv) < 9); +	drm_WARN_ON(&dev_priv->drm, DISPLAY_VER(dev_priv) < 9);  	if (drm_WARN_ON(&dev_priv->drm, port < PORT_A || port > PORT_E))  		port = PORT_A; @@ -4273,6 +3080,7 @@ static void intel_enable_ddi_hdmi(struct intel_atomic_state *state,  	struct drm_i915_private *dev_priv = to_i915(encoder->base.dev);  	struct intel_digital_port *dig_port = enc_to_dig_port(encoder);  	struct drm_connector *connector = conn_state->connector; +	int level = intel_ddi_hdmi_level(encoder, crtc_state);  	enum port port = encoder->port;  	if (!intel_hdmi_handle_sink_scrambling(encoder, connector, @@ -4282,6 +3090,20 @@ static void intel_enable_ddi_hdmi(struct intel_atomic_state *state,  			    "[CONNECTOR:%d:%s] Failed to configure sink scrambling/TMDS bit clock ratio\n",  			    connector->base.id, connector->name); +	if (DISPLAY_VER(dev_priv) >= 12) +		tgl_ddi_vswing_sequence(encoder, crtc_state, level); +	else if (IS_DISPLAY_VER(dev_priv, 11)) +		icl_ddi_vswing_sequence(encoder, crtc_state, level); +	else if (IS_CANNONLAKE(dev_priv)) +		cnl_ddi_vswing_sequence(encoder, crtc_state, level); +	else if (IS_GEN9_LP(dev_priv)) +		bxt_ddi_vswing_sequence(encoder, crtc_state, level); +	else +		intel_prepare_hdmi_ddi_buffers(encoder, level); + +	if (IS_GEN9_BC(dev_priv)) +		skl_ddi_set_iboost(encoder, crtc_state, level); +  	/* Display WA #1143: skl,kbl,cfl */  	if (IS_GEN9_BC(dev_priv)) {  		/* @@ -4602,7 +3424,7 @@ static void intel_ddi_set_idle_link_train(struct intel_dp *intel_dp,  	 * In this case there is requirement to wait for a minimum number of  	 * idle patterns to be sent.  	 */ -	if (port == PORT_A && INTEL_GEN(dev_priv) < 12) +	if (port == PORT_A && DISPLAY_VER(dev_priv) < 12)  		return;  	if (intel_de_wait_for_set(dev_priv, @@ -4628,11 +3450,11 @@ static bool intel_ddi_is_audio_enabled(struct drm_i915_private *dev_priv,  void intel_ddi_compute_min_voltage_level(struct drm_i915_private *dev_priv,  					 struct intel_crtc_state *crtc_state)  { -	if (INTEL_GEN(dev_priv) >= 12 && crtc_state->port_clock > 594000) +	if (DISPLAY_VER(dev_priv) >= 12 && crtc_state->port_clock > 594000)  		crtc_state->min_voltage_level = 2;  	else if (IS_JSL_EHL(dev_priv) && crtc_state->port_clock > 594000)  		crtc_state->min_voltage_level = 3; -	else if (INTEL_GEN(dev_priv) >= 11 && crtc_state->port_clock > 594000) +	else if (DISPLAY_VER(dev_priv) >= 11 && crtc_state->port_clock > 594000)  		crtc_state->min_voltage_level = 1;  	else if (IS_CANNONLAKE(dev_priv) && crtc_state->port_clock > 594000)  		crtc_state->min_voltage_level = 2; @@ -4643,7 +3465,7 @@ static enum transcoder bdw_transcoder_master_readout(struct drm_i915_private *de  {  	u32 master_select; -	if (INTEL_GEN(dev_priv) >= 11) { +	if (DISPLAY_VER(dev_priv) >= 11) {  		u32 ctl2 = intel_de_read(dev_priv, TRANS_DDI_FUNC_CTL2(cpu_transcoder));  		if ((ctl2 & PORT_SYNC_MODE_ENABLE) == 0) @@ -4767,7 +3589,7 @@ static void intel_ddi_read_func_ctl(struct intel_encoder *encoder,  			((temp & DDI_PORT_WIDTH_MASK) >> DDI_PORT_WIDTH_SHIFT) + 1;  		intel_dp_get_m_n(intel_crtc, pipe_config); -		if (INTEL_GEN(dev_priv) >= 11) { +		if (DISPLAY_VER(dev_priv) >= 11) {  			i915_reg_t dp_tp_ctl = dp_tp_ctl_reg(encoder, pipe_config);  			pipe_config->fec_enable = @@ -4791,7 +3613,7 @@ static void intel_ddi_read_func_ctl(struct intel_encoder *encoder,  		pipe_config->lane_count =  			((temp & DDI_PORT_WIDTH_MASK) >> DDI_PORT_WIDTH_SHIFT) + 1; -		if (INTEL_GEN(dev_priv) >= 12) +		if (DISPLAY_VER(dev_priv) >= 12)  			pipe_config->mst_master_transcoder =  					REG_FIELD_GET(TRANS_DDI_MST_TRANSPORT_SELECT_MASK, temp); @@ -4805,8 +3627,8 @@ static void intel_ddi_read_func_ctl(struct intel_encoder *encoder,  	}  } -void intel_ddi_get_config(struct intel_encoder *encoder, -			  struct intel_crtc_state *pipe_config) +static void intel_ddi_get_config(struct intel_encoder *encoder, +				 struct intel_crtc_state *pipe_config)  {  	struct drm_i915_private *dev_priv = to_i915(encoder->base.dev);  	enum transcoder cpu_transcoder = pipe_config->cpu_transcoder; @@ -4828,6 +3650,8 @@ void intel_ddi_get_config(struct intel_encoder *encoder,  		intel_ddi_read_func_ctl(encoder, pipe_config);  	} +	intel_ddi_mso_get_config(encoder, pipe_config); +  	pipe_config->has_audio =  		intel_ddi_is_audio_enabled(dev_priv, cpu_transcoder); @@ -4853,7 +3677,7 @@ void intel_ddi_get_config(struct intel_encoder *encoder,  	}  	if (!pipe_config->bigjoiner_slave) -		intel_ddi_clock_get(encoder, pipe_config); +		ddi_dotclock_get(pipe_config);  	if (IS_GEN9_LP(dev_priv))  		pipe_config->lane_lat_optim_mask = @@ -4876,13 +3700,130 @@ void intel_ddi_get_config(struct intel_encoder *encoder,  			     HDMI_INFOFRAME_TYPE_DRM,  			     &pipe_config->infoframes.drm); -	if (INTEL_GEN(dev_priv) >= 8) +	if (DISPLAY_VER(dev_priv) >= 8)  		bdw_get_trans_port_sync_config(pipe_config);  	intel_read_dp_sdp(encoder, pipe_config, HDMI_PACKET_TYPE_GAMUT_METADATA);  	intel_read_dp_sdp(encoder, pipe_config, DP_SDP_VSC);  } +void intel_ddi_get_clock(struct intel_encoder *encoder, +			 struct intel_crtc_state *crtc_state, +			 struct intel_shared_dpll *pll) +{ +	struct drm_i915_private *i915 = to_i915(encoder->base.dev); +	enum icl_port_dpll_id port_dpll_id = ICL_PORT_DPLL_DEFAULT; +	struct icl_port_dpll *port_dpll = &crtc_state->icl_port_dplls[port_dpll_id]; +	bool pll_active; + +	if (drm_WARN_ON(&i915->drm, !pll)) +		return; + +	port_dpll->pll = pll; +	pll_active = intel_dpll_get_hw_state(i915, pll, &port_dpll->hw_state); +	drm_WARN_ON(&i915->drm, !pll_active); + +	icl_set_active_port_dpll(crtc_state, port_dpll_id); + +	crtc_state->port_clock = intel_dpll_get_freq(i915, crtc_state->shared_dpll, +						     &crtc_state->dpll_hw_state); +} + +static void adls_ddi_get_config(struct intel_encoder *encoder, +				struct intel_crtc_state *crtc_state) +{ +	intel_ddi_get_clock(encoder, crtc_state, adls_ddi_get_pll(encoder)); +	intel_ddi_get_config(encoder, crtc_state); +} + +static void rkl_ddi_get_config(struct intel_encoder *encoder, +			       struct intel_crtc_state *crtc_state) +{ +	intel_ddi_get_clock(encoder, crtc_state, rkl_ddi_get_pll(encoder)); +	intel_ddi_get_config(encoder, crtc_state); +} + +static void dg1_ddi_get_config(struct intel_encoder *encoder, +			       struct intel_crtc_state *crtc_state) +{ +	intel_ddi_get_clock(encoder, crtc_state, dg1_ddi_get_pll(encoder)); +	intel_ddi_get_config(encoder, crtc_state); +} + +static void icl_ddi_combo_get_config(struct intel_encoder *encoder, +				     struct intel_crtc_state *crtc_state) +{ +	intel_ddi_get_clock(encoder, crtc_state, icl_ddi_combo_get_pll(encoder)); +	intel_ddi_get_config(encoder, crtc_state); +} + +static void icl_ddi_tc_get_clock(struct intel_encoder *encoder, +				 struct intel_crtc_state *crtc_state, +				 struct intel_shared_dpll *pll) +{ +	struct drm_i915_private *i915 = to_i915(encoder->base.dev); +	enum icl_port_dpll_id port_dpll_id; +	struct icl_port_dpll *port_dpll; +	bool pll_active; + +	if (drm_WARN_ON(&i915->drm, !pll)) +		return; + +	if (intel_get_shared_dpll_id(i915, pll) == DPLL_ID_ICL_TBTPLL) +		port_dpll_id = ICL_PORT_DPLL_DEFAULT; +	else +		port_dpll_id = ICL_PORT_DPLL_MG_PHY; + +	port_dpll = &crtc_state->icl_port_dplls[port_dpll_id]; + +	port_dpll->pll = pll; +	pll_active = intel_dpll_get_hw_state(i915, pll, &port_dpll->hw_state); +	drm_WARN_ON(&i915->drm, !pll_active); + +	icl_set_active_port_dpll(crtc_state, port_dpll_id); + +	if (intel_get_shared_dpll_id(i915, crtc_state->shared_dpll) == DPLL_ID_ICL_TBTPLL) +		crtc_state->port_clock = icl_calc_tbt_pll_link(i915, encoder->port); +	else +		crtc_state->port_clock = intel_dpll_get_freq(i915, crtc_state->shared_dpll, +							     &crtc_state->dpll_hw_state); +} + +static void icl_ddi_tc_get_config(struct intel_encoder *encoder, +				  struct intel_crtc_state *crtc_state) +{ +	icl_ddi_tc_get_clock(encoder, crtc_state, icl_ddi_tc_get_pll(encoder)); +	intel_ddi_get_config(encoder, crtc_state); +} + +static void cnl_ddi_get_config(struct intel_encoder *encoder, +			       struct intel_crtc_state *crtc_state) +{ +	intel_ddi_get_clock(encoder, crtc_state, cnl_ddi_get_pll(encoder)); +	intel_ddi_get_config(encoder, crtc_state); +} + +static void bxt_ddi_get_config(struct intel_encoder *encoder, +			       struct intel_crtc_state *crtc_state) +{ +	intel_ddi_get_clock(encoder, crtc_state, bxt_ddi_get_pll(encoder)); +	intel_ddi_get_config(encoder, crtc_state); +} + +static void skl_ddi_get_config(struct intel_encoder *encoder, +			       struct intel_crtc_state *crtc_state) +{ +	intel_ddi_get_clock(encoder, crtc_state, skl_ddi_get_pll(encoder)); +	intel_ddi_get_config(encoder, crtc_state); +} + +void hsw_ddi_get_config(struct intel_encoder *encoder, +			struct intel_crtc_state *crtc_state) +{ +	intel_ddi_get_clock(encoder, crtc_state, hsw_ddi_get_pll(encoder)); +	intel_ddi_get_config(encoder, crtc_state); +} +  static void intel_ddi_sync_state(struct intel_encoder *encoder,  				 const struct intel_crtc_state *crtc_state)  { @@ -5002,7 +3943,7 @@ intel_ddi_port_sync_transcoders(const struct intel_crtc_state *ref_crtc_state,  	 * We don't enable port sync on BDW due to missing w/as and  	 * due to not having adjusted the modeset sequence appropriately.  	 */ -	if (INTEL_GEN(dev_priv) < 9) +	if (DISPLAY_VER(dev_priv) < 9)  		return 0;  	if (!intel_crtc_has_type(ref_crtc_state, INTEL_OUTPUT_DP)) @@ -5076,8 +4017,17 @@ static void intel_ddi_encoder_destroy(struct drm_encoder *encoder)  	kfree(dig_port);  } +static void intel_ddi_encoder_reset(struct drm_encoder *encoder) +{ +	struct intel_dp *intel_dp = enc_to_intel_dp(to_intel_encoder(encoder)); + +	intel_dp->reset_link_params = true; + +	intel_pps_encoder_reset(intel_dp); +} +  static const struct drm_encoder_funcs intel_ddi_funcs = { -	.reset = intel_dp_encoder_reset, +	.reset = intel_ddi_encoder_reset,  	.destroy = intel_ddi_encoder_destroy,  }; @@ -5097,9 +4047,9 @@ intel_ddi_init_dp_connector(struct intel_digital_port *dig_port)  	dig_port->dp.set_link_train = intel_ddi_set_link_train;  	dig_port->dp.set_idle_link_train = intel_ddi_set_idle_link_train; -	if (INTEL_GEN(dev_priv) >= 12) +	if (DISPLAY_VER(dev_priv) >= 12)  		dig_port->dp.set_signal_levels = tgl_set_signal_levels; -	else if (INTEL_GEN(dev_priv) >= 11) +	else if (DISPLAY_VER(dev_priv) >= 11)  		dig_port->dp.set_signal_levels = icl_set_signal_levels;  	else if (IS_CANNONLAKE(dev_priv))  		dig_port->dp.set_signal_levels = cnl_set_signal_levels; @@ -5368,7 +4318,7 @@ intel_ddi_max_lanes(struct intel_digital_port *dig_port)  	enum port port = dig_port->base.port;  	int max_lanes = 4; -	if (INTEL_GEN(dev_priv) >= 11) +	if (DISPLAY_VER(dev_priv) >= 11)  		return max_lanes;  	if (port == PORT_A || port == PORT_E) { @@ -5460,6 +4410,24 @@ static enum hpd_pin cnl_hpd_pin(struct drm_i915_private *dev_priv,  	return HPD_PORT_A + port - PORT_A;  } +static enum hpd_pin skl_hpd_pin(struct drm_i915_private *dev_priv, enum port port) +{ +	if (HAS_PCH_TGP(dev_priv)) +		return icl_hpd_pin(dev_priv, port); + +	return HPD_PORT_A + port - PORT_A; +} + +static bool intel_ddi_is_tc(struct drm_i915_private *i915, enum port port) +{ +	if (DISPLAY_VER(i915) >= 12) +		return port >= PORT_TC1; +	else if (DISPLAY_VER(i915) >= 11) +		return port >= PORT_C; +	else +		return false; +} +  #define port_tc_name(port) ((port) - PORT_TC1 + '1')  #define tc_port_name(tc_port) ((tc_port) - TC_PORT_1 + '1') @@ -5467,6 +4435,7 @@ void intel_ddi_init(struct drm_i915_private *dev_priv, enum port port)  {  	struct intel_digital_port *dig_port;  	struct intel_encoder *encoder; +	const struct intel_bios_encoder_data *devdata;  	bool init_hdmi, init_dp;  	enum phy phy = intel_port_to_phy(dev_priv, port); @@ -5482,9 +4451,17 @@ void intel_ddi_init(struct drm_i915_private *dev_priv, enum port port)  		return;  	} -	init_hdmi = intel_bios_port_supports_dvi(dev_priv, port) || -		intel_bios_port_supports_hdmi(dev_priv, port); -	init_dp = intel_bios_port_supports_dp(dev_priv, port); +	devdata = intel_bios_encoder_data_lookup(dev_priv, port); +	if (!devdata) { +		drm_dbg_kms(&dev_priv->drm, +			    "VBT says port %c is not present\n", +			    port_name(port)); +		return; +	} + +	init_hdmi = intel_bios_encoder_supports_dvi(devdata) || +		intel_bios_encoder_supports_hdmi(devdata); +	init_dp = intel_bios_encoder_supports_dp(devdata);  	if (intel_bios_is_lspcon_present(dev_priv, port)) {  		/* @@ -5510,8 +4487,9 @@ void intel_ddi_init(struct drm_i915_private *dev_priv, enum port port)  		return;  	encoder = &dig_port->base; +	encoder->devdata = devdata; -	if (INTEL_GEN(dev_priv) >= 12) { +	if (DISPLAY_VER(dev_priv) >= 12) {  		enum tc_port tc_port = intel_port_to_tc(dev_priv, port);  		drm_encoder_init(&dev_priv->drm, &encoder->base, &intel_ddi_funcs, @@ -5521,7 +4499,7 @@ void intel_ddi_init(struct drm_i915_private *dev_priv, enum port port)  				 port >= PORT_TC1 ? port_tc_name(port) : port_name(port),  				 tc_port != TC_PORT_NONE ? "TC" : "",  				 tc_port != TC_PORT_NONE ? tc_port_name(tc_port) : phy_name(phy)); -	} else if (INTEL_GEN(dev_priv) >= 11) { +	} else if (DISPLAY_VER(dev_priv) >= 11) {  		enum tc_port tc_port = intel_port_to_tc(dev_priv, port);  		drm_encoder_init(&dev_priv->drm, &encoder->base, &intel_ddi_funcs, @@ -5551,7 +4529,6 @@ void intel_ddi_init(struct drm_i915_private *dev_priv, enum port port)  	encoder->post_disable = intel_ddi_post_disable;  	encoder->update_pipe = intel_ddi_update_pipe;  	encoder->get_hw_state = intel_ddi_get_hw_state; -	encoder->get_config = intel_ddi_get_config;  	encoder->sync_state = intel_ddi_sync_state;  	encoder->initial_fastset_check = intel_ddi_initial_fastset_check;  	encoder->suspend = intel_dp_encoder_suspend; @@ -5564,22 +4541,83 @@ void intel_ddi_init(struct drm_i915_private *dev_priv, enum port port)  	encoder->cloneable = 0;  	encoder->pipe_mask = ~0; +	if (IS_ALDERLAKE_S(dev_priv)) { +		encoder->enable_clock = adls_ddi_enable_clock; +		encoder->disable_clock = adls_ddi_disable_clock; +		encoder->is_clock_enabled = adls_ddi_is_clock_enabled; +		encoder->get_config = adls_ddi_get_config; +	} else if (IS_ROCKETLAKE(dev_priv)) { +		encoder->enable_clock = rkl_ddi_enable_clock; +		encoder->disable_clock = rkl_ddi_disable_clock; +		encoder->is_clock_enabled = rkl_ddi_is_clock_enabled; +		encoder->get_config = rkl_ddi_get_config; +	} else if (IS_DG1(dev_priv)) { +		encoder->enable_clock = dg1_ddi_enable_clock; +		encoder->disable_clock = dg1_ddi_disable_clock; +		encoder->is_clock_enabled = dg1_ddi_is_clock_enabled; +		encoder->get_config = dg1_ddi_get_config; +	} else if (IS_JSL_EHL(dev_priv)) { +		if (intel_ddi_is_tc(dev_priv, port)) { +			encoder->enable_clock = jsl_ddi_tc_enable_clock; +			encoder->disable_clock = jsl_ddi_tc_disable_clock; +			encoder->is_clock_enabled = jsl_ddi_tc_is_clock_enabled; +			encoder->get_config = icl_ddi_combo_get_config; +		} else { +			encoder->enable_clock = icl_ddi_combo_enable_clock; +			encoder->disable_clock = icl_ddi_combo_disable_clock; +			encoder->is_clock_enabled = icl_ddi_combo_is_clock_enabled; +			encoder->get_config = icl_ddi_combo_get_config; +		} +	} else if (DISPLAY_VER(dev_priv) >= 11) { +		if (intel_ddi_is_tc(dev_priv, port)) { +			encoder->enable_clock = icl_ddi_tc_enable_clock; +			encoder->disable_clock = icl_ddi_tc_disable_clock; +			encoder->is_clock_enabled = icl_ddi_tc_is_clock_enabled; +			encoder->get_config = icl_ddi_tc_get_config; +		} else { +			encoder->enable_clock = icl_ddi_combo_enable_clock; +			encoder->disable_clock = icl_ddi_combo_disable_clock; +			encoder->is_clock_enabled = icl_ddi_combo_is_clock_enabled; +			encoder->get_config = icl_ddi_combo_get_config; +		} +	} else if (IS_CANNONLAKE(dev_priv)) { +		encoder->enable_clock = cnl_ddi_enable_clock; +		encoder->disable_clock = cnl_ddi_disable_clock; +		encoder->is_clock_enabled = cnl_ddi_is_clock_enabled; +		encoder->get_config = cnl_ddi_get_config; +	} else if (IS_GEN9_LP(dev_priv)) { +		/* BXT/GLK have fixed PLL->port mapping */ +		encoder->get_config = bxt_ddi_get_config; +	} else if (IS_GEN9_BC(dev_priv)) { +		encoder->enable_clock = skl_ddi_enable_clock; +		encoder->disable_clock = skl_ddi_disable_clock; +		encoder->is_clock_enabled = skl_ddi_is_clock_enabled; +		encoder->get_config = skl_ddi_get_config; +	} else if (IS_BROADWELL(dev_priv) || IS_HASWELL(dev_priv)) { +		encoder->enable_clock = hsw_ddi_enable_clock; +		encoder->disable_clock = hsw_ddi_disable_clock; +		encoder->is_clock_enabled = hsw_ddi_is_clock_enabled; +		encoder->get_config = hsw_ddi_get_config; +	} +  	if (IS_DG1(dev_priv))  		encoder->hpd_pin = dg1_hpd_pin(dev_priv, port);  	else if (IS_ROCKETLAKE(dev_priv))  		encoder->hpd_pin = rkl_hpd_pin(dev_priv, port); -	else if (INTEL_GEN(dev_priv) >= 12) +	else if (DISPLAY_VER(dev_priv) >= 12)  		encoder->hpd_pin = tgl_hpd_pin(dev_priv, port);  	else if (IS_JSL_EHL(dev_priv))  		encoder->hpd_pin = ehl_hpd_pin(dev_priv, port); -	else if (IS_GEN(dev_priv, 11)) +	else if (IS_DISPLAY_VER(dev_priv, 11))  		encoder->hpd_pin = icl_hpd_pin(dev_priv, port); -	else if (IS_GEN(dev_priv, 10)) +	else if (IS_DISPLAY_VER(dev_priv, 10))  		encoder->hpd_pin = cnl_hpd_pin(dev_priv, port); +	else if (IS_DISPLAY_VER(dev_priv, 9)) +		encoder->hpd_pin = skl_hpd_pin(dev_priv, port);  	else  		encoder->hpd_pin = intel_hpd_pin_default(dev_priv, port); -	if (INTEL_GEN(dev_priv) >= 11) +	if (DISPLAY_VER(dev_priv) >= 11)  		dig_port->saved_port_bits =  			intel_de_read(dev_priv, DDI_BUF_CTL(port))  			& DDI_BUF_PORT_REVERSAL; @@ -5588,14 +4626,17 @@ void intel_ddi_init(struct drm_i915_private *dev_priv, enum port port)  			intel_de_read(dev_priv, DDI_BUF_CTL(port))  			& (DDI_BUF_PORT_REVERSAL | DDI_A_4_LANES); +	if (intel_bios_is_lane_reversal_needed(dev_priv, port)) +		dig_port->saved_port_bits |= DDI_BUF_PORT_REVERSAL; +  	dig_port->dp.output_reg = INVALID_MMIO_REG;  	dig_port->max_lanes = intel_ddi_max_lanes(dig_port);  	dig_port->aux_ch = intel_bios_port_aux_ch(dev_priv, port);  	if (intel_phy_is_tc(dev_priv, phy)) {  		bool is_legacy = -			!intel_bios_port_supports_typec_usb(dev_priv, port) && -			!intel_bios_port_supports_tbt(dev_priv, port); +			!intel_bios_encoder_supports_typec_usb(devdata) && +			!intel_bios_encoder_supports_tbt(devdata);  		intel_tc_port_init(dig_port, is_legacy); @@ -5612,6 +4653,10 @@ void intel_ddi_init(struct drm_i915_private *dev_priv, enum port port)  			goto err;  		dig_port->hpd_pulse = intel_dp_hpd_pulse; + +		/* Splitter enable for eDP MSO is supported for pipe A only. */ +		if (dig_port->dp.mso_link_count) +			encoder->pipe_mask = BIT(PIPE_A);  	}  	/* In theory we don't need the encoder->type check, but leave it just in @@ -5621,12 +4666,12 @@ void intel_ddi_init(struct drm_i915_private *dev_priv, enum port port)  			goto err;  	} -	if (INTEL_GEN(dev_priv) >= 11) { +	if (DISPLAY_VER(dev_priv) >= 11) {  		if (intel_phy_is_tc(dev_priv, phy))  			dig_port->connected = intel_tc_port_connected;  		else  			dig_port->connected = lpt_digital_port_connected; -	} else if (INTEL_GEN(dev_priv) >= 8) { +	} else if (DISPLAY_VER(dev_priv) >= 8) {  		if (port == PORT_A || IS_GEN9_LP(dev_priv))  			dig_port->connected = bdw_digital_port_connected;  		else | 
