mirror of
https://github.com/X11Libre/xf86-video-amdgpu.git
synced 2026-03-24 01:24:31 +00:00
Handle Zaphod mode correctly in amdgpu_mode_hotplug
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) Reviewed-by: Alex Deucher <alexander.deucher@amd.com>
This commit is contained in:
committed by
Michel Dänzer
parent
861da1d5c2
commit
14606e127f
@@ -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) {
|
||||
|
||||
Reference in New Issue
Block a user