Merge tag 'drm-intel-fixes-2013-07-25' of git://people.freedesktop.org/~danvet/drm-intel into drm-fixes
Brown-paper-bag pull request here. The snb rc6 fix from the last pull broke forcewake BIOS dirt cleanup, which with fixed. But that fix broke the spinlock init sequence, which results in an ugly BUG when spinlock debugging is enabled :( So I get to throw another patch at cc: stable to fix up the mess ... * tag 'drm-intel-fixes-2013-07-25' of git://people.freedesktop.org/~danvet/drm-intel: drm/i915: initialize gt_lock early with other spin locks drm/i915: fix hdmi portclock limits
This commit is contained in:
commit
bf903e4141
|
@ -1498,6 +1498,7 @@ int i915_driver_load(struct drm_device *dev, unsigned long flags)
|
||||||
spin_lock_init(&dev_priv->irq_lock);
|
spin_lock_init(&dev_priv->irq_lock);
|
||||||
spin_lock_init(&dev_priv->gpu_error.lock);
|
spin_lock_init(&dev_priv->gpu_error.lock);
|
||||||
spin_lock_init(&dev_priv->rps.lock);
|
spin_lock_init(&dev_priv->rps.lock);
|
||||||
|
spin_lock_init(&dev_priv->gt_lock);
|
||||||
spin_lock_init(&dev_priv->backlight.lock);
|
spin_lock_init(&dev_priv->backlight.lock);
|
||||||
mutex_init(&dev_priv->dpio_lock);
|
mutex_init(&dev_priv->dpio_lock);
|
||||||
mutex_init(&dev_priv->rps.hw_lock);
|
mutex_init(&dev_priv->rps.hw_lock);
|
||||||
|
|
|
@ -785,10 +785,22 @@ static void intel_disable_hdmi(struct intel_encoder *encoder)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int hdmi_portclock_limit(struct intel_hdmi *hdmi)
|
||||||
|
{
|
||||||
|
struct drm_device *dev = intel_hdmi_to_dev(hdmi);
|
||||||
|
|
||||||
|
if (IS_G4X(dev))
|
||||||
|
return 165000;
|
||||||
|
else if (IS_HASWELL(dev))
|
||||||
|
return 300000;
|
||||||
|
else
|
||||||
|
return 225000;
|
||||||
|
}
|
||||||
|
|
||||||
static int intel_hdmi_mode_valid(struct drm_connector *connector,
|
static int intel_hdmi_mode_valid(struct drm_connector *connector,
|
||||||
struct drm_display_mode *mode)
|
struct drm_display_mode *mode)
|
||||||
{
|
{
|
||||||
if (mode->clock > 165000)
|
if (mode->clock > hdmi_portclock_limit(intel_attached_hdmi(connector)))
|
||||||
return MODE_CLOCK_HIGH;
|
return MODE_CLOCK_HIGH;
|
||||||
if (mode->clock < 20000)
|
if (mode->clock < 20000)
|
||||||
return MODE_CLOCK_LOW;
|
return MODE_CLOCK_LOW;
|
||||||
|
@ -806,6 +818,7 @@ bool intel_hdmi_compute_config(struct intel_encoder *encoder,
|
||||||
struct drm_device *dev = encoder->base.dev;
|
struct drm_device *dev = encoder->base.dev;
|
||||||
struct drm_display_mode *adjusted_mode = &pipe_config->adjusted_mode;
|
struct drm_display_mode *adjusted_mode = &pipe_config->adjusted_mode;
|
||||||
int clock_12bpc = pipe_config->requested_mode.clock * 3 / 2;
|
int clock_12bpc = pipe_config->requested_mode.clock * 3 / 2;
|
||||||
|
int portclock_limit = hdmi_portclock_limit(intel_hdmi);
|
||||||
int desired_bpp;
|
int desired_bpp;
|
||||||
|
|
||||||
if (intel_hdmi->color_range_auto) {
|
if (intel_hdmi->color_range_auto) {
|
||||||
|
@ -829,7 +842,7 @@ bool intel_hdmi_compute_config(struct intel_encoder *encoder,
|
||||||
* outputs. We also need to check that the higher clock still fits
|
* outputs. We also need to check that the higher clock still fits
|
||||||
* within limits.
|
* within limits.
|
||||||
*/
|
*/
|
||||||
if (pipe_config->pipe_bpp > 8*3 && clock_12bpc <= 225000
|
if (pipe_config->pipe_bpp > 8*3 && clock_12bpc <= portclock_limit
|
||||||
&& HAS_PCH_SPLIT(dev)) {
|
&& HAS_PCH_SPLIT(dev)) {
|
||||||
DRM_DEBUG_KMS("picking bpc to 12 for HDMI output\n");
|
DRM_DEBUG_KMS("picking bpc to 12 for HDMI output\n");
|
||||||
desired_bpp = 12*3;
|
desired_bpp = 12*3;
|
||||||
|
@ -846,7 +859,7 @@ bool intel_hdmi_compute_config(struct intel_encoder *encoder,
|
||||||
pipe_config->pipe_bpp = desired_bpp;
|
pipe_config->pipe_bpp = desired_bpp;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (adjusted_mode->clock > 225000) {
|
if (adjusted_mode->clock > portclock_limit) {
|
||||||
DRM_DEBUG_KMS("too high HDMI clock, rejecting mode\n");
|
DRM_DEBUG_KMS("too high HDMI clock, rejecting mode\n");
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
|
@ -5497,8 +5497,6 @@ void intel_gt_init(struct drm_device *dev)
|
||||||
{
|
{
|
||||||
struct drm_i915_private *dev_priv = dev->dev_private;
|
struct drm_i915_private *dev_priv = dev->dev_private;
|
||||||
|
|
||||||
spin_lock_init(&dev_priv->gt_lock);
|
|
||||||
|
|
||||||
if (IS_VALLEYVIEW(dev)) {
|
if (IS_VALLEYVIEW(dev)) {
|
||||||
dev_priv->gt.force_wake_get = vlv_force_wake_get;
|
dev_priv->gt.force_wake_get = vlv_force_wake_get;
|
||||||
dev_priv->gt.force_wake_put = vlv_force_wake_put;
|
dev_priv->gt.force_wake_put = vlv_force_wake_put;
|
||||||
|
|
Loading…
Reference in a new issue