xref: /openbsd-src/sys/dev/pci/drm/i915/display/intel_dpio_phy.c (revision f005ef32267c16bdb134f0e9fa4477dbe07c263a)
1c349dbc7Sjsg /*
2c349dbc7Sjsg  * Copyright © 2014-2016 Intel Corporation
3c349dbc7Sjsg  *
4c349dbc7Sjsg  * Permission is hereby granted, free of charge, to any person obtaining a
5c349dbc7Sjsg  * copy of this software and associated documentation files (the "Software"),
6c349dbc7Sjsg  * to deal in the Software without restriction, including without limitation
7c349dbc7Sjsg  * the rights to use, copy, modify, merge, publish, distribute, sublicense,
8c349dbc7Sjsg  * and/or sell copies of the Software, and to permit persons to whom the
9c349dbc7Sjsg  * Software is furnished to do so, subject to the following conditions:
10c349dbc7Sjsg  *
11c349dbc7Sjsg  * The above copyright notice and this permission notice (including the next
12c349dbc7Sjsg  * paragraph) shall be included in all copies or substantial portions of the
13c349dbc7Sjsg  * Software.
14c349dbc7Sjsg  *
15c349dbc7Sjsg  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16c349dbc7Sjsg  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17c349dbc7Sjsg  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
18c349dbc7Sjsg  * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19c349dbc7Sjsg  * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
20c349dbc7Sjsg  * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
21c349dbc7Sjsg  * DEALINGS IN THE SOFTWARE.
22c349dbc7Sjsg  */
23c349dbc7Sjsg 
24*f005ef32Sjsg #include "i915_reg.h"
251bb76ff1Sjsg #include "intel_ddi.h"
261bb76ff1Sjsg #include "intel_ddi_buf_trans.h"
275ca02815Sjsg #include "intel_de.h"
281bb76ff1Sjsg #include "intel_display_power_well.h"
29c349dbc7Sjsg #include "intel_display_types.h"
301bb76ff1Sjsg #include "intel_dp.h"
31c349dbc7Sjsg #include "intel_dpio_phy.h"
321bb76ff1Sjsg #include "vlv_sideband.h"
33c349dbc7Sjsg 
34c349dbc7Sjsg /**
35c349dbc7Sjsg  * DOC: DPIO
36c349dbc7Sjsg  *
37c349dbc7Sjsg  * VLV, CHV and BXT have slightly peculiar display PHYs for driving DP/HDMI
38c349dbc7Sjsg  * ports. DPIO is the name given to such a display PHY. These PHYs
39c349dbc7Sjsg  * don't follow the standard programming model using direct MMIO
40c349dbc7Sjsg  * registers, and instead their registers must be accessed trough IOSF
41c349dbc7Sjsg  * sideband. VLV has one such PHY for driving ports B and C, and CHV
42c349dbc7Sjsg  * adds another PHY for driving port D. Each PHY responds to specific
43c349dbc7Sjsg  * IOSF-SB port.
44c349dbc7Sjsg  *
45c349dbc7Sjsg  * Each display PHY is made up of one or two channels. Each channel
46c349dbc7Sjsg  * houses a common lane part which contains the PLL and other common
47c349dbc7Sjsg  * logic. CH0 common lane also contains the IOSF-SB logic for the
48c349dbc7Sjsg  * Common Register Interface (CRI) ie. the DPIO registers. CRI clock
49c349dbc7Sjsg  * must be running when any DPIO registers are accessed.
50c349dbc7Sjsg  *
51c349dbc7Sjsg  * In addition to having their own registers, the PHYs are also
52c349dbc7Sjsg  * controlled through some dedicated signals from the display
53c349dbc7Sjsg  * controller. These include PLL reference clock enable, PLL enable,
54c349dbc7Sjsg  * and CRI clock selection, for example.
55c349dbc7Sjsg  *
56c349dbc7Sjsg  * Eeach channel also has two splines (also called data lanes), and
57c349dbc7Sjsg  * each spline is made up of one Physical Access Coding Sub-Layer
58c349dbc7Sjsg  * (PCS) block and two TX lanes. So each channel has two PCS blocks
59c349dbc7Sjsg  * and four TX lanes. The TX lanes are used as DP lanes or TMDS
60c349dbc7Sjsg  * data/clock pairs depending on the output type.
61c349dbc7Sjsg  *
62c349dbc7Sjsg  * Additionally the PHY also contains an AUX lane with AUX blocks
63c349dbc7Sjsg  * for each channel. This is used for DP AUX communication, but
64c349dbc7Sjsg  * this fact isn't really relevant for the driver since AUX is
65c349dbc7Sjsg  * controlled from the display controller side. No DPIO registers
66c349dbc7Sjsg  * need to be accessed during AUX communication,
67c349dbc7Sjsg  *
68c349dbc7Sjsg  * Generally on VLV/CHV the common lane corresponds to the pipe and
69c349dbc7Sjsg  * the spline (PCS/TX) corresponds to the port.
70c349dbc7Sjsg  *
71c349dbc7Sjsg  * For dual channel PHY (VLV/CHV):
72c349dbc7Sjsg  *
73c349dbc7Sjsg  *  pipe A == CMN/PLL/REF CH0
74c349dbc7Sjsg  *
75c349dbc7Sjsg  *  pipe B == CMN/PLL/REF CH1
76c349dbc7Sjsg  *
77c349dbc7Sjsg  *  port B == PCS/TX CH0
78c349dbc7Sjsg  *
79c349dbc7Sjsg  *  port C == PCS/TX CH1
80c349dbc7Sjsg  *
81c349dbc7Sjsg  * This is especially important when we cross the streams
82c349dbc7Sjsg  * ie. drive port B with pipe B, or port C with pipe A.
83c349dbc7Sjsg  *
84c349dbc7Sjsg  * For single channel PHY (CHV):
85c349dbc7Sjsg  *
86c349dbc7Sjsg  *  pipe C == CMN/PLL/REF CH0
87c349dbc7Sjsg  *
88c349dbc7Sjsg  *  port D == PCS/TX CH0
89c349dbc7Sjsg  *
90c349dbc7Sjsg  * On BXT the entire PHY channel corresponds to the port. That means
91c349dbc7Sjsg  * the PLL is also now associated with the port rather than the pipe,
92c349dbc7Sjsg  * and so the clock needs to be routed to the appropriate transcoder.
93c349dbc7Sjsg  * Port A PLL is directly connected to transcoder EDP and port B/C
94c349dbc7Sjsg  * PLLs can be routed to any transcoder A/B/C.
95c349dbc7Sjsg  *
96c349dbc7Sjsg  * Note: DDI0 is digital port B, DD1 is digital port C, and DDI2 is
97c349dbc7Sjsg  * digital port D (CHV) or port A (BXT). ::
98c349dbc7Sjsg  *
99c349dbc7Sjsg  *
100c349dbc7Sjsg  *     Dual channel PHY (VLV/CHV/BXT)
101c349dbc7Sjsg  *     ---------------------------------
102c349dbc7Sjsg  *     |      CH0      |      CH1      |
103c349dbc7Sjsg  *     |  CMN/PLL/REF  |  CMN/PLL/REF  |
104c349dbc7Sjsg  *     |---------------|---------------| Display PHY
105c349dbc7Sjsg  *     | PCS01 | PCS23 | PCS01 | PCS23 |
106c349dbc7Sjsg  *     |-------|-------|-------|-------|
107c349dbc7Sjsg  *     |TX0|TX1|TX2|TX3|TX0|TX1|TX2|TX3|
108c349dbc7Sjsg  *     ---------------------------------
109c349dbc7Sjsg  *     |     DDI0      |     DDI1      | DP/HDMI ports
110c349dbc7Sjsg  *     ---------------------------------
111c349dbc7Sjsg  *
112c349dbc7Sjsg  *     Single channel PHY (CHV/BXT)
113c349dbc7Sjsg  *     -----------------
114c349dbc7Sjsg  *     |      CH0      |
115c349dbc7Sjsg  *     |  CMN/PLL/REF  |
116c349dbc7Sjsg  *     |---------------| Display PHY
117c349dbc7Sjsg  *     | PCS01 | PCS23 |
118c349dbc7Sjsg  *     |-------|-------|
119c349dbc7Sjsg  *     |TX0|TX1|TX2|TX3|
120c349dbc7Sjsg  *     -----------------
121c349dbc7Sjsg  *     |     DDI2      | DP/HDMI port
122c349dbc7Sjsg  *     -----------------
123c349dbc7Sjsg  */
124c349dbc7Sjsg 
125c349dbc7Sjsg /**
126c349dbc7Sjsg  * struct bxt_ddi_phy_info - Hold info for a broxton DDI phy
127c349dbc7Sjsg  */
128c349dbc7Sjsg struct bxt_ddi_phy_info {
129c349dbc7Sjsg 	/**
130c349dbc7Sjsg 	 * @dual_channel: true if this phy has a second channel.
131c349dbc7Sjsg 	 */
132c349dbc7Sjsg 	bool dual_channel;
133c349dbc7Sjsg 
134c349dbc7Sjsg 	/**
135c349dbc7Sjsg 	 * @rcomp_phy: If -1, indicates this phy has its own rcomp resistor.
136c349dbc7Sjsg 	 * Otherwise the GRC value will be copied from the phy indicated by
137c349dbc7Sjsg 	 * this field.
138c349dbc7Sjsg 	 */
139c349dbc7Sjsg 	enum dpio_phy rcomp_phy;
140c349dbc7Sjsg 
141c349dbc7Sjsg 	/**
142c349dbc7Sjsg 	 * @reset_delay: delay in us to wait before setting the common reset
143c349dbc7Sjsg 	 * bit in BXT_PHY_CTL_FAMILY, which effectively enables the phy.
144c349dbc7Sjsg 	 */
145c349dbc7Sjsg 	int reset_delay;
146c349dbc7Sjsg 
147c349dbc7Sjsg 	/**
148c349dbc7Sjsg 	 * @pwron_mask: Mask with the appropriate bit set that would cause the
149c349dbc7Sjsg 	 * punit to power this phy if written to BXT_P_CR_GT_DISP_PWRON.
150c349dbc7Sjsg 	 */
151c349dbc7Sjsg 	u32 pwron_mask;
152c349dbc7Sjsg 
153c349dbc7Sjsg 	/**
154c349dbc7Sjsg 	 * @channel: struct containing per channel information.
155c349dbc7Sjsg 	 */
156c349dbc7Sjsg 	struct {
157c349dbc7Sjsg 		/**
158c349dbc7Sjsg 		 * @channel.port: which port maps to this channel.
159c349dbc7Sjsg 		 */
160c349dbc7Sjsg 		enum port port;
161c349dbc7Sjsg 	} channel[2];
162c349dbc7Sjsg };
163c349dbc7Sjsg 
164c349dbc7Sjsg static const struct bxt_ddi_phy_info bxt_ddi_phy_info[] = {
165c349dbc7Sjsg 	[DPIO_PHY0] = {
166c349dbc7Sjsg 		.dual_channel = true,
167c349dbc7Sjsg 		.rcomp_phy = DPIO_PHY1,
168c349dbc7Sjsg 		.pwron_mask = BIT(0),
169c349dbc7Sjsg 
170c349dbc7Sjsg 		.channel = {
171c349dbc7Sjsg 			[DPIO_CH0] = { .port = PORT_B },
172c349dbc7Sjsg 			[DPIO_CH1] = { .port = PORT_C },
173c349dbc7Sjsg 		}
174c349dbc7Sjsg 	},
175c349dbc7Sjsg 	[DPIO_PHY1] = {
176c349dbc7Sjsg 		.dual_channel = false,
177c349dbc7Sjsg 		.rcomp_phy = -1,
178c349dbc7Sjsg 		.pwron_mask = BIT(1),
179c349dbc7Sjsg 
180c349dbc7Sjsg 		.channel = {
181c349dbc7Sjsg 			[DPIO_CH0] = { .port = PORT_A },
182c349dbc7Sjsg 		}
183c349dbc7Sjsg 	},
184c349dbc7Sjsg };
185c349dbc7Sjsg 
186c349dbc7Sjsg static const struct bxt_ddi_phy_info glk_ddi_phy_info[] = {
187c349dbc7Sjsg 	[DPIO_PHY0] = {
188c349dbc7Sjsg 		.dual_channel = false,
189c349dbc7Sjsg 		.rcomp_phy = DPIO_PHY1,
190c349dbc7Sjsg 		.pwron_mask = BIT(0),
191c349dbc7Sjsg 		.reset_delay = 20,
192c349dbc7Sjsg 
193c349dbc7Sjsg 		.channel = {
194c349dbc7Sjsg 			[DPIO_CH0] = { .port = PORT_B },
195c349dbc7Sjsg 		}
196c349dbc7Sjsg 	},
197c349dbc7Sjsg 	[DPIO_PHY1] = {
198c349dbc7Sjsg 		.dual_channel = false,
199c349dbc7Sjsg 		.rcomp_phy = -1,
200c349dbc7Sjsg 		.pwron_mask = BIT(3),
201c349dbc7Sjsg 		.reset_delay = 20,
202c349dbc7Sjsg 
203c349dbc7Sjsg 		.channel = {
204c349dbc7Sjsg 			[DPIO_CH0] = { .port = PORT_A },
205c349dbc7Sjsg 		}
206c349dbc7Sjsg 	},
207c349dbc7Sjsg 	[DPIO_PHY2] = {
208c349dbc7Sjsg 		.dual_channel = false,
209c349dbc7Sjsg 		.rcomp_phy = DPIO_PHY1,
210c349dbc7Sjsg 		.pwron_mask = BIT(1),
211c349dbc7Sjsg 		.reset_delay = 20,
212c349dbc7Sjsg 
213c349dbc7Sjsg 		.channel = {
214c349dbc7Sjsg 			[DPIO_CH0] = { .port = PORT_C },
215c349dbc7Sjsg 		}
216c349dbc7Sjsg 	},
217c349dbc7Sjsg };
218c349dbc7Sjsg 
219c349dbc7Sjsg static const struct bxt_ddi_phy_info *
bxt_get_phy_list(struct drm_i915_private * dev_priv,int * count)220c349dbc7Sjsg bxt_get_phy_list(struct drm_i915_private *dev_priv, int *count)
221c349dbc7Sjsg {
222c349dbc7Sjsg 	if (IS_GEMINILAKE(dev_priv)) {
223c349dbc7Sjsg 		*count =  ARRAY_SIZE(glk_ddi_phy_info);
224c349dbc7Sjsg 		return glk_ddi_phy_info;
225c349dbc7Sjsg 	} else {
226c349dbc7Sjsg 		*count =  ARRAY_SIZE(bxt_ddi_phy_info);
227c349dbc7Sjsg 		return bxt_ddi_phy_info;
228c349dbc7Sjsg 	}
229c349dbc7Sjsg }
230c349dbc7Sjsg 
231c349dbc7Sjsg static const struct bxt_ddi_phy_info *
bxt_get_phy_info(struct drm_i915_private * dev_priv,enum dpio_phy phy)232c349dbc7Sjsg bxt_get_phy_info(struct drm_i915_private *dev_priv, enum dpio_phy phy)
233c349dbc7Sjsg {
234c349dbc7Sjsg 	int count;
235c349dbc7Sjsg 	const struct bxt_ddi_phy_info *phy_list =
236c349dbc7Sjsg 		bxt_get_phy_list(dev_priv, &count);
237c349dbc7Sjsg 
238c349dbc7Sjsg 	return &phy_list[phy];
239c349dbc7Sjsg }
240c349dbc7Sjsg 
bxt_port_to_phy_channel(struct drm_i915_private * dev_priv,enum port port,enum dpio_phy * phy,enum dpio_channel * ch)241c349dbc7Sjsg void bxt_port_to_phy_channel(struct drm_i915_private *dev_priv, enum port port,
242c349dbc7Sjsg 			     enum dpio_phy *phy, enum dpio_channel *ch)
243c349dbc7Sjsg {
244c349dbc7Sjsg 	const struct bxt_ddi_phy_info *phy_info, *phys;
245c349dbc7Sjsg 	int i, count;
246c349dbc7Sjsg 
247c349dbc7Sjsg 	phys = bxt_get_phy_list(dev_priv, &count);
248c349dbc7Sjsg 
249c349dbc7Sjsg 	for (i = 0; i < count; i++) {
250c349dbc7Sjsg 		phy_info = &phys[i];
251c349dbc7Sjsg 
252c349dbc7Sjsg 		if (port == phy_info->channel[DPIO_CH0].port) {
253c349dbc7Sjsg 			*phy = i;
254c349dbc7Sjsg 			*ch = DPIO_CH0;
255c349dbc7Sjsg 			return;
256c349dbc7Sjsg 		}
257c349dbc7Sjsg 
258c349dbc7Sjsg 		if (phy_info->dual_channel &&
259c349dbc7Sjsg 		    port == phy_info->channel[DPIO_CH1].port) {
260c349dbc7Sjsg 			*phy = i;
261c349dbc7Sjsg 			*ch = DPIO_CH1;
262c349dbc7Sjsg 			return;
263c349dbc7Sjsg 		}
264c349dbc7Sjsg 	}
265c349dbc7Sjsg 
266c349dbc7Sjsg 	drm_WARN(&dev_priv->drm, 1, "PHY not found for PORT %c",
267c349dbc7Sjsg 		 port_name(port));
268c349dbc7Sjsg 	*phy = DPIO_PHY0;
269c349dbc7Sjsg 	*ch = DPIO_CH0;
270c349dbc7Sjsg }
271c349dbc7Sjsg 
bxt_ddi_phy_set_signal_levels(struct intel_encoder * encoder,const struct intel_crtc_state * crtc_state)2721bb76ff1Sjsg void bxt_ddi_phy_set_signal_levels(struct intel_encoder *encoder,
2731bb76ff1Sjsg 				   const struct intel_crtc_state *crtc_state)
274c349dbc7Sjsg {
2751bb76ff1Sjsg 	struct drm_i915_private *dev_priv = to_i915(encoder->base.dev);
2761bb76ff1Sjsg 	int level = intel_ddi_level(encoder, crtc_state, 0);
2771bb76ff1Sjsg 	const struct intel_ddi_buf_trans *trans;
278c349dbc7Sjsg 	enum dpio_channel ch;
2791bb76ff1Sjsg 	enum dpio_phy phy;
2801bb76ff1Sjsg 	int n_entries;
2811bb76ff1Sjsg 	u32 val;
282c349dbc7Sjsg 
2831bb76ff1Sjsg 	trans = encoder->get_buf_trans(encoder, crtc_state, &n_entries);
2841bb76ff1Sjsg 	if (drm_WARN_ON_ONCE(&dev_priv->drm, !trans))
2851bb76ff1Sjsg 		return;
2861bb76ff1Sjsg 
2871bb76ff1Sjsg 	bxt_port_to_phy_channel(dev_priv, encoder->port, &phy, &ch);
288c349dbc7Sjsg 
289c349dbc7Sjsg 	/*
290c349dbc7Sjsg 	 * While we write to the group register to program all lanes at once we
291c349dbc7Sjsg 	 * can read only lane registers and we pick lanes 0/1 for that.
292c349dbc7Sjsg 	 */
293c349dbc7Sjsg 	val = intel_de_read(dev_priv, BXT_PORT_PCS_DW10_LN01(phy, ch));
294c349dbc7Sjsg 	val &= ~(TX2_SWING_CALC_INIT | TX1_SWING_CALC_INIT);
295c349dbc7Sjsg 	intel_de_write(dev_priv, BXT_PORT_PCS_DW10_GRP(phy, ch), val);
296c349dbc7Sjsg 
297c349dbc7Sjsg 	val = intel_de_read(dev_priv, BXT_PORT_TX_DW2_LN0(phy, ch));
298c349dbc7Sjsg 	val &= ~(MARGIN_000 | UNIQ_TRANS_SCALE);
2991bb76ff1Sjsg 	val |= trans->entries[level].bxt.margin << MARGIN_000_SHIFT |
3001bb76ff1Sjsg 		trans->entries[level].bxt.scale << UNIQ_TRANS_SCALE_SHIFT;
301c349dbc7Sjsg 	intel_de_write(dev_priv, BXT_PORT_TX_DW2_GRP(phy, ch), val);
302c349dbc7Sjsg 
303c349dbc7Sjsg 	val = intel_de_read(dev_priv, BXT_PORT_TX_DW3_LN0(phy, ch));
304c349dbc7Sjsg 	val &= ~SCALE_DCOMP_METHOD;
3051bb76ff1Sjsg 	if (trans->entries[level].bxt.enable)
306c349dbc7Sjsg 		val |= SCALE_DCOMP_METHOD;
307c349dbc7Sjsg 
308c349dbc7Sjsg 	if ((val & UNIQUE_TRANGE_EN_METHOD) && !(val & SCALE_DCOMP_METHOD))
309c349dbc7Sjsg 		drm_err(&dev_priv->drm,
310c349dbc7Sjsg 			"Disabled scaling while ouniqetrangenmethod was set");
311c349dbc7Sjsg 
312c349dbc7Sjsg 	intel_de_write(dev_priv, BXT_PORT_TX_DW3_GRP(phy, ch), val);
313c349dbc7Sjsg 
314c349dbc7Sjsg 	val = intel_de_read(dev_priv, BXT_PORT_TX_DW4_LN0(phy, ch));
315c349dbc7Sjsg 	val &= ~DE_EMPHASIS;
3161bb76ff1Sjsg 	val |= trans->entries[level].bxt.deemphasis << DEEMPH_SHIFT;
317c349dbc7Sjsg 	intel_de_write(dev_priv, BXT_PORT_TX_DW4_GRP(phy, ch), val);
318c349dbc7Sjsg 
319c349dbc7Sjsg 	val = intel_de_read(dev_priv, BXT_PORT_PCS_DW10_LN01(phy, ch));
320c349dbc7Sjsg 	val |= TX2_SWING_CALC_INIT | TX1_SWING_CALC_INIT;
321c349dbc7Sjsg 	intel_de_write(dev_priv, BXT_PORT_PCS_DW10_GRP(phy, ch), val);
322c349dbc7Sjsg }
323c349dbc7Sjsg 
bxt_ddi_phy_is_enabled(struct drm_i915_private * dev_priv,enum dpio_phy phy)324c349dbc7Sjsg bool bxt_ddi_phy_is_enabled(struct drm_i915_private *dev_priv,
325c349dbc7Sjsg 			    enum dpio_phy phy)
326c349dbc7Sjsg {
327c349dbc7Sjsg 	const struct bxt_ddi_phy_info *phy_info;
328c349dbc7Sjsg 
329c349dbc7Sjsg 	phy_info = bxt_get_phy_info(dev_priv, phy);
330c349dbc7Sjsg 
331c349dbc7Sjsg 	if (!(intel_de_read(dev_priv, BXT_P_CR_GT_DISP_PWRON) & phy_info->pwron_mask))
332c349dbc7Sjsg 		return false;
333c349dbc7Sjsg 
334c349dbc7Sjsg 	if ((intel_de_read(dev_priv, BXT_PORT_CL1CM_DW0(phy)) &
335c349dbc7Sjsg 	     (PHY_POWER_GOOD | PHY_RESERVED)) != PHY_POWER_GOOD) {
336c349dbc7Sjsg 		drm_dbg(&dev_priv->drm,
337c349dbc7Sjsg 			"DDI PHY %d powered, but power hasn't settled\n", phy);
338c349dbc7Sjsg 
339c349dbc7Sjsg 		return false;
340c349dbc7Sjsg 	}
341c349dbc7Sjsg 
342c349dbc7Sjsg 	if (!(intel_de_read(dev_priv, BXT_PHY_CTL_FAMILY(phy)) & COMMON_RESET_DIS)) {
343c349dbc7Sjsg 		drm_dbg(&dev_priv->drm,
344c349dbc7Sjsg 			"DDI PHY %d powered, but still in reset\n", phy);
345c349dbc7Sjsg 
346c349dbc7Sjsg 		return false;
347c349dbc7Sjsg 	}
348c349dbc7Sjsg 
349c349dbc7Sjsg 	return true;
350c349dbc7Sjsg }
351c349dbc7Sjsg 
bxt_get_grc(struct drm_i915_private * dev_priv,enum dpio_phy phy)352c349dbc7Sjsg static u32 bxt_get_grc(struct drm_i915_private *dev_priv, enum dpio_phy phy)
353c349dbc7Sjsg {
354c349dbc7Sjsg 	u32 val = intel_de_read(dev_priv, BXT_PORT_REF_DW6(phy));
355c349dbc7Sjsg 
356c349dbc7Sjsg 	return (val & GRC_CODE_MASK) >> GRC_CODE_SHIFT;
357c349dbc7Sjsg }
358c349dbc7Sjsg 
bxt_phy_wait_grc_done(struct drm_i915_private * dev_priv,enum dpio_phy phy)359c349dbc7Sjsg static void bxt_phy_wait_grc_done(struct drm_i915_private *dev_priv,
360c349dbc7Sjsg 				  enum dpio_phy phy)
361c349dbc7Sjsg {
362c349dbc7Sjsg 	if (intel_de_wait_for_set(dev_priv, BXT_PORT_REF_DW3(phy),
363c349dbc7Sjsg 				  GRC_DONE, 10))
364c349dbc7Sjsg 		drm_err(&dev_priv->drm, "timeout waiting for PHY%d GRC\n",
365c349dbc7Sjsg 			phy);
366c349dbc7Sjsg }
367c349dbc7Sjsg 
_bxt_ddi_phy_init(struct drm_i915_private * dev_priv,enum dpio_phy phy)368c349dbc7Sjsg static void _bxt_ddi_phy_init(struct drm_i915_private *dev_priv,
369c349dbc7Sjsg 			      enum dpio_phy phy)
370c349dbc7Sjsg {
371c349dbc7Sjsg 	const struct bxt_ddi_phy_info *phy_info;
372c349dbc7Sjsg 	u32 val;
373c349dbc7Sjsg 
374c349dbc7Sjsg 	phy_info = bxt_get_phy_info(dev_priv, phy);
375c349dbc7Sjsg 
376c349dbc7Sjsg 	if (bxt_ddi_phy_is_enabled(dev_priv, phy)) {
377c349dbc7Sjsg 		/* Still read out the GRC value for state verification */
378c349dbc7Sjsg 		if (phy_info->rcomp_phy != -1)
379*f005ef32Sjsg 			dev_priv->display.state.bxt_phy_grc = bxt_get_grc(dev_priv, phy);
380c349dbc7Sjsg 
381c349dbc7Sjsg 		if (bxt_ddi_phy_verify_state(dev_priv, phy)) {
382c349dbc7Sjsg 			drm_dbg(&dev_priv->drm, "DDI PHY %d already enabled, "
383c349dbc7Sjsg 				"won't reprogram it\n", phy);
384c349dbc7Sjsg 			return;
385c349dbc7Sjsg 		}
386c349dbc7Sjsg 
387c349dbc7Sjsg 		drm_dbg(&dev_priv->drm,
388c349dbc7Sjsg 			"DDI PHY %d enabled with invalid state, "
389c349dbc7Sjsg 			"force reprogramming it\n", phy);
390c349dbc7Sjsg 	}
391c349dbc7Sjsg 
392*f005ef32Sjsg 	intel_de_rmw(dev_priv, BXT_P_CR_GT_DISP_PWRON, 0, phy_info->pwron_mask);
393c349dbc7Sjsg 
394c349dbc7Sjsg 	/*
395c349dbc7Sjsg 	 * The PHY registers start out inaccessible and respond to reads with
396c349dbc7Sjsg 	 * all 1s.  Eventually they become accessible as they power up, then
397c349dbc7Sjsg 	 * the reserved bit will give the default 0.  Poll on the reserved bit
398c349dbc7Sjsg 	 * becoming 0 to find when the PHY is accessible.
399c349dbc7Sjsg 	 * The flag should get set in 100us according to the HW team, but
400c349dbc7Sjsg 	 * use 1ms due to occasional timeouts observed with that.
401c349dbc7Sjsg 	 */
402c349dbc7Sjsg 	if (intel_wait_for_register_fw(&dev_priv->uncore,
403c349dbc7Sjsg 				       BXT_PORT_CL1CM_DW0(phy),
404c349dbc7Sjsg 				       PHY_RESERVED | PHY_POWER_GOOD,
405c349dbc7Sjsg 				       PHY_POWER_GOOD,
406c349dbc7Sjsg 				       1))
407c349dbc7Sjsg 		drm_err(&dev_priv->drm, "timeout during PHY%d power on\n",
408c349dbc7Sjsg 			phy);
409c349dbc7Sjsg 
410c349dbc7Sjsg 	/* Program PLL Rcomp code offset */
411*f005ef32Sjsg 	intel_de_rmw(dev_priv, BXT_PORT_CL1CM_DW9(phy), IREF0RC_OFFSET_MASK,
412*f005ef32Sjsg 		     0xE4 << IREF0RC_OFFSET_SHIFT);
413c349dbc7Sjsg 
414*f005ef32Sjsg 	intel_de_rmw(dev_priv, BXT_PORT_CL1CM_DW10(phy), IREF1RC_OFFSET_MASK,
415*f005ef32Sjsg 		     0xE4 << IREF1RC_OFFSET_SHIFT);
416c349dbc7Sjsg 
417c349dbc7Sjsg 	/* Program power gating */
418*f005ef32Sjsg 	intel_de_rmw(dev_priv, BXT_PORT_CL1CM_DW28(phy), 0,
419*f005ef32Sjsg 		     OCL1_POWER_DOWN_EN | DW28_OLDO_DYN_PWR_DOWN_EN | SUS_CLK_CONFIG);
420c349dbc7Sjsg 
421*f005ef32Sjsg 	if (phy_info->dual_channel)
422*f005ef32Sjsg 		intel_de_rmw(dev_priv, BXT_PORT_CL2CM_DW6(phy), 0,
423*f005ef32Sjsg 			     DW6_OLDO_DYN_PWR_DOWN_EN);
424c349dbc7Sjsg 
425c349dbc7Sjsg 	if (phy_info->rcomp_phy != -1) {
426c349dbc7Sjsg 		u32 grc_code;
427c349dbc7Sjsg 
428c349dbc7Sjsg 		bxt_phy_wait_grc_done(dev_priv, phy_info->rcomp_phy);
429c349dbc7Sjsg 
430c349dbc7Sjsg 		/*
431c349dbc7Sjsg 		 * PHY0 isn't connected to an RCOMP resistor so copy over
432c349dbc7Sjsg 		 * the corresponding calibrated value from PHY1, and disable
433c349dbc7Sjsg 		 * the automatic calibration on PHY0.
434c349dbc7Sjsg 		 */
435*f005ef32Sjsg 		val = bxt_get_grc(dev_priv, phy_info->rcomp_phy);
436*f005ef32Sjsg 		dev_priv->display.state.bxt_phy_grc = val;
437*f005ef32Sjsg 
438c349dbc7Sjsg 		grc_code = val << GRC_CODE_FAST_SHIFT |
439c349dbc7Sjsg 			   val << GRC_CODE_SLOW_SHIFT |
440c349dbc7Sjsg 			   val;
441c349dbc7Sjsg 		intel_de_write(dev_priv, BXT_PORT_REF_DW6(phy), grc_code);
442*f005ef32Sjsg 		intel_de_rmw(dev_priv, BXT_PORT_REF_DW8(phy),
443*f005ef32Sjsg 			     0, GRC_DIS | GRC_RDY_OVRD);
444c349dbc7Sjsg 	}
445c349dbc7Sjsg 
446c349dbc7Sjsg 	if (phy_info->reset_delay)
447c349dbc7Sjsg 		udelay(phy_info->reset_delay);
448c349dbc7Sjsg 
449*f005ef32Sjsg 	intel_de_rmw(dev_priv, BXT_PHY_CTL_FAMILY(phy), 0, COMMON_RESET_DIS);
450c349dbc7Sjsg }
451c349dbc7Sjsg 
bxt_ddi_phy_uninit(struct drm_i915_private * dev_priv,enum dpio_phy phy)452c349dbc7Sjsg void bxt_ddi_phy_uninit(struct drm_i915_private *dev_priv, enum dpio_phy phy)
453c349dbc7Sjsg {
454c349dbc7Sjsg 	const struct bxt_ddi_phy_info *phy_info;
455c349dbc7Sjsg 
456c349dbc7Sjsg 	phy_info = bxt_get_phy_info(dev_priv, phy);
457c349dbc7Sjsg 
458*f005ef32Sjsg 	intel_de_rmw(dev_priv, BXT_PHY_CTL_FAMILY(phy), COMMON_RESET_DIS, 0);
459c349dbc7Sjsg 
460*f005ef32Sjsg 	intel_de_rmw(dev_priv, BXT_P_CR_GT_DISP_PWRON, phy_info->pwron_mask, 0);
461c349dbc7Sjsg }
462c349dbc7Sjsg 
bxt_ddi_phy_init(struct drm_i915_private * dev_priv,enum dpio_phy phy)463c349dbc7Sjsg void bxt_ddi_phy_init(struct drm_i915_private *dev_priv, enum dpio_phy phy)
464c349dbc7Sjsg {
465c349dbc7Sjsg 	const struct bxt_ddi_phy_info *phy_info =
466c349dbc7Sjsg 		bxt_get_phy_info(dev_priv, phy);
467c349dbc7Sjsg 	enum dpio_phy rcomp_phy = phy_info->rcomp_phy;
468c349dbc7Sjsg 	bool was_enabled;
469c349dbc7Sjsg 
4701bb76ff1Sjsg 	lockdep_assert_held(&dev_priv->display.power.domains.lock);
471c349dbc7Sjsg 
472c349dbc7Sjsg 	was_enabled = true;
473c349dbc7Sjsg 	if (rcomp_phy != -1)
474c349dbc7Sjsg 		was_enabled = bxt_ddi_phy_is_enabled(dev_priv, rcomp_phy);
475c349dbc7Sjsg 
476c349dbc7Sjsg 	/*
477c349dbc7Sjsg 	 * We need to copy the GRC calibration value from rcomp_phy,
478c349dbc7Sjsg 	 * so make sure it's powered up.
479c349dbc7Sjsg 	 */
480c349dbc7Sjsg 	if (!was_enabled)
481c349dbc7Sjsg 		_bxt_ddi_phy_init(dev_priv, rcomp_phy);
482c349dbc7Sjsg 
483c349dbc7Sjsg 	_bxt_ddi_phy_init(dev_priv, phy);
484c349dbc7Sjsg 
485c349dbc7Sjsg 	if (!was_enabled)
486c349dbc7Sjsg 		bxt_ddi_phy_uninit(dev_priv, rcomp_phy);
487c349dbc7Sjsg }
488c349dbc7Sjsg 
489c349dbc7Sjsg static bool __printf(6, 7)
__phy_reg_verify_state(struct drm_i915_private * dev_priv,enum dpio_phy phy,i915_reg_t reg,u32 mask,u32 expected,const char * reg_fmt,...)490c349dbc7Sjsg __phy_reg_verify_state(struct drm_i915_private *dev_priv, enum dpio_phy phy,
491c349dbc7Sjsg 		       i915_reg_t reg, u32 mask, u32 expected,
492c349dbc7Sjsg 		       const char *reg_fmt, ...)
493c349dbc7Sjsg {
494c349dbc7Sjsg 	struct va_format vaf;
495c349dbc7Sjsg 	va_list args;
496c349dbc7Sjsg 	u32 val;
497c349dbc7Sjsg 
498c349dbc7Sjsg 	val = intel_de_read(dev_priv, reg);
499c349dbc7Sjsg 	if ((val & mask) == expected)
500c349dbc7Sjsg 		return true;
501c349dbc7Sjsg 
502c349dbc7Sjsg 	va_start(args, reg_fmt);
503c349dbc7Sjsg 	vaf.fmt = reg_fmt;
504c349dbc7Sjsg 	vaf.va = &args;
505c349dbc7Sjsg 
506c349dbc7Sjsg 	drm_dbg(&dev_priv->drm, "DDI PHY %d reg %pV [%08x] state mismatch: "
507c349dbc7Sjsg 			 "current %08x, expected %08x (mask %08x)\n",
508c349dbc7Sjsg 			 phy, &vaf, reg.reg, val, (val & ~mask) | expected,
509c349dbc7Sjsg 			 mask);
510c349dbc7Sjsg 
511c349dbc7Sjsg 	va_end(args);
512c349dbc7Sjsg 
513c349dbc7Sjsg 	return false;
514c349dbc7Sjsg }
515c349dbc7Sjsg 
bxt_ddi_phy_verify_state(struct drm_i915_private * dev_priv,enum dpio_phy phy)516c349dbc7Sjsg bool bxt_ddi_phy_verify_state(struct drm_i915_private *dev_priv,
517c349dbc7Sjsg 			      enum dpio_phy phy)
518c349dbc7Sjsg {
519c349dbc7Sjsg 	const struct bxt_ddi_phy_info *phy_info;
520c349dbc7Sjsg 	u32 mask;
521c349dbc7Sjsg 	bool ok;
522c349dbc7Sjsg 
523c349dbc7Sjsg 	phy_info = bxt_get_phy_info(dev_priv, phy);
524c349dbc7Sjsg 
525c349dbc7Sjsg #define _CHK(reg, mask, exp, fmt, ...)					\
526c349dbc7Sjsg 	__phy_reg_verify_state(dev_priv, phy, reg, mask, exp, fmt,	\
527c349dbc7Sjsg 			       ## __VA_ARGS__)
528c349dbc7Sjsg 
529c349dbc7Sjsg 	if (!bxt_ddi_phy_is_enabled(dev_priv, phy))
530c349dbc7Sjsg 		return false;
531c349dbc7Sjsg 
532c349dbc7Sjsg 	ok = true;
533c349dbc7Sjsg 
534c349dbc7Sjsg 	/* PLL Rcomp code offset */
535c349dbc7Sjsg 	ok &= _CHK(BXT_PORT_CL1CM_DW9(phy),
536c349dbc7Sjsg 		    IREF0RC_OFFSET_MASK, 0xe4 << IREF0RC_OFFSET_SHIFT,
537c349dbc7Sjsg 		    "BXT_PORT_CL1CM_DW9(%d)", phy);
538c349dbc7Sjsg 	ok &= _CHK(BXT_PORT_CL1CM_DW10(phy),
539c349dbc7Sjsg 		    IREF1RC_OFFSET_MASK, 0xe4 << IREF1RC_OFFSET_SHIFT,
540c349dbc7Sjsg 		    "BXT_PORT_CL1CM_DW10(%d)", phy);
541c349dbc7Sjsg 
542c349dbc7Sjsg 	/* Power gating */
543c349dbc7Sjsg 	mask = OCL1_POWER_DOWN_EN | DW28_OLDO_DYN_PWR_DOWN_EN | SUS_CLK_CONFIG;
544c349dbc7Sjsg 	ok &= _CHK(BXT_PORT_CL1CM_DW28(phy), mask, mask,
545c349dbc7Sjsg 		    "BXT_PORT_CL1CM_DW28(%d)", phy);
546c349dbc7Sjsg 
547c349dbc7Sjsg 	if (phy_info->dual_channel)
548c349dbc7Sjsg 		ok &= _CHK(BXT_PORT_CL2CM_DW6(phy),
549c349dbc7Sjsg 			   DW6_OLDO_DYN_PWR_DOWN_EN, DW6_OLDO_DYN_PWR_DOWN_EN,
550c349dbc7Sjsg 			   "BXT_PORT_CL2CM_DW6(%d)", phy);
551c349dbc7Sjsg 
552c349dbc7Sjsg 	if (phy_info->rcomp_phy != -1) {
553*f005ef32Sjsg 		u32 grc_code = dev_priv->display.state.bxt_phy_grc;
554c349dbc7Sjsg 
555c349dbc7Sjsg 		grc_code = grc_code << GRC_CODE_FAST_SHIFT |
556c349dbc7Sjsg 			   grc_code << GRC_CODE_SLOW_SHIFT |
557c349dbc7Sjsg 			   grc_code;
558c349dbc7Sjsg 		mask = GRC_CODE_FAST_MASK | GRC_CODE_SLOW_MASK |
559c349dbc7Sjsg 		       GRC_CODE_NOM_MASK;
560c349dbc7Sjsg 		ok &= _CHK(BXT_PORT_REF_DW6(phy), mask, grc_code,
561c349dbc7Sjsg 			   "BXT_PORT_REF_DW6(%d)", phy);
562c349dbc7Sjsg 
563c349dbc7Sjsg 		mask = GRC_DIS | GRC_RDY_OVRD;
564c349dbc7Sjsg 		ok &= _CHK(BXT_PORT_REF_DW8(phy), mask, mask,
565c349dbc7Sjsg 			    "BXT_PORT_REF_DW8(%d)", phy);
566c349dbc7Sjsg 	}
567c349dbc7Sjsg 
568c349dbc7Sjsg 	return ok;
569c349dbc7Sjsg #undef _CHK
570c349dbc7Sjsg }
571c349dbc7Sjsg 
572c349dbc7Sjsg u8
bxt_ddi_phy_calc_lane_lat_optim_mask(u8 lane_count)573c349dbc7Sjsg bxt_ddi_phy_calc_lane_lat_optim_mask(u8 lane_count)
574c349dbc7Sjsg {
575c349dbc7Sjsg 	switch (lane_count) {
576c349dbc7Sjsg 	case 1:
577c349dbc7Sjsg 		return 0;
578c349dbc7Sjsg 	case 2:
579c349dbc7Sjsg 		return BIT(2) | BIT(0);
580c349dbc7Sjsg 	case 4:
581c349dbc7Sjsg 		return BIT(3) | BIT(2) | BIT(0);
582c349dbc7Sjsg 	default:
583c349dbc7Sjsg 		MISSING_CASE(lane_count);
584c349dbc7Sjsg 
585c349dbc7Sjsg 		return 0;
586c349dbc7Sjsg 	}
587c349dbc7Sjsg }
588c349dbc7Sjsg 
bxt_ddi_phy_set_lane_optim_mask(struct intel_encoder * encoder,u8 lane_lat_optim_mask)589c349dbc7Sjsg void bxt_ddi_phy_set_lane_optim_mask(struct intel_encoder *encoder,
590c349dbc7Sjsg 				     u8 lane_lat_optim_mask)
591c349dbc7Sjsg {
592c349dbc7Sjsg 	struct drm_i915_private *dev_priv = to_i915(encoder->base.dev);
593c349dbc7Sjsg 	enum port port = encoder->port;
594c349dbc7Sjsg 	enum dpio_phy phy;
595c349dbc7Sjsg 	enum dpio_channel ch;
596c349dbc7Sjsg 	int lane;
597c349dbc7Sjsg 
598c349dbc7Sjsg 	bxt_port_to_phy_channel(dev_priv, port, &phy, &ch);
599c349dbc7Sjsg 
600c349dbc7Sjsg 	for (lane = 0; lane < 4; lane++) {
601c349dbc7Sjsg 		u32 val = intel_de_read(dev_priv,
602c349dbc7Sjsg 					BXT_PORT_TX_DW14_LN(phy, ch, lane));
603c349dbc7Sjsg 
604c349dbc7Sjsg 		/*
605c349dbc7Sjsg 		 * Note that on CHV this flag is called UPAR, but has
606c349dbc7Sjsg 		 * the same function.
607c349dbc7Sjsg 		 */
608c349dbc7Sjsg 		val &= ~LATENCY_OPTIM;
609c349dbc7Sjsg 		if (lane_lat_optim_mask & BIT(lane))
610c349dbc7Sjsg 			val |= LATENCY_OPTIM;
611c349dbc7Sjsg 
612c349dbc7Sjsg 		intel_de_write(dev_priv, BXT_PORT_TX_DW14_LN(phy, ch, lane),
613c349dbc7Sjsg 			       val);
614c349dbc7Sjsg 	}
615c349dbc7Sjsg }
616c349dbc7Sjsg 
617c349dbc7Sjsg u8
bxt_ddi_phy_get_lane_lat_optim_mask(struct intel_encoder * encoder)618c349dbc7Sjsg bxt_ddi_phy_get_lane_lat_optim_mask(struct intel_encoder *encoder)
619c349dbc7Sjsg {
620c349dbc7Sjsg 	struct drm_i915_private *dev_priv = to_i915(encoder->base.dev);
621c349dbc7Sjsg 	enum port port = encoder->port;
622c349dbc7Sjsg 	enum dpio_phy phy;
623c349dbc7Sjsg 	enum dpio_channel ch;
624c349dbc7Sjsg 	int lane;
625c349dbc7Sjsg 	u8 mask;
626c349dbc7Sjsg 
627c349dbc7Sjsg 	bxt_port_to_phy_channel(dev_priv, port, &phy, &ch);
628c349dbc7Sjsg 
629c349dbc7Sjsg 	mask = 0;
630c349dbc7Sjsg 	for (lane = 0; lane < 4; lane++) {
631c349dbc7Sjsg 		u32 val = intel_de_read(dev_priv,
632c349dbc7Sjsg 					BXT_PORT_TX_DW14_LN(phy, ch, lane));
633c349dbc7Sjsg 
634c349dbc7Sjsg 		if (val & LATENCY_OPTIM)
635c349dbc7Sjsg 			mask |= BIT(lane);
636c349dbc7Sjsg 	}
637c349dbc7Sjsg 
638c349dbc7Sjsg 	return mask;
639c349dbc7Sjsg }
640c349dbc7Sjsg 
vlv_dig_port_to_channel(struct intel_digital_port * dig_port)641*f005ef32Sjsg enum dpio_channel vlv_dig_port_to_channel(struct intel_digital_port *dig_port)
642*f005ef32Sjsg {
643*f005ef32Sjsg 	switch (dig_port->base.port) {
644*f005ef32Sjsg 	default:
645*f005ef32Sjsg 		MISSING_CASE(dig_port->base.port);
646*f005ef32Sjsg 		fallthrough;
647*f005ef32Sjsg 	case PORT_B:
648*f005ef32Sjsg 	case PORT_D:
649*f005ef32Sjsg 		return DPIO_CH0;
650*f005ef32Sjsg 	case PORT_C:
651*f005ef32Sjsg 		return DPIO_CH1;
652*f005ef32Sjsg 	}
653*f005ef32Sjsg }
654*f005ef32Sjsg 
vlv_dig_port_to_phy(struct intel_digital_port * dig_port)655*f005ef32Sjsg enum dpio_phy vlv_dig_port_to_phy(struct intel_digital_port *dig_port)
656*f005ef32Sjsg {
657*f005ef32Sjsg 	switch (dig_port->base.port) {
658*f005ef32Sjsg 	default:
659*f005ef32Sjsg 		MISSING_CASE(dig_port->base.port);
660*f005ef32Sjsg 		fallthrough;
661*f005ef32Sjsg 	case PORT_B:
662*f005ef32Sjsg 	case PORT_C:
663*f005ef32Sjsg 		return DPIO_PHY0;
664*f005ef32Sjsg 	case PORT_D:
665*f005ef32Sjsg 		return DPIO_PHY1;
666*f005ef32Sjsg 	}
667*f005ef32Sjsg }
668*f005ef32Sjsg 
vlv_pipe_to_channel(enum pipe pipe)669*f005ef32Sjsg enum dpio_channel vlv_pipe_to_channel(enum pipe pipe)
670*f005ef32Sjsg {
671*f005ef32Sjsg 	switch (pipe) {
672*f005ef32Sjsg 	default:
673*f005ef32Sjsg 		MISSING_CASE(pipe);
674*f005ef32Sjsg 		fallthrough;
675*f005ef32Sjsg 	case PIPE_A:
676*f005ef32Sjsg 	case PIPE_C:
677*f005ef32Sjsg 		return DPIO_CH0;
678*f005ef32Sjsg 	case PIPE_B:
679*f005ef32Sjsg 		return DPIO_CH1;
680*f005ef32Sjsg 	}
681*f005ef32Sjsg }
682*f005ef32Sjsg 
chv_set_phy_signal_level(struct intel_encoder * encoder,const struct intel_crtc_state * crtc_state,u32 deemph_reg_value,u32 margin_reg_value,bool uniq_trans_scale)683c349dbc7Sjsg void chv_set_phy_signal_level(struct intel_encoder *encoder,
6845ca02815Sjsg 			      const struct intel_crtc_state *crtc_state,
685c349dbc7Sjsg 			      u32 deemph_reg_value, u32 margin_reg_value,
686c349dbc7Sjsg 			      bool uniq_trans_scale)
687c349dbc7Sjsg {
688c349dbc7Sjsg 	struct drm_i915_private *dev_priv = to_i915(encoder->base.dev);
689ad8b1aafSjsg 	struct intel_digital_port *dig_port = enc_to_dig_port(encoder);
6905ca02815Sjsg 	struct intel_crtc *crtc = to_intel_crtc(crtc_state->uapi.crtc);
691ad8b1aafSjsg 	enum dpio_channel ch = vlv_dig_port_to_channel(dig_port);
6925ca02815Sjsg 	enum pipe pipe = crtc->pipe;
693c349dbc7Sjsg 	u32 val;
694c349dbc7Sjsg 	int i;
695c349dbc7Sjsg 
696c349dbc7Sjsg 	vlv_dpio_get(dev_priv);
697c349dbc7Sjsg 
698c349dbc7Sjsg 	/* Clear calc init */
699c349dbc7Sjsg 	val = vlv_dpio_read(dev_priv, pipe, VLV_PCS01_DW10(ch));
700c349dbc7Sjsg 	val &= ~(DPIO_PCS_SWING_CALC_TX0_TX2 | DPIO_PCS_SWING_CALC_TX1_TX3);
701c349dbc7Sjsg 	val &= ~(DPIO_PCS_TX1DEEMP_MASK | DPIO_PCS_TX2DEEMP_MASK);
702c349dbc7Sjsg 	val |= DPIO_PCS_TX1DEEMP_9P5 | DPIO_PCS_TX2DEEMP_9P5;
703c349dbc7Sjsg 	vlv_dpio_write(dev_priv, pipe, VLV_PCS01_DW10(ch), val);
704c349dbc7Sjsg 
7055ca02815Sjsg 	if (crtc_state->lane_count > 2) {
706c349dbc7Sjsg 		val = vlv_dpio_read(dev_priv, pipe, VLV_PCS23_DW10(ch));
707c349dbc7Sjsg 		val &= ~(DPIO_PCS_SWING_CALC_TX0_TX2 | DPIO_PCS_SWING_CALC_TX1_TX3);
708c349dbc7Sjsg 		val &= ~(DPIO_PCS_TX1DEEMP_MASK | DPIO_PCS_TX2DEEMP_MASK);
709c349dbc7Sjsg 		val |= DPIO_PCS_TX1DEEMP_9P5 | DPIO_PCS_TX2DEEMP_9P5;
710c349dbc7Sjsg 		vlv_dpio_write(dev_priv, pipe, VLV_PCS23_DW10(ch), val);
711c349dbc7Sjsg 	}
712c349dbc7Sjsg 
713c349dbc7Sjsg 	val = vlv_dpio_read(dev_priv, pipe, VLV_PCS01_DW9(ch));
714c349dbc7Sjsg 	val &= ~(DPIO_PCS_TX1MARGIN_MASK | DPIO_PCS_TX2MARGIN_MASK);
715c349dbc7Sjsg 	val |= DPIO_PCS_TX1MARGIN_000 | DPIO_PCS_TX2MARGIN_000;
716c349dbc7Sjsg 	vlv_dpio_write(dev_priv, pipe, VLV_PCS01_DW9(ch), val);
717c349dbc7Sjsg 
7185ca02815Sjsg 	if (crtc_state->lane_count > 2) {
719c349dbc7Sjsg 		val = vlv_dpio_read(dev_priv, pipe, VLV_PCS23_DW9(ch));
720c349dbc7Sjsg 		val &= ~(DPIO_PCS_TX1MARGIN_MASK | DPIO_PCS_TX2MARGIN_MASK);
721c349dbc7Sjsg 		val |= DPIO_PCS_TX1MARGIN_000 | DPIO_PCS_TX2MARGIN_000;
722c349dbc7Sjsg 		vlv_dpio_write(dev_priv, pipe, VLV_PCS23_DW9(ch), val);
723c349dbc7Sjsg 	}
724c349dbc7Sjsg 
725c349dbc7Sjsg 	/* Program swing deemph */
7265ca02815Sjsg 	for (i = 0; i < crtc_state->lane_count; i++) {
727c349dbc7Sjsg 		val = vlv_dpio_read(dev_priv, pipe, CHV_TX_DW4(ch, i));
728c349dbc7Sjsg 		val &= ~DPIO_SWING_DEEMPH9P5_MASK;
729c349dbc7Sjsg 		val |= deemph_reg_value << DPIO_SWING_DEEMPH9P5_SHIFT;
730c349dbc7Sjsg 		vlv_dpio_write(dev_priv, pipe, CHV_TX_DW4(ch, i), val);
731c349dbc7Sjsg 	}
732c349dbc7Sjsg 
733c349dbc7Sjsg 	/* Program swing margin */
7345ca02815Sjsg 	for (i = 0; i < crtc_state->lane_count; i++) {
735c349dbc7Sjsg 		val = vlv_dpio_read(dev_priv, pipe, CHV_TX_DW2(ch, i));
736c349dbc7Sjsg 
737c349dbc7Sjsg 		val &= ~DPIO_SWING_MARGIN000_MASK;
738c349dbc7Sjsg 		val |= margin_reg_value << DPIO_SWING_MARGIN000_SHIFT;
739c349dbc7Sjsg 
740c349dbc7Sjsg 		/*
741c349dbc7Sjsg 		 * Supposedly this value shouldn't matter when unique transition
742c349dbc7Sjsg 		 * scale is disabled, but in fact it does matter. Let's just
743c349dbc7Sjsg 		 * always program the same value and hope it's OK.
744c349dbc7Sjsg 		 */
745c349dbc7Sjsg 		val &= ~(0xff << DPIO_UNIQ_TRANS_SCALE_SHIFT);
746c349dbc7Sjsg 		val |= 0x9a << DPIO_UNIQ_TRANS_SCALE_SHIFT;
747c349dbc7Sjsg 
748c349dbc7Sjsg 		vlv_dpio_write(dev_priv, pipe, CHV_TX_DW2(ch, i), val);
749c349dbc7Sjsg 	}
750c349dbc7Sjsg 
751c349dbc7Sjsg 	/*
752c349dbc7Sjsg 	 * The document said it needs to set bit 27 for ch0 and bit 26
753c349dbc7Sjsg 	 * for ch1. Might be a typo in the doc.
754c349dbc7Sjsg 	 * For now, for this unique transition scale selection, set bit
755c349dbc7Sjsg 	 * 27 for ch0 and ch1.
756c349dbc7Sjsg 	 */
7575ca02815Sjsg 	for (i = 0; i < crtc_state->lane_count; i++) {
758c349dbc7Sjsg 		val = vlv_dpio_read(dev_priv, pipe, CHV_TX_DW3(ch, i));
759c349dbc7Sjsg 		if (uniq_trans_scale)
760c349dbc7Sjsg 			val |= DPIO_TX_UNIQ_TRANS_SCALE_EN;
761c349dbc7Sjsg 		else
762c349dbc7Sjsg 			val &= ~DPIO_TX_UNIQ_TRANS_SCALE_EN;
763c349dbc7Sjsg 		vlv_dpio_write(dev_priv, pipe, CHV_TX_DW3(ch, i), val);
764c349dbc7Sjsg 	}
765c349dbc7Sjsg 
766c349dbc7Sjsg 	/* Start swing calculation */
767c349dbc7Sjsg 	val = vlv_dpio_read(dev_priv, pipe, VLV_PCS01_DW10(ch));
768c349dbc7Sjsg 	val |= DPIO_PCS_SWING_CALC_TX0_TX2 | DPIO_PCS_SWING_CALC_TX1_TX3;
769c349dbc7Sjsg 	vlv_dpio_write(dev_priv, pipe, VLV_PCS01_DW10(ch), val);
770c349dbc7Sjsg 
7715ca02815Sjsg 	if (crtc_state->lane_count > 2) {
772c349dbc7Sjsg 		val = vlv_dpio_read(dev_priv, pipe, VLV_PCS23_DW10(ch));
773c349dbc7Sjsg 		val |= DPIO_PCS_SWING_CALC_TX0_TX2 | DPIO_PCS_SWING_CALC_TX1_TX3;
774c349dbc7Sjsg 		vlv_dpio_write(dev_priv, pipe, VLV_PCS23_DW10(ch), val);
775c349dbc7Sjsg 	}
776c349dbc7Sjsg 
777c349dbc7Sjsg 	vlv_dpio_put(dev_priv);
778c349dbc7Sjsg }
779c349dbc7Sjsg 
chv_data_lane_soft_reset(struct intel_encoder * encoder,const struct intel_crtc_state * crtc_state,bool reset)780c349dbc7Sjsg void chv_data_lane_soft_reset(struct intel_encoder *encoder,
781c349dbc7Sjsg 			      const struct intel_crtc_state *crtc_state,
782c349dbc7Sjsg 			      bool reset)
783c349dbc7Sjsg {
784c349dbc7Sjsg 	struct drm_i915_private *dev_priv = to_i915(encoder->base.dev);
785ad8b1aafSjsg 	enum dpio_channel ch = vlv_dig_port_to_channel(enc_to_dig_port(encoder));
786c349dbc7Sjsg 	struct intel_crtc *crtc = to_intel_crtc(crtc_state->uapi.crtc);
787c349dbc7Sjsg 	enum pipe pipe = crtc->pipe;
788c349dbc7Sjsg 	u32 val;
789c349dbc7Sjsg 
790c349dbc7Sjsg 	val = vlv_dpio_read(dev_priv, pipe, VLV_PCS01_DW0(ch));
791c349dbc7Sjsg 	if (reset)
792c349dbc7Sjsg 		val &= ~(DPIO_PCS_TX_LANE2_RESET | DPIO_PCS_TX_LANE1_RESET);
793c349dbc7Sjsg 	else
794c349dbc7Sjsg 		val |= DPIO_PCS_TX_LANE2_RESET | DPIO_PCS_TX_LANE1_RESET;
795c349dbc7Sjsg 	vlv_dpio_write(dev_priv, pipe, VLV_PCS01_DW0(ch), val);
796c349dbc7Sjsg 
797c349dbc7Sjsg 	if (crtc_state->lane_count > 2) {
798c349dbc7Sjsg 		val = vlv_dpio_read(dev_priv, pipe, VLV_PCS23_DW0(ch));
799c349dbc7Sjsg 		if (reset)
800c349dbc7Sjsg 			val &= ~(DPIO_PCS_TX_LANE2_RESET | DPIO_PCS_TX_LANE1_RESET);
801c349dbc7Sjsg 		else
802c349dbc7Sjsg 			val |= DPIO_PCS_TX_LANE2_RESET | DPIO_PCS_TX_LANE1_RESET;
803c349dbc7Sjsg 		vlv_dpio_write(dev_priv, pipe, VLV_PCS23_DW0(ch), val);
804c349dbc7Sjsg 	}
805c349dbc7Sjsg 
806c349dbc7Sjsg 	val = vlv_dpio_read(dev_priv, pipe, VLV_PCS01_DW1(ch));
807c349dbc7Sjsg 	val |= CHV_PCS_REQ_SOFTRESET_EN;
808c349dbc7Sjsg 	if (reset)
809c349dbc7Sjsg 		val &= ~DPIO_PCS_CLK_SOFT_RESET;
810c349dbc7Sjsg 	else
811c349dbc7Sjsg 		val |= DPIO_PCS_CLK_SOFT_RESET;
812c349dbc7Sjsg 	vlv_dpio_write(dev_priv, pipe, VLV_PCS01_DW1(ch), val);
813c349dbc7Sjsg 
814c349dbc7Sjsg 	if (crtc_state->lane_count > 2) {
815c349dbc7Sjsg 		val = vlv_dpio_read(dev_priv, pipe, VLV_PCS23_DW1(ch));
816c349dbc7Sjsg 		val |= CHV_PCS_REQ_SOFTRESET_EN;
817c349dbc7Sjsg 		if (reset)
818c349dbc7Sjsg 			val &= ~DPIO_PCS_CLK_SOFT_RESET;
819c349dbc7Sjsg 		else
820c349dbc7Sjsg 			val |= DPIO_PCS_CLK_SOFT_RESET;
821c349dbc7Sjsg 		vlv_dpio_write(dev_priv, pipe, VLV_PCS23_DW1(ch), val);
822c349dbc7Sjsg 	}
823c349dbc7Sjsg }
824c349dbc7Sjsg 
chv_phy_pre_pll_enable(struct intel_encoder * encoder,const struct intel_crtc_state * crtc_state)825c349dbc7Sjsg void chv_phy_pre_pll_enable(struct intel_encoder *encoder,
826c349dbc7Sjsg 			    const struct intel_crtc_state *crtc_state)
827c349dbc7Sjsg {
828ad8b1aafSjsg 	struct intel_digital_port *dig_port = enc_to_dig_port(encoder);
829c349dbc7Sjsg 	struct drm_i915_private *dev_priv = to_i915(encoder->base.dev);
830c349dbc7Sjsg 	struct intel_crtc *crtc = to_intel_crtc(crtc_state->uapi.crtc);
831ad8b1aafSjsg 	enum dpio_channel ch = vlv_dig_port_to_channel(dig_port);
832c349dbc7Sjsg 	enum pipe pipe = crtc->pipe;
833c349dbc7Sjsg 	unsigned int lane_mask =
834c349dbc7Sjsg 		intel_dp_unused_lane_mask(crtc_state->lane_count);
835c349dbc7Sjsg 	u32 val;
836c349dbc7Sjsg 
837c349dbc7Sjsg 	/*
838c349dbc7Sjsg 	 * Must trick the second common lane into life.
839c349dbc7Sjsg 	 * Otherwise we can't even access the PLL.
840c349dbc7Sjsg 	 */
841c349dbc7Sjsg 	if (ch == DPIO_CH0 && pipe == PIPE_B)
842ad8b1aafSjsg 		dig_port->release_cl2_override =
843c349dbc7Sjsg 			!chv_phy_powergate_ch(dev_priv, DPIO_PHY0, DPIO_CH1, true);
844c349dbc7Sjsg 
845c349dbc7Sjsg 	chv_phy_powergate_lanes(encoder, true, lane_mask);
846c349dbc7Sjsg 
847c349dbc7Sjsg 	vlv_dpio_get(dev_priv);
848c349dbc7Sjsg 
849c349dbc7Sjsg 	/* Assert data lane reset */
850c349dbc7Sjsg 	chv_data_lane_soft_reset(encoder, crtc_state, true);
851c349dbc7Sjsg 
852c349dbc7Sjsg 	/* program left/right clock distribution */
853c349dbc7Sjsg 	if (pipe != PIPE_B) {
854c349dbc7Sjsg 		val = vlv_dpio_read(dev_priv, pipe, _CHV_CMN_DW5_CH0);
855c349dbc7Sjsg 		val &= ~(CHV_BUFLEFTENA1_MASK | CHV_BUFRIGHTENA1_MASK);
856c349dbc7Sjsg 		if (ch == DPIO_CH0)
857c349dbc7Sjsg 			val |= CHV_BUFLEFTENA1_FORCE;
858c349dbc7Sjsg 		if (ch == DPIO_CH1)
859c349dbc7Sjsg 			val |= CHV_BUFRIGHTENA1_FORCE;
860c349dbc7Sjsg 		vlv_dpio_write(dev_priv, pipe, _CHV_CMN_DW5_CH0, val);
861c349dbc7Sjsg 	} else {
862c349dbc7Sjsg 		val = vlv_dpio_read(dev_priv, pipe, _CHV_CMN_DW1_CH1);
863c349dbc7Sjsg 		val &= ~(CHV_BUFLEFTENA2_MASK | CHV_BUFRIGHTENA2_MASK);
864c349dbc7Sjsg 		if (ch == DPIO_CH0)
865c349dbc7Sjsg 			val |= CHV_BUFLEFTENA2_FORCE;
866c349dbc7Sjsg 		if (ch == DPIO_CH1)
867c349dbc7Sjsg 			val |= CHV_BUFRIGHTENA2_FORCE;
868c349dbc7Sjsg 		vlv_dpio_write(dev_priv, pipe, _CHV_CMN_DW1_CH1, val);
869c349dbc7Sjsg 	}
870c349dbc7Sjsg 
871c349dbc7Sjsg 	/* program clock channel usage */
872c349dbc7Sjsg 	val = vlv_dpio_read(dev_priv, pipe, VLV_PCS01_DW8(ch));
873c349dbc7Sjsg 	val |= CHV_PCS_USEDCLKCHANNEL_OVRRIDE;
874c349dbc7Sjsg 	if (pipe != PIPE_B)
875c349dbc7Sjsg 		val &= ~CHV_PCS_USEDCLKCHANNEL;
876c349dbc7Sjsg 	else
877c349dbc7Sjsg 		val |= CHV_PCS_USEDCLKCHANNEL;
878c349dbc7Sjsg 	vlv_dpio_write(dev_priv, pipe, VLV_PCS01_DW8(ch), val);
879c349dbc7Sjsg 
880c349dbc7Sjsg 	if (crtc_state->lane_count > 2) {
881c349dbc7Sjsg 		val = vlv_dpio_read(dev_priv, pipe, VLV_PCS23_DW8(ch));
882c349dbc7Sjsg 		val |= CHV_PCS_USEDCLKCHANNEL_OVRRIDE;
883c349dbc7Sjsg 		if (pipe != PIPE_B)
884c349dbc7Sjsg 			val &= ~CHV_PCS_USEDCLKCHANNEL;
885c349dbc7Sjsg 		else
886c349dbc7Sjsg 			val |= CHV_PCS_USEDCLKCHANNEL;
887c349dbc7Sjsg 		vlv_dpio_write(dev_priv, pipe, VLV_PCS23_DW8(ch), val);
888c349dbc7Sjsg 	}
889c349dbc7Sjsg 
890c349dbc7Sjsg 	/*
891c349dbc7Sjsg 	 * This a a bit weird since generally CL
892c349dbc7Sjsg 	 * matches the pipe, but here we need to
893c349dbc7Sjsg 	 * pick the CL based on the port.
894c349dbc7Sjsg 	 */
895c349dbc7Sjsg 	val = vlv_dpio_read(dev_priv, pipe, CHV_CMN_DW19(ch));
896c349dbc7Sjsg 	if (pipe != PIPE_B)
897c349dbc7Sjsg 		val &= ~CHV_CMN_USEDCLKCHANNEL;
898c349dbc7Sjsg 	else
899c349dbc7Sjsg 		val |= CHV_CMN_USEDCLKCHANNEL;
900c349dbc7Sjsg 	vlv_dpio_write(dev_priv, pipe, CHV_CMN_DW19(ch), val);
901c349dbc7Sjsg 
902c349dbc7Sjsg 	vlv_dpio_put(dev_priv);
903c349dbc7Sjsg }
904c349dbc7Sjsg 
chv_phy_pre_encoder_enable(struct intel_encoder * encoder,const struct intel_crtc_state * crtc_state)905c349dbc7Sjsg void chv_phy_pre_encoder_enable(struct intel_encoder *encoder,
906c349dbc7Sjsg 				const struct intel_crtc_state *crtc_state)
907c349dbc7Sjsg {
908c349dbc7Sjsg 	struct intel_dp *intel_dp = enc_to_intel_dp(encoder);
909ad8b1aafSjsg 	struct intel_digital_port *dig_port = dp_to_dig_port(intel_dp);
910c349dbc7Sjsg 	struct drm_i915_private *dev_priv = to_i915(encoder->base.dev);
911c349dbc7Sjsg 	struct intel_crtc *crtc = to_intel_crtc(crtc_state->uapi.crtc);
912ad8b1aafSjsg 	enum dpio_channel ch = vlv_dig_port_to_channel(dig_port);
913c349dbc7Sjsg 	enum pipe pipe = crtc->pipe;
914c349dbc7Sjsg 	int data, i, stagger;
915c349dbc7Sjsg 	u32 val;
916c349dbc7Sjsg 
917c349dbc7Sjsg 	vlv_dpio_get(dev_priv);
918c349dbc7Sjsg 
919c349dbc7Sjsg 	/* allow hardware to manage TX FIFO reset source */
920c349dbc7Sjsg 	val = vlv_dpio_read(dev_priv, pipe, VLV_PCS01_DW11(ch));
921c349dbc7Sjsg 	val &= ~DPIO_LANEDESKEW_STRAP_OVRD;
922c349dbc7Sjsg 	vlv_dpio_write(dev_priv, pipe, VLV_PCS01_DW11(ch), val);
923c349dbc7Sjsg 
924c349dbc7Sjsg 	if (crtc_state->lane_count > 2) {
925c349dbc7Sjsg 		val = vlv_dpio_read(dev_priv, pipe, VLV_PCS23_DW11(ch));
926c349dbc7Sjsg 		val &= ~DPIO_LANEDESKEW_STRAP_OVRD;
927c349dbc7Sjsg 		vlv_dpio_write(dev_priv, pipe, VLV_PCS23_DW11(ch), val);
928c349dbc7Sjsg 	}
929c349dbc7Sjsg 
930c349dbc7Sjsg 	/* Program Tx lane latency optimal setting*/
931c349dbc7Sjsg 	for (i = 0; i < crtc_state->lane_count; i++) {
932c349dbc7Sjsg 		/* Set the upar bit */
933c349dbc7Sjsg 		if (crtc_state->lane_count == 1)
934c349dbc7Sjsg 			data = 0x0;
935c349dbc7Sjsg 		else
936c349dbc7Sjsg 			data = (i == 1) ? 0x0 : 0x1;
937c349dbc7Sjsg 		vlv_dpio_write(dev_priv, pipe, CHV_TX_DW14(ch, i),
938c349dbc7Sjsg 				data << DPIO_UPAR_SHIFT);
939c349dbc7Sjsg 	}
940c349dbc7Sjsg 
941c349dbc7Sjsg 	/* Data lane stagger programming */
942c349dbc7Sjsg 	if (crtc_state->port_clock > 270000)
943c349dbc7Sjsg 		stagger = 0x18;
944c349dbc7Sjsg 	else if (crtc_state->port_clock > 135000)
945c349dbc7Sjsg 		stagger = 0xd;
946c349dbc7Sjsg 	else if (crtc_state->port_clock > 67500)
947c349dbc7Sjsg 		stagger = 0x7;
948c349dbc7Sjsg 	else if (crtc_state->port_clock > 33750)
949c349dbc7Sjsg 		stagger = 0x4;
950c349dbc7Sjsg 	else
951c349dbc7Sjsg 		stagger = 0x2;
952c349dbc7Sjsg 
953c349dbc7Sjsg 	val = vlv_dpio_read(dev_priv, pipe, VLV_PCS01_DW11(ch));
954c349dbc7Sjsg 	val |= DPIO_TX2_STAGGER_MASK(0x1f);
955c349dbc7Sjsg 	vlv_dpio_write(dev_priv, pipe, VLV_PCS01_DW11(ch), val);
956c349dbc7Sjsg 
957c349dbc7Sjsg 	if (crtc_state->lane_count > 2) {
958c349dbc7Sjsg 		val = vlv_dpio_read(dev_priv, pipe, VLV_PCS23_DW11(ch));
959c349dbc7Sjsg 		val |= DPIO_TX2_STAGGER_MASK(0x1f);
960c349dbc7Sjsg 		vlv_dpio_write(dev_priv, pipe, VLV_PCS23_DW11(ch), val);
961c349dbc7Sjsg 	}
962c349dbc7Sjsg 
963c349dbc7Sjsg 	vlv_dpio_write(dev_priv, pipe, VLV_PCS01_DW12(ch),
964c349dbc7Sjsg 		       DPIO_LANESTAGGER_STRAP(stagger) |
965c349dbc7Sjsg 		       DPIO_LANESTAGGER_STRAP_OVRD |
966c349dbc7Sjsg 		       DPIO_TX1_STAGGER_MASK(0x1f) |
967c349dbc7Sjsg 		       DPIO_TX1_STAGGER_MULT(6) |
968c349dbc7Sjsg 		       DPIO_TX2_STAGGER_MULT(0));
969c349dbc7Sjsg 
970c349dbc7Sjsg 	if (crtc_state->lane_count > 2) {
971c349dbc7Sjsg 		vlv_dpio_write(dev_priv, pipe, VLV_PCS23_DW12(ch),
972c349dbc7Sjsg 			       DPIO_LANESTAGGER_STRAP(stagger) |
973c349dbc7Sjsg 			       DPIO_LANESTAGGER_STRAP_OVRD |
974c349dbc7Sjsg 			       DPIO_TX1_STAGGER_MASK(0x1f) |
975c349dbc7Sjsg 			       DPIO_TX1_STAGGER_MULT(7) |
976c349dbc7Sjsg 			       DPIO_TX2_STAGGER_MULT(5));
977c349dbc7Sjsg 	}
978c349dbc7Sjsg 
979c349dbc7Sjsg 	/* Deassert data lane reset */
980c349dbc7Sjsg 	chv_data_lane_soft_reset(encoder, crtc_state, false);
981c349dbc7Sjsg 
982c349dbc7Sjsg 	vlv_dpio_put(dev_priv);
983c349dbc7Sjsg }
984c349dbc7Sjsg 
chv_phy_release_cl2_override(struct intel_encoder * encoder)985c349dbc7Sjsg void chv_phy_release_cl2_override(struct intel_encoder *encoder)
986c349dbc7Sjsg {
987ad8b1aafSjsg 	struct intel_digital_port *dig_port = enc_to_dig_port(encoder);
988c349dbc7Sjsg 	struct drm_i915_private *dev_priv = to_i915(encoder->base.dev);
989c349dbc7Sjsg 
990ad8b1aafSjsg 	if (dig_port->release_cl2_override) {
991c349dbc7Sjsg 		chv_phy_powergate_ch(dev_priv, DPIO_PHY0, DPIO_CH1, false);
992ad8b1aafSjsg 		dig_port->release_cl2_override = false;
993c349dbc7Sjsg 	}
994c349dbc7Sjsg }
995c349dbc7Sjsg 
chv_phy_post_pll_disable(struct intel_encoder * encoder,const struct intel_crtc_state * old_crtc_state)996c349dbc7Sjsg void chv_phy_post_pll_disable(struct intel_encoder *encoder,
997c349dbc7Sjsg 			      const struct intel_crtc_state *old_crtc_state)
998c349dbc7Sjsg {
999c349dbc7Sjsg 	struct drm_i915_private *dev_priv = to_i915(encoder->base.dev);
1000c349dbc7Sjsg 	enum pipe pipe = to_intel_crtc(old_crtc_state->uapi.crtc)->pipe;
1001c349dbc7Sjsg 	u32 val;
1002c349dbc7Sjsg 
1003c349dbc7Sjsg 	vlv_dpio_get(dev_priv);
1004c349dbc7Sjsg 
1005c349dbc7Sjsg 	/* disable left/right clock distribution */
1006c349dbc7Sjsg 	if (pipe != PIPE_B) {
1007c349dbc7Sjsg 		val = vlv_dpio_read(dev_priv, pipe, _CHV_CMN_DW5_CH0);
1008c349dbc7Sjsg 		val &= ~(CHV_BUFLEFTENA1_MASK | CHV_BUFRIGHTENA1_MASK);
1009c349dbc7Sjsg 		vlv_dpio_write(dev_priv, pipe, _CHV_CMN_DW5_CH0, val);
1010c349dbc7Sjsg 	} else {
1011c349dbc7Sjsg 		val = vlv_dpio_read(dev_priv, pipe, _CHV_CMN_DW1_CH1);
1012c349dbc7Sjsg 		val &= ~(CHV_BUFLEFTENA2_MASK | CHV_BUFRIGHTENA2_MASK);
1013c349dbc7Sjsg 		vlv_dpio_write(dev_priv, pipe, _CHV_CMN_DW1_CH1, val);
1014c349dbc7Sjsg 	}
1015c349dbc7Sjsg 
1016c349dbc7Sjsg 	vlv_dpio_put(dev_priv);
1017c349dbc7Sjsg 
1018c349dbc7Sjsg 	/*
1019c349dbc7Sjsg 	 * Leave the power down bit cleared for at least one
1020c349dbc7Sjsg 	 * lane so that chv_powergate_phy_ch() will power
1021c349dbc7Sjsg 	 * on something when the channel is otherwise unused.
1022c349dbc7Sjsg 	 * When the port is off and the override is removed
1023c349dbc7Sjsg 	 * the lanes power down anyway, so otherwise it doesn't
1024c349dbc7Sjsg 	 * really matter what the state of power down bits is
1025c349dbc7Sjsg 	 * after this.
1026c349dbc7Sjsg 	 */
1027c349dbc7Sjsg 	chv_phy_powergate_lanes(encoder, false, 0x0);
1028c349dbc7Sjsg }
1029c349dbc7Sjsg 
vlv_set_phy_signal_level(struct intel_encoder * encoder,const struct intel_crtc_state * crtc_state,u32 demph_reg_value,u32 preemph_reg_value,u32 uniqtranscale_reg_value,u32 tx3_demph)1030c349dbc7Sjsg void vlv_set_phy_signal_level(struct intel_encoder *encoder,
10315ca02815Sjsg 			      const struct intel_crtc_state *crtc_state,
1032c349dbc7Sjsg 			      u32 demph_reg_value, u32 preemph_reg_value,
1033c349dbc7Sjsg 			      u32 uniqtranscale_reg_value, u32 tx3_demph)
1034c349dbc7Sjsg {
1035c349dbc7Sjsg 	struct drm_i915_private *dev_priv = to_i915(encoder->base.dev);
1036ad8b1aafSjsg 	struct intel_digital_port *dig_port = enc_to_dig_port(encoder);
10375ca02815Sjsg 	struct intel_crtc *crtc = to_intel_crtc(crtc_state->uapi.crtc);
1038ad8b1aafSjsg 	enum dpio_channel port = vlv_dig_port_to_channel(dig_port);
10395ca02815Sjsg 	enum pipe pipe = crtc->pipe;
1040c349dbc7Sjsg 
1041c349dbc7Sjsg 	vlv_dpio_get(dev_priv);
1042c349dbc7Sjsg 
1043c349dbc7Sjsg 	vlv_dpio_write(dev_priv, pipe, VLV_TX_DW5(port), 0x00000000);
1044c349dbc7Sjsg 	vlv_dpio_write(dev_priv, pipe, VLV_TX_DW4(port), demph_reg_value);
1045c349dbc7Sjsg 	vlv_dpio_write(dev_priv, pipe, VLV_TX_DW2(port),
1046c349dbc7Sjsg 			 uniqtranscale_reg_value);
1047c349dbc7Sjsg 	vlv_dpio_write(dev_priv, pipe, VLV_TX_DW3(port), 0x0C782040);
1048c349dbc7Sjsg 
1049c349dbc7Sjsg 	if (tx3_demph)
1050c349dbc7Sjsg 		vlv_dpio_write(dev_priv, pipe, VLV_TX3_DW4(port), tx3_demph);
1051c349dbc7Sjsg 
1052c349dbc7Sjsg 	vlv_dpio_write(dev_priv, pipe, VLV_PCS_DW11(port), 0x00030000);
1053c349dbc7Sjsg 	vlv_dpio_write(dev_priv, pipe, VLV_PCS_DW9(port), preemph_reg_value);
1054c349dbc7Sjsg 	vlv_dpio_write(dev_priv, pipe, VLV_TX_DW5(port), DPIO_TX_OCALINIT_EN);
1055c349dbc7Sjsg 
1056c349dbc7Sjsg 	vlv_dpio_put(dev_priv);
1057c349dbc7Sjsg }
1058c349dbc7Sjsg 
vlv_phy_pre_pll_enable(struct intel_encoder * encoder,const struct intel_crtc_state * crtc_state)1059c349dbc7Sjsg void vlv_phy_pre_pll_enable(struct intel_encoder *encoder,
1060c349dbc7Sjsg 			    const struct intel_crtc_state *crtc_state)
1061c349dbc7Sjsg {
1062ad8b1aafSjsg 	struct intel_digital_port *dig_port = enc_to_dig_port(encoder);
1063c349dbc7Sjsg 	struct drm_i915_private *dev_priv = to_i915(encoder->base.dev);
1064c349dbc7Sjsg 	struct intel_crtc *crtc = to_intel_crtc(crtc_state->uapi.crtc);
1065ad8b1aafSjsg 	enum dpio_channel port = vlv_dig_port_to_channel(dig_port);
1066c349dbc7Sjsg 	enum pipe pipe = crtc->pipe;
1067c349dbc7Sjsg 
1068c349dbc7Sjsg 	/* Program Tx lane resets to default */
1069c349dbc7Sjsg 	vlv_dpio_get(dev_priv);
1070c349dbc7Sjsg 
1071c349dbc7Sjsg 	vlv_dpio_write(dev_priv, pipe, VLV_PCS_DW0(port),
1072c349dbc7Sjsg 			 DPIO_PCS_TX_LANE2_RESET |
1073c349dbc7Sjsg 			 DPIO_PCS_TX_LANE1_RESET);
1074c349dbc7Sjsg 	vlv_dpio_write(dev_priv, pipe, VLV_PCS_DW1(port),
1075c349dbc7Sjsg 			 DPIO_PCS_CLK_CRI_RXEB_EIOS_EN |
1076c349dbc7Sjsg 			 DPIO_PCS_CLK_CRI_RXDIGFILTSG_EN |
1077c349dbc7Sjsg 			 (1<<DPIO_PCS_CLK_DATAWIDTH_SHIFT) |
1078c349dbc7Sjsg 				 DPIO_PCS_CLK_SOFT_RESET);
1079c349dbc7Sjsg 
1080c349dbc7Sjsg 	/* Fix up inter-pair skew failure */
1081c349dbc7Sjsg 	vlv_dpio_write(dev_priv, pipe, VLV_PCS_DW12(port), 0x00750f00);
1082c349dbc7Sjsg 	vlv_dpio_write(dev_priv, pipe, VLV_TX_DW11(port), 0x00001500);
1083c349dbc7Sjsg 	vlv_dpio_write(dev_priv, pipe, VLV_TX_DW14(port), 0x40400000);
1084c349dbc7Sjsg 
1085c349dbc7Sjsg 	vlv_dpio_put(dev_priv);
1086c349dbc7Sjsg }
1087c349dbc7Sjsg 
vlv_phy_pre_encoder_enable(struct intel_encoder * encoder,const struct intel_crtc_state * crtc_state)1088c349dbc7Sjsg void vlv_phy_pre_encoder_enable(struct intel_encoder *encoder,
1089c349dbc7Sjsg 				const struct intel_crtc_state *crtc_state)
1090c349dbc7Sjsg {
1091c349dbc7Sjsg 	struct intel_dp *intel_dp = enc_to_intel_dp(encoder);
1092ad8b1aafSjsg 	struct intel_digital_port *dig_port = dp_to_dig_port(intel_dp);
1093c349dbc7Sjsg 	struct drm_i915_private *dev_priv = to_i915(encoder->base.dev);
1094c349dbc7Sjsg 	struct intel_crtc *crtc = to_intel_crtc(crtc_state->uapi.crtc);
1095ad8b1aafSjsg 	enum dpio_channel port = vlv_dig_port_to_channel(dig_port);
1096c349dbc7Sjsg 	enum pipe pipe = crtc->pipe;
1097c349dbc7Sjsg 	u32 val;
1098c349dbc7Sjsg 
1099c349dbc7Sjsg 	vlv_dpio_get(dev_priv);
1100c349dbc7Sjsg 
1101c349dbc7Sjsg 	/* Enable clock channels for this port */
1102c349dbc7Sjsg 	val = vlv_dpio_read(dev_priv, pipe, VLV_PCS01_DW8(port));
1103c349dbc7Sjsg 	val = 0;
1104c349dbc7Sjsg 	if (pipe)
1105c349dbc7Sjsg 		val |= (1<<21);
1106c349dbc7Sjsg 	else
1107c349dbc7Sjsg 		val &= ~(1<<21);
1108c349dbc7Sjsg 	val |= 0x001000c4;
1109c349dbc7Sjsg 	vlv_dpio_write(dev_priv, pipe, VLV_PCS_DW8(port), val);
1110c349dbc7Sjsg 
1111c349dbc7Sjsg 	/* Program lane clock */
1112c349dbc7Sjsg 	vlv_dpio_write(dev_priv, pipe, VLV_PCS_DW14(port), 0x00760018);
1113c349dbc7Sjsg 	vlv_dpio_write(dev_priv, pipe, VLV_PCS_DW23(port), 0x00400888);
1114c349dbc7Sjsg 
1115c349dbc7Sjsg 	vlv_dpio_put(dev_priv);
1116c349dbc7Sjsg }
1117c349dbc7Sjsg 
vlv_phy_reset_lanes(struct intel_encoder * encoder,const struct intel_crtc_state * old_crtc_state)1118c349dbc7Sjsg void vlv_phy_reset_lanes(struct intel_encoder *encoder,
1119c349dbc7Sjsg 			 const struct intel_crtc_state *old_crtc_state)
1120c349dbc7Sjsg {
1121ad8b1aafSjsg 	struct intel_digital_port *dig_port = enc_to_dig_port(encoder);
1122c349dbc7Sjsg 	struct drm_i915_private *dev_priv = to_i915(encoder->base.dev);
1123c349dbc7Sjsg 	struct intel_crtc *crtc = to_intel_crtc(old_crtc_state->uapi.crtc);
1124ad8b1aafSjsg 	enum dpio_channel port = vlv_dig_port_to_channel(dig_port);
1125c349dbc7Sjsg 	enum pipe pipe = crtc->pipe;
1126c349dbc7Sjsg 
1127c349dbc7Sjsg 	vlv_dpio_get(dev_priv);
1128c349dbc7Sjsg 	vlv_dpio_write(dev_priv, pipe, VLV_PCS_DW0(port), 0x00000000);
1129c349dbc7Sjsg 	vlv_dpio_write(dev_priv, pipe, VLV_PCS_DW1(port), 0x00e00060);
1130c349dbc7Sjsg 	vlv_dpio_put(dev_priv);
1131c349dbc7Sjsg }
1132