summaryrefslogtreecommitdiff
blob: 1d16e132f62a57f97853459f3b23d1d86b245d29 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
Merged upstream into master, this is the backport PR variant.

https://gitlab.freedesktop.org/xorg/xserver/-/merge_requests/833
https://bugs.gentoo.org/829496

From: Jocelyn Falempe <jfalempe@redhat.com>
Date: Thu, 16 Dec 2021 15:46:43 +0100
Subject: [PATCH 1/2] xf86/logind: Fix compilation error when built without
 logind/platform bus

This was introduced by commit 8eb1396d

Closes: https://gitlab.freedesktop.org/xorg/xserver/-/issues/1269
Fixes: da9d012a9 - xf86/logind: Fix drm_drop_master before vt_reldisp

Signed-off-by: Jocelyn Falempe <jfalempe@redhat.com>
Reviewed-by: Hans de Goede <hdegoede@redhat.com>
--- a/hw/xfree86/common/xf86Events.c
+++ b/hw/xfree86/common/xf86Events.c
@@ -383,14 +383,7 @@ xf86VTLeave(void)
         xf86GPUScreens[i]->LeaveVT(xf86GPUScreens[i]);
 
     if (systemd_logind_controls_session()) {
-        for (i = 0; i < xf86_num_platform_devices; i++) {
-            if (xf86_platform_devices[i].flags & XF86_PDEV_SERVER_FD) {
-                int major, minor;
-                major = xf86_platform_odev_attributes(i)->major;
-                minor = xf86_platform_odev_attributes(i)->minor;
-                systemd_logind_drop_master(major, minor);
-            }
-        }
+        systemd_logind_drop_master();
     }
 
     if (!xf86VTSwitchAway())
--- a/hw/xfree86/os-support/linux/systemd-logind.c
+++ b/hw/xfree86/os-support/linux/systemd-logind.c
@@ -308,13 +308,19 @@ cleanup:
  * and ensure the drm_drop_master is done before
  * VT_RELDISP when switching VT
  */
-void systemd_logind_drop_master(int _major, int _minor)
+void systemd_logind_drop_master(void)
 {
-    struct systemd_logind_info *info = &logind_info;
-    dbus_int32_t major = _major;
-    dbus_int32_t minor = _minor;
+    int i;
+    for (i = 0; i < xf86_num_platform_devices; i++) {
+        if (xf86_platform_devices[i].flags & XF86_PDEV_SERVER_FD) {
+            dbus_int32_t major, minor;
+            struct systemd_logind_info *info = &logind_info;
 
-    systemd_logind_ack_pause(info, minor, major);
+            major = xf86_platform_odev_attributes(i)->major;
+            minor = xf86_platform_odev_attributes(i)->minor;
+            systemd_logind_ack_pause(info, minor, major);
+        }
+    }
 }
 
 static DBusHandlerResult
--- a/include/systemd-logind.h
+++ b/include/systemd-logind.h
@@ -33,7 +33,7 @@ int systemd_logind_take_fd(int major, int minor, const char *path, Bool *paus);
 void systemd_logind_release_fd(int major, int minor, int fd);
 int systemd_logind_controls_session(void);
 void systemd_logind_vtenter(void);
-void systemd_logind_drop_master(int major, int minor);
+void systemd_logind_drop_master(void);
 #else
 #define systemd_logind_init()
 #define systemd_logind_fini()
@@ -41,7 +41,7 @@ void systemd_logind_drop_master(int major, int minor);
 #define systemd_logind_release_fd(major, minor, fd) close(fd)
 #define systemd_logind_controls_session() 0
 #define systemd_logind_vtenter()
-#define systemd_logind_drop_master(major, minor)
+#define systemd_logind_drop_master()
 #endif
 
 #endif
GitLab
From 66890ca569291a53ea9cdc6ec19070173e522260 Mon Sep 17 00:00:00 2001
From: Jocelyn Falempe <jfalempe@redhat.com>
Date: Fri, 17 Dec 2021 10:18:25 +0100
Subject: [PATCH 2/2] xf86/logind: fix missing call to vtenter if the platform
 device is not paused

If there is one platform device, which is not paused nor resumed,
systemd_logind_vtenter() will never get called.
This break suspend/resume, and switching to VT on system with Nvidia
proprietary driver.
This is a regression introduced by f5bd039633fa83

So now call systemd_logind_vtenter() if there are no paused
platform devices.

Closes: https://gitlab.freedesktop.org/xorg/xserver/-/issues/1271
Fixes: f5bd0396 - xf86/logind: fix call systemd_logind_vtenter after receiving drm device resume

Signed-off-by: Jocelyn Falempe <jfalempe@redhat.com>
Tested-by: Olivier Fourdan <ofourdan@redhat.com>
Reviewed-by: Hans de Goede <hdegoede@redhat.com>
--- a/hw/xfree86/os-support/linux/systemd-logind.c
+++ b/hw/xfree86/os-support/linux/systemd-logind.c
@@ -316,6 +316,7 @@ void systemd_logind_drop_master(void)
             dbus_int32_t major, minor;
             struct systemd_logind_info *info = &logind_info;
 
+            xf86_platform_devices[i].flags |= XF86_PDEV_PAUSED;
             major = xf86_platform_odev_attributes(i)->major;
             minor = xf86_platform_odev_attributes(i)->minor;
             systemd_logind_ack_pause(info, minor, major);
@@ -323,6 +324,16 @@ void systemd_logind_drop_master(void)
     }
 }
 
+static Bool are_platform_devices_resumed(void) {
+    int i;
+    for (i = 0; i < xf86_num_platform_devices; i++) {
+        if (xf86_platform_devices[i].flags & XF86_PDEV_PAUSED) {
+            return FALSE;
+        }
+    }
+    return TRUE;
+}
+
 static DBusHandlerResult
 message_filter(DBusConnection * connection, DBusMessage * message, void *data)
 {
@@ -416,13 +427,11 @@ message_filter(DBusConnection * connection, DBusMessage * message, void *data)
 
         if (pdev) {
             pdev->flags &= ~XF86_PDEV_PAUSED;
-            systemd_logind_vtenter();
         } else
             systemd_logind_set_input_fd_for_all_devs(major, minor, fd,
                                                      info->vt_active);
-
-        /* Always call vtenter(), only if there are only legacy video devs */
-        if (!xf86_num_platform_devices)
+        /* Call vtenter if all platform devices are resumed, or if there are no platform device */
+        if (are_platform_devices_resumed())
             systemd_logind_vtenter();
     }
     return DBUS_HANDLER_RESULT_HANDLED;
GitLab