Subversion Repositories Kolibri OS

Rev

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

Rev 3031 Rev 3243
1
/*
1
/*
2
 * Copyright 2006 Dave Airlie 
2
 * Copyright 2006 Dave Airlie 
3
 * Copyright © 2006-2009 Intel Corporation
3
 * Copyright © 2006-2009 Intel Corporation
4
 *
4
 *
5
 * Permission is hereby granted, free of charge, to any person obtaining a
5
 * Permission is hereby granted, free of charge, to any person obtaining a
6
 * copy of this software and associated documentation files (the "Software"),
6
 * copy of this software and associated documentation files (the "Software"),
7
 * to deal in the Software without restriction, including without limitation
7
 * to deal in the Software without restriction, including without limitation
8
 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
8
 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
9
 * and/or sell copies of the Software, and to permit persons to whom the
9
 * and/or sell copies of the Software, and to permit persons to whom the
10
 * Software is furnished to do so, subject to the following conditions:
10
 * Software is furnished to do so, subject to the following conditions:
11
 *
11
 *
12
 * The above copyright notice and this permission notice (including the next
12
 * The above copyright notice and this permission notice (including the next
13
 * paragraph) shall be included in all copies or substantial portions of the
13
 * paragraph) shall be included in all copies or substantial portions of the
14
 * Software.
14
 * Software.
15
 *
15
 *
16
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
17
 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18
 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
18
 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
19
 * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
 * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
20
 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
20
 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
21
 * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
21
 * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
22
 * DEALINGS IN THE SOFTWARE.
22
 * DEALINGS IN THE SOFTWARE.
23
 *
23
 *
24
 * Authors:
24
 * Authors:
25
 *	Eric Anholt 
25
 *	Eric Anholt 
26
 *	Jesse Barnes 
26
 *	Jesse Barnes 
27
 */
27
 */
28
 
28
 
29
#include 
29
#include 
30
#include 
30
#include 
31
#include 
31
#include 
32
#include 
32
#include 
33
#include 
33
#include 
34
#include 
34
#include 
35
#include "intel_drv.h"
35
#include "intel_drv.h"
36
#include 
36
#include 
37
#include "i915_drv.h"
37
#include "i915_drv.h"
-
 
38
 
-
 
39
static struct drm_device *intel_hdmi_to_dev(struct intel_hdmi *intel_hdmi)
-
 
40
{
-
 
41
	return hdmi_to_dig_port(intel_hdmi)->base.base.dev;
-
 
42
}
38
 
43
 
39
static void
44
static void
40
assert_hdmi_port_disabled(struct intel_hdmi *intel_hdmi)
45
assert_hdmi_port_disabled(struct intel_hdmi *intel_hdmi)
41
{
46
{
42
	struct drm_device *dev = intel_hdmi->base.base.dev;
47
	struct drm_device *dev = intel_hdmi_to_dev(intel_hdmi);
43
	struct drm_i915_private *dev_priv = dev->dev_private;
48
	struct drm_i915_private *dev_priv = dev->dev_private;
44
	uint32_t enabled_bits;
49
	uint32_t enabled_bits;
45
 
50
 
46
	enabled_bits = IS_HASWELL(dev) ? DDI_BUF_CTL_ENABLE : SDVO_ENABLE;
51
	enabled_bits = IS_HASWELL(dev) ? DDI_BUF_CTL_ENABLE : SDVO_ENABLE;
47
 
52
 
48
	WARN(I915_READ(intel_hdmi->sdvox_reg) & enabled_bits,
53
	WARN(I915_READ(intel_hdmi->sdvox_reg) & enabled_bits,
49
	     "HDMI port enabled, expecting disabled\n");
54
	     "HDMI port enabled, expecting disabled\n");
50
}
55
}
51
 
56
 
52
struct intel_hdmi *enc_to_intel_hdmi(struct drm_encoder *encoder)
57
struct intel_hdmi *enc_to_intel_hdmi(struct drm_encoder *encoder)
53
{
58
{
-
 
59
	struct intel_digital_port *intel_dig_port =
54
	return container_of(encoder, struct intel_hdmi, base.base);
60
		container_of(encoder, struct intel_digital_port, base.base);
-
 
61
	return &intel_dig_port->hdmi;
55
}
62
}
56
 
63
 
57
static struct intel_hdmi *intel_attached_hdmi(struct drm_connector *connector)
64
static struct intel_hdmi *intel_attached_hdmi(struct drm_connector *connector)
58
{
65
{
59
	return container_of(intel_attached_encoder(connector),
66
	return enc_to_intel_hdmi(&intel_attached_encoder(connector)->base);
60
			    struct intel_hdmi, base);
-
 
61
}
67
}
62
 
68
 
63
void intel_dip_infoframe_csum(struct dip_infoframe *frame)
69
void intel_dip_infoframe_csum(struct dip_infoframe *frame)
64
{
70
{
65
	uint8_t *data = (uint8_t *)frame;
71
	uint8_t *data = (uint8_t *)frame;
66
	uint8_t sum = 0;
72
	uint8_t sum = 0;
67
	unsigned i;
73
	unsigned i;
68
 
74
 
69
	frame->checksum = 0;
75
	frame->checksum = 0;
70
	frame->ecc = 0;
76
	frame->ecc = 0;
71
 
77
 
72
	for (i = 0; i < frame->len + DIP_HEADER_SIZE; i++)
78
	for (i = 0; i < frame->len + DIP_HEADER_SIZE; i++)
73
		sum += data[i];
79
		sum += data[i];
74
 
80
 
75
	frame->checksum = 0x100 - sum;
81
	frame->checksum = 0x100 - sum;
76
}
82
}
77
 
83
 
78
static u32 g4x_infoframe_index(struct dip_infoframe *frame)
84
static u32 g4x_infoframe_index(struct dip_infoframe *frame)
79
{
85
{
80
	switch (frame->type) {
86
	switch (frame->type) {
81
	case DIP_TYPE_AVI:
87
	case DIP_TYPE_AVI:
82
		return VIDEO_DIP_SELECT_AVI;
88
		return VIDEO_DIP_SELECT_AVI;
83
	case DIP_TYPE_SPD:
89
	case DIP_TYPE_SPD:
84
		return VIDEO_DIP_SELECT_SPD;
90
		return VIDEO_DIP_SELECT_SPD;
85
	default:
91
	default:
86
		DRM_DEBUG_DRIVER("unknown info frame type %d\n", frame->type);
92
		DRM_DEBUG_DRIVER("unknown info frame type %d\n", frame->type);
87
		return 0;
93
		return 0;
88
	}
94
	}
89
}
95
}
90
 
96
 
91
static u32 g4x_infoframe_enable(struct dip_infoframe *frame)
97
static u32 g4x_infoframe_enable(struct dip_infoframe *frame)
92
{
98
{
93
	switch (frame->type) {
99
	switch (frame->type) {
94
	case DIP_TYPE_AVI:
100
	case DIP_TYPE_AVI:
95
		return VIDEO_DIP_ENABLE_AVI;
101
		return VIDEO_DIP_ENABLE_AVI;
96
	case DIP_TYPE_SPD:
102
	case DIP_TYPE_SPD:
97
		return VIDEO_DIP_ENABLE_SPD;
103
		return VIDEO_DIP_ENABLE_SPD;
98
	default:
104
	default:
99
		DRM_DEBUG_DRIVER("unknown info frame type %d\n", frame->type);
105
		DRM_DEBUG_DRIVER("unknown info frame type %d\n", frame->type);
100
		return 0;
106
		return 0;
101
	}
107
	}
102
}
108
}
103
 
109
 
104
static u32 hsw_infoframe_enable(struct dip_infoframe *frame)
110
static u32 hsw_infoframe_enable(struct dip_infoframe *frame)
105
{
111
{
106
	switch (frame->type) {
112
	switch (frame->type) {
107
	case DIP_TYPE_AVI:
113
	case DIP_TYPE_AVI:
108
		return VIDEO_DIP_ENABLE_AVI_HSW;
114
		return VIDEO_DIP_ENABLE_AVI_HSW;
109
	case DIP_TYPE_SPD:
115
	case DIP_TYPE_SPD:
110
		return VIDEO_DIP_ENABLE_SPD_HSW;
116
		return VIDEO_DIP_ENABLE_SPD_HSW;
111
	default:
117
	default:
112
		DRM_DEBUG_DRIVER("unknown info frame type %d\n", frame->type);
118
		DRM_DEBUG_DRIVER("unknown info frame type %d\n", frame->type);
113
		return 0;
119
		return 0;
114
	}
120
	}
115
}
121
}
116
 
122
 
117
static u32 hsw_infoframe_data_reg(struct dip_infoframe *frame, enum pipe pipe)
123
static u32 hsw_infoframe_data_reg(struct dip_infoframe *frame, enum pipe pipe)
118
{
124
{
119
	switch (frame->type) {
125
	switch (frame->type) {
120
	case DIP_TYPE_AVI:
126
	case DIP_TYPE_AVI:
121
		return HSW_TVIDEO_DIP_AVI_DATA(pipe);
127
		return HSW_TVIDEO_DIP_AVI_DATA(pipe);
122
	case DIP_TYPE_SPD:
128
	case DIP_TYPE_SPD:
123
		return HSW_TVIDEO_DIP_SPD_DATA(pipe);
129
		return HSW_TVIDEO_DIP_SPD_DATA(pipe);
124
	default:
130
	default:
125
		DRM_DEBUG_DRIVER("unknown info frame type %d\n", frame->type);
131
		DRM_DEBUG_DRIVER("unknown info frame type %d\n", frame->type);
126
		return 0;
132
		return 0;
127
	}
133
	}
128
}
134
}
129
 
135
 
130
static void g4x_write_infoframe(struct drm_encoder *encoder,
136
static void g4x_write_infoframe(struct drm_encoder *encoder,
131
				 struct dip_infoframe *frame)
137
				 struct dip_infoframe *frame)
132
{
138
{
133
	uint32_t *data = (uint32_t *)frame;
139
	uint32_t *data = (uint32_t *)frame;
134
	struct drm_device *dev = encoder->dev;
140
	struct drm_device *dev = encoder->dev;
135
	struct drm_i915_private *dev_priv = dev->dev_private;
141
	struct drm_i915_private *dev_priv = dev->dev_private;
136
	u32 val = I915_READ(VIDEO_DIP_CTL);
142
	u32 val = I915_READ(VIDEO_DIP_CTL);
137
	unsigned i, len = DIP_HEADER_SIZE + frame->len;
143
	unsigned i, len = DIP_HEADER_SIZE + frame->len;
138
 
144
 
139
	WARN(!(val & VIDEO_DIP_ENABLE), "Writing DIP with CTL reg disabled\n");
145
	WARN(!(val & VIDEO_DIP_ENABLE), "Writing DIP with CTL reg disabled\n");
140
 
146
 
141
	val &= ~(VIDEO_DIP_SELECT_MASK | 0xf); /* clear DIP data offset */
147
	val &= ~(VIDEO_DIP_SELECT_MASK | 0xf); /* clear DIP data offset */
142
	val |= g4x_infoframe_index(frame);
148
	val |= g4x_infoframe_index(frame);
143
 
149
 
144
	val &= ~g4x_infoframe_enable(frame);
150
	val &= ~g4x_infoframe_enable(frame);
145
 
151
 
146
	I915_WRITE(VIDEO_DIP_CTL, val);
152
	I915_WRITE(VIDEO_DIP_CTL, val);
147
 
153
 
148
	mmiowb();
154
	mmiowb();
149
	for (i = 0; i < len; i += 4) {
155
	for (i = 0; i < len; i += 4) {
150
		I915_WRITE(VIDEO_DIP_DATA, *data);
156
		I915_WRITE(VIDEO_DIP_DATA, *data);
151
		data++;
157
		data++;
152
	}
158
	}
153
	/* Write every possible data byte to force correct ECC calculation. */
159
	/* Write every possible data byte to force correct ECC calculation. */
154
	for (; i < VIDEO_DIP_DATA_SIZE; i += 4)
160
	for (; i < VIDEO_DIP_DATA_SIZE; i += 4)
155
		I915_WRITE(VIDEO_DIP_DATA, 0);
161
		I915_WRITE(VIDEO_DIP_DATA, 0);
156
	mmiowb();
162
	mmiowb();
157
 
163
 
158
	val |= g4x_infoframe_enable(frame);
164
	val |= g4x_infoframe_enable(frame);
159
	val &= ~VIDEO_DIP_FREQ_MASK;
165
	val &= ~VIDEO_DIP_FREQ_MASK;
160
	val |= VIDEO_DIP_FREQ_VSYNC;
166
	val |= VIDEO_DIP_FREQ_VSYNC;
161
 
167
 
162
	I915_WRITE(VIDEO_DIP_CTL, val);
168
	I915_WRITE(VIDEO_DIP_CTL, val);
163
	POSTING_READ(VIDEO_DIP_CTL);
169
	POSTING_READ(VIDEO_DIP_CTL);
164
}
170
}
165
 
