]> Git Repo - linux.git/commitdiff
Merge branch 'drm-intel-fixes' of git://people.freedesktop.org/~danvet/drm-intel...
authorDave Airlie <[email protected]>
Thu, 7 Mar 2013 01:12:14 +0000 (11:12 +1000)
committerDave Airlie <[email protected]>
Thu, 7 Mar 2013 01:12:14 +0000 (11:12 +1000)
A bunch of fixes, nothing truely horrible:
- Fix PCH irq handling race which resulted in missed gmbus/dp aux irqs
  and subsequent fallout (Paulo)
- Fixup off-by-one in our hsw id table (Kenneth)
- Fixup ilk rc6 support (disabled by default), regression introduced in
  3.8
- g4x plane w/a from Egbert Eich
- gen2/3/4 dpms suspend/standy fixes for VGA outputs from Patrik Jakobsson
- Workaround dying ivb machines with less aggressive rc6 values (Stéphane
  Marchesin)

* 'drm-intel-fixes' of git://people.freedesktop.org/~danvet/drm-intel:
  drm/i915: Turn off hsync and vsync on ADPA when disabling crt
  drm/i915: Fix incorrect definition of ADPA HSYNC and VSYNC bits
  drm/i915: also disable south interrupts when handling them
  drm/i915: enable irqs earlier when resuming
  drm/i915: Increase the RC6p threshold.
  DRM/i915: On G45 enable cursor plane briefly after enabling the display plane.
  drm/i915: Fix Haswell/CRW PCI IDs.
  drm/i915: Don't clobber crtc->fb when queue_flip fails
  drm/i915: wait_event_timeout's timeout is in jiffies
  drm/i915: Fix missing variable initilization

1  2 
drivers/gpu/drm/i915/intel_crt.c
drivers/gpu/drm/i915/intel_ddi.c
drivers/gpu/drm/i915/intel_display.c
drivers/gpu/drm/i915/intel_dp.c

index 969d08c72d1023c89116234fcf1844622d0f1081,da1f176a40b74b6f37b27643849ac07b14ecf791..32a3693905ecb14f697fd82b4f8a2419e2818552
@@@ -88,7 -88,7 +88,7 @@@ static void intel_disable_crt(struct in
        u32 temp;
  
        temp = I915_READ(crt->adpa_reg);
-       temp &= ~(ADPA_HSYNC_CNTL_DISABLE | ADPA_VSYNC_CNTL_DISABLE);
+       temp |= ADPA_HSYNC_CNTL_DISABLE | ADPA_VSYNC_CNTL_DISABLE;
        temp &= ~ADPA_DAC_ENABLE;
        I915_WRITE(crt->adpa_reg, temp);
  }
