Subversion Repositories Kolibri OS

Rev

Rev 4560 | Rev 5097 | Go to most recent revision | Only display areas with differences | Regard whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 4560 Rev 5060
1
/*
1
/*
2
 * Copyright © 2006-2007 Intel Corporation
2
 * Copyright © 2006-2007 Intel Corporation
3
 *
3
 *
4
 * Permission is hereby granted, free of charge, to any person obtaining a
4
 * Permission is hereby granted, free of charge, to any person obtaining a
5
 * copy of this software and associated documentation files (the "Software"),
5
 * copy of this software and associated documentation files (the "Software"),
6
 * to deal in the Software without restriction, including without limitation
6
 * to deal in the Software without restriction, including without limitation
7
 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
7
 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
8
 * and/or sell copies of the Software, and to permit persons to whom the
8
 * and/or sell copies of the Software, and to permit persons to whom the
9
 * Software is furnished to do so, subject to the following conditions:
9
 * Software is furnished to do so, subject to the following conditions:
10
 *
10
 *
11
 * The above copyright notice and this permission notice (including the next
11
 * The above copyright notice and this permission notice (including the next
12
 * paragraph) shall be included in all copies or substantial portions of the
12
 * paragraph) shall be included in all copies or substantial portions of the
13
 * Software.
13
 * Software.
14
 *
14
 *
15
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
15
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
16
 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
17
 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
18
 * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
18
 * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
19
 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
20
 * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
20
 * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
21
 * DEALINGS IN THE SOFTWARE.
21
 * DEALINGS IN THE SOFTWARE.
22
 *
22
 *
23
 * Authors:
23
 * Authors:
24
 *	Eric Anholt 
24
 *	Eric Anholt 
25
 */
25
 */
26
 
26
 
27
#include 
27
#include 
28
#include 
28
#include 
29
#include 
29
#include 
30
#include 
30
#include 
31
#include 
31
#include 
32
#include 
32
#include 
33
#include "intel_drv.h"
33
#include "intel_drv.h"
34
#include 
34
#include 
35
#include "i915_drv.h"
35
#include "i915_drv.h"
36
 
36
 
37
/* Here's the desired hotplug mode */
37
/* Here's the desired hotplug mode */
38
#define ADPA_HOTPLUG_BITS (ADPA_CRT_HOTPLUG_PERIOD_128 |		\
38
#define ADPA_HOTPLUG_BITS (ADPA_CRT_HOTPLUG_PERIOD_128 |		\
39
			   ADPA_CRT_HOTPLUG_WARMUP_10MS |		\
39
			   ADPA_CRT_HOTPLUG_WARMUP_10MS |		\
40
			   ADPA_CRT_HOTPLUG_SAMPLE_4S |			\
40
			   ADPA_CRT_HOTPLUG_SAMPLE_4S |			\
41
			   ADPA_CRT_HOTPLUG_VOLTAGE_50 |		\
41
			   ADPA_CRT_HOTPLUG_VOLTAGE_50 |		\
42
			   ADPA_CRT_HOTPLUG_VOLREF_325MV |		\
42
			   ADPA_CRT_HOTPLUG_VOLREF_325MV |		\
43
			   ADPA_CRT_HOTPLUG_ENABLE)
43
			   ADPA_CRT_HOTPLUG_ENABLE)
44
 
44
 
45
struct intel_crt {
45
struct intel_crt {
46
	struct intel_encoder base;
46
	struct intel_encoder base;
47
	/* DPMS state is stored in the connector, which we need in the
47
	/* DPMS state is stored in the connector, which we need in the
48
	 * encoder's enable/disable callbacks */
48
	 * encoder's enable/disable callbacks */
49
	struct intel_connector *connector;
49
	struct intel_connector *connector;
50
	bool force_hotplug_required;
50
	bool force_hotplug_required;
51
	u32 adpa_reg;
51
	u32 adpa_reg;
52
};
52
};
53
 
53
 
54
static struct intel_crt *intel_encoder_to_crt(struct intel_encoder *encoder)
54
static struct intel_crt *intel_encoder_to_crt(struct intel_encoder *encoder)
55
{
55
{
56
	return container_of(encoder, struct intel_crt, base);
56
	return container_of(encoder, struct intel_crt, base);
57
}
57
}
58
 
58
 
59
static struct intel_crt *intel_attached_crt(struct drm_connector *connector)
59
static struct intel_crt *intel_attached_crt(struct drm_connector *connector)
60
{
60
{
61
	return intel_encoder_to_crt(intel_attached_encoder(connector));
61
	return intel_encoder_to_crt(intel_attached_encoder(connector));
62
}
62
}
63
 
63
 
64
static bool intel_crt_get_hw_state(struct intel_encoder *encoder,
64
static bool intel_crt_get_hw_state(struct intel_encoder *encoder,
65
				   enum pipe *pipe)
65
				   enum pipe *pipe)
66
{
66
{
67
	struct drm_device *dev = encoder->base.dev;
67
	struct drm_device *dev = encoder->base.dev;
68
	struct drm_i915_private *dev_priv = dev->dev_private;
68
	struct drm_i915_private *dev_priv = dev->dev_private;
69
	struct intel_crt *crt = intel_encoder_to_crt(encoder);
69
	struct intel_crt *crt = intel_encoder_to_crt(encoder);
-
 
70
	enum intel_display_power_domain power_domain;
70
	u32 tmp;
71
	u32 tmp;
-
 
72
 
-
 
73
	power_domain = intel_display_port_power_domain(encoder);
-
 
74
	if (!intel_display_power_enabled(dev_priv, power_domain))
-
 
75
		return false;
71
 
76
 
72
	tmp = I915_READ(crt->adpa_reg);
77
	tmp = I915_READ(crt->adpa_reg);
73
 
78
 
74
	if (!(tmp & ADPA_DAC_ENABLE))
79
	if (!(tmp & ADPA_DAC_ENABLE))
75
		return false;
80
		return false;
76
 
81
 
77
	if (HAS_PCH_CPT(dev))
82
	if (HAS_PCH_CPT(dev))
78
		*pipe = PORT_TO_PIPE_CPT(tmp);
83
		*pipe = PORT_TO_PIPE_CPT(tmp);
79
	else
84
	else
80
		*pipe = PORT_TO_PIPE(tmp);
85
		*pipe = PORT_TO_PIPE(tmp);
81
 
86
 
82
	return true;
87
	return true;
83
}
88
}
84
 
89
 
85
static unsigned int intel_crt_get_flags(struct intel_encoder *encoder)
90
static unsigned int intel_crt_get_flags(struct intel_encoder *encoder)
86
{
91
{
87
	struct drm_i915_private *dev_priv = encoder->base.dev->dev_private;
92
	struct drm_i915_private *dev_priv = encoder->base.dev->dev_private;
88
	struct intel_crt *crt = intel_encoder_to_crt(encoder);
93
	struct intel_crt *crt = intel_encoder_to_crt(encoder);
89
	u32 tmp, flags = 0;
94
	u32 tmp, flags = 0;
90
 
95
 
91
	tmp = I915_READ(crt->adpa_reg);
96
	tmp = I915_READ(crt->adpa_reg);
92
 
97
 
93
	if (tmp & ADPA_HSYNC_ACTIVE_HIGH)
98
	if (tmp & ADPA_HSYNC_ACTIVE_HIGH)
94
		flags |= DRM_MODE_FLAG_PHSYNC;
99
		flags |= DRM_MODE_FLAG_PHSYNC;
95
	else
100
	else
96
		flags |= DRM_MODE_FLAG_NHSYNC;
101
		flags |= DRM_MODE_FLAG_NHSYNC;
97
 
102
 
98
	if (tmp & ADPA_VSYNC_ACTIVE_HIGH)
103
	if (tmp & ADPA_VSYNC_ACTIVE_HIGH)
99
		flags |= DRM_MODE_FLAG_PVSYNC;
104
		flags |= DRM_MODE_FLAG_PVSYNC;
100
	else
105
	else
101
		flags |= DRM_MODE_FLAG_NVSYNC;
106
		flags |= DRM_MODE_FLAG_NVSYNC;
102
 
107
 
103
	return flags;
108
	return flags;
104
}
109
}
105
 
110
 
106
static void intel_crt_get_config(struct intel_encoder *encoder,
111
static void intel_crt_get_config(struct intel_encoder *encoder,
107
				 struct intel_crtc_config *pipe_config)
112
				 struct intel_crtc_config *pipe_config)
108
{
113
{
109
	struct drm_device *dev = encoder->base.dev;
114
	struct drm_device *dev = encoder->base.dev;
110
	int dotclock;
115
	int dotclock;
111
 
116
 
112
	pipe_config->adjusted_mode.flags |= intel_crt_get_flags(encoder);
117
	pipe_config->adjusted_mode.flags |= intel_crt_get_flags(encoder);
113
 
118
 
114
	dotclock = pipe_config->port_clock;
119
	dotclock = pipe_config->port_clock;
115
 
120
 
116
	if (HAS_PCH_SPLIT(dev))
121
	if (HAS_PCH_SPLIT(dev))
117
		ironlake_check_encoder_dotclock(pipe_config, dotclock);
122
		ironlake_check_encoder_dotclock(pipe_config, dotclock);
118
 
123
 
119
	pipe_config->adjusted_mode.crtc_clock = dotclock;
124
	pipe_config->adjusted_mode.crtc_clock = dotclock;
120
}
125
}
121
 
