[1/2] drm/radeon: Fix eDP for single-display iMac10,1

Submitted by Mario Kleiner on March 6, 2016, 1:39 a.m.

Details

Message ID 1457228393-23650-1-git-send-email-mario.kleiner.de@gmail.com
State New
Headers show
Series "Series without cover letter" ( rev: 1 ) in DRI devel

Not browsing as part of any series.

Commit Message

Mario Kleiner March 6, 2016, 1:39 a.m.
The late 2009, 27 inch Apple iMac10,1 has an
internal eDP display and an external Mini-
Displayport output, driven by a DCE-3.2, RV730
Radeon Mobility HD-4670.

The machine worked fine in a dual-display setup
with eDP panel + externally connected HDMI
or DVI-D digital display sink, connected via
MiniDP to DVI or HDMI adapter.

However, booting the machine single-display with
only eDP panel results in a completely black
display - even backlight powering off, as soon as
the radeon modesetting driver loads.

This patch fixes the single dispay eDP case by
assigning encoders based on dig->linkb, similar
to DCE-4+. While this should not be generally
necessary (Alex: "...atom on normal boards
should be able to handle any mapping."), Apple
seems to use some special routing here.

One remaining problem not solved by this patch
is that an external Minidisplayport->DP sink
does still not work on iMac10,1, whereas external
DVI and HDMI sinks continue to work.

The problem affects at least all tested kernels
since Linux 3.13 - didn't test earlier kernels, so
backporting to stable probably makes sense.

Signed-off-by: Mario Kleiner <mario.kleiner.de@gmail.com>
Cc: <stable@vger.kernel.org>
---
 drivers/gpu/drm/radeon/atombios_encoders.c | 10 ++++++++--
 1 file changed, 8 insertions(+), 2 deletions(-)

Patch hide | download patch | download mbox

diff --git a/drivers/gpu/drm/radeon/atombios_encoders.c b/drivers/gpu/drm/radeon/atombios_encoders.c
index 01b20e1..a28377c 100644
--- a/drivers/gpu/drm/radeon/atombios_encoders.c
+++ b/drivers/gpu/drm/radeon/atombios_encoders.c
@@ -2176,9 +2176,15 @@  int radeon_atom_pick_dig_encoder(struct drm_encoder *encoder, int fe_idx)
 		goto assigned;
 	}
 
-	/* on DCE32 and encoder can driver any block so just crtc id */
+	/*
+	 * On DCE32 any encoder can drive any block so could just use crtc id,
+	 * but Apple thinks different at least on iMac10,1, so use linkb.
+	 */
 	if (ASIC_IS_DCE32(rdev)) {
-		enc_idx = radeon_crtc->crtc_id;
+		if (dig->linkb)
+			enc_idx = 1;
+		else
+			enc_idx = 0;
 		goto assigned;
 	}
 

Comments

On Sat, Mar 5, 2016 at 8:39 PM, Mario Kleiner
<mario.kleiner.de@gmail.com> wrote:
> The late 2009, 27 inch Apple iMac10,1 has an
> internal eDP display and an external Mini-
> Displayport output, driven by a DCE-3.2, RV730
> Radeon Mobility HD-4670.
>
> The machine worked fine in a dual-display setup
> with eDP panel + externally connected HDMI
> or DVI-D digital display sink, connected via
> MiniDP to DVI or HDMI adapter.
>
> However, booting the machine single-display with
> only eDP panel results in a completely black
> display - even backlight powering off, as soon as
> the radeon modesetting driver loads.
>
> This patch fixes the single dispay eDP case by
> assigning encoders based on dig->linkb, similar
> to DCE-4+. While this should not be generally
> necessary (Alex: "...atom on normal boards
> should be able to handle any mapping."), Apple
> seems to use some special routing here.
>
> One remaining problem not solved by this patch
> is that an external Minidisplayport->DP sink
> does still not work on iMac10,1, whereas external
> DVI and HDMI sinks continue to work.
>
> The problem affects at least all tested kernels
> since Linux 3.13 - didn't test earlier kernels, so
> backporting to stable probably makes sense.
>
> Signed-off-by: Mario Kleiner <mario.kleiner.de@gmail.com>
> Cc: <stable@vger.kernel.org>

Actually, thinking about this more, this probably needs more
investigation.  There are only two front end encoders, but up to 5
backend transmitters (2 transmitters with 2 links each and 1
transmitter with 1 link) that can be used independently so if you hard
code the front end to backend link, you will not end up with valid
routing in some cases.  E.g., if you have two connectors using linka
of the transmitters you'll end up with the same front end when you
really want separate front ends.

Alex

> ---
>  drivers/gpu/drm/radeon/atombios_encoders.c | 10 ++++++++--
>  1 file changed, 8 insertions(+), 2 deletions(-)
>
> diff --git a/drivers/gpu/drm/radeon/atombios_encoders.c b/drivers/gpu/drm/radeon/atombios_encoders.c
> index 01b20e1..a28377c 100644
> --- a/drivers/gpu/drm/radeon/atombios_encoders.c
> +++ b/drivers/gpu/drm/radeon/atombios_encoders.c
> @@ -2176,9 +2176,15 @@ int radeon_atom_pick_dig_encoder(struct drm_encoder *encoder, int fe_idx)
>                 goto assigned;
>         }
>
> -       /* on DCE32 and encoder can driver any block so just crtc id */
> +       /*
> +        * On DCE32 any encoder can drive any block so could just use crtc id,
> +        * but Apple thinks different at least on iMac10,1, so use linkb.
> +        */
>         if (ASIC_IS_DCE32(rdev)) {
> -               enc_idx = radeon_crtc->crtc_id;
> +               if (dig->linkb)
> +                       enc_idx = 1;
> +               else
> +                       enc_idx = 0;
>                 goto assigned;
>         }
>
> --
> 2.7.0
>
> _______________________________________________
> dri-devel mailing list
> dri-devel@lists.freedesktop.org
> https://lists.freedesktop.org/mailman/listinfo/dri-devel