Add support functions to provide sync and fence info. These patches are
needed for Rogue GPU driver which leverages dmabuf fence for synchronization.

Signed-off-by: Anand Balagopalakrishnan <[email protected]>
---
 ...-libsync-add-support-for-pre-v4.7-kernels.patch |  92 +++++++++
 ...0002-Add-sync_fence_info-and-sync_pt_info.patch | 212 +++++++++++++++++++++
 .../recipes-graphics/drm/libdrm_%.bbappend         |   4 +-
 3 files changed, 307 insertions(+), 1 deletion(-)
 create mode 100644 
meta-arago-distro/recipes-graphics/drm/libdrm/0001-libsync-add-support-for-pre-v4.7-kernels.patch
 create mode 100644 
meta-arago-distro/recipes-graphics/drm/libdrm/0002-Add-sync_fence_info-and-sync_pt_info.patch

diff --git 
a/meta-arago-distro/recipes-graphics/drm/libdrm/0001-libsync-add-support-for-pre-v4.7-kernels.patch
 
b/meta-arago-distro/recipes-graphics/drm/libdrm/0001-libsync-add-support-for-pre-v4.7-kernels.patch
new file mode 100644
index 0000000..c9fdfed
--- /dev/null
+++ 
b/meta-arago-distro/recipes-graphics/drm/libdrm/0001-libsync-add-support-for-pre-v4.7-kernels.patch
@@ -0,0 +1,92 @@
+From 900afd25d9a35b2b8fd29f8c424aa3c3cd170d6f Mon Sep 17 00:00:00 2001
+From: Brendan King <[email protected]>
+Date: Tue, 13 Jun 2017 15:52:44 +0100
+Subject: [PATCH 1/2] libsync: add support for pre-v4.7 kernels
+
+Add support for the the sync merge ioctl supported by older kernels.
+---
+ libsync.h | 44 +++++++++++++++++++++++++++++++++++++++++---
+ 1 file changed, 41 insertions(+), 3 deletions(-)
+
+diff --git a/libsync.h b/libsync.h
+index f1a2f96d..c3b8a385 100644
+--- a/libsync.h
++++ b/libsync.h
+@@ -40,6 +40,10 @@
+ extern "C" {
+ #endif
+ 
++#ifndef SYNC_IOC_MAGIC
++#define SYNC_IOC_MAGIC                '>'
++#endif
++
+ #ifndef SYNC_IOC_MERGE
+ /* duplicated from linux/sync_file.h to avoid build-time dependency
+  * on new (v4.7) kernel headers.  Once distro's are mostly using
+@@ -53,10 +57,22 @@ struct sync_merge_data {
+       uint32_t        flags;
+       uint32_t        pad;
+ };
+-#define SYNC_IOC_MAGIC                '>'
+ #define SYNC_IOC_MERGE                _IOWR(SYNC_IOC_MAGIC, 3, struct 
sync_merge_data)
+ #endif
+ 
++#ifndef SYNC_IOC_LEGACY_MERGE
++/* the legacy definitions are based on the contents of
++ * drivers/staging/android/uapi/sync.h in the v4.4 kernel.
++ */
++struct sync_legacy_merge_data {
++      int32_t fd2;
++      char    name[32];
++      int32_t fence;
++};
++
++#define SYNC_IOC_LEGACY_MERGE _IOWR(SYNC_IOC_MAGIC, 1, \
++      struct sync_legacy_merge_data)
++#endif
+ 
+ static inline int sync_wait(int fd, int timeout)
+ {
+@@ -83,6 +99,24 @@ static inline int sync_wait(int fd, int timeout)
+       return ret;
+ }
+ 
++static inline int sync_legacy_merge(const char *name, int fd1, int fd2)
++{
++      struct sync_legacy_merge_data data;
++      int ret;
++
++      data.fd2 = fd2;
++      strncpy(data.name, name, sizeof(data.name));
++
++      do {
++              ret = ioctl(fd1, SYNC_IOC_LEGACY_MERGE, &data);
++      } while (ret == -1 && (errno == EINTR || errno == EAGAIN));
++
++      if (ret < 0)
++              return ret;
++
++      return data.fence;
++}
++
+ static inline int sync_merge(const char *name, int fd1, int fd2)
+ {
+       struct sync_merge_data data = {0};
+@@ -95,8 +129,12 @@ static inline int sync_merge(const char *name, int fd1, 
int fd2)
+               ret = ioctl(fd1, SYNC_IOC_MERGE, &data);
+       } while (ret == -1 && (errno == EINTR || errno == EAGAIN));
+ 
+-      if (ret < 0)
+-              return ret;
++      if (ret < 0) {
++              if (errno == ENOTTY)
++                      return sync_legacy_merge(name, fd1, fd2);
++              else
++                      return ret;
++      }
+ 
+       return data.fence;
+ }
+-- 
+2.17.1
+
diff --git 
a/meta-arago-distro/recipes-graphics/drm/libdrm/0002-Add-sync_fence_info-and-sync_pt_info.patch
 
