[PATCH 07/12] hotplug: Modify OdevAttributes for server-managed fd support

Hans de Goede hdegoede at redhat.com
Wed Jan 15 06:32:21 PST 2014


With systemd-logind support, the xserver, rather then the drivers will be
responsible for opening/closing the fd for drm nodes.

The initial open will happen on probe from config/udev.c, this commit adds
a fd member to OdevAttributes to store the fd to pass it along to the driver.

The server_fd and paused flags are added to indicate wether server-
managed fds are in use for this device, and if they are if the device is
paused (no drm master rights) or not.

This commit also bumps the video ABI major, as this constitutes an ABI change.

systemd-logind tracks devices by their chardev major + minor numbers, since
we are breaking ABI anyways also add major and minor fields for easy storage /
retreival of these, as well as a utility function for getting a platform
device by devnum.

Signed-off-by: Hans de Goede <hdegoede at redhat.com>
---
 config/config.c                     |  6 +++++-
 hw/xfree86/common/xf86Module.h      |  2 +-
 hw/xfree86/common/xf86platformBus.c | 13 +++++++++++++
 include/hotplug.h                   |  9 +++++++++
 4 files changed, 28 insertions(+), 2 deletions(-)

diff --git a/config/config.c b/config/config.c
index 760cf19..07c90eb 100644
--- a/config/config.c
+++ b/config/config.c
@@ -26,6 +26,7 @@
 #ifdef HAVE_DIX_CONFIG_H
 #include <dix-config.h>
 #endif
+#include <unistd.h>
 
 #include "os.h"
 #include "inputstr.h"
@@ -130,17 +131,20 @@ config_odev_allocate_attribute_list(void)
 {
     struct OdevAttributes *attriblist;
 
-    attriblist = malloc(sizeof(struct OdevAttributes));
+    attriblist = calloc(sizeof(struct OdevAttributes), 1);
     if (!attriblist)
         return NULL;
 
     xorg_list_init(&attriblist->list);
+    attriblist->fd = -1;
     return attriblist;
 }
 
 void
 config_odev_free_attribute_list(struct OdevAttributes *attribs)
 {
+    if (attribs->server_fd)
+        close(attribs->fd);
     config_odev_free_attributes(attribs);
     free(attribs);
 }
diff --git a/hw/xfree86/common/xf86Module.h b/hw/xfree86/common/xf86Module.h
index 96ac3b0..e8c24f2 100644
--- a/hw/xfree86/common/xf86Module.h
+++ b/hw/xfree86/common/xf86Module.h
@@ -80,7 +80,7 @@ typedef enum {
  * mask is 0xFFFF0000.
  */
 #define ABI_ANSIC_VERSION	SET_ABI_VERSION(0, 4)
-#define ABI_VIDEODRV_VERSION	SET_ABI_VERSION(15, 0)
+#define ABI_VIDEODRV_VERSION	SET_ABI_VERSION(16, 0)
 #define ABI_XINPUT_VERSION	SET_ABI_VERSION(21, 0)
 #define ABI_EXTENSION_VERSION	SET_ABI_VERSION(8, 0)
 #define ABI_FONT_VERSION	SET_ABI_VERSION(0, 6)
diff --git a/hw/xfree86/common/xf86platformBus.c b/hw/xfree86/common/xf86platformBus.c
index 5875a91..993d6a4 100644
--- a/hw/xfree86/common/xf86platformBus.c
+++ b/hw/xfree86/common/xf86platformBus.c
@@ -120,6 +120,19 @@ xf86_get_platform_device_unowned(int index)
     return xf86_platform_devices[index].attribs->unowned;
 }
 
+struct xf86_platform_device *
+xf86_find_platform_device_by_devnum(int major, int minor)
+{
+    int i;
+
+    for (i = 0; i < xf86_num_platform_devices; i++) {
+        struct OdevAttributes *attr = xf86_platform_devices[i].attribs;
+        if (attr->major == major && attr->minor == minor && attr->server_fd)
+            return &xf86_platform_devices[i];
+    }
+    return NULL;
+}
+
 /*
  * xf86IsPrimaryPlatform() -- return TRUE if primary device
  * is a platform device and it matches this one.
diff --git a/include/hotplug.h b/include/hotplug.h
index 29a22c4..567edfc 100644
--- a/include/hotplug.h
+++ b/include/hotplug.h
@@ -40,7 +40,12 @@ struct OdevAttribute {
 
 struct OdevAttributes {
     struct xorg_list list;
+    int fd;
+    int major;
+    int minor;
     Bool unowned;
+    Bool paused;
+    Bool server_fd;
 };
 
 struct OdevAttributes *
@@ -72,4 +77,8 @@ void DeleteGPUDeviceRequest(struct OdevAttributes *attribs);
 #endif
 
 #define ServerIsNotSeat0() (SeatId && strcmp(SeatId, "seat0"))
+
+struct xf86_platform_device *
+xf86_find_platform_device_by_devnum(int major, int minor);
+
 #endif                          /* HOTPLUG_H */
-- 
1.8.4.2



More information about the xorg-devel mailing list