From 07dcc3f1a98dff2ee374a15ac5beac778d2ccc97 Mon Sep 17 00:00:00 2001 From: Dave Airlie Date: Sun, 6 May 2012 17:13:02 +0100 Subject: [PATCH] config/udev: add pre_init stage to config and udev. In order to use udev for gpu enumeration, we need to init udev earlier than input initialisations. This splits the config init stuff so that udev pre init sets up before output initialisation. this is just a prepatory patch, doesn't change anything major. Reviewed-by: Peter Hutterer Signed-off-by: Dave Airlie --- config/config-backends.h | 1 + config/config.c | 9 +++++++++ config/udev.c | 16 ++++++++++++---- hw/xfree86/common/xf86Init.c | 2 ++ include/hotplug.h | 1 + 5 files changed, 25 insertions(+), 4 deletions(-) diff --git a/config/config-backends.h b/config/config-backends.h index e5622d51e0..62abc0a5f8 100644 --- a/config/config-backends.h +++ b/config/config-backends.h @@ -33,6 +33,7 @@ void remove_devices(const char *backend, const char *config_info); BOOL device_is_duplicate(const char *config_info); #ifdef CONFIG_UDEV +int config_udev_pre_init(void); int config_udev_init(void); void config_udev_fini(void); #else diff --git a/config/config.c b/config/config.c index 2b96dbb74a..24e7ba7a01 100644 --- a/config/config.c +++ b/config/config.c @@ -32,6 +32,15 @@ #include "hotplug.h" #include "config-backends.h" +void +config_pre_init(void) +{ +#ifdef CONFIG_UDEV + if (!config_udev_pre_init()) + ErrorF("[config] failed to pre-init udev\n"); +#endif +} + void config_init(void) { diff --git a/config/udev.c b/config/udev.c index 8b3ca04757..1995184f38 100644 --- a/config/udev.c +++ b/config/udev.c @@ -281,15 +281,14 @@ block_handler(pointer data, struct timeval **tv, pointer read_mask) } int -config_udev_init(void) +config_udev_pre_init(void) { struct udev *udev; - struct udev_enumerate *enumerate; - struct udev_list_entry *devices, *device; udev = udev_new(); if (!udev) return 0; + udev_monitor = udev_monitor_new_from_netlink(udev, "udev"); if (!udev_monitor) return 0; @@ -302,12 +301,21 @@ config_udev_init(void) if (SeatId && strcmp(SeatId, "seat0")) udev_monitor_filter_add_match_tag(udev_monitor, SeatId); #endif - if (udev_monitor_enable_receiving(udev_monitor)) { ErrorF("config/udev: failed to bind the udev monitor\n"); return 0; } + return 1; +} +int +config_udev_init(void) +{ + struct udev *udev; + struct udev_enumerate *enumerate; + struct udev_list_entry *devices, *device; + + udev = udev_monitor_get_udev(udev_monitor); enumerate = udev_enumerate_new(udev); if (!enumerate) return 0; diff --git a/hw/xfree86/common/xf86Init.c b/hw/xfree86/common/xf86Init.c index f42dd1083c..ead47ccba7 100644 --- a/hw/xfree86/common/xf86Init.c +++ b/hw/xfree86/common/xf86Init.c @@ -405,6 +405,8 @@ InitOutput(ScreenInfo * pScreenInfo, int argc, char **argv) xf86Initialising = TRUE; + config_pre_init(); + if (serverGeneration == 1) { if ((xf86ServerName = strrchr(argv[0], '/')) != 0) xf86ServerName++; diff --git a/include/hotplug.h b/include/hotplug.h index caa3201e7a..f3eeea21d8 100644 --- a/include/hotplug.h +++ b/include/hotplug.h @@ -26,6 +26,7 @@ #ifndef HOTPLUG_H #define HOTPLUG_H +extern _X_EXPORT void config_pre_init(void); extern _X_EXPORT void config_init(void); extern _X_EXPORT void config_fini(void);