126
 
122
static void hsw_crt_get_config(struct intel_encoder *encoder,
127
static void hsw_crt_get_config(struct intel_encoder *encoder,
123
			       struct intel_crtc_config *pipe_config)
128
			       struct intel_crtc_config *pipe_config)
124
{
129
{
125
	intel_ddi_get_config(encoder, pipe_config);
130
	intel_ddi_get_config(encoder, pipe_config);
126
 
131
 
127
	pipe_config->adjusted_mode.flags &= ~(DRM_MODE_FLAG_PHSYNC |
132
	pipe_config->adjusted_mode.flags &= ~(DRM_MODE_FLAG_PHSYNC |
128
					      DRM_MODE_FLAG_NHSYNC |
133
					      DRM_MODE_FLAG_NHSYNC |
129
					      DRM_MODE_FLAG_PVSYNC |
134
					      DRM_MODE_FLAG_PVSYNC |
130
					      DRM_MODE_FLAG_NVSYNC);
135
					      DRM_MODE_FLAG_NVSYNC);
131
	pipe_config->adjusted_mode.flags |= intel_crt_get_flags(encoder);
136
	pipe_config->adjusted_mode.flags |= intel_crt_get_flags(encoder);
132
}
137
}
-
 
138
 
-
 
139
static void hsw_crt_pre_enable(struct intel_encoder *encoder)
-
 
140
{
-
 
141
	struct drm_device *dev = encoder->base.dev;
-
 
142
	struct drm_i915_private *dev_priv = dev->dev_private;
-
 
143
 
-
 
144
	WARN(I915_READ(SPLL_CTL) & SPLL_PLL_ENABLE, "SPLL already enabled\n");
-
 
145
	I915_WRITE(SPLL_CTL,
-
 
146
		   SPLL_PLL_ENABLE | SPLL_PLL_FREQ_1350MHz | SPLL_PLL_SSC);
-
 
147
	POSTING_READ(SPLL_CTL);
-
 
148
	udelay(20);
-
 
149
}
133
 
150
 
134
/* Note: The caller is required to filter out dpms modes not supported by the
151
/* Note: The caller is required to filter out dpms modes not supported by the
135
 * platform. */
152
 * platform. */
136
static void intel_crt_set_dpms(struct intel_encoder *encoder, int mode)
153
static void intel_crt_set_dpms(struct intel_encoder *encoder, int mode)
137
{
154
{
138
	struct drm_device *dev = encoder->base.dev;
155
	struct drm_device *dev = encoder->base.dev;
139
	struct drm_i915_private *dev_priv = dev->dev_private;
156
	struct drm_i915_private *dev_priv = dev->dev_private;
140
	struct intel_crt *crt = intel_encoder_to_crt(encoder);
157
	struct intel_crt *crt = intel_encoder_to_crt(encoder);
-
 
158
	struct intel_crtc *crtc = to_intel_crtc(encoder->base.crtc);
-
 
159
	struct drm_display_mode *adjusted_mode = &crtc->config.adjusted_mode;
141
	u32 temp;
160
	u32 adpa;
-
 
161
 
142
 
162
	if (INTEL_INFO(dev)->gen >= 5)
-
 
163
		adpa = ADPA_HOTPLUG_BITS;
-
 
164
	else
-
 
165
		adpa = 0;
-
 
166
 
143
	temp = I915_READ(crt->adpa_reg);
167
	if (adjusted_mode->flags & DRM_MODE_FLAG_PHSYNC)
-
 
168
		adpa |= ADPA_HSYNC_ACTIVE_HIGH;
-
 
169
	if (adjusted_mode->flags & DRM_MODE_FLAG_PVSYNC)
-
 
170
		adpa |= ADPA_VSYNC_ACTIVE_HIGH;
-
 
171
 
-
 
172
	/* For CPT allow 3 pipe config, for others just use A or B */
-
 
173
	if (HAS_PCH_LPT(dev))
-
 
174
		; /* Those bits don't exist here */
-
 
175
	else if (HAS_PCH_CPT(dev))
-
 
176
		adpa |= PORT_TRANS_SEL_CPT(crtc->pipe);
-
 
177
	else if (crtc->pipe == 0)
-
 
178
		adpa |= ADPA_PIPE_A_SELECT;
144
	temp &= ~(ADPA_HSYNC_CNTL_DISABLE | ADPA_VSYNC_CNTL_DISABLE);
179
	else
-
 
180
		adpa |= ADPA_PIPE_B_SELECT;
-
 
181
 
-
 
182
	if (!HAS_PCH_SPLIT(dev))
145
	temp &= ~ADPA_DAC_ENABLE;
183
		I915_WRITE(BCLRPAT(crtc->pipe), 0);
146
 
184
 
147
	switch (mode) {
185
	switch (mode) {
148
	case DRM_MODE_DPMS_ON:
186
	case DRM_MODE_DPMS_ON:
149
		temp |= ADPA_DAC_ENABLE;
187
		adpa |= ADPA_DAC_ENABLE;
150
		break;
188
		break;
151
	case DRM_MODE_DPMS_STANDBY:
189
	case DRM_MODE_DPMS_STANDBY:
152
		temp |= ADPA_DAC_ENABLE | ADPA_HSYNC_CNTL_DISABLE;
190
		adpa |= ADPA_DAC_ENABLE | ADPA_HSYNC_CNTL_DISABLE;
153
		break;
191
		break;
154
	case DRM_MODE_DPMS_SUSPEND:
192
	case DRM_MODE_DPMS_SUSPEND:
155
		temp |= ADPA_DAC_ENABLE | ADPA_VSYNC_CNTL_DISABLE;
193
		adpa |= ADPA_DAC_ENABLE | ADPA_VSYNC_CNTL_DISABLE;
156
		break;
194
		break;
157
	case DRM_MODE_DPMS_OFF:
195
	case DRM_MODE_DPMS_OFF:
158
		temp |= ADPA_HSYNC_CNTL_DISABLE | ADPA_VSYNC_CNTL_DISABLE;
196
		adpa |= ADPA_HSYNC_CNTL_DISABLE | ADPA_VSYNC_CNTL_DISABLE;
159
		break;
197
		break;
160
	}
198
	}
161
 
199
 
162
	I915_WRITE(crt->adpa_reg, temp);
200
	I915_WRITE(crt->adpa_reg, adpa);
163
}
201
}
164
 
202
 
165
static void intel_disable_crt(struct intel_encoder *encoder)
203
static void intel_disable_crt(struct intel_encoder *encoder)
166
{
204
{
167
	intel_crt_set_dpms(encoder, DRM_MODE_DPMS_OFF);
205
	intel_crt_set_dpms(encoder, DRM_MODE_DPMS_OFF);
168
}
206
}
-
 
207
 
-
 
208
 
-
 
209
static void hsw_crt_post_disable(struct intel_encoder *encoder)
-
 
210
{
-
 
211
	struct drm_device *dev = encoder->base.dev;
-
 
212
	struct drm_i915_private *dev_priv = dev->dev_private;
-
 
213
	uint32_t val;
-
 
214
 
-
 
215
	DRM_DEBUG_KMS("Disabling SPLL\n");
-
 
216
	val = I915_READ(SPLL_CTL);
-
 
217
	WARN_ON(!(val & SPLL_PLL_ENABLE));
-
 
218
	I915_WRITE(SPLL_CTL, val & ~SPLL_PLL_ENABLE);
-
 
219
	POSTING_READ(SPLL_CTL);
-
 
220
}
169
 
221
 
170
static void intel_enable_crt(struct intel_encoder *encoder)
222
static void intel_enable_crt(struct intel_encoder *encoder)
171
{
223
{
172
	struct intel_crt *crt = intel_encoder_to_crt(encoder);
224
	struct intel_crt *crt = intel_encoder_to_crt(encoder);
173
 
225
 
174
	intel_crt_set_dpms(encoder, crt->connector->base.dpms);
226
	intel_crt_set_dpms(encoder, crt->connector->base.dpms);
175
}
227
}
176
 
228
 