171
 
166
static void ibx_write_infoframe(struct drm_encoder *encoder,
172
static void ibx_write_infoframe(struct drm_encoder *encoder,
167
				     struct dip_infoframe *frame)
173
				     struct dip_infoframe *frame)
168
{
174
{
169
	uint32_t *data = (uint32_t *)frame;
175
	uint32_t *data = (uint32_t *)frame;
170
	struct drm_device *dev = encoder->dev;
176
	struct drm_device *dev = encoder->dev;
171
	struct drm_i915_private *dev_priv = dev->dev_private;
177
	struct drm_i915_private *dev_priv = dev->dev_private;
172
	struct intel_crtc *intel_crtc = to_intel_crtc(encoder->crtc);
178
	struct intel_crtc *intel_crtc = to_intel_crtc(encoder->crtc);
173
	int reg = TVIDEO_DIP_CTL(intel_crtc->pipe);
179
	int reg = TVIDEO_DIP_CTL(intel_crtc->pipe);
174
	unsigned i, len = DIP_HEADER_SIZE + frame->len;
180
	unsigned i, len = DIP_HEADER_SIZE + frame->len;
175
	u32 val = I915_READ(reg);
181
	u32 val = I915_READ(reg);
176
 
182
 
177
	WARN(!(val & VIDEO_DIP_ENABLE), "Writing DIP with CTL reg disabled\n");
183
	WARN(!(val & VIDEO_DIP_ENABLE), "Writing DIP with CTL reg disabled\n");
178
 
184
 
179
	val &= ~(VIDEO_DIP_SELECT_MASK | 0xf); /* clear DIP data offset */
185
	val &= ~(VIDEO_DIP_SELECT_MASK | 0xf); /* clear DIP data offset */
180
	val |= g4x_infoframe_index(frame);
186
	val |= g4x_infoframe_index(frame);
181
 
187
 
182
	val &= ~g4x_infoframe_enable(frame);
188
	val &= ~g4x_infoframe_enable(frame);
183
 
189
 
184
	I915_WRITE(reg, val);
190
	I915_WRITE(reg, val);
185
 
191
 
186
	mmiowb();
192
	mmiowb();
187
	for (i = 0; i < len; i += 4) {
193
	for (i = 0; i < len; i += 4) {
188
		I915_WRITE(TVIDEO_DIP_DATA(intel_crtc->pipe), *data);
194
		I915_WRITE(TVIDEO_DIP_DATA(intel_crtc->pipe), *data);
189
		data++;
195
		data++;
190
	}
196
	}
191
	/* Write every possible data byte to force correct ECC calculation. */
197
	/* Write every possible data byte to force correct ECC calculation. */
192
	for (; i < VIDEO_DIP_DATA_SIZE; i += 4)
198
	for (; i < VIDEO_DIP_DATA_SIZE; i += 4)
193
		I915_WRITE(TVIDEO_DIP_DATA(intel_crtc->pipe), 0);
199
		I915_WRITE(TVIDEO_DIP_DATA(intel_crtc->pipe), 0);
194
	mmiowb();
200
	mmiowb();
195
 
201
 
196
	val |= g4x_infoframe_enable(frame);
202
	val |= g4x_infoframe_enable(frame);
197
	val &= ~VIDEO_DIP_FREQ_MASK;
203
	val &= ~VIDEO_DIP_FREQ_MASK;
198
	val |= VIDEO_DIP_FREQ_VSYNC;
204
	val |= VIDEO_DIP_FREQ_VSYNC;
199
 
205
 
200
	I915_WRITE(reg, val);
206
	I915_WRITE(reg, val);
201
	POSTING_READ(reg);
207
	POSTING_READ(reg);
202
}
208
}
203
 
209
 
204
static void cpt_write_infoframe(struct drm_encoder *encoder,
210
static void cpt_write_infoframe(struct drm_encoder *encoder,
205
				struct dip_infoframe *frame)
211
				struct dip_infoframe *frame)
206
{
212
{
207
	uint32_t *data = (uint32_t *)frame;
213
	uint32_t *data = (uint32_t *)frame;
208
	struct drm_device *dev = encoder->dev;
214
	struct drm_device *dev = encoder->dev;
209
	struct drm_i915_private *dev_priv = dev->dev_private;
215
	struct drm_i915_private *dev_priv = dev->dev_private;
210
	struct intel_crtc *intel_crtc = to_intel_crtc(encoder->crtc);
216
	struct intel_crtc *intel_crtc = to_intel_crtc(encoder->crtc);
211
	int reg = TVIDEO_DIP_CTL(intel_crtc->pipe);
217
	int reg = TVIDEO_DIP_CTL(intel_crtc->pipe);
212
	unsigned i, len = DIP_HEADER_SIZE + frame->len;
218
	unsigned i, len = DIP_HEADER_SIZE + frame->len;
213
	u32 val = I915_READ(reg);
219
	u32 val = I915_READ(reg);
214
 
220
 
215
	WARN(!(val & VIDEO_DIP_ENABLE), "Writing DIP with CTL reg disabled\n");
221
	WARN(!(val & VIDEO_DIP_ENABLE), "Writing DIP with CTL reg disabled\n");
216
 
222
 
217
	val &= ~(VIDEO_DIP_SELECT_MASK | 0xf); /* clear DIP data offset */
223
	val &= ~(VIDEO_DIP_SELECT_MASK | 0xf); /* clear DIP data offset */
218
	val |= g4x_infoframe_index(frame);
224
	val |= g4x_infoframe_index(frame);
219
 
225
 
220
	/* The DIP control register spec says that we need to update the AVI
226
	/* The DIP control register spec says that we need to update the AVI
221
	 * infoframe without clearing its enable bit */
227
	 * infoframe without clearing its enable bit */
222
	if (frame->type != DIP_TYPE_AVI)
228
	if (frame->type != DIP_TYPE_AVI)
223
		val &= ~g4x_infoframe_enable(frame);
229
		val &= ~g4x_infoframe_enable(frame);
224
 
230
 
225
	I915_WRITE(reg, val);
231
	I915_WRITE(reg, val);
226
 
232
 
227
	mmiowb();
233
	mmiowb();
228
	for (i = 0; i < len; i += 4) {
234
	for (i = 0; i < len; i += 4) {
229
		I915_WRITE(TVIDEO_DIP_DATA(intel_crtc->pipe), *data);
235
		I915_WRITE(TVIDEO_DIP_DATA(intel_crtc->pipe), *data);
230
		data++;
236
		data++;
231
	}
237
	}
232
	/* Write every possible data byte to force correct ECC calculation. */
238
	/* Write every possible data byte to force correct ECC calculation. */
233
	for (; i < VIDEO_DIP_DATA_SIZE; i += 4)
239
	for (; i < VIDEO_DIP_DATA_SIZE; i += 4)
234
		I915_WRITE(TVIDEO_DIP_DATA(intel_crtc->pipe), 0);
240
		I915_WRITE(TVIDEO_DIP_DATA(intel_crtc->pipe), 0);
235
	mmiowb();
241
	mmiowb();
236
 
242
 
237
	val |= g4x_infoframe_enable(frame);
243
	val |= g4x_infoframe_enable(frame);
238
	val &= ~VIDEO_DIP_FREQ_MASK;
244
	val &= ~VIDEO_DIP_FREQ_MASK;
239
	val |= VIDEO_DIP_FREQ_VSYNC;
245
	val |= VIDEO_DIP_FREQ_VSYNC;
240
 
246
 
241
	I915_WRITE(reg, val);
247
	I915_WRITE(reg, val);
242
	POSTING_READ(reg);
248
	POSTING_READ(reg);
243
}
249
}
244
 
250
 
245
static void vlv_write_infoframe(struct drm_encoder *encoder,
251
static void vlv_write_infoframe(struct drm_encoder *encoder,
246
				     struct dip_infoframe *frame)
252
				     struct dip_infoframe *frame)
247
{
253
{
248
	uint32_t *data = (uint32_t *)frame;
254
	uint32_t *data = (uint32_t *)frame;
249
	struct drm_device *dev = encoder->dev;
255
	struct drm_device *dev = encoder->dev;
250
	struct drm_i915_private *dev_priv = dev->dev_private;
256
	struct drm_i915_private *dev_priv = dev->dev_private;
251
	struct intel_crtc *intel_crtc = to_intel_crtc(encoder->crtc);
257
	struct intel_crtc *intel_crtc = to_intel_crtc(encoder->crtc);
252
	int reg = VLV_TVIDEO_DIP_CTL(intel_crtc->pipe);
258
	int reg = VLV_TVIDEO_DIP_CTL(intel_crtc->pipe);
253
	unsigned i, len = DIP_HEADER_SIZE + frame->len;
259
	unsigned i, len = DIP_HEADER_SIZE + frame->len;
254
	u32 val = I915_READ(reg);
260
	u32 val = I915_READ(reg);
255
 
261
 
256
	WARN(!(val & VIDEO_DIP_ENABLE), "Writing DIP with CTL reg disabled\n");
262
	WARN(!(val & VIDEO_DIP_ENABLE), "Writing DIP with CTL reg disabled\n");
257
 
263
 
258
	val &= ~(VIDEO_DIP_SELECT_MASK | 0xf); /* clear DIP data offset */
264
	val &= ~(VIDEO_DIP_SELECT_MASK | 0xf); /* clear DIP data offset */
259
	val |= g4x_infoframe_index(frame);
265
	val |= g4x_infoframe_index(frame);
260
 
266
 
261
	val &= ~g4x_infoframe_enable(frame);
267
	val &= ~g4x_infoframe_enable(frame);
262
 
268
 
263
	I915_WRITE(reg, val);
269
	I915_WRITE(reg, val);
264
 
270
 
265
	mmiowb();
271
	mmiowb();
266
	for (i = 0; i < len; i += 4) {
272
	for (i = 0; i < len; i += 4) {
267
		I915_WRITE(VLV_TVIDEO_DIP_DATA(intel_crtc->pipe), *data);
273
		I915_WRITE(VLV_TVIDEO_DIP_DATA(intel_crtc->pipe), *data);
268
		data++;
274
		data++;
269
	}
275
	}
270
	/* Write every possible data byte to force correct ECC calculation. */
276
	/* Write every possible data byte to force correct ECC calculation. */
271
	for (; i < VIDEO_DIP_DATA_SIZE; i += 4)
277
	for (; i < VIDEO_DIP_DATA_SIZE; i += 4)
272
		I915_WRITE(VLV_TVIDEO_DIP_DATA(intel_crtc->pipe), 0);
278
		I915_WRITE(VLV_TVIDEO_DIP_DATA(intel_crtc->pipe), 0);
273
	mmiowb();
279
	mmiowb();
274
 
280
 
275
	val |= g4x_infoframe_enable(frame);
281
	val |= g4x_infoframe_enable(frame);
276
	val &= ~VIDEO_DIP_FREQ_MASK;
282
	val &= ~VIDEO_DIP_FREQ_MASK;
277
	val |= VIDEO_DIP_FREQ_VSYNC;
283
	val |= VIDEO_DIP_FREQ_VSYNC;
278
 
284
 
279
	I915_WRITE(reg, val);
285
	I915_WRITE(reg, val);
280
	POSTING_READ(reg);
286
	POSTING_READ(reg);
281
}
287
}
282
 
