pkgsrc-wip/xf86-video-intel-dfbsd/patches/patch-src_sna_kgem.c

97 lines
2.6 KiB
C

$NetBSD$
WITH_GETLINE patch from FreeBSD ports x11-drivers/xf86-video-intel
Patch for --enable-debug from DragonFly dports
x11-drivers/xf86-video-intel29
Additional patch for DragonFly because struct drm_i915_gem_mmap
has a field flags.
https://bz-attachments.freebsd.org/attachment.cgi?id=20233
Fix SNA for drm-v4.11 or later by disabling I915_USERPTR_UNSYNCHRONIZED
I915_USERPTR_UNSYNCHRONIZED is broken since drm-v4.11
https://github.com/FreeBSDDesktop/kms-drm/issues/32
--- src/sna/kgem.c.orig 2019-02-21 22:26:50.000000000 +0000
+++ src/sna/kgem.c
@@ -29,6 +29,11 @@
#include "config.h"
#endif
+#if defined(__FreeBSD__)
+#define _WITH_GETLINE /* to expose getline() in stdio.h on FreeBSD */
+#include <stdio.h> /* for getline() */
+#endif
+
#include "sna.h"
#include "sna_reg.h"
@@ -69,9 +74,17 @@ search_snoop_cache(struct kgem *kgem, unsigned int num
#define DBG_NO_CPU 0
#define DBG_NO_CREATE2 0
#define DBG_NO_USERPTR 0
+#if defined(SET_DBG_NO_UNSYNCHRONIZED_USERPTR)
+#define DBG_NO_UNSYNCHRONIZED_USERPTR 1
+#else
#define DBG_NO_UNSYNCHRONIZED_USERPTR 0
+#endif
#define DBG_NO_COHERENT_MMAP_GTT 0
+#if defined(SET_DBG_NO_LLC)
+#define DBG_NO_LLC 1
+#else
#define DBG_NO_LLC 0
+#endif
#define DBG_NO_SEMAPHORES 0
#define DBG_NO_MADV 0
#define DBG_NO_UPLOAD_CACHE 0
@@ -682,7 +695,11 @@ retry_wc:
static void *__kgem_bo_map__cpu(struct kgem *kgem, struct kgem_bo *bo)
{
+#if defined(__DragonFly__)
+ struct local_i915_gem_mmap2 arg;
+#else
struct local_i915_gem_mmap arg;
+#endif
int err;
VG_CLEAR(arg);
@@ -691,7 +708,12 @@ static void *__kgem_bo_map__cpu(struct kgem *kgem, str
retry:
arg.handle = bo->handle;
arg.size = bytes(bo);
+#if defined(__DragonFly__)
+ arg.flags = 0;
+ if ((err = do_ioctl(kgem->fd, LOCAL_IOCTL_I915_GEM_MMAP_v2, &arg))) {
+#else
if ((err = do_ioctl(kgem->fd, LOCAL_IOCTL_I915_GEM_MMAP, &arg))) {
+#endif
DBG(("%s: failed %d, throttling/cleaning caches\n",
__FUNCTION__, err));
assert(err != -EINVAL || bo->prime);
@@ -3313,11 +3335,21 @@ bool __kgem_ring_is_idle(struct kgem *kgem, int ring)
if (rq) {
struct kgem_request *tmp;
+#if defined(__DragonFly__)
+ if (rq->bo == NULL)
+ fprintf(stderr, "__kgem_ring_is_idle: rq->bo == NULL\n");
+ if (rq->bo && __kgem_busy(kgem, rq->bo->handle)) {
+ DBG(("%s: last fence handle=%d still busy\n",
+ __FUNCTION__, rq->bo->handle));
+ return false;
+ }
+#else
if (__kgem_busy(kgem, rq->bo->handle)) {
DBG(("%s: last fence handle=%d still busy\n",
__FUNCTION__, rq->bo->handle));
return false;
}
+#endif
do {
tmp = list_first_entry(&kgem->requests[ring],