Linux Audio

Check our new training course

Loading...
v3.1
  1/*
  2 * Copyright 2006 Dave Airlie <airlied@linux.ie>
  3 * Copyright © 2006-2009 Intel Corporation
  4 *
  5 * Permission is hereby granted, free of charge, to any person obtaining a
  6 * copy of this software and associated documentation files (the "Software"),
  7 * to deal in the Software without restriction, including without limitation
  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
 10 * Software is furnished to do so, subject to the following conditions:
 11 *
 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
 14 * Software.
 15 *
 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,
 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
 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
 22 * DEALINGS IN THE SOFTWARE.
 23 *
 24 * Authors:
 25 *	Eric Anholt <eric@anholt.net>
 26 *	Jesse Barnes <jesse.barnes@intel.com>
 27 */
 28
 29#include <linux/i2c.h>
 30#include <linux/slab.h>
 31#include <linux/delay.h>
 32#include "drmP.h"
 33#include "drm.h"
 34#include "drm_crtc.h"
 35#include "drm_edid.h"
 36#include "intel_drv.h"
 37#include "i915_drm.h"
 38#include "i915_drv.h"
 39
 40struct intel_hdmi {
 41	struct intel_encoder base;
 42	u32 sdvox_reg;
 43	int ddc_bus;
 44	uint32_t color_range;
 45	bool has_hdmi_sink;
 46	bool has_audio;
 47	int force_audio;
 48	void (*write_infoframe)(struct drm_encoder *encoder,
 49				struct dip_infoframe *frame);
 50};
 51
 52static struct intel_hdmi *enc_to_intel_hdmi(struct drm_encoder *encoder)
 
 53{
 54	return container_of(encoder, struct intel_hdmi, base.base);
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 55}
 56
 57static struct intel_hdmi *intel_attached_hdmi(struct drm_connector *connector)
 58{
 59	return container_of(intel_attached_encoder(connector),
 60			    struct intel_hdmi, base);
 61}
 62
 63void intel_dip_infoframe_csum(struct dip_infoframe *frame)
 64{
 65	uint8_t *data = (uint8_t *)frame;
 66	uint8_t sum = 0;
 67	unsigned i;
 
 
 
 
 
 
 
 
 
 68
 69	frame->checksum = 0;
 70	frame->ecc = 0;
 
 
 
 
 
 
 
 
 
 
 
 
 71
 72	/* Header isn't part of the checksum */
 73	for (i = 5; i < frame->len; i++)
 74		sum += data[i];
 
 
 
 
 
 
 
 
 
 
 
 75
 76	frame->checksum = 0x100 - sum;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 77}
 78
 79static u32 intel_infoframe_index(struct dip_infoframe *frame)
 
 
 80{
 81	u32 flags = 0;
 
 
 
 
 82
 83	switch (frame->type) {
 84	case DIP_TYPE_AVI:
 85		flags |= VIDEO_DIP_SELECT_AVI;
 86		break;
 87	case DIP_TYPE_SPD:
 88		flags |= VIDEO_DIP_SELECT_SPD;
 89		break;
 90	default:
 91		DRM_DEBUG_DRIVER("unknown info frame type %d\n", frame->type);
 92		break;
 
 
 
 93	}
 
 
 
 
 
 
 
 
 94
 95	return flags;
 
 96}
 97
 98static u32 intel_infoframe_flags(struct dip_infoframe *frame)
 
 
 99{
100	u32 flags = 0;
 
 
 
 
 
101
102	switch (frame->type) {
103	case DIP_TYPE_AVI:
104		flags |= VIDEO_DIP_ENABLE_AVI | VIDEO_DIP_FREQ_VSYNC;
105		break;
106	case DIP_TYPE_SPD:
107		flags |= VIDEO_DIP_ENABLE_SPD | VIDEO_DIP_FREQ_2VSYNC;
108		break;
109	default:
110		DRM_DEBUG_DRIVER("unknown info frame type %d\n", frame->type);
111		break;
 
 
 
112	}
 
 
 
 
 
 
 
 
113
114	return flags;
 
115}
116
117static void i9xx_write_infoframe(struct drm_encoder *encoder,
118				 struct dip_infoframe *frame)
 
119{
120	uint32_t *data = (uint32_t *)frame;
121	struct drm_device *dev = encoder->dev;
122	struct drm_i915_private *dev_priv = dev->dev_private;
123	struct intel_hdmi *intel_hdmi = enc_to_intel_hdmi(encoder);
124	u32 port, flags, val = I915_READ(VIDEO_DIP_CTL);
125	unsigned i, len = DIP_HEADER_SIZE + frame->len;
126
127
128	/* XXX first guess at handling video port, is this corrent? */
129	if (intel_hdmi->sdvox_reg == SDVOB)
130		port = VIDEO_DIP_PORT_B;
131	else if (intel_hdmi->sdvox_reg == SDVOC)
132		port = VIDEO_DIP_PORT_C;
133	else
134		return;
135
136	flags = intel_infoframe_index(frame);
 
137
138	val &= ~VIDEO_DIP_SELECT_MASK;
 
 
 
139
140	I915_WRITE(VIDEO_DIP_CTL, val | port | flags);
141
 
142	for (i = 0; i < len; i += 4) {
143		I915_WRITE(VIDEO_DIP_DATA, *data);
144		data++;
145	}
 
 
 
 
 
 
 
 
146
147	flags |= intel_infoframe_flags(frame);
148
149	I915_WRITE(VIDEO_DIP_CTL, VIDEO_DIP_ENABLE | val | port | flags);
150}
151
152static void ironlake_write_infoframe(struct drm_encoder *encoder,
153				     struct dip_infoframe *frame)
 
154{
155	uint32_t *data = (uint32_t *)frame;
156	struct drm_device *dev = encoder->dev;
157	struct drm_i915_private *dev_priv = dev->dev_private;
158	struct drm_crtc *crtc = encoder->crtc;
159	struct intel_crtc *intel_crtc = to_intel_crtc(crtc);
160	int reg = TVIDEO_DIP_CTL(intel_crtc->pipe);
161	unsigned i, len = DIP_HEADER_SIZE + frame->len;
162	u32 flags, val = I915_READ(reg);
163
164	intel_wait_for_vblank(dev, intel_crtc->pipe);
165
166	flags = intel_infoframe_index(frame);
 
167
168	val &= ~VIDEO_DIP_SELECT_MASK;
169
170	I915_WRITE(reg, val | flags);
171
 
172	for (i = 0; i < len; i += 4) {
173		I915_WRITE(TVIDEO_DIP_DATA(intel_crtc->pipe), *data);
174		data++;
175	}
 
 
 
 
 
 
 
 
 
 
 
 
176
177	flags |= intel_infoframe_flags(frame);
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
178
179	I915_WRITE(reg, VIDEO_DIP_ENABLE | val | flags);
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
180}
181static void intel_set_infoframe(struct drm_encoder *encoder,
182				struct dip_infoframe *frame)
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
183{
184	struct intel_hdmi *intel_hdmi = enc_to_intel_hdmi(encoder);
 
 
185
186	if (!intel_hdmi->has_hdmi_sink)
 
 
187		return;
188
189	intel_dip_infoframe_csum(frame);
190	intel_hdmi->write_infoframe(encoder, frame);
 
 
 
 
 
 
191}
192
193static void intel_hdmi_set_avi_infoframe(struct drm_encoder *encoder)
 
194{
195	struct dip_infoframe avi_if = {
196		.type = DIP_TYPE_AVI,
197		.ver = DIP_VERSION_AVI,
198		.len = DIP_LEN_AVI,
199	};
 
 
 
 
 
 
200
201	intel_set_infoframe(encoder, &avi_if);
 
 
 
 
 
 
 
 
 
202}
203
204static void intel_hdmi_set_spd_infoframe(struct drm_encoder *encoder)
205{
206	struct dip_infoframe spd_if;
 
207
208	memset(&spd_if, 0, sizeof(spd_if));
209	spd_if.type = DIP_TYPE_SPD;
210	spd_if.ver = DIP_VERSION_SPD;
211	spd_if.len = DIP_LEN_SPD;
212	strcpy(spd_if.body.spd.vn, "Intel");
213	strcpy(spd_if.body.spd.pd, "Integrated gfx");
214	spd_if.body.spd.sdi = DIP_SPD_PC;
215
216	intel_set_infoframe(encoder, &spd_if);
217}
218
219static void intel_hdmi_mode_set(struct drm_encoder *encoder,
220				struct drm_display_mode *mode,
221				struct drm_display_mode *adjusted_mode)
222{
223	struct drm_device *dev = encoder->dev;
224	struct drm_i915_private *dev_priv = dev->dev_private;
225	struct drm_crtc *crtc = encoder->crtc;
226	struct intel_crtc *intel_crtc = to_intel_crtc(crtc);
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
227	struct intel_hdmi *intel_hdmi = enc_to_intel_hdmi(encoder);
228	u32 sdvox;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
229
230	sdvox = SDVO_ENCODING_HDMI | SDVO_BORDER_ENABLE;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
231	if (!HAS_PCH_SPLIT(dev))
232		sdvox |= intel_hdmi->color_range;
233	if (adjusted_mode->flags & DRM_MODE_FLAG_PVSYNC)
234		sdvox |= SDVO_VSYNC_ACTIVE_HIGH;
235	if (adjusted_mode->flags & DRM_MODE_FLAG_PHSYNC)
236		sdvox |= SDVO_HSYNC_ACTIVE_HIGH;
237
238	if (intel_crtc->bpp > 24)
239		sdvox |= COLOR_FORMAT_12bpc;
240	else
241		sdvox |= COLOR_FORMAT_8bpc;
242
243	/* Required on CPT */
244	if (intel_hdmi->has_hdmi_sink && HAS_PCH_CPT(dev))
245		sdvox |= HDMI_MODE_SELECT;
246
247	if (intel_hdmi->has_audio) {
248		sdvox |= SDVO_AUDIO_ENABLE;
249		sdvox |= SDVO_NULL_PACKETS_DURING_VSYNC;
 
 
 
250	}
251
252	if (intel_crtc->pipe == 1) {
253		if (HAS_PCH_CPT(dev))
254			sdvox |= PORT_TRANS_B_SEL_CPT;
255		else
256			sdvox |= SDVO_PIPE_B_SELECT;
257	}
258
259	I915_WRITE(intel_hdmi->sdvox_reg, sdvox);
260	POSTING_READ(intel_hdmi->sdvox_reg);
261
262	intel_hdmi_set_avi_infoframe(encoder);
263	intel_hdmi_set_spd_infoframe(encoder);
264}
265
266static void intel_hdmi_dpms(struct drm_encoder *encoder, int mode)
 
