diff options
| author | Dave Airlie <airlied@redhat.com> | 2013-02-08 11:08:10 +1000 | 
|---|---|---|
| committer | Dave Airlie <airlied@redhat.com> | 2013-02-08 11:08:10 +1000 | 
| commit | cd17ef4114ad5c514b17e6a0bb02a309ab90b692 (patch) | |
| tree | 9c162eaa96931597b83e165702e3483ba5c6bb1e /drivers/gpu/drm/i915/intel_dp.c | |
| parent | 67c964000236497e00c646472cd6b70b5c5109c8 (diff) | |
| parent | 7d37beaaf3dbc6ff16f4d32a4dd6f8c557c6ab50 (diff) | |
| download | olio-linux-3.10-cd17ef4114ad5c514b17e6a0bb02a309ab90b692.tar.xz olio-linux-3.10-cd17ef4114ad5c514b17e6a0bb02a309ab90b692.zip  | |
Merge tag 'drm-intel-next-2013-02-01' of git://people.freedesktop.org/~danvet/drm-intel into drm-next
Daniel writes:
"Probably the last feature pull for 3.9, there's some fixes outstanding
thought that I'd like to sneak in. And maybe 3.8 takes a bit longer ...
Anyway, highlights of this pull:
- Kill the horrible IS_DISPLAYREG hack to handle the mmio offset movements
  on vlv, big thanks to Ville.
- Dynamic power well support for Haswell, shaves away a bit when only
  using the eDP port on pipe A (Paulo). Plus unclaimed register fixes
  uncovered by this.
- Clarifications of the gpu hang/reset state transitions, hopefully fixing
  a few spurious -EIO deaths in userspace.
- Haswell ELD fixes.
- Some more (pp)gtt cleanups from Ben.
- A few smaller things all over.
Plus all the stuff from the previous rather small pull request:
- Broadcast RBG improvements and reduced color range fixes from Ville.
- Ben is on a "kill legacy gtt code for good" spree, first pile of patches
  included.
- No-relocs and bo lut improvements for faster execbuf from Chris.
- Some refactorings from Imre."
* tag 'drm-intel-next-2013-02-01' of git://people.freedesktop.org/~danvet/drm-intel: (101 commits)
  GPU/i915: Fix acpi_bus_get_device() check in drivers/gpu/drm/i915/intel_opregion.c
  drm/i915: Set the SR01 "screen off" bit in i915_redisable_vga() too
  drm/i915: Kill IS_DISPLAYREG()
  drm/i915: Introduce i915_vgacntrl_reg()
  drm/i915: gen6_gmch_remove can be static
  drm/i915: dynamic Haswell display power well support
  drm/i915: check the power down well on assert_pipe()
  drm/i915: don't send DP "idle" pattern before "normal" on HSW PORT_A
  drm/i915: don't run hsw power well code on !hsw
  drm/i915: kill cargo-culted locking from power well code
  drm/i915: Only run idle processing from i915_gem_retire_requests_worker
  drm/i915: Fix CAGF for HSW
  drm/i915: Reclaim GTT space for failed PPGTT
  drm/i915: remove intel_gtt structure
  drm/i915: Add probe and remove to the gtt ops
  drm/i915: extract hw ppgtt setup/cleanup code
  drm/i915: pte_encode is gen6+
  drm/i915: vfuncs for ppgtt
  drm/i915: vfuncs for gtt_clear_range/insert_entries
  drm/i915: Error state should print /sys/kernel/debug
  ...