@@@ -685,6 -685,7 +685,6 @@@ static void intel_crt_reset(struct drm_
  static const struct drm_encoder_helper_funcs crt_encoder_funcs = {
        .mode_fixup = intel_crt_mode_fixup,
        .mode_set = intel_crt_mode_set,
 -      .disable = intel_encoder_noop,
  };
  
  static const struct drm_connector_funcs intel_crt_connector_funcs = {
index d64af5aa4a1caeccc1b5f5f6d85e68cc4e5c7fff,24debd6066a7ed17387a586db9c1a1170d33a52a..8d0bac3c35d7df012225ea47e922c60b353a0915
@@@ -1391,8 -1391,8 +1391,8 @@@ void intel_ddi_prepare_link_retrain(str
        struct intel_dp *intel_dp = &intel_dig_port->dp;
        struct drm_i915_private *dev_priv = encoder->dev->dev_private;
        enum port port = intel_dig_port->port;
-       bool wait;
        uint32_t val;
+       bool wait = false;
  
        if (I915_READ(DP_TP_CTL(port)) & DP_TP_CTL_ENABLE) {
                val = I915_READ(DDI_BUF_CTL(port));
@@@ -1489,6 -1489,7 +1489,6 @@@ static const struct drm_encoder_funcs i
  static const struct drm_encoder_helper_funcs intel_ddi_helper_funcs = {
        .mode_fixup = intel_ddi_mode_fixup,
        .mode_set = intel_ddi_mode_set,
 -      .disable = intel_encoder_noop,
  };
  
  void intel_ddi_init(struct drm_device *dev, enum port port)
index a05ac2c91ba2cd3cf5a8599794a74674a5ac04ed,0a02e044b65373d42d9a3232db0e6f6b4c8735cd..287b42c9d1a8250e56d8a72d1b527cbb7dc1ad38
@@@ -3604,6 -3604,30 +3604,30 @@@ static void intel_crtc_dpms_overlay(str
         */
  }
  
+ /**
+  * i9xx_fixup_plane - ugly workaround for G45 to fire up the hardware
+  * cursor plane briefly if not already running after enabling the display
+  * plane.
+  * This workaround avoids occasional blank screens when self refresh is
+  * enabled.
+  */
+ static void
+ g4x_fixup_plane(struct drm_i915_private *dev_priv, enum pipe pipe)
+ {
+       u32 cntl = I915_READ(CURCNTR(pipe));
+       if ((cntl & CURSOR_MODE) == 0) {
+               u32 fw_bcl_self = I915_READ(FW_BLC_SELF);
+               I915_WRITE(FW_BLC_SELF, fw_bcl_self & ~FW_BLC_SELF_EN);
+               I915_WRITE(CURCNTR(pipe), CURSOR_MODE_64_ARGB_AX);
+               intel_wait_for_vblank(dev_priv->dev, pipe);
+               I915_WRITE(CURCNTR(pipe), cntl);
+               I915_WRITE(CURBASE(pipe), I915_READ(CURBASE(pipe)));
+               I915_WRITE(FW_BLC_SELF, fw_bcl_self);
+       }
+ }
  static void i9xx_crtc_enable(struct drm_crtc *crtc)
  {
        struct drm_device *dev = crtc->dev;
  
        intel_enable_pipe(dev_priv, pipe, false);
        intel_enable_plane(dev_priv, plane, pipe);
+       if (IS_G4X(dev))
+               g4x_fixup_plane(dev_priv, pipe);
  
        intel_crtc_load_lut(crtc);
        intel_update_fbc(dev);
@@@ -3738,6 -3764,10 +3764,6 @@@ void intel_crtc_update_dpms(struct drm_
        intel_crtc_update_sarea(crtc, enable);
  }
  
 -static void intel_crtc_noop(struct drm_crtc *crtc)
 -{
 -}
 -
  static void intel_crtc_disable(struct drm_crtc *crtc)
  {
        struct drm_device *dev = crtc->dev;
@@@ -3786,6 -3816,10 +3812,6 @@@ void intel_modeset_disable(struct drm_d
        }
  }
  
 -void intel_encoder_noop(struct drm_encoder *encoder)
 -{
 -}
 -
  void intel_encoder_destroy(struct drm_encoder *encoder)
  {
        struct intel_encoder *intel_encoder = to_intel_encoder(encoder);
@@@ -7256,8 -7290,8 +7282,8 @@@ static int intel_crtc_page_flip(struct 
  {
        struct drm_device *dev = crtc->dev;
        struct drm_i915_private *dev_priv = dev->dev_private;
-       struct intel_framebuffer *intel_fb;
-       struct drm_i915_gem_object *obj;
+       struct drm_framebuffer *old_fb = crtc->fb;
+       struct drm_i915_gem_object *obj = to_intel_framebuffer(fb)->obj;
        struct intel_crtc *intel_crtc = to_intel_crtc(crtc);
        struct intel_unpin_work *work;
        unsigned long flags;
  
        work->event = event;
        work->crtc = crtc;
-       intel_fb = to_intel_framebuffer(crtc->fb);
-       work->old_fb_obj = intel_fb->obj;
+       work->old_fb_obj = to_intel_framebuffer(old_fb)->obj;
        INIT_WORK(&work->work, intel_unpin_work_fn);
  
        ret = drm_vblank_get(dev, intel_crtc->pipe);
        intel_crtc->unpin_work = work;
        spin_unlock_irqrestore(&dev->event_lock, flags);
  
-       intel_fb = to_intel_framebuffer(fb);
-       obj = intel_fb->obj;
        if (atomic_read(&intel_crtc->unpin_work_count) >= 2)
                flush_workqueue(dev_priv->wq);
  
  
  cleanup_pending:
        atomic_dec(&intel_crtc->unpin_work_count);
+       crtc->fb = old_fb;
        drm_gem_object_unreference(&work->old_fb_obj->base);
        drm_gem_object_unreference(&obj->base);
        mutex_unlock(&dev->struct_mutex);
@@@ -7359,6 -7390,7 +7382,6 @@@ free_work
  static struct drm_crtc_helper_funcs intel_helper_funcs = {
        .mode_set_base_atomic = intel_pipe_set_base_atomic,
        .load_lut = intel_crtc_load_lut,
 -      .disable = intel_crtc_noop,
  };
  
  bool intel_encoder_check_is_cloned(struct intel_encoder *encoder)
@@@ -8068,9 -8100,14 +8091,9 @@@ static int intel_crtc_set_config(struc
        BUG_ON(!set->crtc);
        BUG_ON(!set->crtc->helper_private);
  
 -      if (!set->mode)
 -              set->fb = NULL;
 -
 -      /* The fb helper likes to play gross jokes with ->mode_set_config.
 -       * Unfortunately the crtc helper doesn't do much at all for this case,
 -       * so we have to cope with this madness until the fb helper is fixed up. */
 -      if (set->fb && set->num_connectors == 0)
 -              return 0;
 +      /* Enforce sane interface api - has been abused by the fb helper. */
 +      BUG_ON(!set->mode && set->fb);
 +      BUG_ON(set->fb && set->num_connectors == 0);
  
        if (set->fb) {
                DRM_DEBUG_KMS("[CRTC:%d] [FB:%d] #connectors=%d (x y) (%i %i)\n",
index f61cb7998c7230d28c83850aeab068958be5df3a,50cd7ac28c2ccfc7f1169132a8fc112f6327a4c6..6f728e5ee79391d3bf726f971eb7b96af307df0d
@@@ -353,7 -353,8 +353,8 @@@ intel_dp_aux_wait_done(struct intel_dp 
  
  #define C (((status = I915_READ_NOTRACE(ch_ctl)) & DP_AUX_CH_CTL_SEND_BUSY) == 0)
        if (has_aux_irq)
-               done = wait_event_timeout(dev_priv->gmbus_wait_queue, C, 10);
+               done = wait_event_timeout(dev_priv->gmbus_wait_queue, C,
+                                         msecs_to_jiffies(10));
        else
                done = wait_for_atomic(C, 10) == 0;
        if (!done)
@@@ -770,7 -771,7 +771,7 @@@ intel_dp_mode_fixup(struct drm_encoder 
                 * 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)
 +              if (bpp != 18 && drm_match_cea_mode(adjusted_mode) > 1)
                        intel_dp->color_range = DP_COLOR_RANGE_16_235;
                else
                        intel_dp->color_range = 0;
@@@ -2561,6 -2562,7 +2562,6 @@@ void intel_dp_encoder_destroy(struct dr
  static const struct drm_encoder_helper_funcs intel_dp_helper_funcs = {
        .mode_fixup = intel_dp_mode_fixup,
        .mode_set = intel_dp_mode_set,
 -      .disable = intel_encoder_noop,
  };
  
  static const struct drm_connector_funcs intel_dp_connector_funcs = {
This page took 0.106096 seconds and 4 git commands to generate.