288
 
283
static void hsw_write_infoframe(struct drm_encoder *encoder,
289
static void hsw_write_infoframe(struct drm_encoder *encoder,
284
				struct dip_infoframe *frame)
290
				struct dip_infoframe *frame)
285
{
291
{
286
	uint32_t *data = (uint32_t *)frame;
292
	uint32_t *data = (uint32_t *)frame;
287
	struct drm_device *dev = encoder->dev;
293
	struct drm_device *dev = encoder->dev;
288
	struct drm_i915_private *dev_priv = dev->dev_private;
294
	struct drm_i915_private *dev_priv = dev->dev_private;
289
	struct intel_crtc *intel_crtc = to_intel_crtc(encoder->crtc);
295
	struct intel_crtc *intel_crtc = to_intel_crtc(encoder->crtc);
290
	u32 ctl_reg = HSW_TVIDEO_DIP_CTL(intel_crtc->pipe);
296
	u32 ctl_reg = HSW_TVIDEO_DIP_CTL(intel_crtc->pipe);
291
	u32 data_reg = hsw_infoframe_data_reg(frame, intel_crtc->pipe);
297
	u32 data_reg = hsw_infoframe_data_reg(frame, intel_crtc->pipe);
292
	unsigned int i, len = DIP_HEADER_SIZE + frame->len;
298
	unsigned int i, len = DIP_HEADER_SIZE + frame->len;
293
	u32 val = I915_READ(ctl_reg);
299
	u32 val = I915_READ(ctl_reg);
294
 
300
 
295
	if (data_reg == 0)
301
	if (data_reg == 0)
296
		return;
302
		return;
297
 
303
 
298
	val &= ~hsw_infoframe_enable(frame);
304
	val &= ~hsw_infoframe_enable(frame);
299
	I915_WRITE(ctl_reg, val);
305
	I915_WRITE(ctl_reg, val);
300
 
306
 
301
	mmiowb();
307
	mmiowb();
302
	for (i = 0; i < len; i += 4) {
308
	for (i = 0; i < len; i += 4) {
303
		I915_WRITE(data_reg + i, *data);
309
		I915_WRITE(data_reg + i, *data);
304
		data++;
310
		data++;
305
	}
311
	}
306
	/* Write every possible data byte to force correct ECC calculation. */
312
	/* Write every possible data byte to force correct ECC calculation. */
307
	for (; i < VIDEO_DIP_DATA_SIZE; i += 4)
313
	for (; i < VIDEO_DIP_DATA_SIZE; i += 4)
308
		I915_WRITE(data_reg + i, 0);
314
		I915_WRITE(data_reg + i, 0);
309
	mmiowb();
315
	mmiowb();
310
 
316
 
311
	val |= hsw_infoframe_enable(frame);
317
	val |= hsw_infoframe_enable(frame);
312
	I915_WRITE(ctl_reg, val);
318
	I915_WRITE(ctl_reg, val);
313
	POSTING_READ(ctl_reg);
319
	POSTING_READ(ctl_reg);
314
}
320
}
315
 
321
 
316
static void intel_set_infoframe(struct drm_encoder *encoder,
322
static void intel_set_infoframe(struct drm_encoder *encoder,
317
				struct dip_infoframe *frame)
323
				struct dip_infoframe *frame)
318
{
324
{
319
	struct intel_hdmi *intel_hdmi = enc_to_intel_hdmi(encoder);
325
	struct intel_hdmi *intel_hdmi = enc_to_intel_hdmi(encoder);
320
 
326
 
321
	intel_dip_infoframe_csum(frame);
327
	intel_dip_infoframe_csum(frame);
322
	intel_hdmi->write_infoframe(encoder, frame);
328
	intel_hdmi->write_infoframe(encoder, frame);
323
}
329
}
324
 
330
 
325
static void intel_hdmi_set_avi_infoframe(struct drm_encoder *encoder,
331
static void intel_hdmi_set_avi_infoframe(struct drm_encoder *encoder,
326
					 struct drm_display_mode *adjusted_mode)
332
					 struct drm_display_mode *adjusted_mode)
327
{
333
{
328
	struct dip_infoframe avi_if = {
334
	struct dip_infoframe avi_if = {
329
		.type = DIP_TYPE_AVI,
335
		.type = DIP_TYPE_AVI,
330
		.ver = DIP_VERSION_AVI,
336
		.ver = DIP_VERSION_AVI,
331
		.len = DIP_LEN_AVI,
337
		.len = DIP_LEN_AVI,
332
	};
338
	};
333
 
339
 
334
	if (adjusted_mode->flags & DRM_MODE_FLAG_DBLCLK)
340
	if (adjusted_mode->flags & DRM_MODE_FLAG_DBLCLK)
335
		avi_if.body.avi.YQ_CN_PR |= DIP_AVI_PR_2;
341
		avi_if.body.avi.YQ_CN_PR |= DIP_AVI_PR_2;
-
 
342
 
-
 
343
	avi_if.body.avi.VIC = drm_mode_cea_vic(adjusted_mode);
336
 
344
 
337
	intel_set_infoframe(encoder, &avi_if);
345
	intel_set_infoframe(encoder, &avi_if);
338
}
346
}
339
 
347
 
340
static void intel_hdmi_set_spd_infoframe(struct drm_encoder *encoder)
348
static void intel_hdmi_set_spd_infoframe(struct drm_encoder *encoder)
341
{
349
{
342
	struct dip_infoframe spd_if;
350
	struct dip_infoframe spd_if;
343
 
351
 
344
	memset(&spd_if, 0, sizeof(spd_if));
352
	memset(&spd_if, 0, sizeof(spd_if));
345
	spd_if.type = DIP_TYPE_SPD;
353
	spd_if.type = DIP_TYPE_SPD;
346
	spd_if.ver = DIP_VERSION_SPD;
354
	spd_if.ver = DIP_VERSION_SPD;
347
	spd_if.len = DIP_LEN_SPD;
355
	spd_if.len = DIP_LEN_SPD;
348
	strcpy(spd_if.body.spd.vn, "Intel");
356
	strcpy(spd_if.body.spd.vn, "Intel");
349
	strcpy(spd_if.body.spd.pd, "Integrated gfx");
357
	strcpy(spd_if.body.spd.pd, "Integrated gfx");
350
	spd_if.body.spd.sdi = DIP_SPD_PC;
358
	spd_if.body.spd.sdi = DIP_SPD_PC;
351
 
359
 
352
	intel_set_infoframe(encoder, &spd_if);
360
	intel_set_infoframe(encoder, &spd_if);
353
}
361
}
354
 
362
 
355
static void g4x_set_infoframes(struct drm_encoder *encoder,
363
static void g4x_set_infoframes(struct drm_encoder *encoder,
356
			       struct drm_display_mode *adjusted_mode)
364
			       struct drm_display_mode *adjusted_mode)
357
{
365
{
358
	struct drm_i915_private *dev_priv = encoder->dev->dev_private;
366
	struct drm_i915_private *dev_priv = encoder->dev->dev_private;
359
	struct intel_hdmi *intel_hdmi = enc_to_intel_hdmi(encoder);
367
	struct intel_hdmi *intel_hdmi = enc_to_intel_hdmi(encoder);
360
	u32 reg = VIDEO_DIP_CTL;
368
	u32 reg = VIDEO_DIP_CTL;
361
	u32 val = I915_READ(reg);
369
	u32 val = I915_READ(reg);
362
	u32 port;
370
	u32 port;
363
 
371
 
364
	assert_hdmi_port_disabled(intel_hdmi);
372
	assert_hdmi_port_disabled(intel_hdmi);
365
 
373
 
366
	/* If the registers were not initialized yet, they might be zeroes,
374
	/* If the registers were not initialized yet, they might be zeroes,
367
	 * which means we're selecting the AVI DIP and we're setting its
375
	 * which means we're selecting the AVI DIP and we're setting its
368
	 * frequency to once. This seems to really confuse the HW and make
376
	 * frequency to once. This seems to really confuse the HW and make
369
	 * things stop working (the register spec says the AVI always needs to
377
	 * things stop working (the register spec says the AVI always needs to
370
	 * be sent every VSync). So here we avoid writing to the register more
378
	 * be sent every VSync). So here we avoid writing to the register more
371
	 * than we need and also explicitly select the AVI DIP and explicitly
379
	 * than we need and also explicitly select the AVI DIP and explicitly
372
	 * set its frequency to every VSync. Avoiding to write it twice seems to
380
	 * set its frequency to every VSync. Avoiding to write it twice seems to
373
	 * be enough to solve the problem, but being defensive shouldn't hurt us
381
	 * be enough to solve the problem, but being defensive shouldn't hurt us
374
	 * either. */
382
	 * either. */
375
	val |= VIDEO_DIP_SELECT_AVI | VIDEO_DIP_FREQ_VSYNC;
383
	val |= VIDEO_DIP_SELECT_AVI | VIDEO_DIP_FREQ_VSYNC;
376
 
384
 
377
	if (!intel_hdmi->has_hdmi_sink) {
385
	if (!intel_hdmi->has_hdmi_sink) {
378
		if (!(val & VIDEO_DIP_ENABLE))
386
		if (!(val & VIDEO_DIP_ENABLE))
379
			return;
387
			return;
380
		val &= ~VIDEO_DIP_ENABLE;
388
		val &= ~VIDEO_DIP_ENABLE;
381
		I915_WRITE(reg, val);
389
		I915_WRITE(reg, val);
382
		POSTING_READ(reg);
390
		POSTING_READ(reg);
383
		return;
391
		return;
384
	}
392
	}
385
 
393
 
386
	switch (intel_hdmi->sdvox_reg) {
394
	switch (intel_hdmi->sdvox_reg) {
387
	case SDVOB:
395
	case SDVOB:
388
		port = VIDEO_DIP_PORT_B;
396
		port = VIDEO_DIP_PORT_B;
389
		break;
397
		break;
390
	case SDVOC:
398
	case SDVOC:
391
		port = VIDEO_DIP_PORT_C;
399
		port = VIDEO_DIP_PORT_C;
392
		break;
400
		break;
393
	default:
401
	default:
394
		BUG();
402
		BUG();
395
		return;
403
		return;
396
	}
404
	}
397
 
405
 
398
	if (port != (val & VIDEO_DIP_PORT_MASK)) {
406
	if (port != (val & VIDEO_DIP_PORT_MASK)) {
399
		if (val & VIDEO_DIP_ENABLE) {
407
		if (val & VIDEO_DIP_ENABLE) {
400
			val &= ~VIDEO_DIP_ENABLE;
408
			val &= ~VIDEO_DIP_ENABLE;
401
			I915_WRITE(reg, val);
409
			I915_WRITE(reg, val);
402
			POSTING_READ(reg);
410
			POSTING_READ(reg);
403
		}
411
		}
404
		val &= ~VIDEO_DIP_PORT_MASK;
412
		val &= ~VIDEO_DIP_PORT_MASK;
405
		val |= port;
413
		val |= port;
406
	}
414
	}
407
 
415
 
408
	val |= VIDEO_DIP_ENABLE;
416
	val |= VIDEO_DIP_ENABLE;
409
	val &= ~VIDEO_DIP_ENABLE_VENDOR;
417
	val &= ~VIDEO_DIP_ENABLE_VENDOR;
410
 
418
 
411
	I915_WRITE(reg, val);
419
	I915_WRITE(reg, val);
412
	POSTING_READ(reg);
420
	POSTING_READ(reg);
413
 
421
 
414
	intel_hdmi_set_avi_infoframe(encoder, adjusted_mode);
422
	intel_hdmi_set_avi_infoframe(encoder, adjusted_mode);
415
	intel_hdmi_set_spd_infoframe(encoder);
423
	intel_hdmi_set_spd_infoframe(encoder);
416
}
424
}
417
 
425
 
418
static void ibx_set_infoframes(struct drm_encoder *encoder,
426
static void ibx_set_infoframes(struct drm_encoder *encoder,
419
			       struct drm_display_mode *adjusted_mode)
427
			       struct drm_display_mode *adjusted_mode)
420
{
428
{
421
	struct drm_i915_private *dev_priv = encoder->dev->dev_private;
429
	struct drm_i915_private *dev_priv = encoder->dev->dev_private;
422
	struct intel_crtc *intel_crtc = to_intel_crtc(encoder->crtc);
430
	struct intel_crtc *intel_crtc = to_intel_crtc(encoder->crtc);
423
	struct intel_hdmi *intel_hdmi = enc_to_intel_hdmi(encoder);
431
	struct intel_hdmi *intel_hdmi = enc_to_intel_hdmi(encoder);
424
	u32 reg = TVIDEO_DIP_CTL(intel_crtc->pipe);
432
	u32 reg = TVIDEO_DIP_CTL(intel_crtc->pipe);
425
	u32 val = I915_READ(reg);
433
	u32 val = I915_READ(reg);
426
	u32 port;
434
	u32 port;
427
 
435
 
428
	assert_hdmi_port_disabled(intel_hdmi);
436
	assert_hdmi_port_disabled(intel_hdmi);
429
 
437
 
430
	/* See the big comment in g4x_set_infoframes() */
438
	/* See the big comment in g4x_set_infoframes() */
431
	val |= VIDEO_DIP_SELECT_AVI | VIDEO_DIP_FREQ_VSYNC;
439
	val |= VIDEO_DIP_SELECT_AVI | VIDEO_DIP_FREQ_VSYNC;
432
 
440
 
433
	if (!intel_hdmi->has_hdmi_sink) {
441
	if (!intel_hdmi->has_hdmi_sink) {
434
		if (!(val & VIDEO_DIP_ENABLE))
442
		if (!(val & VIDEO_DIP_ENABLE))
435
			return;
443
			return;
436
		val &= ~VIDEO_DIP_ENABLE;
444
		val &= ~VIDEO_DIP_ENABLE;
437
		I915_WRITE(reg, val);
445
		I915_WRITE(reg, val);
438
		POSTING_READ(reg);
446
		POSTING_READ(reg);
439
		return;
447
		return;
440
	}
448
	}
441
 
449
 
442
	switch (intel_hdmi->sdvox_reg) {
450
	switch (intel_hdmi->sdvox_reg) {
443
	case HDMIB:
451
	case HDMIB:
444
		port = VIDEO_DIP_PORT_B;
452
		port = VIDEO_DIP_PORT_B;
445
		break;
453
		break;
446
	case HDMIC:
454
	case HDMIC:
447
		port = VIDEO_DIP_PORT_C;
455
		port = VIDEO_DIP_PORT_C;
448
		break;
456
		break;
449
	case HDMID:
457
	case HDMID:
450
		port = VIDEO_DIP_PORT_D;
458
		port = VIDEO_DIP_PORT_D;
451
		break;
459
		break;
452
	default:
460
	default:
453
		BUG();
461
		BUG();
454
		return;
462
		return;
455
	}
463
	}
456
 
464
 
457
	if (port != (val & VIDEO_DIP_PORT_MASK)) {
465
	if (port != (val & VIDEO_DIP_PORT_MASK)) {
458
		if (val & VIDEO_DIP_ENABLE) {
466
		if (val & VIDEO_DIP_ENABLE) {
459
			val &= ~VIDEO_DIP_ENABLE;
467
			val &= ~VIDEO_DIP_ENABLE;
460
			I915_WRITE(reg, val);
468
			I915_WRITE(reg, val);
461
			POSTING_READ(reg);
469
			POSTING_READ(reg);
462
		}
470
		}
463
		val &= ~VIDEO_DIP_PORT_MASK;
471
		val &= ~VIDEO_DIP_PORT_MASK;
464
		val |= port;
472
		val |= port;
465
	}
473
	}
466
 
474
 
467
	val |= VIDEO_DIP_ENABLE;
475
	val |= VIDEO_DIP_ENABLE;
468
	val &= ~(VIDEO_DIP_ENABLE_VENDOR | VIDEO_DIP_ENABLE_GAMUT |
476
	val &= ~(VIDEO_DIP_ENABLE_VENDOR | VIDEO_DIP_ENABLE_GAMUT |
469
		 VIDEO_DIP_ENABLE_GCP);
477
		 VIDEO_DIP_ENABLE_GCP);
470
 
478
 
471
	I915_WRITE(reg, val);
479
	I915_WRITE(reg, val);
472
	POSTING_READ(reg);
480
	POSTING_READ(reg);
473
 
481
 
474
	intel_hdmi_set_avi_infoframe(encoder, adjusted_mode);
482
	intel_hdmi_set_avi_infoframe(encoder, adjusted_mode);
475
	intel_hdmi_set_spd_infoframe(encoder);
483
	intel_hdmi_set_spd_infoframe(encoder);
476
}
484
}
477
 
485
 
478
static void cpt_set_infoframes(struct drm_encoder *encoder,
486
static void cpt_set_infoframes(struct drm_encoder *encoder,
479
			       struct drm_display_mode *adjusted_mode)
487
			       struct drm_display_mode *adjusted_mode)
480
{
488
{
481
	struct drm_i915_private *dev_priv = encoder->dev->dev_private;
489
	struct drm_i915_private *dev_priv = encoder->dev->dev_private;
482
	struct intel_crtc *intel_crtc = to_intel_crtc(encoder->crtc);
490
	struct intel_crtc *intel_crtc = to_intel_crtc(encoder->crtc);
483
	struct intel_hdmi *intel_hdmi = enc_to_intel_hdmi(encoder);
491
	struct intel_hdmi *intel_hdmi = enc_to_intel_hdmi(encoder);
484
	u32 reg = TVIDEO_DIP_CTL(intel_crtc->pipe);
492
	u32 reg = TVIDEO_DIP_CTL(intel_crtc->pipe);
485
	u32 val = I915_READ(reg);
493
	u32 val = I915_READ(reg);
486
 
494
 
487
	assert_hdmi_port_disabled(intel_hdmi);
495
	assert_hdmi_port_disabled(intel_hdmi);
488
 
496
 
489
	/* See the big comment in g4x_set_infoframes() */
497
	/* See the big comment in g4x_set_infoframes() */
490
	val |= VIDEO_DIP_SELECT_AVI | VIDEO_DIP_FREQ_VSYNC;
498
	val |= VIDEO_DIP_SELECT_AVI | VIDEO_DIP_FREQ_VSYNC;
491
 
499
 
492
	if (!intel_hdmi->has_hdmi_sink) {
500
	if (!intel_hdmi->has_hdmi_sink) {
493
		if (!(val & VIDEO_DIP_ENABLE))
501
		if (!(val & VIDEO_DIP_ENABLE))
494
			return;
502
			return;
495
		val &= ~(VIDEO_DIP_ENABLE | VIDEO_DIP_ENABLE_AVI);
503
		val &= ~(VIDEO_DIP_ENABLE | VIDEO_DIP_ENABLE_AVI);
496
		I915_WRITE(reg, val);
504
		I915_WRITE(reg, val);
497
		POSTING_READ(reg);
505
		POSTING_READ(reg);
498
		return;
506
		return;
499
	}
507
	}
500
 
508
 
501
	/* Set both together, unset both together: see the spec. */
509
	/* Set both together, unset both together: see the spec. */
502
	val |= VIDEO_DIP_ENABLE | VIDEO_DIP_ENABLE_AVI;
510
	val |= VIDEO_DIP_ENABLE | VIDEO_DIP_ENABLE_AVI;
503
	val &= ~(VIDEO_DIP_ENABLE_VENDOR | VIDEO_DIP_ENABLE_GAMUT |
511
	val &= ~(VIDEO_DIP_ENABLE_VENDOR | VIDEO_DIP_ENABLE_GAMUT |
504
		 VIDEO_DIP_ENABLE_GCP);
512
		 VIDEO_DIP_ENABLE_GCP);
505
 
513
 
506
	I915_WRITE(reg, val);
514
	I915_WRITE(reg, val);
507
	POSTING_READ(reg);
515
	POSTING_READ(reg);
508
 
516
 
509
	intel_hdmi_set_avi_infoframe(encoder, adjusted_mode);
517
	intel_hdmi_set_avi_infoframe(encoder, adjusted_mode);
510
	intel_hdmi_set_spd_infoframe(encoder);
518
	intel_hdmi_set_spd_infoframe(encoder);
511
}
519
}
512
 
520
 
513
static void vlv_set_infoframes(struct drm_encoder *encoder,
521
static void vlv_set_infoframes(struct drm_encoder *encoder,
514
			       struct drm_display_mode *adjusted_mode)
522
			       struct drm_display_mode *adjusted_mode)
515
{
523
{
516
	struct drm_i915_private *dev_priv = encoder->dev->dev_private;
524
	struct drm_i915_private *dev_priv = encoder->dev->dev_private;
517
	struct intel_crtc *intel_crtc = to_intel_crtc(encoder->crtc);
525
	struct intel_crtc *intel_crtc = to_intel_crtc(encoder->crtc);
518
	struct intel_hdmi *intel_hdmi = enc_to_intel_hdmi(encoder);
526
	struct intel_hdmi *intel_hdmi = enc_to_intel_hdmi(encoder);
519
	u32 reg = VLV_TVIDEO_DIP_CTL(intel_crtc->pipe);
527
	u32 reg = VLV_TVIDEO_DIP_CTL(intel_crtc->pipe);
520
	u32 val = I915_READ(reg);
528
	u32 val = I915_READ(reg);
521
 
529
 
522
	assert_hdmi_port_disabled(intel_hdmi);
530
	assert_hdmi_port_disabled(intel_hdmi);
523
 
531
 
524
	/* See the big comment in g4x_set_infoframes() */
532
	/* See the big comment in g4x_set_infoframes() */
525
	val |= VIDEO_DIP_SELECT_AVI | VIDEO_DIP_FREQ_VSYNC;
533
	val |= VIDEO_DIP_SELECT_AVI | VIDEO_DIP_FREQ_VSYNC;
526
 
534
 
527
	if (!intel_hdmi->has_hdmi_sink) {
535
	if (!intel_hdmi->has_hdmi_sink) {
528
		if (!(val & VIDEO_DIP_ENABLE))
536
		if (!(val & VIDEO_DIP_ENABLE))
529
			return;
537
			return;
530
		val &= ~VIDEO_DIP_ENABLE;
538
		val &= ~VIDEO_DIP_ENABLE;
531
		I915_WRITE(reg, val);
539
		I915_WRITE(reg, val);
532
		POSTING_READ(reg);
540
		POSTING_READ(reg);
533
		return;
541
		return;
534
	}
542
	}
535
 
543
 
536
	val |= VIDEO_DIP_ENABLE;
544
	val |= VIDEO_DIP_ENABLE;
537
	val &= ~(VIDEO_DIP_ENABLE_VENDOR | VIDEO_DIP_ENABLE_GAMUT |
545
	val &= ~(VIDEO_DIP_ENABLE_VENDOR | VIDEO_DIP_ENABLE_GAMUT |
538
		 VIDEO_DIP_ENABLE_GCP);
546
		 VIDEO_DIP_ENABLE_GCP);
539
 
547
 
540
	I915_WRITE(reg, val);
548
	I915_WRITE(reg, val);
541
	POSTING_READ(reg);
549
	POSTING_READ(reg);
542
 
550
 
543
	intel_hdmi_set_avi_infoframe(encoder, adjusted_mode);
551
	intel_hdmi_set_avi_infoframe(encoder, adjusted_mode);
544
	intel_hdmi_set_spd_infoframe(encoder);
552
	intel_hdmi_set_spd_infoframe(encoder);
545
}
553
}
546
 
