From patchwork Tue Dec 19 15:00:03 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Chris Wilson X-Patchwork-Id: 10123377 Return-Path: Received: from mail.wl.linuxfoundation.org (pdx-wl-mail.web.codeaurora.org [172.30.200.125]) by pdx-korg-patchwork.web.codeaurora.org (Postfix) with ESMTP id A02E0602CB for ; Tue, 19 Dec 2017 15:00:13 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 8DDDD294B8 for ; Tue, 19 Dec 2017 15:00:13 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id 88CEA294B3; Tue, 19 Dec 2017 15:00:13 +0000 (UTC) X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on pdx-wl-mail.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-4.2 required=2.0 tests=BAYES_00, RCVD_IN_DNSWL_MED autolearn=ham version=3.3.1 Received: from gabe.freedesktop.org (gabe.freedesktop.org [131.252.210.177]) (using TLSv1.2 with cipher DHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.wl.linuxfoundation.org (Postfix) with ESMTPS id BF953294B3 for ; Tue, 19 Dec 2017 15:00:12 +0000 (UTC) Received: from gabe.freedesktop.org (localhost [127.0.0.1]) by gabe.freedesktop.org (Postfix) with ESMTP id 5C8066E217; Tue, 19 Dec 2017 15:00:12 +0000 (UTC) X-Original-To: intel-gfx@lists.freedesktop.org Delivered-To: intel-gfx@lists.freedesktop.org Received: from fireflyinternet.com (mail.fireflyinternet.com [109.228.58.192]) by gabe.freedesktop.org (Postfix) with ESMTPS id DEFA26E217 for ; Tue, 19 Dec 2017 15:00:10 +0000 (UTC) X-Default-Received-SPF: pass (skip=forwardok (res=PASS)) x-ip-name=78.156.65.138; Received: from haswell.alporthouse.com (unverified [78.156.65.138]) by fireflyinternet.com (Firefly Internet (M1)) with ESMTP id 10055465-1500050 for multiple; Tue, 19 Dec 2017 15:00:02 +0000 Received: by haswell.alporthouse.com (sSMTP sendmail emulation); Tue, 19 Dec 2017 15:00:03 +0000 From: Chris Wilson To: intel-gfx@lists.freedesktop.org Date: Tue, 19 Dec 2017 15:00:03 +0000 Message-Id: <20171219150003.30572-1-chris@chris-wilson.co.uk> X-Mailer: git-send-email 2.15.1 X-Originating-IP: 78.156.65.138 X-Country: code=GB country="United Kingdom" ip=78.156.65.138 Subject: [Intel-gfx] [PATCH igt] lib: Convert sw_sync to use sync_file uapi imported from the kernel X-BeenThere: intel-gfx@lists.freedesktop.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: Intel graphics driver community testing & development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , MIME-Version: 1.0 Errors-To: intel-gfx-bounces@lists.freedesktop.org Sender: "Intel-gfx" X-Virus-Scanned: ClamAV using ClamSMTP 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 Reviewed-by: Arkadiusz Hiler --- include/drm-uapi/Makefile.am | 1 + include/drm-uapi/sync_file.h | 98 ++++++++++++++++++++++++++++++++++++++++++++ lib/sw_sync.c | 59 ++++++-------------------- 3 files changed, 112 insertions(+), 46 deletions(-) create mode 100644 include/drm-uapi/sync_file.h diff --git a/include/drm-uapi/Makefile.am b/include/drm-uapi/Makefile.am index f335251bd..c658fcc44 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 000000000..b4f2db009 --- /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 +#include + +/** + * 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 9b36dd85c..619049b3e 100644 --- a/lib/sw_sync.c +++ b/lib/sw_sync.c @@ -33,6 +33,8 @@ #include #include +#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)