diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/amdgpu_drv.h | 2 | ||||
-rw-r--r-- | src/amdgpu_kms.c | 38 | ||||
-rw-r--r-- | src/amdgpu_probe.c | 16 | ||||
-rw-r--r-- | src/amdgpu_probe.h | 4 | ||||
-rw-r--r-- | src/drmmode_display.c | 38 |
5 files changed, 59 insertions, 39 deletions
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, |