| From 1348579433566355e570008929daa09a0db64fd8 Mon Sep 17 00:00:00 2001 |
| From: Alex Deucher <alexander.deucher@amd.com> |
| Date: Fri, 14 Nov 2014 12:08:34 -0500 |
| Subject: drm/radeon: report disconnected for LVDS/eDP with PX if ddc fails |
| |
| From: Alex Deucher <alexander.deucher@amd.com> |
| |
| commit 1348579433566355e570008929daa09a0db64fd8 upstream. |
| |
| If ddc fails, presumably the i2c mux (and hopefully the signal |
| mux) are switched to the other GPU so don't fetch the edid from |
| the vbios so that the connector reports disconnected. |
| |
| bug: |
| https://bugzilla.opensuse.org/show_bug.cgi?id=904417 |
| |
| Signed-off-by: Alex Deucher <alexander.deucher@amd.com> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| |
| --- |
| drivers/gpu/drm/radeon/radeon_connectors.c | 19 ++++++++++++++++++- |
| 1 file changed, 18 insertions(+), 1 deletion(-) |
| |
| --- a/drivers/gpu/drm/radeon/radeon_connectors.c |
| +++ b/drivers/gpu/drm/radeon/radeon_connectors.c |
| @@ -322,6 +322,12 @@ static void radeon_connector_get_edid(st |
| } |
| |
| 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) { |
| /* some laptops provide a hardcoded edid in rom for LCDs */ |
| if (((connector->connector_type == DRM_MODE_CONNECTOR_LVDS) || |
| @@ -826,6 +832,8 @@ static int radeon_lvds_mode_valid(struct |
| static enum drm_connector_status |
| 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 drm_encoder *encoder = radeon_best_single_encoder(connector); |
| enum drm_connector_status ret = connector_status_disconnected; |
| @@ -842,7 +850,11 @@ radeon_lvds_detect(struct drm_connector |
| /* check if panel is valid */ |
| if (native_mode->hdisplay >= 320 && native_mode->vdisplay >= 240) |
| 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 */ |
| @@ -1589,6 +1601,11 @@ radeon_dp_detect(struct drm_connector *c |
| /* check if panel is valid */ |
| if (native_mode->hdisplay >= 320 && native_mode->vdisplay >= 240) |
| 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 */ |
| radeon_dig_connector->dp_sink_type = CONNECTOR_OBJECT_ID_DISPLAYPORT; |