diff options
| author | Dave Airlie <airlied@redhat.com> | 2012-10-22 09:55:29 +1000 | 
|---|---|---|
| committer | Dave Airlie <airlied@redhat.com> | 2012-10-22 09:55:48 +1000 | 
| commit | 64acba6a7adfe8be2e28b7e903092db685328a08 (patch) | |
| tree | e8591529268d853a4b76868f7df768d6de8c124d /drivers/gpu | |
| parent | 6f0c0580b70c89094b3422ba81118c7b959c7556 (diff) | |
| parent | 74ce6b6c63262defba91c4d790b3f91074793c0d (diff) | |
| download | olio-linux-3.10-64acba6a7adfe8be2e28b7e903092db685328a08.tar.xz olio-linux-3.10-64acba6a7adfe8be2e28b7e903092db685328a08.zip  | |
Merge branch 'drm-intel-fixes' of git://people.freedesktop.org/~danvet/drm-intel into drm-fixes
Daniel writes:
The big thing is the disabling of the hsw support by default, cc: stable.
We've aimed for basic hsw support in 3.6, but due to a few bad
happenstances we've screwed up and only 3.8 will have better modeset
support than vesa. To avoid yet another round of fallout from such a
gaffle on for the next platform we've added a module option to disable
early hw support by default. That should also give us more flexibility in
bring-up.
 Otherwise just small fixes:
 - 3 fixes from Egbert for sdvo corner cases
 - invert-brightness quirk entry from Egbert
 - revert a dp link training change, it regresses some setups
 - and shut up a spurious WARN in our gem fault handler.
 - regression fix for an oops on bit17 swizzling machines, introduce in 3.7
 - another no-lvds quirk
* 'drm-intel-fixes' of git://people.freedesktop.org/~danvet/drm-intel:
  drm/i915: Initialize obj->pages before use by i915_gem_object_do_bit17_swizzle()
  drm/i915: Add no-lvds quirk for Supermicro X7SPA-H
  drm/i915: Insert i915_preliminary_hw_support variable.
  drm/i915: shut up spurious WARN in the gtt fault handler
  Revert "drm/i915: Try harder to complete DP training pattern 1"
  DRM/i915: Restore sdvo_flags after dtd->mode->dtd Roundrtrip.
  DRM/i915: Don't clone SDVO LVDS with analog.
  DRM/i915: Add QUIRK_INVERT_BRIGHTNESS for NCR machines.
  DRM/i915: Don't delete DPLL Multiplier during DAC init.
