Commit b27cf309 authored by Dave Airlie's avatar Dave Airlie

xserver/config: add udev/drm hotplug callbacks. (v2)

This adds callbacks into the ddx for udev gpu hotplug.

v2: fix some strncmp returns.
Reviewed-by: Keith Packard's avatarKeith Packard <keithp@keithp.com>
Signed-off-by: default avatarDave Airlie <airlied@redhat.com>
parent 53b66c08
...@@ -52,6 +52,12 @@ ...@@ -52,6 +52,12 @@
static struct udev_monitor *udev_monitor; static struct udev_monitor *udev_monitor;
#ifdef CONFIG_UDEV_KMS
static Bool
config_udev_odev_setup_attribs(const char *path, const char *syspath,
config_odev_probe_proc_ptr probe_callback);
#endif
static void static void
device_added(struct udev_device *udev_device) device_added(struct udev_device *udev_device)
{ {
...@@ -85,6 +91,20 @@ device_added(struct udev_device *udev_device) ...@@ -85,6 +91,20 @@ device_added(struct udev_device *udev_device)
if (!SeatId && strcmp(dev_seat, "seat0")) if (!SeatId && strcmp(dev_seat, "seat0"))
return; return;
#ifdef CONFIG_UDEV_KMS
if (!strcmp(udev_device_get_subsystem(udev_device), "drm")) {
const char *sysname = udev_device_get_sysname(udev_device);
if (strncmp(sysname, "card", 4) != 0)
return;
LogMessage(X_INFO, "config/udev: Adding drm device (%s)\n", path);
config_udev_odev_setup_attribs(path, syspath, NewGPUDeviceRequest);
return;
}
#endif
if (!udev_device_get_property_value(udev_device, "ID_INPUT")) { if (!udev_device_get_property_value(udev_device, "ID_INPUT")) {
LogMessageVerb(X_INFO, 10, LogMessageVerb(X_INFO, 10,
"config/udev: ignoring device %s without " "config/udev: ignoring device %s without "
...@@ -240,6 +260,22 @@ device_removed(struct udev_device *device) ...@@ -240,6 +260,22 @@ device_removed(struct udev_device *device)
char *value; char *value;
const char *syspath = udev_device_get_syspath(device); const char *syspath = udev_device_get_syspath(device);
#ifdef CONFIG_UDEV_KMS
if (!strcmp(udev_device_get_subsystem(device), "drm")) {
const char *sysname = udev_device_get_sysname(device);
const char *path = udev_device_get_devnode(device);
if (strncmp(sysname,"card", 4) != 0)
return;
ErrorF("removing GPU device %s %d\n", syspath, path);
if (!path)
return;
config_udev_odev_setup_attribs(path, syspath, DeleteGPUDeviceRequest);
return;
}
#endif
if (asprintf(&value, "udev:%s", syspath) == -1) if (asprintf(&value, "udev:%s", syspath) == -1)
return; return;
...@@ -296,6 +332,9 @@ config_udev_pre_init(void) ...@@ -296,6 +332,9 @@ config_udev_pre_init(void)
udev_monitor_filter_add_match_subsystem_devtype(udev_monitor, "input", udev_monitor_filter_add_match_subsystem_devtype(udev_monitor, "input",
NULL); NULL);
udev_monitor_filter_add_match_subsystem_devtype(udev_monitor, "tty", NULL); /* For Wacom serial devices */ udev_monitor_filter_add_match_subsystem_devtype(udev_monitor, "tty", NULL); /* For Wacom serial devices */
#ifdef CONFIG_UDEV_KMS
udev_monitor_filter_add_match_subsystem_devtype(udev_monitor, "drm", NULL); /* For output GPU devices */
#endif
#ifdef HAVE_UDEV_MONITOR_FILTER_ADD_MATCH_TAG #ifdef HAVE_UDEV_MONITOR_FILTER_ADD_MATCH_TAG
if (SeatId && strcmp(SeatId, "seat0")) if (SeatId && strcmp(SeatId, "seat0"))
...@@ -322,6 +361,9 @@ config_udev_init(void) ...@@ -322,6 +361,9 @@ config_udev_init(void)
udev_enumerate_add_match_subsystem(enumerate, "input"); udev_enumerate_add_match_subsystem(enumerate, "input");
udev_enumerate_add_match_subsystem(enumerate, "tty"); udev_enumerate_add_match_subsystem(enumerate, "tty");
#ifdef CONFIG_UDEV_KMS
udev_enumerate_add_match_subsystem(enumerate, "drm");
#endif
#ifdef HAVE_UDEV_ENUMERATE_ADD_MATCH_TAG #ifdef HAVE_UDEV_ENUMERATE_ADD_MATCH_TAG
if (SeatId && strcmp(SeatId, "seat0")) if (SeatId && strcmp(SeatId, "seat0"))
......
...@@ -65,4 +65,8 @@ config_odev_free_attributes(struct OdevAttributes *attribs); ...@@ -65,4 +65,8 @@ config_odev_free_attributes(struct OdevAttributes *attribs);
typedef void (*config_odev_probe_proc_ptr)(struct OdevAttributes *attribs); typedef void (*config_odev_probe_proc_ptr)(struct OdevAttributes *attribs);
void config_odev_probe(config_odev_probe_proc_ptr probe_callback); void config_odev_probe(config_odev_probe_proc_ptr probe_callback);
#ifdef CONFIG_UDEV_KMS
void NewGPUDeviceRequest(struct OdevAttributes *attribs);
void DeleteGPUDeviceRequest(struct OdevAttributes *attribs);
#endif
#endif /* HOTPLUG_H */ #endif /* HOTPLUG_H */
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment