configure.ac | 5 man/amdgpu.man | 14 src/Makefile.am | 3 src/amdgpu_bo_helper.c | 5 src/amdgpu_chipinfo_gen.h | 1 src/amdgpu_chipset_gen.h | 1 src/amdgpu_dri2.c | 292 ++++++++++++------- src/amdgpu_dri2.h | 1 src/amdgpu_dri3.c | 9 src/amdgpu_drv.h | 4 src/amdgpu_glamor.c | 4 src/amdgpu_kms.c | 157 ++++++---- src/amdgpu_pci_chipset_gen.h | 1 src/amdgpu_pci_device_match_gen.h | 1 src/amdgpu_present.c | 98 ++++-- src/amdgpu_probe.c | 66 ++-- src/amdgpu_probe.h | 10 src/amdgpu_video.c | 62 +--- src/amdgpu_video.h | 1 src/ati_pciids_gen.h | 1 src/drmmode_display.c | 574 +++++++++++++++++++++++++++----------- src/drmmode_display.h | 17 - src/pcidb/ati_pciids.csv | 1 23 files changed, 885 insertions(+), 443 deletions(-)
New commits: commit 755e6ff2337cf615e3ba0854ccd533baec7144db Author: Michel Dänzer <michel.daen...@amd.com> Date: Thu Nov 19 17:28:19 2015 +0900 Bump version for 1.0.0 release diff --git a/configure.ac b/configure.ac index 9765d0b..1849a78 100644 --- a/configure.ac +++ b/configure.ac @@ -23,7 +23,7 @@ # Initialize Autoconf AC_PREREQ([2.60]) AC_INIT([xf86-video-amdgpu], - [0.0.01], + [1.0.0], [https://bugs.freedesktop.org/enter_bug.cgi?product=xorg], [xf86-video-amdgpu]) commit 49c7d2be99aaf6d040e553065bdc461ce8d4769a Author: Michel Dänzer <michel.daen...@amd.com> Date: Thu Nov 19 17:14:54 2015 +0900 Add amdgpu_pixmap.h to src/Makefile.am's EXTRA_DIST Fixes make distcheck. diff --git a/src/Makefile.am b/src/Makefile.am index 4efef9e..a851b3b 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -63,6 +63,7 @@ EXTRA_DIST = \ amdgpu_glamor.h \ amdgpu_drv.h \ amdgpu_list.h \ + amdgpu_pixmap.h \ amdgpu_probe.h \ amdgpu_version.h \ amdgpu_video.h \ commit d069ec5d27f5c8d2ab17b759b85293ef4113acf3 Author: Stephen Chandler Paul <cp...@redhat.com> Date: Wed Nov 11 18:10:55 2015 +0900 Handle failures in setting a CRTC to a DRM mode properly This fixes a bug where running the card out of PPLL's when hotplugging another monitor would result in all of the displays going blank and failing to work properly until X was restarted or the user switched to another VT. [Michel Dänzer: Pass errno instead of -ret to strerror()] Signed-off-by: Stephen Chandler Paul <cp...@redhat.com> (ported from radeon commit 7186a8713ba004de4991f21c1a9fc4abc62aeff4) Reviewed-by: Alex Deucher <alexander.deuc...@amd.com> diff --git a/src/drmmode_display.c b/src/drmmode_display.c index 66528f0..2761513 100644 --- a/src/drmmode_display.c +++ b/src/drmmode_display.c @@ -699,14 +699,15 @@ drmmode_set_mode_major(xf86CrtcPtr crtc, DisplayModePtr mode, amdgpu_glamor_finish(pScrn); } } - ret = - drmModeSetCrtc(pAMDGPUEnt->fd, - drmmode_crtc->mode_crtc->crtc_id, fb_id, x, - y, output_ids, output_count, &kmode); - if (ret) + if (drmModeSetCrtc(pAMDGPUEnt->fd, + drmmode_crtc->mode_crtc->crtc_id, + fb_id, x, y, output_ids, + output_count, &kmode) != 0) { xf86DrvMsg(crtc->scrn->scrnIndex, X_ERROR, - "failed to set mode: %s", strerror(-ret)); - else + "failed to set mode: %s\n", strerror(errno)); + ret = FALSE; + goto done; + } else ret = TRUE; if (crtc->scrn->pScreen) commit c8bddcf6c97b1338be3715f1fc5e0b17ce71c195 Author: Michel Dänzer <michel.daen...@amd.com> Date: Wed Nov 11 18:09:59 2015 +0900 Call xf86CrtcRotate from initial drmmode_set_desired_modes call Fixes various problems when rotation is specified in xorg.conf. Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=92475 (ported from radeon commit 548e97b3b7d1e94075a54ca2bb4eb683025098a7) Reviewed-by: Alex Deucher <alexander.deuc...@amd.com> diff --git a/src/drmmode_display.c b/src/drmmode_display.c index 4d5a3a3..66528f0 100644 --- a/src/drmmode_display.c +++ b/src/drmmode_display.c @@ -2071,6 +2071,8 @@ Bool drmmode_set_desired_modes(ScrnInfoPtr pScrn, drmmode_ptr drmmode, crtc->rotation = crtc->desiredRotation; crtc->x = crtc->desiredX; crtc->y = crtc->desiredY; + if (!xf86CrtcRotate(crtc)) + return FALSE; } } return TRUE; commit 12815156f38ce3357f03901a78402db834577d11 Author: Emil Velikov <emil.l.veli...@gmail.com> Date: Wed Nov 11 18:04:01 2015 +0900 Do not link amdgpu_drv.so against libpciaccess Not used directly. Signed-off-by: Emil Velikov <emil.l.veli...@gmail.com> (ported from radeon commit fcb32231a38f9461d12720cbf72f63502197a711) Reviewed-by: Alex Deucher <alexander.deuc...@amd.com> diff --git a/configure.ac b/configure.ac index e350ef6..9765d0b 100644 --- a/configure.ac +++ b/configure.ac @@ -186,9 +186,6 @@ AC_CHECK_HEADERS([dri3.h], [], [], CPPFLAGS="$SAVE_CPPFLAGS" -PKG_CHECK_MODULES([PCIACCESS], [pciaccess >= 0.8.0]) -XORG_CFLAGS="$XORG_CFLAGS $PCIACCESS_CFLAGS" - # Checks for headers/macros for byte swapping # Known variants: # <byteswap.h> bswap_16, bswap_32, bswap_64 (glibc) diff --git a/src/Makefile.am b/src/Makefile.am index 6c8d1de..4efef9e 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -26,7 +26,7 @@ # _ladir passes a dummy rpath to libtool so the thing will actually link # TODO: -nostdlib/-Bstatic/-lgcc platform magic, not installing the .a, etc. -amdgpu_drv_la_LIBADD = $(PCIACCESS_LIBS) $(LIBDRM_AMDGPU_LIBS) $(GBM_LIBS) +amdgpu_drv_la_LIBADD = $(LIBDRM_AMDGPU_LIBS) $(GBM_LIBS) AMDGPU_KMS_SRCS=amdgpu_bo_helper.c amdgpu_dri2.c amdgpu_dri3.c amdgpu_drm_queue.c \ amdgpu_kms.c amdgpu_present.c amdgpu_sync.c drmmode_display.c commit a02982b0ae0b79d2f183a1628edc05cafed8703a Author: Michel Dänzer <michel.daen...@amd.com> Date: Wed Nov 11 17:59:14 2015 +0900 Skip disabled CRTCs in amdgpu_scanout_(do_)update The vblank / page flip ioctls don't work as expected for a disabled CRTC. (ported from radeon commit acc11877423ecd81a6e0a7f38466f80e43efee20) Reviewed-by: Alex Deucher <alexander.deuc...@amd.com> diff --git a/src/amdgpu_kms.c b/src/amdgpu_kms.c index 2efdbf5..3993591 100644 --- a/src/amdgpu_kms.c +++ b/src/amdgpu_kms.c @@ -257,7 +257,8 @@ amdgpu_scanout_do_update(xf86CrtcPtr xf86_crtc, int scanout_id) GCPtr gc; BoxRec extents; - if (drmmode_crtc->dpms_mode != DPMSModeOn || + if (!xf86_crtc->enabled || + drmmode_crtc->dpms_mode != DPMSModeOn || !drmmode_crtc->scanout[scanout_id].pixmap) return FALSE; @@ -323,7 +324,8 @@ amdgpu_scanout_update(xf86CrtcPtr xf86_crtc) DrawablePtr pDraw; BoxRec extents; - if (drmmode_crtc->scanout_update_pending || + if (!xf86_crtc->enabled || + drmmode_crtc->scanout_update_pending || !drmmode_crtc->scanout[0].pixmap || drmmode_crtc->dpms_mode != DPMSModeOn) return; commit 0ddd20600d0046afd17aa47ffebe86dfd91a2215 Author: Michel Dänzer <michel.daen...@amd.com> Date: Wed Nov 11 17:44:16 2015 +0900 Prefer drmModeSetCursor2 over drmModeSetCursor The former includes information about the position of the hotspot within the cursor image. Copied from xf86-video-modesetting. (ported from radeon commit c9f8f642fd495937400618a4fc25ecae3f8888fc) Reviewed-by: Alex Deucher <alexander.deuc...@amd.com> diff --git a/src/drmmode_display.c b/src/drmmode_display.c index 9632180..4d5a3a3 100644 --- a/src/drmmode_display.c +++ b/src/drmmode_display.c @@ -801,12 +801,29 @@ static void drmmode_show_cursor(xf86CrtcPtr crtc) AMDGPUEntPtr pAMDGPUEnt = AMDGPUEntPriv(pScrn); drmmode_crtc_private_ptr drmmode_crtc = crtc->driver_private; uint32_t bo_handle; + static Bool use_set_cursor2 = TRUE; if (!amdgpu_bo_get_handle(drmmode_crtc->cursor_buffer, &bo_handle)) { ErrorF("failed to get BO handle for cursor\n"); return; } + if (use_set_cursor2) { + xf86CrtcConfigPtr xf86_config = XF86_CRTC_CONFIG_PTR(crtc->scrn); + CursorPtr cursor = xf86_config->cursor; + int ret; + + ret = drmModeSetCursor2(pAMDGPUEnt->fd, + drmmode_crtc->mode_crtc->crtc_id, + bo_handle, + info->cursor_w, info->cursor_h, + cursor->bits->xhot, cursor->bits->yhot); + if (ret == -EINVAL) + use_set_cursor2 = FALSE; + else + return; + } + drmModeSetCursor(pAMDGPUEnt->fd, drmmode_crtc->mode_crtc->crtc_id, bo_handle, info->cursor_w, info->cursor_h); } commit 83a47c0ebe17caa79d12a8b2f94b59cc945452f5 Author: Michel Dänzer <michel.daen...@amd.com> Date: Wed Nov 11 17:37:54 2015 +0900 PRIME: Don't advertise offload capabilities when acceleration is disabled Xorg tends to crash if the user tries to actually use the offload capabilities with acceleration disabled. Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=57200 (ported from radeon commit c74de9fec13fac2c836bb2a07ae6f90e1d61e667) Reviewed-by: Alex Deucher <alexander.deuc...@amd.com> diff --git a/src/amdgpu_kms.c b/src/amdgpu_kms.c index 084f625..2efdbf5 100644 --- a/src/amdgpu_kms.c +++ b/src/amdgpu_kms.c @@ -668,14 +668,18 @@ static void AMDGPUSetupCapabilities(ScrnInfoPtr pScrn) pScrn->capabilities = 0; ret = drmGetCap(pAMDGPUEnt->fd, DRM_CAP_PRIME, &value); if (ret == 0) { - if (value & DRM_PRIME_CAP_EXPORT) - pScrn->capabilities |= - RR_Capability_SourceOutput | - RR_Capability_SinkOffload; - if (value & DRM_PRIME_CAP_IMPORT) - pScrn->capabilities |= - RR_Capability_SourceOffload | - RR_Capability_SinkOutput; + AMDGPUInfoPtr info = AMDGPUPTR(pScrn); + + if (value & DRM_PRIME_CAP_EXPORT) { + pScrn->capabilities |= RR_Capability_SourceOutput; + if (info->use_glamor && info->dri2.available) + pScrn->capabilities |= RR_Capability_SinkOffload; + } + if (value & DRM_PRIME_CAP_IMPORT) { + pScrn->capabilities |= RR_Capability_SinkOutput; + if (info->use_glamor && info->dri2.available) + pScrn->capabilities |= RR_Capability_SourceOffload; + } } #endif } commit 560b7fe6dc66405762020f00e9a05918a36f3a17 Author: Michel Dänzer <michel.daen...@amd.com> Date: Wed Nov 11 17:31:34 2015 +0900 Rename Option "NoAccel" to "Accel" Removes the need for a double negation when forcing acceleration on. Note that this change is backwards compatible, as the option parser automagically handles the 'No' prefix. (ported from radeon commit cc615d06db0332fc6e673b55632bcc7bf957b44b) Reviewed-by: Alex Deucher <alexander.deuc...@amd.com> diff --git a/man/amdgpu.man b/man/amdgpu.man index 3373b63..4e95ead 100644 --- a/man/amdgpu.man +++ b/man/amdgpu.man @@ -44,12 +44,11 @@ are supported: Selects software cursor. The default is .B off. .TP -.BI "Option \*qNoAccel\*q \*q" boolean \*q +.BI "Option \*qAccel\*q \*q" boolean \*q Enables or disables all hardware acceleration. .br -The default is to -.B enable -hardware acceleration. +The default is +.B on. .TP .BI "Option \*qZaphodHeads\*q \*q" string \*q diff --git a/src/amdgpu_drv.h b/src/amdgpu_drv.h index 4797693..9acd202 100644 --- a/src/amdgpu_drv.h +++ b/src/amdgpu_drv.h @@ -133,7 +133,7 @@ struct _SyncFence; #endif typedef enum { - OPTION_NOACCEL, + OPTION_ACCEL, OPTION_SW_CURSOR, OPTION_PAGE_FLIP, #ifdef RENDER diff --git a/src/amdgpu_kms.c b/src/amdgpu_kms.c index 054d478..084f625 100644 --- a/src/amdgpu_kms.c +++ b/src/amdgpu_kms.c @@ -60,7 +60,7 @@ extern SymTabRec AMDGPUChipsets[]; static Bool amdgpu_setup_kernel_mem(ScreenPtr pScreen); const OptionInfoRec AMDGPUOptions_KMS[] = { - {OPTION_NOACCEL, "NoAccel", OPTV_BOOLEAN, {0}, FALSE}, + {OPTION_ACCEL, "Accel", OPTV_BOOLEAN, {0}, FALSE}, {OPTION_SW_CURSOR, "SWcursor", OPTV_BOOLEAN, {0}, FALSE}, {OPTION_PAGE_FLIP, "EnablePageFlip", OPTV_BOOLEAN, {0}, FALSE}, {OPTION_SUBPIXEL_ORDER, "SubPixelOrder", OPTV_ANYSTR, {0}, FALSE}, @@ -562,7 +562,7 @@ static Bool AMDGPUPreInitAccel_KMS(ScrnInfoPtr pScrn) { AMDGPUInfoPtr info = AMDGPUPTR(pScrn); - if (!xf86ReturnOptValBool(info->Options, OPTION_NOACCEL, false)) { + if (xf86ReturnOptValBool(info->Options, OPTION_ACCEL, TRUE)) { AMDGPUEntPtr pAMDGPUEnt = AMDGPUEntPriv(pScrn); Bool use_glamor = TRUE; #ifdef HAVE_GBM_BO_USE_LINEAR commit ad77ad32c4a723447d3191d527cfa6de9f54d7ce Author: Adam Jackson <a...@redhat.com> Date: Wed Nov 11 17:20:21 2015 +0900 Use own thunk function instead of shadowUpdatePackedWeak I plan to delete the Weak functions from a future server. Signed-off-by: Adam Jackson <a...@redhat.com> (ported from radeon commit 851b2cf8714618843725f6d067915375485ade9d) Reviewed-by: Alex Deucher <alexander.deuc...@amd.com> diff --git a/src/amdgpu_kms.c b/src/amdgpu_kms.c index fd89ba2..054d478 100644 --- a/src/amdgpu_kms.c +++ b/src/amdgpu_kms.c @@ -157,6 +157,12 @@ static void *amdgpuShadowWindow(ScreenPtr screen, CARD32 row, CARD32 offset, return ((uint8_t *) info->front_buffer->cpu_ptr + row * stride + offset); } +static void +amdgpuUpdatePacked(ScreenPtr pScreen, shadowBufPtr pBuf) +{ + shadowUpdatePacked(pScreen, pBuf); +} + static Bool AMDGPUCreateScreenResources_KMS(ScreenPtr pScreen) { ScrnInfoPtr pScrn = xf86ScreenToScrn(pScreen); @@ -176,7 +182,7 @@ static Bool AMDGPUCreateScreenResources_KMS(ScreenPtr pScreen) if (info->shadow_fb) { pixmap = pScreen->GetScreenPixmap(pScreen); - if (!shadowAdd(pScreen, pixmap, shadowUpdatePackedWeak(), + if (!shadowAdd(pScreen, pixmap, amdgpuUpdatePacked, amdgpuShadowWindow, 0, NULL)) return FALSE; } commit f5ccea99c03b62acf3a25984aba617c665d80b7c Author: Michel Dänzer <michel.daen...@amd.com> Date: Wed Nov 11 17:16:58 2015 +0900 dri2: Handle PRIME for source buffer as well in amdgpu_dri2_copy_region2 Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=77810 (ported from radeon commit c84230d686c078aac1dc98d82153f8b02521b2e1) Reviewed-by: Alex Deucher <alexander.deuc...@amd.com> diff --git a/src/amdgpu_dri2.c b/src/amdgpu_dri2.c index 0feca59..230e8ba 100644 --- a/src/amdgpu_dri2.c +++ b/src/amdgpu_dri2.c @@ -333,7 +333,14 @@ amdgpu_dri2_copy_region2(ScreenPtr pScreen, dst_drawable = &dst_private->pixmap->drawable; if (src_private->attachment == DRI2BufferFrontLeft) { - src_drawable = drawable; +#ifdef USE_DRI2_PRIME + if (drawable->pScreen != pScreen) { + src_drawable = DRI2UpdatePrime(drawable, src_buffer); + if (!src_drawable) + return; + } else +#endif + src_drawable = drawable; } if (dst_private->attachment == DRI2BufferFrontLeft) { #ifdef USE_DRI2_PRIME commit 92e7c93d2f9c3036da1a17d7fccccb6f9e9eaa3d Author: Michel Dänzer <michel.daen...@amd.com> Date: Mon Nov 2 18:29:24 2015 +0900 Move scrn/info declaration inside USE_GLAMOR in amdgpu_dri3_fd_from_pixmap Fixes warning when building with --disable-glamor: ../../src/amdgpu_dri3.c: In function 'amdgpu_dri3_fd_from_pixmap': ../../src/amdgpu_dri3.c:135:16: warning: unused variable 'info' [-Wunused-variable] AMDGPUInfoPtr info = AMDGPUPTR(scrn); ^ Reported-by: Jammy Zhou <jammy.z...@amd.com> Reviewed-by: Alex Deucher <alexander.deuc...@amd.com> diff --git a/src/amdgpu_dri3.c b/src/amdgpu_dri3.c index 53871be..73a79ac 100644 --- a/src/amdgpu_dri3.c +++ b/src/amdgpu_dri3.c @@ -131,13 +131,13 @@ static int amdgpu_dri3_fd_from_pixmap(ScreenPtr screen, CARD16 *stride, CARD32 *size) { - ScrnInfoPtr scrn = xf86ScreenToScrn(screen); - AMDGPUInfoPtr info = AMDGPUPTR(scrn); struct amdgpu_buffer *bo; struct amdgpu_bo_info bo_info; uint32_t fd; - #ifdef USE_GLAMOR + ScrnInfoPtr scrn = xf86ScreenToScrn(screen); + AMDGPUInfoPtr info = AMDGPUPTR(scrn); + if (info->use_glamor) return glamor_fd_from_pixmap(screen, pixmap, stride, size); #endif commit c9bd1399a13cea2e1331af2c826ca054b88db071 Author: Michel Dänzer <michel.daen...@amd.com> Date: Mon Nov 2 18:21:50 2015 +0900 Call AMDGPUFreeRec from AMDGPUFreeScreen_KMS even if info == NULL It's safe now. Reviewed-by: Alex Deucher <alexander.deuc...@amd.com> diff --git a/src/amdgpu_kms.c b/src/amdgpu_kms.c index 41f01b3..fd89ba2 100644 --- a/src/amdgpu_kms.c +++ b/src/amdgpu_kms.c @@ -1031,15 +1031,10 @@ static Bool AMDGPUCloseScreen_KMS(CLOSE_SCREEN_ARGS_DECL) void AMDGPUFreeScreen_KMS(FREE_SCREEN_ARGS_DECL) { SCRN_INFO_PTR(arg); - AMDGPUInfoPtr info = AMDGPUPTR(pScrn); xf86DrvMsgVerb(pScrn->scrnIndex, X_INFO, AMDGPU_LOGLEVEL_DEBUG, "AMDGPUFreeScreen\n"); - /* when server quits at PreInit, we don't need do this anymore */ - if (!info) - return; - AMDGPUFreeRec(pScrn); } commit fb8444e731765588c0ff1e9053c1c7b73f5f0907 Author: Michel Dänzer <michel.daen...@amd.com> Date: Mon Nov 2 18:20:41 2015 +0900 Don't use AMDGPUEntPriv in AMDGPUFreeRec It crashes if info == NULL. Reviewed-by: Alex Deucher <alexander.deuc...@amd.com> diff --git a/src/amdgpu_kms.c b/src/amdgpu_kms.c index 5e17525..41f01b3 100644 --- a/src/amdgpu_kms.c +++ b/src/amdgpu_kms.c @@ -107,7 +107,8 @@ static Bool AMDGPUGetRec(ScrnInfoPtr pScrn) /* Free our private AMDGPUInfoRec */ static void AMDGPUFreeRec(ScrnInfoPtr pScrn) { - AMDGPUEntPtr pAMDGPUEnt = AMDGPUEntPriv(pScrn); + DevUnion *pPriv; + AMDGPUEntPtr pAMDGPUEnt; AMDGPUInfoPtr info; if (!pScrn) @@ -117,6 +118,9 @@ static void AMDGPUFreeRec(ScrnInfoPtr pScrn) if (info && info->fbcon_pixmap) pScrn->pScreen->DestroyPixmap(info->fbcon_pixmap); + pPriv = xf86GetEntityPrivate(xf86GetEntityInfo(pScrn->entityList[pScrn->numEntities - 1])->index, + gAMDGPUEntityIndex); + pAMDGPUEnt = pPriv->ptr; if (pAMDGPUEnt->fd > 0) { DevUnion *pPriv; AMDGPUEntPtr pAMDGPUEnt; commit 8e7ee03f55c2f3874f6e84daeb5700f8b8037a51 Author: Michel Dänzer <michel.daen...@amd.com> Date: Wed Oct 28 17:53:27 2015 +0900 Remove amdgpu_reference_drm_fd Increase pAMDGPUEnt->fd_ref in the probe code instead when we're reusing the existing fd. The previous reference counting was imbalanced, so pAMDGPUEnt->fd_ref could never go to 0. Reviewed-by: Jammy Zhou <jammy.z...@amd.com> diff --git a/src/amdgpu_kms.c b/src/amdgpu_kms.c index 7861cf6..5e17525 100644 --- a/src/amdgpu_kms.c +++ b/src/amdgpu_kms.c @@ -624,13 +624,6 @@ static Bool AMDGPUPreInitChipType_KMS(ScrnInfoPtr pScrn) return TRUE; } -static void amdgpu_reference_drm_fd(ScrnInfoPtr pScrn) -{ - AMDGPUEntPtr pAMDGPUEnt = AMDGPUEntPriv(pScrn); - - pAMDGPUEnt->fd_ref++; -} - static Bool amdgpu_get_tile_config(ScrnInfoPtr pScrn) { AMDGPUInfoPtr info = AMDGPUPTR(pScrn); @@ -767,8 +760,6 @@ Bool AMDGPUPreInit_KMS(ScrnInfoPtr pScrn, int flags) if (!AMDGPUPreInitChipType_KMS(pScrn)) goto fail; - amdgpu_reference_drm_fd(pScrn); - info->dri2.available = FALSE; info->dri2.enabled = FALSE; info->dri2.pKernelDRMVersion = drmGetVersion(pAMDGPUEnt->fd); diff --git a/src/amdgpu_probe.c b/src/amdgpu_probe.c index 61605b9..e4f5c75 100644 --- a/src/amdgpu_probe.c +++ b/src/amdgpu_probe.c @@ -245,6 +245,7 @@ static Bool amdgpu_get_scrninfo(int entity_num, struct pci_device *pci_dev) } } else { pAMDGPUEnt = pPriv->ptr; + pAMDGPUEnt->fd_ref++; } xf86SetEntityInstanceForScreen(pScrn, pEnt->index, @@ -360,6 +361,7 @@ amdgpu_platform_probe(DriverPtr pDriver, } } else { pAMDGPUEnt = pPriv->ptr; + pAMDGPUEnt->fd_ref++; } pAMDGPUEnt->platform_dev = dev; commit 6bab8fabb37eb131e131ce59446c214ded28f779 Author: Michel Dänzer <michel.daen...@amd.com> Date: Wed Oct 28 17:44:09 2015 +0900 Remove info->dri2.drm_fd and info->drmmode->fd Use pAMDGPUEnt->fd everywhere instead. Reviewed-by: Jammy Zhou <jammy.z...@amd.com> diff --git a/src/amdgpu_bo_helper.c b/src/amdgpu_bo_helper.c index 0a32934..1329c4c 100644 --- a/src/amdgpu_bo_helper.c +++ b/src/amdgpu_bo_helper.c @@ -133,19 +133,18 @@ Bool amdgpu_bo_get_handle(struct amdgpu_buffer *bo, uint32_t *handle) int amdgpu_bo_map(ScrnInfoPtr pScrn, struct amdgpu_buffer *bo) { - AMDGPUInfoPtr info = AMDGPUPTR(pScrn); int ret = 0; if (bo->flags & AMDGPU_BO_FLAGS_GBM) { + AMDGPUEntPtr pAMDGPUEnt = AMDGPUEntPriv(pScrn); uint32_t handle, stride, height; union drm_amdgpu_gem_mmap args; - int fd; + int fd = pAMDGPUEnt->fd; void *ptr; handle = gbm_bo_get_handle(bo->bo.gbm).u32; stride = gbm_bo_get_stride(bo->bo.gbm); height = gbm_bo_get_height(bo->bo.gbm); - fd = info->dri2.drm_fd; memset(&args, 0, sizeof(union drm_amdgpu_gem_mmap)); args.in.handle = handle; diff --git a/src/amdgpu_dri2.c b/src/amdgpu_dri2.c index 48d55c1..0feca59 100644 --- a/src/amdgpu_dri2.c +++ b/src/amdgpu_dri2.c @@ -224,9 +224,11 @@ amdgpu_dri2_create_buffer2(ScreenPtr pScreen, } if (bo->flags & AMDGPU_BO_FLAGS_GBM) { + AMDGPUEntPtr pAMDGPUEnt = AMDGPUEntPriv(pScrn); + bo_handle = gbm_bo_get_handle(bo->bo.gbm); flink.handle = bo_handle.u32; - if (ioctl(info->dri2.drm_fd, DRM_IOCTL_GEM_FLINK, &flink) < 0) + if (ioctl(pAMDGPUEnt->fd, DRM_IOCTL_GEM_FLINK, &flink) < 0) goto error; buffers->name = flink.name; } else { @@ -458,13 +460,13 @@ static Bool amdgpu_dri2_get_crtc_msc(xf86CrtcPtr crtc, CARD64 *ust, CARD64 *msc) /* CRTC is not running, extrapolate MSC and timestamp */ drmmode_crtc_private_ptr drmmode_crtc = crtc->driver_private; ScrnInfoPtr scrn = crtc->scrn; - AMDGPUInfoPtr info = AMDGPUPTR(scrn); + AMDGPUEntPtr pAMDGPUEnt = AMDGPUEntPriv(scrn); CARD64 now, delta_t, delta_seq; if (!drmmode_crtc->dpms_last_ust) return FALSE; - if (drmmode_get_current_ust(info->dri2.drm_fd, &now) != 0) { + if (drmmode_get_current_ust(pAMDGPUEnt->fd, &now) != 0) { xf86DrvMsg(scrn->scrnIndex, X_ERROR, "%s cannot get current time\n", __func__); return FALSE; @@ -625,7 +627,7 @@ static Bool update_front(DrawablePtr draw, DRI2BufferPtr front) { ScreenPtr screen = draw->pScreen; ScrnInfoPtr scrn = xf86ScreenToScrn(screen); - AMDGPUInfoPtr info = AMDGPUPTR(scrn); + AMDGPUEntPtr pAMDGPUEnt = AMDGPUEntPriv(scrn); PixmapPtr pixmap; struct dri2_buffer_priv *priv = front->driverPrivate; struct amdgpu_buffer *bo = NULL; @@ -639,7 +641,7 @@ static Bool update_front(DrawablePtr draw, DRI2BufferPtr front) if (bo->flags & AMDGPU_BO_FLAGS_GBM) { bo_handle = gbm_bo_get_handle(bo->bo.gbm); flink.handle = bo_handle.u32; - if (ioctl(info->dri2.drm_fd, DRM_IOCTL_GEM_FLINK, &flink) < 0) + if (ioctl(pAMDGPUEnt->fd, DRM_IOCTL_GEM_FLINK, &flink) < 0) return FALSE; front->name = flink.name; } else { @@ -866,7 +868,7 @@ CARD32 amdgpu_dri2_extrapolate_msc_delay(xf86CrtcPtr crtc, CARD64 * target_msc, { drmmode_crtc_private_ptr drmmode_crtc = crtc->driver_private; ScrnInfoPtr pScrn = crtc->scrn; - AMDGPUInfoPtr info = AMDGPUPTR(pScrn); + AMDGPUEntPtr pAMDGPUEnt = AMDGPUEntPriv(pScrn); int nominal_frame_rate = drmmode_crtc->dpms_last_fps; CARD64 last_vblank_ust = drmmode_crtc->dpms_last_ust; uint32_t last_vblank_seq = drmmode_crtc->dpms_last_seq; @@ -879,7 +881,7 @@ CARD32 amdgpu_dri2_extrapolate_msc_delay(xf86CrtcPtr crtc, CARD64 * target_msc, *target_msc = 0; return FALLBACK_SWAP_DELAY; } - ret = drmmode_get_current_ust(info->dri2.drm_fd, &now); + ret = drmmode_get_current_ust(pAMDGPUEnt->fd, &now); if (ret) { xf86DrvMsg(pScrn->scrnIndex, X_ERROR, "%s cannot get current time\n", __func__); @@ -957,7 +959,7 @@ CARD32 amdgpu_dri2_deferred_event(OsTimerPtr timer, CARD32 now, pointer data) DRI2FrameEventPtr event_info = (DRI2FrameEventPtr) data; xf86CrtcPtr crtc = event_info->crtc; ScrnInfoPtr scrn; - AMDGPUInfoPtr info; + AMDGPUEntPtr pAMDGPUEnt; CARD64 drm_now; int ret; CARD64 delta_t, delta_seq, frame; @@ -980,13 +982,13 @@ CARD32 amdgpu_dri2_deferred_event(OsTimerPtr timer, CARD32 now, pointer data) } scrn = crtc->scrn; - info = AMDGPUPTR(scrn); - ret = drmmode_get_current_ust(info->dri2.drm_fd, &drm_now); + pAMDGPUEnt = AMDGPUEntPriv(scrn); + ret = drmmode_get_current_ust(pAMDGPUEnt->fd, &drm_now); if (ret) { xf86DrvMsg(scrn->scrnIndex, X_ERROR, "%s cannot get current time\n", __func__); if (event_info->drm_queue) - amdgpu_drm_queue_handler(info->dri2.drm_fd, 0, 0, 0, + amdgpu_drm_queue_handler(pAMDGPUEnt->fd, 0, 0, 0, event_info->drm_queue); else amdgpu_dri2_frame_event_handler(scrn, 0, 0, data); @@ -1002,7 +1004,7 @@ CARD32 amdgpu_dri2_deferred_event(OsTimerPtr timer, CARD32 now, pointer data) delta_seq /= 1000000; frame = (CARD64) drmmode_crtc->dpms_last_seq + delta_seq; if (event_info->drm_queue) - amdgpu_drm_queue_handler(info->dri2.drm_fd, frame, drm_now / 1000000, + amdgpu_drm_queue_handler(pAMDGPUEnt->fd, frame, drm_now / 1000000, drm_now % 1000000, event_info->drm_queue); else amdgpu_dri2_frame_event_handler(scrn, frame, drm_now, data); @@ -1032,7 +1034,7 @@ static int amdgpu_dri2_schedule_wait_msc(ClientPtr client, DrawablePtr draw, { ScreenPtr screen = draw->pScreen; ScrnInfoPtr scrn = xf86ScreenToScrn(screen); - AMDGPUInfoPtr info = AMDGPUPTR(scrn); + AMDGPUEntPtr pAMDGPUEnt = AMDGPUEntPriv(scrn); DRI2FrameEventPtr wait_info = NULL; struct amdgpu_drm_queue_entry *wait = NULL; xf86CrtcPtr crtc = amdgpu_dri2_drawable_crtc(draw, TRUE); @@ -1080,7 +1082,7 @@ static int amdgpu_dri2_schedule_wait_msc(ClientPtr client, DrawablePtr draw, vbl.request.type = DRM_VBLANK_RELATIVE; vbl.request.type |= amdgpu_populate_vbl_request_type(crtc); vbl.request.sequence = 0; - ret = drmWaitVBlank(info->dri2.drm_fd, &vbl); + ret = drmWaitVBlank(pAMDGPUEnt->fd, &vbl); if (ret) { xf86DrvMsg(scrn->scrnIndex, X_WARNING, "get vblank counter failed: %s\n", strerror(errno)); @@ -1118,7 +1120,7 @@ static int amdgpu_dri2_schedule_wait_msc(ClientPtr client, DrawablePtr draw, vbl.request.type |= amdgpu_populate_vbl_request_type(crtc); vbl.request.sequence = target_msc - msc_delta; vbl.request.signal = (unsigned long)wait; - ret = drmWaitVBlank(info->dri2.drm_fd, &vbl); + ret = drmWaitVBlank(pAMDGPUEnt->fd, &vbl); if (ret) { xf86DrvMsg(scrn->scrnIndex, X_WARNING, "get vblank counter failed: %s\n", @@ -1150,7 +1152,7 @@ static int amdgpu_dri2_schedule_wait_msc(ClientPtr client, DrawablePtr draw, vbl.request.sequence += divisor; vbl.request.signal = (unsigned long)wait; - ret = drmWaitVBlank(info->dri2.drm_fd, &vbl); + ret = drmWaitVBlank(pAMDGPUEnt->fd, &vbl); if (ret) { xf86DrvMsg(scrn->scrnIndex, X_WARNING, "get vblank counter failed: %s\n", strerror(errno)); @@ -1195,7 +1197,7 @@ static int amdgpu_dri2_schedule_swap(ClientPtr client, DrawablePtr draw, { ScreenPtr screen = draw->pScreen; ScrnInfoPtr scrn = xf86ScreenToScrn(screen); - AMDGPUInfoPtr info = AMDGPUPTR(scrn); + AMDGPUEntPtr pAMDGPUEnt = AMDGPUEntPriv(scrn); xf86CrtcPtr crtc = amdgpu_dri2_drawable_crtc(draw, TRUE); uint32_t msc_delta; drmVBlank vbl; @@ -1268,7 +1270,7 @@ static int amdgpu_dri2_schedule_swap(ClientPtr client, DrawablePtr draw, vbl.request.type = DRM_VBLANK_RELATIVE; vbl.request.type |= amdgpu_populate_vbl_request_type(crtc); vbl.request.sequence = 0; - ret = drmWaitVBlank(info->dri2.drm_fd, &vbl); + ret = drmWaitVBlank(pAMDGPUEnt->fd, &vbl); if (ret) { xf86DrvMsg(scrn->scrnIndex, X_WARNING, "first get vblank counter failed: %s\n", @@ -1316,7 +1318,7 @@ static int amdgpu_dri2_schedule_swap(ClientPtr client, DrawablePtr draw, vbl.request.sequence = *target_msc - msc_delta; vbl.request.signal = (unsigned long)swap; - ret = drmWaitVBlank(info->dri2.drm_fd, &vbl); + ret = drmWaitVBlank(pAMDGPUEnt->fd, &vbl); if (ret) { xf86DrvMsg(scrn->scrnIndex, X_WARNING, "divisor 0 get vblank counter failed: %s\n", @@ -1362,7 +1364,7 @@ static int amdgpu_dri2_schedule_swap(ClientPtr client, DrawablePtr draw, vbl.request.sequence -= flip; vbl.request.signal = (unsigned long)swap; - ret = drmWaitVBlank(info->dri2.drm_fd, &vbl); + ret = drmWaitVBlank(pAMDGPUEnt->fd, &vbl); if (ret) { xf86DrvMsg(scrn->scrnIndex, X_WARNING, "final get vblank counter failed: %s\n", @@ -1404,6 +1406,7 @@ Bool amdgpu_dri2_screen_init(ScreenPtr pScreen) { ScrnInfoPtr pScrn = xf86ScreenToScrn(pScreen); AMDGPUInfoPtr info = AMDGPUPTR(pScrn); + AMDGPUEntPtr pAMDGPUEnt = AMDGPUEntPriv(pScrn); DRI2InfoRec dri2_info = { 0 }; const char *driverNames[2]; Bool scheduling_works = TRUE; @@ -1411,10 +1414,10 @@ Bool amdgpu_dri2_screen_init(ScreenPtr pScreen) if (!info->dri2.available) return FALSE; - info->dri2.device_name = drmGetDeviceNameFromFd(info->dri2.drm_fd); + info->dri2.device_name = drmGetDeviceNameFromFd(pAMDGPUEnt->fd); dri2_info.driverName = SI_DRIVER_NAME; - dri2_info.fd = info->dri2.drm_fd; + dri2_info.fd = pAMDGPUEnt->fd; dri2_info.deviceName = info->dri2.device_name; dri2_info.version = DRI2INFOREC_VERSION; dri2_info.CreateBuffer = amdgpu_dri2_create_buffer; @@ -1426,7 +1429,7 @@ Bool amdgpu_dri2_screen_init(ScreenPtr pScreen) uint64_t cap_value; if (drmGetCap - (info->dri2.drm_fd, DRM_CAP_VBLANK_HIGH_CRTC, &cap_value)) { + (pAMDGPUEnt->fd, DRM_CAP_VBLANK_HIGH_CRTC, &cap_value)) { xf86DrvMsg(pScrn->scrnIndex, X_WARNING, "You need a newer kernel " "for VBLANKs on CRTC > 1\n"); diff --git a/src/amdgpu_dri2.h b/src/amdgpu_dri2.h index d9bec91..c6a2ab6 100644 --- a/src/amdgpu_dri2.h +++ b/src/amdgpu_dri2.h @@ -31,7 +31,6 @@ struct amdgpu_dri2 { drmVersionPtr pKernelDRMVersion; - int drm_fd; Bool available; Bool enabled; char *device_name; diff --git a/src/amdgpu_dri3.c b/src/amdgpu_dri3.c index a89421e..53871be 100644 --- a/src/amdgpu_dri3.c +++ b/src/amdgpu_dri3.c @@ -44,6 +44,7 @@ static int amdgpu_dri3_open(ScreenPtr screen, RRProviderPtr provider, int *out) { ScrnInfoPtr scrn = xf86ScreenToScrn(screen); + AMDGPUEntPtr pAMDGPUEnt = AMDGPUEntPriv(scrn); AMDGPUInfoPtr info = AMDGPUPTR(scrn); drm_magic_t magic; int fd; @@ -77,7 +78,7 @@ amdgpu_dri3_open(ScreenPtr screen, RRProviderPtr provider, int *out) } } - if (drmAuthMagic(info->dri2.drm_fd, magic) < 0) { + if (drmAuthMagic(pAMDGPUEnt->fd, magic) < 0) { close(fd); return BadMatch; } diff --git a/src/amdgpu_glamor.c b/src/amdgpu_glamor.c index 8f0dc79..c979561 100644 --- a/src/amdgpu_glamor.c +++ b/src/amdgpu_glamor.c @@ -109,7 +109,9 @@ Bool amdgpu_glamor_pre_init(ScrnInfoPtr scrn) "Incompatible glamor version, required >= 0.3.0.\n"); return FALSE; } else { - if (glamor_egl_init(scrn, info->dri2.drm_fd)) { + AMDGPUEntPtr pAMDGPUEnt = AMDGPUEntPriv(scrn); + + if (glamor_egl_init(scrn, pAMDGPUEnt->fd)) { xf86DrvMsg(scrn->scrnIndex, X_INFO, "glamor detected, initialising EGL layer.\n"); } else { diff --git a/src/amdgpu_kms.c b/src/amdgpu_kms.c index 32a34cb..7861cf6 100644 --- a/src/amdgpu_kms.c +++ b/src/amdgpu_kms.c @@ -107,17 +107,17 @@ static Bool AMDGPUGetRec(ScrnInfoPtr pScrn) /* Free our private AMDGPUInfoRec */ static void AMDGPUFreeRec(ScrnInfoPtr pScrn) { + AMDGPUEntPtr pAMDGPUEnt = AMDGPUEntPriv(pScrn); AMDGPUInfoPtr info; - if (!pScrn || !pScrn->driverPrivate) + if (!pScrn) return; info = AMDGPUPTR(pScrn); - - if (info->fbcon_pixmap) + if (info && info->fbcon_pixmap) pScrn->pScreen->DestroyPixmap(info->fbcon_pixmap); - if (info->dri2.drm_fd > 0) { + if (pAMDGPUEnt->fd > 0) { DevUnion *pPriv; AMDGPUEntPtr pAMDGPUEnt; pPriv = xf86GetEntityPrivate(pScrn->entityList[0], @@ -164,7 +164,7 @@ static Bool AMDGPUCreateScreenResources_KMS(ScreenPtr pScreen) return FALSE; pScreen->CreateScreenResources = AMDGPUCreateScreenResources_KMS; - if (!drmmode_set_desired_modes(pScrn, &info->drmmode, FALSE)) + if (!drmmode_set_desired_modes(pScrn, &info->drmmode, pScrn->is_gpu)) return FALSE; drmmode_uevent_init(pScrn, &info->drmmode); @@ -306,6 +306,7 @@ amdgpu_scanout_update(xf86CrtcPtr xf86_crtc) drmmode_crtc_private_ptr drmmode_crtc = xf86_crtc->driver_private; struct amdgpu_drm_queue_entry *drm_queue_entry; ScrnInfoPtr scrn; + AMDGPUEntPtr pAMDGPUEnt; drmVBlank vbl; DamagePtr pDamage; RegionPtr pRegion; @@ -343,11 +344,12 @@ amdgpu_scanout_update(xf86CrtcPtr xf86_crtc) return; } + pAMDGPUEnt = AMDGPUEntPriv(scrn); vbl.request.type = DRM_VBLANK_RELATIVE | DRM_VBLANK_EVENT; vbl.request.type |= amdgpu_populate_vbl_request_type(xf86_crtc); vbl.request.sequence = 1; vbl.request.signal = (unsigned long)drm_queue_entry; - if (drmWaitVBlank(AMDGPUPTR(scrn)->dri2.drm_fd, &vbl)) { + if (drmWaitVBlank(pAMDGPUEnt->fd, &vbl)) { xf86DrvMsg(scrn->scrnIndex, X_WARNING, "drmWaitVBlank failed for scanout update: %s\n", strerror(errno)); @@ -378,6 +380,7 @@ amdgpu_scanout_flip(ScreenPtr pScreen, AMDGPUInfoPtr info, { drmmode_crtc_private_ptr drmmode_crtc = xf86_crtc->driver_private; ScrnInfoPtr scrn; + AMDGPUEntPtr pAMDGPUEnt; struct amdgpu_drm_queue_entry *drm_queue_entry; unsigned scanout_id; @@ -400,7 +403,8 @@ amdgpu_scanout_flip(ScreenPtr pScreen, AMDGPUInfoPtr info, return; } - if (drmModePageFlip(drmmode_crtc->drmmode->fd, drmmode_crtc->mode_crtc->crtc_id, + pAMDGPUEnt = AMDGPUEntPriv(scrn); + if (drmModePageFlip(pAMDGPUEnt->fd, drmmode_crtc->mode_crtc->crtc_id, drmmode_crtc->scanout[scanout_id].fb_id, DRM_MODE_PAGE_FLIP_EVENT, drm_queue_entry)) { xf86DrvMsg(scrn->scrnIndex, X_WARNING, "flip queue failed in %s: %s\n", @@ -549,6 +553,7 @@ static Bool AMDGPUPreInitAccel_KMS(ScrnInfoPtr pScrn) AMDGPUInfoPtr info = AMDGPUPTR(pScrn); if (!xf86ReturnOptValBool(info->Options, OPTION_NOACCEL, false)) { + AMDGPUEntPtr pAMDGPUEnt = AMDGPUEntPriv(pScrn); Bool use_glamor = TRUE; #ifdef HAVE_GBM_BO_USE_LINEAR const char *accel_method; @@ -563,7 +568,7 @@ static Bool AMDGPUPreInitAccel_KMS(ScrnInfoPtr pScrn) #endif