554
 
547
static void hsw_set_infoframes(struct drm_encoder *encoder,
555
static void hsw_set_infoframes(struct drm_encoder *encoder,
548
			       struct drm_display_mode *adjusted_mode)
556
			       struct drm_display_mode *adjusted_mode)
549
{
557
{
550
	struct drm_i915_private *dev_priv = encoder->dev->dev_private;
558
	struct drm_i915_private *dev_priv = encoder->dev->dev_private;
551
	struct intel_crtc *intel_crtc = to_intel_crtc(encoder->crtc);
559
	struct intel_crtc *intel_crtc = to_intel_crtc(encoder->crtc);
552
	struct intel_hdmi *intel_hdmi = enc_to_intel_hdmi(encoder);
560
	struct intel_hdmi *intel_hdmi = enc_to_intel_hdmi(encoder);
553
	u32 reg = HSW_TVIDEO_DIP_CTL(intel_crtc->pipe);
561
	u32 reg = HSW_TVIDEO_DIP_CTL(intel_crtc->pipe);
554
	u32 val = I915_READ(reg);
562
	u32 val = I915_READ(reg);
555
 
563
 
556
	assert_hdmi_port_disabled(intel_hdmi);
564
	assert_hdmi_port_disabled(intel_hdmi);
557
 
565
 
558
	if (!intel_hdmi->has_hdmi_sink) {
566
	if (!intel_hdmi->has_hdmi_sink) {
559
		I915_WRITE(reg, 0);
567
		I915_WRITE(reg, 0);
560
		POSTING_READ(reg);
568
		POSTING_READ(reg);
561
		return;
569
		return;
562
	}
570
	}
563
 
571
 
564
	val &= ~(VIDEO_DIP_ENABLE_VSC_HSW | VIDEO_DIP_ENABLE_GCP_HSW |
572
	val &= ~(VIDEO_DIP_ENABLE_VSC_HSW | VIDEO_DIP_ENABLE_GCP_HSW |
565
		 VIDEO_DIP_ENABLE_VS_HSW | VIDEO_DIP_ENABLE_GMP_HSW);
573
		 VIDEO_DIP_ENABLE_VS_HSW | VIDEO_DIP_ENABLE_GMP_HSW);
566
 
574
 
567
	I915_WRITE(reg, val);
575
	I915_WRITE(reg, val);
568
	POSTING_READ(reg);
576
	POSTING_READ(reg);
569
 
577
 
570
	intel_hdmi_set_avi_infoframe(encoder, adjusted_mode);
578
	intel_hdmi_set_avi_infoframe(encoder, adjusted_mode);
571
	intel_hdmi_set_spd_infoframe(encoder);
579
	intel_hdmi_set_spd_infoframe(encoder);
572
}
580
}
573
 
581
 
574
static void intel_hdmi_mode_set(struct drm_encoder *encoder,
582
static void intel_hdmi_mode_set(struct drm_encoder *encoder,
575
				struct drm_display_mode *mode,
583
				struct drm_display_mode *mode,
576
				struct drm_display_mode *adjusted_mode)
584
				struct drm_display_mode *adjusted_mode)
577
{
585
{
578
	struct drm_device *dev = encoder->dev;
586
	struct drm_device *dev = encoder->dev;
579
	struct drm_i915_private *dev_priv = dev->dev_private;
587
	struct drm_i915_private *dev_priv = dev->dev_private;
580
	struct intel_crtc *intel_crtc = to_intel_crtc(encoder->crtc);
588
	struct intel_crtc *intel_crtc = to_intel_crtc(encoder->crtc);
581
	struct intel_hdmi *intel_hdmi = enc_to_intel_hdmi(encoder);
589
	struct intel_hdmi *intel_hdmi = enc_to_intel_hdmi(encoder);
582
	u32 sdvox;
590
	u32 sdvox;
583
 
591
 
584
	sdvox = SDVO_ENCODING_HDMI;
592
	sdvox = SDVO_ENCODING_HDMI;
585
	if (!HAS_PCH_SPLIT(dev))
593
	if (!HAS_PCH_SPLIT(dev))
586
		sdvox |= intel_hdmi->color_range;
594
		sdvox |= intel_hdmi->color_range;
587
	if (adjusted_mode->flags & DRM_MODE_FLAG_PVSYNC)
595
	if (adjusted_mode->flags & DRM_MODE_FLAG_PVSYNC)
588
		sdvox |= SDVO_VSYNC_ACTIVE_HIGH;
596
		sdvox |= SDVO_VSYNC_ACTIVE_HIGH;
589
	if (adjusted_mode->flags & DRM_MODE_FLAG_PHSYNC)
597
	if (adjusted_mode->flags & DRM_MODE_FLAG_PHSYNC)
590
		sdvox |= SDVO_HSYNC_ACTIVE_HIGH;
598
		sdvox |= SDVO_HSYNC_ACTIVE_HIGH;
591
 
599
 
592
	if (intel_crtc->bpp > 24)
600
	if (intel_crtc->bpp > 24)
593
		sdvox |= COLOR_FORMAT_12bpc;
601
		sdvox |= COLOR_FORMAT_12bpc;
594
	else
602
	else
595
		sdvox |= COLOR_FORMAT_8bpc;
603
		sdvox |= COLOR_FORMAT_8bpc;
596
 
604
 
597
	/* Required on CPT */
605
	/* Required on CPT */
598
	if (intel_hdmi->has_hdmi_sink && HAS_PCH_CPT(dev))
606
	if (intel_hdmi->has_hdmi_sink && HAS_PCH_CPT(dev))
599
		sdvox |= HDMI_MODE_SELECT;
607
		sdvox |= HDMI_MODE_SELECT;
600
 
608
 
601
	if (intel_hdmi->has_audio) {
609
	if (intel_hdmi->has_audio) {
602
		DRM_DEBUG_DRIVER("Enabling HDMI audio on pipe %c\n",
610
		DRM_DEBUG_DRIVER("Enabling HDMI audio on pipe %c\n",
603
				 pipe_name(intel_crtc->pipe));
611
				 pipe_name(intel_crtc->pipe));
604
		sdvox |= SDVO_AUDIO_ENABLE;
612
		sdvox |= SDVO_AUDIO_ENABLE;
605
		sdvox |= SDVO_NULL_PACKETS_DURING_VSYNC;
613
		sdvox |= SDVO_NULL_PACKETS_DURING_VSYNC;
606
		intel_write_eld(encoder, adjusted_mode);
614
		intel_write_eld(encoder, adjusted_mode);
607
	}
615
	}
608
 
616
 
609
		if (HAS_PCH_CPT(dev))
617
		if (HAS_PCH_CPT(dev))
610
		sdvox |= PORT_TRANS_SEL_CPT(intel_crtc->pipe);
618
		sdvox |= PORT_TRANS_SEL_CPT(intel_crtc->pipe);
611
	else if (intel_crtc->pipe == PIPE_B)
619
	else if (intel_crtc->pipe == PIPE_B)
612
			sdvox |= SDVO_PIPE_B_SELECT;
620
			sdvox |= SDVO_PIPE_B_SELECT;
613
 
621
 
614
	I915_WRITE(intel_hdmi->sdvox_reg, sdvox);
622
	I915_WRITE(intel_hdmi->sdvox_reg, sdvox);
615
	POSTING_READ(intel_hdmi->sdvox_reg);
623
	POSTING_READ(intel_hdmi->sdvox_reg);
616
 
624
 
617
	intel_hdmi->set_infoframes(encoder, adjusted_mode);
625
	intel_hdmi->set_infoframes(encoder, adjusted_mode);
618
}
626
}
619
 
627
 
620
static bool intel_hdmi_get_hw_state(struct intel_encoder *encoder,
628
static bool intel_hdmi_get_hw_state(struct intel_encoder *encoder,
621
				    enum pipe *pipe)
629
				    enum pipe *pipe)
622
{
630
{
623
	struct drm_device *dev = encoder->base.dev;
631
	struct drm_device *dev = encoder->base.dev;
624
	struct drm_i915_private *dev_priv = dev->dev_private;
632
	struct drm_i915_private *dev_priv = dev->dev_private;
625
	struct intel_hdmi *intel_hdmi = enc_to_intel_hdmi(&encoder->base);
633
	struct intel_hdmi *intel_hdmi = enc_to_intel_hdmi(&encoder->base);
626
	u32 tmp;
634
	u32 tmp;
627
 
635
 
628
	tmp = I915_READ(intel_hdmi->sdvox_reg);
636
	tmp = I915_READ(intel_hdmi->sdvox_reg);
629
 
637
 
630
	if (!(tmp & SDVO_ENABLE))
638
	if (!(tmp & SDVO_ENABLE))
631
		return false;
639
		return false;
632
 
640
 
633
	if (HAS_PCH_CPT(dev))
641
	if (HAS_PCH_CPT(dev))
634
		*pipe = PORT_TO_PIPE_CPT(tmp);
642
		*pipe = PORT_TO_PIPE_CPT(tmp);
635
	else
643
	else
636
		*pipe = PORT_TO_PIPE(tmp);
644
		*pipe = PORT_TO_PIPE(tmp);
637
 
645
 
638
	return true;
646
	return true;
639
}
647
}
640
 
648
 
