]> git.ipfire.org Git - people/arne_f/ipfire-3.x.git/blobdiff - xorg-x11-drv-intel/patches/uevent.patch
Move all packages to root.
[people/arne_f/ipfire-3.x.git] / xorg-x11-drv-intel / patches / uevent.patch
diff --git a/xorg-x11-drv-intel/patches/uevent.patch b/xorg-x11-drv-intel/patches/uevent.patch
new file mode 100644 (file)
index 0000000..ab040fa
--- /dev/null
@@ -0,0 +1,146 @@
+diff -up xf86-video-intel-2.12.0/src/i830_driver.c.uevent xf86-video-intel-2.12.0/src/i830_driver.c
+--- xf86-video-intel-2.12.0/src/i830_driver.c.uevent   2010-06-24 16:29:49.000000000 -0400
++++ xf86-video-intel-2.12.0/src/i830_driver.c  2010-06-25 11:40:01.335975581 -0400
+@@ -81,6 +81,8 @@ USE OR OTHER DEALINGS IN THE SOFTWARE.
+ #include "i915_drm.h"
+ #include <xf86drmMode.h>
++#include "libudev.h"
++
+ #define BIT(x) (1 << (x))
+ #define MAX(a,b) ((a) > (b) ? (a) : (b))
+ #define NB_OF(x) (sizeof (x) / sizeof (*x))
+@@ -996,6 +998,80 @@ int i830_crtc_to_pipe(xf86CrtcPtr crtc)
+       return drmmode_get_pipe_from_crtc_id(intel->bufmgr, crtc);
+ }
++static void
++I830HandleUEvents(int fd, void *closure)
++{
++    ScrnInfoPtr scrn = closure;
++      intel_screen_private *intel = intel_get_screen_private(scrn);
++    struct udev_device *dev;
++
++    dev = udev_monitor_receive_device(intel->uevent_monitor);
++    if (!dev)
++      return;
++
++    /*
++     * technically we should inspect the event to see that it's a hotplug.
++     * but we know it's a hotplug, we don't get events for anything else.
++     * XXX but we should definitely trim by drm node
++     */
++
++    RRGetInfo(screenInfo.screens[scrn->scrnIndex], TRUE);
++
++    udev_device_unref(dev);
++}
++
++static void
++I830UeventInit(ScrnInfoPtr scrn)
++{
++      intel_screen_private *intel = intel_get_screen_private(scrn);
++    struct udev *u;
++    struct udev_monitor *mon;
++
++    u = udev_new();
++    if (!u)
++      return;
++
++    mon = udev_monitor_new_from_netlink(u, "udev");
++
++    if (!mon) {
++      udev_unref(u);
++      return;
++    }
++
++    if (udev_monitor_filter_add_match_subsystem_devtype(mon,
++                                                      "drm",
++                                                      "drm_minor") < 0 ||
++      udev_monitor_enable_receiving(mon) < 0)
++    {
++      udev_monitor_unref(mon);
++      udev_unref(u);
++      return;
++    }
++
++    intel->uevent_handler =
++      xf86AddGeneralHandler(udev_monitor_get_fd(mon),
++                            I830HandleUEvents,
++                            scrn);
++
++    intel->uevent_monitor = mon;
++}
++
++static void
++I830UeventFini(ScrnInfoPtr scrn)
++{
++      intel_screen_private *intel = intel_get_screen_private(scrn);
++
++    if (intel->uevent_handler)
++    {
++      struct udev *u = udev_monitor_get_udev(intel->uevent_monitor);
++
++      xf86RemoveGeneralHandler(intel->uevent_handler);
++
++      udev_monitor_unref(intel->uevent_monitor);
++      udev_unref(u);
++    }
++}
++
+ static Bool
+ I830ScreenInit(int scrnIndex, ScreenPtr screen, int argc, char **argv)
+ {
+@@ -1233,6 +1309,8 @@ I830ScreenInit(int scrnIndex, ScreenPtr 
+       intel->suspended = FALSE;
++      I830UeventInit(scrn);
++
+       return uxa_resources_init(screen);
+ }
+@@ -1306,7 +1384,8 @@ static Bool I830CloseScreen(int scrnInde
+ {
+       ScrnInfoPtr scrn = xf86Screens[scrnIndex];
+       intel_screen_private *intel = intel_get_screen_private(scrn);
+-
++ 
++      I830UeventFini(scrn);
+       if (scrn->vtSema == TRUE) {
+               I830LeaveVT(scrnIndex, 0);
+       }
+diff -up xf86-video-intel-2.12.0/src/i830.h.uevent xf86-video-intel-2.12.0/src/i830.h
+--- xf86-video-intel-2.12.0/src/i830.h.uevent  2010-06-24 16:29:49.000000000 -0400
++++ xf86-video-intel-2.12.0/src/i830.h 2010-06-25 11:39:15.665029821 -0400
+@@ -47,6 +47,8 @@ SOFTWARE OR THE USE OR OTHER DEALINGS IN
+ #ifndef _I830_H_
+ #define _I830_H_
++#include "libudev.h"
++
+ #include "xf86_OSproc.h"
+ #include "compiler.h"
+ #include "xf86PciInfo.h"
+@@ -432,6 +434,9 @@ typedef struct intel_screen_private {
+        */
+       Bool fallback_debug;
+       unsigned debug_flush;
++
++      struct udev_monitor *uevent_monitor;
++      InputHandlerProc uevent_handler;
+ } intel_screen_private;
+ enum {
+diff -up xf86-video-intel-2.12.0/src/Makefile.am.uevent xf86-video-intel-2.12.0/src/Makefile.am
+--- xf86-video-intel-2.12.0/src/Makefile.am.uevent     2010-06-24 16:29:37.000000000 -0400
++++ xf86-video-intel-2.12.0/src/Makefile.am    2010-06-25 11:39:15.665029821 -0400
+@@ -32,7 +32,7 @@ AM_CFLAGS = @CWARNFLAGS@ @XORG_CFLAGS@ @
+ intel_drv_la_LTLIBRARIES = intel_drv.la
+ intel_drv_la_LDFLAGS = -module -avoid-version
+ intel_drv_ladir = @moduledir@/drivers
+-intel_drv_la_LIBADD = -lm @DRM_LIBS@ -ldrm_intel ../uxa/libuxa.la
++intel_drv_la_LIBADD = -ludev -lm @DRM_LIBS@ -ldrm_intel ../uxa/libuxa.la
+ intel_drv_la_LIBADD += @PCIACCESS_LIBS@
+ INTEL_DRI_SRCS = \