X-Git-Url: https://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?a=blobdiff_plain;f=src%2Flibsystemd-terminal%2Fgrdev.c;h=bb89ee7170c9cc9ac886870009f8abcd6a461bdb;hb=a3eabec96b872bbf581c9bfa81ecc9c2819b8de8;hp=ab1c407ecb7a3f40aa5d0c901886499e269cf362;hpb=650c5444273993f969b9cd7df9add6ab2df0414e;p=elogind.git diff --git a/src/libsystemd-terminal/grdev.c b/src/libsystemd-terminal/grdev.c index ab1c407ec..bb89ee717 100644 --- a/src/libsystemd-terminal/grdev.c +++ b/src/libsystemd-terminal/grdev.c @@ -20,6 +20,7 @@ ***/ #include +#include #include #include #include @@ -30,6 +31,7 @@ #include "hashmap.h" #include "login-shared.h" #include "macro.h" +#include "udev-util.h" #include "util.h" static void pipe_enable(grdev_pipe *pipe); @@ -1083,6 +1085,74 @@ void grdev_session_restore(grdev_session *session) { card->vtable->restore(card); } +void grdev_session_add_drm(grdev_session *session, struct udev_device *ud) { + grdev_card *card; + dev_t devnum; + int r; + + assert(session); + assert(ud); + + devnum = udev_device_get_devnum(ud); + if (devnum == 0) + return grdev_session_hotplug_drm(session, ud); + + card = grdev_find_drm_card(session, devnum); + if (card) + return; + + r = grdev_drm_card_new(&card, session, ud); + if (r < 0) { + log_debug("grdev: %s: cannot add DRM device for %s: %s", + session->name, udev_device_get_syspath(ud), strerror(-r)); + return; + } + + session_add_card(session, card); +} + +void grdev_session_remove_drm(grdev_session *session, struct udev_device *ud) { + grdev_card *card; + dev_t devnum; + + assert(session); + assert(ud); + + devnum = udev_device_get_devnum(ud); + if (devnum == 0) + return grdev_session_hotplug_drm(session, ud); + + card = grdev_find_drm_card(session, devnum); + if (!card) + return; + + session_remove_card(session, card); +} + +void grdev_session_hotplug_drm(grdev_session *session, struct udev_device *ud) { + grdev_card *card = NULL; + struct udev_device *p; + dev_t devnum; + + assert(session); + assert(ud); + + for (p = ud; p; p = udev_device_get_parent_with_subsystem_devtype(p, "drm", NULL)) { + devnum = udev_device_get_devnum(ud); + if (devnum == 0) + continue; + + card = grdev_find_drm_card(session, devnum); + if (card) + break; + } + + if (!card) + return; + + /* TODO: hotplug card */ +} + static void session_configure(grdev_session *session) { grdev_display *display; grdev_tile *tile;