177
/* Special dpms function to support cloning between dvo/sdvo/crt. */
229
/* Special dpms function to support cloning between dvo/sdvo/crt. */
178
static void intel_crt_dpms(struct drm_connector *connector, int mode)
230
static void intel_crt_dpms(struct drm_connector *connector, int mode)
179
{
231
{
180
	struct drm_device *dev = connector->dev;
232
	struct drm_device *dev = connector->dev;
181
	struct intel_encoder *encoder = intel_attached_encoder(connector);
233
	struct intel_encoder *encoder = intel_attached_encoder(connector);
182
	struct drm_crtc *crtc;
234
	struct drm_crtc *crtc;
183
	int old_dpms;
235
	int old_dpms;
184
 
236
 
185
	/* PCH platforms and VLV only support on/off. */
237
	/* PCH platforms and VLV only support on/off. */
186
	if (INTEL_INFO(dev)->gen >= 5 && mode != DRM_MODE_DPMS_ON)
238
	if (INTEL_INFO(dev)->gen >= 5 && mode != DRM_MODE_DPMS_ON)
187
		mode = DRM_MODE_DPMS_OFF;
239
		mode = DRM_MODE_DPMS_OFF;
188
 
240
 
189
	if (mode == connector->dpms)
241
	if (mode == connector->dpms)
190
		return;
242
		return;
191
 
243
 
192
	old_dpms = connector->dpms;
244
	old_dpms = connector->dpms;
193
	connector->dpms = mode;
245
	connector->dpms = mode;
194
 
246
 
195
	/* Only need to change hw state when actually enabled */
247
	/* Only need to change hw state when actually enabled */
196
	crtc = encoder->base.crtc;
248
	crtc = encoder->base.crtc;
197
	if (!crtc) {
249
	if (!crtc) {
198
		encoder->connectors_active = false;
250
		encoder->connectors_active = false;
199
		return;
251
		return;
200
	}
252
	}
201
 
253
 
202
	/* We need the pipe to run for anything but OFF. */
254
	/* We need the pipe to run for anything but OFF. */
203
	if (mode == DRM_MODE_DPMS_OFF)
255
	if (mode == DRM_MODE_DPMS_OFF)
204
		encoder->connectors_active = false;
256
		encoder->connectors_active = false;
205
	else
257
	else
206
		encoder->connectors_active = true;
258
		encoder->connectors_active = true;
207
 
259
 
208
	/* We call connector dpms manually below in case pipe dpms doesn't
260
	/* We call connector dpms manually below in case pipe dpms doesn't
209
	 * change due to cloning. */
261
	 * change due to cloning. */
210
	if (mode < old_dpms) {
262
	if (mode < old_dpms) {
211
		/* From off to on, enable the pipe first. */
263
		/* From off to on, enable the pipe first. */
212
		intel_crtc_update_dpms(crtc);
264
		intel_crtc_update_dpms(crtc);
213
 
265
 
214
		intel_crt_set_dpms(encoder, mode);
266
		intel_crt_set_dpms(encoder, mode);
215
	} else {
267
	} else {
216
		intel_crt_set_dpms(encoder, mode);
268
		intel_crt_set_dpms(encoder, mode);
217
 
269
 
218
		intel_crtc_update_dpms(crtc);
270
		intel_crtc_update_dpms(crtc);
219
	}
271
	}
220
 
272
 
221
	intel_modeset_check_state(connector->dev);
273
	intel_modeset_check_state(connector->dev);
222
}
274
}
223
 
275
 
224
static enum drm_mode_status
276
static enum drm_mode_status
225
intel_crt_mode_valid(struct drm_connector *connector,
277
intel_crt_mode_valid(struct drm_connector *connector,
226
				struct drm_display_mode *mode)
278
		     struct drm_display_mode *mode)
227
{
279
{
228
	struct drm_device *dev = connector->dev;
280
	struct drm_device *dev = connector->dev;
229
 
281
 
230
	int max_clock = 0;
282
	int max_clock = 0;
231
	if (mode->flags & DRM_MODE_FLAG_DBLSCAN)
283
	if (mode->flags & DRM_MODE_FLAG_DBLSCAN)
232
		return MODE_NO_DBLESCAN;
284
		return MODE_NO_DBLESCAN;
233
 
285
 
234
	if (mode->clock < 25000)
286
	if (mode->clock < 25000)
235
		return MODE_CLOCK_LOW;
287
		return MODE_CLOCK_LOW;
236
 
288
 
237
	if (IS_GEN2(dev))
289
	if (IS_GEN2(dev))
238
		max_clock = 350000;
290
		max_clock = 350000;
239
	else
291
	else
240
		max_clock = 400000;
292
		max_clock = 400000;
241
	if (mode->clock > max_clock)
293
	if (mode->clock > max_clock)
242
		return MODE_CLOCK_HIGH;
294
		return MODE_CLOCK_HIGH;
243
 
295
 
244
	/* The FDI receiver on LPT only supports 8bpc and only has 2 lanes. */
296
	/* The FDI receiver on LPT only supports 8bpc and only has 2 lanes. */
245
	if (HAS_PCH_LPT(dev) &&
297
	if (HAS_PCH_LPT(dev) &&
246
	    (ironlake_get_lanes_required(mode->clock, 270000, 24) > 2))
298
	    (ironlake_get_lanes_required(mode->clock, 270000, 24) > 2))
247
		return MODE_CLOCK_HIGH;
299
		return MODE_CLOCK_HIGH;
248
 
300
 
249
	return MODE_OK;
301
	return MODE_OK;
250
}
302
}
251
 
303
 
252
static bool intel_crt_compute_config(struct intel_encoder *encoder,
304
static bool intel_crt_compute_config(struct intel_encoder *encoder,
253
				     struct intel_crtc_config *pipe_config)
305
				     struct intel_crtc_config *pipe_config)
254
{
306
{
255
	struct drm_device *dev = encoder->base.dev;
307
	struct drm_device *dev = encoder->base.dev;
256
 
308
 
257
	if (HAS_PCH_SPLIT(dev))
309
	if (HAS_PCH_SPLIT(dev))
258
		pipe_config->has_pch_encoder = true;
310
		pipe_config->has_pch_encoder = true;
259
 
311
 
260
	/* LPT FDI RX only supports 8bpc. */
312
	/* LPT FDI RX only supports 8bpc. */
261
	if (HAS_PCH_LPT(dev))
313
	if (HAS_PCH_LPT(dev))
262
		pipe_config->pipe_bpp = 24;
314
		pipe_config->pipe_bpp = 24;
-
 
315
 
263
 
316
	/* FDI must always be 2.7 GHz */
-
 
317
	if (HAS_DDI(dev)) {
-
 
318
		pipe_config->ddi_pll_sel = PORT_CLK_SEL_SPLL;
264
	return true;
319
		pipe_config->port_clock = 135000 * 2;
265
}
-
 
266
 
-
 
267
static void intel_crt_mode_set(struct intel_encoder *encoder)
-
 
268
{
-
 
269
 
-
 
270
	struct drm_device *dev = encoder->base.dev;
-
 
271
	struct intel_crt *crt = intel_encoder_to_crt(encoder);
-
 
272
	struct intel_crtc *crtc = to_intel_crtc(encoder->base.crtc);
-
 
273
	struct drm_i915_private *dev_priv = dev->dev_private;
320
	}
274
	struct drm_display_mode *adjusted_mode = &crtc->config.adjusted_mode;
-
 
275
	u32 adpa;
-
 
276
 
-
 
277
	if (INTEL_INFO(dev)->gen >= 5)
-
 
278
	adpa = ADPA_HOTPLUG_BITS;
-
 
279
	else
-
 
280
		adpa = 0;
-
 
281
 
-
 
282
	if (adjusted_mode->flags & DRM_MODE_FLAG_PHSYNC)
-
 
283
		adpa |= ADPA_HSYNC_ACTIVE_HIGH;
-
 
284
	if (adjusted_mode->flags & DRM_MODE_FLAG_PVSYNC)
-
 
285
		adpa |= ADPA_VSYNC_ACTIVE_HIGH;
-
 
286
 
-
 
287
	/* For CPT allow 3 pipe config, for others just use A or B */
-
 
288
	if (HAS_PCH_LPT(dev))
-
 
289
		; /* Those bits don't exist here */
-
 
290
	else if (HAS_PCH_CPT(dev))
-
 
291
		adpa |= PORT_TRANS_SEL_CPT(crtc->pipe);
-
 
292
	else if (crtc->pipe == 0)
-
 
293
			adpa |= ADPA_PIPE_A_SELECT;
-
 
294
		else
-
 
295
			adpa |= ADPA_PIPE_B_SELECT;
-
 
296
 
-
 
297
	if (!HAS_PCH_SPLIT(dev))
-
 
298
		I915_WRITE(BCLRPAT(crtc->pipe), 0);
-
 
299
 
321
 
300
	I915_WRITE(crt->adpa_reg, adpa);
322
	return true;
301
}
323
}
302
 
324
 
