Hi,

the patch below should not affect the intel(4) X.Org driver
functionality. It's sole purpose is to make it compatible with the
future upgrade to the X.Org 1.19 xserver.

But since I don't have much hardware still using the intel driver (we
switched to modesettings(4) for many devices), I'd like to have this
tested against the current X server as much as possible.

To test it, you need to check out the /usr/xenocara source tree and
then:

cd /usr/xenocara/driver/xf86-video-intel
patch -p0 -E < /this/patch
doas make -f Makefile.bsd-wrapper obj
doas make -f Makefile.bsd-wrapper build

Then restart the X server.

Comments, oks are welcome too.

Thanks in advance.

Index: src/compat-api.h
===================================================================
RCS file: /cvs/OpenBSD/xenocara/driver/xf86-video-intel/src/compat-api.h,v
retrieving revision 1.6
diff -u -p -u -r1.6 compat-api.h
--- src/compat-api.h    16 May 2016 09:54:33 -0000      1.6
+++ src/compat-api.h    11 Nov 2017 17:39:18 -0000
@@ -30,6 +30,7 @@
 
 #include <xorg-server.h>
 #include <xorgVersion.h>
+#include <xf86Module.h>
 
 #include <picturestr.h>
 #ifndef GLYPH_HAS_GLYPH_PICTURE_ACCESSOR
@@ -42,6 +43,10 @@
 #define xf86ScrnToScreen(s) screenInfo.screens[(s)->scrnIndex]
 #endif
 
+#if GET_ABI_MAJOR(ABI_VIDEODRV_VERSION) >= 22
+#define HAVE_NOTIFY_FD 1
+#endif
+
 #ifndef XF86_SCRN_INTERFACE
 
 #define SCRN_ARG_TYPE int
@@ -227,4 +232,14 @@ static inline void FreePixmap(PixmapPtr 
 
 #if HAS_DIRTYTRACKING_ROTATION
 #define PixmapSyncDirtyHelper(d, dd) PixmapSyncDirtyHelper(d)
+#endif
+
+#if ABI_VIDEODRV_VERSION >= SET_ABI_VERSION(22, 0)
+#define OsBlockSIGIO()
+#define OsReleaseSIGIO()
+#endif
+
+#if !HAVE_NOTIFY_FD
+#define SetNotifyFd(fd, cb, mode, data) AddGeneralSocket(fd);
+#define RemoveNotifyFd(fd) RemoveGeneralSocket(fd)
 #endif
Index: src/sna/sna.h
===================================================================
RCS file: /cvs/OpenBSD/xenocara/driver/xf86-video-intel/src/sna/sna.h,v
retrieving revision 1.3
diff -u -p -u -r1.3 sna.h
--- src/sna/sna.h       12 Apr 2015 19:42:06 -0000      1.3
+++ src/sna/sna.h       11 Nov 2017 17:39:18 -0000
@@ -367,8 +367,10 @@ struct sna {
        EntityInfoPtr pEnt;
        const struct intel_device_info *info;
 
+#if !HAVE_NOTIFY_FD
        ScreenBlockHandlerProcPtr BlockHandler;
        ScreenWakeupHandlerProcPtr WakeupHandler;
+#endif
        CloseScreenProcPtr CloseScreen;
 
        PicturePtr clear;
@@ -995,8 +997,7 @@ static inline uint32_t pixmap_size(Pixma
 
 bool sna_accel_init(ScreenPtr sreen, struct sna *sna);
 void sna_accel_create(struct sna *sna);
-void sna_accel_block_handler(struct sna *sna, struct timeval **tv);
-void sna_accel_wakeup_handler(struct sna *sna);
+void sna_accel_block(struct sna *sna, struct timeval **tv);
 void sna_accel_watch_flush(struct sna *sna, int enable);
 void sna_accel_flush(struct sna *sna);
 void sna_accel_enter(struct sna *sna);
Index: src/sna/sna_accel.c
===================================================================
RCS file: /cvs/OpenBSD/xenocara/driver/xf86-video-intel/src/sna/sna_accel.c,v
retrieving revision 1.7
diff -u -p -u -r1.7 sna_accel.c
--- src/sna/sna_accel.c 3 Dec 2015 22:36:46 -0000       1.7
+++ src/sna/sna_accel.c 11 Nov 2017 17:39:18 -0000
@@ -112,6 +112,11 @@
 #define MAKE_COW_OWNER(ptr) ((void*)((uintptr_t)(ptr) | 1))
 #define COW(ptr) (void *)((uintptr_t)(ptr) & ~1)
 
+#if XFONT2_CLIENT_FUNCS_VERSION >= 1
+#define AllocateFontPrivateIndex() xfont2_allocate_font_private_index()
+#define FontSetPrivate(font, idx, data) xfont2_font_set_private(font, idx, 
data)
+#endif
+
 #if 0
 static void __sna_fallback_flush(DrawablePtr d)
 {
@@ -17676,6 +17681,13 @@ static bool sna_option_accel_blt(struct 
        return strcasecmp(s, "blt") == 0;
 }
 
+#if HAVE_NOTIFY_FD
+static void sna_accel_notify(int fd, int ready, void *data)
+{
+       sna_mode_wakeup(data);
+}
+#endif
+
 bool sna_accel_init(ScreenPtr screen, struct sna *sna)
 {
        const char *backend;
@@ -17687,7 +17699,7 @@ bool sna_accel_init(ScreenPtr screen, st
        list_init(&sna->flush_pixmaps);
        list_init(&sna->active_pixmaps);
 
-       AddGeneralSocket(sna->kgem.fd);
+       SetNotifyFd(sna->kgem.fd, sna_accel_notify, X_NOTIFY_READ, sna);
 
 #ifdef DEBUG_MEMORY
        sna->timer_expire[DEBUG_MEMORY_TIMER] = GetTimeInMillis()+ 10 * 1000;
@@ -17862,12 +17874,12 @@ void sna_accel_close(struct sna *sna)
        sna_pixmap_expire(sna);
 
        DeleteCallback(&FlushCallback, sna_accel_flush_callback, sna);
-       RemoveGeneralSocket(sna->kgem.fd);
+       RemoveNotifyFd(sna->kgem.fd);
 
        kgem_cleanup_cache(&sna->kgem);
 }
 
-void sna_accel_block_handler(struct sna *sna, struct timeval **tv)
+void sna_accel_block(struct sna *sna, struct timeval **tv)
 {
        sigtrap_assert_inactive();
 
@@ -17942,22 +17954,6 @@ set_tv:
                kgem_submit(&sna->kgem);
                sna->kgem.wedged = !sna->kgem.wedged;
        }
-}
-
-void sna_accel_wakeup_handler(struct sna *sna)
-{
-       DBG(("%s: nbatch=%d, need_retire=%d, need_purge=%d\n", __FUNCTION__,
-            sna->kgem.nbatch, sna->kgem.need_retire, sna->kgem.need_purge));
-
-       if (!sna->kgem.nbatch)
-               return;
-
-       if (kgem_is_idle(&sna->kgem)) {
-               DBG(("%s: GPU idle, flushing\n", __FUNCTION__));
-               _kgem_submit(&sna->kgem);
-       }
-
-       sigtrap_assert_inactive();
 }
 
 void sna_accel_free(struct sna *sna)
Index: src/sna/sna_acpi.c
===================================================================
RCS file: /cvs/OpenBSD/xenocara/driver/xf86-video-intel/src/sna/sna_acpi.c,v
retrieving revision 1.1
diff -u -p -u -r1.1 sna_acpi.c
--- src/sna/sna_acpi.c  3 Feb 2014 15:54:52 -0000       1.1
+++ src/sna/sna_acpi.c  11 Nov 2017 17:39:18 -0000
@@ -92,7 +92,7 @@ void _sna_acpi_wakeup(struct sna *sna)
                DBG(("%s: error [%d], detaching from acpid\n", __FUNCTION__, 
n));
 
                /* XXX reattach later? */
-               RemoveGeneralSocket(sna->acpi.fd);
+               RemoveNotifyFd(sna->acpi.fd);
                sna_acpi_fini(sna);
                return;
        }
@@ -136,6 +136,13 @@ void _sna_acpi_wakeup(struct sna *sna)
        } while (n);
 }
 