267{
268	struct drm_device *dev = encoder->dev;
269	struct drm_i915_private *dev_priv = dev->dev_private;
270	struct intel_hdmi *intel_hdmi = enc_to_intel_hdmi(encoder);
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
271	u32 temp;
 
272
273	temp = I915_READ(intel_hdmi->sdvox_reg);
 
 
 
 
 
 
 
 
274
275	/* HW workaround, need to toggle enable bit off and on for 12bpc, but
276	 * we do this anyway which shows more stable in testing.
277	 */
278	if (HAS_PCH_SPLIT(dev)) {
279		I915_WRITE(intel_hdmi->sdvox_reg, temp & ~SDVO_ENABLE);
280		POSTING_READ(intel_hdmi->sdvox_reg);
281	}
282
283	if (mode != DRM_MODE_DPMS_ON) {
284		temp &= ~SDVO_ENABLE;
285	} else {
286		temp |= SDVO_ENABLE;
 
 
 
 
 
 
 
287	}
 
288
289	I915_WRITE(intel_hdmi->sdvox_reg, temp);
290	POSTING_READ(intel_hdmi->sdvox_reg);
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
291
292	/* HW workaround, need to write this twice for issue that may result
293	 * in first write getting masked.
294	 */
295	if (HAS_PCH_SPLIT(dev)) {
296		I915_WRITE(intel_hdmi->sdvox_reg, temp);
297		POSTING_READ(intel_hdmi->sdvox_reg);
298	}
299}
300
301static int intel_hdmi_mode_valid(struct drm_connector *connector,
302				 struct drm_display_mode *mode)
303{
304	if (mode->clock > 165000)
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
305		return MODE_CLOCK_HIGH;
306	if (mode->clock < 20000)
307		return MODE_CLOCK_LOW;
308
309	if (mode->flags & DRM_MODE_FLAG_DBLSCAN)
310		return MODE_NO_DBLESCAN;
311
312	return MODE_OK;
313}
314
315static bool intel_hdmi_mode_fixup(struct drm_encoder *encoder,
316				  struct drm_display_mode *mode,
317				  struct drm_display_mode *adjusted_mode)
318{
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
319	return true;
320}
321
322static enum drm_connector_status
323intel_hdmi_detect(struct drm_connector *connector, bool force)
324{
 
325	struct intel_hdmi *intel_hdmi = intel_attached_hdmi(connector);
326	struct drm_i915_private *dev_priv = connector->dev->dev_private;
 
 
 
327	struct edid *edid;
 
328	enum drm_connector_status status = connector_status_disconnected;
329
 
 
 
 
 
 
330	intel_hdmi->has_hdmi_sink = false;
331	intel_hdmi->has_audio = false;
 
332	edid = drm_get_edid(connector,
333			    &dev_priv->gmbus[intel_hdmi->ddc_bus].adapter);
 
334
335	if (edid) {
336		if (edid->input & DRM_EDID_INPUT_DIGITAL) {
337			status = connector_status_connected;
338			intel_hdmi->has_hdmi_sink = drm_detect_hdmi_monitor(edid);
 
 
339			intel_hdmi->has_audio = drm_detect_monitor_audio(edid);
 
 
340		}
341		connector->display_info.raw_edid = NULL;
342		kfree(edid);
343	}
344
345	if (status == connector_status_connected) {
346		if (intel_hdmi->force_audio)
347			intel_hdmi->has_audio = intel_hdmi->force_audio > 0;
 
 
348	}
349
 
 
350	return status;
351}
352
353static int intel_hdmi_get_modes(struct drm_connector *connector)
354{
355	struct intel_hdmi *intel_hdmi = intel_attached_hdmi(connector);
 
356	struct drm_i915_private *dev_priv = connector->dev->dev_private;
 
 
357
358	/* We should parse the EDID data and find out if it's an HDMI sink so
359	 * we can send audio to it.
360	 */
361
362	return intel_ddc_get_modes(connector,
363				   &dev_priv->gmbus[intel_hdmi->ddc_bus].adapter);
 
 
 
 
 
 
 
 
364}
365
366static bool
367intel_hdmi_detect_audio(struct drm_connector *connector)
368{
369	struct intel_hdmi *intel_hdmi = intel_attached_hdmi(connector);
 
370	struct drm_i915_private *dev_priv = connector->dev->dev_private;
 
371	struct edid *edid;
372	bool has_audio = false;
373
 
 
 
374	edid = drm_get_edid(connector,
375			    &dev_priv->gmbus[intel_hdmi->ddc_bus].adapter);
 
376	if (edid) {
377		if (edid->input & DRM_EDID_INPUT_DIGITAL)
378			has_audio = drm_detect_monitor_audio(edid);
379
380		connector->display_info.raw_edid = NULL;
381		kfree(edid);
382	}
383
 
 
384	return has_audio;
385}
386
387static int
388intel_hdmi_set_property(struct drm_connector *connector,
389		      struct drm_property *property,
390		      uint64_t val)
391{
392	struct intel_hdmi *intel_hdmi = intel_attached_hdmi(connector);
 
 
393	struct drm_i915_private *dev_priv = connector->dev->dev_private;
394	int ret;
395
396	ret = drm_connector_property_set_value(connector, property, val);
397	if (ret)
398		return ret;
399
400	if (property == dev_priv->force_audio_property) {
401		int i = val;
402		bool has_audio;
403
404		if (i == intel_hdmi->force_audio)
405			return 0;
406
407		intel_hdmi->force_audio = i;
408
409		if (i == 0)
410			has_audio = intel_hdmi_detect_audio(connector);
411		else
412			has_audio = i > 0;
413
414		if (has_audio == intel_hdmi->has_audio)
415			return 0;
416
417		intel_hdmi->has_audio = has_audio;
418		goto done;
419	}
420
421	if (property == dev_priv->broadcast_rgb_property) {
422		if (val == !!intel_hdmi->color_range)
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
423			return 0;
424
425		intel_hdmi->color_range = val ? SDVO_COLOR_RANGE_16_235 : 0;
426		goto done;
427	}
428
429	return -EINVAL;
430
431done:
432	if (intel_hdmi->base.base.crtc) {
433		struct drm_crtc *crtc = intel_hdmi->base.base.crtc;
434		drm_crtc_helper_set_mode(crtc, &crtc->mode,
435					 crtc->x, crtc->y,
436					 crtc->fb);
437	}
438
439	return 0;
440}
441
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
442static void intel_hdmi_destroy(struct drm_connector *connector)
443{
444	drm_sysfs_connector_remove(connector);
445	drm_connector_cleanup(connector);
446	kfree(connector);
447}
448
449static const struct drm_encoder_helper_funcs intel_hdmi_helper_funcs = {
450	.dpms = intel_hdmi_dpms,
451	.mode_fixup = intel_hdmi_mode_fixup,
452	.prepare = intel_encoder_prepare,
453	.mode_set = intel_hdmi_mode_set,
454	.commit = intel_encoder_commit,
455};
456
457static const struct drm_connector_funcs intel_hdmi_connector_funcs = {
458	.dpms = drm_helper_connector_dpms,
459	.detect = intel_hdmi_detect,
460	.fill_modes = drm_helper_probe_single_connector_modes,
461	.set_property = intel_hdmi_set_property,
462	.destroy = intel_hdmi_destroy,
463};
464
465static const struct drm_connector_helper_funcs intel_hdmi_connector_helper_funcs = {
466	.get_modes = intel_hdmi_get_modes,
467	.mode_valid = intel_hdmi_mode_valid,
468	.best_encoder = intel_best_encoder,
469};
470
471static const struct drm_encoder_funcs intel_hdmi_enc_funcs = {
472	.destroy = intel_encoder_destroy,
473};
474
475static void
476intel_hdmi_add_properties(struct intel_hdmi *intel_hdmi, struct drm_connector *connector)
477{
478	intel_attach_force_audio_property(connector);
479	intel_attach_broadcast_rgb_property(connector);
 
480}
481
482void intel_hdmi_init(struct drm_device *dev, int sdvox_reg)
 
