lkml.org 
[lkml]   [2012]   [Aug]   [12]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    Date
    From
    Subject3.6-rc1 breaks my laptop graphics (intel)
    Hi Daniel.

    The 3.6-rc1 kernel breaks my laptop, booting to a black screen when the
    i915 driver initializes itself. I bisected this down to commit
    24ded204429fa0f5501d37c63ee35c555c0b75ee (drm/i915: properly enable the
    blc controller on the right pipe), and when I revert that, and also
    a4f32fc3a37e982fffce8ec583643990ff288419 (drm/i915: don't forget the PCH
    backlight registers) which depended on the first patch, my laptop works
    just fine.

    Below is the combined revert.

    Any thoughts? Any patch I can try out?

    thanks,

    greg k-h

    ------
    Subject: drm/i915: revert 24ded204429fa0f5501d37c63ee35c555c0b75ee and a4f32fc3a37e982fffce8ec583643990ff288419

    24ded204429fa0f5501d37c63ee35c555c0b75ee (drm/i915: properly enable the
    blc controller on the right pipe) breaks the boot for my laptop, so
    revert it, and a4f32fc3a37e982fffce8ec583643990ff288419 (drm/i915: don't
    forget the PCH backlight registers) which depended on it.

    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

    diff --git a/drivers/gpu/drm/i915/intel_drv.h b/drivers/gpu/drm/i915/intel_drv.h
    index 8435355..4e786f2 100644
    --- a/drivers/gpu/drm/i915/intel_drv.h
    +++ b/drivers/gpu/drm/i915/intel_drv.h
    @@ -383,8 +383,7 @@ extern u32 intel_panel_get_max_backlight(struct drm_device *dev);
    extern u32 intel_panel_get_backlight(struct drm_device *dev);
    extern void intel_panel_set_backlight(struct drm_device *dev, u32 level);
    extern int intel_panel_setup_backlight(struct drm_device *dev);
    -extern void intel_panel_enable_backlight(struct drm_device *dev,
    - enum pipe pipe);
    +extern void intel_panel_enable_backlight(struct drm_device *dev);
    extern void intel_panel_disable_backlight(struct drm_device *dev);
    extern void intel_panel_destroy_backlight(struct drm_device *dev);
    extern enum drm_connector_status intel_panel_detect(struct drm_device *dev);
    diff --git a/drivers/gpu/drm/i915/intel_lvds.c b/drivers/gpu/drm/i915/intel_lvds.c
    index e05c0d3..6547904 100644
    --- a/drivers/gpu/drm/i915/intel_lvds.c
    +++ b/drivers/gpu/drm/i915/intel_lvds.c
    @@ -71,7 +71,6 @@ static struct intel_lvds *intel_attached_lvds(struct drm_connector *connector)
    static void intel_lvds_enable(struct intel_lvds *intel_lvds)
    {
    struct drm_device *dev = intel_lvds->base.base.dev;
    - struct intel_crtc *intel_crtc = to_intel_crtc(intel_lvds->base.base.crtc);
    struct drm_i915_private *dev_priv = dev->dev_private;
    u32 ctl_reg, lvds_reg, stat_reg;

    @@ -108,7 +107,7 @@ static void intel_lvds_enable(struct intel_lvds *intel_lvds)
    if (wait_for((I915_READ(stat_reg) & PP_ON) != 0, 1000))
    DRM_ERROR("timed out waiting for panel to power on\n");

    - intel_panel_enable_backlight(dev, intel_crtc->pipe);
    + intel_panel_enable_backlight(dev);
    }

    static void intel_lvds_disable(struct intel_lvds *intel_lvds)
    @@ -1079,14 +1078,35 @@ bool intel_lvds_init(struct drm_device *dev)
    goto failed;

    out:
    - /*
    - * Unlock registers and just
    - * leave them unlocked
    - */
    if (HAS_PCH_SPLIT(dev)) {
    + u32 pwm;
    +
    + pipe = (I915_READ(PCH_LVDS) & LVDS_PIPEB_SELECT) ? 1 : 0;
    +
    + /* make sure PWM is enabled and locked to the LVDS pipe */
    + pwm = I915_READ(BLC_PWM_CPU_CTL2);
    + if (pipe == 0 && (pwm & BLM_PIPE_B))
    + I915_WRITE(BLC_PWM_CPU_CTL2, pwm & ~BLM_PWM_ENABLE);
    + if (pipe)
    + pwm |= BLM_PIPE_B;
    + else
    + pwm &= ~BLM_PIPE_B;
    + I915_WRITE(BLC_PWM_CPU_CTL2, pwm | BLM_PWM_ENABLE);
    +
    + pwm = I915_READ(BLC_PWM_PCH_CTL1);
    + pwm |= BLM_PCH_PWM_ENABLE;
    + I915_WRITE(BLC_PWM_PCH_CTL1, pwm);
    + /*
    + * Unlock registers and just
    + * leave them unlocked
    + */
    I915_WRITE(PCH_PP_CONTROL,
    I915_READ(PCH_PP_CONTROL) | PANEL_UNLOCK_REGS);
    } else {
    + /*
    + * Unlock registers and just
    + * leave them unlocked
    + */
    I915_WRITE(PP_CONTROL,
    I915_READ(PP_CONTROL) | PANEL_UNLOCK_REGS);
    }
    diff --git a/drivers/gpu/drm/i915/intel_panel.c b/drivers/gpu/drm/i915/intel_panel.c
    index 10c7d39..7180cc8 100644
    --- a/drivers/gpu/drm/i915/intel_panel.c
    +++ b/drivers/gpu/drm/i915/intel_panel.c
    @@ -287,24 +287,9 @@ void intel_panel_disable_backlight(struct drm_device *dev)

    dev_priv->backlight_enabled = false;
    intel_panel_actually_set_backlight(dev, 0);
    -
    - if (INTEL_INFO(dev)->gen >= 4) {
    - uint32_t reg, tmp;
    -
    - reg = HAS_PCH_SPLIT(dev) ? BLC_PWM_CPU_CTL2 : BLC_PWM_CTL2;
    -
    - I915_WRITE(reg, I915_READ(reg) & ~BLM_PWM_ENABLE);
    -
    - if (HAS_PCH_SPLIT(dev)) {
    - tmp = I915_READ(BLC_PWM_PCH_CTL1);
    - tmp &= ~BLM_PCH_PWM_ENABLE;
    - I915_WRITE(BLC_PWM_PCH_CTL1, tmp);
    - }
    - }
    }

    -void intel_panel_enable_backlight(struct drm_device *dev,
    - enum pipe pipe)
    +void intel_panel_enable_backlight(struct drm_device *dev)
    {
    struct drm_i915_private *dev_priv = dev->dev_private;

    @@ -313,40 +298,6 @@ void intel_panel_enable_backlight(struct drm_device *dev,

    dev_priv->backlight_enabled = true;
    intel_panel_actually_set_backlight(dev, dev_priv->backlight_level);
    -
    - if (INTEL_INFO(dev)->gen >= 4) {
    - uint32_t reg, tmp;
    -
    - reg = HAS_PCH_SPLIT(dev) ? BLC_PWM_CPU_CTL2 : BLC_PWM_CTL2;
    -
    -
    - tmp = I915_READ(reg);
    -
    - /* Note that this can also get called through dpms changes. And
    - * we don't track the backlight dpms state, hence check whether
    - * we have to do anything first. */
    - if (tmp & BLM_PWM_ENABLE)
    - return;
    -
    - if (dev_priv->num_pipe == 3)
    - tmp &= ~BLM_PIPE_SELECT_IVB;
    - else
    - tmp &= ~BLM_PIPE_SELECT;
    -
    - tmp |= BLM_PIPE(pipe);
    - tmp &= ~BLM_PWM_ENABLE;
    -
    - I915_WRITE(reg, tmp);
    - POSTING_READ(reg);
    - I915_WRITE(reg, tmp | BLM_PWM_ENABLE);
    -
    - if (HAS_PCH_SPLIT(dev)) {
    - tmp = I915_READ(BLC_PWM_PCH_CTL1);
    - tmp |= BLM_PCH_PWM_ENABLE;
    - tmp &= ~BLM_PCH_OVERRIDE_ENABLE;
    - I915_WRITE(BLC_PWM_PCH_CTL1, tmp);
    - }
    - }
    }

    static void intel_panel_init_backlight(struct drm_device *dev)

    \
     
     \ /
      Last update: 2012-08-12 21:02    [W:0.032 / U:60.020 seconds]
    ©2003-2016 Jasper Spaans. hosted at Digital OceanAdvertise on this site