303
static bool intel_ironlake_crt_detect_hotplug(struct drm_connector *connector)
325
static bool intel_ironlake_crt_detect_hotplug(struct drm_connector *connector)
304
{
326
{
305
	struct drm_device *dev = connector->dev;
327
	struct drm_device *dev = connector->dev;
306
	struct intel_crt *crt = intel_attached_crt(connector);
328
	struct intel_crt *crt = intel_attached_crt(connector);
307
	struct drm_i915_private *dev_priv = dev->dev_private;
329
	struct drm_i915_private *dev_priv = dev->dev_private;
308
	u32 adpa;
330
	u32 adpa;
309
	bool ret;
331
	bool ret;
310
 
332
 
311
	/* The first time through, trigger an explicit detection cycle */
333
	/* The first time through, trigger an explicit detection cycle */
312
	if (crt->force_hotplug_required) {
334
	if (crt->force_hotplug_required) {
313
		bool turn_off_dac = HAS_PCH_SPLIT(dev);
335
		bool turn_off_dac = HAS_PCH_SPLIT(dev);
314
		u32 save_adpa;
336
		u32 save_adpa;
315
 
337
 
316
		crt->force_hotplug_required = 0;
338
		crt->force_hotplug_required = 0;
317
 
339
 
318
		save_adpa = adpa = I915_READ(crt->adpa_reg);
340
		save_adpa = adpa = I915_READ(crt->adpa_reg);
319
		DRM_DEBUG_KMS("trigger hotplug detect cycle: adpa=0x%x\n", adpa);
341
		DRM_DEBUG_KMS("trigger hotplug detect cycle: adpa=0x%x\n", adpa);
320
 
342
 
321
		adpa |= ADPA_CRT_HOTPLUG_FORCE_TRIGGER;
343
		adpa |= ADPA_CRT_HOTPLUG_FORCE_TRIGGER;
322
		if (turn_off_dac)
344
		if (turn_off_dac)
323
			adpa &= ~ADPA_DAC_ENABLE;
345
			adpa &= ~ADPA_DAC_ENABLE;
324
 
346
 
325
		I915_WRITE(crt->adpa_reg, adpa);
347
		I915_WRITE(crt->adpa_reg, adpa);
326
 
348
 
327
		if (wait_for((I915_READ(crt->adpa_reg) & ADPA_CRT_HOTPLUG_FORCE_TRIGGER) == 0,
349
		if (wait_for((I915_READ(crt->adpa_reg) & ADPA_CRT_HOTPLUG_FORCE_TRIGGER) == 0,
328
			     1000))
350
			     1000))
329
			DRM_DEBUG_KMS("timed out waiting for FORCE_TRIGGER");
351
			DRM_DEBUG_KMS("timed out waiting for FORCE_TRIGGER");
330
 
352
 
331
		if (turn_off_dac) {
353
		if (turn_off_dac) {
332
			I915_WRITE(crt->adpa_reg, save_adpa);
354
			I915_WRITE(crt->adpa_reg, save_adpa);
333
			POSTING_READ(crt->adpa_reg);
355
			POSTING_READ(crt->adpa_reg);
334
		}
356
		}
335
	}
357
	}
336
 
358
 
337
	/* Check the status to see if both blue and green are on now */
359
	/* Check the status to see if both blue and green are on now */
338
	adpa = I915_READ(crt->adpa_reg);
360
	adpa = I915_READ(crt->adpa_reg);
339
	if ((adpa & ADPA_CRT_HOTPLUG_MONITOR_MASK) != 0)
361
	if ((adpa & ADPA_CRT_HOTPLUG_MONITOR_MASK) != 0)
340
		ret = true;
362
		ret = true;
341
	else
363
	else
342
		ret = false;
364
		ret = false;
343
	DRM_DEBUG_KMS("ironlake hotplug adpa=0x%x, result %d\n", adpa, ret);
365
	DRM_DEBUG_KMS("ironlake hotplug adpa=0x%x, result %d\n", adpa, ret);
344
 
366
 
345
	return ret;
367
	return ret;
346
}
368
}
347
 
369
 
348
static bool valleyview_crt_detect_hotplug(struct drm_connector *connector)
370
static bool valleyview_crt_detect_hotplug(struct drm_connector *connector)
349
{
371
{
350
	struct drm_device *dev = connector->dev;
372
	struct drm_device *dev = connector->dev;
351
	struct intel_crt *crt = intel_attached_crt(connector);
373
	struct intel_crt *crt = intel_attached_crt(connector);
352
	struct drm_i915_private *dev_priv = dev->dev_private;
374
	struct drm_i915_private *dev_priv = dev->dev_private;
353
	u32 adpa;
375
	u32 adpa;
354
	bool ret;
376
	bool ret;
355
	u32 save_adpa;
377
	u32 save_adpa;
356
 
378
 
357
	save_adpa = adpa = I915_READ(crt->adpa_reg);
379
	save_adpa = adpa = I915_READ(crt->adpa_reg);
358
	DRM_DEBUG_KMS("trigger hotplug detect cycle: adpa=0x%x\n", adpa);
380
	DRM_DEBUG_KMS("trigger hotplug detect cycle: adpa=0x%x\n", adpa);
359
 
381
 
360
	adpa |= ADPA_CRT_HOTPLUG_FORCE_TRIGGER;
382
	adpa |= ADPA_CRT_HOTPLUG_FORCE_TRIGGER;
361
 
383
 
362
	I915_WRITE(crt->adpa_reg, adpa);
384
	I915_WRITE(crt->adpa_reg, adpa);
363
 
385
 
364
	if (wait_for((I915_READ(crt->adpa_reg) & ADPA_CRT_HOTPLUG_FORCE_TRIGGER) == 0,
386
	if (wait_for((I915_READ(crt->adpa_reg) & ADPA_CRT_HOTPLUG_FORCE_TRIGGER) == 0,
365
		     1000)) {
387
		     1000)) {
366
		DRM_DEBUG_KMS("timed out waiting for FORCE_TRIGGER");
388
		DRM_DEBUG_KMS("timed out waiting for FORCE_TRIGGER");
367
		I915_WRITE(crt->adpa_reg, save_adpa);
389
		I915_WRITE(crt->adpa_reg, save_adpa);
368
	}
390
	}
369
 
391
 
370
	/* Check the status to see if both blue and green are on now */
392
	/* Check the status to see if both blue and green are on now */
371
	adpa = I915_READ(crt->adpa_reg);
393
	adpa = I915_READ(crt->adpa_reg);
372
	if ((adpa & ADPA_CRT_HOTPLUG_MONITOR_MASK) != 0)
394
	if ((adpa & ADPA_CRT_HOTPLUG_MONITOR_MASK) != 0)
373
		ret = true;
395
		ret = true;
374
	else
396
	else
375
		ret = false;
397
		ret = false;
376
 
398
 
377
	DRM_DEBUG_KMS("valleyview hotplug adpa=0x%x, result %d\n", adpa, ret);
399
	DRM_DEBUG_KMS("valleyview hotplug adpa=0x%x, result %d\n", adpa, ret);
378
 
400
 
379
	return ret;
401
	return ret;
380
}
402
}
381
 
403
 
382
/**
404
/**
383
 * Uses CRT_HOTPLUG_EN and CRT_HOTPLUG_STAT to detect CRT presence.
405
 * Uses CRT_HOTPLUG_EN and CRT_HOTPLUG_STAT to detect CRT presence.
384
 *
406
 *
385
 * Not for i915G/i915GM
407
 * Not for i915G/i915GM
386
 *
408
 *
387
 * \return true if CRT is connected.
409
 * \return true if CRT is connected.
388
 * \return false if CRT is disconnected.
410
 * \return false if CRT is disconnected.
389
 */
411
 */
390
static bool intel_crt_detect_hotplug(struct drm_connector *connector)
412
static bool intel_crt_detect_hotplug(struct drm_connector *connector)
391
{
413
{
392
	struct drm_device *dev = connector->dev;
414
	struct drm_device *dev = connector->dev;
393
	struct drm_i915_private *dev_priv = dev->dev_private;
415
	struct drm_i915_private *dev_priv = dev->dev_private;
394
	u32 hotplug_en, orig, stat;
416
	u32 hotplug_en, orig, stat;
395
	bool ret = false;
417
	bool ret = false;
396
	int i, tries = 0;
418
	int i, tries = 0;
397
 
419
 
398
	if (HAS_PCH_SPLIT(dev))
420
	if (HAS_PCH_SPLIT(dev))
399
		return intel_ironlake_crt_detect_hotplug(connector);
421
		return intel_ironlake_crt_detect_hotplug(connector);
400
 
422
 
401
	if (IS_VALLEYVIEW(dev))
423
	if (IS_VALLEYVIEW(dev))
402
		return valleyview_crt_detect_hotplug(connector);
424
		return valleyview_crt_detect_hotplug(connector);
403
 
425
 
404
	/*
426
	/*
405
	 * On 4 series desktop, CRT detect sequence need to be done twice
427
	 * On 4 series desktop, CRT detect sequence need to be done twice
406
	 * to get a reliable result.
428
	 * to get a reliable result.
407
	 */
429
	 */
408
 
430
 
409
	if (IS_G4X(dev) && !IS_GM45(dev))
431
	if (IS_G4X(dev) && !IS_GM45(dev))
410
		tries = 2;
432
		tries = 2;
411
	else
433
	else
412
		tries = 1;
434
		tries = 1;
413
	hotplug_en = orig = I915_READ(PORT_HOTPLUG_EN);
435
	hotplug_en = orig = I915_READ(PORT_HOTPLUG_EN);
414
	hotplug_en |= CRT_HOTPLUG_FORCE_DETECT;
436
	hotplug_en |= CRT_HOTPLUG_FORCE_DETECT;
415
 
437
 
416
	for (i = 0; i < tries ; i++) {
438
	for (i = 0; i < tries ; i++) {
417
		/* turn on the FORCE_DETECT */
439
		/* turn on the FORCE_DETECT */
418
		I915_WRITE(PORT_HOTPLUG_EN, hotplug_en);
440
		I915_WRITE(PORT_HOTPLUG_EN, hotplug_en);
419
		/* wait for FORCE_DETECT to go off */
441
		/* wait for FORCE_DETECT to go off */
420
		if (wait_for((I915_READ(PORT_HOTPLUG_EN) &
442
		if (wait_for((I915_READ(PORT_HOTPLUG_EN) &
421
			      CRT_HOTPLUG_FORCE_DETECT) == 0,
443
			      CRT_HOTPLUG_FORCE_DETECT) == 0,
422
			     1000))
444
			     1000))
423
			DRM_DEBUG_KMS("timed out waiting for FORCE_DETECT to go off");
445
			DRM_DEBUG_KMS("timed out waiting for FORCE_DETECT to go off");
424
	}
446
	}
425
 
447
 
426
	stat = I915_READ(PORT_HOTPLUG_STAT);
448
	stat = I915_READ(PORT_HOTPLUG_STAT);
427
	if ((stat & CRT_HOTPLUG_MONITOR_MASK) != CRT_HOTPLUG_MONITOR_NONE)
449
	if ((stat & CRT_HOTPLUG_MONITOR_MASK) != CRT_HOTPLUG_MONITOR_NONE)
428
		ret = true;
450
		ret = true;
429
 
451
 
430
	/* clear the interrupt we just generated, if any */
452
	/* clear the interrupt we just generated, if any */
431
	I915_WRITE(PORT_HOTPLUG_STAT, CRT_HOTPLUG_INT_STATUS);
453
	I915_WRITE(PORT_HOTPLUG_STAT, CRT_HOTPLUG_INT_STATUS);
432
 
454
 
433
	/* and put the bits back */
455
	/* and put the bits back */
434
	I915_WRITE(PORT_HOTPLUG_EN, orig);
456
	I915_WRITE(PORT_HOTPLUG_EN, orig);
435
 
457
 
436
	return ret;
458
	return ret;
437
}
459
}
438
 
460
 
439
static struct edid *intel_crt_get_edid(struct drm_connector *connector,
461
static struct edid *intel_crt_get_edid(struct drm_connector *connector,
440
				struct i2c_adapter *i2c)
462
				struct i2c_adapter *i2c)
441
{
463
{
442
	struct edid *edid;
464
	struct edid *edid;
443
 
465
 
444
	edid = drm_get_edid(connector, i2c);
466
	edid = drm_get_edid(connector, i2c);
445
 
467
 
446
	if (!edid && !intel_gmbus_is_forced_bit(i2c)) {
468
	if (!edid && !intel_gmbus_is_forced_bit(i2c)) {
447
		DRM_DEBUG_KMS("CRT GMBUS EDID read failed, retry using GPIO bit-banging\n");
469
		DRM_DEBUG_KMS("CRT GMBUS EDID read failed, retry using GPIO bit-banging\n");
448
		intel_gmbus_force_bit(i2c, true);
470
		intel_gmbus_force_bit(i2c, true);
449
		edid = drm_get_edid(connector, i2c);
471
		edid = drm_get_edid(connector, i2c);
450
		intel_gmbus_force_bit(i2c, false);
472
		intel_gmbus_force_bit(i2c, false);
451
	}
473
	}
452
 
474
 
453
	return edid;
475
	return edid;
454
}
476
}
455
 
477
 
456
/* local version of intel_ddc_get_modes() to use intel_crt_get_edid() */
478
/* local version of intel_ddc_get_modes() to use intel_crt_get_edid() */
457
static int intel_crt_ddc_get_modes(struct drm_connector *connector,
479
static int intel_crt_ddc_get_modes(struct drm_connector *connector,
458
				struct i2c_adapter *adapter)
480
				struct i2c_adapter *adapter)
459
{
481
{
460
	struct edid *edid;
482
	struct edid *edid;
461
	int ret;
483
	int ret;
462
 
484
 
463
	edid = intel_crt_get_edid(connector, adapter);
485
	edid = intel_crt_get_edid(connector, adapter);
464
	if (!edid)
486
	if (!edid)
465
		return 0;
487
		return 0;
466
 
488
 
467
	ret = intel_connector_update_modes(connector, edid);
489
	ret = intel_connector_update_modes(connector, edid);
468
	kfree(edid);
490
	kfree(edid);
469
 
491
 
470
	return ret;
492
	return ret;
471
}
493
}
472
 
494
 
473
static bool intel_crt_detect_ddc(struct drm_connector *connector)
495
static bool intel_crt_detect_ddc(struct drm_connector *connector)
474
{
496
{
475
	struct intel_crt *crt = intel_attached_crt(connector);
497
	struct intel_crt *crt = intel_attached_crt(connector);
476
	struct drm_i915_private *dev_priv = crt->base.base.dev->dev_private;
498
	struct drm_i915_private *dev_priv = crt->base.base.dev->dev_private;
477
	struct edid *edid;
499
	struct edid *edid;
478
	struct i2c_adapter *i2c;
500
	struct i2c_adapter *i2c;
479
 
501
 
480
	BUG_ON(crt->base.type != INTEL_OUTPUT_ANALOG);
502
	BUG_ON(crt->base.type != INTEL_OUTPUT_ANALOG);
481
 
503
 
482
	i2c = intel_gmbus_get_adapter(dev_priv, dev_priv->vbt.crt_ddc_pin);
504
	i2c = intel_gmbus_get_adapter(dev_priv, dev_priv->vbt.crt_ddc_pin);
483
	edid = intel_crt_get_edid(connector, i2c);
505
	edid = intel_crt_get_edid(connector, i2c);
484
 
506
 
485
	if (edid) {
507
	if (edid) {
486
		bool is_digital = edid->input & DRM_EDID_INPUT_DIGITAL;
508
		bool is_digital = edid->input & DRM_EDID_INPUT_DIGITAL;
487
 
509
 
488
		/*
510
		/*
489
		 * This may be a DVI-I connector with a shared DDC
511
		 * This may be a DVI-I connector with a shared DDC
490
		 * link between analog and digital outputs, so we
512
		 * link between analog and digital outputs, so we
491
		 * have to check the EDID input spec of the attached device.
513
		 * have to check the EDID input spec of the attached device.
492
		 */
514
		 */
493
		if (!is_digital) {
515
		if (!is_digital) {
494
			DRM_DEBUG_KMS("CRT detected via DDC:0x50 [EDID]\n");
516
			DRM_DEBUG_KMS("CRT detected via DDC:0x50 [EDID]\n");
495
			return true;
517
			return true;
496
		}
518
		}
497
 
519
 
498
		DRM_DEBUG_KMS("CRT not detected via DDC:0x50 [EDID reports a digital panel]\n");
520
		DRM_DEBUG_KMS("CRT not detected via DDC:0x50 [EDID reports a digital panel]\n");
499
		} else {
521
	} else {
500
		DRM_DEBUG_KMS("CRT not detected via DDC:0x50 [no valid EDID found]\n");
522
		DRM_DEBUG_KMS("CRT not detected via DDC:0x50 [no valid EDID found]\n");
501
		}
523
	}
502
 
524
 
503
	kfree(edid);
525
	kfree(edid);
504
 
526
 
505
	return false;
527
	return false;
506
}
528
}
507
 
529
 
