aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorEugeni Dodonov <eugeni.dodonov@intel.com>2012-05-09 14:37:27 -0400
committerDaniel Vetter <daniel.vetter@ffwll.ch>2012-05-19 16:39:50 -0400
commit0e72a5b55e706dafa3402611f6f9e082a810673d (patch)
treeb775c7008399636f9028572ec989480a1b6a381e
parente615efe4b879de87ef6a4192d7e5b0bd0d2e1518 (diff)
drm/i915: detect digital outputs on Haswell
Digital port detection on Haswell is indicated by the presence of a bit in DDI_BUF_CTL for port A, and by a different register for ports B, C and D. So we check for those bits during the initialization time and let the hdmi function know about those. Note that this bit does not indicates whether the output is DP or HDMI. However, the DDI buffers can be programmed in a way that is shared between DP/HDMI and FDI/HDMI except for PORT E. So for now, we detect those digital outputs as being HDMI, but proper DP support is still pending. Note that DDI A can only drive eDP, so we do not handle it here for hdmi initialization. v2: simplify Haswell handling logic v3: use generic function for handling digital outputs. Signed-off-by: Eugeni Dodonov <eugeni.dodonov@intel.com> Signed-off-by: Daniel Vetter <daniel.vetter@ffwll.ch>
-rw-r--r--drivers/gpu/drm/i915/intel_ddi.c29
-rw-r--r--drivers/gpu/drm/i915/intel_display.c21
-rw-r--r--drivers/gpu/drm/i915/intel_drv.h1
3 files changed, 50 insertions, 1 deletions
diff --git a/drivers/gpu/drm/i915/intel_ddi.c b/drivers/gpu/drm/i915/intel_ddi.c
index f44aae124771..22bb0dd9a911 100644
--- a/drivers/gpu/drm/i915/intel_ddi.c
+++ b/drivers/gpu/drm/i915/intel_ddi.c
@@ -220,3 +220,32 @@ void hsw_fdi_link_train(struct drm_crtc *crtc)
220 220
221 DRM_DEBUG_KMS("FDI train done.\n"); 221 DRM_DEBUG_KMS("FDI train done.\n");
222} 222}
223
224/* For DDI connections, it is possible to support different outputs over the
225 * same DDI port, such as HDMI or DP or even VGA via FDI. So we don't know by
226 * the time the output is detected what exactly is on the other end of it. This
227 * function aims at providing support for this detection and proper output
228 * configuration.
229 */
230void intel_ddi_init(struct drm_device *dev, enum port port)
231{
232 /* For now, we don't do any proper output detection and assume that we
233 * handle HDMI only */
234
235 switch(port){
236 case PORT_A:
237 /* We don't handle eDP and DP yet */
238 DRM_DEBUG_DRIVER("Found digital output on DDI port A\n");
239 break;
240 /* Assume that the ports B, C and D are working in HDMI mode for now */
241 case PORT_B:
242 case PORT_C:
243 case PORT_D:
244 intel_hdmi_init(dev, DDI_BUF_CTL(port));
245 break;
246 default:
247 DRM_DEBUG_DRIVER("No handlers defined for port %d, skipping DDI initialization\n",
248 port);
249 break;
250 }
251}
diff --git a/drivers/gpu/drm/i915/intel_display.c b/drivers/gpu/drm/i915/intel_display.c
index f1bb2e2ec173..1a06f97e73f8 100644
--- a/drivers/gpu/drm/i915/intel_display.c
+++ b/drivers/gpu/drm/i915/intel_display.c
@@ -6474,7 +6474,26 @@ static void intel_setup_outputs(struct drm_device *dev)
6474 6474
6475 intel_crt_init(dev); 6475 intel_crt_init(dev);
6476 6476
6477 if (HAS_PCH_SPLIT(dev)) { 6477 if (IS_HASWELL(dev)) {
6478 int found;
6479
6480 /* Haswell uses DDI functions to detect digital outputs */
6481 found = I915_READ(DDI_BUF_CTL_A) & DDI_INIT_DISPLAY_DETECTED;
6482 /* DDI A only supports eDP */
6483 if (found)
6484 intel_ddi_init(dev, PORT_A);
6485
6486 /* DDI B, C and D detection is indicated by the SFUSE_STRAP
6487 * register */
6488 found = I915_READ(SFUSE_STRAP);
6489
6490 if (found & SFUSE_STRAP_DDIB_DETECTED)
6491 intel_ddi_init(dev, PORT_B);
6492 if (found & SFUSE_STRAP_DDIC_DETECTED)
6493 intel_ddi_init(dev, PORT_C);
6494 if (found & SFUSE_STRAP_DDID_DETECTED)
6495 intel_ddi_init(dev, PORT_D);
6496 } else if (HAS_PCH_SPLIT(dev)) {
6478 int found; 6497 int found;
6479 6498
6480 if (I915_READ(HDMIB) & PORT_DETECTED) { 6499 if (I915_READ(HDMIB) & PORT_DETECTED) {
diff --git a/drivers/gpu/drm/i915/intel_drv.h b/drivers/gpu/drm/i915/intel_drv.h
index 0ad1bb383976..fd96ffbf501b 100644
--- a/drivers/gpu/drm/i915/intel_drv.h
+++ b/drivers/gpu/drm/i915/intel_drv.h
@@ -448,6 +448,7 @@ extern void intel_write_eld(struct drm_encoder *encoder,
448extern void intel_cpt_verify_modeset(struct drm_device *dev, int pipe); 448extern void intel_cpt_verify_modeset(struct drm_device *dev, int pipe);
449extern void intel_prepare_ddi(struct drm_device *dev); 449extern void intel_prepare_ddi(struct drm_device *dev);
450extern void hsw_fdi_link_train(struct drm_crtc *crtc); 450extern void hsw_fdi_link_train(struct drm_crtc *crtc);
451extern void intel_ddi_init(struct drm_device *dev, enum port port);
451 452
452/* For use by IVB LP watermark workaround in intel_sprite.c */ 453/* For use by IVB LP watermark workaround in intel_sprite.c */
453extern void intel_update_watermarks(struct drm_device *dev); 454extern void intel_update_watermarks(struct drm_device *dev);