diff options
author | Chris Wilson <chris@chris-wilson.co.uk> | 2017-12-19 15:00:03 +0000 |
---|---|---|
committer | Arkadiusz Hiler <arkadiusz.hiler@intel.com> | 2017-12-27 12:44:27 +0200 |
commit | 4cd4cc4873fc1c916b6bf7b058b12294e16dfd98 (patch) | |
tree | 8297d56486efa0f6dcdd1abd4d76b6b0dc6abc5d | |
parent | 6d27acafa3a2d80b6330e2380a3548bc98dcc3e5 (diff) |
lib: Convert sw_sync to use sync_file uapi imported from the kernel
Similar to how we are now importing the drm uapi directly into igt, we
also would like to have a copy of auxiliary uAPI such as sync_file.
Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
Reviewed-by: Arkadiusz Hiler <arkadiusz.hiler@intel.com>
-rw-r--r-- | include/drm-uapi/Makefile.am | 1 | ||||
-rw-r--r-- | include/drm-uapi/sync_file.h | 98 | ||||
-rw-r--r-- | lib/sw_sync.c | 59 |
3 files changed, 112 insertions, 46 deletions
diff --git a/include/drm-uapi/Makefile.am b/include/drm-uapi/Makefile.am index f335251b..c658fcc4 100644 --- a/include/drm-uapi/Makefile.am +++ b/include/drm-uapi/Makefile.am @@ -19,6 +19,7 @@ EXTRA_DIST = \ radeon_drm.h \ savage_drm.h \ sis_drm.h \ + sync_file.h \ tegra_drm.h \ vc4_drm.h \ vgem_drm.h \ diff --git a/include/drm-uapi/sync_file.h b/include/drm-uapi/sync_file.h new file mode 100644 index 00000000..b4f2db00 --- /dev/null +++ b/include/drm-uapi/sync_file.h @@ -0,0 +1,98 @@ +/* SPDX-License-Identifier: GPL-1.0+ WITH Linux-syscall-note */ +/* + * Copyright (C) 2012 Google, Inc. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + */ + +#ifndef _LINUX_SYNC_H +#define _LINUX_SYNC_H + +#include <linux/ioctl.h> +#include <linux/types.h> + +/** + * struct sync_merge_data - data passed to merge ioctl + * @name: name of new fence + * @fd2: file descriptor of second fence + * @fence: returns the fd of the new fence to userspace + * @flags: merge_data flags + * @pad: padding for 64-bit alignment, should always be zero + */ +struct sync_merge_data { + char name[32]; + __s32 fd2; + __s32 fence; + __u32 flags; + __u32 pad; +}; + +/** + * struct sync_fence_info - detailed fence information + * @obj_name: name of parent sync_timeline +* @driver_name: name of driver implementing the parent +* @status: status of the fence 0:active 1:signaled <0:error + * @flags: fence_info flags + * @timestamp_ns: timestamp of status change in nanoseconds + */ +struct sync_fence_info { + char obj_name[32]; + char driver_name[32]; + __s32 status; + __u32 flags; + __u64 timestamp_ns; +}; + +/** + * struct sync_file_info - data returned from fence info ioctl + * @name: name of fence + * @status: status of fence. 1: signaled 0:active <0:error + * @flags: sync_file_info flags + * @num_fences number of fences in the sync_file + * @pad: padding for 64-bit alignment, should always be zero + * @sync_fence_info: pointer to array of structs sync_fence_info with all + * fences in the sync_file + */ +struct sync_file_info { + char name[32]; + __s32 status; + __u32 flags; + __u32 num_fences; + __u32 pad; + + __u64 sync_fence_info; +}; + +#define SYNC_IOC_MAGIC '>' + +/** + * Opcodes 0, 1 and 2 were burned during a API change to avoid users of the + * old API to get weird errors when trying to handling sync_files. The API + * change happened during the de-stage of the Sync Framework when there was + * no upstream users available. + */ + +/** + * DOC: SYNC_IOC_MERGE - merge two fences + * + * Takes a struct sync_merge_data. Creates a new fence containing copies of + * the sync_pts in both the calling fd and sync_merge_data.fd2. Returns the + * new fence's fd in sync_merge_data.fence + */ +#define SYNC_IOC_MERGE _IOWR(SYNC_IOC_MAGIC, 3, struct sync_merge_data) + +/** + * DOC: SYNC_IOC_FILE_INFO - get detailed information on a sync_file + * + * Takes a struct sync_file_info. If num_fences is 0, the field is updated + * with the actual number of fences. If num_fences is > 0, the system will + * use the pointer provided on sync_fence_info to return up to num_fences of + * struct sync_fence_info, with detailed fence information. + */ +#define SYNC_IOC_FILE_INFO _IOWR(SYNC_IOC_MAGIC, 4, struct sync_file_info) + +#endif /* _LINUX_SYNC_H */ diff --git a/lib/sw_sync.c b/lib/sw_sync.c index 9b36dd85..619049b3 100644 --- a/lib/sw_sync.c +++ b/lib/sw_sync.c @@ -33,6 +33,8 @@ #include <stdint.h> #include <sys/ioctl.h> +#include "sync_file.h" + #include "igt_debugfs.h" #include "igt_kmod.h" #include "sw_sync.h" @@ -56,41 +58,6 @@ struct int_sync_create_fence_data { #define INT_SYNC_IOC_CREATE_FENCE _IOWR(INT_SYNC_IOC_MAGIC, 0, struct int_sync_create_fence_data) #define INT_SYNC_IOC_INC _IOW(INT_SYNC_IOC_MAGIC, 1, __u32) -struct local_sync_merge_data { - char name[32]; - - __s32 fd2; - __s32 fence; - - __u32 flags; - __u32 pad; -}; - -struct local_sync_fence_info { - char obj_name[32]; - char driver_name[32]; - - __s32 status; - __u32 flags; - - __u64 timestamp_ns; -}; - -struct local_sync_file_info { - char name[32]; - - __s32 status; - __u32 flags; - __u32 num_fences; - __u32 pad; - - __u64 sync_fence_info; -}; - -#define UABI_SYNC_IOC_MAGIC '>' -#define LOCAL_SYNC_IOC_MERGE _IOWR(UABI_SYNC_IOC_MAGIC, 3, struct local_sync_merge_data) -#define LOCAL_SYNC_IOC_FILE_INFO _IOWR(UABI_SYNC_IOC_MAGIC, 4, struct local_sync_file_info) - static bool kernel_sw_sync_path(char *path, int length) { snprintf(path, length, "%s", "/dev/sw_sync"); @@ -159,9 +126,9 @@ void sw_sync_timeline_inc(int fd, uint32_t count) int sync_fence_merge(int fd1, int fd2) { - struct local_sync_merge_data data = { .fd2 = fd2}; + struct sync_merge_data data = { .fd2 = fd2}; - if (ioctl(fd1, LOCAL_SYNC_IOC_MERGE, &data)) + if (ioctl(fd1, SYNC_IOC_MERGE, &data)) return -errno; return data.fence; @@ -192,9 +159,9 @@ int sync_fence_wait(int fd, int timeout) int sync_fence_count(int fd) { - struct local_sync_file_info info = {}; + struct sync_file_info info = {}; - if (ioctl(fd, LOCAL_SYNC_IOC_FILE_INFO, &info)) + if (ioctl(fd, SYNC_IOC_FILE_INFO, &info)) return -errno; return info.num_fences; @@ -202,12 +169,12 @@ int sync_fence_count(int fd) static int __sync_fence_count_status(int fd, int status) { - struct local_sync_file_info info = {}; - struct local_sync_fence_info *fence_info; + struct sync_file_info info = {}; + struct sync_fence_info *fence_info; int count; int i; - if (ioctl(fd, LOCAL_SYNC_IOC_FILE_INFO, &info)) + if (ioctl(fd, SYNC_IOC_FILE_INFO, &info)) return -errno; fence_info = calloc(info.num_fences, sizeof(*fence_info)); @@ -215,7 +182,7 @@ static int __sync_fence_count_status(int fd, int status) return -ENOMEM; info.sync_fence_info = to_user_pointer(fence_info); - if (ioctl(fd, LOCAL_SYNC_IOC_FILE_INFO, &info)) { + if (ioctl(fd, SYNC_IOC_FILE_INFO, &info)) { count = -errno; } else { count = 0; @@ -239,13 +206,13 @@ int sync_fence_count_status(int fd, int status) int sync_fence_status(int fence) { - struct local_sync_fence_info fence_info; - struct local_sync_file_info file_info = { + struct sync_fence_info fence_info; + struct sync_file_info file_info = { .sync_fence_info = to_user_pointer(&fence_info), .num_fences = 1, }; - if (ioctl(fence, LOCAL_SYNC_IOC_FILE_INFO, &file_info)) + if (ioctl(fence, SYNC_IOC_FILE_INFO, &file_info)) return -errno; if (file_info.num_fences != 1) |