508
static enum drm_connector_status
530
static enum drm_connector_status
509
intel_crt_load_detect(struct intel_crt *crt)
531
intel_crt_load_detect(struct intel_crt *crt)
510
{
532
{
511
	struct drm_device *dev = crt->base.base.dev;
533
	struct drm_device *dev = crt->base.base.dev;
512
	struct drm_i915_private *dev_priv = dev->dev_private;
534
	struct drm_i915_private *dev_priv = dev->dev_private;
513
	uint32_t pipe = to_intel_crtc(crt->base.base.crtc)->pipe;
535
	uint32_t pipe = to_intel_crtc(crt->base.base.crtc)->pipe;
514
	uint32_t save_bclrpat;
536
	uint32_t save_bclrpat;
515
	uint32_t save_vtotal;
537
	uint32_t save_vtotal;
516
	uint32_t vtotal, vactive;
538
	uint32_t vtotal, vactive;
517
	uint32_t vsample;
539
	uint32_t vsample;
518
	uint32_t vblank, vblank_start, vblank_end;
540
	uint32_t vblank, vblank_start, vblank_end;
519
	uint32_t dsl;
541
	uint32_t dsl;
520
	uint32_t bclrpat_reg;
542
	uint32_t bclrpat_reg;
521
	uint32_t vtotal_reg;
543
	uint32_t vtotal_reg;
522
	uint32_t vblank_reg;
544
	uint32_t vblank_reg;
523
	uint32_t vsync_reg;
545
	uint32_t vsync_reg;
524
	uint32_t pipeconf_reg;
546
	uint32_t pipeconf_reg;
525
	uint32_t pipe_dsl_reg;
547
	uint32_t pipe_dsl_reg;
526
	uint8_t	st00;
548
	uint8_t	st00;
527
	enum drm_connector_status status;
549
	enum drm_connector_status status;
528
 
550
 
529
	DRM_DEBUG_KMS("starting load-detect on CRT\n");
551
	DRM_DEBUG_KMS("starting load-detect on CRT\n");
530
 
552
 
531
	bclrpat_reg = BCLRPAT(pipe);
553
	bclrpat_reg = BCLRPAT(pipe);
532
	vtotal_reg = VTOTAL(pipe);
554
	vtotal_reg = VTOTAL(pipe);
533
	vblank_reg = VBLANK(pipe);
555
	vblank_reg = VBLANK(pipe);
534
	vsync_reg = VSYNC(pipe);
556
	vsync_reg = VSYNC(pipe);
535
	pipeconf_reg = PIPECONF(pipe);
557
	pipeconf_reg = PIPECONF(pipe);
536
	pipe_dsl_reg = PIPEDSL(pipe);
558
	pipe_dsl_reg = PIPEDSL(pipe);
537
 
559
 
538
	save_bclrpat = I915_READ(bclrpat_reg);
560
	save_bclrpat = I915_READ(bclrpat_reg);
539
	save_vtotal = I915_READ(vtotal_reg);
561
	save_vtotal = I915_READ(vtotal_reg);
540
	vblank = I915_READ(vblank_reg);
562
	vblank = I915_READ(vblank_reg);
541
 
563
 
542
	vtotal = ((save_vtotal >> 16) & 0xfff) + 1;
564
	vtotal = ((save_vtotal >> 16) & 0xfff) + 1;
543
	vactive = (save_vtotal & 0x7ff) + 1;
565
	vactive = (save_vtotal & 0x7ff) + 1;
544
 
566
 
545
	vblank_start = (vblank & 0xfff) + 1;
567
	vblank_start = (vblank & 0xfff) + 1;
546
	vblank_end = ((vblank >> 16) & 0xfff) + 1;
568
	vblank_end = ((vblank >> 16) & 0xfff) + 1;
547
 
569
 
548
	/* Set the border color to purple. */
570
	/* Set the border color to purple. */
549
	I915_WRITE(bclrpat_reg, 0x500050);
571
	I915_WRITE(bclrpat_reg, 0x500050);
550
 
572
 
551
	if (!IS_GEN2(dev)) {
573
	if (!IS_GEN2(dev)) {
552
		uint32_t pipeconf = I915_READ(pipeconf_reg);
574
		uint32_t pipeconf = I915_READ(pipeconf_reg);
553
		I915_WRITE(pipeconf_reg, pipeconf | PIPECONF_FORCE_BORDER);
575
		I915_WRITE(pipeconf_reg, pipeconf | PIPECONF_FORCE_BORDER);
554
		POSTING_READ(pipeconf_reg);
576
		POSTING_READ(pipeconf_reg);
555
		/* Wait for next Vblank to substitue
577
		/* Wait for next Vblank to substitue
556
		 * border color for Color info */
578
		 * border color for Color info */
557
		intel_wait_for_vblank(dev, pipe);
579
		intel_wait_for_vblank(dev, pipe);
558
		st00 = I915_READ8(VGA_MSR_WRITE);
580
		st00 = I915_READ8(VGA_MSR_WRITE);
559
		status = ((st00 & (1 << 4)) != 0) ?
581
		status = ((st00 & (1 << 4)) != 0) ?
560
			connector_status_connected :
582
			connector_status_connected :
561
			connector_status_disconnected;
583
			connector_status_disconnected;
562
 
584
 
563
		I915_WRITE(pipeconf_reg, pipeconf);
585
		I915_WRITE(pipeconf_reg, pipeconf);
564
	} else {
586
	} else {
565
		bool restore_vblank = false;
587
		bool restore_vblank = false;
566
		int count, detect;
588
		int count, detect;
567
 
589
 
568
		/*
590
		/*
569
		* If there isn't any border, add some.
591
		* If there isn't any border, add some.
570
		* Yes, this will flicker
592
		* Yes, this will flicker
571
		*/
593
		*/
572
		if (vblank_start <= vactive && vblank_end >= vtotal) {
594
		if (vblank_start <= vactive && vblank_end >= vtotal) {
573
			uint32_t vsync = I915_READ(vsync_reg);
595
			uint32_t vsync = I915_READ(vsync_reg);
574
			uint32_t vsync_start = (vsync & 0xffff) + 1;
596
			uint32_t vsync_start = (vsync & 0xffff) + 1;
575
 
597
 
576
			vblank_start = vsync_start;
598
			vblank_start = vsync_start;
577
			I915_WRITE(vblank_reg,
599
			I915_WRITE(vblank_reg,
578
				   (vblank_start - 1) |
600
				   (vblank_start - 1) |
579
				   ((vblank_end - 1) << 16));
601
				   ((vblank_end - 1) << 16));
580
			restore_vblank = true;
602
			restore_vblank = true;
581
		}
603
		}
582
		/* sample in the vertical border, selecting the larger one */
604
		/* sample in the vertical border, selecting the larger one */
583
		if (vblank_start - vactive >= vtotal - vblank_end)
605
		if (vblank_start - vactive >= vtotal - vblank_end)
584
			vsample = (vblank_start + vactive) >> 1;
606
			vsample = (vblank_start + vactive) >> 1;
585
		else
607
		else
586
			vsample = (vtotal + vblank_end) >> 1;
608
			vsample = (vtotal + vblank_end) >> 1;
587
 
609
 
588
		/*
610
		/*
589
		 * Wait for the border to be displayed
611
		 * Wait for the border to be displayed
590
		 */
612
		 */
591
		while (I915_READ(pipe_dsl_reg) >= vactive)
613
		while (I915_READ(pipe_dsl_reg) >= vactive)
592
			;
614
			;
593
		while ((dsl = I915_READ(pipe_dsl_reg)) <= vsample)
615
		while ((dsl = I915_READ(pipe_dsl_reg)) <= vsample)
594
			;
616
			;
595
		/*
617
		/*
596
		 * Watch ST00 for an entire scanline
618
		 * Watch ST00 for an entire scanline
597
		 */
619
		 */
598
		detect = 0;
620
		detect = 0;
599
		count = 0;
621
		count = 0;
600
		do {
622
		do {
601
			count++;
623
			count++;
602
			/* Read the ST00 VGA status register */
624
			/* Read the ST00 VGA status register */
603
			st00 = I915_READ8(VGA_MSR_WRITE);
625
			st00 = I915_READ8(VGA_MSR_WRITE);
604
			if (st00 & (1 << 4))
626
			if (st00 & (1 << 4))
605
				detect++;
627
				detect++;
606
		} while ((I915_READ(pipe_dsl_reg) == dsl));
628
		} while ((I915_READ(pipe_dsl_reg) == dsl));
607
 
629
 
608
		/* restore vblank if necessary */
630
		/* restore vblank if necessary */
609
		if (restore_vblank)
631
		if (restore_vblank)
610
			I915_WRITE(vblank_reg, vblank);
632
			I915_WRITE(vblank_reg, vblank);
611
		/*
633
		/*
612
		 * If more than 3/4 of the scanline detected a monitor,
634
		 * If more than 3/4 of the scanline detected a monitor,
613
		 * then it is assumed to be present. This works even on i830,
635
		 * then it is assumed to be present. This works even on i830,
614
		 * where there isn't any way to force the border color across
636
		 * where there isn't any way to force the border color across
615
		 * the screen
637
		 * the screen
616
		 */
638
		 */
617
		status = detect * 4 > count * 3 ?
639
		status = detect * 4 > count * 3 ?
618
			 connector_status_connected :
640
			 connector_status_connected :
619
			 connector_status_disconnected;
641
			 connector_status_disconnected;
620
	}
642
	}
621
 
643
 
622
	/* Restore previous settings */
644
	/* Restore previous settings */
623
	I915_WRITE(bclrpat_reg, save_bclrpat);
645
	I915_WRITE(bclrpat_reg, save_bclrpat);
624
 
646
 
625
	return status;
647
	return status;
626
}
648
}
627
 
649
 
628
static enum drm_connector_status
650
static enum drm_connector_status
629
intel_crt_detect(struct drm_connector *connector, bool force)
651
intel_crt_detect(struct drm_connector *connector, bool force)
630
{
652
{
631
	struct drm_device *dev = connector->dev;
653
	struct drm_device *dev = connector->dev;
-
 
654
	struct drm_i915_private *dev_priv = dev->dev_private;
632
	struct intel_crt *crt = intel_attached_crt(connector);
655
	struct intel_crt *crt = intel_attached_crt(connector);
-
 
656
	struct intel_encoder *intel_encoder = &crt->base;
-
 
657
	enum intel_display_power_domain power_domain;
633
	enum drm_connector_status status;
658
	enum drm_connector_status status;
634
	struct intel_load_detect_pipe tmp;
659
	struct intel_load_detect_pipe tmp;
-
 
660
	struct drm_modeset_acquire_ctx ctx;
635
 
661
 
636
	DRM_DEBUG_KMS("[CONNECTOR:%d:%s] force=%d\n",
662
	DRM_DEBUG_KMS("[CONNECTOR:%d:%s] force=%d\n",
637
		      connector->base.id, drm_get_connector_name(connector),
663
		      connector->base.id, connector->name,
-
 
664
		      force);
-
 
665
 
-
 
666
	power_domain = intel_display_port_power_domain(intel_encoder);
638
		      force);
667
	intel_display_power_get(dev_priv, power_domain);
639
 
668
 
640
	if (I915_HAS_HOTPLUG(dev)) {
669
	if (I915_HAS_HOTPLUG(dev)) {
641
		/* We can not rely on the HPD pin always being correctly wired
670
		/* We can not rely on the HPD pin always being correctly wired
642
		 * up, for example many KVM do not pass it through, and so
671
		 * up, for example many KVM do not pass it through, and so
643
		 * only trust an assertion that the monitor is connected.
672
		 * only trust an assertion that the monitor is connected.
644
		 */
673
		 */
645
		if (intel_crt_detect_hotplug(connector)) {
674
		if (intel_crt_detect_hotplug(connector)) {
646
			DRM_DEBUG_KMS("CRT detected via hotplug\n");
675
			DRM_DEBUG_KMS("CRT detected via hotplug\n");
647
			return connector_status_connected;
676
			status = connector_status_connected;
-
 
677
			goto out;
648
		} else
678
		} else
649
			DRM_DEBUG_KMS("CRT not detected via hotplug\n");
679
			DRM_DEBUG_KMS("CRT not detected via hotplug\n");
650
	}
680
	}
651
 
681
 
652
	if (intel_crt_detect_ddc(connector))
682
	if (intel_crt_detect_ddc(connector)) {
-
 
683
		status = connector_status_connected;
-
 
684
		goto out;
653
		return connector_status_connected;
685
	}
654
 
686
 
655
	/* Load detection is broken on HPD capable machines. Whoever wants a
687
	/* Load detection is broken on HPD capable machines. Whoever wants a
656
	 * broken monitor (without edid) to work behind a broken kvm (that fails
688
	 * broken monitor (without edid) to work behind a broken kvm (that fails
657
	 * to have the right resistors for HP detection) needs to fix this up.
689
	 * to have the right resistors for HP detection) needs to fix this up.
658
	 * For now just bail out. */
690
	 * For now just bail out. */
659
	if (I915_HAS_HOTPLUG(dev))
691
	if (I915_HAS_HOTPLUG(dev)) {
660
		return connector_status_disconnected;
692
		status = connector_status_disconnected;
-
 
693
		goto out;
-
 
694
	}
-
 
695
 
-
 
696
	if (!force) {
-
 
697
		status = connector->status;
-
 
698
		goto out;
-
 
699
	}
661
 
-
 
662
	if (!force)
700
 
663
		return connector->status;
701
	drm_modeset_acquire_init(&ctx, 0);
664
 
702
 
665
	/* for pre-945g platforms use load detect */
703
	/* for pre-945g platforms use load detect */
666
	if (intel_get_load_detect_pipe(connector, NULL, &tmp)) {
704
	if (intel_get_load_detect_pipe(connector, NULL, &tmp, &ctx)) {
667
			if (intel_crt_detect_ddc(connector))
705
		if (intel_crt_detect_ddc(connector))
668
				status = connector_status_connected;
706
			status = connector_status_connected;
669
			else
707
		else
670
				status = intel_crt_load_detect(crt);
708
			status = intel_crt_load_detect(crt);
671
		intel_release_load_detect_pipe(connector, &tmp);
709
		intel_release_load_detect_pipe(connector, &tmp);
672
		} else
710
	} else
673
			status = connector_status_unknown;
711
		status = connector_status_unknown;
-
 
712
 
-
 
713
	drm_modeset_drop_locks(&ctx);
-
 
714
	drm_modeset_acquire_fini(&ctx);
-
 
715
 
-
 
716
out:
674
 
717
	intel_display_power_put(dev_priv, power_domain);
675
	return status;
718
	return status;
676
}
719
}
677
 
720
 
678
static void intel_crt_destroy(struct drm_connector *connector)
721
static void intel_crt_destroy(struct drm_connector *connector)
679
{
722
{
680
	drm_connector_cleanup(connector);
723
	drm_connector_cleanup(connector);
681
	kfree(connector);
724
	kfree(connector);
682
}
725
}
683
 
726
 
684
static int intel_crt_get_modes(struct drm_connector *connector)
727
static int intel_crt_get_modes(struct drm_connector *connector)
685
{
728
{
686
	struct drm_device *dev = connector->dev;
729
	struct drm_device *dev = connector->dev;
687
	struct drm_i915_private *dev_priv = dev->dev_private;
730
	struct drm_i915_private *dev_priv = dev->dev_private;
-
 
731
	struct intel_crt *crt = intel_attached_crt(connector);
-
 
732
	struct intel_encoder *intel_encoder = &crt->base;
-
 
733
	enum intel_display_power_domain power_domain;
688
	int ret;
734
	int ret;
689
	struct i2c_adapter *i2c;
735
	struct i2c_adapter *i2c;
-
 
736
 
-
 
737
	power_domain = intel_display_port_power_domain(intel_encoder);
-
 
738
	intel_display_power_get(dev_priv, power_domain);
690
 
739
 
691
	i2c = intel_gmbus_get_adapter(dev_priv, dev_priv->vbt.crt_ddc_pin);
740
	i2c = intel_gmbus_get_adapter(dev_priv, dev_priv->vbt.crt_ddc_pin);
692
	ret = intel_crt_ddc_get_modes(connector, i2c);
741
	ret = intel_crt_ddc_get_modes(connector, i2c);
693
	if (ret || !IS_G4X(dev))
742
	if (ret || !IS_G4X(dev))
694
		return ret;
743
		goto out;
695
 
744
 
696
	/* Try to probe digital port for output in DVI-I -> VGA mode. */
745
	/* Try to probe digital port for output in DVI-I -> VGA mode. */
697
	i2c = intel_gmbus_get_adapter(dev_priv, GMBUS_PORT_DPB);
746
	i2c = intel_gmbus_get_adapter(dev_priv, GMBUS_PORT_DPB);
698
	return intel_crt_ddc_get_modes(connector, i2c);
747
	ret = intel_crt_ddc_get_modes(connector, i2c);
-
 
748
 
-
 
749
out:
-
 
750
	intel_display_power_put(dev_priv, power_domain);
-
 
751
 
-
 
752
	return ret;
699
}
753
}
700
 
754
 
701
static int intel_crt_set_property(struct drm_connector *connector,
755
static int intel_crt_set_property(struct drm_connector *connector,
702
				  struct drm_property *property,
756
				  struct drm_property *property,
703
				  uint64_t value)
757
				  uint64_t value)
704
{
758
{
705
	return 0;
759
	return 0;
706
}
760
}
707
 
761
 
708
static void intel_crt_reset(struct drm_connector *connector)
762
static void intel_crt_reset(struct drm_connector *connector)
709
{
763
{
710
	struct drm_device *dev = connector->dev;
764
	struct drm_device *dev = connector->dev;
711
	struct drm_i915_private *dev_priv = dev->dev_private;
765
	struct drm_i915_private *dev_priv = dev->dev_private;
712
	struct intel_crt *crt = intel_attached_crt(connector);
766
	struct intel_crt *crt = intel_attached_crt(connector);
713
 
767
 
714
	if (INTEL_INFO(dev)->gen >= 5) {
768
	if (INTEL_INFO(dev)->gen >= 5) {
715
		u32 adpa;
769
		u32 adpa;
716
 
770
 
717
		adpa = I915_READ(crt->adpa_reg);
771
		adpa = I915_READ(crt->adpa_reg);
718
		adpa &= ~ADPA_CRT_HOTPLUG_MASK;
772
		adpa &= ~ADPA_CRT_HOTPLUG_MASK;
719
		adpa |= ADPA_HOTPLUG_BITS;
773
		adpa |= ADPA_HOTPLUG_BITS;
720
		I915_WRITE(crt->adpa_reg, adpa);
774
		I915_WRITE(crt->adpa_reg, adpa);
721
		POSTING_READ(crt->adpa_reg);
775
		POSTING_READ(crt->adpa_reg);
722
 
776
 
723
		DRM_DEBUG_KMS("pch crt adpa set to 0x%x\n", adpa);
777
		DRM_DEBUG_KMS("pch crt adpa set to 0x%x\n", adpa);
724
		crt->force_hotplug_required = 1;
778
		crt->force_hotplug_required = 1;
725
	}
779
	}
726
 
780
 
727
}
781
}
728
 
782
 
729
/*
783
/*
730
 * Routines for controlling stuff on the analog port
784
 * Routines for controlling stuff on the analog port
731
 */
785
 */
732
 
786
 
