summaryrefslogtreecommitdiff
path: root/gst-libs
diff options
context:
space:
mode:
authorPaul Kocialkowski <paul.kocialkowski@bootlin.com>2018-03-30 13:41:39 +0200
committerVíctor Manuel Jáquez Leal <vjaquez@igalia.com>2018-04-19 17:42:43 +0200
commit5ee46f6751dc03b9981f1a8d9da76b31fa3c1a1f (patch)
treea959a0f3c80313aa219d51f53d2a5062b8712974 /gst-libs
parentbfac678e9ad6d17c6a8f1a4e493bb97619a569fc (diff)
display: drm: Allow finding DRM paths out of the PCI subsystem
This removes hard-coded checks on the parent subsystem of potential DRM devices. These checks were set to exlude devices that do not originate from the PCI bus, which is only a valid approach on x86 devices. Other devices may have a DRM device originating from the platform subsystem, so the checks that were previously restricted to PCI are extended to cover platform devices as well. https://bugzilla.gnome.org/show_bug.cgi?id=794840 Signed-off-by: Paul Kocialkowski <paul.kocialkowski@bootlin.com>
Diffstat (limited to 'gst-libs')
-rw-r--r--gst-libs/gst/vaapi/gstvaapidisplay_drm.c25
1 files changed, 21 insertions, 4 deletions
diff --git a/gst-libs/gst/vaapi/gstvaapidisplay_drm.c b/gst-libs/gst/vaapi/gstvaapidisplay_drm.c
index 95becdb8..ef68187a 100644
--- a/gst-libs/gst/vaapi/gstvaapidisplay_drm.c
+++ b/gst-libs/gst/vaapi/gstvaapidisplay_drm.c
@@ -56,6 +56,7 @@ typedef enum
static DRMDeviceType g_drm_device_type;
static GMutex g_drm_device_type_lock;
+static const gchar *allowed_subsystems[] = { "pci", "platform", NULL };
static gboolean
supports_vaapi (int fd)
@@ -83,6 +84,7 @@ get_default_device_path (GstVaapiDisplay * display)
struct udev_device *device, *parent;
struct udev_enumerate *e = NULL;
struct udev_list_entry *l;
+ gint i;
int fd;
if (!priv->device_path_default) {
@@ -111,7 +113,13 @@ get_default_device_path (GstVaapiDisplay * display)
syspath = udev_list_entry_get_name (l);
device = udev_device_new_from_syspath (udev, syspath);
parent = udev_device_get_parent (device);
- if (strcmp (udev_device_get_subsystem (parent), "pci") != 0) {
+
+ for (i = 0; allowed_subsystems[i] != NULL; i++)
+ if (strcmp (udev_device_get_subsystem (parent),
+ allowed_subsystems[i]) == 0)
+ break;
+
+ if (allowed_subsystems[i] == NULL) {
udev_device_unref (device);
continue;
}
@@ -185,6 +193,7 @@ set_device_path_from_fd (GstVaapiDisplay * display, gint drm_device)
struct udev_enumerate *e = NULL;
struct udev_list_entry *l;
gboolean success = FALSE;
+ gint i;
g_free (priv->device_path);
priv->device_path = NULL;
@@ -195,10 +204,18 @@ set_device_path_from_fd (GstVaapiDisplay * display, gint drm_device)
busid = drmGetBusid (drm_device);
if (!busid)
goto end;
- if (strncmp (busid, "pci:", 4) != 0)
+
+ for (i = 0; allowed_subsystems[i] != NULL; i++) {
+ busid_length = strlen (allowed_subsystems[i]);
+
+ if (strncmp (busid, allowed_subsystems[i], busid_length) == 0) {
+ busid += busid_length + 1;
+ busid_length = strlen (busid);
+ }
+ }
+
+ if (allowed_subsystems[i] == NULL)
goto end;
- busid += 4;
- busid_length = strlen (busid);
udev = udev_new ();
if (!udev)