@@ -1171,6 +1171,11 @@ EnterVT(ScrnInfoPtr pScrn)
SetMaster(pScrn);
+ if (ms->drmmode.need_reprobe) {
+ drmmode_output_eval(&ms->drmmode);
+ ms->drmmode.need_reprobe = FALSE;
+ }
+
if (!drmmode_set_desired_modes(pScrn, &ms->drmmode))
return FALSE;
@@ -1487,6 +1487,14 @@ drmmode_setup_colormap(ScreenPtr pScreen, ScrnInfoPtr pScrn)
}
#ifdef CONFIG_UDEV_KMS
+void
+drmmode_output_eval(drmmode_ptr drmmode)
+{
+ ScrnInfoPtr scrn = drmmode->scrn;
+
+ RRGetInfo(xf86ScrnToScreen(scrn), TRUE);
+}
+
static void
drmmode_handle_uevents(int fd, void *closure)
{
@@ -1498,7 +1506,13 @@ drmmode_handle_uevents(int fd, void *closure)
if (!dev)
return;
- RRGetInfo(xf86ScrnToScreen(scrn), TRUE);
+ if (udev_device_get_property_value(dev, "HOTPLUG")) {
+ if (scrn->vtSema)
+ drmmode_output_eval(drmmode);
+ else
+ drmmode->need_reprobe = TRUE;
+ }
+
udev_device_unref(dev);
}
#endif
@@ -57,6 +57,7 @@ typedef struct {
Bool sw_cursor;
Bool glamor;
+ Bool need_reprobe;
Bool shadow_enable;
void *shadow_fb;
@@ -139,6 +140,8 @@ void drmmode_adjust_frame(ScrnInfoPtr pScrn, drmmode_ptr drmmode, int x, int y);
extern Bool drmmode_set_desired_modes(ScrnInfoPtr pScrn, drmmode_ptr drmmode);
extern Bool drmmode_setup_colormap(ScreenPtr pScreen, ScrnInfoPtr pScrn);
+extern void drmmode_output_eval(drmmode_ptr dmmode);
+
extern void drmmode_uevent_init(ScrnInfoPtr scrn, drmmode_ptr drmmode);
extern void drmmode_uevent_fini(ScrnInfoPtr scrn, drmmode_ptr drmmode);