diff --git a/packages/x11/driver/xf86-video-intel/build b/packages/x11/driver/xf86-video-intel/build index 4aea189841..78d248e394 100755 --- a/packages/x11/driver/xf86-video-intel/build +++ b/packages/x11/driver/xf86-video-intel/build @@ -5,6 +5,7 @@ $SCRIPTS/build toolchain $SCRIPTS/build util-macros $SCRIPTS/build fontsproto +$SCRIPTS/build udev $SCRIPTS/build xorg-server xorg_drv_configure_prepend @@ -14,6 +15,9 @@ xorg_drv_configure_prepend CXXFLAGS=`echo $CXXFLAGS | sed -e "s|-Os|-O3|"` cd $PKG_BUILD + +$AUTORECONF + ./configure --host=$TARGET_NAME \ --build=$HOST_NAME \ --prefix=/usr \ diff --git a/packages/x11/driver/xf86-video-intel/install b/packages/x11/driver/xf86-video-intel/install index a6c558a5dd..5b93d4ee52 100755 --- a/packages/x11/driver/xf86-video-intel/install +++ b/packages/x11/driver/xf86-video-intel/install @@ -2,5 +2,7 @@ . config/options +$SCRIPTS/install udev + mkdir -p $INSTALL/$XORG_PATH_MODULES/drivers cp -P $PKG_BUILD/src/.libs/intel_drv.so $INSTALL/$XORG_PATH_MODULES/drivers diff --git a/packages/x11/driver/xf86-video-intel/patches/uevent.diff b/packages/x11/driver/xf86-video-intel/patches/uevent.diff new file mode 100644 index 0000000000..b978d4774c --- /dev/null +++ b/packages/x11/driver/xf86-video-intel/patches/uevent.diff @@ -0,0 +1,146 @@ +diff -up xf86-video-intel-2.10.0/src/i830_driver.c.dave xf86-video-intel-2.10.0/src/i830_driver.c +--- xf86-video-intel-2.10.0/src/i830_driver.c.dave 2010-01-13 18:48:49.000000000 +1000 ++++ xf86-video-intel-2.10.0/src/i830_driver.c 2010-01-13 18:51:09.000000000 +1000 +@@ -83,6 +83,8 @@ USE OR OTHER DEALINGS IN THE SOFTWARE. + #include "i915_drm.h" + #include + ++#include "libudev.h" ++ + #define BIT(x) (1 << (x)) + #define MAX(a,b) ((a) > (b) ? (a) : (b)) + #define NB_OF(x) (sizeof (x) / sizeof (*x)) +@@ -1167,6 +1169,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) + { +@@ -1425,6 +1501,8 @@ I830ScreenInit(int scrnIndex, ScreenPtr + + intel->suspended = FALSE; + ++ I830UeventInit(scrn); ++ + return TRUE; + } + +@@ -1529,7 +1607,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.10.0/src/i830.h.dave xf86-video-intel-2.10.0/src/i830.h +--- xf86-video-intel-2.10.0/src/i830.h.dave 2010-01-13 18:48:50.000000000 +1000 ++++ xf86-video-intel-2.10.0/src/i830.h 2010-01-13 18:50:01.000000000 +1000 +@@ -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" +@@ -385,6 +387,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.10.0/src/Makefile.am.dave xf86-video-intel-2.10.0/src/Makefile.am +--- xf86-video-intel-2.10.0/src/Makefile.am.dave 2010-01-05 08:09:52.000000000 +1000 ++++ xf86-video-intel-2.10.0/src/Makefile.am 2010-01-13 18:49:14.000000000 +1000 +@@ -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 = -lm @DRM_LIBS@ -ldrm_intel ../uxa/libuxa.la -ludev + intel_drv_la_LIBADD += @PCIACCESS_LIBS@ + + INTEL_DRI_SRCS = \