xf86-video-amdgpu: Branch 'master'

GitLab Mirror gitlab-mirror at kemper.freedesktop.org
Wed Oct 24 15:39:03 UTC 2018


 src/amdgpu_drv.h      |    2 +-
 src/amdgpu_kms.c      |   38 ++++++++++++++++----------------------
 src/amdgpu_probe.c    |   16 ++++++++++++++++
 src/amdgpu_probe.h    |    4 ++--
 src/drmmode_display.c |   38 ++++++++++++++++++++++++--------------
 5 files changed, 59 insertions(+), 39 deletions(-)

New commits:
commit c9d43c1deb9a9cfc41a8d6439caf46d12d220853
Author: Michel Dänzer <michel.daenzer at amd.com>
Date:   Thu Oct 4 12:54:13 2018 +0200

    Allow up to six instances in Zaphod mode
    
    Corresponding to up to six CRTCs being available in the hardware.
    
    v2:
    * Move instance overflow check from PreInit to the probe hooks, in
      order to further minimize wasted effort.
    
    Reviewed-by: Alex Deucher <alexander.deucher at amd.com> # v1

diff --git a/src/amdgpu_drv.h b/src/amdgpu_drv.h
index 45bc394..44c769f 100644
--- a/src/amdgpu_drv.h
+++ b/src/amdgpu_drv.h
@@ -285,7 +285,7 @@ typedef struct {
 	/* Number of SW cursors currently visible on this screen */
 	int sprites_visible;
 
-	Bool IsSecondary;
+	int instance_id;
 
 	Bool shadow_fb;
 	void *fb_shadow;
diff --git a/src/amdgpu_kms.c b/src/amdgpu_kms.c
index 87c06d3..5a5fee2 100644
--- a/src/amdgpu_kms.c
+++ b/src/amdgpu_kms.c
@@ -123,17 +123,18 @@ static void AMDGPUFreeRec(ScrnInfoPtr pScrn)
 	if (!pScrn)
 		return;
 
+	pEnt = xf86GetEntityInfo(pScrn->entityList[pScrn->numEntities - 1]);
+	pPriv = xf86GetEntityPrivate(pEnt->index, gAMDGPUEntityIndex);
+	pAMDGPUEnt = pPriv->ptr;
+
 	info = AMDGPUPTR(pScrn);
 	if (info) {
-		pEnt = info->pEnt;
+		pAMDGPUEnt->scrn[info->instance_id] = NULL;
+		pAMDGPUEnt->num_scrns--;
 		free(pScrn->driverPrivate);
 		pScrn->driverPrivate = NULL;
-	} else {
-		pEnt = xf86GetEntityInfo(pScrn->entityList[pScrn->numEntities - 1]);
 	}
 
-	pPriv = xf86GetEntityPrivate(pEnt->index, gAMDGPUEntityIndex);
-	pAMDGPUEnt = pPriv->ptr;
 	if (pAMDGPUEnt->fd > 0) {
 		DevUnion *pPriv;
 		AMDGPUEntPtr pAMDGPUEnt;
@@ -1317,7 +1318,6 @@ Bool AMDGPUPreInit_KMS(ScrnInfoPtr pScrn, int flags)
 	AMDGPUEntPtr pAMDGPUEnt;
 	struct amdgpu_gpu_info gpu_info;
 	MessageType from;
-	DevUnion *pPriv;
 	Gamma zeros = { 0.0, 0.0, 0.0 };
 	int cpp;
 	uint64_t heap_size = 0;
@@ -1331,11 +1331,17 @@ Bool AMDGPUPreInit_KMS(ScrnInfoPtr pScrn, int flags)
 		       "AMDGPUPreInit_KMS\n");
 	if (pScrn->numEntities != 1)
 		return FALSE;
+
+	pAMDGPUEnt = xf86GetEntityPrivate(pScrn->entityList[0],
+					  getAMDGPUEntityIndex())->ptr;
+
 	if (!AMDGPUGetRec(pScrn))
 		return FALSE;
 
 	info = AMDGPUPTR(pScrn);
-	info->IsSecondary = FALSE;
+	info->instance_id = pAMDGPUEnt->num_scrns++;
+	pAMDGPUEnt->scrn[info->instance_id] = pScrn;
+
 	info->pEnt =
 	    xf86GetEntityInfo(pScrn->entityList[pScrn->numEntities - 1]);
 	if (info->pEnt->location.type != BUS_PCI
@@ -1345,23 +1351,11 @@ Bool AMDGPUPreInit_KMS(ScrnInfoPtr pScrn, int flags)
 	    )
 		return FALSE;
 
-	pPriv = xf86GetEntityPrivate(pScrn->entityList[0],
-				     getAMDGPUEntityIndex());
-	pAMDGPUEnt = pPriv->ptr;
-
-	if (xf86IsEntityShared(pScrn->entityList[0])) {
-		if (xf86IsPrimInitDone(pScrn->entityList[0])) {
-			info->IsSecondary = TRUE;
-		} else {
-			xf86SetPrimInitDone(pScrn->entityList[0]);
-		}
+	if (xf86IsEntityShared(pScrn->entityList[0]) &&
+	    info->instance_id == 0) {
+		xf86SetPrimInitDone(pScrn->entityList[0]);
 	}
 
-	if (info->IsSecondary)
-		pAMDGPUEnt->secondary_scrn = pScrn;
-	else
-		pAMDGPUEnt->primary_scrn = pScrn;
-
 	info->PciInfo = xf86GetPciInfoForEntity(info->pEnt->index);
 	pScrn->monitor = pScrn->confScreen->monitor;
 
diff --git a/src/amdgpu_probe.c b/src/amdgpu_probe.c
index 9eeb84d..2dc934f 100644
--- a/src/amdgpu_probe.c
+++ b/src/amdgpu_probe.c
@@ -252,6 +252,14 @@ static Bool amdgpu_get_scrninfo(int entity_num, struct pci_device *pci_dev)
 		}
 	} else {
 		pAMDGPUEnt = pPriv->ptr;
+
+		if (pAMDGPUEnt->fd_ref == ARRAY_SIZE(pAMDGPUEnt->scrn)) {
+			xf86DrvMsg(pScrn->scrnIndex, X_ERROR,
+				   "Only up to %u Zaphod instances supported\n",
+				   (unsigned)ARRAY_SIZE(pAMDGPUEnt->scrn));
+			goto error;
+		}
+
 		pAMDGPUEnt->fd_ref++;
 	}
 