641
static void intel_enable_hdmi(struct intel_encoder *encoder)
649
static void intel_enable_hdmi(struct intel_encoder *encoder)
642
{
650
{
643
	struct drm_device *dev = encoder->base.dev;
651
	struct drm_device *dev = encoder->base.dev;
644
	struct drm_i915_private *dev_priv = dev->dev_private;
652
	struct drm_i915_private *dev_priv = dev->dev_private;
645
	struct intel_hdmi *intel_hdmi = enc_to_intel_hdmi(&encoder->base);
653
	struct intel_hdmi *intel_hdmi = enc_to_intel_hdmi(&encoder->base);
646
	u32 temp;
654
	u32 temp;
647
	u32 enable_bits = SDVO_ENABLE;
655
	u32 enable_bits = SDVO_ENABLE;
648
 
656
 
649
	if (intel_hdmi->has_audio)
657
	if (intel_hdmi->has_audio)
650
		enable_bits |= SDVO_AUDIO_ENABLE;
658
		enable_bits |= SDVO_AUDIO_ENABLE;
651
 
659
 
652
	temp = I915_READ(intel_hdmi->sdvox_reg);
660
	temp = I915_READ(intel_hdmi->sdvox_reg);
653
 
661
 
654
	/* HW workaround for IBX, we need to move the port to transcoder A
662
	/* HW workaround for IBX, we need to move the port to transcoder A
655
	 * before disabling it. */
663
	 * before disabling it. */
656
	if (HAS_PCH_IBX(dev)) {
664
	if (HAS_PCH_IBX(dev)) {
657
		struct drm_crtc *crtc = encoder->base.crtc;
665
		struct drm_crtc *crtc = encoder->base.crtc;
658
		int pipe = crtc ? to_intel_crtc(crtc)->pipe : -1;
666
		int pipe = crtc ? to_intel_crtc(crtc)->pipe : -1;
659
 
667
 
660
		/* Restore the transcoder select bit. */
668
		/* Restore the transcoder select bit. */
661
		if (pipe == PIPE_B)
669
		if (pipe == PIPE_B)
662
			enable_bits |= SDVO_PIPE_B_SELECT;
670
			enable_bits |= SDVO_PIPE_B_SELECT;
663
	}
671
	}
664
 
672
 
665
	/* HW workaround, need to toggle enable bit off and on for 12bpc, but
673
	/* HW workaround, need to toggle enable bit off and on for 12bpc, but
666
	 * we do this anyway which shows more stable in testing.
674
	 * we do this anyway which shows more stable in testing.
667
	 */
675
	 */
668
	if (HAS_PCH_SPLIT(dev)) {
676
	if (HAS_PCH_SPLIT(dev)) {
669
		I915_WRITE(intel_hdmi->sdvox_reg, temp & ~SDVO_ENABLE);
677
		I915_WRITE(intel_hdmi->sdvox_reg, temp & ~SDVO_ENABLE);
670
		POSTING_READ(intel_hdmi->sdvox_reg);
678
		POSTING_READ(intel_hdmi->sdvox_reg);
671
	}
679
	}
672
 
680
 
673
	temp |= enable_bits;
681
	temp |= enable_bits;
674
 
682
 
675
	I915_WRITE(intel_hdmi->sdvox_reg, temp);
683
	I915_WRITE(intel_hdmi->sdvox_reg, temp);
676
	POSTING_READ(intel_hdmi->sdvox_reg);
684
	POSTING_READ(intel_hdmi->sdvox_reg);
677
 
685
 
678
	/* HW workaround, need to write this twice for issue that may result
686
	/* HW workaround, need to write this twice for issue that may result
679
	 * in first write getting masked.
687
	 * in first write getting masked.
680
	 */
688
	 */
681
	if (HAS_PCH_SPLIT(dev)) {
689
	if (HAS_PCH_SPLIT(dev)) {
682
		I915_WRITE(intel_hdmi->sdvox_reg, temp);
690
		I915_WRITE(intel_hdmi->sdvox_reg, temp);
683
		POSTING_READ(intel_hdmi->sdvox_reg);
691
		POSTING_READ(intel_hdmi->sdvox_reg);
684
	}
692
	}
685
}
693
}
686
 
694
 
687
static void intel_disable_hdmi(struct intel_encoder *encoder)
695
static void intel_disable_hdmi(struct intel_encoder *encoder)
688
{
696
{
689
	struct drm_device *dev = encoder->base.dev;
697
	struct drm_device *dev = encoder->base.dev;
690
	struct drm_i915_private *dev_priv = dev->dev_private;
698
	struct drm_i915_private *dev_priv = dev->dev_private;
691
	struct intel_hdmi *intel_hdmi = enc_to_intel_hdmi(&encoder->base);
699
	struct intel_hdmi *intel_hdmi = enc_to_intel_hdmi(&encoder->base);
692
	u32 temp;
700
	u32 temp;
693
	u32 enable_bits = SDVO_ENABLE | SDVO_AUDIO_ENABLE;
701
	u32 enable_bits = SDVO_ENABLE | SDVO_AUDIO_ENABLE;
694
 
702
 
695
	temp = I915_READ(intel_hdmi->sdvox_reg);
703
	temp = I915_READ(intel_hdmi->sdvox_reg);
696
 
704
 
697
	/* HW workaround for IBX, we need to move the port to transcoder A
705
	/* HW workaround for IBX, we need to move the port to transcoder A
698
	 * before disabling it. */
706
	 * before disabling it. */
699
	if (HAS_PCH_IBX(dev)) {
707
	if (HAS_PCH_IBX(dev)) {
700
		struct drm_crtc *crtc = encoder->base.crtc;
708
		struct drm_crtc *crtc = encoder->base.crtc;
701
		int pipe = crtc ? to_intel_crtc(crtc)->pipe : -1;
709
		int pipe = crtc ? to_intel_crtc(crtc)->pipe : -1;
702
 
710
 
703
			if (temp & SDVO_PIPE_B_SELECT) {
711
			if (temp & SDVO_PIPE_B_SELECT) {
704
				temp &= ~SDVO_PIPE_B_SELECT;
712
				temp &= ~SDVO_PIPE_B_SELECT;
705
				I915_WRITE(intel_hdmi->sdvox_reg, temp);
713
				I915_WRITE(intel_hdmi->sdvox_reg, temp);
706
				POSTING_READ(intel_hdmi->sdvox_reg);
714
				POSTING_READ(intel_hdmi->sdvox_reg);
707
 
715
 
708
				/* Again we need to write this twice. */
716
				/* Again we need to write this twice. */
709
				I915_WRITE(intel_hdmi->sdvox_reg, temp);
717
				I915_WRITE(intel_hdmi->sdvox_reg, temp);
710
				POSTING_READ(intel_hdmi->sdvox_reg);
718
				POSTING_READ(intel_hdmi->sdvox_reg);
711
 
719
 
712
				/* Transcoder selection bits only update
720
				/* Transcoder selection bits only update
713
				 * effectively on vblank. */
721
				 * effectively on vblank. */
714
				if (crtc)
722
				if (crtc)
715
					intel_wait_for_vblank(dev, pipe);
723
					intel_wait_for_vblank(dev, pipe);
716
				else
724
				else
717
					msleep(50);
725
					msleep(50);
718
			}
726
			}
719
	}
727
	}
720
 
728
 
721
	/* HW workaround, need to toggle enable bit off and on for 12bpc, but
729
	/* HW workaround, need to toggle enable bit off and on for 12bpc, but
722
	 * we do this anyway which shows more stable in testing.
730
	 * we do this anyway which shows more stable in testing.
723
	 */
731
	 */
724
	if (HAS_PCH_SPLIT(dev)) {
732
	if (HAS_PCH_SPLIT(dev)) {
725
		I915_WRITE(intel_hdmi->sdvox_reg, temp & ~SDVO_ENABLE);
733
		I915_WRITE(intel_hdmi->sdvox_reg, temp & ~SDVO_ENABLE);
726
		POSTING_READ(intel_hdmi->sdvox_reg);
734
		POSTING_READ(intel_hdmi->sdvox_reg);
727
	}
735
	}
728
 
736
 
729
		temp &= ~enable_bits;
737
		temp &= ~enable_bits;
730
 
738
 
731
	I915_WRITE(intel_hdmi->sdvox_reg, temp);
739
	I915_WRITE(intel_hdmi->sdvox_reg, temp);
732
	POSTING_READ(intel_hdmi->sdvox_reg);
740
	POSTING_READ(intel_hdmi->sdvox_reg);
733
 
741
 
734
	/* HW workaround, need to write this twice for issue that may result
742
	/* HW workaround, need to write this twice for issue that may result
735
	 * in first write getting masked.
743
	 * in first write getting masked.
736
	 */
744
	 */
737
	if (HAS_PCH_SPLIT(dev)) {
745
	if (HAS_PCH_SPLIT(dev)) {
738
		I915_WRITE(intel_hdmi->sdvox_reg, temp);
746
		I915_WRITE(intel_hdmi->sdvox_reg, temp);
739
		POSTING_READ(intel_hdmi->sdvox_reg);
747
		POSTING_READ(intel_hdmi->sdvox_reg);
740
	}
748
	}
741
}
749
}
742
 
750
 
743
static int intel_hdmi_mode_valid(struct drm_connector *connector,
751
static int intel_hdmi_mode_valid(struct drm_connector *connector,
744
				 struct drm_display_mode *mode)
752
				 struct drm_display_mode *mode)
745
{
753
{
746
	if (mode->clock > 165000)
754
	if (mode->clock > 165000)
747
		return MODE_CLOCK_HIGH;
755
		return MODE_CLOCK_HIGH;
748
	if (mode->clock < 20000)
756
	if (mode->clock < 20000)
749
		return MODE_CLOCK_LOW;
757
		return MODE_CLOCK_LOW;
750
 
758
 
751
	if (mode->flags & DRM_MODE_FLAG_DBLSCAN)
759
	if (mode->flags & DRM_MODE_FLAG_DBLSCAN)
752
		return MODE_NO_DBLESCAN;
760
		return MODE_NO_DBLESCAN;
753
 
761
 
754
	return MODE_OK;
762
	return MODE_OK;
755
}
763
}
756
 
764
 
757
static bool intel_hdmi_mode_fixup(struct drm_encoder *encoder,
765
bool intel_hdmi_mode_fixup(struct drm_encoder *encoder,
758
				  const struct drm_display_mode *mode,
766
				  const struct drm_display_mode *mode,
759
				  struct drm_display_mode *adjusted_mode)
767
				  struct drm_display_mode *adjusted_mode)
760
{
768
{
761
	return true;
769
	return true;
762
}
770
}
763
 
771
 
764
static bool g4x_hdmi_connected(struct intel_hdmi *intel_hdmi)
772
static bool g4x_hdmi_connected(struct intel_hdmi *intel_hdmi)
765
{
773
{
766
	struct drm_device *dev = intel_hdmi->base.base.dev;
774
	struct drm_device *dev = intel_hdmi_to_dev(intel_hdmi);
767
	struct drm_i915_private *dev_priv = dev->dev_private;
775
	struct drm_i915_private *dev_priv = dev->dev_private;
768
	uint32_t bit;
776
	uint32_t bit;
769
 
777
 
770
	switch (intel_hdmi->sdvox_reg) {
778
	switch (intel_hdmi->sdvox_reg) {
771
	case SDVOB:
779
	case SDVOB:
772
		bit = HDMIB_HOTPLUG_LIVE_STATUS;
780
		bit = HDMIB_HOTPLUG_LIVE_STATUS;
773
		break;
781
		break;
774
	case SDVOC:
782
	case SDVOC:
775
		bit = HDMIC_HOTPLUG_LIVE_STATUS;
783
		bit = HDMIC_HOTPLUG_LIVE_STATUS;
776
		break;
784
		break;
777
	default:
785
	default:
778
		bit = 0;
786
		bit = 0;
779
		break;
787
		break;
780
	}
788
	}
781
 
789
 
782
	return I915_READ(PORT_HOTPLUG_STAT) & bit;
790
	return I915_READ(PORT_HOTPLUG_STAT) & bit;
783
}
791
}
784
 
792
 