483{
 
 
 
 
484	struct drm_i915_private *dev_priv = dev->dev_private;
485	struct drm_connector *connector;
486	struct intel_encoder *intel_encoder;
487	struct intel_connector *intel_connector;
488	struct intel_hdmi *intel_hdmi;
489
490	intel_hdmi = kzalloc(sizeof(struct intel_hdmi), GFP_KERNEL);
491	if (!intel_hdmi)
492		return;
493
494	intel_connector = kzalloc(sizeof(struct intel_connector), GFP_KERNEL);
495	if (!intel_connector) {
496		kfree(intel_hdmi);
497		return;
498	}
499
500	intel_encoder = &intel_hdmi->base;
501	drm_encoder_init(dev, &intel_encoder->base, &intel_hdmi_enc_funcs,
502			 DRM_MODE_ENCODER_TMDS);
503
504	connector = &intel_connector->base;
505	drm_connector_init(dev, connector, &intel_hdmi_connector_funcs,
506			   DRM_MODE_CONNECTOR_HDMIA);
507	drm_connector_helper_add(connector, &intel_hdmi_connector_helper_funcs);
508
509	intel_encoder->type = INTEL_OUTPUT_HDMI;
510
511	connector->polled = DRM_CONNECTOR_POLL_HPD;
512	connector->interlace_allowed = 0;
513	connector->doublescan_allowed = 0;
514	intel_encoder->crtc_mask = (1 << 0) | (1 << 1);
515
516	/* Set up the DDC bus. */
517	if (sdvox_reg == SDVOB) {
518		intel_encoder->clone_mask = (1 << INTEL_HDMIB_CLONE_BIT);
519		intel_hdmi->ddc_bus = GMBUS_PORT_DPB;
520		dev_priv->hotplug_supported_mask |= HDMIB_HOTPLUG_INT_STATUS;
521	} else if (sdvox_reg == SDVOC) {
522		intel_encoder->clone_mask = (1 << INTEL_HDMIC_CLONE_BIT);
523		intel_hdmi->ddc_bus = GMBUS_PORT_DPC;
524		dev_priv->hotplug_supported_mask |= HDMIC_HOTPLUG_INT_STATUS;
525	} else if (sdvox_reg == HDMIB) {
526		intel_encoder->clone_mask = (1 << INTEL_HDMID_CLONE_BIT);
527		intel_hdmi->ddc_bus = GMBUS_PORT_DPB;
528		dev_priv->hotplug_supported_mask |= HDMIB_HOTPLUG_INT_STATUS;
529	} else if (sdvox_reg == HDMIC) {
530		intel_encoder->clone_mask = (1 << INTEL_HDMIE_CLONE_BIT);
531		intel_hdmi->ddc_bus = GMBUS_PORT_DPC;
532		dev_priv->hotplug_supported_mask |= HDMIC_HOTPLUG_INT_STATUS;
533	} else if (sdvox_reg == HDMID) {
534		intel_encoder->clone_mask = (1 << INTEL_HDMIF_CLONE_BIT);
535		intel_hdmi->ddc_bus = GMBUS_PORT_DPD;
536		dev_priv->hotplug_supported_mask |= HDMID_HOTPLUG_INT_STATUS;
 
 
 
 
 
 
537	}
538
539	intel_hdmi->sdvox_reg = sdvox_reg;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
540
541	if (!HAS_PCH_SPLIT(dev))
542		intel_hdmi->write_infoframe = i9xx_write_infoframe;
543	else
544		intel_hdmi->write_infoframe = ironlake_write_infoframe;
545
546	drm_encoder_helper_add(&intel_encoder->base, &intel_hdmi_helper_funcs);
547
548	intel_hdmi_add_properties(intel_hdmi, connector);
549
550	intel_connector_attach_encoder(intel_connector, intel_encoder);
551	drm_sysfs_connector_add(connector);
552
553	/* For G4X desktop chip, PEG_BAND_GAP_DATA 3:0 must first be written
554	 * 0xd.  Failure to do so will result in spurious interrupts being
555	 * generated on the port when a cable is not attached.
556	 */
557	if (IS_G4X(dev) && !IS_GM45(dev)) {
558		u32 temp = I915_READ(PEG_BAND_GAP_DATA);
559		I915_WRITE(PEG_BAND_GAP_DATA, (temp & ~0xf) | 0xd);
560	}
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
561}
v3.15
   1/*
   2 * Copyright 2006 Dave Airlie <airlied@linux.ie>
   3 * Copyright © 2006-2009 Intel Corporation
   4 *
   5 * Permission is hereby granted, free of charge, to any person obtaining a
   6 * copy of this software and associated documentation files (the "Software"),
   7 * to deal in the Software without restriction, including without limitation
   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
  10 * Software is furnished to do so, subject to the following conditions:
  11 *
  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
  14 * Software.
  15 *
  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,
  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
  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
  22 * DEALINGS IN THE SOFTWARE.
  23 *
  24 * Authors:
  25 *	Eric Anholt <eric@anholt.net>
  26 *	Jesse Barnes <jesse.barnes@intel.com>
  27 */
  28
  29#include <linux/i2c.h>
  30#include <linux/slab.h>
  31#include <linux/delay.h>
  32#include <linux/hdmi.h>
  33#include <drm/drmP.h>
  34#include <drm/drm_crtc.h>
  35#include <drm/drm_edid.h>
  36#include "intel_drv.h"
  37#include <drm/i915_drm.h>
  38#include "i915_drv.h"
  39
  40static struct drm_device *intel_hdmi_to_dev(struct intel_hdmi *intel_hdmi)
  41{
  42	return hdmi_to_dig_port(intel_hdmi)->base.base.dev;
  43}
 
 
 
 
 
 
 
  44
  45static void
  46assert_hdmi_port_disabled(struct intel_hdmi *intel_hdmi)
  47{
  48	struct drm_device *dev = intel_hdmi_to_dev(intel_hdmi);
  49	struct drm_i915_private *dev_priv = dev->dev_private;
  50	uint32_t enabled_bits;
  51
  52	enabled_bits = HAS_DDI(dev) ? DDI_BUF_CTL_ENABLE : SDVO_ENABLE;
  53
  54	WARN(I915_READ(intel_hdmi->hdmi_reg) & enabled_bits,
  55	     "HDMI port enabled, expecting disabled\n");
  56}
  57
  58struct intel_hdmi *enc_to_intel_hdmi(struct drm_encoder *encoder)
  59{
  60	struct intel_digital_port *intel_dig_port =
  61		container_of(encoder, struct intel_digital_port, base.base);
  62	return &intel_dig_port->hdmi;
  63}
  64
  65static struct intel_hdmi *intel_attached_hdmi(struct drm_connector *connector)
  66{
  67	return enc_to_intel_hdmi(&intel_attached_encoder(connector)->base);
 
  68}
  69
  70static u32 g4x_infoframe_index(enum hdmi_infoframe_type type)
  71{
  72	switch (type) {
  73	case HDMI_INFOFRAME_TYPE_AVI:
  74		return VIDEO_DIP_SELECT_AVI;
  75	case HDMI_INFOFRAME_TYPE_SPD:
  76		return VIDEO_DIP_SELECT_SPD;
  77	case HDMI_INFOFRAME_TYPE_VENDOR:
  78		return VIDEO_DIP_SELECT_VENDOR;
  79	default:
  80		DRM_DEBUG_DRIVER("unknown info frame type %d\n", type);
  81		return 0;
  82	}
  83}
  84
  85static u32 g4x_infoframe_enable(enum hdmi_infoframe_type type)
  86{
  87	switch (type) {
  88	case HDMI_INFOFRAME_TYPE_AVI:
  89		return VIDEO_DIP_ENABLE_AVI;
  90	case HDMI_INFOFRAME_TYPE_SPD:
  91		return VIDEO_DIP_ENABLE_SPD;
  92	case HDMI_INFOFRAME_TYPE_VENDOR:
  93		return VIDEO_DIP_ENABLE_VENDOR;
  94	default:
  95		DRM_DEBUG_DRIVER("unknown info frame type %d\n", type);
  96		return 0;
  97	}
  98}
  99
 100static u32 hsw_infoframe_enable(enum hdmi_infoframe_type type)
 101{
 102	switch (type) {
 103	case HDMI_INFOFRAME_TYPE_AVI:
 104		return VIDEO_DIP_ENABLE_AVI_HSW;
 105	case HDMI_INFOFRAME_TYPE_SPD:
 106		return VIDEO_DIP_ENABLE_SPD_HSW;
 107	case HDMI_INFOFRAME_TYPE_VENDOR:
 108		return VIDEO_DIP_ENABLE_VS_HSW;
 109	default:
 110		DRM_DEBUG_DRIVER("unknown info frame type %d\n", type);
 111		return 0;
 112	}
 113}
 114
 115static u32 hsw_infoframe_data_reg(enum hdmi_infoframe_type type,
 116				  enum transcoder cpu_transcoder,
 117				  struct drm_i915_private *dev_priv)
 118{
 119	switch (type) {
 120	case HDMI_INFOFRAME_TYPE_AVI:
 121		return HSW_TVIDEO_DIP_AVI_DATA(cpu_transcoder);
 122	case HDMI_INFOFRAME_TYPE_SPD:
 123		return HSW_TVIDEO_DIP_SPD_DATA(cpu_transcoder);
 124	case HDMI_INFOFRAME_TYPE_VENDOR:
 125		return HSW_TVIDEO_DIP_VS_DATA(cpu_transcoder);
 126	default:
 127		DRM_DEBUG_DRIVER("unknown info frame type %d\n", type);
 128		return 0;
 129	}
 130}
 131
 132static void g4x_write_infoframe(struct drm_encoder *encoder,
 133				enum hdmi_infoframe_type type,
 134				const void *frame, ssize_t len)
 135{
 136	const uint32_t *data = frame;
 137	struct drm_device *dev = encoder->dev;
 138	struct drm_i915_private *dev_priv = dev->dev_private;
 139	u32 val = I915_READ(VIDEO_DIP_CTL);
 140	int i;
 141
 142	WARN(!(val & VIDEO_DIP_ENABLE), "Writing DIP with CTL reg disabled\n");
 143
 144	val &= ~(VIDEO_DIP_SELECT_MASK | 0xf); /* clear DIP data offset */
 145	val |= g4x_infoframe_index(type);
 146
 147	val &= ~g4x_infoframe_enable(type);
 148
 149	I915_WRITE(VIDEO_DIP_CTL, val);
 150
 151	mmiowb();
 152	for (i = 0; i < len; i += 4) {
 153		I915_WRITE(VIDEO_DIP_DATA, *data);
 154		data++;
 155	}
 156	/* Write every possible data byte to force correct ECC calculation. */
 157	for (; i < VIDEO_DIP_DATA_SIZE; i += 4)
 158		I915_WRITE(VIDEO_DIP_DATA, 0);
 159	mmiowb();
 160
 161	val |= g4x_infoframe_enable(type);
 162	val &= ~VIDEO_DIP_FREQ_MASK;
 163	val |= VIDEO_DIP_FREQ_VSYNC;
 164
 165	I915_WRITE(VIDEO_DIP_CTL, val);
 166	POSTING_READ(VIDEO_DIP_CTL);
 167}
 168
 169static void ibx_write_infoframe(struct drm_encoder *encoder,
 170				enum hdmi_infoframe_type type,
 171				const void *frame, ssize_t len)
 172{
 173	const uint32_t *data = frame;
 174	struct drm_device *dev = encoder->dev;
 175	struct drm_i915_private *dev_priv = dev->dev_private;
 176	struct intel_crtc *intel_crtc = to_intel_crtc(encoder->crtc);
 177	int i, reg = TVIDEO_DIP_CTL(intel_crtc->pipe);
 178	u32 val = I915_READ(reg);
 179
 180	WARN(!(val & VIDEO_DIP_ENABLE), "Writing DIP with CTL reg disabled\n");
 181
 182	val &= ~(VIDEO_DIP_SELECT_MASK | 0xf); /* clear DIP data offset */
 183	val |= g4x_infoframe_index(type);
 184
 185	val &= ~g4x_infoframe_enable(type);
 186
 187	I915_WRITE(reg, val);
 188
 189	mmiowb();
 190	for (i = 0; i < len; i += 4) {
 191		I915_WRITE(TVIDEO_DIP_DATA(intel_crtc->pipe), *data);
 192		data++;
 193	}
 194	/* Write every possible data byte to force correct ECC calculation. */
 195	for (; i < VIDEO_DIP_DATA_SIZE; i += 4)
 196		I915_WRITE(TVIDEO_DIP_DATA(intel_crtc->pipe), 0);
 197	mmiowb();
 198
 199	val |= g4x_infoframe_enable(type);
 200	val &= ~VIDEO_DIP_FREQ_MASK;
 201	val |= VIDEO_DIP_FREQ_VSYNC;
 202
 203	I915_WRITE(reg, val);
 204	POSTING_READ(reg);
 205}
 206
 207static void cpt_write_infoframe(struct drm_encoder *encoder,
 208				enum hdmi_infoframe_type type,
 209				const void *frame, ssize_t len)
 210{
 211	const uint32_t *data = frame;
 212	struct drm_device *dev = encoder->dev;
 213	struct drm_i915_private *dev_priv = dev->dev_private;
 214	struct intel_crtc *intel_crtc = to_intel_crtc(encoder->crtc);
 215	int i, reg = TVIDEO_DIP_CTL(intel_crtc->pipe);
 216	u32 val = I915_READ(reg);
 
 217
 218	WARN(!(val & VIDEO_DIP_ENABLE), "Writing DIP with CTL reg disabled\n");
 
 
 
 
 
 
 219
 220	val &= ~(VIDEO_DIP_SELECT_MASK | 0xf); /* clear DIP data offset */
 221	val |= g4x_infoframe_index(type);
 222
 223	/* The DIP control register spec says that we need to update the AVI
 224	 * infoframe without clearing its enable bit */
 225	if (type != HDMI_INFOFRAME_TYPE_AVI)
 226		val &= ~g4x_infoframe_enable(type);
 227
 228	I915_WRITE(reg, val);
 229
 230	mmiowb();
 231	for (i = 0; i < len; i += 4) {
 232		I915_WRITE(TVIDEO_DIP_DATA(intel_crtc->pipe), *data);
 233		data++;
 234	}
 235	/* Write every possible data byte to force correct ECC calculation. */
 236	for (; i < VIDEO_DIP_DATA_SIZE; i += 4)
 237		I915_WRITE(TVIDEO_DIP_DATA(intel_crtc->pipe), 0);
 238	mmiowb();
 239
 240	val |= g4x_infoframe_enable(type);
 241	val &= ~VIDEO_DIP_FREQ_MASK;
 242	val |= VIDEO_DIP_FREQ_VSYNC;
 243
 244	I915_WRITE(reg, val);
 245	POSTING_READ(reg);
 
 246}
 247
 248static void vlv_write_infoframe(struct drm_encoder *encoder,
 249				enum hdmi_infoframe_type type,
 250				const void *frame, ssize_t len)
 251{
 252	const uint32_t *data = frame;
 253	struct drm_device *dev = encoder->dev;
 254	struct drm_i915_private *dev_priv = dev->dev_private;
 255	struct intel_crtc *intel_crtc = to_intel_crtc(encoder->crtc);
 256	int i, reg = VLV_TVIDEO_DIP_CTL(intel_crtc->pipe);
 257	u32 val = I915_READ(reg);
 
 
 258
 259	WARN(!(val & VIDEO_DIP_ENABLE), "Writing DIP with CTL reg disabled\n");
 260
 261	val &= ~(VIDEO_DIP_SELECT_MASK | 0xf); /* clear DIP data offset */
 262	val |= g4x_infoframe_index(type);
 263
 264	val &= ~g4x_infoframe_enable(type);
 265
 266	I915_WRITE(reg, val);
 267
 268	mmiowb();
 269	for (i = 0; i < len; i += 4) {
 270		I915_WRITE(VLV_TVIDEO_DIP_DATA(intel_crtc->pipe), *data);
 271		data++;
 272	}
 273	/* Write every possible data byte to force correct ECC calculation. */
 274	for (; i < VIDEO_DIP_DATA_SIZE; i += 4)
 275		I915_WRITE(VLV_TVIDEO_DIP_DATA(intel_crtc->pipe), 0);
 276	mmiowb();
 277
 278	val |= g4x_infoframe_enable(type);
 279	val &= ~VIDEO_DIP_FREQ_MASK;
 280	val |= VIDEO_DIP_FREQ_VSYNC;
 281
 282	I915_WRITE(reg, val);
 283	POSTING_READ(reg);
 284}
 285
 286static void hsw_write_infoframe(struct drm_encoder *encoder,
 287				enum hdmi_infoframe_type type,
 288				const void *frame, ssize_t len)
 289{
 290	const uint32_t *data = frame;
 291	struct drm_device *dev = encoder->dev;
 292	struct drm_i915_private *dev_priv = dev->dev_private;
 293	struct intel_crtc *intel_crtc = to_intel_crtc(encoder->crtc);
 294	u32 ctl_reg = HSW_TVIDEO_DIP_CTL(intel_crtc->config.cpu_transcoder);
 295	u32 data_reg;
 296	int i;
 297	u32 val = I915_READ(ctl_reg);
 298
 299	data_reg = hsw_infoframe_data_reg(type,
 300					  intel_crtc->config.cpu_transcoder,
 301					  dev_priv);
 302	if (data_reg == 0)
 303		return;
 304
 305	val &= ~hsw_infoframe_enable(type);
 306	I915_WRITE(ctl_reg, val);
 307
 308	mmiowb();
 309	for (i = 0; i < len; i += 4) {
 310		I915_WRITE(data_reg + i, *data);
 311		data++;
 312	}
 313	/* Write every possible data byte to force correct ECC calculation. */
 314	for (; i < VIDEO_DIP_DATA_SIZE; i += 4)
 315		I915_WRITE(data_reg + i, 0);
 316	mmiowb();
 317
 318	val |= hsw_infoframe_enable(type);
 319	I915_WRITE(ctl_reg, val);
 320	POSTING_READ(ctl_reg);
 321}
 322
 323/*
 324 * The data we write to the DIP data buffer registers is 1 byte bigger than the
 325 * HDMI infoframe size because of an ECC/reserved byte at position 3 (starting
 326 * at 0). It's also a byte used by DisplayPort so the same DIP registers can be
 327 * used for both technologies.
 328 *
 329 * DW0: Reserved/ECC/DP | HB2 | HB1 | HB0
 330 * DW1:       DB3       | DB2 | DB1 | DB0
 331 * DW2:       DB7       | DB6 | DB5 | DB4
 332 * DW3: ...
 333 *
 334 * (HB is Header Byte, DB is Data Byte)
 335 *
 336 * The hdmi pack() functions don't know about that hardware specific hole so we
 337 * trick them by giving an offset into the buffer and moving back the header
 338 * bytes by one.
 339 */
 340static void intel_write_infoframe(struct drm_encoder *encoder,
 341				  union hdmi_infoframe *frame)
 342{
 343	struct intel_hdmi *intel_hdmi = enc_to_intel_hdmi(encoder);
 344	uint8_t buffer[VIDEO_DIP_DATA_SIZE];
 345	ssize_t len;
 346
 347	/* see comment above for the reason for this offset */
 348	len = hdmi_infoframe_pack(frame, buffer + 1, sizeof(buffer) - 1);
 349	if (len < 0)
 350		return;
 351
 352	/* Insert the 'hole' (see big comment above) at position 3 */
 353	buffer[0] = buffer[1];
 354	buffer[1] = buffer[2];
 355	buffer[2] = buffer[3];
 356	buffer[3] = 0;
 357	len++;
 358
 359	intel_hdmi->write_infoframe(encoder, frame->any.type, buffer, len);
 360}
 361
 362static void intel_hdmi_set_avi_infoframe(struct drm_encoder *encoder,
 363					 struct drm_display_mode *adjusted_mode)
 364{
 365	struct intel_hdmi *intel_hdmi = enc_to_intel_hdmi(encoder);
 366	struct intel_crtc *intel_crtc = to_intel_crtc(encoder->crtc);
 367	union hdmi_infoframe frame;
 368	int ret;
 369
 370	ret = drm_hdmi_avi_infoframe_from_display_mode(&frame.avi,
 371						       adjusted_mode);
 372	if (ret < 0) {
 373		DRM_ERROR("couldn't fill AVI infoframe\n");
 374		return;
 375	}
 376
 377	if (intel_hdmi->rgb_quant_range_selectable) {
 378		if (intel_crtc->config.limited_color_range)
 379			frame.avi.quantization_range =
 380				HDMI_QUANTIZATION_RANGE_LIMITED;
 381		else
 382			frame.avi.quantization_range =
 383				HDMI_QUANTIZATION_RANGE_FULL;
 384	}
 385
 386	intel_write_infoframe(encoder, &frame);
 387}
 388
 389static void intel_hdmi_set_spd_infoframe(struct drm_encoder *encoder)
 390{
 391	union hdmi_infoframe frame;
 392	int ret;
 393
 394	ret = hdmi_spd_infoframe_init(&frame.spd, "Intel", "Integrated gfx");
 395	if (ret < 0) {
 396		DRM_ERROR("couldn't fill SPD infoframe\n");
 397		return;
 398	}
 399
 400	frame.spd.sdi = HDMI_SPD_SDI_PC;
 401
 402	intel_write_infoframe(encoder, &frame);
 403}
 404
 405static void
 406intel_hdmi_set_hdmi_infoframe(struct drm_encoder *encoder,
 407			      struct drm_display_mode *adjusted_mode)
 408{
 409	union hdmi_infoframe frame;
 410	int ret;
 411
 412	ret = drm_hdmi_vendor_infoframe_from_display_mode(&frame.vendor.hdmi,
 413							  adjusted_mode);
 414	if (ret < 0)
 415		return;
 416
 417	intel_write_infoframe(encoder, &frame);
 418}
 419
 420static void g4x_set_infoframes(struct drm_encoder *encoder,
 421			       struct drm_display_mode *adjusted_mode)
 422{
 423	struct drm_i915_private *dev_priv = encoder->dev->dev_private;
 424	struct intel_digital_port *intel_dig_port = enc_to_dig_port(encoder);
 425	struct intel_hdmi *intel_hdmi = &intel_dig_port->hdmi;
 426	u32 reg = VIDEO_DIP_CTL;
 427	u32 val = I915_READ(reg);
 428	u32 port = VIDEO_DIP_PORT(intel_dig_port->port);
 429
 430	assert_hdmi_port_disabled(intel_hdmi);
 431
 432	/* If the registers were not initialized yet, they might be zeroes,
 433	 * which means we're selecting the AVI DIP and we're setting its
 434	 * frequency to once. This seems to really confuse the HW and make
 435	 * things stop working (the register spec says the AVI always needs to
 436	 * be sent every VSync). So here we avoid writing to the register more
 437	 * than we need and also explicitly select the AVI DIP and explicitly
 438	 * set its frequency to every VSync. Avoiding to write it twice seems to
 439	 * be enough to solve the problem, but being defensive shouldn't hurt us
 440	 * either. */
 441	val |= VIDEO_DIP_SELECT_AVI | VIDEO_DIP_FREQ_VSYNC;
 442
 443	if (!intel_hdmi->has_hdmi_sink) {
 444		if (!(val & VIDEO_DIP_ENABLE))
 445			return;
 446		val &= ~VIDEO_DIP_ENABLE;
 447		I915_WRITE(reg, val);
 448		POSTING_READ(reg);
 449		return;
 450	}
 451
 452	if (port != (val & VIDEO_DIP_PORT_MASK)) {
 453		if (val & VIDEO_DIP_ENABLE) {
 454			val &= ~VIDEO_DIP_ENABLE;
 455			I915_WRITE(reg, val);
 456			POSTING_READ(reg);
 457		}
 458		val &= ~VIDEO_DIP_PORT_MASK;
 459		val |= port;
 460	}
 461
 462	val |= VIDEO_DIP_ENABLE;
 463	val &= ~VIDEO_DIP_ENABLE_VENDOR;
 464
 465	I915_WRITE(reg, val);
 466	POSTING_READ(reg);
 467
 468	intel_hdmi_set_avi_infoframe(encoder, adjusted_mode);
 469	intel_hdmi_set_spd_infoframe(encoder);
 470	intel_hdmi_set_hdmi_infoframe(encoder, adjusted_mode);
 471}
 472
 473static void ibx_set_infoframes(struct drm_encoder *encoder,
 474			       struct drm_display_mode *adjusted_mode)
 475{
 476	struct drm_i915_private *dev_priv = encoder->dev->dev_private;
 477	struct intel_crtc *intel_crtc = to_intel_crtc(encoder->crtc);
 478	struct intel_digital_port *intel_dig_port = enc_to_dig_port(encoder);
 479	struct intel_hdmi *intel_hdmi = &intel_dig_port->hdmi;
 480	u32 reg = TVIDEO_DIP_CTL(intel_crtc->pipe);
 481	u32 val = I915_READ(reg);
 482	u32 port = VIDEO_DIP_PORT(intel_dig_port->port);
 483
 484	assert_hdmi_port_disabled(intel_hdmi);
 485
 486	/* See the big comment in g4x_set_infoframes() */
 487	val |= VIDEO_DIP_SELECT_AVI | VIDEO_DIP_FREQ_VSYNC;
 488
 489	if (!intel_hdmi->has_hdmi_sink) {
 490		if (!(val & VIDEO_DIP_ENABLE))
 491			return;
 492		val &= ~VIDEO_DIP_ENABLE;
 493		I915_WRITE(reg, val);
 494		POSTING_READ(reg);
 495		return;
 496	}
 497
 498	if (port != (val & VIDEO_DIP_PORT_MASK)) {
 499		if (val & VIDEO_DIP_ENABLE) {
 500			val &= ~VIDEO_DIP_ENABLE;
 501			I915_WRITE(reg, val);
 502			POSTING_READ(reg);
 503		}
 504		val &= ~VIDEO_DIP_PORT_MASK;
 505		val |= port;
 506	}
 507
 508	val |= VIDEO_DIP_ENABLE;
 509	val &= ~(VIDEO_DIP_ENABLE_VENDOR | VIDEO_DIP_ENABLE_GAMUT |
 510		 VIDEO_DIP_ENABLE_GCP);
 511
 512	I915_WRITE(reg, val);
 513	POSTING_READ(reg);
 514
 515	intel_hdmi_set_avi_infoframe(encoder, adjusted_mode);
 516	intel_hdmi_set_spd_infoframe(encoder);
 517	intel_hdmi_set_hdmi_infoframe(encoder, adjusted_mode);
 518}
 519
 520static void cpt_set_infoframes(struct drm_encoder *encoder,
 521			       struct drm_display_mode *adjusted_mode)
 522{
 523	struct drm_i915_private *dev_priv = encoder->dev->dev_private;
 524	struct intel_crtc *intel_crtc = to_intel_crtc(encoder->crtc);
 525	struct intel_hdmi *intel_hdmi = enc_to_intel_hdmi(encoder);
 526	u32 reg = TVIDEO_DIP_CTL(intel_crtc->pipe);
 527	u32 val = I915_READ(reg);
 528
 529	assert_hdmi_port_disabled(intel_hdmi);
 530
 531	/* See the big comment in g4x_set_infoframes() */
 532	val |= VIDEO_DIP_SELECT_AVI | VIDEO_DIP_FREQ_VSYNC;
 533
 534	if (!intel_hdmi->has_hdmi_sink) {
 535		if (!(val & VIDEO_DIP_ENABLE))
 536			return;
 537		val &= ~(VIDEO_DIP_ENABLE | VIDEO_DIP_ENABLE_AVI);
 538		I915_WRITE(reg, val);
 539		POSTING_READ(reg);
 540		return;
 541	}
 542
 543	/* Set both together, unset both together: see the spec. */
 544	val |= VIDEO_DIP_ENABLE | VIDEO_DIP_ENABLE_AVI;
 545	val &= ~(VIDEO_DIP_ENABLE_VENDOR | VIDEO_DIP_ENABLE_GAMUT |
 546		 VIDEO_DIP_ENABLE_GCP);
 547
 548	I915_WRITE(reg, val);
 549	POSTING_READ(reg);
 550
 551	intel_hdmi_set_avi_infoframe(encoder, adjusted_mode);
 552	intel_hdmi_set_spd_infoframe(encoder);
 553	intel_hdmi_set_hdmi_infoframe(encoder, adjusted_mode);
 554}
 555
 556static void vlv_set_infoframes(struct drm_encoder *encoder,
 557			       struct drm_display_mode *adjusted_mode)
 558{
 559	struct drm_i915_private *dev_priv = encoder->dev->dev_private;
 560	struct intel_crtc *intel_crtc = to_intel_crtc(encoder->crtc);
 561	struct intel_hdmi *intel_hdmi = enc_to_intel_hdmi(encoder);
 562	u32 reg = VLV_TVIDEO_DIP_CTL(intel_crtc->pipe);
 563	u32 val = I915_READ(reg);
 564
 565	assert_hdmi_port_disabled(intel_hdmi);
 566
 567	/* See the big comment in g4x_set_infoframes() */
 568	val |= VIDEO_DIP_SELECT_AVI | VIDEO_DIP_FREQ_VSYNC;
 569
 570	if (!intel_hdmi->has_hdmi_sink) {
 571		if (!(val & VIDEO_DIP_ENABLE))
 572			return;
 573		val &= ~VIDEO_DIP_ENABLE;
 574		I915_WRITE(reg, val);
 575		POSTING_READ(reg);
 576		return;
 577	}
 578
 579	val |= VIDEO_DIP_ENABLE;
 580	val &= ~(VIDEO_DIP_ENABLE_VENDOR | VIDEO_DIP_ENABLE_GAMUT |
 581		 VIDEO_DIP_ENABLE_GCP);
 582
 583	I915_WRITE(reg, val);
 584	POSTING_READ(reg);
 585
 586	intel_hdmi_set_avi_infoframe(encoder, adjusted_mode);
 587	intel_hdmi_set_spd_infoframe(encoder);
 588	intel_hdmi_set_hdmi_infoframe(encoder, adjusted_mode);
 589}
 590
 591static void hsw_set_infoframes(struct drm_encoder *encoder,
 592			       struct drm_display_mode *adjusted_mode)
 593{
 594	struct drm_i915_private *dev_priv = encoder->dev->dev_private;
 595	struct intel_crtc *intel_crtc = to_intel_crtc(encoder->crtc);
 596	struct intel_hdmi *intel_hdmi = enc_to_intel_hdmi(encoder);
 597	u32 reg = HSW_TVIDEO_DIP_CTL(intel_crtc->config.cpu_transcoder);
 598	u32 val = I915_READ(reg);
 599
 600	assert_hdmi_port_disabled(intel_hdmi);
 601
 602	if (!intel_hdmi->has_hdmi_sink) {
 603		I915_WRITE(reg, 0);
 604		POSTING_READ(reg);
 605		return;
 606	}
 607
 608	val &= ~(VIDEO_DIP_ENABLE_VSC_HSW | VIDEO_DIP_ENABLE_GCP_HSW |
 609		 VIDEO_DIP_ENABLE_VS_HSW | VIDEO_DIP_ENABLE_GMP_HSW);
 610
 611	I915_WRITE(reg, val);
 612	POSTING_READ(reg);
 613
 614	intel_hdmi_set_avi_infoframe(encoder, adjusted_mode);
 615	intel_hdmi_set_spd_infoframe(encoder);
 616	intel_hdmi_set_hdmi_infoframe(encoder, adjusted_mode);
 617}
 618
 619static void intel_hdmi_mode_set(struct intel_encoder *encoder)
 620{
 621	struct drm_device *dev = encoder->base.dev;
 622	struct drm_i915_private *dev_priv = dev->dev_private;
 623	struct intel_crtc *crtc = to_intel_crtc(encoder->base.crtc);
 624	struct intel_hdmi *intel_hdmi = enc_to_intel_hdmi(&encoder->base);
 625	struct drm_display_mode *adjusted_mode = &crtc->config.adjusted_mode;
 626	u32 hdmi_val;
 627
 628	hdmi_val = SDVO_ENCODING_HDMI;
 629	if (!HAS_PCH_SPLIT(dev))
 630		hdmi_val |= intel_hdmi->color_range;
 631	if (adjusted_mode->flags & DRM_MODE_FLAG_PVSYNC)
 632		hdmi_val |= SDVO_VSYNC_ACTIVE_HIGH;
 633	if (adjusted_mode->flags & DRM_MODE_FLAG_PHSYNC)
 634		hdmi_val |= SDVO_HSYNC_ACTIVE_HIGH;
 635
 636	if (crtc->config.pipe_bpp > 24)
 637		hdmi_val |= HDMI_COLOR_FORMAT_12bpc;
 638	else
 639		hdmi_val |= SDVO_COLOR_FORMAT_8bpc;
 640
 641	/* Required on CPT */
 642	if (intel_hdmi->has_hdmi_sink && HAS_PCH_CPT(dev))
 643		hdmi_val |= HDMI_MODE_SELECT_HDMI;
 644
 645	if (intel_hdmi->has_audio) {
 646		DRM_DEBUG_DRIVER("Enabling HDMI audio on pipe %c\n",
 647				 pipe_name(crtc->pipe));
 648		hdmi_val |= SDVO_AUDIO_ENABLE;
 649		hdmi_val |= HDMI_MODE_SELECT_HDMI;
 650		intel_write_eld(&encoder->base, adjusted_mode);
 651	}
 652
 653	if (HAS_PCH_CPT(dev))
 654		hdmi_val |= SDVO_PIPE_SEL_CPT(crtc->pipe);
 655	else
 656		hdmi_val |= SDVO_PIPE_SEL(crtc->pipe);
 
 
 657
 658	I915_WRITE(intel_hdmi->hdmi_reg, hdmi_val);
 659	POSTING_READ(intel_hdmi->hdmi_reg);
 660
 661	intel_hdmi->set_infoframes(&encoder->base, adjusted_mode);
 
 662}
 663
 664static bool intel_hdmi_get_hw_state(struct intel_encoder *encoder,
 665				    enum pipe *pipe)
 666{
 667	struct drm_device *dev = encoder->base.dev;
 668	struct drm_i915_private *dev_priv = dev->dev_private;
 669	struct intel_hdmi *intel_hdmi = enc_to_intel_hdmi(&encoder->base);
 670	enum intel_display_power_domain power_domain;
 671	u32 tmp;
 672
 673	power_domain = intel_display_port_power_domain(encoder);
 674	if (!intel_display_power_enabled(dev_priv, power_domain))
 675		return false;
 676
 677	tmp = I915_READ(intel_hdmi->hdmi_reg);
 678
 679	if (!(tmp & SDVO_ENABLE))
 680		return false;
 681
 682	if (HAS_PCH_CPT(dev))
 683		*pipe = PORT_TO_PIPE_CPT(tmp);
 684	else
 685		*pipe = PORT_TO_PIPE(tmp);
 686
 687	return true;
 688}
 689
 690static void intel_hdmi_get_config(struct intel_encoder *encoder,
 691				  struct intel_crtc_config *pipe_config)
 692{
 693	struct intel_hdmi *intel_hdmi = enc_to_intel_hdmi(&encoder->base);
 694	struct drm_i915_private *dev_priv = encoder->base.dev->dev_private;
 695	u32 tmp, flags = 0;
 696	int dotclock;
 697
 698	tmp = I915_READ(intel_hdmi->hdmi_reg);
 699
 700	if (tmp & SDVO_HSYNC_ACTIVE_HIGH)
 701		flags |= DRM_MODE_FLAG_PHSYNC;
 702	else
 703		flags |= DRM_MODE_FLAG_NHSYNC;
 704
 705	if (tmp & SDVO_VSYNC_ACTIVE_HIGH)
 706		flags |= DRM_MODE_FLAG_PVSYNC;
 707	else
 708		flags |= DRM_MODE_FLAG_NVSYNC;
 709
 710	pipe_config->adjusted_mode.flags |= flags;
 711
 712	if ((tmp & SDVO_COLOR_FORMAT_MASK) == HDMI_COLOR_FORMAT_12bpc)
 713		dotclock = pipe_config->port_clock * 2 / 3;
 714	else
 715		dotclock = pipe_config->port_clock;
 716
 717	if (HAS_PCH_SPLIT(dev_priv->dev))
 718		ironlake_check_encoder_dotclock(pipe_config, dotclock);
 719
 720	pipe_config->adjusted_mode.crtc_clock = dotclock;
 721}
 722
 723static void intel_enable_hdmi(struct intel_encoder *encoder)
 724{
 725	struct drm_device *dev = encoder->base.dev;
 726	struct drm_i915_private *dev_priv = dev->dev_private;
 727	struct intel_crtc *intel_crtc = to_intel_crtc(encoder->base.crtc);
 728	struct intel_hdmi *intel_hdmi = enc_to_intel_hdmi(&encoder->base);
 729	u32 temp;
 730	u32 enable_bits = SDVO_ENABLE;
 731
 732	if (intel_hdmi->has_audio)
 733		enable_bits |= SDVO_AUDIO_ENABLE;
 734
 735	temp = I915_READ(intel_hdmi->hdmi_reg);
 736
 737	/* HW workaround for IBX, we need to move the port to transcoder A
 738	 * before disabling it, so restore the transcoder select bit here. */
 739	if (HAS_PCH_IBX(dev))
 740		enable_bits |= SDVO_PIPE_SEL(intel_crtc->pipe);
 741
 742	/* HW workaround, need to toggle enable bit off and on for 12bpc, but
 743	 * we do this anyway which shows more stable in testing.
 744	 */
 745	if (HAS_PCH_SPLIT(dev)) {
 746		I915_WRITE(intel_hdmi->hdmi_reg, temp & ~SDVO_ENABLE);
 747		POSTING_READ(intel_hdmi->hdmi_reg);
 748	}
 749
 750	temp |= enable_bits;
 751
 752	I915_WRITE(intel_hdmi->hdmi_reg, temp);
 753	POSTING_READ(intel_hdmi->hdmi_reg);
 754
 755	/* HW workaround, need to write this twice for issue that may result
 756	 * in first write getting masked.
 757	 */
 758	if (HAS_PCH_SPLIT(dev)) {
 759		I915_WRITE(intel_hdmi->hdmi_reg, temp);
 760		POSTING_READ(intel_hdmi->hdmi_reg);
 761	}
 762}
 763
 764static void vlv_enable_hdmi(struct intel_encoder *encoder)
 765{
 766}
 767
 768static void intel_disable_hdmi(struct intel_encoder *encoder)
 769{
 770	struct drm_device *dev = encoder->base.dev;
 771	struct drm_i915_private *dev_priv = dev->dev_private;
 772	struct intel_hdmi *intel_hdmi = enc_to_intel_hdmi(&encoder->base);
 773	u32 temp;
 774	u32 enable_bits = SDVO_ENABLE | SDVO_AUDIO_ENABLE;
 775
 776	temp = I915_READ(intel_hdmi->hdmi_reg);
 777
 778	/* HW workaround for IBX, we need to move the port to transcoder A
 779	 * before disabling it. */
 780	if (HAS_PCH_IBX(dev)) {
 781		struct drm_crtc *crtc = encoder->base.crtc;
 782		int pipe = crtc ? to_intel_crtc(crtc)->pipe : -1;
 783
 784		if (temp & SDVO_PIPE_B_SELECT) {
 785			temp &= ~SDVO_PIPE_B_SELECT;
 786			I915_WRITE(intel_hdmi->hdmi_reg, temp);
 787			POSTING_READ(intel_hdmi->hdmi_reg);
 788
 789			/* Again we need to write this twice. */
 790			I915_WRITE(intel_hdmi->hdmi_reg, temp);
 791			POSTING_READ(intel_hdmi->hdmi_reg);
 792
 793			/* Transcoder selection bits only update
 794			 * effectively on vblank. */
 795			if (crtc)
 796				intel_wait_for_vblank(dev, pipe);
 797			else
 798				msleep(50);
 799		}
 800	}
 801
 802	/* HW workaround, need to toggle enable bit off and on for 12bpc, but
 803	 * we do this anyway which shows more stable in testing.
 804	 */
 805	if (HAS_PCH_SPLIT(dev)) {
 806		I915_WRITE(intel_hdmi->hdmi_reg, temp & ~SDVO_ENABLE);
 807		POSTING_READ(intel_hdmi->hdmi_reg);
 808	}
 809
 810	temp &= ~enable_bits;
 811
 812	I915_WRITE(intel_hdmi->hdmi_reg, temp);
 813	POSTING_READ(intel_hdmi->hdmi_reg);
 814
 815	/* HW workaround, need to write this twice for issue that may result
 816	 * in first write getting masked.
 817	 */
 818	if (HAS_PCH_SPLIT(dev)) {
 819		I915_WRITE(intel_hdmi->hdmi_reg, temp);
 820		POSTING_READ(intel_hdmi->hdmi_reg);
 821	}
 822}
 823
 824static int hdmi_portclock_limit(struct intel_hdmi *hdmi, bool respect_dvi_limit)
 
 825{
 826	struct drm_device *dev = intel_hdmi_to_dev(hdmi);
 827
 828	if ((respect_dvi_limit && !hdmi->has_hdmi_sink) || IS_G4X(dev))
 829		return 165000;
 830	else if (IS_HASWELL(dev) || INTEL_INFO(dev)->gen >= 8)
 831		return 300000;
 832	else
 833		return 225000;
 834}
 835
 836static enum drm_mode_status
 837intel_hdmi_mode_valid(struct drm_connector *connector,
 838		      struct drm_display_mode *mode)
 839{
 840	if (mode->clock > hdmi_portclock_limit(intel_attached_hdmi(connector),
 841					       true))
 842		return MODE_CLOCK_HIGH;
 843	if (mode->clock < 20000)
 844		return MODE_CLOCK_LOW;
 845
 846	if (mode->flags & DRM_MODE_FLAG_DBLSCAN)
 847		return MODE_NO_DBLESCAN;
 848
 849	return MODE_OK;
 850}
 851
 852static bool hdmi_12bpc_possible(struct intel_crtc *crtc)
 
 
 853{
 854	struct drm_device *dev = crtc->base.dev;
 855	struct intel_encoder *encoder;
 856	int count = 0, count_hdmi = 0;
 857
 858	if (!HAS_PCH_SPLIT(dev))
 859		return false;
 860
 861	list_for_each_entry(encoder, &dev->mode_config.encoder_list, base.head) {
 862		if (encoder->new_crtc != crtc)
 863			continue;
 864
 865		count_hdmi += encoder->type == INTEL_OUTPUT_HDMI;
 866		count++;
 867	}
 868
 869	/*
 870	 * HDMI 12bpc affects the clocks, so it's only possible
 871	 * when not cloning with other encoder types.
 872	 */
 873	return count_hdmi > 0 && count_hdmi == count;
 874}
 875
 876bool intel_hdmi_compute_config(struct intel_encoder *encoder,
 877			       struct intel_crtc_config *pipe_config)
 878{
 879	struct intel_hdmi *intel_hdmi = enc_to_intel_hdmi(&encoder->base);
 880	struct drm_device *dev = encoder->base.dev;
 881	struct drm_display_mode *adjusted_mode = &pipe_config->adjusted_mode;
 882	int clock_12bpc = pipe_config->adjusted_mode.crtc_clock * 3 / 2;
 883	int portclock_limit = hdmi_portclock_limit(intel_hdmi, false);
 884	int desired_bpp;
 885
 886	if (intel_hdmi->color_range_auto) {
 887		/* See CEA-861-E - 5.1 Default Encoding Parameters */
 888		if (intel_hdmi->has_hdmi_sink &&
 889		    drm_match_cea_mode(adjusted_mode) > 1)
 890			intel_hdmi->color_range = HDMI_COLOR_RANGE_16_235;
 891		else
 892			intel_hdmi->color_range = 0;
 893	}
 894
 895	if (intel_hdmi->color_range)
 896		pipe_config->limited_color_range = true;
 897
 898	if (HAS_PCH_SPLIT(dev) && !HAS_DDI(dev))
 899		pipe_config->has_pch_encoder = true;
 900
 901	/*
 902	 * HDMI is either 12 or 8, so if the display lets 10bpc sneak
 903	 * through, clamp it down. Note that g4x/vlv don't support 12bpc hdmi
 904	 * outputs. We also need to check that the higher clock still fits
 905	 * within limits.
 906	 */
 907	if (pipe_config->pipe_bpp > 8*3 && intel_hdmi->has_hdmi_sink &&
 908	    clock_12bpc <= portclock_limit &&
 909	    hdmi_12bpc_possible(encoder->new_crtc)) {
 910		DRM_DEBUG_KMS("picking bpc to 12 for HDMI output\n");
 911		desired_bpp = 12*3;
 912
 913		/* Need to adjust the port link by 1.5x for 12bpc. */
 914		pipe_config->port_clock = clock_12bpc;
 915	} else {
 916		DRM_DEBUG_KMS("picking bpc to 8 for HDMI output\n");
 917		desired_bpp = 8*3;
 918	}
 919
 920	if (!pipe_config->bw_constrained) {
 921		DRM_DEBUG_KMS("forcing pipe bpc to %i for HDMI\n", desired_bpp);
 922		pipe_config->pipe_bpp = desired_bpp;
 923	}
 924
 925	if (adjusted_mode->crtc_clock > portclock_limit) {
 926		DRM_DEBUG_KMS("too high HDMI clock, rejecting mode\n");
 927		return false;
 928	}
 929
 930	return true;
 931}
 932
 933static enum drm_connector_status
 934intel_hdmi_detect(struct drm_connector *connector, bool force)
 935{
 936	struct drm_device *dev = connector->dev;
 937	struct intel_hdmi *intel_hdmi = intel_attached_hdmi(connector);
 938	struct intel_digital_port *intel_dig_port =
 939		hdmi_to_dig_port(intel_hdmi);
 940	struct intel_encoder *intel_encoder = &intel_dig_port->base;
 941	struct drm_i915_private *dev_priv = dev->dev_private;
 942	struct edid *edid;
 943	enum intel_display_power_domain power_domain;
 944	enum drm_connector_status status = connector_status_disconnected;
 945
 946	DRM_DEBUG_KMS("[CONNECTOR:%d:%s]\n",
 947		      connector->base.id, drm_get_connector_name(connector));
 948
 949	power_domain = intel_display_port_power_domain(intel_encoder);
 950	intel_display_power_get(dev_priv, power_domain);
 951
 952	intel_hdmi->has_hdmi_sink = false;
 953	intel_hdmi->has_audio = false;
 954	intel_hdmi->rgb_quant_range_selectable = false;
 955	edid = drm_get_edid(connector,
 956			    intel_gmbus_get_adapter(dev_priv,
 957						    intel_hdmi->ddc_bus));
 958
 959	if (edid) {
 960		if (edid->input & DRM_EDID_INPUT_DIGITAL) {
 961			status = connector_status_connected;
 962			if (intel_hdmi->force_audio != HDMI_AUDIO_OFF_DVI)
 963				intel_hdmi->has_hdmi_sink =
 964						drm_detect_hdmi_monitor(edid);
 965			intel_hdmi->has_audio = drm_detect_monitor_audio(edid);
 966			intel_hdmi->rgb_quant_range_selectable =
 967				drm_rgb_quant_range_selectable(edid);
 968		}
 
 969		kfree(edid);
 970	}
 971
 972	if (status == connector_status_connected) {
 973		if (intel_hdmi->force_audio != HDMI_AUDIO_AUTO)
 974			intel_hdmi->has_audio =
 975				(intel_hdmi->force_audio == HDMI_AUDIO_ON);
 976		intel_encoder->type = INTEL_OUTPUT_HDMI;
 977	}
 978
 979	intel_display_power_put(dev_priv, power_domain);
 980
 981	return status;
 982}
 983
 984static int intel_hdmi_get_modes(struct drm_connector *connector)
 985{
 986	struct intel_encoder *intel_encoder = intel_attached_encoder(connector);
 987	struct intel_hdmi *intel_hdmi = enc_to_intel_hdmi(&intel_encoder->base);
 988	struct drm_i915_private *dev_priv = connector->dev->dev_private;
 989	enum intel_display_power_domain power_domain;
 990	int ret;
 991
 992	/* We should parse the EDID data and find out if it's an HDMI sink so
 993	 * we can send audio to it.
 994	 */
 995
 996	power_domain = intel_display_port_power_domain(intel_encoder);
 997	intel_display_power_get(dev_priv, power_domain);
 998
 999	ret = intel_ddc_get_modes(connector,
1000				   intel_gmbus_get_adapter(dev_priv,
1001							   intel_hdmi->ddc_bus));
1002
1003	intel_display_power_put(dev_priv, power_domain);
1004
1005	return ret;
1006}
1007
1008static bool
1009intel_hdmi_detect_audio(struct drm_connector *connector)
1010{
1011	struct intel_encoder *intel_encoder = intel_attached_encoder(connector);
1012	struct intel_hdmi *intel_hdmi = enc_to_intel_hdmi(&intel_encoder->base);
1013	struct drm_i915_private *dev_priv = connector->dev->dev_private;
1014	enum intel_display_power_domain power_domain;
1015	struct edid *edid;
1016	bool has_audio = false;
1017
1018	power_domain = intel_display_port_power_domain(intel_encoder);
1019	intel_display_power_get(dev_priv, power_domain);
1020
1021	edid = drm_get_edid(connector,
1022			    intel_gmbus_get_adapter(dev_priv,
1023						    intel_hdmi->ddc_bus));
1024	if (edid) {
1025		if (edid->input & DRM_EDID_INPUT_DIGITAL)
1026			has_audio = drm_detect_monitor_audio(edid);
 
 
1027		kfree(edid);
1028	}
1029
1030	intel_display_power_put(dev_priv, power_domain);
1031
1032	return has_audio;
1033}
1034
1035static int
1036intel_hdmi_set_property(struct drm_connector *connector,
1037			struct drm_property *property,
1038			uint64_t val)
1039{
1040	struct intel_hdmi *intel_hdmi = intel_attached_hdmi(connector);
1041	struct intel_digital_port *intel_dig_port =
1042		hdmi_to_dig_port(intel_hdmi);
1043	struct drm_i915_private *dev_priv = connector->dev->dev_private;
1044	int ret;
1045
1046	ret = drm_object_property_set_value(&connector->base, property, val);
1047	if (ret)
1048		return ret;
1049
1050	if (property == dev_priv->force_audio_property) {
1051		enum hdmi_force_audio i = val;
1052		bool has_audio;
1053
1054		if (i == intel_hdmi->force_audio)
1055			return 0;
1056
1057		intel_hdmi->force_audio = i;
1058
1059		if (i == HDMI_AUDIO_AUTO)
1060			has_audio = intel_hdmi_detect_audio(connector);
1061		else
1062			has_audio = (i == HDMI_AUDIO_ON);
1063
1064		if (i == HDMI_AUDIO_OFF_DVI)
1065			intel_hdmi->has_hdmi_sink = 0;
1066
1067		intel_hdmi->has_audio = has_audio;
1068		goto done;
1069	}
1070
1071	if (property == dev_priv->broadcast_rgb_property) {
1072		bool old_auto = intel_hdmi->color_range_auto;
1073		uint32_t old_range = intel_hdmi->color_range;
1074
1075		switch (val) {
1076		case INTEL_BROADCAST_RGB_AUTO:
1077			intel_hdmi->color_range_auto = true;
1078			break;
1079		case INTEL_BROADCAST_RGB_FULL:
1080			intel_hdmi->color_range_auto = false;
1081			intel_hdmi->color_range = 0;
1082			break;
1083		case INTEL_BROADCAST_RGB_LIMITED:
1084			intel_hdmi->color_range_auto = false;
1085			intel_hdmi->color_range = HDMI_COLOR_RANGE_16_235;
1086			break;
1087		default:
1088			return -EINVAL;
1089		}
1090
1091		if (old_auto == intel_hdmi->color_range_auto &&
1092		    old_range == intel_hdmi->color_range)
1093			return 0;
1094
 
1095		goto done;
1096	}
1097
1098	return -EINVAL;
1099
1100done:
1101	if (intel_dig_port->base.base.crtc)
1102		intel_crtc_restore_mode(intel_dig_port->base.base.crtc);
 
 
 
 
1103
1104	return 0;
1105}
1106
1107static void vlv_hdmi_pre_enable(struct intel_encoder *encoder)
1108{
1109	struct intel_digital_port *dport = enc_to_dig_port(&encoder->base);
1110	struct drm_device *dev = encoder->base.dev;
1111	struct drm_i915_private *dev_priv = dev->dev_private;
1112	struct intel_crtc *intel_crtc =
1113		to_intel_crtc(encoder->base.crtc);
1114	enum dpio_channel port = vlv_dport_to_channel(dport);
1115	int pipe = intel_crtc->pipe;
1116	u32 val;
1117
1118	if (!IS_VALLEYVIEW(dev))
1119		return;
1120
1121	/* Enable clock channels for this port */
1122	mutex_lock(&dev_priv->dpio_lock);
1123	val = vlv_dpio_read(dev_priv, pipe, VLV_PCS01_DW8(port));
1124	val = 0;
1125	if (pipe)
1126		val |= (1<<21);
1127	else
1128		val &= ~(1<<21);
1129	val |= 0x001000c4;
1130	vlv_dpio_write(dev_priv, pipe, VLV_PCS_DW8(port), val);
1131
1132	/* HDMI 1.0V-2dB */
1133	vlv_dpio_write(dev_priv, pipe, VLV_TX_DW5(port), 0);
1134	vlv_dpio_write(dev_priv, pipe, VLV_TX_DW4(port), 0x2b245f5f);
1135	vlv_dpio_write(dev_priv, pipe, VLV_TX_DW2(port), 0x5578b83a);
1136	vlv_dpio_write(dev_priv, pipe, VLV_TX_DW3(port), 0x0c782040);
1137	vlv_dpio_write(dev_priv, pipe, VLV_TX3_DW4(port), 0x2b247878);
1138	vlv_dpio_write(dev_priv, pipe, VLV_PCS_DW11(port), 0x00030000);
1139	vlv_dpio_write(dev_priv, pipe, VLV_PCS_DW9(port), 0x00002000);
1140	vlv_dpio_write(dev_priv, pipe, VLV_TX_DW5(port), DPIO_TX_OCALINIT_EN);
1141
1142	/* Program lane clock */
1143	vlv_dpio_write(dev_priv, pipe, VLV_PCS_DW14(port), 0x00760018);
1144	vlv_dpio_write(dev_priv, pipe, VLV_PCS_DW23(port), 0x00400888);
1145	mutex_unlock(&dev_priv->dpio_lock);
1146
1147	intel_enable_hdmi(encoder);
1148
1149	vlv_wait_port_ready(dev_priv, dport);
1150}
1151
1152static void vlv_hdmi_pre_pll_enable(struct intel_encoder *encoder)
1153{
1154	struct intel_digital_port *dport = enc_to_dig_port(&encoder->base);
1155	struct drm_device *dev = encoder->base.dev;
1156	struct drm_i915_private *dev_priv = dev->dev_private;
1157	struct intel_crtc *intel_crtc =
1158		to_intel_crtc(encoder->base.crtc);
1159	enum dpio_channel port = vlv_dport_to_channel(dport);
1160	int pipe = intel_crtc->pipe;
1161
1162	if (!IS_VALLEYVIEW(dev))
1163		return;
1164
1165	/* Program Tx lane resets to default */
1166	mutex_lock(&dev_priv->dpio_lock);
1167	vlv_dpio_write(dev_priv, pipe, VLV_PCS_DW0(port),
1168			 DPIO_PCS_TX_LANE2_RESET |
1169			 DPIO_PCS_TX_LANE1_RESET);
1170	vlv_dpio_write(dev_priv, pipe, VLV_PCS_DW1(port),
1171			 DPIO_PCS_CLK_CRI_RXEB_EIOS_EN |
1172			 DPIO_PCS_CLK_CRI_RXDIGFILTSG_EN |
1173			 (1<<DPIO_PCS_CLK_DATAWIDTH_SHIFT) |
1174			 DPIO_PCS_CLK_SOFT_RESET);
1175
1176	/* Fix up inter-pair skew failure */
1177	vlv_dpio_write(dev_priv, pipe, VLV_PCS_DW12(port), 0x00750f00);
1178	vlv_dpio_write(dev_priv, pipe, VLV_TX_DW11(port), 0x00001500);
1179	vlv_dpio_write(dev_priv, pipe, VLV_TX_DW14(port), 0x40400000);
1180
1181	vlv_dpio_write(dev_priv, pipe, VLV_PCS_DW9(port), 0x00002000);
1182	vlv_dpio_write(dev_priv, pipe, VLV_TX_DW5(port), DPIO_TX_OCALINIT_EN);
1183	mutex_unlock(&dev_priv->dpio_lock);
1184}
1185
1186static void vlv_hdmi_post_disable(struct intel_encoder *encoder)
1187{
1188	struct intel_digital_port *dport = enc_to_dig_port(&encoder->base);
1189	struct drm_i915_private *dev_priv = encoder->base.dev->dev_private;
1190	struct intel_crtc *intel_crtc =
1191		to_intel_crtc(encoder->base.crtc);
1192	enum dpio_channel port = vlv_dport_to_channel(dport);
1193	int pipe = intel_crtc->pipe;
1194
1195	/* Reset lanes to avoid HDMI flicker (VLV w/a) */
1196	mutex_lock(&dev_priv->dpio_lock);
1197	vlv_dpio_write(dev_priv, pipe, VLV_PCS_DW0(port), 0x00000000);
1198	vlv_dpio_write(dev_priv, pipe, VLV_PCS_DW1(port), 0x00e00060);
1199	mutex_unlock(&dev_priv->dpio_lock);
1200}
1201
1202static void intel_hdmi_destroy(struct drm_connector *connector)
1203{
 
1204	drm_connector_cleanup(connector);
1205	kfree(connector);
1206}
1207
 
 
 
 
 
 
 
 
1208static const struct drm_connector_funcs intel_hdmi_connector_funcs = {
1209	.dpms = intel_connector_dpms,
1210	.detect = intel_hdmi_detect,
1211	.fill_modes = drm_helper_probe_single_connector_modes,
1212	.set_property = intel_hdmi_set_property,
1213	.destroy = intel_hdmi_destroy,
1214};
1215
1216static const struct drm_connector_helper_funcs intel_hdmi_connector_helper_funcs = {
1217	.get_modes = intel_hdmi_get_modes,
1218	.mode_valid = intel_hdmi_mode_valid,
1219	.best_encoder = intel_best_encoder,
1220};
1221
1222static const struct drm_encoder_funcs intel_hdmi_enc_funcs = {
1223	.destroy = intel_encoder_destroy,
1224};
1225
1226static void
1227intel_hdmi_add_properties(struct intel_hdmi *intel_hdmi, struct drm_connector *connector)
1228{
1229	intel_attach_force_audio_property(connector);
1230	intel_attach_broadcast_rgb_property(connector);
1231	intel_hdmi->color_range_auto = true;
1232}
1233
1234void intel_hdmi_init_connector(struct intel_digital_port *intel_dig_port,
1235			       struct intel_connector *intel_connector)
1236{
1237	struct drm_connector *connector = &intel_connector->base;
1238	struct intel_hdmi *intel_hdmi = &intel_dig_port->hdmi;
1239	struct intel_encoder *intel_encoder = &intel_dig_port->base;
1240	struct drm_device *dev = intel_encoder->base.dev;
1241	struct drm_i915_private *dev_priv = dev->dev_private;
1242	enum port port = intel_dig_port->port;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1243
 
1244	drm_connector_init(dev, connector, &intel_hdmi_connector_funcs,
1245			   DRM_MODE_CONNECTOR_HDMIA);
1246	drm_connector_helper_add(connector, &intel_hdmi_connector_helper_funcs);
1247
1248	connector->interlace_allowed = 1;
 
 
 
1249	connector->doublescan_allowed = 0;
1250	connector->stereo_allowed = 1;
1251
1252	switch (port) {
1253	case PORT_B:
 
1254		intel_hdmi->ddc_bus = GMBUS_PORT_DPB;
1255		intel_encoder->hpd_pin = HPD_PORT_B;
1256		break;
1257	case PORT_C:
 
 
 
 
 
 
 
 
1258		intel_hdmi->ddc_bus = GMBUS_PORT_DPC;
1259		intel_encoder->hpd_pin = HPD_PORT_C;
1260		break;
1261	case PORT_D:
1262		intel_hdmi->ddc_bus = GMBUS_PORT_DPD;
1263		intel_encoder->hpd_pin = HPD_PORT_D;
1264		break;
1265	case PORT_A:
1266		intel_encoder->hpd_pin = HPD_PORT_A;
1267		/* Internal port only for eDP. */
1268	default:
1269		BUG();
1270	}
1271
1272	if (IS_VALLEYVIEW(dev)) {
1273		intel_hdmi->write_infoframe = vlv_write_infoframe;
1274		intel_hdmi->set_infoframes = vlv_set_infoframes;
1275	} else if (!HAS_PCH_SPLIT(dev)) {
1276		intel_hdmi->write_infoframe = g4x_write_infoframe;
1277		intel_hdmi->set_infoframes = g4x_set_infoframes;
1278	} else if (HAS_DDI(dev)) {
1279		intel_hdmi->write_infoframe = hsw_write_infoframe;
1280		intel_hdmi->set_infoframes = hsw_set_infoframes;
1281	} else if (HAS_PCH_IBX(dev)) {
1282		intel_hdmi->write_infoframe = ibx_write_infoframe;
1283		intel_hdmi->set_infoframes = ibx_set_infoframes;
1284	} else {
1285		intel_hdmi->write_infoframe = cpt_write_infoframe;
1286		intel_hdmi->set_infoframes = cpt_set_infoframes;
1287	}
1288
1289	if (HAS_DDI(dev))
1290		intel_connector->get_hw_state = intel_ddi_connector_get_hw_state;
1291	else
1292		intel_connector->get_hw_state = intel_connector_get_hw_state;
1293	intel_connector->unregister = intel_connector_unregister;
 
1294
1295	intel_hdmi_add_properties(intel_hdmi, connector);
1296
1297	intel_connector_attach_encoder(intel_connector, intel_encoder);
1298	drm_sysfs_connector_add(connector);
1299
1300	/* For G4X desktop chip, PEG_BAND_GAP_DATA 3:0 must first be written
1301	 * 0xd.  Failure to do so will result in spurious interrupts being
1302	 * generated on the port when a cable is not attached.
1303	 */
1304	if (IS_G4X(dev) && !IS_GM45(dev)) {
1305		u32 temp = I915_READ(PEG_BAND_GAP_DATA);
1306		I915_WRITE(PEG_BAND_GAP_DATA, (temp & ~0xf) | 0xd);
1307	}
1308}
1309
1310void intel_hdmi_init(struct drm_device *dev, int hdmi_reg, enum port port)
1311{
1312	struct intel_digital_port *intel_dig_port;
1313	struct intel_encoder *intel_encoder;
1314	struct intel_connector *intel_connector;
1315
1316	intel_dig_port = kzalloc(sizeof(*intel_dig_port), GFP_KERNEL);
1317	if (!intel_dig_port)
1318		return;
1319
1320	intel_connector = kzalloc(sizeof(*intel_connector), GFP_KERNEL);
1321	if (!intel_connector) {
1322		kfree(intel_dig_port);
1323		return;
1324	}
1325
1326	intel_encoder = &intel_dig_port->base;
1327
1328	drm_encoder_init(dev, &intel_encoder->base, &intel_hdmi_enc_funcs,
1329			 DRM_MODE_ENCODER_TMDS);
1330
1331	intel_encoder->compute_config = intel_hdmi_compute_config;
1332	intel_encoder->mode_set = intel_hdmi_mode_set;
1333	intel_encoder->disable = intel_disable_hdmi;
1334	intel_encoder->get_hw_state = intel_hdmi_get_hw_state;
1335	intel_encoder->get_config = intel_hdmi_get_config;
1336	if (IS_VALLEYVIEW(dev)) {
1337		intel_encoder->pre_pll_enable = vlv_hdmi_pre_pll_enable;
1338		intel_encoder->pre_enable = vlv_hdmi_pre_enable;
1339		intel_encoder->enable = vlv_enable_hdmi;
1340		intel_encoder->post_disable = vlv_hdmi_post_disable;
1341	} else {
1342		intel_encoder->enable = intel_enable_hdmi;
1343	}
1344
1345	intel_encoder->type = INTEL_OUTPUT_HDMI;
1346	intel_encoder->crtc_mask = (1 << 0) | (1 << 1) | (1 << 2);
1347	intel_encoder->cloneable = 1 << INTEL_OUTPUT_ANALOG;
1348	/*
1349	 * BSpec is unclear about HDMI+HDMI cloning on g4x, but it seems
1350	 * to work on real hardware. And since g4x can send infoframes to
1351	 * only one port anyway, nothing is lost by allowing it.
1352	 */
1353	if (IS_G4X(dev))
1354		intel_encoder->cloneable |= 1 << INTEL_OUTPUT_HDMI;
1355
1356	intel_dig_port->port = port;
1357	intel_dig_port->hdmi.hdmi_reg = hdmi_reg;
1358	intel_dig_port->dp.output_reg = 0;
1359
1360	intel_hdmi_init_connector(intel_dig_port, intel_connector);
1361}