On Tue, Apr 19, 2016 at 3:41 AM, Michel Dänzer <mic...@daenzer.net> wrote: > From: Michel Dänzer <michel.daen...@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 DVI or HDMI connector in Zaphod mode. > > Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=93415 > Signed-off-by: Michel Dänzer <michel.daen...@amd.com>
Reviewed-by: Alex Deucher <alexander.deuc...@amd.com> > --- > src/drmmode_display.c | 45 +++++++++++++++++++++++++++++++++++---------- > 1 file changed, 35 insertions(+), 10 deletions(-) > > diff --git a/src/drmmode_display.c b/src/drmmode_display.c > index 4c66ca7..84c07c6 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 "radeon.h" > #include "radeon_bo_helper.h" > #include "radeon_glamor.h" > @@ -2514,10 +2515,12 @@ void > radeon_mode_hotplug(ScrnInfoPtr scrn, drmmode_ptr drmmode) > { > xf86CrtcConfigPtr config = XF86_CRTC_CONFIG_PTR(scrn); > + RADEONEntPtr pRADEONEnt = RADEONEntPriv(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(drmmode->fd); > if (!mode_res) > @@ -2553,21 +2556,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 (RADEONEntPriv(loop_scrn) != pRADEONEnt) > + 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.0.rc3 > > _______________________________________________ > xorg-driver-ati mailing list > xorg-driver-ati@lists.x.org > https://lists.x.org/mailman/listinfo/xorg-driver-ati _______________________________________________ xorg-driver-ati mailing list xorg-driver-ati@lists.x.org https://lists.x.org/mailman/listinfo/xorg-driver-ati