b/meta-arago-distro/recipes-graphics/drm/libdrm/0002-Add-sync_fence_info-and-sync_pt_info.patch
new file mode 100644
index 0000000..428def6
--- /dev/null
+++ 
b/meta-arago-distro/recipes-graphics/drm/libdrm/0002-Add-sync_fence_info-and-sync_pt_info.patch
@@ -0,0 +1,212 @@
+From 09da458d04e048a80500feb7d167a4faac56f84e Mon Sep 17 00:00:00 2001
+From: Brendan King <[email protected]>
+Date: Thu, 24 Aug 2017 13:28:38 +0100
+Subject: [PATCH 2/2] Add sync_fence_info and sync_pt_info
+
+For pre-4.7 kernels, sync_fence_info returns the data from the
+SYNC_IOC_FENCE_INFO ioctl. For newer kernels, the SYNC_IOC_FILE_INFO
+ioctl is called, and the data converted to SYNC_IOC_FENCE_INFO form.
+---
+ libsync.h | 172 ++++++++++++++++++++++++++++++++++++++++++++++++++++++
+ 1 file changed, 172 insertions(+)
+
+diff --git a/libsync.h b/libsync.h
+index c3b8a385..44f7330d 100644
+--- a/libsync.h
++++ b/libsync.h
+@@ -31,6 +31,7 @@
+ #include <assert.h>
+ #include <errno.h>
+ #include <stdint.h>
++#include <stdlib.h>
+ #include <string.h>
+ #include <sys/ioctl.h>
+ #include <sys/poll.h>
+@@ -74,6 +75,54 @@ struct sync_legacy_merge_data {
+       struct sync_legacy_merge_data)
+ #endif
+ 
++#ifndef SYNC_IOC_FILE_INFO
++/* duplicated from linux/sync_file.h to avoid a build-time dependency
++ * on new (v4.7) kernel headers.
++ */
++struct sync_fence_info {
++      char            obj_name[32];
++      char            driver_name[32];
++      int32_t         status;
++      uint32_t        flags;
++      uint64_t        timestamp_ns;
++};
++
++struct sync_file_info {
++      char            name[32];
++      int32_t         status;
++      uint32_t        flags;
++      uint32_t        num_fences;
++      uint32_t        pad;
++      uint64_t        sync_fence_info;
++};
++
++#define SYNC_IOC_FILE_INFO    _IOWR(SYNC_IOC_MAGIC, 4, struct sync_file_info)
++#endif
++
++#ifndef SYNC_IOC_LEGACY_FENCE_INFO
++/* the legacy definitions are based on the contents of
++ * drivers/staging/android/uapi/sync.h in the v4.4 kernel.
++ */
++struct sync_pt_info {
++      uint32_t        len;
++      char            obj_name[32];
++      char            driver_name[32];
++      int32_t         status;
++      uint64_t        timestamp_ns;
++      uint8_t         driver_data[0];
++};
++
++struct sync_fence_info_data {
++      uint32_t        len;
++      char            name[32];
++      int32_t         status;
++      uint8_t         pt_info[0];
++};
++
++#define SYNC_IOC_LEGACY_FENCE_INFO    _IOWR(SYNC_IOC_MAGIC, 2, \
++      struct sync_fence_info_data)
++#endif
++
+ static inline int sync_wait(int fd, int timeout)
+ {
+       struct pollfd fds = {0};
+@@ -179,6 +228,129 @@ static inline int sync_accumulate(const char *name, int 
*fd1, int fd2)
+       return 0;
+ }
+ 
++static inline struct sync_pt_info *sync_pt_info(
++                                      struct sync_fence_info_data *info,
++                                      struct sync_pt_info *pt_info)
++{
++      if (!pt_info)
++              pt_info = (struct sync_pt_info *)info->pt_info;
++      else
++              pt_info = (struct sync_pt_info *)((uint8_t *)pt_info +
++                              pt_info->len);
++
++      if ((uint32_t)((uint8_t *)pt_info - (uint8_t *)info) >= info->len)
++              return NULL;
++
++      return pt_info;
++}
++
++static inline struct sync_fence_info_data *sync_legacy_fence_info(int fd)
++{
++      const uint32_t len = 4096;
++      struct sync_fence_info_data *info = malloc(len);
++      int ret;
++
++      if (!info)
++              return NULL;
++
++      info->len = len;
++
++      do {
++              ret = ioctl(fd, SYNC_IOC_LEGACY_FENCE_INFO, info);
++      } while (ret == -1 && (errno == EINTR || errno == EAGAIN));
++
++      if (ret < 0) {
++              free(info);
++              return NULL;
++      }
++
++      return info;
++}
++
++static inline struct sync_fence_info_data *fence_info_from_file_info(
++                                      struct sync_file_info *file_info,
++                                      uint32_t num_fences)
++{
++      struct sync_fence_info_data *info;
++      size_t info_len;
++      struct sync_pt_info *pt_info = NULL;
++      struct sync_fence_info *fence_info;
++      uint32_t i;
++
++      info_len = sizeof(*info) + num_fences * sizeof(*pt_info);
++      info = malloc(info_len);
++      if (!info)
++              return NULL;
++
++      info->len = info_len;
++      strncpy(info->name, file_info->name, sizeof(info->name));
++      info->status = file_info->status;
++
++      fence_info = (struct sync_fence_info *)(uintptr_t)
++                      file_info->sync_fence_info;
++      for (i = 0; i < num_fences; i++) {
++              pt_info = sync_pt_info(info, pt_info);
++              assert(pt_info);
++
++              pt_info->len = sizeof(*pt_info);
++              strncpy(pt_info->obj_name, fence_info->obj_name,
++                      sizeof(pt_info->obj_name));
++              strncpy(pt_info->driver_name, fence_info->driver_name,
++                      sizeof(pt_info->driver_name));
++              pt_info->status = fence_info->status;
++              pt_info->timestamp_ns = fence_info->timestamp_ns;
++
++              fence_info++;
++      }
++
++      return info;
++}
++
++static inline struct sync_fence_info_data *sync_fence_info(int fd)
++{
++      struct sync_fence_info_data *info = NULL;
++      struct sync_file_info initial_info = {""};
++      struct sync_file_info *file_info;
++      int ret;
++
++      do {
++              ret = ioctl(fd, SYNC_IOC_FILE_INFO, &initial_info);
++      } while (ret == -1 && (errno == EINTR || errno == EAGAIN));
++
++      if (ret < 0) {
++              if (errno == ENOTTY)
++                      return sync_legacy_fence_info(fd);
++              else
++                      return NULL;
++      }
++
++      file_info = calloc(1, sizeof(*file_info) + initial_info.num_fences *
++                              sizeof(struct sync_fence_info));
++      if (!file_info)
++              return NULL;
++
++      file_info->num_fences = initial_info.num_fences;
++      file_info->sync_fence_info = (uint64_t)(uintptr_t)(file_info + 1);
++
++      do {
++              ret = ioctl(fd, SYNC_IOC_FILE_INFO, file_info);
++      } while (ret == -1 && (errno == EINTR || errno == EAGAIN));
++
++      if (ret < 0)
++              goto free_file_info;
++
++      info = fence_info_from_file_info(file_info, initial_info.num_fences);
++
++free_file_info:
++      free(file_info);
++
++      return info;
++}
++
++static inline void sync_fence_info_free(struct sync_fence_info_data *info)
++{
++      free(info);
++}
+ #if defined(__cplusplus)
+ }
+ #endif
+-- 
+2.17.1
+
diff --git a/meta-arago-distro/recipes-graphics/drm/libdrm_%.bbappend 
b/meta-arago-distro/recipes-graphics/drm/libdrm_%.bbappend
index 9945149..99d2fa7 100644
--- a/meta-arago-distro/recipes-graphics/drm/libdrm_%.bbappend
+++ b/meta-arago-distro/recipes-graphics/drm/libdrm_%.bbappend
@@ -4,9 +4,11 @@ SRC_URI += " \
 file://0001-Add-option-to-run-a-test-indefinitely.patch \
 file://0001-omap-fix-omap_bo_size-for-tiled-buffers.patch \
 file://0002-omap-add-OMAP_BO-flags-to-affect-buffer-allocation.patch \
+file://0001-libsync-add-support-for-pre-v4.7-kernels.patch \
+file://0002-Add-sync_fence_info-and-sync_pt_info.patch \
 "
 
-PR_append = ".arago2"
+PR_append = ".arago3"
 
 inherit update-alternatives
 
-- 
1.9.1

_______________________________________________
meta-arago mailing list
[email protected]
http://arago-project.org/cgi-bin/mailman/listinfo/meta-arago

Reply via email to