[PATCH xf86-video-amdgpu] Handle Zaphod mode correctly in amdgpu_mode_hotplug

Alex Deucher alexdeucher at gmail.com
Thu May 12 15:30:27 UTC 2016


On Thu, May 12, 2016 at 3:43 AM, Michel Dänzer <michel at daenzer.net> wrote:
> From: Michel Dänzer <michel.daenzer at amd.com>
>
> We need to scan both screens of the entity for existing connectors, and
> enumerate DVI & HDMI connectors consistently regardless of which screen
> they're assigned to.
>
> Fixes crash when hot-(un)plugging connectors in Zaphod mode.
>
> Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=93415
> (Ported from radeon commit c801f9f10a5d72d935faf21e72f7e7808fb4f05f)

Ugh.  I thought we had dropped that code when we started amdgpu.  Oh well.
Reviewed-by: Alex Deucher <alexander.deucher at amd.com>

>
> Signed-off-by: Michel Dänzer <michel.daenzer at amd.com>
> ---
>  src/drmmode_display.c | 44 ++++++++++++++++++++++++++++++++++----------
>  1 file changed, 34 insertions(+), 10 deletions(-)
>
> diff --git a/src/drmmode_display.c b/src/drmmode_display.c
> index 64ee489..7b326bb 100644
> --- a/src/drmmode_display.c
> +++ b/src/drmmode_display.c
> @@ -36,6 +36,7 @@
>  #include "damagestr.h"
>  #include "micmap.h"
>  #include "xf86cmap.h"
> +#include "xf86Priv.h"
>  #include "sarea.h"
>
>  #include "drmmode_display.h"
> @@ -2362,9 +2363,10 @@ amdgpu_mode_hotplug(ScrnInfoPtr scrn, drmmode_ptr drmmode)
>         xf86CrtcConfigPtr config = XF86_CRTC_CONFIG_PTR(scrn);
>         AMDGPUEntPtr pAMDGPUEnt = AMDGPUEntPriv(scrn);
>         drmModeResPtr mode_res;
> -       int i, j;
> +       int i, j, s;
>         Bool found;
>         Bool changed = FALSE;
> +       int num_dvi = 0, num_hdmi = 0;
>
>         mode_res = drmModeGetResources(pAMDGPUEnt->fd);
>         if (!mode_res)
> @@ -2400,21 +2402,43 @@ restart_destroy:
>         for (i = 0; i < mode_res->count_connectors; i++) {
>                 found = FALSE;
>
> -               for (j = 0; j < config->num_output; j++) {
> -                       xf86OutputPtr output = config->output[j];
> -                       drmmode_output_private_ptr drmmode_output;
> +               for (s = 0; !found && s < xf86NumScreens; s++) {
> +                       ScrnInfoPtr loop_scrn = xf86Screens[s];
> +                       xf86CrtcConfigPtr loop_config =
> +                               XF86_CRTC_CONFIG_PTR(loop_scrn);
>
> -                       drmmode_output = output->driver_private;
> -                       if (mode_res->connectors[i] == drmmode_output->output_id) {
> -                               found = TRUE;
> -                               break;
> +                       if (AMDGPUEntPriv(loop_scrn) != pAMDGPUEnt)
> +                               continue;
> +
> +                       for (j = 0; !found && j < loop_config->num_output; j++) {
> +                               xf86OutputPtr output = loop_config->output[j];
> +                               drmmode_output_private_ptr drmmode_output;
> +
> +                               drmmode_output = output->driver_private;
> +                               if (mode_res->connectors[i] ==
> +                                   drmmode_output->output_id) {
> +                                       found = TRUE;
> +
> +                                       switch(drmmode_output->mode_output->connector_type) {
> +                                       case DRM_MODE_CONNECTOR_DVII:
> +                                       case DRM_MODE_CONNECTOR_DVID:
> +                                       case DRM_MODE_CONNECTOR_DVIA:
> +                                               num_dvi++;
> +                                               break;
> +                                       case DRM_MODE_CONNECTOR_HDMIA:
> +                                       case DRM_MODE_CONNECTOR_HDMIB:
> +                                               num_hdmi++;
> +                                               break;
> +                                       }
> +                               }
>                         }
>                 }
>                 if (found)
>                         continue;
>
> -               changed = TRUE;
> -               drmmode_output_init(scrn, drmmode, mode_res, i, NULL, NULL, 1);
> +               if (drmmode_output_init(scrn, drmmode, mode_res, i, &num_dvi,
> +                                       &num_hdmi, 1) != 0)
> +                       changed = TRUE;
>         }
>
>         if (changed) {
> --
> 2.8.1
>
> _______________________________________________
> xorg-driver-ati mailing list
> xorg-driver-ati at lists.x.org
> https://lists.x.org/mailman/listinfo/xorg-driver-ati


More information about the xorg-driver-ati mailing list