]>
Commit | Line | Data |
---|---|---|
e1244b71 SS |
1 | diff -up xf86-video-intel-2.12.0/src/i830_driver.c.uevent xf86-video-intel-2.12.0/src/i830_driver.c |
2 | --- xf86-video-intel-2.12.0/src/i830_driver.c.uevent 2010-06-24 16:29:49.000000000 -0400 | |
3 | +++ xf86-video-intel-2.12.0/src/i830_driver.c 2010-06-25 11:40:01.335975581 -0400 | |
4 | @@ -81,6 +81,8 @@ USE OR OTHER DEALINGS IN THE SOFTWARE. | |
5 | #include "i915_drm.h" | |
6 | #include <xf86drmMode.h> | |
7 | ||
8 | +#include "libudev.h" | |
9 | + | |
10 | #define BIT(x) (1 << (x)) | |
11 | #define MAX(a,b) ((a) > (b) ? (a) : (b)) | |
12 | #define NB_OF(x) (sizeof (x) / sizeof (*x)) | |
13 | @@ -996,6 +998,80 @@ int i830_crtc_to_pipe(xf86CrtcPtr crtc) | |
14 | return drmmode_get_pipe_from_crtc_id(intel->bufmgr, crtc); | |
15 | } | |
16 | ||
17 | +static void | |
18 | +I830HandleUEvents(int fd, void *closure) | |
19 | +{ | |
20 | + ScrnInfoPtr scrn = closure; | |
21 | + intel_screen_private *intel = intel_get_screen_private(scrn); | |
22 | + struct udev_device *dev; | |
23 | + | |
24 | + dev = udev_monitor_receive_device(intel->uevent_monitor); | |
25 | + if (!dev) | |
26 | + return; | |
27 | + | |
28 | + /* | |
29 | + * technically we should inspect the event to see that it's a hotplug. | |
30 | + * but we know it's a hotplug, we don't get events for anything else. | |
31 | + * XXX but we should definitely trim by drm node | |
32 | + */ | |
33 | + | |
34 | + RRGetInfo(screenInfo.screens[scrn->scrnIndex], TRUE); | |
35 | + | |
36 | + udev_device_unref(dev); | |
37 | +} | |
38 | + | |
39 | +static void | |
40 | +I830UeventInit(ScrnInfoPtr scrn) | |
41 | +{ | |
42 | + intel_screen_private *intel = intel_get_screen_private(scrn); | |
43 | + struct udev *u; | |
44 | + struct udev_monitor *mon; | |
45 | + | |
46 | + u = udev_new(); | |
47 | + if (!u) | |
48 | + return; | |
49 | + | |
50 | + mon = udev_monitor_new_from_netlink(u, "udev"); | |
51 | + | |
52 | + if (!mon) { | |
53 | + udev_unref(u); | |
54 | + return; | |
55 | + } | |
56 | + | |
57 | + if (udev_monitor_filter_add_match_subsystem_devtype(mon, | |
58 | + "drm", | |
59 | + "drm_minor") < 0 || | |
60 | + udev_monitor_enable_receiving(mon) < 0) | |
61 | + { | |
62 | + udev_monitor_unref(mon); | |
63 | + udev_unref(u); | |
64 | + return; | |
65 | + } | |
66 | + | |
67 | + intel->uevent_handler = | |
68 | + xf86AddGeneralHandler(udev_monitor_get_fd(mon), | |
69 | + I830HandleUEvents, | |
70 | + scrn); | |
71 | + | |
72 | + intel->uevent_monitor = mon; | |
73 | +} | |
74 | + | |
75 | +static void | |
76 | +I830UeventFini(ScrnInfoPtr scrn) | |
77 | +{ | |
78 | + intel_screen_private *intel = intel_get_screen_private(scrn); | |
79 | + | |
80 | + if (intel->uevent_handler) | |
81 | + { | |
82 | + struct udev *u = udev_monitor_get_udev(intel->uevent_monitor); | |
83 | + | |
84 | + xf86RemoveGeneralHandler(intel->uevent_handler); | |
85 | + | |
86 | + udev_monitor_unref(intel->uevent_monitor); | |
87 | + udev_unref(u); | |
88 | + } | |
89 | +} | |
90 | + | |
91 | static Bool | |
92 | I830ScreenInit(int scrnIndex, ScreenPtr screen, int argc, char **argv) | |
93 | { | |
94 | @@ -1233,6 +1309,8 @@ I830ScreenInit(int scrnIndex, ScreenPtr | |
95 | ||
96 | intel->suspended = FALSE; | |
97 | ||
98 | + I830UeventInit(scrn); | |
99 | + | |
100 | return uxa_resources_init(screen); | |
101 | } | |
102 | ||
103 | @@ -1306,7 +1384,8 @@ static Bool I830CloseScreen(int scrnInde | |
104 | { | |
105 | ScrnInfoPtr scrn = xf86Screens[scrnIndex]; | |
106 | intel_screen_private *intel = intel_get_screen_private(scrn); | |
107 | - | |
108 | + | |
109 | + I830UeventFini(scrn); | |
110 | if (scrn->vtSema == TRUE) { | |
111 | I830LeaveVT(scrnIndex, 0); | |
112 | } | |
113 | diff -up xf86-video-intel-2.12.0/src/i830.h.uevent xf86-video-intel-2.12.0/src/i830.h | |
114 | --- xf86-video-intel-2.12.0/src/i830.h.uevent 2010-06-24 16:29:49.000000000 -0400 | |
115 | +++ xf86-video-intel-2.12.0/src/i830.h 2010-06-25 11:39:15.665029821 -0400 | |
116 | @@ -47,6 +47,8 @@ SOFTWARE OR THE USE OR OTHER DEALINGS IN | |
117 | #ifndef _I830_H_ | |
118 | #define _I830_H_ | |
119 | ||
120 | +#include "libudev.h" | |
121 | + | |
122 | #include "xf86_OSproc.h" | |
123 | #include "compiler.h" | |
124 | #include "xf86PciInfo.h" | |
125 | @@ -432,6 +434,9 @@ typedef struct intel_screen_private { | |
126 | */ | |
127 | Bool fallback_debug; | |
128 | unsigned debug_flush; | |
129 | + | |
130 | + struct udev_monitor *uevent_monitor; | |
131 | + InputHandlerProc uevent_handler; | |
132 | } intel_screen_private; | |
133 | ||
134 | enum { | |
135 | diff -up xf86-video-intel-2.12.0/src/Makefile.am.uevent xf86-video-intel-2.12.0/src/Makefile.am | |
136 | --- xf86-video-intel-2.12.0/src/Makefile.am.uevent 2010-06-24 16:29:37.000000000 -0400 | |
137 | +++ xf86-video-intel-2.12.0/src/Makefile.am 2010-06-25 11:39:15.665029821 -0400 | |
138 | @@ -32,7 +32,7 @@ AM_CFLAGS = @CWARNFLAGS@ @XORG_CFLAGS@ @ | |
139 | intel_drv_la_LTLIBRARIES = intel_drv.la | |
140 | intel_drv_la_LDFLAGS = -module -avoid-version | |
141 | intel_drv_ladir = @moduledir@/drivers | |
142 | -intel_drv_la_LIBADD = -lm @DRM_LIBS@ -ldrm_intel ../uxa/libuxa.la | |
143 | +intel_drv_la_LIBADD = -ludev -lm @DRM_LIBS@ -ldrm_intel ../uxa/libuxa.la | |
144 | intel_drv_la_LIBADD += @PCIACCESS_LIBS@ | |
145 | ||
146 | INTEL_DRI_SRCS = \ |