Commit df20ce5a authored by Linus Torvalds's avatar Linus Torvalds

Merge branch 'drm-fixes' of git://people.freedesktop.org/~airlied/linux

Pull drm fixes from Dave Airlie:
 "Two i915 regressions and one dual-gpu laptop radeon fix"

* 'drm-fixes' of git://people.freedesktop.org/~airlied/linux:
  drm/radeon: report disconnected for LVDS/eDP with PX if ddc fails
  drm/i915: Cancel vdd off work before suspend
  drm/i915: Ignore SURFLIVE and flip counter when the GPU gets reset
parents 2f19cad9 21124e5c
...@@ -9408,6 +9408,10 @@ static bool page_flip_finished(struct intel_crtc *crtc) ...@@ -9408,6 +9408,10 @@ static bool page_flip_finished(struct intel_crtc *crtc)
struct drm_device *dev = crtc->base.dev; struct drm_device *dev = crtc->base.dev;
struct drm_i915_private *dev_priv = dev->dev_private; struct drm_i915_private *dev_priv = dev->dev_private;
if (i915_reset_in_progress(&dev_priv->gpu_error) ||
crtc->reset_counter != atomic_read(&dev_priv->gpu_error.reset_counter))
return true;
/* /*
* The relevant registers doen't exist on pre-ctg. * The relevant registers doen't exist on pre-ctg.
* As the flip done interrupt doesn't trigger for mmio * As the flip done interrupt doesn't trigger for mmio
......
...@@ -4450,6 +4450,7 @@ static void intel_dp_encoder_suspend(struct intel_encoder *intel_encoder) ...@@ -4450,6 +4450,7 @@ static void intel_dp_encoder_suspend(struct intel_encoder *intel_encoder)
* vdd might still be enabled do to the delayed vdd off. * vdd might still be enabled do to the delayed vdd off.
* Make sure vdd is actually turned off here. * Make sure vdd is actually turned off here.
*/ */
cancel_delayed_work_sync(&intel_dp->panel_vdd_work);
pps_lock(intel_dp); pps_lock(intel_dp);
edp_panel_vdd_off_sync(intel_dp); edp_panel_vdd_off_sync(intel_dp);
pps_unlock(intel_dp); pps_unlock(intel_dp);
......
...@@ -322,6 +322,12 @@ static void radeon_connector_get_edid(struct drm_connector *connector) ...@@ -322,6 +322,12 @@ static void radeon_connector_get_edid(struct drm_connector *connector)
} }
if (!radeon_connector->edid) { if (!radeon_connector->edid) {
/* don't fetch the edid from the vbios if ddc fails and runpm is
* enabled so we report disconnected.
*/
if ((rdev->flags & RADEON_IS_PX) && (radeon_runtime_pm != 0))
return;
if (rdev->is_atom_bios) { if (rdev->is_atom_bios) {
/* some laptops provide a hardcoded edid in rom for LCDs */ /* some laptops provide a hardcoded edid in rom for LCDs */
if (((connector->connector_type == DRM_MODE_CONNECTOR_LVDS) || if (((connector->connector_type == DRM_MODE_CONNECTOR_LVDS) ||
...@@ -826,6 +832,8 @@ static int radeon_lvds_mode_valid(struct drm_connector *connector, ...@@ -826,6 +832,8 @@ static int radeon_lvds_mode_valid(struct drm_connector *connector,
static enum drm_connector_status static enum drm_connector_status
radeon_lvds_detect(struct drm_connector *connector, bool force) radeon_lvds_detect(struct drm_connector *connector, bool force)
{ {
struct drm_device *dev = connector->dev;
struct radeon_device *rdev = dev->dev_private;
struct radeon_connector *radeon_connector = to_radeon_connector(connector); struct radeon_connector *radeon_connector = to_radeon_connector(connector);
struct drm_encoder *encoder = radeon_best_single_encoder(connector); struct drm_encoder *encoder = radeon_best_single_encoder(connector);
enum drm_connector_status ret = connector_status_disconnected; enum drm_connector_status ret = connector_status_disconnected;
...@@ -842,7 +850,11 @@ radeon_lvds_detect(struct drm_connector *connector, bool force) ...@@ -842,7 +850,11 @@ radeon_lvds_detect(struct drm_connector *connector, bool force)
/* check if panel is valid */ /* check if panel is valid */
if (native_mode->hdisplay >= 320 && native_mode->vdisplay >= 240) if (native_mode->hdisplay >= 320 && native_mode->vdisplay >= 240)
ret = connector_status_connected; ret = connector_status_connected;
/* don't fetch the edid from the vbios if ddc fails and runpm is
* enabled so we report disconnected.
*/
if ((rdev->flags & RADEON_IS_PX) && (radeon_runtime_pm != 0))
ret = connector_status_disconnected;
} }
/* check for edid as well */ /* check for edid as well */
...@@ -1589,6 +1601,11 @@ radeon_dp_detect(struct drm_connector *connector, bool force) ...@@ -1589,6 +1601,11 @@ radeon_dp_detect(struct drm_connector *connector, bool force)
/* check if panel is valid */ /* check if panel is valid */
if (native_mode->hdisplay >= 320 && native_mode->vdisplay >= 240) if (native_mode->hdisplay >= 320 && native_mode->vdisplay >= 240)
ret = connector_status_connected; ret = connector_status_connected;
/* don't fetch the edid from the vbios if ddc fails and runpm is
* enabled so we report disconnected.
*/
if ((rdev->flags & RADEON_IS_PX) && (radeon_runtime_pm != 0))
ret = connector_status_disconnected;
} }
/* eDP is always DP */ /* eDP is always DP */
radeon_dig_connector->dp_sink_type = CONNECTOR_OBJECT_ID_DISPLAYPORT; radeon_dig_connector->dp_sink_type = CONNECTOR_OBJECT_ID_DISPLAYPORT;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment