kmssink: use control node to setplane to avoid getting DRM-Master

a workaround on Linux 4.9 for kmssink multi-user

upstream status: i.mx specific

Signed-off-by: Haihua Hu <jared.hu@nxp.com>
diff --git a/sys/kms/gstkmssink.c b/sys/kms/gstkmssink.c
index ece36e7..7adb7d1 100644
--- a/sys/kms/gstkmssink.c
+++ b/sys/kms/gstkmssink.c
@@ -52,6 +52,8 @@
 #include <drm_fourcc.h>
 
 #include <string.h>
+#include <fcntl.h>
+#include <unistd.h>
 
 #include "gstkmssink.h"
 #include "gstkmsutils.h"
@@ -584,6 +586,21 @@
   return (self->allowed_caps && !gst_caps_is_empty (self->allowed_caps));
 }
 
+static gint
+get_drm_minor_base (gint type)
+{
+  switch (type) {
+    case DRM_NODE_PRIMARY:
+      return 0;
+    case DRM_NODE_CONTROL:
+      return 64;
+    case DRM_NODE_RENDER:
+      return 128;
+    default:
+      return -1;
+  }
+}
+
 static gboolean
 gst_kms_sink_start (GstBaseSink * bsink)
 {
@@ -595,6 +612,7 @@
   drmModePlane *plane;
   gboolean universal_planes;
   gboolean ret;
+  gint minor;
 
   self = GST_KMS_SINK (bsink);
   universal_planes = FALSE;
@@ -609,7 +627,11 @@
     self->fd = drmOpen (self->devname, self->bus_id);
   else
     self->fd = kms_open (&self->devname);
-  if (self->fd < 0)
+
+  minor = get_drm_minor_base (DRM_NODE_CONTROL);
+  self->ctrl_fd = drmOpenControl(minor);
+
+  if (self->fd < 0 || self->ctrl_fd < 0)
     goto open_failed;
 
   log_drm_version (self);
@@ -804,6 +826,11 @@
     self->fd = -1;
   }
 
+  if (self->ctrl_fd >= 0) {
+    drmClose (self->ctrl_fd);
+    self->ctrl_fd = -1;
+  }
+
   GST_OBJECT_LOCK (bsink);
   self->hdisplay = 0;
   self->vdisplay = 0;
@@ -1520,7 +1547,7 @@
       "drmModeSetPlane at (%i,%i) %ix%i sourcing at (%i,%i) %ix%i",
       result.x, result.y, result.w, result.h, src.x, src.y, src.w, src.h);
 
-  ret = drmModeSetPlane (self->fd, self->plane_id, self->crtc_id, fb_id, 0,
+  ret = drmModeSetPlane (self->ctrl_fd, self->plane_id, self->crtc_id, fb_id, 0,
       result.x, result.y, result.w, result.h,
       /* source/cropping coordinates are given in Q16 */
       src.x << 16, src.y << 16, src.w << 16, src.h << 16);
diff --git a/sys/kms/gstkmssink.h b/sys/kms/gstkmssink.h
index a80699c..5dc4772 100644
--- a/sys/kms/gstkmssink.h
+++ b/sys/kms/gstkmssink.h
@@ -49,6 +49,7 @@
 
   /*< private >*/
   gint fd;
+  gint ctrl_fd;
   gint conn_id;
   gint crtc_id;
   gint plane_id;