xf86-video-ati: Branch 'master' - 3 commits

Michel Dänzer daenzer at kemper.freedesktop.org
Thu Nov 10 03:26:47 UTC 2016


 src/drmmode_display.c |   75 ++++++++++++++++++++++++++------------------------
 src/radeon_dri2.c     |   16 +++++-----
 src/radeon_kms.c      |    5 +++
 src/radeon_probe.h    |    2 +
 4 files changed, 54 insertions(+), 44 deletions(-)

New commits:
commit 9760ef33cba5795eddeda4d5c2fcbe2dcce21689
Author: Michel Dänzer <michel.daenzer at amd.com>
Date:   Tue Nov 8 13:02:43 2016 +0900

    Use pRADEONEnt to find both screens of a GPU in radeon_mode_hotplug
    
    Fixes misbehaviour when hotplugging DisplayPort connectors on secondary
    GPUs.
    
    Fixes: c801f9f10a5d ("Handle Zaphod mode correctly in radeon_mode_hotplug")
    Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=98626
    Reviewed-by: Alex Deucher <alexander.deucher at amd.com>

diff --git a/src/drmmode_display.c b/src/drmmode_display.c
index fd5c80e..070979d 100644
--- a/src/drmmode_display.c
+++ b/src/drmmode_display.c
@@ -2580,7 +2580,7 @@ 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, s;
+	int i, j;
 	Bool found;
 	Bool changed = FALSE;
 	int num_dvi = 0, num_hdmi = 0;
@@ -2617,20 +2617,13 @@ restart_destroy:
 
 	/* find new output ids we don't have outputs for */
 	for (i = 0; i < mode_res->count_connectors; i++) {
-		found = FALSE;
-
-		for (s = 0; !found && s < xf86NumScreens; s++) {
-			ScrnInfoPtr loop_scrn = xf86Screens[s];
-
-			if (strcmp(loop_scrn->driverName, scrn->driverName) ||
-			    RADEONEntPriv(loop_scrn) != pRADEONEnt)
-				continue;
-
-			found = drmmode_find_output(loop_scrn,
-						    mode_res->connectors[i],
-						    &num_dvi, &num_hdmi);
-		}
-		if (found)
+		if (drmmode_find_output(pRADEONEnt->primary_scrn,
+					mode_res->connectors[i],
+					&num_dvi, &num_hdmi) ||
+		    (pRADEONEnt->secondary_scrn &&
+		     drmmode_find_output(pRADEONEnt->secondary_scrn,
+					 mode_res->connectors[i],
+					 &num_dvi, &num_hdmi)))
 			continue;
 
 		if (drmmode_output_init(scrn, drmmode, mode_res, i, &num_dvi,
diff --git a/src/radeon_kms.c b/src/radeon_kms.c
index 6927f58..ee2becd 100644
--- a/src/radeon_kms.c
+++ b/src/radeon_kms.c
@@ -1659,6 +1659,11 @@ Bool RADEONPreInit_KMS(ScrnInfoPtr pScrn, int flags)
         }
     }
 
+    if (info->IsSecondary)
+	pRADEONEnt->secondary_scrn = pScrn;
+    else
+	pRADEONEnt->primary_scrn = pScrn;
+
     info->PciInfo = xf86GetPciInfoForEntity(info->pEnt->index);
     pScrn->monitor     = pScrn->confScreen->monitor;
 
diff --git a/src/radeon_probe.h b/src/radeon_probe.h
index 258c7be..573d988 100644
--- a/src/radeon_probe.h
+++ b/src/radeon_probe.h
@@ -139,6 +139,8 @@ typedef struct
     unsigned long     fd_wakeup_registered; /* server generation for which fd has been registered for wakeup handling */
     int fd_wakeup_ref;
     unsigned int assigned_crtcs;
+    ScrnInfoPtr primary_scrn;
+    ScrnInfoPtr secondary_scrn;
 #ifdef XSERVER_PLATFORM_BUS
     struct xf86_platform_device *platform_dev;
 #endif
commit 35bec4937d89b48a79acfcb4f814b7370cb631b2
Author: Michel Dänzer <michel.daenzer at amd.com>
Date:   Tue Nov 8 13:01:58 2016 +0900

    Refactor radeon_mode_hotplug
    
    Preparation for the next change, no functional change intended.
    
    Reviewed-by: Alex Deucher <alexander.deucher at amd.com>

diff --git a/src/drmmode_display.c b/src/drmmode_display.c
index 28b932e..fd5c80e 100644
--- a/src/drmmode_display.c
+++ b/src/drmmode_display.c
@@ -2543,6 +2543,37 @@ Bool drmmode_setup_colormap(ScreenPtr pScreen, ScrnInfoPtr pScrn)
     return TRUE;
 }
 
