From 99b54f428919761231bfc2b93d5b02f31384cd1f Mon Sep 17 00:00:00 2001 From: Stephan Raue Date: Sat, 13 Feb 2010 12:16:25 +0100 Subject: [PATCH] xf86-video-intel: - add some patches from moblin --- .../xf86-video-intel/patches/copy-fb.diff | 183 ++++++++++++++++++ .../xf86-video-intel/patches/dump-tools.diff | 23 +++ .../xf86-video-intel/patches/uevent.diff | 146 ++++++++++++++ 3 files changed, 352 insertions(+) create mode 100644 packages/x11/driver/xf86-video-intel/patches/copy-fb.diff create mode 100644 packages/x11/driver/xf86-video-intel/patches/dump-tools.diff create mode 100644 packages/x11/driver/xf86-video-intel/patches/uevent.diff diff --git a/packages/x11/driver/xf86-video-intel/patches/copy-fb.diff b/packages/x11/driver/xf86-video-intel/patches/copy-fb.diff new file mode 100644 index 0000000000..783efc31e7 --- /dev/null +++ b/packages/x11/driver/xf86-video-intel/patches/copy-fb.diff @@ -0,0 +1,183 @@ +diff --git a/src/drmmode_display.c b/src/drmmode_display.c +index a469f6c..8c14b25 100644 +--- a/src/drmmode_display.c ++++ b/src/drmmode_display.c +@@ -35,6 +35,8 @@ + #include + #include + ++#include ++ + #include "xorgVersion.h" + + #include "i830.h" +@@ -911,6 +913,13 @@ drmmode_output_dpms(xf86OutputPtr output, int mode) + drmmode_ptr drmmode = drmmode_output->drmmode; + int i; + drmModePropertyPtr props; ++ intel_screen_private *intel = intel_get_screen_private(output->scrn); ++ ++ /* xf86Crtc.c calls dpms off in set desired modes, so ignore ++ * the request if we're starting up. */ ++ ++ if (intel->starting) ++ return; + + for (i = 0; i < koutput->count_props; i++) { + props = drmModeGetProperty(drmmode->fd, koutput->props[i]); +@@ -1412,6 +1421,8 @@ Bool drmmode_pre_init(ScrnInfoPtr scrn, int fd, int cpp) + + xf86InitialConfiguration(scrn, TRUE); + ++ scrn->canDoBGNoneRoot = TRUE; ++ + return TRUE; + } + +@@ -1446,3 +1457,96 @@ void drmmode_closefb(ScrnInfoPtr scrn) + drmModeRmFB(drmmode->fd, drmmode->fb_id); + drmmode->fb_id = 0; + } ++ ++static PixmapPtr ++drmmode_create_pixmap_for_fbcon(ScrnInfoPtr scrn) ++{ ++ xf86CrtcConfigPtr xf86_config = XF86_CRTC_CONFIG_PTR(scrn); ++ drmmode_crtc_private_ptr drmmode_crtc = xf86_config->crtc[0]->driver_private; ++ ScreenPtr pScreen = screenInfo.screens[scrn->scrnIndex]; ++ drmmode_ptr drmmode = drmmode_crtc->drmmode; ++ intel_screen_private *intel = intel_get_screen_private(scrn); ++ drmModeFBPtr fbcon = NULL; ++ struct drm_gem_flink flink; ++ drm_intel_bo *bo; ++ PixmapPtr pixmap = NULL; ++ int i; ++ ++ for (i = 0; i < drmmode->mode_res->count_crtcs; i++) { ++ drmmode_crtc = xf86_config->crtc[i]->driver_private; ++ if (drmmode_crtc->mode_crtc->buffer_id == 0) ++ continue; ++ fbcon = drmModeGetFB(drmmode->fd, ++ drmmode_crtc->mode_crtc->buffer_id); ++ if (fbcon != NULL) ++ break; ++ } ++ if (i == drmmode->mode_res->count_crtcs) ++ return NULL; ++ ++ flink.handle = fbcon->handle; ++ if (ioctl(drmmode->fd, DRM_IOCTL_GEM_FLINK, &flink) < 0) { ++ xf86DrvMsg(scrn->scrnIndex, X_ERROR, ++ "Couldn't flink fbcon handle\n"); ++ return NULL; ++ } ++ ++ bo = drm_intel_bo_gem_create_from_name(intel->bufmgr, ++ "fbcon", flink.name); ++ if (bo == NULL) { ++ xf86DrvMsg(scrn->scrnIndex, X_ERROR, ++ "Couldn't allocate bo for fbcon handle\n"); ++ return NULL; ++ } ++ ++ pixmap = GetScratchPixmapHeader(pScreen, ++ fbcon->width, fbcon->height, ++ fbcon->depth, fbcon->bpp, ++ fbcon->pitch, NULL); ++ if (pixmap == NULL) { ++ xf86DrvMsg(scrn->scrnIndex, X_ERROR, ++ "Couldn't allocate pixmap fbcon contents\n"); ++ return NULL; ++ } ++ ++ i830_set_pixmap_bo(pixmap, bo); ++ drm_intel_bo_unreference(bo); ++ drmModeFreeFB(fbcon); ++ ++ return pixmap; ++} ++ ++void drmmode_copy_fb(ScrnInfoPtr scrn) ++{ ++ ScreenPtr pScreen = screenInfo.screens[scrn->scrnIndex]; ++ intel_screen_private *intel = intel_get_screen_private(scrn); ++ PixmapPtr src, dst; ++ unsigned int pitch = scrn->displayWidth * intel->cpp; ++ ++ src = drmmode_create_pixmap_for_fbcon(scrn); ++ if (src == NULL) { ++ xf86DrvMsg(scrn->scrnIndex, X_ERROR, ++ "Couldn't create pixmap for fbcon\n"); ++ return; ++ } ++ ++ /* We dont have a screen Pixmap yet */ ++ dst = GetScratchPixmapHeader(pScreen, ++ scrn->virtualX, scrn->virtualY, ++ scrn->depth, scrn->bitsPerPixel, ++ pitch, ++ NULL); ++ i830_set_pixmap_bo(dst, intel->front_buffer->bo); ++ ++ intel->uxa_driver->prepare_copy(src, dst, -1, -1, GXcopy, FB_ALLONES); ++ ++ intel->uxa_driver->copy(dst, 0, 0, 0, 0, ++ scrn->virtualX, scrn->virtualY); ++ ++ intel->uxa_driver->done_copy(dst); ++ ++ intel_sync(scrn); ++ ++ (*pScreen->DestroyPixmap)(src); ++ (*pScreen->DestroyPixmap)(dst); ++} +diff --git a/src/i830.h b/src/i830.h +index a66038a..d0df26e 100644 +--- a/src/i830.h ++++ b/src/i830.h +@@ -376,6 +376,7 @@ typedef struct intel_screen_private { + OptionInfoPtr Options; + + /* Driver phase/state information */ ++ Bool starting; + Bool suspended; + + enum last_3d last_3d; +@@ -432,6 +433,7 @@ extern int drmmode_get_pipe_from_crtc_id(drm_intel_bufmgr * bufmgr, + extern int drmmode_output_dpms_status(xf86OutputPtr output); + extern int drmmode_crtc_id(xf86CrtcPtr crtc); + void drmmode_crtc_set_cursor_bo(xf86CrtcPtr crtc, dri_bo * cursor); ++extern void drmmode_copy_fb(ScrnInfoPtr scrn); + + extern Bool i830_crtc_on(xf86CrtcPtr crtc); + extern int i830_crtc_to_pipe(xf86CrtcPtr crtc); +diff --git a/src/i830_driver.c b/src/i830_driver.c +index e94a60c..da3230c 100644 +--- a/src/i830_driver.c ++++ b/src/i830_driver.c +@@ -1276,6 +1276,8 @@ I830ScreenInit(int scrnIndex, ScreenPtr screen, int argc, char **argv) + + i830_fixup_mtrrs(scrn); + ++ intel->starting = TRUE; ++ + miClearVisualTypes(); + if (!miSetVisualTypes(scrn->depth, + miGetDefaultVisualMask(scrn->depth), +@@ -1423,6 +1425,7 @@ I830ScreenInit(int scrnIndex, ScreenPtr screen, int argc, char **argv) + if (serverGeneration == 1) + xf86ShowUnusedOptions(scrn->scrnIndex, scrn->options); + ++ intel->starting = FALSE; + intel->suspended = FALSE; + + return TRUE; +@@ -1507,6 +1510,8 @@ static Bool I830EnterVT(int scrnIndex, int flags) + if (IS_I965G(intel)) + gen4_render_state_init(scrn); + ++ drmmode_copy_fb(scrn); ++ + if (!xf86SetDesiredModes(scrn)) + return FALSE; + diff --git a/packages/x11/driver/xf86-video-intel/patches/dump-tools.diff b/packages/x11/driver/xf86-video-intel/patches/dump-tools.diff new file mode 100644 index 0000000000..0ecc734a6e --- /dev/null +++ b/packages/x11/driver/xf86-video-intel/patches/dump-tools.diff @@ -0,0 +1,23 @@ +diff --git a/src/bios_reader/Makefile.am b/src/bios_reader/Makefile.am +index f2f9dc0..4be476e 100644 +--- a/src/bios_reader/Makefile.am ++++ b/src/bios_reader/Makefile.am +@@ -1,7 +1,7 @@ + AM_CFLAGS = @CWARNFLAGS@ @XORG_CFLAGS@ @PCIACCESS_CFLAGS@ \ + -DREG_DUMPER + +-noinst_PROGRAMS = bios_reader $(BIOS_DUMPER) $(SWF_DUMPER) ++bin_PROGRAMS = bios_reader $(BIOS_DUMPER) $(SWF_DUMPER) + + BIOS_DUMPER = bios_dumper + +diff --git a/src/reg_dumper/Makefile.am b/src/reg_dumper/Makefile.am +index 8f00abe..1634a4f 100644 +--- a/src/reg_dumper/Makefile.am ++++ b/src/reg_dumper/Makefile.am +@@ -1,4 +1,4 @@ +-noinst_PROGRAMS = \ ++bin_PROGRAMS = \ + intel_gtt \ + intel_statuspage \ + intel_hotplug \ 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 = \