785
static enum drm_connector_status
793
static enum drm_connector_status
786
intel_hdmi_detect(struct drm_connector *connector, bool force)
794
intel_hdmi_detect(struct drm_connector *connector, bool force)
787
{
795
{
788
	struct intel_hdmi *intel_hdmi = intel_attached_hdmi(connector);
796
	struct intel_hdmi *intel_hdmi = intel_attached_hdmi(connector);
-
 
797
	struct intel_digital_port *intel_dig_port =
-
 
798
		hdmi_to_dig_port(intel_hdmi);
-
 
799
	struct intel_encoder *intel_encoder = &intel_dig_port->base;
789
	struct drm_i915_private *dev_priv = connector->dev->dev_private;
800
	struct drm_i915_private *dev_priv = connector->dev->dev_private;
790
	struct edid *edid;
801
	struct edid *edid;
791
	enum drm_connector_status status = connector_status_disconnected;
802
	enum drm_connector_status status = connector_status_disconnected;
792
 
803
 
793
	if (IS_G4X(connector->dev) && !g4x_hdmi_connected(intel_hdmi))
804
	if (IS_G4X(connector->dev) && !g4x_hdmi_connected(intel_hdmi))
794
		return status;
805
		return status;
795
 
806
 
796
	intel_hdmi->has_hdmi_sink = false;
807
	intel_hdmi->has_hdmi_sink = false;
797
	intel_hdmi->has_audio = false;
808
	intel_hdmi->has_audio = false;
798
	edid = drm_get_edid(connector,
809
	edid = drm_get_edid(connector,
799
			    intel_gmbus_get_adapter(dev_priv,
810
			    intel_gmbus_get_adapter(dev_priv,
800
						    intel_hdmi->ddc_bus));
811
						    intel_hdmi->ddc_bus));
801
 
812
 
802
	if (edid) {
813
	if (edid) {
803
		if (edid->input & DRM_EDID_INPUT_DIGITAL) {
814
		if (edid->input & DRM_EDID_INPUT_DIGITAL) {
804
			status = connector_status_connected;
815
			status = connector_status_connected;
805
			if (intel_hdmi->force_audio != HDMI_AUDIO_OFF_DVI)
816
			if (intel_hdmi->force_audio != HDMI_AUDIO_OFF_DVI)
806
				intel_hdmi->has_hdmi_sink =
817
				intel_hdmi->has_hdmi_sink =
807
						drm_detect_hdmi_monitor(edid);
818
						drm_detect_hdmi_monitor(edid);
808
			intel_hdmi->has_audio = drm_detect_monitor_audio(edid);
819
			intel_hdmi->has_audio = drm_detect_monitor_audio(edid);
809
		}
820
		}
810
		kfree(edid);
821
		kfree(edid);
811
	}
822
	}
812
 
823
 
813
	if (status == connector_status_connected) {
824
	if (status == connector_status_connected) {
814
		if (intel_hdmi->force_audio != HDMI_AUDIO_AUTO)
825
		if (intel_hdmi->force_audio != HDMI_AUDIO_AUTO)
815
			intel_hdmi->has_audio =
826
			intel_hdmi->has_audio =
816
				(intel_hdmi->force_audio == HDMI_AUDIO_ON);
827
				(intel_hdmi->force_audio == HDMI_AUDIO_ON);
-
 
828
		intel_encoder->type = INTEL_OUTPUT_HDMI;
817
	}
829
	}
818
 
830
 
819
	return status;
831
	return status;
820
}
832
}
821
 
833
 
822
static int intel_hdmi_get_modes(struct drm_connector *connector)
834
static int intel_hdmi_get_modes(struct drm_connector *connector)
823
{
835
{
824
	struct intel_hdmi *intel_hdmi = intel_attached_hdmi(connector);
836
	struct intel_hdmi *intel_hdmi = intel_attached_hdmi(connector);
825
	struct drm_i915_private *dev_priv = connector->dev->dev_private;
837
	struct drm_i915_private *dev_priv = connector->dev->dev_private;
826
 
838
 
827
	/* We should parse the EDID data and find out if it's an HDMI sink so
839
	/* We should parse the EDID data and find out if it's an HDMI sink so
828
	 * we can send audio to it.
840
	 * we can send audio to it.
829
	 */
841
	 */
830
 
842
 
831
	return intel_ddc_get_modes(connector,
843
	return intel_ddc_get_modes(connector,
832
				   intel_gmbus_get_adapter(dev_priv,
844
				   intel_gmbus_get_adapter(dev_priv,
833
							   intel_hdmi->ddc_bus));
845
							   intel_hdmi->ddc_bus));
834
}
846
}
835
 
847
 
836
static bool
848
static bool
837
intel_hdmi_detect_audio(struct drm_connector *connector)
849
intel_hdmi_detect_audio(struct drm_connector *connector)
838
{
850
{
839
	struct intel_hdmi *intel_hdmi = intel_attached_hdmi(connector);
851
	struct intel_hdmi *intel_hdmi = intel_attached_hdmi(connector);
840
	struct drm_i915_private *dev_priv = connector->dev->dev_private;
852
	struct drm_i915_private *dev_priv = connector->dev->dev_private;
841
	struct edid *edid;
853
	struct edid *edid;
842
	bool has_audio = false;
854
	bool has_audio = false;
843
 
855
 
844
	edid = drm_get_edid(connector,
856
	edid = drm_get_edid(connector,
845
			    intel_gmbus_get_adapter(dev_priv,
857
			    intel_gmbus_get_adapter(dev_priv,
846
						    intel_hdmi->ddc_bus));
858
						    intel_hdmi->ddc_bus));
847
	if (edid) {
859
	if (edid) {
848
		if (edid->input & DRM_EDID_INPUT_DIGITAL)
860
		if (edid->input & DRM_EDID_INPUT_DIGITAL)
849
			has_audio = drm_detect_monitor_audio(edid);
861
			has_audio = drm_detect_monitor_audio(edid);
850
		kfree(edid);
862
		kfree(edid);
851
	}
863
	}
852
 
864
 
853
	return has_audio;
865
	return has_audio;
854
}
866
}
855
 
867
 
856
static int
868
static int
857
intel_hdmi_set_property(struct drm_connector *connector,
869
intel_hdmi_set_property(struct drm_connector *connector,
858
		      struct drm_property *property,
870
		      struct drm_property *property,
859
		      uint64_t val)
871
		      uint64_t val)
860
{
872
{
861
	struct intel_hdmi *intel_hdmi = intel_attached_hdmi(connector);
873
	struct intel_hdmi *intel_hdmi = intel_attached_hdmi(connector);
-
 
874
	struct intel_digital_port *intel_dig_port =
-
 
875
		hdmi_to_dig_port(intel_hdmi);
862
	struct drm_i915_private *dev_priv = connector->dev->dev_private;
876
	struct drm_i915_private *dev_priv = connector->dev->dev_private;
863
	int ret;
877
	int ret;
864
 
878
 
865
	ret = drm_connector_property_set_value(connector, property, val);
879
	ret = drm_object_property_set_value(&connector->base, property, val);
866
	if (ret)
880
	if (ret)
867
		return ret;
881
		return ret;
868
#if 0
882
#if 0
869
	if (property == dev_priv->force_audio_property) {
883
	if (property == dev_priv->force_audio_property) {
870
		enum hdmi_force_audio i = val;
884
		enum hdmi_force_audio i = val;
871
		bool has_audio;
885
		bool has_audio;
872
 
886
 
873
		if (i == intel_hdmi->force_audio)
887
		if (i == intel_hdmi->force_audio)
874
			return 0;
888
			return 0;
875
 
889
 
876
		intel_hdmi->force_audio = i;
890
		intel_hdmi->force_audio = i;
877
 
891
 
878
		if (i == HDMI_AUDIO_AUTO)
892
		if (i == HDMI_AUDIO_AUTO)
879
			has_audio = intel_hdmi_detect_audio(connector);
893
			has_audio = intel_hdmi_detect_audio(connector);
880
		else
894
		else
881
			has_audio = (i == HDMI_AUDIO_ON);
895
			has_audio = (i == HDMI_AUDIO_ON);
882
 
896
 
883
		if (i == HDMI_AUDIO_OFF_DVI)
897
		if (i == HDMI_AUDIO_OFF_DVI)
884
			intel_hdmi->has_hdmi_sink = 0;
898
			intel_hdmi->has_hdmi_sink = 0;
885
 
899
 
886
		intel_hdmi->has_audio = has_audio;
900
		intel_hdmi->has_audio = has_audio;
887
		goto done;
901
		goto done;
888
	}
902
	}
889
#endif
903
#endif
890
 
904
 
891
	if (property == dev_priv->broadcast_rgb_property) {
905
	if (property == dev_priv->broadcast_rgb_property) {
892
		if (val == !!intel_hdmi->color_range)
906
		if (val == !!intel_hdmi->color_range)
893
			return 0;
907
			return 0;
894
 
908
 
895
		intel_hdmi->color_range = val ? SDVO_COLOR_RANGE_16_235 : 0;
909
		intel_hdmi->color_range = val ? SDVO_COLOR_RANGE_16_235 : 0;
896
		goto done;
910
		goto done;
897
	}
911
	}
898
 
912
 
899
	return -EINVAL;
913
	return -EINVAL;
900
 
914
 
901
done:
915
done:
902
	if (intel_hdmi->base.base.crtc) {
916
	if (intel_dig_port->base.base.crtc) {
903
		struct drm_crtc *crtc = intel_hdmi->base.base.crtc;
917
		struct drm_crtc *crtc = intel_dig_port->base.base.crtc;
904
		intel_set_mode(crtc, &crtc->mode,
918
		intel_set_mode(crtc, &crtc->mode,
905
			       crtc->x, crtc->y, crtc->fb);
919
			       crtc->x, crtc->y, crtc->fb);
906
	}
920
	}
907
 
921
 
908
	return 0;
922
	return 0;
909
}
923
}
910
 
924
 
911
static void intel_hdmi_destroy(struct drm_connector *connector)
925
static void intel_hdmi_destroy(struct drm_connector *connector)
912
{
926
{
913
	drm_sysfs_connector_remove(connector);
927
	drm_sysfs_connector_remove(connector);
914
	drm_connector_cleanup(connector);
928
	drm_connector_cleanup(connector);
915
	kfree(connector);
929
	kfree(connector);
916
}
930
}
917
 
-
 
918
static const struct drm_encoder_helper_funcs intel_hdmi_helper_funcs_hsw = {
-
 
919
	.mode_fixup = intel_hdmi_mode_fixup,
-
 
920
	.mode_set = intel_ddi_mode_set,
-
 
921
	.disable = intel_encoder_noop,
-
 
922
};
-
 
923
 
931
 
924
static const struct drm_encoder_helper_funcs intel_hdmi_helper_funcs = {
932
static const struct drm_encoder_helper_funcs intel_hdmi_helper_funcs = {
925
	.mode_fixup = intel_hdmi_mode_fixup,
933
	.mode_fixup = intel_hdmi_mode_fixup,
926
	.mode_set = intel_hdmi_mode_set,
934
	.mode_set = intel_hdmi_mode_set,
927
	.disable = intel_encoder_noop,
935
	.disable = intel_encoder_noop,
928
};
936
};
929
 
937
 
930
static const struct drm_connector_funcs intel_hdmi_connector_funcs = {
938
static const struct drm_connector_funcs intel_hdmi_connector_funcs = {
931
	.dpms = intel_connector_dpms,
939
	.dpms = intel_connector_dpms,
932
	.detect = intel_hdmi_detect,
940
	.detect = intel_hdmi_detect,
933
	.fill_modes = drm_helper_probe_single_connector_modes,
941
	.fill_modes = drm_helper_probe_single_connector_modes,
934
	.set_property = intel_hdmi_set_property,
942
	.set_property = intel_hdmi_set_property,
935
	.destroy = intel_hdmi_destroy,
943
	.destroy = intel_hdmi_destroy,
936
};
944
};
937
 
945
 
938
static const struct drm_connector_helper_funcs intel_hdmi_connector_helper_funcs = {
946
static const struct drm_connector_helper_funcs intel_hdmi_connector_helper_funcs = {
939
	.get_modes = intel_hdmi_get_modes,
947
	.get_modes = intel_hdmi_get_modes,
940
	.mode_valid = intel_hdmi_mode_valid,
948
	.mode_valid = intel_hdmi_mode_valid,
941
	.best_encoder = intel_best_encoder,
949
	.best_encoder = intel_best_encoder,
942
};
950
};
943
 
951
 
944
static const struct drm_encoder_funcs intel_hdmi_enc_funcs = {
952
static const struct drm_encoder_funcs intel_hdmi_enc_funcs = {
945
	.destroy = intel_encoder_destroy,
953
	.destroy = intel_encoder_destroy,
946
};
954
};
947
 
955
 
948
static void
956
static void
949
intel_hdmi_add_properties(struct intel_hdmi *intel_hdmi, struct drm_connector *connector)
957
intel_hdmi_add_properties(struct intel_hdmi *intel_hdmi, struct drm_connector *connector)
950
{
958
{
951
	intel_attach_force_audio_property(connector);
959
	intel_attach_force_audio_property(connector);
952
	intel_attach_broadcast_rgb_property(connector);
960
	intel_attach_broadcast_rgb_property(connector);
953
}
961
}
954
 
962
 
-
 