+static Bool
+drmmode_find_output(ScrnInfoPtr scrn, int output_id, int *num_dvi,
+		    int *num_hdmi)
+{
+	xf86CrtcConfigPtr config = XF86_CRTC_CONFIG_PTR(scrn);
+	int i;
+
+	for (i = 0; i < config->num_output; i++) {
+		xf86OutputPtr output = config->output[i];
+		drmmode_output_private_ptr drmmode_output = output->driver_private;
+
+		if (drmmode_output->output_id == output_id) {
+			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;
+			}
+
+			return TRUE;
+		}
+	}
+
+	return FALSE;
+}
+
 void
 radeon_mode_hotplug(ScrnInfoPtr scrn, drmmode_ptr drmmode)
 {
@@ -2590,35 +2621,14 @@ restart_destroy:
 
 		for (s = 0; !found && s < xf86NumScreens; s++) {
 			ScrnInfoPtr loop_scrn = xf86Screens[s];
-			xf86CrtcConfigPtr loop_config =
-				XF86_CRTC_CONFIG_PTR(loop_scrn);
 
 			if (strcmp(loop_scrn->driverName, scrn->driverName) ||
 			    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;
-					}
-				}
-			}
+			found = drmmode_find_output(loop_scrn,
+						    mode_res->connectors[i],
+						    &num_dvi, &num_hdmi);
 		}
 		if (found)
 			continue;
commit be9f67339a19a6649eab52aa2e0c8971cd9b4727
Author: Michel Dänzer <michel.daenzer at amd.com>
Date:   Mon Nov 7 16:34:37 2016 +0900

    Reindent code in radeon_dri2_create_buffer2
    
    Fixes warning about misleading indentation from recent versions of gcc:
    
    ../../src/radeon_dri2.c: In function ‘radeon_dri2_create_buffer2’:
    ../../src/radeon_dri2.c:224:2: warning: this ‘if’ clause does not guard... [-Wmisleading-indentation]
      if (flags & RADEON_CREATE_PIXMAP_TILING_MACRO)
      ^~
    ../../src/radeon_dri2.c:227:6: note: ...this statement, but the latter is misleadingly indented as if it is guarded by the ‘if’
          if (aligned_width == front_width)
          ^~
    
    No functional change intended.
    
    Reviewed-by: Alex Deucher <alexander.deucher at amd.com>

diff --git a/src/radeon_dri2.c b/src/radeon_dri2.c
index 1206b2a..8112670 100644
--- a/src/radeon_dri2.c
+++ b/src/radeon_dri2.c
@@ -224,14 +224,14 @@ radeon_dri2_create_buffer2(ScreenPtr pScreen,
 	if (flags & RADEON_CREATE_PIXMAP_TILING_MACRO)
 	    tiling |= RADEON_TILING_MACRO;
 
-	    if (aligned_width == front_width)
-		aligned_width = pScrn->virtualX;
-
-	    pixmap = (*pScreen->CreatePixmap)(pScreen,
-					      aligned_width,
-					      height,
-					      depth,
-					      flags | RADEON_CREATE_PIXMAP_DRI2);
+	if (aligned_width == front_width)
+	    aligned_width = pScrn->virtualX;
+
+	pixmap = (*pScreen->CreatePixmap)(pScreen,
+					  aligned_width,
+					  height,
+					  depth,
+					  flags | RADEON_CREATE_PIXMAP_DRI2);
     }
 
     buffers = calloc(1, sizeof *buffers);


More information about the xorg-commit mailing list