Diffstat (limited to 'drivers/gpu')
| -rw-r--r-- | drivers/gpu/drm/i915/i915_drv.c | 13 | ||||
| -rw-r--r-- | drivers/gpu/drm/i915/i915_drv.h | 1 | ||||
| -rw-r--r-- | drivers/gpu/drm/i915/i915_gem.c | 7 | ||||
| -rw-r--r-- | drivers/gpu/drm/i915/intel_crt.c | 15 | ||||
| -rw-r--r-- | drivers/gpu/drm/i915/intel_display.c | 32 | ||||
| -rw-r--r-- | drivers/gpu/drm/i915/intel_dp.c | 15 | ||||
| -rw-r--r-- | drivers/gpu/drm/i915/intel_lvds.c | 8 | ||||
| -rw-r--r-- | drivers/gpu/drm/i915/intel_sdvo.c | 14 | 
8 files changed, 80 insertions, 25 deletions
diff --git a/drivers/gpu/drm/i915/i915_drv.c b/drivers/gpu/drm/i915/i915_drv.c index aac4e5e1a5b..6770ee6084b 100644 --- a/drivers/gpu/drm/i915/i915_drv.c +++ b/drivers/gpu/drm/i915/i915_drv.c @@ -118,6 +118,13 @@ module_param_named(i915_enable_ppgtt, i915_enable_ppgtt, int, 0600);  MODULE_PARM_DESC(i915_enable_ppgtt,  		"Enable PPGTT (default: true)"); +unsigned int i915_preliminary_hw_support __read_mostly = 0; +module_param_named(preliminary_hw_support, i915_preliminary_hw_support, int, 0600); +MODULE_PARM_DESC(preliminary_hw_support, +		"Enable preliminary hardware support. " +		"Enable Haswell and ValleyView Support. " +		"(default: false)"); +  static struct drm_driver driver;  extern int intel_agp_enabled; @@ -826,6 +833,12 @@ i915_pci_probe(struct pci_dev *pdev, const struct pci_device_id *ent)  	struct intel_device_info *intel_info =  		(struct intel_device_info *) ent->driver_data; +	if (intel_info->is_haswell || intel_info->is_valleyview) +		if(!i915_preliminary_hw_support) { +			DRM_ERROR("Preliminary hardware support disabled\n"); +			return -ENODEV; +		} +  	/* Only bind to function 0 of the device. Early generations  	 * used function 1 as a placeholder for multi-head. This causes  	 * us confusion instead, especially on the systems where both diff --git a/drivers/gpu/drm/i915/i915_drv.h b/drivers/gpu/drm/i915/i915_drv.h index b84f7861e43..f511fa2f416 100644 --- a/drivers/gpu/drm/i915/i915_drv.h +++ b/drivers/gpu/drm/i915/i915_drv.h @@ -1217,6 +1217,7 @@ extern int i915_enable_rc6 __read_mostly;  extern int i915_enable_fbc __read_mostly;  extern bool i915_enable_hangcheck __read_mostly;  extern int i915_enable_ppgtt __read_mostly; +extern unsigned int i915_preliminary_hw_support __read_mostly;  extern int i915_suspend(struct drm_device *dev, pm_message_t state);  extern int i915_resume(struct drm_device *dev); diff --git a/drivers/gpu/drm/i915/i915_gem.c b/drivers/gpu/drm/i915/i915_gem.c index d33d02d13c9..107f09befe9 100644 --- a/drivers/gpu/drm/i915/i915_gem.c +++ b/drivers/gpu/drm/i915/i915_gem.c @@ -1407,8 +1407,10 @@ out:  		return VM_FAULT_NOPAGE;  	case -ENOMEM:  		return VM_FAULT_OOM; +	case -ENOSPC: +		return VM_FAULT_SIGBUS;  	default: -		WARN_ON_ONCE(ret); +		WARN_ONCE(ret, "unhandled error in i915_gem_fault: %i\n", ret);  		return VM_FAULT_SIGBUS;  	}  } @@ -1822,10 +1824,11 @@ i915_gem_object_get_pages_gtt(struct drm_i915_gem_object *obj)  		sg_set_page(sg, page, PAGE_SIZE, 0);  	} +	obj->pages = st; +  	if (i915_gem_object_needs_bit17_swizzle(obj))  		i915_gem_object_do_bit_17_swizzle(obj); -	obj->pages = st;  	return 0;  err_pages: diff --git a/drivers/gpu/drm/i915/intel_crt.c b/drivers/gpu/drm/i915/intel_crt.c index 893f30164b7..f78061af704 100644 --- a/drivers/gpu/drm/i915/intel_crt.c +++ b/drivers/gpu/drm/i915/intel_crt.c @@ -219,20 +219,7 @@ static void intel_crt_mode_set(struct drm_encoder *encoder,  		intel_encoder_to_crt(to_intel_encoder(encoder));  	struct intel_crtc *intel_crtc = to_intel_crtc(crtc);  	struct drm_i915_private *dev_priv = dev->dev_private; -	int dpll_md_reg; -	u32 adpa, dpll_md; - -	dpll_md_reg = DPLL_MD(intel_crtc->pipe); - -	/* -	 * Disable separate mode multiplier used when cloning SDVO to CRT -	 * XXX this needs to be adjusted when we really are cloning -	 */ -	if (INTEL_INFO(dev)->gen >= 4 && !HAS_PCH_SPLIT(dev)) { -		dpll_md = I915_READ(dpll_md_reg); -		I915_WRITE(dpll_md_reg, -			   dpll_md & ~DPLL_MD_UDI_MULTIPLIER_MASK); -	} +	u32 adpa;  	adpa = ADPA_HOTPLUG_BITS;  	if (adjusted_mode->flags & DRM_MODE_FLAG_PHSYNC) diff --git a/drivers/gpu/drm/i915/intel_display.c b/drivers/gpu/drm/i915/intel_display.c index 682bd3729ba..461a637f1ef 100644 --- a/drivers/gpu/drm/i915/intel_display.c +++ b/drivers/gpu/drm/i915/intel_display.c @@ -7892,6 +7892,34 @@ struct intel_quirk {  	void (*hook)(struct drm_device *dev);  }; +/* For systems that don't have a meaningful PCI subdevice/subvendor ID */ +struct intel_dmi_quirk { +	void (*hook)(struct drm_device *dev); +	const struct dmi_system_id (*dmi_id_list)[]; +}; + +static int intel_dmi_reverse_brightness(const struct dmi_system_id *id) +{ +	DRM_INFO("Backlight polarity reversed on %s\n", id->ident); +	return 1; +} + +static const struct intel_dmi_quirk intel_dmi_quirks[] = { +	{ +		.dmi_id_list = &(const struct dmi_system_id[]) { +			{ +				.callback = intel_dmi_reverse_brightness, +				.ident = "NCR Corporation", +				.matches = {DMI_MATCH(DMI_SYS_VENDOR, "NCR Corporation"), +					    DMI_MATCH(DMI_PRODUCT_NAME, ""), +				}, +			}, +			{ }  /* terminating entry */ +		}, +		.hook = quirk_invert_brightness, +	}, +}; +  static struct intel_quirk intel_quirks[] = {  	/* HP Mini needs pipe A force quirk (LP: #322104) */  	{ 0x27ae, 0x103c, 0x361a, quirk_pipea_force }, @@ -7931,6 +7959,10 @@ static void intel_init_quirks(struct drm_device *dev)  		     q->subsystem_device == PCI_ANY_ID))  			q->hook(dev);  	} +	for (i = 0; i < ARRAY_SIZE(intel_dmi_quirks); i++) { +		if (dmi_check_system(*intel_dmi_quirks[i].dmi_id_list) != 0) +			intel_dmi_quirks[i].hook(dev); +	}  }  /* Disable the VGA plane that we never use */ diff --git a/drivers/gpu/drm/i915/intel_dp.c b/drivers/gpu/drm/i915/intel_dp.c index 1b727a5c9ee..368ed8ef160 100644 --- a/drivers/gpu/drm/i915/intel_dp.c +++ b/drivers/gpu/drm/i915/intel_dp.c @@ -1797,7 +1797,8 @@ intel_dp_start_link_train(struct intel_dp *intel_dp)  			if ((intel_dp->train_set[i] & DP_TRAIN_MAX_SWING_REACHED) == 0)  				break;  		if (i == intel_dp->lane_count && voltage_tries == 5) { -			if (++loop_tries == 5) { +			++loop_tries; +			if (loop_tries == 5) {  				DRM_DEBUG_KMS("too many full retries, give up\n");  				break;  			} @@ -1807,11 +1808,15 @@ intel_dp_start_link_train(struct intel_dp *intel_dp)  		}  		/* Check to see if we've tried the same voltage 5 times */ -		if ((intel_dp->train_set[0] & DP_TRAIN_VOLTAGE_SWING_MASK) != voltage) { -			voltage = intel_dp->train_set[0] & DP_TRAIN_VOLTAGE_SWING_MASK; -			voltage_tries = 0; -		} else +		if ((intel_dp->train_set[0] & DP_TRAIN_VOLTAGE_SWING_MASK) == voltage) {  			++voltage_tries; +			if (voltage_tries == 5) { +				DRM_DEBUG_KMS("too many voltage retries, give up\n"); +				break; +			} +		} else +			voltage_tries = 0; +		voltage = intel_dp->train_set[0] & DP_TRAIN_VOLTAGE_SWING_MASK;  		/* Compute new intel_dp->train_set as requested by target */  		intel_get_adjust_train(intel_dp, link_status); diff --git a/drivers/gpu/drm/i915/intel_lvds.c b/drivers/gpu/drm/i915/intel_lvds.c index e3166df55da..edba93b3474 100644 --- a/drivers/gpu/drm/i915/intel_lvds.c +++ b/drivers/gpu/drm/i915/intel_lvds.c @@ -777,6 +777,14 @@ static const struct dmi_system_id intel_no_lvds[] = {  			DMI_MATCH(DMI_BOARD_NAME, "D525TUD"),  		},  	}, +	{ +		.callback = intel_no_lvds_dmi_callback, +		.ident = "Supermicro X7SPA-H", +		.matches = { +			DMI_MATCH(DMI_SYS_VENDOR, "Supermicro"), +			DMI_MATCH(DMI_PRODUCT_NAME, "X7SPA-H"), +		}, +	},  	{ }	/* terminating entry */  }; diff --git a/drivers/gpu/drm/i915/intel_sdvo.c b/drivers/gpu/drm/i915/intel_sdvo.c index 0007a4d9bf6..c01d97db006 100644 --- a/drivers/gpu/drm/i915/intel_sdvo.c +++ b/drivers/gpu/drm/i915/intel_sdvo.c @@ -139,6 +139,11 @@ struct intel_sdvo {  	/* DDC bus used by this SDVO encoder */  	uint8_t ddc_bus; + +	/* +	 * the sdvo flag gets lost in round trip: dtd->adjusted_mode->dtd +	 */ +	uint8_t dtd_sdvo_flags;  };  struct intel_sdvo_connector { @@ -984,6 +989,7 @@ intel_sdvo_get_preferred_input_mode(struct intel_sdvo *intel_sdvo,  		return false;  	intel_sdvo_get_mode_from_dtd(adjusted_mode, &input_dtd); +	intel_sdvo->dtd_sdvo_flags = input_dtd.part2.sdvo_flags;  	return true;  } @@ -1092,6 +1098,8 @@ static void intel_sdvo_mode_set(struct drm_encoder *encoder,  	 * adjusted_mode.  	 */  	intel_sdvo_get_dtd_from_mode(&input_dtd, adjusted_mode); +	if (intel_sdvo->is_tv || intel_sdvo->is_lvds) +		input_dtd.part2.sdvo_flags = intel_sdvo->dtd_sdvo_flags;  	if (!intel_sdvo_set_input_timing(intel_sdvo, &input_dtd))  		DRM_INFO("Setting input timings on %s failed\n",  			 SDVO_NAME(intel_sdvo)); @@ -2277,10 +2285,8 @@ intel_sdvo_lvds_init(struct intel_sdvo *intel_sdvo, int device)  		intel_sdvo_connector->output_flag = SDVO_OUTPUT_LVDS1;  	} -	/* SDVO LVDS is cloneable because the SDVO encoder does the upscaling, -	 * as opposed to native LVDS, where we upscale with the panel-fitter -	 * (and hence only the native LVDS resolution could be cloned). */ -	intel_sdvo->base.cloneable = true; +	/* SDVO LVDS is not cloneable because the input mode gets adjusted by the encoder */ +	intel_sdvo->base.cloneable = false;  	intel_sdvo_connector_init(intel_sdvo_connector, intel_sdvo);  	if (!intel_sdvo_create_enhance_property(intel_sdvo, intel_sdvo_connector))  |