+#if HAVE_NOTIFY_FD
+static void sna_acpi_notify(int fd, int read, void *data)
+{
+       _sna_acpi_wakeup(data);
+}
+#endif
+
 static int read_power_state(const char *path)
 {
        DIR *dir;
@@ -200,7 +207,7 @@ void sna_acpi_init(struct sna *sna)
 
        DBG(("%s: attaching to acpid\n", __FUNCTION__));
 
-       AddGeneralSocket(sna->acpi.fd);
+       SetNotifyFd(sna->acpi.fd, sna_acpi_notify, X_NOTIFY_READ, sna);
        sna->acpi.remain = sizeof(sna->acpi.event) - 1;
        sna->acpi.offset = 0;
 
Index: src/sna/sna_driver.c
===================================================================
RCS file: /cvs/OpenBSD/xenocara/driver/xf86-video-intel/src/sna/sna_driver.c,v
retrieving revision 1.3
diff -u -p -u -r1.3 sna_driver.c
--- src/sna/sna_driver.c        12 Apr 2015 19:42:06 -0000      1.3
+++ src/sna/sna_driver.c        11 Nov 2017 17:39:18 -0000
@@ -729,6 +729,7 @@ cleanup:
        return FALSE;
 }
 
+#if !HAVE_NOTIFY_FD
 static bool has_shadow(struct sna *sna)
 {
        if (!sna->mode.shadow_damage)
@@ -756,7 +757,7 @@ sna_block_handler(BLOCKHANDLER_ARGS_DECL
        sna->BlockHandler(BLOCKHANDLER_ARGS);
 
        if (*tv == NULL || ((*tv)->tv_usec | (*tv)->tv_sec) || has_shadow(sna))
-               sna_accel_block_handler(sna, tv);
+               sna_accel_block(sna, tv);
 }
 
 static void
@@ -778,11 +779,34 @@ sna_wakeup_handler(WAKEUPHANDLER_ARGS_DE
 
        sna->WakeupHandler(WAKEUPHANDLER_ARGS);
 
-       sna_accel_wakeup_handler(sna);
-
        if (FD_ISSET(sna->kgem.fd, (fd_set*)read_mask))
                sna_mode_wakeup(sna);
 }
+#else
+static void
+sna_block_handler(void *data, void *_timeout)
+{
+       struct sna *sna = data;
+       int *timeout = _timeout;
+       struct timeval tv, *tvp;
+       
+       DBG(("%s (timeout=%d)\n", __FUNCTION__, *timeout));
+       if (*timeout == 0)
+               return;
+       
+       if (*timeout < 0) {
+               tvp = NULL;
+       } else {
+               tv.tv_sec = *timeout / 1000;
+               tv.tv_usec = (*timeout % 1000) * 1000;
+               tvp = &tv;
+       }
+       
+       sna_accel_block(sna, &tvp);
+       if (tvp)
+               *timeout = tvp->tv_sec * 1000 + tvp->tv_usec / 1000;
+}
+#endif
 
 #if HAVE_UDEV
 static void
@@ -1132,13 +1156,17 @@ sna_screen_init(SCREEN_INIT_ARGS_DECL)
        /* Must force it before EnterVT, so we are in control of VT and
         * later memory should be bound when allocating, e.g rotate_mem */
        scrn->vtSema = TRUE;
-
+#if !HAVE_NOTIFY_FD
        sna->BlockHandler = screen->BlockHandler;
        screen->BlockHandler = sna_block_handler;
 
        sna->WakeupHandler = screen->WakeupHandler;
        screen->WakeupHandler = sna_wakeup_handler;
-
+#else
+       RegisterBlockAndWakeupHandlers(sna_block_handler,
+                                      (ServerWakeupHandlerProcPtr)NoopDDA,
+                                      sna);
+#endif
        screen->SaveScreen = sna_save_screen;
        screen->CreateScreenResources = sna_create_screen_resources;
 
Index: src/uxa/intel.h
===================================================================
RCS file: /cvs/OpenBSD/xenocara/driver/xf86-video-intel/src/uxa/intel.h,v
retrieving revision 1.3
diff -u -p -u -r1.3 intel.h
--- src/uxa/intel.h     5 Sep 2016 11:20:18 -0000       1.3
+++ src/uxa/intel.h     11 Nov 2017 17:39:18 -0000
@@ -252,7 +252,9 @@ typedef struct intel_screen_private {
 
        int colorKey;
        XF86VideoAdaptorPtr adaptor;
+#if! HAVE_NOTIFY_FD
        ScreenBlockHandlerProcPtr BlockHandler;
+#endif
        Bool overlayOn;
 
        struct {
Index: src/uxa/intel_display.c
===================================================================
RCS file: 
/cvs/OpenBSD/xenocara/driver/xf86-video-intel/src/uxa/intel_display.c,v
retrieving revision 1.2
diff -u -p -u -r1.2 intel_display.c
--- src/uxa/intel_display.c     12 Apr 2015 19:42:07 -0000      1.2
+++ src/uxa/intel_display.c     11 Nov 2017 17:39:18 -0000
@@ -2068,6 +2068,7 @@ intel_pageflip_abort(ScrnInfoPtr scrn, x
 /*
  * Check for pending DRM events and process them.
  */
+#if !HAVE_NOTIFY_FD
 static void
 drm_wakeup_handler(pointer data, int err, pointer p)
 {
@@ -2082,6 +2083,14 @@ drm_wakeup_handler(pointer data, int err
        if (FD_ISSET(mode->fd, read_mask))
                drmHandleEvent(mode->fd, &mode->event_context);
 }
+#else
+static void
+drm_notify_fd(int fd, int ready, void *data)
+{
+       struct intel_mode *mode = data;
+       drmHandleEvent(mode->fd, &mode->event_context);
+}
+#endif
 
 /*
  * If there are any available, read drm_events
@@ -2246,9 +2255,11 @@ intel_mode_init(struct intel_screen_priv
         * registration within ScreenInit and not PreInit.
         */
        mode->flip_count = 0;
-       AddGeneralSocket(mode->fd);
+       SetNotifyFd(mode->fd, drm_notify_fd, X_NOTIFY_READ, mode);
+#if !HAVE_NOTIFY_FD
        RegisterBlockAndWakeupHandlers((BlockHandlerProcPtr)NoopDDA,
                                       drm_wakeup_handler, mode);
+#endif
 }
 
 void
@@ -2272,9 +2283,11 @@ intel_mode_close(intel_screen_private *i
 
         intel_drm_abort_scrn(intel->scrn);
 
+#if !HAVE_NOTIFY_FD
        RemoveBlockAndWakeupHandlers((BlockHandlerProcPtr)NoopDDA,
                                     drm_wakeup_handler, mode);
-       RemoveGeneralSocket(mode->fd);
+#endif
+       RemoveNotifyFd(mode->fd);
 }
 
 void
Index: src/uxa/intel_driver.c
===================================================================
RCS file: /cvs/OpenBSD/xenocara/driver/xf86-video-intel/src/uxa/intel_driver.c,v
retrieving revision 1.4
diff -u -p -u -r1.4 intel_driver.c
--- src/uxa/intel_driver.c      5 Sep 2016 11:20:18 -0000       1.4
+++ src/uxa/intel_driver.c      11 Nov 2017 17:39:19 -0000
@@ -672,8 +672,9 @@ redisplay_dirty(ScreenPtr screen, Pixmap
 }
 
 static void
-intel_dirty_update(ScreenPtr screen)
+intel_dirty_update(intel_screen_private *intel)
 {
+       ScreenPtr screen = xf86ScrnToScreen(intel->scrn);
        RegionPtr region;
        PixmapDirtyUpdatePtr ent;
 
@@ -690,6 +691,7 @@ intel_dirty_update(ScreenPtr screen)
 }
 #endif
 
+#if !HAVE_NOTIFY_FD
 static void
 I830BlockHandler(BLOCKHANDLER_ARGS_DECL)
 {
@@ -707,9 +709,22 @@ I830BlockHandler(BLOCKHANDLER_ARGS_DECL)
        intel_uxa_block_handler(intel);
        intel_video_block_handler(intel);
 #ifdef INTEL_PIXMAP_SHARING
-       intel_dirty_update(screen);
+       intel_dirty_update(intel);
 #endif
 }
+#else
+static void
+I830BlockHandler(void *data, void *timeout)
+{
+       intel_screen_private *intel = data;
+
+       intel_uxa_block_handler(intel);
+       intel_video_block_handler(intel);
+#ifdef INTEL_PIXMAP_SHARING
+       intel_dirty_update(intel);
+#endif
+}
+#endif
 
 static Bool
 intel_init_initial_framebuffer(ScrnInfoPtr scrn)
@@ -959,8 +974,14 @@ I830ScreenInit(SCREEN_INIT_ARGS_DECL)
                           "Hardware cursor initialization failed\n");
        }
 
+#if !HAVE_NOTIFY_FD
        intel->BlockHandler = screen->BlockHandler;
        screen->BlockHandler = I830BlockHandler;
+#else
+       RegisterBlockAndWakeupHandlers(I830BlockHandler,
+                                      (ServerWakeupHandlerProcPtr)NoopDDA,
+                                      intel);
+#endif
 
 #ifdef INTEL_PIXMAP_SHARING
        screen->StartPixmapTracking = PixmapStartDirtyTracking;

-- 
Matthieu Herrb

Reply via email to