Diffstat (limited to 'drivers/gpu/drm/i915/intel_dp.c')
| -rw-r--r-- | drivers/gpu/drm/i915/intel_dp.c | 64 | 
1 files changed, 49 insertions, 15 deletions
diff --git a/drivers/gpu/drm/i915/intel_dp.c b/drivers/gpu/drm/i915/intel_dp.c index e64c7572770..15afcf86ad6 100644 --- a/drivers/gpu/drm/i915/intel_dp.c +++ b/drivers/gpu/drm/i915/intel_dp.c @@ -763,6 +763,22 @@ intel_dp_mode_fixup(struct drm_encoder *encoder,  		return false;  	bpp = adjusted_mode->private_flags & INTEL_MODE_DP_FORCE_6BPC ? 18 : 24; + +	if (intel_dp->color_range_auto) { +		/* +		 * See: +		 * CEA-861-E - 5.1 Default Encoding Parameters +		 * VESA DisplayPort Ver.1.2a - 5.1.1.1 Video Colorimetry +		 */ +		if (bpp != 18 && drm_mode_cea_vic(adjusted_mode) > 1) +			intel_dp->color_range = DP_COLOR_RANGE_16_235; +		else +			intel_dp->color_range = 0; +	} + +	if (intel_dp->color_range) +		adjusted_mode->private_flags |= INTEL_MODE_LIMITED_COLOR_RANGE; +  	mode_rate = intel_dp_link_required(adjusted_mode->clock, bpp);  	for (clock = 0; clock <= max_clock; clock++) { @@ -967,7 +983,8 @@ intel_dp_mode_set(struct drm_encoder *encoder, struct drm_display_mode *mode,  		else  			intel_dp->DP |= DP_PLL_FREQ_270MHZ;  	} else if (!HAS_PCH_CPT(dev) || is_cpu_edp(intel_dp)) { -		intel_dp->DP |= intel_dp->color_range; +		if (!HAS_PCH_SPLIT(dev)) +			intel_dp->DP |= intel_dp->color_range;  		if (adjusted_mode->flags & DRM_MODE_FLAG_PHSYNC)  			intel_dp->DP |= DP_SYNC_HS_HIGH; @@ -1770,14 +1787,18 @@ intel_dp_set_link_train(struct intel_dp *intel_dp,  		temp &= ~DP_TP_CTL_LINK_TRAIN_MASK;  		switch (dp_train_pat & DP_TRAINING_PATTERN_MASK) {  		case DP_TRAINING_PATTERN_DISABLE: -			temp |= DP_TP_CTL_LINK_TRAIN_IDLE; -			I915_WRITE(DP_TP_CTL(port), temp); -			if (wait_for((I915_READ(DP_TP_STATUS(port)) & -				      DP_TP_STATUS_IDLE_DONE), 1)) -				DRM_ERROR("Timed out waiting for DP idle patterns\n"); +			if (port != PORT_A) { +				temp |= DP_TP_CTL_LINK_TRAIN_IDLE; +				I915_WRITE(DP_TP_CTL(port), temp); + +				if (wait_for((I915_READ(DP_TP_STATUS(port)) & +					      DP_TP_STATUS_IDLE_DONE), 1)) +					DRM_ERROR("Timed out waiting for DP idle patterns\n"); + +				temp &= ~DP_TP_CTL_LINK_TRAIN_MASK; +			} -			temp &= ~DP_TP_CTL_LINK_TRAIN_MASK;  			temp |= DP_TP_CTL_LINK_TRAIN_NORMAL;  			break; @@ -2276,16 +2297,17 @@ g4x_dp_detect(struct intel_dp *intel_dp)  {  	struct drm_device *dev = intel_dp_to_dev(intel_dp);  	struct drm_i915_private *dev_priv = dev->dev_private; +	struct intel_digital_port *intel_dig_port = dp_to_dig_port(intel_dp);  	uint32_t bit; -	switch (intel_dp->output_reg) { -	case DP_B: +	switch (intel_dig_port->port) { +	case PORT_B:  		bit = DPB_HOTPLUG_LIVE_STATUS;  		break; -	case DP_C: +	case PORT_C:  		bit = DPC_HOTPLUG_LIVE_STATUS;  		break; -	case DP_D: +	case PORT_D:  		bit = DPD_HOTPLUG_LIVE_STATUS;  		break;  	default: @@ -2459,10 +2481,21 @@ intel_dp_set_property(struct drm_connector *connector,  	}  	if (property == dev_priv->broadcast_rgb_property) { -		if (val == !!intel_dp->color_range) -			return 0; - -		intel_dp->color_range = val ? DP_COLOR_RANGE_16_235 : 0; +		switch (val) { +		case INTEL_BROADCAST_RGB_AUTO: +			intel_dp->color_range_auto = true; +			break; +		case INTEL_BROADCAST_RGB_FULL: +			intel_dp->color_range_auto = false; +			intel_dp->color_range = 0; +			break; +		case INTEL_BROADCAST_RGB_LIMITED: +			intel_dp->color_range_auto = false; +			intel_dp->color_range = DP_COLOR_RANGE_16_235; +			break; +		default: +			return -EINVAL; +		}  		goto done;  	} @@ -2603,6 +2636,7 @@ intel_dp_add_properties(struct intel_dp *intel_dp, struct drm_connector *connect  	intel_attach_force_audio_property(connector);  	intel_attach_broadcast_rgb_property(connector); +	intel_dp->color_range_auto = true;  	if (is_edp(intel_dp)) {  		drm_mode_create_scaling_mode_property(connector->dev);  |