963
void intel_hdmi_init_connector(struct intel_digital_port *intel_dig_port,
955
void intel_hdmi_init(struct drm_device *dev, int sdvox_reg, enum port port)
964
			       struct intel_connector *intel_connector)
-
 
965
{
-
 
966
	struct drm_connector *connector = &intel_connector->base;
-
 
967
	struct intel_hdmi *intel_hdmi = &intel_dig_port->hdmi;
-
 
968
	struct intel_encoder *intel_encoder = &intel_dig_port->base;
956
{
969
	struct drm_device *dev = intel_encoder->base.dev;
957
	struct drm_i915_private *dev_priv = dev->dev_private;
-
 
958
	struct drm_connector *connector;
-
 
959
	struct intel_encoder *intel_encoder;
970
	struct drm_i915_private *dev_priv = dev->dev_private;
960
	struct intel_connector *intel_connector;
-
 
961
	struct intel_hdmi *intel_hdmi;
-
 
962
 
-
 
963
	intel_hdmi = kzalloc(sizeof(struct intel_hdmi), GFP_KERNEL);
-
 
964
	if (!intel_hdmi)
-
 
965
		return;
-
 
966
 
-
 
967
	intel_connector = kzalloc(sizeof(struct intel_connector), GFP_KERNEL);
-
 
968
	if (!intel_connector) {
-
 
969
		kfree(intel_hdmi);
-
 
970
		return;
-
 
971
	}
-
 
972
 
-
 
973
	intel_encoder = &intel_hdmi->base;
-
 
974
	drm_encoder_init(dev, &intel_encoder->base, &intel_hdmi_enc_funcs,
-
 
975
			 DRM_MODE_ENCODER_TMDS);
-
 
976
 
971
	enum port port = intel_dig_port->port;
977
	connector = &intel_connector->base;
972
 
978
	drm_connector_init(dev, connector, &intel_hdmi_connector_funcs,
973
	drm_connector_init(dev, connector, &intel_hdmi_connector_funcs,
979
			   DRM_MODE_CONNECTOR_HDMIA);
974
			   DRM_MODE_CONNECTOR_HDMIA);
980
	drm_connector_helper_add(connector, &intel_hdmi_connector_helper_funcs);
975
	drm_connector_helper_add(connector, &intel_hdmi_connector_helper_funcs);
981
 
-
 
982
	intel_encoder->type = INTEL_OUTPUT_HDMI;
-
 
983
 
976
 
984
	connector->polled = DRM_CONNECTOR_POLL_HPD;
977
	connector->polled = DRM_CONNECTOR_POLL_HPD;
985
	connector->interlace_allowed = 1;
978
	connector->interlace_allowed = 1;
986
	connector->doublescan_allowed = 0;
979
	connector->doublescan_allowed = 0;
987
	intel_encoder->crtc_mask = (1 << 0) | (1 << 1) | (1 << 2);
-
 
988
 
-
 
989
	intel_encoder->cloneable = false;
-
 
990
 
-
 
991
	intel_hdmi->ddi_port = port;
980
 
992
	switch (port) {
981
	switch (port) {
993
	case PORT_B:
982
	case PORT_B:
994
		intel_hdmi->ddc_bus = GMBUS_PORT_DPB;
983
		intel_hdmi->ddc_bus = GMBUS_PORT_DPB;
995
		dev_priv->hotplug_supported_mask |= HDMIB_HOTPLUG_INT_STATUS;
984
		dev_priv->hotplug_supported_mask |= HDMIB_HOTPLUG_INT_STATUS;
996
		break;
985
		break;
997
	case PORT_C:
986
	case PORT_C:
998
		intel_hdmi->ddc_bus = GMBUS_PORT_DPC;
987
		intel_hdmi->ddc_bus = GMBUS_PORT_DPC;
999
		dev_priv->hotplug_supported_mask |= HDMIC_HOTPLUG_INT_STATUS;
988
		dev_priv->hotplug_supported_mask |= HDMIC_HOTPLUG_INT_STATUS;
1000
		break;
989
		break;
1001
	case PORT_D:
990
	case PORT_D:
1002
		intel_hdmi->ddc_bus = GMBUS_PORT_DPD;
991
		intel_hdmi->ddc_bus = GMBUS_PORT_DPD;
1003
		dev_priv->hotplug_supported_mask |= HDMID_HOTPLUG_INT_STATUS;
992
		dev_priv->hotplug_supported_mask |= HDMID_HOTPLUG_INT_STATUS;
1004
		break;
993
		break;
1005
	case PORT_A:
994
	case PORT_A:
1006
		/* Internal port only for eDP. */
995
		/* Internal port only for eDP. */
1007
	default:
996
	default:
1008
		BUG();
997
		BUG();
1009
	}
998
	}
1010
 
-
 
1011
	intel_hdmi->sdvox_reg = sdvox_reg;
-
 
1012
 
999
 
1013
	if (!HAS_PCH_SPLIT(dev)) {
1000
	if (!HAS_PCH_SPLIT(dev)) {
1014
		intel_hdmi->write_infoframe = g4x_write_infoframe;
1001
		intel_hdmi->write_infoframe = g4x_write_infoframe;
1015
		intel_hdmi->set_infoframes = g4x_set_infoframes;
1002
		intel_hdmi->set_infoframes = g4x_set_infoframes;
1016
	} else if (IS_VALLEYVIEW(dev)) {
1003
	} else if (IS_VALLEYVIEW(dev)) {
1017
		intel_hdmi->write_infoframe = vlv_write_infoframe;
1004
		intel_hdmi->write_infoframe = vlv_write_infoframe;
1018
		intel_hdmi->set_infoframes = vlv_set_infoframes;
1005
		intel_hdmi->set_infoframes = vlv_set_infoframes;
1019
	} else if (IS_HASWELL(dev)) {
1006
	} else if (IS_HASWELL(dev)) {
1020
		intel_hdmi->write_infoframe = hsw_write_infoframe;
1007
		intel_hdmi->write_infoframe = hsw_write_infoframe;
1021
		intel_hdmi->set_infoframes = hsw_set_infoframes;
1008
		intel_hdmi->set_infoframes = hsw_set_infoframes;
1022
	} else if (HAS_PCH_IBX(dev)) {
1009
	} else if (HAS_PCH_IBX(dev)) {
1023
		intel_hdmi->write_infoframe = ibx_write_infoframe;
1010
		intel_hdmi->write_infoframe = ibx_write_infoframe;
1024
		intel_hdmi->set_infoframes = ibx_set_infoframes;
1011
		intel_hdmi->set_infoframes = ibx_set_infoframes;
1025
	} else {
1012
	} else {
1026
		intel_hdmi->write_infoframe = cpt_write_infoframe;
1013
		intel_hdmi->write_infoframe = cpt_write_infoframe;
1027
		intel_hdmi->set_infoframes = cpt_set_infoframes;
1014
		intel_hdmi->set_infoframes = cpt_set_infoframes;
1028
	}
1015
	}
1029
 
1016
 
1030
	if (IS_HASWELL(dev)) {
-
 
1031
		intel_encoder->enable = intel_enable_ddi;
-
 
1032
		intel_encoder->disable = intel_disable_ddi;
1017
	if (IS_HASWELL(dev))
1033
		intel_encoder->get_hw_state = intel_ddi_get_hw_state;
-
 
1034
		drm_encoder_helper_add(&intel_encoder->base,
-
 
1035
				       &intel_hdmi_helper_funcs_hsw);
1018
		intel_connector->get_hw_state = intel_ddi_connector_get_hw_state;
1036
	} else {
-
 
1037
		intel_encoder->enable = intel_enable_hdmi;
-
 
1038
		intel_encoder->disable = intel_disable_hdmi;
-
 
1039
		intel_encoder->get_hw_state = intel_hdmi_get_hw_state;
-
 
1040
		drm_encoder_helper_add(&intel_encoder->base,
-
 
1041
				       &intel_hdmi_helper_funcs);
-
 
1042
	}
1019
	else
1043
	intel_connector->get_hw_state = intel_connector_get_hw_state;
-
 
1044
 
1020
	intel_connector->get_hw_state = intel_connector_get_hw_state;
1045
 
1021
 
1046
	intel_hdmi_add_properties(intel_hdmi, connector);
1022
	intel_hdmi_add_properties(intel_hdmi, connector);
1047
 
1023
 
1048
	intel_connector_attach_encoder(intel_connector, intel_encoder);
1024
	intel_connector_attach_encoder(intel_connector, intel_encoder);
1049
	drm_sysfs_connector_add(connector);
1025
	drm_sysfs_connector_add(connector);
1050
 
1026
 
1051
	/* For G4X desktop chip, PEG_BAND_GAP_DATA 3:0 must first be written
1027
	/* For G4X desktop chip, PEG_BAND_GAP_DATA 3:0 must first be written
1052
	 * 0xd.  Failure to do so will result in spurious interrupts being
1028
	 * 0xd.  Failure to do so will result in spurious interrupts being
1053
	 * generated on the port when a cable is not attached.
1029
	 * generated on the port when a cable is not attached.
1054
	 */
1030
	 */
1055
	if (IS_G4X(dev) && !IS_GM45(dev)) {
1031
	if (IS_G4X(dev) && !IS_GM45(dev)) {
1056
		u32 temp = I915_READ(PEG_BAND_GAP_DATA);
1032
		u32 temp = I915_READ(PEG_BAND_GAP_DATA);
1057
		I915_WRITE(PEG_BAND_GAP_DATA, (temp & ~0xf) | 0xd);
1033
		I915_WRITE(PEG_BAND_GAP_DATA, (temp & ~0xf) | 0xd);
1058
	}
1034
	}
1059
}
1035
}
-
 
1036
 
-
 
1037
void intel_hdmi_init(struct drm_device *dev, int sdvox_reg, enum port port)
-
 
1038
{
-
 
1039
	struct intel_digital_port *intel_dig_port;
-
 
1040
	struct intel_encoder *intel_encoder;
-
 
1041
	struct drm_encoder *encoder;
-
 
1042
	struct intel_connector *intel_connector;
-
 
1043
 
-
 
1044
	intel_dig_port = kzalloc(sizeof(struct intel_digital_port), GFP_KERNEL);
-
 
1045
	if (!intel_dig_port)
-
 
1046
		return;
-
 
1047
 
-
 
1048
	intel_connector = kzalloc(sizeof(struct intel_connector), GFP_KERNEL);
-
 
1049
	if (!intel_connector) {
-
 
1050
		kfree(intel_dig_port);
-
 
1051
		return;
-
 
1052
	}
-
 
1053
 
-
 
1054
	intel_encoder = &intel_dig_port->base;
-
 
1055
	encoder = &intel_encoder->base;
-
 
1056
 
-
 
1057
	drm_encoder_init(dev, &intel_encoder->base, &intel_hdmi_enc_funcs,
-
 
1058
			 DRM_MODE_ENCODER_TMDS);
-
 
1059
	drm_encoder_helper_add(&intel_encoder->base, &intel_hdmi_helper_funcs);
-
 
1060
 
-
 
1061
	intel_encoder->enable = intel_enable_hdmi;
-
 
1062
	intel_encoder->disable = intel_disable_hdmi;
-
 
1063
	intel_encoder->get_hw_state = intel_hdmi_get_hw_state;
-
 
1064
 
-
 
1065
	intel_encoder->type = INTEL_OUTPUT_HDMI;
-
 
1066
	intel_encoder->crtc_mask = (1 << 0) | (1 << 1) | (1 << 2);
-
 
1067
	intel_encoder->cloneable = false;
-
 
1068
 
-
 
1069
	intel_dig_port->port = port;
-
 
1070
	intel_dig_port->hdmi.sdvox_reg = sdvox_reg;
-
 
1071
	intel_dig_port->dp.output_reg = 0;
-
 
1072
 
-
 
1073
	intel_hdmi_init_connector(intel_dig_port, intel_connector);
-
 
1074
}