|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
From 6221d249d1f03d235a23a284c597c86676b32d2f Mon Sep 17 00:00:00 2001
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
From: David Herrmann <dh.herrmann@gmail.com>
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
Date: Sat, 20 Sep 2014 09:50:10 +0200
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
Subject: [PATCH] terminal: grdev: refresh device state on hotplug events
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
Whenever we get udev hotplug events, re-read the device state so we
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
properly detect any changed in the display setups.
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
---
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
src/libsystemd-terminal/grdev-drm.c | 32 +++++++++++++++++++++++++++++++-
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
src/libsystemd-terminal/grdev-internal.h | 1 +
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
src/libsystemd-terminal/grdev.c | 2 +-
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
3 files changed, 33 insertions(+), 2 deletions(-)
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
diff --git a/src/libsystemd-terminal/grdev-drm.c b/src/libsystemd-terminal/grdev-drm.c
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
index 3481584fbf..f0f0448635 100644
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
--- a/src/libsystemd-terminal/grdev-drm.c
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+++ b/src/libsystemd-terminal/grdev-drm.c
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
@@ -2096,8 +2096,11 @@ static void grdrm_card_hotplug(grdrm_card *card) {
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
int r;
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
assert(card);
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
- assert(!card->ready);
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+ if (!card->running)
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+ return;
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+ card->ready = false;
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
r = grdrm_card_resync(card);
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
if (r < 0) {
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
log_debug("grdrm: %s/%s: cannot re-sync card: %s",
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
@@ -2955,3 +2958,30 @@ int grdev_drm_card_new(grdev_card **out, grdev_session *session, struct udev_dev
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
return session->managed ? managed_card_new(out, session, ud) : unmanaged_card_new(out, session, ud);
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
}
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+void grdev_drm_card_hotplug(grdev_card *basecard, struct udev_device *ud) {
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+ const char *p, *action;
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+ grdrm_card *card;
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+ dev_t devnum;
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+ assert(basecard);
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+ assert(grdev_is_drm_card(basecard));
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+ assert(ud);
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+ card = grdrm_card_from_base(basecard);
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+ action = udev_device_get_action(ud);
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+ if (!action || streq(action, "add") || streq(action, "remove")) {
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+ /* If we get add/remove events on DRM nodes without devnum, we
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+ * got hotplugged DRM objects so refresh the device. */
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+ devnum = udev_device_get_devnum(ud);
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+ if (devnum == 0)
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+ grdrm_card_hotplug(card);
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+ } else if (streq_ptr(action, "change")) {
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+ /* A change event with HOTPLUG=1 is sent whenever a connector
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+ * changed state. Refresh the device to update our state. */
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+ p = udev_device_get_property_value(ud, "HOTPLUG");
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+ if (streq_ptr(p, "1"))
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+ grdrm_card_hotplug(card);
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+ }
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+}
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
diff --git a/src/libsystemd-terminal/grdev-internal.h b/src/libsystemd-terminal/grdev-internal.h
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
index 0064f0be02..96830a714c 100644
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
--- a/src/libsystemd-terminal/grdev-internal.h
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+++ b/src/libsystemd-terminal/grdev-internal.h
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
@@ -47,6 +47,7 @@ typedef struct grdev_card grdev_card;
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
bool grdev_is_drm_card(grdev_card *card);
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
grdev_card *grdev_find_drm_card(grdev_session *session, dev_t devnum);
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
int grdev_drm_card_new(grdev_card **out, grdev_session *session, struct udev_device *ud);
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+void grdev_drm_card_hotplug(grdev_card *card, struct udev_device *ud);
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
/*
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
* Displays
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
diff --git a/src/libsystemd-terminal/grdev.c b/src/libsystemd-terminal/grdev.c
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
index bb89ee7170..3e3833fc95 100644
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
--- a/src/libsystemd-terminal/grdev.c
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+++ b/src/libsystemd-terminal/grdev.c
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
@@ -1150,7 +1150,7 @@ void grdev_session_hotplug_drm(grdev_session *session, struct udev_device *ud) {
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
if (!card)
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
return;
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
- /* TODO: hotplug card */
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
+ grdev_drm_card_hotplug(card, ud);
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
}
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
|
|
Zbigniew Jędrzejewski-Szmek |
62fe94 |
static void session_configure(grdev_session *session) {
|