733
static const struct drm_connector_funcs intel_crt_connector_funcs = {
787
static const struct drm_connector_funcs intel_crt_connector_funcs = {
734
	.reset = intel_crt_reset,
788
	.reset = intel_crt_reset,
735
	.dpms = intel_crt_dpms,
789
	.dpms = intel_crt_dpms,
736
	.detect = intel_crt_detect,
790
	.detect = intel_crt_detect,
737
	.fill_modes = drm_helper_probe_single_connector_modes,
791
	.fill_modes = drm_helper_probe_single_connector_modes,
738
	.destroy = intel_crt_destroy,
792
	.destroy = intel_crt_destroy,
739
	.set_property = intel_crt_set_property,
793
	.set_property = intel_crt_set_property,
740
};
794
};
741
 
795
 
742
static const struct drm_connector_helper_funcs intel_crt_connector_helper_funcs = {
796
static const struct drm_connector_helper_funcs intel_crt_connector_helper_funcs = {
743
	.mode_valid = intel_crt_mode_valid,
797
	.mode_valid = intel_crt_mode_valid,
744
	.get_modes = intel_crt_get_modes,
798
	.get_modes = intel_crt_get_modes,
745
	.best_encoder = intel_best_encoder,
799
	.best_encoder = intel_best_encoder,
746
};
800
};
747
 
801
 
748
static const struct drm_encoder_funcs intel_crt_enc_funcs = {
802
static const struct drm_encoder_funcs intel_crt_enc_funcs = {
749
	.destroy = intel_encoder_destroy,
803
	.destroy = intel_encoder_destroy,
750
};
804
};
751
 
805
 
752
void intel_crt_init(struct drm_device *dev)
806
void intel_crt_init(struct drm_device *dev)
753
{
807
{
754
	struct drm_connector *connector;
808
	struct drm_connector *connector;
755
	struct intel_crt *crt;
809
	struct intel_crt *crt;
756
	struct intel_connector *intel_connector;
810
	struct intel_connector *intel_connector;
757
	struct drm_i915_private *dev_priv = dev->dev_private;
811
	struct drm_i915_private *dev_priv = dev->dev_private;
758
 
812
 
759
	crt = kzalloc(sizeof(struct intel_crt), GFP_KERNEL);
813
	crt = kzalloc(sizeof(struct intel_crt), GFP_KERNEL);
760
	if (!crt)
814
	if (!crt)
761
		return;
815
		return;
762
 
816
 
763
	intel_connector = kzalloc(sizeof(*intel_connector), GFP_KERNEL);
817
	intel_connector = kzalloc(sizeof(*intel_connector), GFP_KERNEL);
764
	if (!intel_connector) {
818
	if (!intel_connector) {
765
		kfree(crt);
819
		kfree(crt);
766
		return;
820
		return;
767
	}
821
	}
768
 
822
 
769
	connector = &intel_connector->base;
823
	connector = &intel_connector->base;
770
	crt->connector = intel_connector;
824
	crt->connector = intel_connector;
771
	drm_connector_init(dev, &intel_connector->base,
825
	drm_connector_init(dev, &intel_connector->base,
772
			   &intel_crt_connector_funcs, DRM_MODE_CONNECTOR_VGA);
826
			   &intel_crt_connector_funcs, DRM_MODE_CONNECTOR_VGA);
773
 
827
 
774
	drm_encoder_init(dev, &crt->base.base, &intel_crt_enc_funcs,
828
	drm_encoder_init(dev, &crt->base.base, &intel_crt_enc_funcs,
775
			 DRM_MODE_ENCODER_DAC);
829
			 DRM_MODE_ENCODER_DAC);
776
 
830
 
777
	intel_connector_attach_encoder(intel_connector, &crt->base);
831
	intel_connector_attach_encoder(intel_connector, &crt->base);
778
 
832
 
779
	crt->base.type = INTEL_OUTPUT_ANALOG;
833
	crt->base.type = INTEL_OUTPUT_ANALOG;
780
	crt->base.cloneable = true;
834
	crt->base.cloneable = (1 << INTEL_OUTPUT_DVO) | (1 << INTEL_OUTPUT_HDMI);
781
	if (IS_I830(dev))
835
	if (IS_I830(dev))
782
		crt->base.crtc_mask = (1 << 0);
836
		crt->base.crtc_mask = (1 << 0);
783
	else
837
	else
784
		crt->base.crtc_mask = (1 << 0) | (1 << 1) | (1 << 2);
838
		crt->base.crtc_mask = (1 << 0) | (1 << 1) | (1 << 2);
785
 
839
 
786
	if (IS_GEN2(dev))
840
	if (IS_GEN2(dev))
787
		connector->interlace_allowed = 0;
841
		connector->interlace_allowed = 0;
788
	else
842
	else
789
	connector->interlace_allowed = 1;
843
	connector->interlace_allowed = 1;
790
	connector->doublescan_allowed = 0;
844
	connector->doublescan_allowed = 0;
791
 
845
 
792
	if (HAS_PCH_SPLIT(dev))
846
	if (HAS_PCH_SPLIT(dev))
793
		crt->adpa_reg = PCH_ADPA;
847
		crt->adpa_reg = PCH_ADPA;
794
	else if (IS_VALLEYVIEW(dev))
848
	else if (IS_VALLEYVIEW(dev))
795
		crt->adpa_reg = VLV_ADPA;
849
		crt->adpa_reg = VLV_ADPA;
796
	else
850
	else
797
		crt->adpa_reg = ADPA;
851
		crt->adpa_reg = ADPA;
798
 
852
 
799
	crt->base.compute_config = intel_crt_compute_config;
853
	crt->base.compute_config = intel_crt_compute_config;
800
	crt->base.mode_set = intel_crt_mode_set;
-
 
801
	crt->base.disable = intel_disable_crt;
854
	crt->base.disable = intel_disable_crt;
802
	crt->base.enable = intel_enable_crt;
855
	crt->base.enable = intel_enable_crt;
803
	if (I915_HAS_HOTPLUG(dev))
856
	if (I915_HAS_HOTPLUG(dev))
804
		crt->base.hpd_pin = HPD_CRT;
857
		crt->base.hpd_pin = HPD_CRT;
805
	if (HAS_DDI(dev)) {
858
	if (HAS_DDI(dev)) {
806
		crt->base.get_config = hsw_crt_get_config;
859
		crt->base.get_config = hsw_crt_get_config;
807
		crt->base.get_hw_state = intel_ddi_get_hw_state;
860
		crt->base.get_hw_state = intel_ddi_get_hw_state;
-
 
861
		crt->base.pre_enable = hsw_crt_pre_enable;
-
 
862
		crt->base.post_disable = hsw_crt_post_disable;
808
	} else {
863
	} else {
809
		crt->base.get_config = intel_crt_get_config;
864
		crt->base.get_config = intel_crt_get_config;
810
	crt->base.get_hw_state = intel_crt_get_hw_state;
865
	crt->base.get_hw_state = intel_crt_get_hw_state;
811
	}
866
	}
812
	intel_connector->get_hw_state = intel_connector_get_hw_state;
867
	intel_connector->get_hw_state = intel_connector_get_hw_state;
-
 
868
	intel_connector->unregister = intel_connector_unregister;
813
 
869
 
814
	drm_connector_helper_add(connector, &intel_crt_connector_helper_funcs);
870
	drm_connector_helper_add(connector, &intel_crt_connector_helper_funcs);
815
 
871
 
816
	drm_sysfs_connector_add(connector);
872
	drm_connector_register(connector);
817
 
873
 
818
	if (!I915_HAS_HOTPLUG(dev))
874
	if (!I915_HAS_HOTPLUG(dev))
819
		intel_connector->polled = DRM_CONNECTOR_POLL_CONNECT;
875
		intel_connector->polled = DRM_CONNECTOR_POLL_CONNECT;
820
 
876
 
821
	/*
877
	/*
822
	 * Configure the automatic hotplug detection stuff
878
	 * Configure the automatic hotplug detection stuff
823
	 */
879
	 */
824
	crt->force_hotplug_required = 0;
880
	crt->force_hotplug_required = 0;
825
 
881
 
826
	/*
882
	/*
827
	 * TODO: find a proper way to discover whether we need to set the the
883
	 * TODO: find a proper way to discover whether we need to set the the
828
	 * polarity and link reversal bits or not, instead of relying on the
884
	 * polarity and link reversal bits or not, instead of relying on the
829
	 * BIOS.
885
	 * BIOS.
830
	 */
886
	 */
831
	if (HAS_PCH_LPT(dev)) {
887
	if (HAS_PCH_LPT(dev)) {
832
		u32 fdi_config = FDI_RX_POLARITY_REVERSED_LPT |
888
		u32 fdi_config = FDI_RX_POLARITY_REVERSED_LPT |
833
				 FDI_RX_LINK_REVERSAL_OVERRIDE;
889
				 FDI_RX_LINK_REVERSAL_OVERRIDE;
834
 
890
 
835
		dev_priv->fdi_rx_config = I915_READ(_FDI_RXA_CTL) & fdi_config;
891
		dev_priv->fdi_rx_config = I915_READ(_FDI_RXA_CTL) & fdi_config;
836
	}
892
	}
-
 
893
 
-
 
894
	intel_crt_reset(connector);
837
}
895
}