All of lore.kernel.org
 help / color / mirror / Atom feed
* [[thud] PATCH] libdrm: add support for sync info
@ 2019-06-19 12:13 Anand Balagopalakrishnan
  2019-06-19 19:26 ` Denys Dmytriyenko
  0 siblings, 1 reply; 3+ messages in thread
From: Anand Balagopalakrishnan @ 2019-06-19 12:13 UTC (permalink / raw)
  To: meta-arago

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 <anandb@ti.com>
---
 ...-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 <Brendan.King@imgtec.com>
+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 <Brendan.King@imgtec.com>
+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



^ permalink raw reply related	[flat|nested] 3+ messages in thread

end of thread, other threads:[~2019-06-20  9:07 UTC | newest]

Thread overview: 3+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2019-06-19 12:13 [[thud] PATCH] libdrm: add support for sync info Anand Balagopalakrishnan
2019-06-19 19:26 ` Denys Dmytriyenko
2019-06-20  9:06   ` Anand Balagopalakrishnan

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.