+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_errno(r, "grdev: %s: cannot add DRM device for %s: %m",
+ session->name, udev_device_get_syspath(ud));
+ 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;
+
+ grdev_drm_card_hotplug(card, ud);
+}
+