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 <keithp@keithp.com> Signed-off-by: Dave Airlie <airlied@redhat.com>
This commit is contained in:
parent
53b66c084f
commit
b27cf30995
|
@ -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)
|
||||||
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)
|
||||||
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)
|
||||||
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)
|
||||||
|
|
||||||
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);
|
||||||
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 */
|
||||||
|
|
Loading…
Reference in New Issue
Block a user