@@ -366,6 +374,14 @@ amdgpu_platform_probe(DriverPtr pDriver,
 		}
 	} else {
 		pAMDGPUEnt = pPriv->ptr;
+
+		if (pAMDGPUEnt->fd_ref == ARRAY_SIZE(pAMDGPUEnt->scrn)) {
+			xf86DrvMsg(pScrn->scrnIndex, X_ERROR,
+				   "Only up to %u Zaphod instances supported\n",
+				   (unsigned)ARRAY_SIZE(pAMDGPUEnt->scrn));
+			goto error;
+		}
+
 		pAMDGPUEnt->fd_ref++;
 	}
 
diff --git a/src/amdgpu_probe.h b/src/amdgpu_probe.h
index 5f61aab..306c9a5 100644
--- a/src/amdgpu_probe.h
+++ b/src/amdgpu_probe.h
@@ -65,8 +65,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;
+	unsigned int num_scrns;
+	ScrnInfoPtr scrn[6];
 	struct xf86_platform_device *platform_dev;
 	char *render_node;
 } AMDGPUEntRec, *AMDGPUEntPtr;
diff --git a/src/drmmode_display.c b/src/drmmode_display.c
index 9065e0f..ec45d57 100644
--- a/src/drmmode_display.c
+++ b/src/drmmode_display.c
@@ -2669,9 +2669,7 @@ drmmode_output_init(ScrnInfoPtr pScrn, drmmode_ptr drmmode, drmModeResPtr mode_r
 			if (!AMDGPUZaphodStringMatches(pScrn, s, name))
 				goto out_free_encoders;
 		} else {
-			if (!info->IsSecondary && (num != 0))
-				goto out_free_encoders;
-			else if (info->IsSecondary && (num != 1))
+			if (info->instance_id != num)
 				goto out_free_encoders;
 		}
 	}
@@ -3267,6 +3265,7 @@ Bool drmmode_pre_init(ScrnInfoPtr pScrn, drmmode_ptr drmmode, int cpp)
 	AMDGPUInfoPtr info = AMDGPUPTR(pScrn);
 	int i, num_dvi = 0, num_hdmi = 0;
 	unsigned int crtcs_needed = 0;
+	unsigned int crtcs_got = 0;
 	drmModeResPtr mode_res;
 	char *bus_id_string, *provider_name;
 
@@ -3307,16 +3306,26 @@ Bool drmmode_pre_init(ScrnInfoPtr pScrn, drmmode_ptr drmmode, int cpp)
 	if (pScrn->depth == 30 && !drmmode_cm_enabled(drmmode))
 		info->drmmode_crtc_funcs.gamma_set = NULL;
 
-	for (i = 0; i < mode_res->count_crtcs; i++)
+	for (i = 0; i < mode_res->count_crtcs; i++) {
 		if (!xf86IsEntityShared(pScrn->entityList[0]) ||
-		    (crtcs_needed && !(pAMDGPUEnt->assigned_crtcs & (1 << i))))
-			crtcs_needed -= drmmode_crtc_init(pScrn, drmmode, mode_res, i);
+		    (crtcs_got < crtcs_needed &&
+		     !(pAMDGPUEnt->assigned_crtcs & (1 << i))))
+			crtcs_got += drmmode_crtc_init(pScrn, drmmode, mode_res, i);
+	}
 
 	/* All ZaphodHeads outputs provided with matching crtcs? */
-	if (xf86IsEntityShared(pScrn->entityList[0]) && (crtcs_needed > 0))
+	if (crtcs_got < crtcs_needed) {
+		if (crtcs_got == 0) {
+			xf86DrvMsg(pScrn->scrnIndex, X_ERROR,
+				   "No ZaphodHeads CRTC available, needed %u\n",
+				   crtcs_needed);
+			return FALSE;
+		}
+
 		xf86DrvMsg(pScrn->scrnIndex, X_WARNING,
 			   "%d ZaphodHeads crtcs unavailable. Some outputs will stay off.\n",
 			   crtcs_needed);
+	}
 
 	/* workout clones */
 	drmmode_clones_init(pScrn, drmmode, mode_res);
@@ -3769,13 +3778,14 @@ restart_destroy:
 
 	/* find new output ids we don't have outputs for */
 	for (i = 0; i < mode_res->count_connectors; i++) {
-		if (drmmode_find_output(pAMDGPUEnt->primary_scrn,
-					mode_res->connectors[i],
-					&num_dvi, &num_hdmi) ||
-		    (pAMDGPUEnt->secondary_scrn &&
-		     drmmode_find_output(pAMDGPUEnt->secondary_scrn,
-					 mode_res->connectors[i],
-					 &num_dvi, &num_hdmi)))
+		for (j = 0; j < pAMDGPUEnt->num_scrns; j++) {
+			if (drmmode_find_output(pAMDGPUEnt->scrn[j],
+						mode_res->connectors[i],
+						&num_dvi, &num_hdmi))
+				break;
+		}
+
+		if (j < pAMDGPUEnt->num_scrns)
 			continue;
 
 		if (drmmode_output_init(scrn, drmmode, mode_res, i, &num_dvi,


More information about the xorg-commit mailing list