All of lore.kernel.org
 help / color / mirror / Atom feed
* [igt-dev] [PATCH i-g-t 0/5] tests: Add timeline syncobj tests
@ 2019-05-16 14:39 Lionel Landwerlin
  2019-05-16 14:39 ` [igt-dev] [PATCH i-g-t 1/5] lib/syncobj: fix comment typo Lionel Landwerlin
                   ` (6 more replies)
  0 siblings, 7 replies; 10+ messages in thread
From: Lionel Landwerlin @ 2019-05-16 14:39 UTC (permalink / raw)
  To: igt-dev

New ioctls have been added to drm-syncobj to implement Vulkan timeline
semaphores. This series adds tests for this new feature.

Cheers,

Chunming Zhou (1):
  igt: add timeline test cases

Lionel Landwerlin (4):
  lib/syncobj: fix comment typo
  include: bump drm headers
  lib/syncobj: drop local declarations
  tests/syncobj_timeline: add more timeline tests

 include/drm-uapi/amdgpu_drm.h  |   52 +-
 include/drm-uapi/drm.h         |   37 +
 include/drm-uapi/drm_mode.h    |    4 +-
 include/drm-uapi/msm_drm.h     |   14 +
 include/drm-uapi/nouveau_drm.h |   51 ++
 lib/igt_syncobj.c              |  224 +++++-
 lib/igt_syncobj.h              |   45 +-
 tests/meson.build              |    1 +
 tests/syncobj_basic.c          |    2 +-
 tests/syncobj_timeline.c       | 1335 ++++++++++++++++++++++++++++++++
 tests/syncobj_wait.c           |   58 +-
 11 files changed, 1756 insertions(+), 67 deletions(-)
 create mode 100644 tests/syncobj_timeline.c

--
2.21.0.392.gf8f6787159e
_______________________________________________
igt-dev mailing list
igt-dev@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/igt-dev

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

* [igt-dev] [PATCH i-g-t 1/5] lib/syncobj: fix comment typo
  2019-05-16 14:39 [igt-dev] [PATCH i-g-t 0/5] tests: Add timeline syncobj tests Lionel Landwerlin
@ 2019-05-16 14:39 ` Lionel Landwerlin
  2019-05-16 14:39 ` [igt-dev] [PATCH i-g-t 2/5] include: bump drm headers Lionel Landwerlin
                   ` (5 subsequent siblings)
  6 siblings, 0 replies; 10+ messages in thread
From: Lionel Landwerlin @ 2019-05-16 14:39 UTC (permalink / raw)
  To: igt-dev

Signed-off-by: Lionel Landwerlin <lionel.g.landwerlin@intel.com>
---
 lib/igt_syncobj.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/lib/igt_syncobj.c b/lib/igt_syncobj.c
index 0fddb97a..6aee9d24 100644
--- a/lib/igt_syncobj.c
+++ b/lib/igt_syncobj.c
@@ -154,7 +154,7 @@ syncobj_fd_to_handle(int fd, int syncobj_fd, uint32_t flags)
 /**
  * syncobj_import_sync_file:
  * @fd: The DRM file descriptor
- * @handle: Handle to the syncobt to import file into
+ * @handle: Handle to the syncobj to import file into
  * @sync_file: The sync_file fd to import state from.
  *
  * Import a sync_file fd into a syncobj handle.
-- 
2.21.0.392.gf8f6787159e

_______________________________________________
igt-dev mailing list
igt-dev@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/igt-dev

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

* [igt-dev] [PATCH i-g-t 2/5] include: bump drm headers
  2019-05-16 14:39 [igt-dev] [PATCH i-g-t 0/5] tests: Add timeline syncobj tests Lionel Landwerlin
  2019-05-16 14:39 ` [igt-dev] [PATCH i-g-t 1/5] lib/syncobj: fix comment typo Lionel Landwerlin
@ 2019-05-16 14:39 ` Lionel Landwerlin
  2019-05-16 14:39 ` [igt-dev] [PATCH i-g-t 3/5] lib/syncobj: drop local declarations Lionel Landwerlin
                   ` (4 subsequent siblings)
  6 siblings, 0 replies; 10+ messages in thread
From: Lionel Landwerlin @ 2019-05-16 14:39 UTC (permalink / raw)
  To: igt-dev

At the following commit :

commit 8da0e1525b7f0d69c6cb44094963906282b32673
Merge: dc28d5742b2b 2b1174512771
Author: Dave Airlie <airlied@redhat.com>
Date:   Thu May 16 10:19:29 2019 +1000

    Merge tag 'drm-misc-next-fixes-2019-05-15' of git://anongit.freedesktop.org/drm/drm-misc into drm-next

    - A couple new panfrost fixes
    - Fix the low refresh rate register in adv7511
    - A handful of msm fixes that fell out of 5.1 bringup on SDM845
    - Fix spinlock initialization in pl111

    Signed-off-by: Dave Airlie <airlied@redhat.com>

Signed-off-by: Lionel Landwerlin <lionel.g.landwerlin@intel.com>
---
 include/drm-uapi/amdgpu_drm.h  | 52 +++++++++++++++++++++++++++++++++-
 include/drm-uapi/drm.h         | 37 ++++++++++++++++++++++++
 include/drm-uapi/drm_mode.h    |  4 +--
 include/drm-uapi/msm_drm.h     | 14 +++++++++
 include/drm-uapi/nouveau_drm.h | 51 +++++++++++++++++++++++++++++++++
 5 files changed, 155 insertions(+), 3 deletions(-)

diff --git a/include/drm-uapi/amdgpu_drm.h b/include/drm-uapi/amdgpu_drm.h
index be84e43c..4788730d 100644
--- a/include/drm-uapi/amdgpu_drm.h
+++ b/include/drm-uapi/amdgpu_drm.h
@@ -210,6 +210,9 @@ union drm_amdgpu_bo_list {
 #define AMDGPU_CTX_QUERY2_FLAGS_VRAMLOST (1<<1)
 /* indicate some job from this context once cause gpu hang */
 #define AMDGPU_CTX_QUERY2_FLAGS_GUILTY   (1<<2)
+/* indicate some errors are detected by RAS */
+#define AMDGPU_CTX_QUERY2_FLAGS_RAS_CE   (1<<3)
+#define AMDGPU_CTX_QUERY2_FLAGS_RAS_UE   (1<<4)
 
 /* Context priority level */
 #define AMDGPU_CTX_PRIORITY_UNSET       -2048
@@ -272,13 +275,14 @@ union drm_amdgpu_vm {
 
 /* sched ioctl */
 #define AMDGPU_SCHED_OP_PROCESS_PRIORITY_OVERRIDE	1
+#define AMDGPU_SCHED_OP_CONTEXT_PRIORITY_OVERRIDE	2
 
 struct drm_amdgpu_sched_in {
 	/* AMDGPU_SCHED_OP_* */
 	__u32	op;
 	__u32	fd;
 	__s32	priority;
-	__u32	flags;
+	__u32   ctx_id;
 };
 
 union drm_amdgpu_sched {
@@ -523,6 +527,9 @@ struct drm_amdgpu_gem_va {
 #define AMDGPU_CHUNK_ID_SYNCOBJ_IN      0x04
 #define AMDGPU_CHUNK_ID_SYNCOBJ_OUT     0x05
 #define AMDGPU_CHUNK_ID_BO_HANDLES      0x06
+#define AMDGPU_CHUNK_ID_SCHEDULED_DEPENDENCIES	0x07
+#define AMDGPU_CHUNK_ID_SYNCOBJ_TIMELINE_WAIT    0x08
+#define AMDGPU_CHUNK_ID_SYNCOBJ_TIMELINE_SIGNAL  0x09
 
 struct drm_amdgpu_cs_chunk {
 	__u32		chunk_id;
@@ -565,6 +572,11 @@ union drm_amdgpu_cs {
  * caches (L2/vL1/sL1/I$). */
 #define AMDGPU_IB_FLAG_TC_WB_NOT_INVALIDATE (1 << 3)
 
+/* Set GDS_COMPUTE_MAX_WAVE_ID = DEFAULT before PACKET3_INDIRECT_BUFFER.
+ * This will reset wave ID counters for the IB.
+ */
+#define AMDGPU_IB_FLAG_RESET_GDS_MAX_WAVE_ID (1 << 4)
+
 struct drm_amdgpu_cs_chunk_ib {
 	__u32 _pad;
 	/** AMDGPU_IB_FLAG_* */
@@ -598,6 +610,12 @@ struct drm_amdgpu_cs_chunk_sem {
 	__u32 handle;
 };
 
+struct drm_amdgpu_cs_chunk_syncobj {
+       __u32 handle;
+       __u32 flags;
+       __u64 point;
+};
+
 #define AMDGPU_FENCE_TO_HANDLE_GET_SYNCOBJ	0
 #define AMDGPU_FENCE_TO_HANDLE_GET_SYNCOBJ_FD	1
 #define AMDGPU_FENCE_TO_HANDLE_GET_SYNC_FILE_FD	2
@@ -673,6 +691,7 @@ struct drm_amdgpu_cs_chunk_data {
 	#define AMDGPU_INFO_FW_GFX_RLC_RESTORE_LIST_SRM_MEM 0x11
 	/* Subquery id: Query DMCU firmware version */
 	#define AMDGPU_INFO_FW_DMCU		0x12
+	#define AMDGPU_INFO_FW_TA		0x13
 /* number of bytes moved for TTM migration */
 #define AMDGPU_INFO_NUM_BYTES_MOVED		0x0f
 /* the used VRAM size */
@@ -726,6 +745,37 @@ struct drm_amdgpu_cs_chunk_data {
 /* Number of VRAM page faults on CPU access. */
 #define AMDGPU_INFO_NUM_VRAM_CPU_PAGE_FAULTS	0x1E
 #define AMDGPU_INFO_VRAM_LOST_COUNTER		0x1F
+/* query ras mask of enabled features*/
+#define AMDGPU_INFO_RAS_ENABLED_FEATURES	0x20
+
+/* RAS MASK: UMC (VRAM) */
+#define AMDGPU_INFO_RAS_ENABLED_UMC			(1 << 0)
+/* RAS MASK: SDMA */
+#define AMDGPU_INFO_RAS_ENABLED_SDMA			(1 << 1)
+/* RAS MASK: GFX */
+#define AMDGPU_INFO_RAS_ENABLED_GFX			(1 << 2)
+/* RAS MASK: MMHUB */
+#define AMDGPU_INFO_RAS_ENABLED_MMHUB			(1 << 3)
+/* RAS MASK: ATHUB */
+#define AMDGPU_INFO_RAS_ENABLED_ATHUB			(1 << 4)
+/* RAS MASK: PCIE */
+#define AMDGPU_INFO_RAS_ENABLED_PCIE			(1 << 5)
+/* RAS MASK: HDP */
+#define AMDGPU_INFO_RAS_ENABLED_HDP			(1 << 6)
+/* RAS MASK: XGMI */
+#define AMDGPU_INFO_RAS_ENABLED_XGMI			(1 << 7)
+/* RAS MASK: DF */
+#define AMDGPU_INFO_RAS_ENABLED_DF			(1 << 8)
+/* RAS MASK: SMN */
+#define AMDGPU_INFO_RAS_ENABLED_SMN			(1 << 9)
+/* RAS MASK: SEM */
+#define AMDGPU_INFO_RAS_ENABLED_SEM			(1 << 10)
+/* RAS MASK: MP0 */
+#define AMDGPU_INFO_RAS_ENABLED_MP0			(1 << 11)
+/* RAS MASK: MP1 */
+#define AMDGPU_INFO_RAS_ENABLED_MP1			(1 << 12)
+/* RAS MASK: FUSE */
+#define AMDGPU_INFO_RAS_ENABLED_FUSE			(1 << 13)
 
 #define AMDGPU_INFO_MMR_SE_INDEX_SHIFT	0
 #define AMDGPU_INFO_MMR_SE_INDEX_MASK	0xff
diff --git a/include/drm-uapi/drm.h b/include/drm-uapi/drm.h
index 85c685a2..532787bf 100644
--- a/include/drm-uapi/drm.h
+++ b/include/drm-uapi/drm.h
@@ -643,6 +643,7 @@ struct drm_gem_open {
 #define DRM_CAP_PAGE_FLIP_TARGET	0x11
 #define DRM_CAP_CRTC_IN_VBLANK_EVENT	0x12
 #define DRM_CAP_SYNCOBJ		0x13
+#define DRM_CAP_SYNCOBJ_TIMELINE	0x14
 
 /** DRM_IOCTL_GET_CAP ioctl argument type */
 struct drm_get_cap {
@@ -729,8 +730,18 @@ struct drm_syncobj_handle {
 	__u32 pad;
 };
 
+struct drm_syncobj_transfer {
+	__u32 src_handle;
+	__u32 dst_handle;
+	__u64 src_point;
+	__u64 dst_point;
+	__u32 flags;
+	__u32 pad;
+};
+
 #define DRM_SYNCOBJ_WAIT_FLAGS_WAIT_ALL (1 << 0)
 #define DRM_SYNCOBJ_WAIT_FLAGS_WAIT_FOR_SUBMIT (1 << 1)
+#define DRM_SYNCOBJ_WAIT_FLAGS_WAIT_AVAILABLE (1 << 2) /* wait for time point to become available */
 struct drm_syncobj_wait {
 	__u64 handles;
 	/* absolute timeout */
@@ -741,12 +752,33 @@ struct drm_syncobj_wait {
 	__u32 pad;
 };
 
+struct drm_syncobj_timeline_wait {
+	__u64 handles;
+	/* wait on specific timeline point for every handles*/
+	__u64 points;
+	/* absolute timeout */
+	__s64 timeout_nsec;
+	__u32 count_handles;
+	__u32 flags;
+	__u32 first_signaled; /* only valid when not waiting all */
+	__u32 pad;
+};
+
+
 struct drm_syncobj_array {
 	__u64 handles;
 	__u32 count_handles;
 	__u32 pad;
 };
 
+struct drm_syncobj_timeline_array {
+	__u64 handles;
+	__u64 points;
+	__u32 count_handles;
+	__u32 pad;
+};
+
+
 /* Query current scanout sequence number */
 struct drm_crtc_get_sequence {
 	__u32 crtc_id;		/* requested crtc_id */
@@ -903,6 +935,11 @@ extern "C" {
 #define DRM_IOCTL_MODE_GET_LEASE	DRM_IOWR(0xC8, struct drm_mode_get_lease)
 #define DRM_IOCTL_MODE_REVOKE_LEASE	DRM_IOWR(0xC9, struct drm_mode_revoke_lease)
 
+#define DRM_IOCTL_SYNCOBJ_TIMELINE_WAIT	DRM_IOWR(0xCA, struct drm_syncobj_timeline_wait)
+#define DRM_IOCTL_SYNCOBJ_QUERY		DRM_IOWR(0xCB, struct drm_syncobj_timeline_array)
+#define DRM_IOCTL_SYNCOBJ_TRANSFER	DRM_IOWR(0xCC, struct drm_syncobj_transfer)
+#define DRM_IOCTL_SYNCOBJ_TIMELINE_SIGNAL	DRM_IOWR(0xCD, struct drm_syncobj_timeline_array)
+
 /**
  * Device specific ioctls should only be in their respective headers
  * The device specific ioctl range is from 0x40 to 0x9f.
diff --git a/include/drm-uapi/drm_mode.h b/include/drm-uapi/drm_mode.h
index a439c2e6..83cd1636 100644
--- a/include/drm-uapi/drm_mode.h
+++ b/include/drm-uapi/drm_mode.h
@@ -33,7 +33,6 @@
 extern "C" {
 #endif
 
-#define DRM_DISPLAY_INFO_LEN	32
 #define DRM_CONNECTOR_NAME_LEN	32
 #define DRM_DISPLAY_MODE_LEN	32
 #define DRM_PROP_NAME_LEN	32
@@ -622,7 +621,8 @@ struct drm_color_ctm {
 
 struct drm_color_lut {
 	/*
-	 * Data is U0.16 fixed point format.
+	 * Values are mapped linearly to 0.0 - 1.0 range, with 0x0 == 0.0 and
+	 * 0xffff == 1.0.
 	 */
 	__u16 red;
 	__u16 green;
diff --git a/include/drm-uapi/msm_drm.h b/include/drm-uapi/msm_drm.h
index 91a16b33..0b85ed6a 100644
--- a/include/drm-uapi/msm_drm.h
+++ b/include/drm-uapi/msm_drm.h
@@ -74,6 +74,8 @@ struct drm_msm_timespec {
 #define MSM_PARAM_TIMESTAMP  0x05
 #define MSM_PARAM_GMEM_BASE  0x06
 #define MSM_PARAM_NR_RINGS   0x07
+#define MSM_PARAM_PP_PGTABLE 0x08  /* => 1 for per-process pagetables, else 0 */
+#define MSM_PARAM_FAULTS     0x09
 
 struct drm_msm_param {
 	__u32 pipe;           /* in, MSM_PIPE_x */
@@ -286,6 +288,16 @@ struct drm_msm_submitqueue {
 	__u32 id;      /* out, identifier */
 };
 
+#define MSM_SUBMITQUEUE_PARAM_FAULTS   0
+
+struct drm_msm_submitqueue_query {
+	__u64 data;
+	__u32 id;
+	__u32 param;
+	__u32 len;
+	__u32 pad;
+};
+
 #define DRM_MSM_GET_PARAM              0x00
 /* placeholder:
 #define DRM_MSM_SET_PARAM              0x01
@@ -302,6 +314,7 @@ struct drm_msm_submitqueue {
  */
 #define DRM_MSM_SUBMITQUEUE_NEW        0x0A
 #define DRM_MSM_SUBMITQUEUE_CLOSE      0x0B
+#define DRM_MSM_SUBMITQUEUE_QUERY      0x0C
 
 #define DRM_IOCTL_MSM_GET_PARAM        DRM_IOWR(DRM_COMMAND_BASE + DRM_MSM_GET_PARAM, struct drm_msm_param)
 #define DRM_IOCTL_MSM_GEM_NEW          DRM_IOWR(DRM_COMMAND_BASE + DRM_MSM_GEM_NEW, struct drm_msm_gem_new)
@@ -313,6 +326,7 @@ struct drm_msm_submitqueue {
 #define DRM_IOCTL_MSM_GEM_MADVISE      DRM_IOWR(DRM_COMMAND_BASE + DRM_MSM_GEM_MADVISE, struct drm_msm_gem_madvise)
 #define DRM_IOCTL_MSM_SUBMITQUEUE_NEW    DRM_IOWR(DRM_COMMAND_BASE + DRM_MSM_SUBMITQUEUE_NEW, struct drm_msm_submitqueue)
 #define DRM_IOCTL_MSM_SUBMITQUEUE_CLOSE  DRM_IOW (DRM_COMMAND_BASE + DRM_MSM_SUBMITQUEUE_CLOSE, __u32)
+#define DRM_IOCTL_MSM_SUBMITQUEUE_QUERY  DRM_IOW (DRM_COMMAND_BASE + DRM_MSM_SUBMITQUEUE_QUERY, struct drm_msm_submitqueue_query)
 
 #if defined(__cplusplus)
 }
diff --git a/include/drm-uapi/nouveau_drm.h b/include/drm-uapi/nouveau_drm.h
index 259588a4..9459a6e3 100644
--- a/include/drm-uapi/nouveau_drm.h
+++ b/include/drm-uapi/nouveau_drm.h
@@ -133,12 +133,63 @@ struct drm_nouveau_gem_cpu_fini {
 #define DRM_NOUVEAU_NOTIFIEROBJ_ALLOC  0x05 /* deprecated */
 #define DRM_NOUVEAU_GPUOBJ_FREE        0x06 /* deprecated */
 #define DRM_NOUVEAU_NVIF               0x07
+#define DRM_NOUVEAU_SVM_INIT           0x08
+#define DRM_NOUVEAU_SVM_BIND           0x09
 #define DRM_NOUVEAU_GEM_NEW            0x40
 #define DRM_NOUVEAU_GEM_PUSHBUF        0x41
 #define DRM_NOUVEAU_GEM_CPU_PREP       0x42
 #define DRM_NOUVEAU_GEM_CPU_FINI       0x43
 #define DRM_NOUVEAU_GEM_INFO           0x44
 
+struct drm_nouveau_svm_init {
+	__u64 unmanaged_addr;
+	__u64 unmanaged_size;
+};
+
+struct drm_nouveau_svm_bind {
+	__u64 header;
+	__u64 va_start;
+	__u64 va_end;
+	__u64 npages;
+	__u64 stride;
+	__u64 result;
+	__u64 reserved0;
+	__u64 reserved1;
+};
+
+#define NOUVEAU_SVM_BIND_COMMAND_SHIFT          0
+#define NOUVEAU_SVM_BIND_COMMAND_BITS           8
+#define NOUVEAU_SVM_BIND_COMMAND_MASK           ((1 << 8) - 1)
+#define NOUVEAU_SVM_BIND_PRIORITY_SHIFT         8
+#define NOUVEAU_SVM_BIND_PRIORITY_BITS          8
+#define NOUVEAU_SVM_BIND_PRIORITY_MASK          ((1 << 8) - 1)
+#define NOUVEAU_SVM_BIND_TARGET_SHIFT           16
+#define NOUVEAU_SVM_BIND_TARGET_BITS            32
+#define NOUVEAU_SVM_BIND_TARGET_MASK            0xffffffff
+
+/*
+ * Below is use to validate ioctl argument, userspace can also use it to make
+ * sure that no bit are set beyond known fields for a given kernel version.
+ */
+#define NOUVEAU_SVM_BIND_VALID_BITS     48
+#define NOUVEAU_SVM_BIND_VALID_MASK     ((1ULL << NOUVEAU_SVM_BIND_VALID_BITS) - 1)
+
+
+/*
+ * NOUVEAU_BIND_COMMAND__MIGRATE: synchronous migrate to target memory.
+ * result: number of page successfuly migrate to the target memory.
+ */
+#define NOUVEAU_SVM_BIND_COMMAND__MIGRATE               0
+
+/*
+ * NOUVEAU_SVM_BIND_HEADER_TARGET__GPU_VRAM: target the GPU VRAM memory.
+ */
+#define NOUVEAU_SVM_BIND_TARGET__GPU_VRAM               (1UL << 31)
+
+
+#define DRM_IOCTL_NOUVEAU_SVM_INIT           DRM_IOWR(DRM_COMMAND_BASE + DRM_NOUVEAU_SVM_INIT, struct drm_nouveau_svm_init)
+#define DRM_IOCTL_NOUVEAU_SVM_BIND           DRM_IOWR(DRM_COMMAND_BASE + DRM_NOUVEAU_SVM_BIND, struct drm_nouveau_svm_bind)
+
 #define DRM_IOCTL_NOUVEAU_GEM_NEW            DRM_IOWR(DRM_COMMAND_BASE + DRM_NOUVEAU_GEM_NEW, struct drm_nouveau_gem_new)
 #define DRM_IOCTL_NOUVEAU_GEM_PUSHBUF        DRM_IOWR(DRM_COMMAND_BASE + DRM_NOUVEAU_GEM_PUSHBUF, struct drm_nouveau_gem_pushbuf)
 #define DRM_IOCTL_NOUVEAU_GEM_CPU_PREP       DRM_IOW (DRM_COMMAND_BASE + DRM_NOUVEAU_GEM_CPU_PREP, struct drm_nouveau_gem_cpu_prep)
-- 
2.21.0.392.gf8f6787159e

_______________________________________________
igt-dev mailing list
igt-dev@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/igt-dev

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

* [igt-dev] [PATCH i-g-t 3/5] lib/syncobj: drop local declarations
  2019-05-16 14:39 [igt-dev] [PATCH i-g-t 0/5] tests: Add timeline syncobj tests Lionel Landwerlin
  2019-05-16 14:39 ` [igt-dev] [PATCH i-g-t 1/5] lib/syncobj: fix comment typo Lionel Landwerlin
  2019-05-16 14:39 ` [igt-dev] [PATCH i-g-t 2/5] include: bump drm headers Lionel Landwerlin
@ 2019-05-16 14:39 ` Lionel Landwerlin
  2019-05-16 14:39 ` [igt-dev] [PATCH i-g-t 4/5] igt: add timeline test cases Lionel Landwerlin
                   ` (3 subsequent siblings)
  6 siblings, 0 replies; 10+ messages in thread
From: Lionel Landwerlin @ 2019-05-16 14:39 UTC (permalink / raw)
  To: igt-dev

We have copies of the DRM uAPI headers in the repo, so drop the local
declaration of syncobj defines/types.

Signed-off-by: Lionel Landwerlin <lionel.g.landwerlin@intel.com>
---
 lib/igt_syncobj.c     | 16 ++++++------
 lib/igt_syncobj.h     | 26 +------------------
 tests/syncobj_basic.c |  2 +-
 tests/syncobj_wait.c  | 58 +++++++++++++++++++++----------------------
 4 files changed, 39 insertions(+), 63 deletions(-)

diff --git a/lib/igt_syncobj.c b/lib/igt_syncobj.c
index 6aee9d24..f659bc24 100644
--- a/lib/igt_syncobj.c
+++ b/lib/igt_syncobj.c
@@ -170,10 +170,10 @@ syncobj_import_sync_file(int fd, uint32_t handle, int sync_file)
 }
 
 int
-__syncobj_wait(int fd, struct local_syncobj_wait *args)
+__syncobj_wait(int fd, struct drm_syncobj_wait *args)
 {
 	int err = 0;
-	if (drmIoctl(fd, LOCAL_IOCTL_SYNCOBJ_WAIT, args))
+	if (drmIoctl(fd, DRM_IOCTL_SYNCOBJ_WAIT, args))
 		err = -errno;
 	return err;
 }
@@ -182,7 +182,7 @@ int
 syncobj_wait_err(int fd, uint32_t *handles, uint32_t count,
 		 uint64_t abs_timeout_nsec, uint32_t flags)
 {
-	struct local_syncobj_wait wait;
+	struct drm_syncobj_wait wait;
 
 	wait.handles = to_user_pointer(handles);
 	wait.timeout_nsec = abs_timeout_nsec;
@@ -212,7 +212,7 @@ syncobj_wait(int fd, uint32_t *handles, uint32_t count,
 	     uint64_t abs_timeout_nsec, uint32_t flags,
 	     uint32_t *first_signaled)
 {
-	struct local_syncobj_wait wait;
+	struct drm_syncobj_wait wait;
 	int ret;
 
 	wait.handles = to_user_pointer(handles);
@@ -236,12 +236,12 @@ syncobj_wait(int fd, uint32_t *handles, uint32_t count,
 static int
 __syncobj_reset(int fd, uint32_t *handles, uint32_t count)
 {
-	struct local_syncobj_array array = { 0 };
+	struct drm_syncobj_array array = { 0 };
 	int err = 0;
 
 	array.handles = to_user_pointer(handles);
 	array.count_handles = count;
-	if (drmIoctl(fd, LOCAL_IOCTL_SYNCOBJ_RESET, &array))
+	if (drmIoctl(fd, DRM_IOCTL_SYNCOBJ_RESET, &array))
 		err = -errno;
 	return err;
 }
@@ -263,12 +263,12 @@ syncobj_reset(int fd, uint32_t *handles, uint32_t count)
 static int
 __syncobj_signal(int fd, uint32_t *handles, uint32_t count)
 {
-	struct local_syncobj_array array = { 0 };
+	struct drm_syncobj_array array = { 0 };
 	int err = 0;
 
 	array.handles = to_user_pointer(handles);
 	array.count_handles = count;
-	if (drmIoctl(fd, LOCAL_IOCTL_SYNCOBJ_SIGNAL, &array))
+	if (drmIoctl(fd, DRM_IOCTL_SYNCOBJ_SIGNAL, &array))
 		err = -errno;
 	return err;
 }
diff --git a/lib/igt_syncobj.h b/lib/igt_syncobj.h
index 44d1378d..51ad2364 100644
--- a/lib/igt_syncobj.h
+++ b/lib/igt_syncobj.h
@@ -28,30 +28,6 @@
 #include <stdbool.h>
 #include <drm.h>
 
-#define LOCAL_SYNCOBJ_CREATE_SIGNALED (1 << 0)
-
-#define LOCAL_SYNCOBJ_WAIT_FLAGS_WAIT_ALL (1 << 0)
-#define LOCAL_SYNCOBJ_WAIT_FLAGS_WAIT_FOR_SUBMIT (1 << 1)
-struct local_syncobj_wait {
-       __u64 handles;
-       /* absolute timeout */
-       __s64 timeout_nsec;
-       __u32 count_handles;
-       __u32 flags;
-       __u32 first_signaled; /* only valid when not waiting all */
-       __u32 pad;
-};
-
-struct local_syncobj_array {
-       __u64 handles;
-       __u32 count_handles;
-       __u32 pad;
-};
-
-#define LOCAL_IOCTL_SYNCOBJ_WAIT	DRM_IOWR(0xC3, struct local_syncobj_wait)
-#define LOCAL_IOCTL_SYNCOBJ_RESET	DRM_IOWR(0xC4, struct local_syncobj_array)
-#define LOCAL_IOCTL_SYNCOBJ_SIGNAL	DRM_IOWR(0xC5, struct local_syncobj_array)
-
 uint32_t syncobj_create(int fd, uint32_t flags);
 void syncobj_destroy(int fd, uint32_t handle);
 int __syncobj_handle_to_fd(int fd, struct drm_syncobj_handle *args);
@@ -59,7 +35,7 @@ int __syncobj_fd_to_handle(int fd, struct drm_syncobj_handle *args);
 int syncobj_handle_to_fd(int fd, uint32_t handle, uint32_t flags);
 uint32_t syncobj_fd_to_handle(int fd, int syncobj_fd, uint32_t flags);
 void syncobj_import_sync_file(int fd, uint32_t handle, int sync_file);
-int __syncobj_wait(int fd, struct local_syncobj_wait *args);
+int __syncobj_wait(int fd, struct drm_syncobj_wait *args);
 int syncobj_wait_err(int fd, uint32_t *handles, uint32_t count,
 		     uint64_t abs_timeout_nsec, uint32_t flags);
 bool syncobj_wait(int fd, uint32_t *handles, uint32_t count,
diff --git a/tests/syncobj_basic.c b/tests/syncobj_basic.c
index 44769d3b..1dce45c9 100644
--- a/tests/syncobj_basic.c
+++ b/tests/syncobj_basic.c
@@ -149,7 +149,7 @@ test_bad_create_flags(int fd)
 static void
 test_create_signaled(int fd)
 {
-	uint32_t syncobj = syncobj_create(fd, LOCAL_SYNCOBJ_CREATE_SIGNALED);
+	uint32_t syncobj = syncobj_create(fd, DRM_SYNCOBJ_CREATE_SIGNALED);
 
 	igt_assert_eq(syncobj_wait_err(fd, &syncobj, 1, 0, 0), 0);
 
diff --git a/tests/syncobj_wait.c b/tests/syncobj_wait.c
index 04d79de7..669d0adf 100644
--- a/tests/syncobj_wait.c
+++ b/tests/syncobj_wait.c
@@ -140,7 +140,7 @@ syncobj_trigger_delayed(int fd, uint32_t syncobj, uint64_t nsec)
 static void
 test_wait_bad_flags(int fd)
 {
-	struct local_syncobj_wait wait = { 0 };
+	struct drm_syncobj_wait wait = { 0 };
 	wait.flags = 0xdeadbeef;
 	igt_assert_eq(__syncobj_wait(fd, &wait), -EINVAL);
 }
@@ -148,14 +148,14 @@ test_wait_bad_flags(int fd)
 static void
 test_wait_zero_handles(int fd)
 {
-	struct local_syncobj_wait wait = { 0 };
+	struct drm_syncobj_wait wait = { 0 };
 	igt_assert_eq(__syncobj_wait(fd, &wait), -EINVAL);
 }
 
 static void
 test_wait_illegal_handle(int fd)
 {
-	struct local_syncobj_wait wait = { 0 };
+	struct drm_syncobj_wait wait = { 0 };
 	uint32_t handle = 0;
 
 	wait.count_handles = 1;
@@ -166,43 +166,43 @@ test_wait_illegal_handle(int fd)
 static void
 test_reset_zero_handles(int fd)
 {
-	struct local_syncobj_array array = { 0 };
+	struct drm_syncobj_array array = { 0 };
 	int ret;
 
-	ret = drmIoctl(fd, LOCAL_IOCTL_SYNCOBJ_RESET, &array);
+	ret = drmIoctl(fd, DRM_IOCTL_SYNCOBJ_RESET, &array);
 	igt_assert(ret == -1 && errno ==  EINVAL);
 }
 
 static void
 test_reset_illegal_handle(int fd)
 {
-	struct local_syncobj_array array = { 0 };
+	struct drm_syncobj_array array = { 0 };
 	uint32_t handle = 0;
 	int ret;
 
 	array.count_handles = 1;
 	array.handles = to_user_pointer(&handle);
-	ret = drmIoctl(fd, LOCAL_IOCTL_SYNCOBJ_RESET, &array);
+	ret = drmIoctl(fd, DRM_IOCTL_SYNCOBJ_RESET, &array);
 	igt_assert(ret == -1 && errno == ENOENT);
 }
 
 static void
 test_reset_one_illegal_handle(int fd)
 {
-	struct local_syncobj_array array = { 0 };
+	struct drm_syncobj_array array = { 0 };
 	uint32_t syncobjs[3];
 	int ret;
 
-	syncobjs[0] = syncobj_create(fd, LOCAL_SYNCOBJ_CREATE_SIGNALED);
+	syncobjs[0] = syncobj_create(fd, DRM_SYNCOBJ_CREATE_SIGNALED);
 	syncobjs[1] = 0;
-	syncobjs[2] = syncobj_create(fd, LOCAL_SYNCOBJ_CREATE_SIGNALED);
+	syncobjs[2] = syncobj_create(fd, DRM_SYNCOBJ_CREATE_SIGNALED);
 
 	igt_assert_eq(syncobj_wait_err(fd, &syncobjs[0], 1, 0, 0), 0);
 	igt_assert_eq(syncobj_wait_err(fd, &syncobjs[2], 1, 0, 0), 0);
 
 	array.count_handles = 3;
 	array.handles = to_user_pointer(syncobjs);
-	ret = drmIoctl(fd, LOCAL_IOCTL_SYNCOBJ_RESET, &array);
+	ret = drmIoctl(fd, DRM_IOCTL_SYNCOBJ_RESET, &array);
 	igt_assert(ret == -1 && errno == ENOENT);
 
 	/* Assert that we didn't actually reset anything */
@@ -216,44 +216,44 @@ test_reset_one_illegal_handle(int fd)
 static void
 test_reset_bad_pad(int fd)
 {
-	struct local_syncobj_array array = { 0 };
+	struct drm_syncobj_array array = { 0 };
 	uint32_t handle = 0;
 	int ret;
 
 	array.pad = 0xdeadbeef;
 	array.count_handles = 1;
 	array.handles = to_user_pointer(&handle);
-	ret = drmIoctl(fd, LOCAL_IOCTL_SYNCOBJ_RESET, &array);
+	ret = drmIoctl(fd, DRM_IOCTL_SYNCOBJ_RESET, &array);
 	igt_assert(ret == -1 && errno == EINVAL);
 }
 
 static void
 test_signal_zero_handles(int fd)
 {
-	struct local_syncobj_array array = { 0 };
+	struct drm_syncobj_array array = { 0 };
 	int ret;
 
-	ret = drmIoctl(fd, LOCAL_IOCTL_SYNCOBJ_SIGNAL, &array);
+	ret = drmIoctl(fd, DRM_IOCTL_SYNCOBJ_SIGNAL, &array);
 	igt_assert(ret == -1 && errno == EINVAL);
 }
 
 static void
 test_signal_illegal_handle(int fd)
 {
-	struct local_syncobj_array array = { 0 };
+	struct drm_syncobj_array array = { 0 };
 	uint32_t handle = 0;
 	int ret;
 
 	array.count_handles = 1;
 	array.handles = to_user_pointer(&handle);
-	ret = drmIoctl(fd, LOCAL_IOCTL_SYNCOBJ_SIGNAL, &array);
+	ret = drmIoctl(fd, DRM_IOCTL_SYNCOBJ_SIGNAL, &array);
 	igt_assert(ret == -1 && errno == ENOENT);
 }
 
 static void
 test_signal_one_illegal_handle(int fd)
 {
-	struct local_syncobj_array array = { 0 };
+	struct drm_syncobj_array array = { 0 };
 	uint32_t syncobjs[3];
 	int ret;
 
@@ -266,7 +266,7 @@ test_signal_one_illegal_handle(int fd)
 
 	array.count_handles = 3;
 	array.handles = to_user_pointer(syncobjs);
-	ret = drmIoctl(fd, LOCAL_IOCTL_SYNCOBJ_SIGNAL, &array);
+	ret = drmIoctl(fd, DRM_IOCTL_SYNCOBJ_SIGNAL, &array);
 	igt_assert(ret == -1 && errno == ENOENT);
 
 	/* Assert that we didn't actually reset anything */
@@ -280,14 +280,14 @@ test_signal_one_illegal_handle(int fd)
 static void
 test_signal_bad_pad(int fd)
 {
-	struct local_syncobj_array array = { 0 };
+	struct drm_syncobj_array array = { 0 };
 	uint32_t handle = 0;
 	int ret;
 
 	array.pad = 0xdeadbeef;
 	array.count_handles = 1;
 	array.handles = to_user_pointer(&handle);
-	ret = drmIoctl(fd, LOCAL_IOCTL_SYNCOBJ_SIGNAL, &array);
+	ret = drmIoctl(fd, DRM_IOCTL_SYNCOBJ_SIGNAL, &array);
 	igt_assert(ret == -1 && errno ==  EINVAL);
 }
 
@@ -304,10 +304,10 @@ flags_for_test_flags(uint32_t test_flags)
 	uint32_t flags = 0;
 
 	if (test_flags & WAIT_FOR_SUBMIT)
-		flags |= LOCAL_SYNCOBJ_WAIT_FLAGS_WAIT_FOR_SUBMIT;
+		flags |= DRM_SYNCOBJ_WAIT_FLAGS_WAIT_FOR_SUBMIT;
 
 	if (test_flags & WAIT_ALL)
-		flags |= LOCAL_SYNCOBJ_WAIT_FLAGS_WAIT_ALL;
+		flags |= DRM_SYNCOBJ_WAIT_FLAGS_WAIT_ALL;
 
 	return flags;
 }
@@ -432,7 +432,7 @@ static void
 test_reset_during_wait_for_submit(int fd)
 {
 	uint32_t syncobj = syncobj_create(fd, 0);
-	uint32_t flags = LOCAL_SYNCOBJ_WAIT_FLAGS_WAIT_FOR_SUBMIT;
+	uint32_t flags = DRM_SYNCOBJ_WAIT_FLAGS_WAIT_FOR_SUBMIT;
 	struct fd_handle_pair pair;
 	timer_t timer;
 
@@ -454,7 +454,7 @@ static void
 test_signal(int fd)
 {
 	uint32_t syncobj = syncobj_create(fd, 0);
-	uint32_t flags = LOCAL_SYNCOBJ_WAIT_FLAGS_WAIT_FOR_SUBMIT;
+	uint32_t flags = DRM_SYNCOBJ_WAIT_FLAGS_WAIT_FOR_SUBMIT;
 
 	igt_assert_eq(syncobj_wait_err(fd, &syncobj, 1, 0, 0), -EINVAL);
 	igt_assert_eq(syncobj_wait_err(fd, &syncobj, 1, 0, flags), -ETIME);
@@ -511,7 +511,7 @@ test_multi_wait(int fd, uint32_t test_flags, int expect)
 
 struct wait_thread_data {
 	int fd;
-	struct local_syncobj_wait wait;
+	struct drm_syncobj_wait wait;
 };
 
 static void *
@@ -713,7 +713,7 @@ test_wait_complex(int fd, uint32_t test_flags)
 static void
 test_wait_interrupted(int fd, uint32_t test_flags)
 {
-	struct local_syncobj_wait wait = { 0 };
+	struct drm_syncobj_wait wait = { 0 };
 	uint32_t syncobj = syncobj_create(fd, 0);
 	int timeline;
 
@@ -740,7 +740,7 @@ test_wait_interrupted(int fd, uint32_t test_flags)
 static bool
 has_syncobj_wait(int fd)
 {
-	struct local_syncobj_wait wait = { 0 };
+	struct drm_syncobj_wait wait = { 0 };
 	uint32_t handle = 0;
 	uint64_t value;
 	int ret;
@@ -753,7 +753,7 @@ has_syncobj_wait(int fd)
 	/* Try waiting for zero sync objects should fail with EINVAL */
 	wait.count_handles = 1;
 	wait.handles = to_user_pointer(&handle);
-	ret = drmIoctl(fd, LOCAL_IOCTL_SYNCOBJ_WAIT, &wait);
+	ret = drmIoctl(fd, DRM_IOCTL_SYNCOBJ_WAIT, &wait);
 	return ret == -1 && errno == ENOENT;
 }
 
-- 
2.21.0.392.gf8f6787159e

_______________________________________________
igt-dev mailing list
igt-dev@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/igt-dev

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

* [igt-dev] [PATCH i-g-t 4/5] igt: add timeline test cases
  2019-05-16 14:39 [igt-dev] [PATCH i-g-t 0/5] tests: Add timeline syncobj tests Lionel Landwerlin
                   ` (2 preceding siblings ...)
  2019-05-16 14:39 ` [igt-dev] [PATCH i-g-t 3/5] lib/syncobj: drop local declarations Lionel Landwerlin
@ 2019-05-16 14:39 ` Lionel Landwerlin
  2019-05-16 20:03   ` Chris Wilson
  2019-05-16 14:39 ` [igt-dev] [PATCH i-g-t 5/5] tests/syncobj_timeline: add more timeline tests Lionel Landwerlin
                   ` (2 subsequent siblings)
  6 siblings, 1 reply; 10+ messages in thread
From: Lionel Landwerlin @ 2019-05-16 14:39 UTC (permalink / raw)
  To: igt-dev; +Cc: Chunming Zhou

From: Chunming Zhou <david1.zhou@amd.com>

v2: adapt to new transfer ioctl

v3: Drop useless uint64_t casts (Lionel)
    Fix timeline query prototypes (Lionel)
    Test multi wait with timeline & binary syncobjs (Lionel)

Signed-off-by: Chunming Zhou <david1.zhou@amd.com>
Signed-off-by: Lionel Landwerlin <lionel.g.landwerlin@intel.com>
---
 lib/igt_syncobj.c        |  206 ++++++++
 lib/igt_syncobj.h        |   19 +
 tests/meson.build        |    1 +
 tests/syncobj_timeline.c | 1049 ++++++++++++++++++++++++++++++++++++++
 4 files changed, 1275 insertions(+)
 create mode 100644 tests/syncobj_timeline.c

diff --git a/lib/igt_syncobj.c b/lib/igt_syncobj.c
index f659bc24..309c7ce0 100644
--- a/lib/igt_syncobj.c
+++ b/lib/igt_syncobj.c
@@ -286,3 +286,209 @@ syncobj_signal(int fd, uint32_t *handles, uint32_t count)
 {
 	igt_assert_eq(__syncobj_signal(fd, handles, count), 0);
 }
+
+static int
+__syncobj_timeline_signal(int fd, uint32_t *handles, uint64_t *points, uint32_t count)
+{
+	struct drm_syncobj_timeline_array array = { 0 };
+	int err = 0;
+
+	array.handles = to_user_pointer(handles);
+	array.points = to_user_pointer(points);
+	array.count_handles = count;
+	if (drmIoctl(fd, DRM_IOCTL_SYNCOBJ_TIMELINE_SIGNAL, &array))
+		err = -errno;
+	return err;
+}
+
+/**
+ * syncobj_signal:
+ * @fd: The DRM file descriptor.
+ * @handles: Array of syncobj handles to signal
+ * @points: List of point of handles to signal.
+ * @count: Count of syncobj handles.
+ *
+ * Signal a set of syncobjs.
+ */
+void
+syncobj_timeline_signal(int fd, uint32_t *handles, uint64_t *points, uint32_t count)
+{
+	igt_assert_eq(__syncobj_timeline_signal(fd, handles, points, count), 0);
+}
+int
+__syncobj_timeline_wait_ioctl(int fd, struct drm_syncobj_timeline_wait *args)
+{
+	int err = 0;
+	if (drmIoctl(fd, DRM_IOCTL_SYNCOBJ_TIMELINE_WAIT, args))
+		err = -errno;
+	return err;
+}
+static int
+__syncobj_timeline_wait(int fd, uint32_t *handles, uint64_t *points,
+			unsigned num_handles,
+			int64_t timeout_nsec, unsigned flags,
+			uint32_t *first_signaled)
+{
+	struct drm_syncobj_timeline_wait args;
+	int ret;
+
+	args.handles = to_user_pointer(handles);
+	args.points = to_user_pointer(points);
+	args.timeout_nsec = timeout_nsec;
+	args.count_handles = num_handles;
+	args.flags = flags;
+	args.first_signaled = 0;
+	args.pad = 0;
+
+	ret = drmIoctl(fd, DRM_IOCTL_SYNCOBJ_TIMELINE_WAIT, &args);
+	if (ret < 0)
+		return -errno;
+
+	if (first_signaled)
+		*first_signaled = args.first_signaled;
+
+	return ret;
+}
+int
+syncobj_timeline_wait_err(int fd, uint32_t *handles, uint64_t *points,
+			  unsigned num_handles,
+			  int64_t timeout_nsec, unsigned flags)
+{
+	return __syncobj_timeline_wait(fd, handles, points, num_handles,
+				       timeout_nsec, flags, NULL);
+}
+
+/**
+ * syncobj_timeline_wait:
+ * @fd: The DRM file descriptor
+ * @handles: List of syncobj handles to wait for.
+ * @points: List of point of handles to wait for.
+ * @num_handles: Count of handles
+ * @timeout_nsec: Absolute wait timeout in nanoseconds.
+ * @flags: Wait ioctl flags.
+ * @first_signaled: Returned handle for first signaled syncobj.
+ *
+ * Waits in the kernel for any/all the requested syncobjs timeline point
+ * using the timeout and flags.
+ * Returns: bool value - false = timedout, true = signaled
+ */
+bool
+syncobj_timeline_wait(int fd, uint32_t *handles, uint64_t *points,
+		      unsigned num_handles,
+		      int64_t timeout_nsec, unsigned flags,
+		      uint32_t *first_signaled)
+{
+	int ret;
+
+	ret = __syncobj_timeline_wait(fd, handles, points, num_handles,
+				      timeout_nsec, flags, first_signaled);
+	if (ret == -ETIME)
+		return false;
+	igt_assert_eq(ret, 0);
+
+	return true;
+
+}
+
+static int
+__syncobj_timeline_query(int fd, uint32_t *handles, uint64_t *points,
+			 uint32_t handle_count)
+{
+	struct drm_syncobj_timeline_array args;
+	int ret;
+
+	args.handles = to_user_pointer(handles);
+	args.points = to_user_pointer(points);
+	args.count_handles = handle_count;
+	args.pad = 0;
+
+	ret = drmIoctl(fd, DRM_IOCTL_SYNCOBJ_QUERY, &args);
+	if (ret)
+		return ret;
+	return 0;
+}
+
+/**
+ * syncobj_timeline_query:
+ * @fd: The DRM file descriptor.
+ * @handles: Array of syncobj handles.
+ * @points: Array of syncobj points queried.
+ * @count: Count of syncobj handles.
+ *
+ * query a set of syncobjs.
+ */
+void
+syncobj_timeline_query(int fd, uint32_t *handles, uint64_t *points,
+		       uint32_t count)
+{
+	igt_assert_eq(__syncobj_timeline_query(fd, handles, points, count), 0);
+}
+
+static int
+__syncobj_binary_to_timeline(int fd, uint32_t timeline_handle,
+			     uint64_t point, uint32_t binary_handle)
+{
+	struct drm_syncobj_transfer args;
+
+	args.src_handle = binary_handle;
+	args.dst_handle = timeline_handle;
+	args.src_point = 0;
+	args.dst_point = point;
+	args.flags = 0;
+	args.pad = 0;
+	return drmIoctl(fd, DRM_IOCTL_SYNCOBJ_TRANSFER, &args);
+}
+
+/**
+ * syncobj_binary_to_timeline:
+ * @fd: The DRM file descriptor.
+ * @timeline_handles: Array of timeline syncobj handles.
+ * @point: syncobj point.
+ * @binary_handle: Array of binary syncobj handles.
+ *
+ * query a set of syncobjs.
+ */
+void
+syncobj_binary_to_timeline(int fd, uint32_t timeline_handle,
+			   uint64_t point, uint32_t binary_handle)
+{
+	igt_assert_eq(__syncobj_binary_to_timeline(fd, timeline_handle, point,
+						   binary_handle), 0);
+}
+
+static int
+__syncobj_timeline_to_binary(int fd, uint32_t binary_handle,
+			     uint32_t timeline_handle,
+			     uint64_t point,
+			     uint32_t flags)
+{
+	struct drm_syncobj_transfer args;
+
+	args.dst_handle = binary_handle;
+	args.src_handle = timeline_handle;
+	args.dst_point = 0;
+	args.src_point = point;
+	args.flags = flags;
+	args.pad = 0;
+	return drmIoctl(fd, DRM_IOCTL_SYNCOBJ_TRANSFER, &args);
+}
+
+/**
+ * syncobj_binary_to_timeline:
+ * @fd: The DRM file descriptor.
+ * @timeline_handles: Array of timeline syncobj handles.
+ * @point: syncobj point.
+ * @binary_handle: Array of binary syncobj handles.
+ *
+ * query a set of syncobjs.
+ */
+void
+syncobj_timeline_to_binary(int fd, uint32_t binary_handle,
+			   uint32_t timeline_handle,
+			   uint64_t point,
+			   uint32_t flags)
+{
+	igt_assert_eq(__syncobj_timeline_to_binary(fd, binary_handle,
+						   timeline_handle, point,
+						   flags), 0);
+}
diff --git a/lib/igt_syncobj.h b/lib/igt_syncobj.h
index 51ad2364..20f1f18f 100644
--- a/lib/igt_syncobj.h
+++ b/lib/igt_syncobj.h
@@ -41,7 +41,26 @@ int syncobj_wait_err(int fd, uint32_t *handles, uint32_t count,
 bool syncobj_wait(int fd, uint32_t *handles, uint32_t count,
 		  uint64_t abs_timeout_nsec, uint32_t flags,
 		  uint32_t *first_signaled);
+int __syncobj_timeline_wait_ioctl(int fd,
+				  struct drm_syncobj_timeline_wait *args);
+bool syncobj_timeline_wait(int fd, uint32_t *handles, uint64_t *points,
+			   unsigned num_handles,
+			   int64_t timeout_nsec, unsigned flags,
+			   uint32_t *first_signaled);
+int syncobj_timeline_wait_err(int fd, uint32_t *handles, uint64_t *points,
+			      unsigned num_handles,
+			      int64_t timeout_nsec, unsigned flags);
 void syncobj_reset(int fd, uint32_t *handles, uint32_t count);
 void syncobj_signal(int fd, uint32_t *handles, uint32_t count);
+void syncobj_timeline_query(int fd, uint32_t *handles, uint64_t *points,
+			    uint32_t count);
+void syncobj_binary_to_timeline(int fd, uint32_t timeline_handle,
+				uint64_t point, uint32_t binary_handle);
+void syncobj_timeline_to_binary(int fd, uint32_t binary_handle,
+				uint32_t timeline_handle,
+				uint64_t point,
+				uint32_t flags);
+void syncobj_timeline_signal(int fd, uint32_t *handles, uint64_t *points,
+			     uint32_t count);
 
 #endif /* IGT_SYNCOBJ_H */
diff --git a/tests/meson.build b/tests/meson.build
index 351594fa..aca498f2 100644
--- a/tests/meson.build
+++ b/tests/meson.build
@@ -78,6 +78,7 @@ test_progs = [
 	'sw_sync',
 	'syncobj_basic',
 	'syncobj_wait',
+	'syncobj_timeline',
 	'template',
 	'tools_test',
 	'v3d_get_bo_offset',
diff --git a/tests/syncobj_timeline.c b/tests/syncobj_timeline.c
new file mode 100644
index 00000000..7e46e177
--- /dev/null
+++ b/tests/syncobj_timeline.c
@@ -0,0 +1,1049 @@
+/*
+ * Copyright © 2018 Intel Corporation
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the "Software"),
+ * to deal in the Software without restriction, including without limitation
+ * the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ * and/or sell copies of the Software, and to permit persons to whom the
+ * Software is furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice (including the next
+ * paragraph) shall be included in all copies or substantial portions of the
+ * Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
+ * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
+ * IN THE SOFTWARE.
+ */
+
+#include "igt.h"
+#include "sw_sync.h"
+#include "igt_syncobj.h"
+#include <unistd.h>
+#include <time.h>
+#include <sys/ioctl.h>
+#include <pthread.h>
+#include <signal.h>
+#include "drm.h"
+
+IGT_TEST_DESCRIPTION("Tests for the drm timeline sync object API");
+
+/* One tenth of a second */
+#define SHORT_TIME_NSEC 100000000ull
+
+#define NSECS_PER_SEC 1000000000ull
+
+static uint64_t
+gettime_ns(void)
+{
+	struct timespec current;
+	clock_gettime(CLOCK_MONOTONIC, &current);
+	return (uint64_t)current.tv_sec * NSECS_PER_SEC + current.tv_nsec;
+}
+
+static void
+sleep_nsec(uint64_t time_nsec)
+{
+	struct timespec t;
+	t.tv_sec = time_nsec / NSECS_PER_SEC;
+	t.tv_nsec = time_nsec % NSECS_PER_SEC;
+	igt_assert_eq(nanosleep(&t, NULL), 0);
+}
+
+static uint64_t
+short_timeout(void)
+{
+	return gettime_ns() + SHORT_TIME_NSEC;
+}
+
+static int
+syncobj_attach_sw_sync(int fd, uint32_t handle, uint64_t point)
+{
+	int timeline, fence;
+
+	timeline = sw_sync_timeline_create();
+	fence = sw_sync_timeline_create_fence(timeline, 1);
+
+	if (point == 0) {
+		syncobj_import_sync_file(fd, handle, fence);
+	} else {
+		uint32_t syncobj = syncobj_create(fd, 0);
+
+		syncobj_import_sync_file(fd, syncobj, fence);
+		syncobj_binary_to_timeline(fd, handle, point, syncobj);
+		syncobj_destroy(fd, syncobj);
+	}
+
+	close(fence);
+
+	return timeline;
+}
+
+static void
+syncobj_trigger(int fd, uint32_t handle, uint64_t point)
+{
+	int timeline = syncobj_attach_sw_sync(fd, handle, point);
+	sw_sync_timeline_inc(timeline, 1);
+	close(timeline);
+}
+
+static timer_t
+set_timer(void (*cb)(union sigval), void *ptr, int i, uint64_t nsec)
+{
+        timer_t timer;
+        struct sigevent sev;
+        struct itimerspec its;
+
+        memset(&sev, 0, sizeof(sev));
+        sev.sigev_notify = SIGEV_THREAD;
+	if (ptr)
+		sev.sigev_value.sival_ptr = ptr;
+	else
+		sev.sigev_value.sival_int = i;
+        sev.sigev_notify_function = cb;
+        igt_assert(timer_create(CLOCK_MONOTONIC, &sev, &timer) == 0);
+
+        memset(&its, 0, sizeof(its));
+        its.it_value.tv_sec = nsec / NSEC_PER_SEC;
+        its.it_value.tv_nsec = nsec % NSEC_PER_SEC;
+        igt_assert(timer_settime(timer, 0, &its, NULL) == 0);
+
+	return timer;
+}
+
+struct fd_handle_pair {
+	int fd;
+	uint32_t handle;
+	uint64_t point;
+};
+
+static void
+timeline_inc_func(union sigval sigval)
+{
+	sw_sync_timeline_inc(sigval.sival_int, 1);
+}
+
+static void
+syncobj_trigger_free_pair_func(union sigval sigval)
+{
+	struct fd_handle_pair *pair = sigval.sival_ptr;
+	syncobj_trigger(pair->fd, pair->handle, pair->point);
+	free(pair);
+}
+
+static timer_t
+syncobj_trigger_delayed(int fd, uint32_t syncobj, uint64_t point, uint64_t nsec)
+{
+	struct fd_handle_pair *pair = malloc(sizeof(*pair));
+
+	pair->fd = fd;
+	pair->handle = syncobj;
+	pair->point = point;
+
+	return set_timer(syncobj_trigger_free_pair_func, pair, 0, nsec);
+}
+
+static void
+test_wait_bad_flags(int fd)
+{
+	struct drm_syncobj_timeline_wait wait = { 0 };
+	wait.flags = 0xdeadbeef;
+	igt_assert_eq(__syncobj_timeline_wait_ioctl(fd, &wait), -EINVAL);
+}
+
+static void
+test_wait_zero_handles(int fd)
+{
+	struct drm_syncobj_timeline_wait wait = { 0 };
+	igt_assert_eq(__syncobj_timeline_wait_ioctl(fd, &wait), -EINVAL);
+}
+
+static void
+test_wait_illegal_handle(int fd)
+{
+	struct drm_syncobj_timeline_wait wait = { 0 };
+	uint32_t handle = 0;
+
+	wait.count_handles = 1;
+	wait.handles = to_user_pointer(&handle);
+	igt_assert_eq(__syncobj_timeline_wait_ioctl(fd, &wait), -ENOENT);
+}
+
+static void
+test_query_zero_handles(int fd)
+{
+	struct drm_syncobj_timeline_array args = { 0 };
+	int ret;
+
+	ret = drmIoctl(fd, DRM_IOCTL_SYNCOBJ_QUERY, &args);
+	igt_assert(ret == -1 && errno ==  EINVAL);
+}
+
+static void
+test_query_illegal_handle(int fd)
+{
+	struct drm_syncobj_timeline_array args = { 0 };
+	uint32_t handle = 0;
+	int ret;
+
+	args.count_handles = 1;
+	args.handles = to_user_pointer(&handle);
+	ret = drmIoctl(fd, DRM_IOCTL_SYNCOBJ_QUERY, &args);
+	igt_assert(ret == -1 && errno == ENOENT);
+}
+
+static void
+test_query_one_illegal_handle(int fd)
+{
+	struct drm_syncobj_timeline_array array = { 0 };
+	uint32_t syncobjs[3];
+	uint64_t initial_point = 1;
+	int ret;
+
+	syncobjs[0] = syncobj_create(fd, 0);
+	syncobjs[1] = 0;
+	syncobjs[2] = syncobj_create(fd, 0);
+
+	syncobj_timeline_signal(fd, &syncobjs[0], &initial_point, 1);
+	syncobj_timeline_signal(fd, &syncobjs[2], &initial_point, 1);
+	igt_assert_eq(syncobj_timeline_wait_err(fd, &syncobjs[0],
+						&initial_point, 1, 0, 0), 0);
+	igt_assert_eq(syncobj_timeline_wait_err(fd, &syncobjs[2],
+						&initial_point, 1, 0, 0), 0);
+
+	array.count_handles = 3;
+	array.handles = to_user_pointer(syncobjs);
+	ret = drmIoctl(fd, DRM_IOCTL_SYNCOBJ_QUERY, &array);
+	igt_assert(ret == -1 && errno == ENOENT);
+
+	syncobj_destroy(fd, syncobjs[0]);
+	syncobj_destroy(fd, syncobjs[2]);
+}
+
+static void
+test_query_bad_pad(int fd)
+{
+	struct drm_syncobj_timeline_array array = { 0 };
+	uint32_t handle = 0;
+	int ret;
+
+	array.pad = 0xdeadbeef;
+	array.count_handles = 1;
+	array.handles = to_user_pointer(&handle);
+	ret = drmIoctl(fd, DRM_IOCTL_SYNCOBJ_QUERY, &array);
+	igt_assert(ret == -1 && errno == EINVAL);
+}
+
+static void
+test_signal_zero_handles(int fd)
+{
+	struct drm_syncobj_timeline_array args = { 0 };
+	int ret;
+
+	ret = drmIoctl(fd, DRM_IOCTL_SYNCOBJ_TIMELINE_SIGNAL, &args);
+	igt_assert(ret == -1 && errno ==  EINVAL);
+}
+
+static void
+test_signal_illegal_handle(int fd)
+{
+	struct drm_syncobj_timeline_array args = { 0 };
+	uint32_t handle = 0;
+	int ret;
+
+	args.count_handles = 1;
+	args.handles = to_user_pointer(&handle);
+	ret = drmIoctl(fd, DRM_IOCTL_SYNCOBJ_TIMELINE_SIGNAL, &args);
+	igt_assert(ret == -1 && errno == ENOENT);
+}
+
+static void
+test_signal_illegal_point(int fd)
+{
+	struct drm_syncobj_timeline_array args = { 0 };
+	uint32_t handle = 1;
+	uint64_t point = 0;
+	int ret;
+
+	args.count_handles = 1;
+	args.handles = to_user_pointer(&handle);
+	args.points = to_user_pointer(&point);
+	ret = drmIoctl(fd, DRM_IOCTL_SYNCOBJ_TIMELINE_SIGNAL, &args);
+	igt_assert(ret == -1 && errno == ENOENT);
+}
+static void
+test_signal_one_illegal_handle(int fd)
+{
+	struct drm_syncobj_timeline_array array = { 0 };
+	uint32_t syncobjs[3];
+	uint64_t initial_point = 1;
+	int ret;
+
+	syncobjs[0] = syncobj_create(fd, 0);
+	syncobjs[1] = 0;
+	syncobjs[2] = syncobj_create(fd, 0);
+
+	syncobj_timeline_signal(fd, &syncobjs[0], &initial_point, 1);
+	syncobj_timeline_signal(fd, &syncobjs[2], &initial_point, 1);
+	igt_assert_eq(syncobj_timeline_wait_err(fd, &syncobjs[0],
+						&initial_point, 1, 0, 0), 0);
+	igt_assert_eq(syncobj_timeline_wait_err(fd, &syncobjs[2],
+						&initial_point, 1, 0, 0), 0);
+
+	array.count_handles = 3;
+	array.handles = to_user_pointer(syncobjs);
+	ret = drmIoctl(fd, DRM_IOCTL_SYNCOBJ_TIMELINE_SIGNAL, &array);
+	igt_assert(ret == -1 && errno == ENOENT);
+
+	syncobj_destroy(fd, syncobjs[0]);
+	syncobj_destroy(fd, syncobjs[2]);
+}
+
+static void
+test_signal_bad_pad(int fd)
+{
+	struct drm_syncobj_timeline_array array = { 0 };
+	uint32_t handle = 0;
+	int ret;
+
+	array.pad = 0xdeadbeef;
+	array.count_handles = 1;
+	array.handles = to_user_pointer(&handle);
+	ret = drmIoctl(fd, DRM_IOCTL_SYNCOBJ_TIMELINE_SIGNAL, &array);
+	igt_assert(ret == -1 && errno == EINVAL);
+}
+
+static void
+test_signal_array(int fd)
+{
+	uint32_t syncobjs[4];
+	uint64_t points[4] = {1, 1, 1, 0};
+
+	syncobjs[0] = syncobj_create(fd, 0);
+	syncobjs[1] = syncobj_create(fd, 0);
+	syncobjs[2] = syncobj_create(fd, 0);
+	syncobjs[3] = syncobj_create(fd, 0);
+
+	syncobj_timeline_signal(fd, syncobjs, points, 4);
+	igt_assert_eq(syncobj_timeline_wait_err(fd, syncobjs,
+						points, 3, 0, 0), 0);
+	igt_assert_eq(syncobj_wait_err(fd, &syncobjs[3], 1, 0, 0), 0);
+
+	syncobj_destroy(fd, syncobjs[0]);
+	syncobj_destroy(fd, syncobjs[1]);
+	syncobj_destroy(fd, syncobjs[2]);
+	syncobj_destroy(fd, syncobjs[3]);
+}
+
+static void
+test_transfer_illegal_handle(int fd)
+{
+	struct drm_syncobj_transfer args = { 0 };
+	uint32_t handle = 0;
+	int ret;
+
+	args.src_handle = to_user_pointer(&handle);
+	args.dst_handle = to_user_pointer(&handle);
+	args.src_point = 1;
+	args.dst_point = 0;
+	ret = drmIoctl(fd, DRM_IOCTL_SYNCOBJ_TRANSFER, &args);
+	igt_assert(ret == -1 && errno == ENOENT);
+}
+
+static void
+test_transfer_bad_pad(int fd)
+{
+	struct drm_syncobj_transfer arg = { 0 };
+	uint32_t handle = 0;
+	int ret;
+
+	arg.pad = 0xdeadbeef;
+	arg.src_handle = to_user_pointer(&handle);
+	arg.dst_handle = to_user_pointer(&handle);
+	ret = drmIoctl(fd, DRM_IOCTL_SYNCOBJ_TRANSFER, &arg);
+	igt_assert(ret == -1 && errno == EINVAL);
+}
+
+#define WAIT_FOR_SUBMIT		(1 << 0)
+#define WAIT_ALL		(1 << 1)
+#define WAIT_AVAILABLE		(1 << 2)
+#define WAIT_UNSUBMITTED	(1 << 3)
+#define WAIT_SUBMITTED		(1 << 4)
+#define WAIT_SIGNALED		(1 << 5)
+#define WAIT_FLAGS_MAX		(1 << 6) - 1
+
+static uint32_t
+flags_for_test_flags(uint32_t test_flags)
+{
+	uint32_t flags = 0;
+
+	if (test_flags & WAIT_FOR_SUBMIT)
+		flags |= DRM_SYNCOBJ_WAIT_FLAGS_WAIT_FOR_SUBMIT;
+
+	if (test_flags & WAIT_AVAILABLE)
+		flags |= DRM_SYNCOBJ_WAIT_FLAGS_WAIT_AVAILABLE;
+
+	if (test_flags & WAIT_ALL)
+		flags |= DRM_SYNCOBJ_WAIT_FLAGS_WAIT_ALL;
+
+	return flags;
+}
+
+static void
+test_single_wait(int fd, uint32_t test_flags, int expect)
+{
+	uint32_t syncobj = syncobj_create(fd, 0);
+	uint32_t flags = flags_for_test_flags(test_flags);
+	uint64_t point = 1;
+	int timeline = -1;
+
+	if (test_flags & (WAIT_SUBMITTED | WAIT_SIGNALED))
+		timeline = syncobj_attach_sw_sync(fd, syncobj, point);
+
+	if (test_flags & WAIT_SIGNALED)
+		sw_sync_timeline_inc(timeline, 1);
+
+	igt_assert_eq(syncobj_timeline_wait_err(fd, &syncobj, &point, 1,
+						0, flags), expect);
+
+	igt_assert_eq(syncobj_timeline_wait_err(fd, &syncobj, &point, 1,
+						short_timeout(), flags), expect);
+
+	if (expect != -ETIME) {
+		igt_assert_eq(syncobj_timeline_wait_err(fd, &syncobj, &point, 1,
+							UINT64_MAX, flags), expect);
+	}
+
+	syncobj_destroy(fd, syncobj);
+	if (timeline != -1)
+		close(timeline);
+}
+
+static void
+test_wait_delayed_signal(int fd, uint32_t test_flags)
+{
+	uint32_t syncobj = syncobj_create(fd, 0);
+	uint32_t flags = flags_for_test_flags(test_flags);
+	uint64_t point = 1;
+	int timeline = -1;
+	timer_t timer;
+
+	if (test_flags & WAIT_FOR_SUBMIT) {
+		timer = syncobj_trigger_delayed(fd, syncobj, point, SHORT_TIME_NSEC);
+	} else {
+		timeline = syncobj_attach_sw_sync(fd, syncobj, point);
+		timer = set_timer(timeline_inc_func, NULL,
+				  timeline, SHORT_TIME_NSEC);
+	}
+
+	igt_assert(syncobj_timeline_wait(fd, &syncobj, &point, 1,
+				gettime_ns() + SHORT_TIME_NSEC * 2,
+				flags, NULL));
+
+	timer_delete(timer);
+
+	if (timeline != -1)
+		close(timeline);
+
+	syncobj_destroy(fd, syncobj);
+}
+
+static void
+test_reset_unsignaled(int fd)
+{
+	uint32_t syncobj = syncobj_create(fd, 0);
+	uint64_t point = 1;
+
+	igt_assert_eq(syncobj_timeline_wait_err(fd, &syncobj, &point,
+						1, 0, 0), -EINVAL);
+
+	syncobj_reset(fd, &syncobj, 1);
+
+	igt_assert_eq(syncobj_timeline_wait_err(fd, &syncobj, &point,
+						1, 0, 0), -EINVAL);
+
+	syncobj_destroy(fd, syncobj);
+}
+
+static void
+test_reset_signaled(int fd)
+{
+	uint32_t syncobj = syncobj_create(fd, 0);
+	uint64_t point = 1;
+
+	syncobj_trigger(fd, syncobj, point);
+
+	igt_assert_eq(syncobj_timeline_wait_err(fd, &syncobj, &point,
+						1, 0, 0), 0);
+
+	syncobj_reset(fd, &syncobj, 1);
+
+	igt_assert_eq(syncobj_timeline_wait_err(fd, &syncobj, &point,
+						1, 0, 0), -EINVAL);
+
+	syncobj_destroy(fd, syncobj);
+}
+
+static void
+test_reset_multiple_signaled(int fd)
+{
+	uint64_t points[3] = {1, 1, 1};
+	uint32_t syncobjs[3];
+	int i;
+
+	for (i = 0; i < 3; i++) {
+		syncobjs[i] = syncobj_create(fd, 0);
+		syncobj_trigger(fd, syncobjs[i], points[i]);
+	}
+
+	igt_assert_eq(syncobj_timeline_wait_err(fd, syncobjs, points, 3, 0, 0), 0);
+
+	syncobj_reset(fd, syncobjs, 3);
+
+	for (i = 0; i < 3; i++) {
+		igt_assert_eq(syncobj_timeline_wait_err(fd, &syncobjs[i],
+							&points[i], 1,
+							0, 0), -EINVAL);
+		syncobj_destroy(fd, syncobjs[i]);
+	}
+}
+
+static void
+reset_and_trigger_func(union sigval sigval)
+{
+	struct fd_handle_pair *pair = sigval.sival_ptr;
+	syncobj_reset(pair->fd, &pair->handle, 1);
+	syncobj_trigger(pair->fd, pair->handle, pair->point);
+}
+
+static void
+test_reset_during_wait_for_submit(int fd)
+{
+	uint32_t syncobj = syncobj_create(fd, 0);
+	uint32_t flags = DRM_SYNCOBJ_WAIT_FLAGS_WAIT_FOR_SUBMIT;
+	struct fd_handle_pair pair;
+	uint64_t point = 1;
+	timer_t timer;
+
+	pair.fd = fd;
+	pair.handle = syncobj;
+	timer = set_timer(reset_and_trigger_func, &pair, 0, SHORT_TIME_NSEC);
+
+	/* A reset should be a no-op even if we're in the middle of a wait */
+	igt_assert(syncobj_timeline_wait(fd, &syncobj, &point, 1,
+				gettime_ns() + SHORT_TIME_NSEC * 2,
+				flags, NULL));
+
+	timer_delete(timer);
+
+	syncobj_destroy(fd, syncobj);
+}
+
+static void
+test_signal(int fd)
+{
+	uint32_t syncobj = syncobj_create(fd, 0);
+	uint32_t flags = DRM_SYNCOBJ_WAIT_FLAGS_WAIT_FOR_SUBMIT;
+	uint64_t point = 1;
+
+	igt_assert_eq(syncobj_timeline_wait_err(fd, &syncobj, &point,
+						1, 0, 0), -EINVAL);
+	igt_assert_eq(syncobj_timeline_wait_err(fd, &syncobj, &point,
+						1, 0, flags), -ETIME);
+
+	syncobj_timeline_signal(fd, &syncobj, &point, 1);
+
+	igt_assert(syncobj_timeline_wait(fd, &syncobj, &point, 1, 0, 0, NULL));
+	igt_assert(syncobj_timeline_wait(fd, &syncobj, &point, 1, 0, flags, NULL));
+
+	syncobj_destroy(fd, syncobj);
+}
+
+static void
+test_multi_wait(int fd, uint32_t test_flags, int expect)
+{
+	uint32_t tflag, flags;
+	int i, fidx, timeline;
+	uint64_t points[5] = {
+		1 + rand() % 1000,
+		0, /* non timeline syncobj */
+		1 + rand() % 1000,
+		1 + rand() % 1000,
+		0, /* non timeline syncobj */
+	};
+	uint32_t syncobjs[ARRAY_SIZE(points)];
+
+	for (i = 0; i < ARRAY_SIZE(points); i++)
+		syncobjs[i] = syncobj_create(fd, 0);
+
+	flags = flags_for_test_flags(test_flags);
+	test_flags &= ~(WAIT_ALL | WAIT_FOR_SUBMIT | WAIT_AVAILABLE);
+
+	for (i = 0; i < ARRAY_SIZE(points); i++) {
+		fidx = ffs(test_flags) - 1;
+		tflag = (1 << fidx);
+
+		if (test_flags & ~tflag)
+			test_flags &= ~tflag;
+
+		if (tflag & (WAIT_SUBMITTED | WAIT_SIGNALED)) {
+			timeline = syncobj_attach_sw_sync(fd, syncobjs[i],
+							  points[i]);
+		}
+		if (tflag & WAIT_SIGNALED)
+			sw_sync_timeline_inc(timeline, 1);
+	}
+
+	igt_assert_eq(syncobj_timeline_wait_err(fd, syncobjs,
+						points, ARRAY_SIZE(points),
+						0, flags), expect);
+
+	igt_assert_eq(syncobj_timeline_wait_err(fd, syncobjs,
+						points, ARRAY_SIZE(points),
+						short_timeout(),
+						flags), expect);
+
+	if (expect != -ETIME) {
+		igt_assert_eq(syncobj_timeline_wait_err(fd, syncobjs,
+							points, ARRAY_SIZE(points),
+							UINT64_MAX,
+							flags), expect);
+	}
+
+	for (i = 0; i < ARRAY_SIZE(points); i++)
+		syncobj_destroy(fd, syncobjs[i]);
+}
+
+struct wait_thread_data {
+	int fd;
+	struct drm_syncobj_timeline_wait wait;
+};
+
+static void *
+wait_thread_func(void *data)
+{
+	struct wait_thread_data *wait = data;
+	igt_assert_eq(__syncobj_timeline_wait_ioctl(wait->fd, &wait->wait), 0);
+	return NULL;
+}
+
+static void
+test_wait_snapshot(int fd, uint32_t test_flags)
+{
+	struct wait_thread_data wait = { 0 };
+	uint32_t syncobjs[2];
+	uint64_t points[2] = {1, 1};
+	int timelines[3] = { -1, -1, -1 };
+	pthread_t thread;
+
+	syncobjs[0] = syncobj_create(fd, 0);
+	syncobjs[1] = syncobj_create(fd, 0);
+
+	if (!(test_flags & WAIT_FOR_SUBMIT)) {
+		timelines[0] = syncobj_attach_sw_sync(fd, syncobjs[0], points[0]);
+		timelines[1] = syncobj_attach_sw_sync(fd, syncobjs[1], points[1]);
+	}
+
+	wait.fd = fd;
+	wait.wait.handles = to_user_pointer(syncobjs);
+	wait.wait.count_handles = 2;
+	wait.wait.points = to_user_pointer(points);
+	wait.wait.timeout_nsec = short_timeout();
+	wait.wait.flags = flags_for_test_flags(test_flags);
+
+	igt_assert_eq(pthread_create(&thread, NULL, wait_thread_func, &wait), 0);
+
+	sleep_nsec(SHORT_TIME_NSEC / 5);
+
+	/* Try to fake the kernel out by triggering or partially triggering
+	 * the first fence.
+	 */
+	if (test_flags & WAIT_ALL) {
+		/* If it's WAIT_ALL, actually trigger it */
+		if (timelines[0] == -1)
+			syncobj_trigger(fd, syncobjs[0], points[0]);
+		else
+			sw_sync_timeline_inc(timelines[0], 1);
+	} else if (test_flags & WAIT_FOR_SUBMIT) {
+		timelines[0] = syncobj_attach_sw_sync(fd, syncobjs[0], points[0]);
+	}
+
+	sleep_nsec(SHORT_TIME_NSEC / 5);
+
+	/* Then reset it */
+	syncobj_reset(fd, &syncobjs[0], 1);
+
+	sleep_nsec(SHORT_TIME_NSEC / 5);
+
+	/* Then "submit" it in a way that will never trigger.  This way, if
+	 * the kernel picks up on the new fence (it shouldn't), we'll get a
+	 * timeout.
+	 */
+	timelines[2] = syncobj_attach_sw_sync(fd, syncobjs[0], points[0]);
+
+	sleep_nsec(SHORT_TIME_NSEC / 5);
+
+	/* Now trigger the second fence to complete the wait */
+
+	if (timelines[1] == -1)
+		syncobj_trigger(fd, syncobjs[1], points[1]);
+	else
+		sw_sync_timeline_inc(timelines[1], 1);
+
+	pthread_join(thread, NULL);
+
+	if (!(test_flags & WAIT_ALL))
+		igt_assert_eq(wait.wait.first_signaled, 1);
+
+	close(timelines[0]);
+	close(timelines[1]);
+	close(timelines[2]);
+	syncobj_destroy(fd, syncobjs[0]);
+	syncobj_destroy(fd, syncobjs[1]);
+}
+
+/* The numbers 0-7, each repeated 5x and shuffled. */
+static const unsigned shuffled_0_7_x4[] = {
+	2, 0, 6, 1, 1, 4, 5, 2, 0, 7, 1, 7, 6, 3, 4, 5,
+	0, 2, 7, 3, 5, 4, 0, 6, 7, 3, 2, 5, 6, 1, 4, 3,
+};
+
+enum syncobj_stage {
+	STAGE_UNSUBMITTED,
+	STAGE_SUBMITTED,
+	STAGE_SIGNALED,
+	STAGE_RESET,
+	STAGE_RESUBMITTED,
+};
+
+static void
+test_wait_complex(int fd, uint32_t test_flags)
+{
+	struct wait_thread_data wait = { 0 };
+	uint32_t syncobjs[8];
+	uint64_t points[8] = {1, 1, 1, 1, 1, 1, 1, 1};
+	enum syncobj_stage stage[8];
+	int i, j, timelines[8];
+	uint32_t first_signaled = -1, num_signaled = 0;
+	pthread_t thread;
+
+	for (i = 0; i < 8; i++) {
+		stage[i] = STAGE_UNSUBMITTED;
+		syncobjs[i] = syncobj_create(fd, 0);
+	}
+
+	if (test_flags & WAIT_FOR_SUBMIT) {
+		for (i = 0; i < 8; i++)
+			timelines[i] = -1;
+	} else {
+		for (i = 0; i < 8; i++)
+			timelines[i] = syncobj_attach_sw_sync(fd, syncobjs[i],
+							      points[i]);
+	}
+
+	wait.fd = fd;
+	wait.wait.handles = to_user_pointer(syncobjs);
+	wait.wait.count_handles = 2;
+	wait.wait.points = to_user_pointer(points);
+	wait.wait.timeout_nsec = gettime_ns() + NSECS_PER_SEC;
+	wait.wait.flags = flags_for_test_flags(test_flags);
+
+	igt_assert_eq(pthread_create(&thread, NULL, wait_thread_func, &wait), 0);
+
+	sleep_nsec(NSECS_PER_SEC / 50);
+
+	num_signaled = 0;
+	for (j = 0; j < ARRAY_SIZE(shuffled_0_7_x4); j++) {
+		i = shuffled_0_7_x4[j];
+		igt_assert_lt(i, ARRAY_SIZE(syncobjs));
+
+		switch (stage[i]++) {
+		case STAGE_UNSUBMITTED:
+			/* We need to submit attach a fence */
+			if (!(test_flags & WAIT_FOR_SUBMIT)) {
+				/* We had to attach one up-front */
+				igt_assert_neq(timelines[i], -1);
+				break;
+			}
+			timelines[i] = syncobj_attach_sw_sync(fd, syncobjs[i],
+							      points[i]);
+			break;
+
+		case STAGE_SUBMITTED:
+			/* We have a fence, trigger it */
+			igt_assert_neq(timelines[i], -1);
+			sw_sync_timeline_inc(timelines[i], 1);
+			close(timelines[i]);
+			timelines[i] = -1;
+			if (num_signaled == 0)
+				first_signaled = i;
+			num_signaled++;
+			break;
+
+		case STAGE_SIGNALED:
+			/* We're already signaled, reset */
+			syncobj_reset(fd, &syncobjs[i], 1);
+			break;
+
+		case STAGE_RESET:
+			/* We're reset, submit and don't signal */
+			timelines[i] = syncobj_attach_sw_sync(fd, syncobjs[i],
+							      points[i]);
+			break;
+
+		case STAGE_RESUBMITTED:
+			igt_assert(!"Should not reach this stage");
+			break;
+		}
+
+		if (test_flags & WAIT_ALL) {
+			if (num_signaled == ARRAY_SIZE(syncobjs))
+				break;
+		} else {
+			if (num_signaled > 0)
+				break;
+		}
+
+		sleep_nsec(NSECS_PER_SEC / 100);
+	}
+
+	pthread_join(thread, NULL);
+
+	if (test_flags & WAIT_ALL) {
+		igt_assert_eq(num_signaled, ARRAY_SIZE(syncobjs));
+	} else {
+		igt_assert_eq(num_signaled, 1);
+		igt_assert_eq(wait.wait.first_signaled, first_signaled);
+	}
+
+	for (i = 0; i < 8; i++) {
+		close(timelines[i]);
+		syncobj_destroy(fd, syncobjs[i]);
+	}
+}
+
+static void
+test_wait_interrupted(int fd, uint32_t test_flags)
+{
+	struct drm_syncobj_timeline_wait wait = { 0 };
+	uint32_t syncobj = syncobj_create(fd, 0);
+	uint64_t point = 1;
+	int timeline;
+
+	wait.handles = to_user_pointer(&syncobj);
+	wait.points = to_user_pointer(&point);
+	wait.count_handles = 1;
+	wait.flags = flags_for_test_flags(test_flags);
+
+	if (test_flags & WAIT_FOR_SUBMIT) {
+		wait.timeout_nsec = short_timeout();
+		igt_while_interruptible(true)
+			igt_assert_eq(__syncobj_timeline_wait_ioctl(fd, &wait), -ETIME);
+	}
+
+	timeline = syncobj_attach_sw_sync(fd, syncobj, point);
+
+	wait.timeout_nsec = short_timeout();
+	igt_while_interruptible(true)
+		igt_assert_eq(__syncobj_timeline_wait_ioctl(fd, &wait), -ETIME);
+
+	syncobj_destroy(fd, syncobj);
+	close(timeline);
+}
+
+static bool
+has_syncobj_timeline_wait(int fd)
+{
+	struct drm_syncobj_timeline_wait wait = { 0 };
+	uint32_t handle = 0;
+	uint64_t value;
+	int ret;
+
+	if (drmGetCap(fd, DRM_CAP_SYNCOBJ_TIMELINE, &value))
+		return false;
+	if (!value)
+		return false;
+
+	/* Try waiting for zero sync objects should fail with EINVAL */
+	wait.count_handles = 1;
+	wait.handles = to_user_pointer(&handle);
+	ret = drmIoctl(fd, DRM_IOCTL_SYNCOBJ_TIMELINE_WAIT, &wait);
+	return ret == -1 && errno == ENOENT;
+}
+
+igt_main
+{
+	int fd = -1;
+
+	igt_fixture {
+		fd = drm_open_driver(DRIVER_ANY);
+		igt_require(has_syncobj_timeline_wait(fd));
+		igt_require_sw_sync();
+	}
+
+	igt_subtest("invalid-wait-bad-flags")
+		test_wait_bad_flags(fd);
+
+	igt_subtest("invalid-wait-zero-handles")
+		test_wait_zero_handles(fd);
+
+	igt_subtest("invalid-wait-illegal-handle")
+		test_wait_illegal_handle(fd);
+
+	igt_subtest("invalid-query-zero-handles")
+		test_query_zero_handles(fd);
+
+	igt_subtest("invalid-query-illegal-handle")
+		test_query_illegal_handle(fd);
+
+	igt_subtest("invalid-query-one-illegal-handle")
+		test_query_one_illegal_handle(fd);
+
+	igt_subtest("invalid-query-bad-pad")
+		test_query_bad_pad(fd);
+
+	igt_subtest("invalid-signal-zero-handles")
+		test_signal_zero_handles(fd);
+
+	igt_subtest("invalid-signal-illegal-handle")
+		test_signal_illegal_handle(fd);
+
+	igt_subtest("invalid-signal-illegal-point")
+		test_signal_illegal_point(fd);
+
+	igt_subtest("invalid-signal-one-illegal-handle")
+		test_signal_one_illegal_handle(fd);
+
+	igt_subtest("invalid-signal-bad-pad")
+		test_signal_bad_pad(fd);
+
+	igt_subtest("invalid-signal-array")
+		test_signal_array(fd);
+
+	igt_subtest("invalid-transfer-illegal-handle")
+		test_transfer_illegal_handle(fd);
+
+	igt_subtest("invalid-transfer-bad-pad")
+		test_transfer_bad_pad(fd);
+
+	for (unsigned flags = 0; flags < WAIT_FLAGS_MAX; flags++) {
+		int err;
+
+		/* Only one wait mode for single-wait tests */
+		if (__builtin_popcount(flags & (WAIT_UNSUBMITTED |
+						WAIT_SUBMITTED |
+						WAIT_SIGNALED)) != 1)
+			continue;
+
+		if ((flags & WAIT_UNSUBMITTED) && !(flags & WAIT_FOR_SUBMIT))
+			err = -EINVAL;
+		else if (!(flags & WAIT_SIGNALED) && !((flags & WAIT_SUBMITTED) && (flags & WAIT_AVAILABLE)))
+			err = -ETIME;
+		else
+			err = 0;
+
+		igt_subtest_f("%ssingle-wait%s%s%s%s%s%s",
+			      err == -EINVAL ? "invalid-" : err == -ETIME ? "etime-" : "",
+			      (flags & WAIT_ALL) ? "-all" : "",
+			      (flags & WAIT_FOR_SUBMIT) ? "-for-submit" : "",
+			      (flags & WAIT_AVAILABLE) ? "-available" : "",
+			      (flags & WAIT_UNSUBMITTED) ? "-unsubmitted" : "",
+			      (flags & WAIT_SUBMITTED) ? "-submitted" : "",
+			      (flags & WAIT_SIGNALED) ? "-signaled" : "")
+			test_single_wait(fd, flags, err);
+	}
+
+	igt_subtest("wait-delayed-signal")
+		test_wait_delayed_signal(fd, 0);
+
+	igt_subtest("wait-for-submit-delayed-submit")
+		test_wait_delayed_signal(fd, WAIT_FOR_SUBMIT);
+
+	igt_subtest("wait-all-delayed-signal")
+		test_wait_delayed_signal(fd, WAIT_ALL);
+
+	igt_subtest("wait-all-for-submit-delayed-submit")
+		test_wait_delayed_signal(fd, WAIT_ALL | WAIT_FOR_SUBMIT);
+
+	igt_subtest("reset-unsignaled")
+		test_reset_unsignaled(fd);
+
+	igt_subtest("reset-signaled")
+		test_reset_signaled(fd);
+
+	igt_subtest("reset-multiple-signaled")
+		test_reset_multiple_signaled(fd);
+
+	igt_subtest("reset-during-wait-for-submit")
+		test_reset_during_wait_for_submit(fd);
+
+	igt_subtest("signal")
+		test_signal(fd);
+
+	for (unsigned flags = 0; flags < WAIT_FLAGS_MAX; flags++) {
+		int err;
+
+		/* At least one wait mode for multi-wait tests */
+		if (!(flags & (WAIT_UNSUBMITTED |
+			       WAIT_SUBMITTED |
+			       WAIT_SIGNALED)))
+			continue;
+
+		err = 0;
+		if ((flags & WAIT_UNSUBMITTED) && !(flags & WAIT_FOR_SUBMIT)) {
+			err = -EINVAL;
+		} else if (flags & WAIT_ALL) {
+			if (flags & (WAIT_UNSUBMITTED | WAIT_SUBMITTED))
+				err = -ETIME;
+			if (!(flags & WAIT_UNSUBMITTED) && (flags & WAIT_SUBMITTED) && (flags & WAIT_AVAILABLE))
+				err = 0;
+		} else {
+			if (!(flags & WAIT_SIGNALED) && !((flags & WAIT_SUBMITTED) && (flags & WAIT_AVAILABLE)))
+				err = -ETIME;
+		}
+
+		igt_subtest_f("%smulti-wait%s%s%s%s%s%s",
+			      err == -EINVAL ? "invalid-" : err == -ETIME ? "etime-" : "",
+			      (flags & WAIT_ALL) ? "-all" : "",
+			      (flags & WAIT_FOR_SUBMIT) ? "-for-submit" : "",
+			      (flags & WAIT_AVAILABLE) ? "-available" : "",
+			      (flags & WAIT_UNSUBMITTED) ? "-unsubmitted" : "",
+			      (flags & WAIT_SUBMITTED) ? "-submitted" : "",
+			      (flags & WAIT_SIGNALED) ? "-signaled" : "")
+			test_multi_wait(fd, flags, err);
+	}
+	igt_subtest("wait-any-snapshot")
+		test_wait_snapshot(fd, 0);
+
+	igt_subtest("wait-all-snapshot")
+		test_wait_snapshot(fd, WAIT_ALL);
+
+	igt_subtest("wait-for-submit-snapshot")
+		test_wait_snapshot(fd, WAIT_FOR_SUBMIT);
+
+	igt_subtest("wait-all-for-submit-snapshot")
+		test_wait_snapshot(fd, WAIT_ALL | WAIT_FOR_SUBMIT);
+
+	igt_subtest("wait-any-complex")
+		test_wait_complex(fd, 0);
+
+	igt_subtest("wait-all-complex")
+		test_wait_complex(fd, WAIT_ALL);
+
+	igt_subtest("wait-for-submit-complex")
+		test_wait_complex(fd, WAIT_FOR_SUBMIT);
+
+	igt_subtest("wait-all-for-submit-complex")
+		test_wait_complex(fd, WAIT_ALL | WAIT_FOR_SUBMIT);
+
+	igt_subtest("wait-any-interrupted")
+		test_wait_interrupted(fd, 0);
+
+	igt_subtest("wait-all-interrupted")
+		test_wait_interrupted(fd, WAIT_ALL);
+}
-- 
2.21.0.392.gf8f6787159e

_______________________________________________
igt-dev mailing list
igt-dev@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/igt-dev

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

* [igt-dev] [PATCH i-g-t 5/5] tests/syncobj_timeline: add more timeline tests
  2019-05-16 14:39 [igt-dev] [PATCH i-g-t 0/5] tests: Add timeline syncobj tests Lionel Landwerlin
                   ` (3 preceding siblings ...)
  2019-05-16 14:39 ` [igt-dev] [PATCH i-g-t 4/5] igt: add timeline test cases Lionel Landwerlin
@ 2019-05-16 14:39 ` Lionel Landwerlin
  2019-05-16 15:12 ` [igt-dev] ✓ Fi.CI.BAT: success for tests: Add timeline syncobj tests Patchwork
  2019-05-16 19:50 ` [igt-dev] ✓ Fi.CI.IGT: " Patchwork
  6 siblings, 0 replies; 10+ messages in thread
From: Lionel Landwerlin @ 2019-05-16 14:39 UTC (permalink / raw)
  To: igt-dev

Including ordering tests and 32bit limit.

Signed-off-by: Lionel Landwerlin <lionel.g.landwerlin@intel.com>
---
 tests/syncobj_timeline.c | 286 +++++++++++++++++++++++++++++++++++++++
 1 file changed, 286 insertions(+)

diff --git a/tests/syncobj_timeline.c b/tests/syncobj_timeline.c
index 7e46e177..ca657ccc 100644
--- a/tests/syncobj_timeline.c
+++ b/tests/syncobj_timeline.c
@@ -856,6 +856,277 @@ test_wait_interrupted(int fd, uint32_t test_flags)
 	close(timeline);
 }
 
+/*
+ * Verifies that as we signal points from the host, the syncobj
+ * timeline value increments and that waits for submits/signals works
+ * properly.
+ */
+static void
+test_host_signal_points(int fd)
+{
+	uint32_t syncobj = syncobj_create(fd, 0);
+	uint64_t value = 0;
+	int i;
+
+	for (i = 0; i < 100; i++) {
+		uint64_t query_value = 0;
+
+		value += rand();
+
+		syncobj_timeline_signal(fd, &syncobj, &value, 1);
+
+		syncobj_timeline_query(fd, &syncobj, &query_value, 1);
+		igt_assert_eq(query_value, value);
+
+		igt_assert(syncobj_timeline_wait(fd, &syncobj, &query_value,
+						 1, 0, WAIT_FOR_SUBMIT, NULL));
+
+		query_value -= 1;
+		igt_assert(syncobj_timeline_wait(fd, &syncobj, &query_value,
+						 1, 0, WAIT_ALL, NULL));
+	}
+
+	syncobj_destroy(fd, syncobj);
+}
+
+/*
+ * Verifies that a device signaling fences out of order on the
+ * timeline still increments the timeline monotonically and that waits
+ * work properly.
+ */
+static void
+test_device_signal_unordered(int fd)
+{
+	uint32_t syncobj = syncobj_create(fd, 0);
+	int point_indices[] = { 0, 2, 1, 4, 3 };
+	bool signaled[ARRAY_SIZE(point_indices)] = { 0 };
+	int fences[ARRAY_SIZE(point_indices)];
+	int timeline = sw_sync_timeline_create();
+	uint64_t value = 0;
+	int i, j;
+
+	for (i = 0; i < ARRAY_SIZE(fences); i++) {
+		fences[point_indices[i]] = sw_sync_timeline_create_fence(timeline, i + 1);
+	}
+
+	for (i = 0; i < ARRAY_SIZE(fences); i++) {
+		uint32_t tmp_syncobj = syncobj_create(fd, 0);
+
+		syncobj_import_sync_file(fd, tmp_syncobj, fences[i]);
+		syncobj_binary_to_timeline(fd, syncobj, i + 1, tmp_syncobj);
+		syncobj_destroy(fd, tmp_syncobj);
+	}
+
+	for (i = 0; i < ARRAY_SIZE(fences); i++) {
+		uint64_t query_value = 0;
+		uint64_t min_value = 0;
+
+		sw_sync_timeline_inc(timeline, 1);
+
+		signaled[point_indices[i]] = true;
+
+		/*
+		 * Compute a minimum value of the timeline based of
+		 * the smallest signaled point.
+		 */
+		for (j = 0; j < ARRAY_SIZE(signaled); j++) {
+			if (!signaled[j])
+				break;
+			min_value = j;
+		}
+
+		syncobj_timeline_query(fd, &syncobj, &query_value, 1);
+		igt_assert(query_value >= min_value);
+		igt_assert(query_value >= value);
+
+		igt_debug("signaling point %i, timeline value = %" PRIu64 "\n",
+			  point_indices[i] + 1, query_value);
+
+		value = max(query_value, value);
+
+		igt_assert(syncobj_timeline_wait(fd, &syncobj, &query_value,
+						 1, 0, WAIT_FOR_SUBMIT, NULL));
+
+		igt_assert(syncobj_timeline_wait(fd, &syncobj, &query_value,
+						 1, 0, WAIT_ALL, NULL));
+	}
+
+	for (i = 0; i < ARRAY_SIZE(fences); i++)
+		close(fences[i]);
+
+	syncobj_destroy(fd, syncobj);
+	close(timeline);
+}
+
+/*
+ * Verifies that submitting out of order doesn't break the timeline.
+ */
+static void
+test_device_submit_unordered(int fd)
+{
+	uint32_t syncobj = syncobj_create(fd, 0);
+	uint64_t points[] = { 1, 5, 3, 6, 7 };
+	int timeline = sw_sync_timeline_create();
+	uint64_t query_value;
+	int i;
+
+	for (i = 0; i < ARRAY_SIZE(points); i++) {
+		int fence = sw_sync_timeline_create_fence(timeline, i + 1);
+		uint32_t tmp_syncobj = syncobj_create(fd, 0);
+
+		syncobj_import_sync_file(fd, tmp_syncobj, fence);
+		syncobj_binary_to_timeline(fd, syncobj, points[i], tmp_syncobj);
+		close(fence);
+		syncobj_destroy(fd, tmp_syncobj);
+	}
+
+	/*
+	 * Signal points 1, 5 & 3. There are no other points <= 5 so
+	 * waiting on 5 should return immediately for submission &
+	 * signaling.
+	 */
+	sw_sync_timeline_inc(timeline, 3);
+
+	syncobj_timeline_query(fd, &syncobj, &query_value, 1);
+	igt_assert_eq(query_value, 5);
+
+	igt_assert(syncobj_timeline_wait(fd, &syncobj, &query_value,
+					 1, 0, WAIT_FOR_SUBMIT, NULL));
+
+	igt_assert(syncobj_timeline_wait(fd, &syncobj, &query_value,
+					 1, 0, WAIT_ALL, NULL));
+
+	syncobj_destroy(fd, syncobj);
+	close(timeline);
+}
+
+/*
+ * Verifies that the host signaling fences out of order on the
+ * timeline still increments the timeline monotonically and that waits
+ * work properly.
+ */
+static void
+test_host_signal_ordered(int fd)
+{
+	uint32_t syncobj = syncobj_create(fd, 0);
+	int timeline = sw_sync_timeline_create();
+	uint64_t host_signal_value = 8, query_value;
+	int i;
+
+	for (i = 0; i < 5; i++) {
+		int fence = sw_sync_timeline_create_fence(timeline, i + 1);
+		uint32_t tmp_syncobj = syncobj_create(fd, 0);
+
+		syncobj_import_sync_file(fd, tmp_syncobj, fence);
+		syncobj_binary_to_timeline(fd, syncobj, i + 1, tmp_syncobj);
+		syncobj_destroy(fd, tmp_syncobj);
+		close(fence);
+	}
+
+	sw_sync_timeline_inc(timeline, 3);
+
+	syncobj_timeline_query(fd, &syncobj, &query_value, 1);
+	igt_assert_eq(query_value, 3);
+
+	syncobj_timeline_signal(fd, &syncobj, &host_signal_value, 1);
+
+	syncobj_timeline_query(fd, &syncobj, &query_value, 1);
+	igt_assert_eq(query_value, 3);
+
+	sw_sync_timeline_inc(timeline, 5);
+
+	syncobj_timeline_query(fd, &syncobj, &query_value, 1);
+	igt_assert_eq(query_value, 8);
+
+	syncobj_destroy(fd, syncobj);
+	close(timeline);
+}
+
+struct checker_thread_data {
+	int fd;
+	uint32_t syncobj;
+	bool running;
+	bool started;
+};
+
+static void *
+checker_thread_func(void *_data)
+{
+	struct checker_thread_data *data = _data;
+	uint64_t value, last_value = 0;
+
+	while (data->running) {
+		syncobj_timeline_query(data->fd, &data->syncobj, &value, 1);
+
+		data->started = true;
+
+		igt_assert(last_value <= value);
+		last_value = value;
+	}
+
+	return NULL;
+}
+
+/*
+ * Verifies that signaling around the int32_t limit. For compatibility
+ * reason, the handling of seqnos in the dma-fences can consider a
+ * seqnoA is prior seqnoB even though seqnoA > seqnoB. We ran into
+ * that issue and it was fixed in :
+ *
+ * commit b312d8ca3a7cebe19941d969a51f2b7f899b81e2
+ * Author: Christian König <christian.koenig@amd.com>
+ * Date:   Wed Nov 14 16:11:06 2018 +0100
+ *
+ *    dma-buf: make fence sequence numbers 64 bit v2
+ *
+ */
+static void
+test_32bits_limit(int fd)
+{
+	struct checker_thread_data thread_data = {
+		.fd = fd,
+		.syncobj = syncobj_create(fd, 0),
+		.running = true,
+		.started = false,
+	};
+	int timeline = sw_sync_timeline_create();
+	uint64_t limit_diff = (1ull << 31) - 1;
+	uint64_t points[] = { 1, 5, limit_diff + 5, limit_diff + 6, limit_diff * 2, };
+	pthread_t thread;
+	uint64_t value, last_value;
+	int i;
+
+	igt_assert_eq(pthread_create(&thread, NULL, checker_thread_func, &thread_data), 0);
+
+	while (!thread_data.started);
+
+	for (i = 0; i < ARRAY_SIZE(points); i++) {
+		int fence = sw_sync_timeline_create_fence(timeline, i + 1);
+		uint32_t tmp_syncobj = syncobj_create(fd, 0);
+
+		syncobj_import_sync_file(fd, tmp_syncobj, fence);
+		syncobj_binary_to_timeline(fd, thread_data.syncobj, points[i], tmp_syncobj);
+		close(fence);
+		syncobj_destroy(fd, tmp_syncobj);
+	}
+
+	last_value = 0;
+	for (i = 0; i < ARRAY_SIZE(points); i++) {
+		sw_sync_timeline_inc(timeline, 1);
+
+		syncobj_timeline_query(fd, &thread_data.syncobj, &value, 1);
+		igt_assert(last_value <= value);
+
+		last_value = value;
+	}
+
+	thread_data.running = false;
+	pthread_join(thread, NULL);
+
+	syncobj_destroy(fd, thread_data.syncobj);
+	close(timeline);
+}
+
 static bool
 has_syncobj_timeline_wait(int fd)
 {
@@ -1046,4 +1317,19 @@ igt_main
 
 	igt_subtest("wait-all-interrupted")
 		test_wait_interrupted(fd, WAIT_ALL);
+
+	igt_subtest("host-signal-points")
+		test_host_signal_points(fd);
+
+	igt_subtest("device-signal-unordered")
+		test_device_signal_unordered(fd);
+
+	igt_subtest("device-submit-unordered")
+		test_device_submit_unordered(fd);
+
+	igt_subtest("host-signal-ordered")
+		test_host_signal_ordered(fd);
+
+	igt_subtest("32bits-limit")
+		test_32bits_limit(fd);
 }
-- 
2.21.0.392.gf8f6787159e

_______________________________________________
igt-dev mailing list
igt-dev@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/igt-dev

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

* [igt-dev] ✓ Fi.CI.BAT: success for tests: Add timeline syncobj tests
  2019-05-16 14:39 [igt-dev] [PATCH i-g-t 0/5] tests: Add timeline syncobj tests Lionel Landwerlin
                   ` (4 preceding siblings ...)
  2019-05-16 14:39 ` [igt-dev] [PATCH i-g-t 5/5] tests/syncobj_timeline: add more timeline tests Lionel Landwerlin
@ 2019-05-16 15:12 ` Patchwork
  2019-05-16 19:50 ` [igt-dev] ✓ Fi.CI.IGT: " Patchwork
  6 siblings, 0 replies; 10+ messages in thread
From: Patchwork @ 2019-05-16 15:12 UTC (permalink / raw)
  To: Lionel Landwerlin; +Cc: igt-dev

== Series Details ==

Series: tests: Add timeline syncobj tests
URL   : https://patchwork.freedesktop.org/series/60724/
State : success

== Summary ==

CI Bug Log - changes from IGT_4994 -> IGTPW_2991
====================================================

Summary
-------

  **SUCCESS**

  No regressions found.

  External URL: https://patchwork.freedesktop.org/api/1.0/series/60724/revisions/1/mbox/

Known issues
------------

  Here are the changes found in IGTPW_2991 that come from known issues:

### IGT changes ###

#### Issues hit ####

  * igt@gem_exec_suspend@basic-s3:
    - fi-blb-e6850:       [PASS][1] -> [INCOMPLETE][2] ([fdo#107718])
   [1]: https://intel-gfx-ci.01.org/tree/drm-tip/IGT_4994/fi-blb-e6850/igt@gem_exec_suspend@basic-s3.html
   [2]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_2991/fi-blb-e6850/igt@gem_exec_suspend@basic-s3.html

  * igt@i915_selftest@live_hangcheck:
    - fi-skl-iommu:       [PASS][3] -> [INCOMPLETE][4] ([fdo#108602] / [fdo#108744])
   [3]: https://intel-gfx-ci.01.org/tree/drm-tip/IGT_4994/fi-skl-iommu/igt@i915_selftest@live_hangcheck.html
   [4]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_2991/fi-skl-iommu/igt@i915_selftest@live_hangcheck.html

  * igt@prime_vgem@basic-fence-flip:
    - fi-ilk-650:         [PASS][5] -> [DMESG-WARN][6] ([fdo#106387])
   [5]: https://intel-gfx-ci.01.org/tree/drm-tip/IGT_4994/fi-ilk-650/igt@prime_vgem@basic-fence-flip.html
   [6]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_2991/fi-ilk-650/igt@prime_vgem@basic-fence-flip.html

  
#### Possible fixes ####

  * igt@gem_basic@bad-close:
    - {fi-icl-u3}:        [INCOMPLETE][7] ([fdo#107713]) -> [PASS][8]
   [7]: https://intel-gfx-ci.01.org/tree/drm-tip/IGT_4994/fi-icl-u3/igt@gem_basic@bad-close.html
   [8]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_2991/fi-icl-u3/igt@gem_basic@bad-close.html

  * igt@gem_cpu_reloc@basic:
    - fi-icl-u2:          [INCOMPLETE][9] ([fdo#107713] / [fdo#110246]) -> [PASS][10]
   [9]: https://intel-gfx-ci.01.org/tree/drm-tip/IGT_4994/fi-icl-u2/igt@gem_cpu_reloc@basic.html
   [10]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_2991/fi-icl-u2/igt@gem_cpu_reloc@basic.html

  
  {name}: This element is suppressed. This means it is ignored when computing
          the status of the difference (SUCCESS, WARNING, or FAILURE).

  [fdo#106387]: https://bugs.freedesktop.org/show_bug.cgi?id=106387
  [fdo#107713]: https://bugs.freedesktop.org/show_bug.cgi?id=107713
  [fdo#107718]: https://bugs.freedesktop.org/show_bug.cgi?id=107718
  [fdo#108602]: https://bugs.freedesktop.org/show_bug.cgi?id=108602
  [fdo#108744]: https://bugs.freedesktop.org/show_bug.cgi?id=108744
  [fdo#110246]: https://bugs.freedesktop.org/show_bug.cgi?id=110246


Participating hosts (52 -> 45)
------------------------------

  Missing    (7): fi-kbl-soraka fi-ilk-m540 fi-hsw-4200u fi-byt-squawks fi-bsw-cyan fi-byt-clapper fi-bdw-samus 


Build changes
-------------

  * IGT: IGT_4994 -> IGTPW_2991

  CI_DRM_6090: df27ebbc9ec0d8ae42e8cf3d7a3b29fd6baf4940 @ git://anongit.freedesktop.org/gfx-ci/linux
  IGTPW_2991: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_2991/
  IGT_4994: 555019f862c35f1619627761d6da21385be40920 @ git://anongit.freedesktop.org/xorg/app/intel-gpu-tools



== Testlist changes ==

+++ 118 lines
--- 0 lines

== Logs ==

For more details see: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_2991/
_______________________________________________
igt-dev mailing list
igt-dev@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/igt-dev

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

* [igt-dev] ✓ Fi.CI.IGT: success for tests: Add timeline syncobj tests
  2019-05-16 14:39 [igt-dev] [PATCH i-g-t 0/5] tests: Add timeline syncobj tests Lionel Landwerlin
                   ` (5 preceding siblings ...)
  2019-05-16 15:12 ` [igt-dev] ✓ Fi.CI.BAT: success for tests: Add timeline syncobj tests Patchwork
@ 2019-05-16 19:50 ` Patchwork
  6 siblings, 0 replies; 10+ messages in thread
From: Patchwork @ 2019-05-16 19:50 UTC (permalink / raw)
  To: Lionel Landwerlin; +Cc: igt-dev

== Series Details ==

Series: tests: Add timeline syncobj tests
URL   : https://patchwork.freedesktop.org/series/60724/
State : success

== Summary ==

CI Bug Log - changes from IGT_4994_full -> IGTPW_2991_full
====================================================

Summary
-------

  **SUCCESS**

  No regressions found.

  External URL: https://patchwork.freedesktop.org/api/1.0/series/60724/revisions/1/mbox/

Possible new issues
-------------------

  Here are the unknown changes that may have been introduced in IGTPW_2991_full:

### IGT changes ###

#### Possible regressions ####

  * {igt@syncobj_timeline@wait-any-interrupted} (NEW):
    - shard-iclb:         NOTRUN -> [SKIP][1] +109 similar issues
   [1]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_2991/shard-iclb2/igt@syncobj_timeline@wait-any-interrupted.html

  
New tests
---------

  New tests have been introduced between IGT_4994_full and IGTPW_2991_full:

### New IGT tests (118) ###

  * igt@syncobj_timeline@32bits-limit:
    - Statuses : 6 skip(s)
    - Exec time: [0.0] s

  * igt@syncobj_timeline@device-signal-unordered:
    - Statuses : 6 skip(s)
    - Exec time: [0.0] s

  * igt@syncobj_timeline@device-submit-unordered:
    - Statuses : 6 skip(s)
    - Exec time: [0.0] s

  * igt@syncobj_timeline@etime-multi-wait-all-for-submit-available-unsubmitted:
    - Statuses : 5 skip(s)
    - Exec time: [0.0] s

  * igt@syncobj_timeline@etime-multi-wait-all-for-submit-available-unsubmitted-signaled:
    - Statuses : 6 skip(s)
    - Exec time: [0.0] s

  * igt@syncobj_timeline@etime-multi-wait-all-for-submit-available-unsubmitted-submitted:
    - Statuses : 6 skip(s)
    - Exec time: [0.0] s

  * igt@syncobj_timeline@etime-multi-wait-all-for-submit-submitted:
    - Statuses : 5 skip(s)
    - Exec time: [0.0] s

  * igt@syncobj_timeline@etime-multi-wait-all-for-submit-submitted-signaled:
    - Statuses : 6 skip(s)
    - Exec time: [0.0] s

  * igt@syncobj_timeline@etime-multi-wait-all-for-submit-unsubmitted:
    - Statuses : 6 skip(s)
    - Exec time: [0.0] s

  * igt@syncobj_timeline@etime-multi-wait-all-for-submit-unsubmitted-signaled:
    - Statuses : 6 skip(s)
    - Exec time: [0.0] s

  * igt@syncobj_timeline@etime-multi-wait-all-for-submit-unsubmitted-submitted:
    - Statuses : 6 skip(s)
    - Exec time: [0.0] s

  * igt@syncobj_timeline@etime-multi-wait-all-for-submit-unsubmitted-submitted-signaled:
    - Statuses : 6 skip(s)
    - Exec time: [0.0] s

  * igt@syncobj_timeline@etime-multi-wait-all-submitted:
    - Statuses : 5 skip(s)
    - Exec time: [0.0] s

  * igt@syncobj_timeline@etime-multi-wait-all-submitted-signaled:
    - Statuses : 6 skip(s)
    - Exec time: [0.0] s

  * igt@syncobj_timeline@etime-multi-wait-for-submit-available-unsubmitted:
    - Statuses : 6 skip(s)
    - Exec time: [0.0] s

  * igt@syncobj_timeline@etime-multi-wait-for-submit-submitted:
    - Statuses : 6 skip(s)
    - Exec time: [0.0] s

  * igt@syncobj_timeline@etime-multi-wait-for-submit-unsubmitted:
    - Statuses : 6 skip(s)
    - Exec time: [0.0] s

  * igt@syncobj_timeline@etime-multi-wait-for-submit-unsubmitted-submitted:
    - Statuses : 6 skip(s)
    - Exec time: [0.0] s

  * igt@syncobj_timeline@etime-multi-wait-submitted:
    - Statuses : 6 skip(s)
    - Exec time: [0.0] s

  * igt@syncobj_timeline@etime-single-wait-all-for-submit-available-unsubmitted:
    - Statuses : 6 skip(s)
    - Exec time: [0.0] s

  * igt@syncobj_timeline@etime-single-wait-all-for-submit-submitted:
    - Statuses : 6 skip(s)
    - Exec time: [0.0] s

  * igt@syncobj_timeline@etime-single-wait-all-for-submit-unsubmitted:
    - Statuses : 6 skip(s)
    - Exec time: [0.0] s

  * igt@syncobj_timeline@etime-single-wait-all-submitted:
    - Statuses : 6 skip(s)
    - Exec time: [0.0] s

  * igt@syncobj_timeline@etime-single-wait-for-submit-available-unsubmitted:
    - Statuses : 6 skip(s)
    - Exec time: [0.0] s

  * igt@syncobj_timeline@etime-single-wait-for-submit-submitted:
    - Statuses : 5 skip(s)
    - Exec time: [0.0] s

  * igt@syncobj_timeline@etime-single-wait-for-submit-unsubmitted:
    - Statuses : 6 skip(s)
    - Exec time: [0.0] s

  * igt@syncobj_timeline@etime-single-wait-submitted:
    - Statuses : 6 skip(s)
    - Exec time: [0.0] s

  * igt@syncobj_timeline@host-signal-ordered:
    - Statuses : 6 skip(s)
    - Exec time: [0.0] s

  * igt@syncobj_timeline@host-signal-points:
    - Statuses : 5 skip(s)
    - Exec time: [0.0] s

  * igt@syncobj_timeline@invalid-multi-wait-all-available-unsubmitted:
    - Statuses : 6 skip(s)
    - Exec time: [0.0] s

  * igt@syncobj_timeline@invalid-multi-wait-all-available-unsubmitted-signaled:
    - Statuses : 6 skip(s)
    - Exec time: [0.0] s

  * igt@syncobj_timeline@invalid-multi-wait-all-available-unsubmitted-submitted:
    - Statuses : 6 skip(s)
    - Exec time: [0.0] s

  * igt@syncobj_timeline@invalid-multi-wait-all-available-unsubmitted-submitted-signaled:
    - Statuses : 6 skip(s)
    - Exec time: [0.0] s

  * igt@syncobj_timeline@invalid-multi-wait-all-unsubmitted:
    - Statuses : 6 skip(s)
    - Exec time: [0.0] s

  * igt@syncobj_timeline@invalid-multi-wait-all-unsubmitted-signaled:
    - Statuses : 6 skip(s)
    - Exec time: [0.0] s

  * igt@syncobj_timeline@invalid-multi-wait-all-unsubmitted-submitted:
    - Statuses : 6 skip(s)
    - Exec time: [0.0] s

  * igt@syncobj_timeline@invalid-multi-wait-all-unsubmitted-submitted-signaled:
    - Statuses : 6 skip(s)
    - Exec time: [0.0] s

  * igt@syncobj_timeline@invalid-multi-wait-available-unsubmitted:
    - Statuses : 5 skip(s)
    - Exec time: [0.0] s

  * igt@syncobj_timeline@invalid-multi-wait-available-unsubmitted-signaled:
    - Statuses : 6 skip(s)
    - Exec time: [0.0] s

  * igt@syncobj_timeline@invalid-multi-wait-available-unsubmitted-submitted:
    - Statuses : 6 skip(s)
    - Exec time: [0.0] s

  * igt@syncobj_timeline@invalid-multi-wait-available-unsubmitted-submitted-signaled:
    - Statuses : 6 skip(s)
    - Exec time: [0.0] s

  * igt@syncobj_timeline@invalid-multi-wait-unsubmitted:
    - Statuses : 5 skip(s)
    - Exec time: [0.0] s

  * igt@syncobj_timeline@invalid-multi-wait-unsubmitted-signaled:
    - Statuses : 6 skip(s)
    - Exec time: [0.0] s

  * igt@syncobj_timeline@invalid-multi-wait-unsubmitted-submitted:
    - Statuses : 6 skip(s)
    - Exec time: [0.0] s

  * igt@syncobj_timeline@invalid-multi-wait-unsubmitted-submitted-signaled:
    - Statuses : 6 skip(s)
    - Exec time: [0.0] s

  * igt@syncobj_timeline@invalid-query-bad-pad:
    - Statuses : 6 skip(s)
    - Exec time: [0.0] s

  * igt@syncobj_timeline@invalid-query-illegal-handle:
    - Statuses : 6 skip(s)
    - Exec time: [0.0] s

  * igt@syncobj_timeline@invalid-query-one-illegal-handle:
    - Statuses : 6 skip(s)
    - Exec time: [0.0] s

  * igt@syncobj_timeline@invalid-query-zero-handles:
    - Statuses : 5 skip(s)
    - Exec time: [0.0] s

  * igt@syncobj_timeline@invalid-signal-array:
    - Statuses : 6 skip(s)
    - Exec time: [0.0] s

  * igt@syncobj_timeline@invalid-signal-bad-pad:
    - Statuses : 5 skip(s)
    - Exec time: [0.0] s

  * igt@syncobj_timeline@invalid-signal-illegal-handle:
    - Statuses : 5 skip(s)
    - Exec time: [0.0] s

  * igt@syncobj_timeline@invalid-signal-illegal-point:
    - Statuses : 6 skip(s)
    - Exec time: [0.0] s

  * igt@syncobj_timeline@invalid-signal-one-illegal-handle:
    - Statuses : 6 skip(s)
    - Exec time: [0.0] s

  * igt@syncobj_timeline@invalid-signal-zero-handles:
    - Statuses : 6 skip(s)
    - Exec time: [0.0] s

  * igt@syncobj_timeline@invalid-single-wait-all-available-unsubmitted:
    - Statuses : 6 skip(s)
    - Exec time: [0.0] s

  * igt@syncobj_timeline@invalid-single-wait-all-unsubmitted:
    - Statuses : 6 skip(s)
    - Exec time: [0.0] s

  * igt@syncobj_timeline@invalid-single-wait-available-unsubmitted:
    - Statuses : 6 skip(s)
    - Exec time: [0.0] s

  * igt@syncobj_timeline@invalid-single-wait-unsubmitted:
    - Statuses : 6 skip(s)
    - Exec time: [0.0] s

  * igt@syncobj_timeline@invalid-transfer-bad-pad:
    - Statuses : 6 skip(s)
    - Exec time: [0.0] s

  * igt@syncobj_timeline@invalid-transfer-illegal-handle:
    - Statuses : 6 skip(s)
    - Exec time: [0.0] s

  * igt@syncobj_timeline@invalid-wait-bad-flags:
    - Statuses : 6 skip(s)
    - Exec time: [0.0] s

  * igt@syncobj_timeline@invalid-wait-illegal-handle:
    - Statuses : 5 skip(s)
    - Exec time: [0.0] s

  * igt@syncobj_timeline@invalid-wait-zero-handles:
    - Statuses : 5 skip(s)
    - Exec time: [0.0] s

  * igt@syncobj_timeline@multi-wait-all-available-signaled:
    - Statuses : 6 skip(s)
    - Exec time: [0.0] s

  * igt@syncobj_timeline@multi-wait-all-available-submitted:
    - Statuses : 6 skip(s)
    - Exec time: [0.0] s

  * igt@syncobj_timeline@multi-wait-all-available-submitted-signaled:
    - Statuses : 5 skip(s)
    - Exec time: [0.0] s

  * igt@syncobj_timeline@multi-wait-all-for-submit-available-signaled:
    - Statuses : 6 skip(s)
    - Exec time: [0.0] s

  * igt@syncobj_timeline@multi-wait-all-for-submit-available-submitted:
    - Statuses : 6 skip(s)
    - Exec time: [0.0] s

  * igt@syncobj_timeline@multi-wait-all-for-submit-available-submitted-signaled:
    - Statuses : 6 skip(s)
    - Exec time: [0.0] s

  * igt@syncobj_timeline@multi-wait-all-for-submit-signaled:
    - Statuses : 6 skip(s)
    - Exec time: [0.0] s

  * igt@syncobj_timeline@multi-wait-all-signaled:
    - Statuses : 6 skip(s)
    - Exec time: [0.0] s

  * igt@syncobj_timeline@multi-wait-available-signaled:
    - Statuses : 6 skip(s)
    - Exec time: [0.0] s

  * igt@syncobj_timeline@multi-wait-available-submitted:
    - Statuses : 6 skip(s)
    - Exec time: [0.0] s

  * igt@syncobj_timeline@multi-wait-available-submitted-signaled:
    - Statuses : 6 skip(s)
    - Exec time: [0.0] s

  * igt@syncobj_timeline@multi-wait-for-submit-available-signaled:
    - Statuses : 6 skip(s)
    - Exec time: [0.0] s

  * igt@syncobj_timeline@multi-wait-for-submit-available-submitted:
    - Statuses : 6 skip(s)
    - Exec time: [0.0] s

  * igt@syncobj_timeline@multi-wait-for-submit-available-submitted-signaled:
    - Statuses : 6 skip(s)
    - Exec time: [0.0] s

  * igt@syncobj_timeline@multi-wait-for-submit-available-unsubmitted-signaled:
    - Statuses : 6 skip(s)
    - Exec time: [0.0] s

  * igt@syncobj_timeline@multi-wait-for-submit-available-unsubmitted-submitted:
    - Statuses : 6 skip(s)
    - Exec time: [0.0] s

  * igt@syncobj_timeline@multi-wait-for-submit-available-unsubmitted-submitted-signaled:
    - Statuses : 6 skip(s)
    - Exec time: [0.0] s

  * igt@syncobj_timeline@multi-wait-for-submit-signaled:
    - Statuses : 6 skip(s)
    - Exec time: [0.0] s

  * igt@syncobj_timeline@multi-wait-for-submit-submitted-signaled:
    - Statuses : 5 skip(s)
    - Exec time: [0.0] s

  * igt@syncobj_timeline@multi-wait-for-submit-unsubmitted-signaled:
    - Statuses : 6 skip(s)
    - Exec time: [0.0] s

  * igt@syncobj_timeline@multi-wait-for-submit-unsubmitted-submitted-signaled:
    - Statuses : 6 skip(s)
    - Exec time: [0.0] s

  * igt@syncobj_timeline@multi-wait-signaled:
    - Statuses : 5 skip(s)
    - Exec time: [0.0] s

  * igt@syncobj_timeline@multi-wait-submitted-signaled:
    - Statuses : 6 skip(s)
    - Exec time: [0.0] s

  * igt@syncobj_timeline@reset-during-wait-for-submit:
    - Statuses : 6 skip(s)
    - Exec time: [0.0] s

  * igt@syncobj_timeline@reset-multiple-signaled:
    - Statuses : 6 skip(s)
    - Exec time: [0.0] s

  * igt@syncobj_timeline@reset-signaled:
    - Statuses : 6 skip(s)
    - Exec time: [0.0] s

  * igt@syncobj_timeline@reset-unsignaled:
    - Statuses : 6 skip(s)
    - Exec time: [0.0] s

  * igt@syncobj_timeline@signal:
    - Statuses : 6 skip(s)
    - Exec time: [0.0] s

  * igt@syncobj_timeline@single-wait-all-available-signaled:
    - Statuses : 5 skip(s)
    - Exec time: [0.0] s

  * igt@syncobj_timeline@single-wait-all-available-submitted:
    - Statuses : 6 skip(s)
    - Exec time: [0.0] s

  * igt@syncobj_timeline@single-wait-all-for-submit-available-signaled:
    - Statuses : 6 skip(s)
    - Exec time: [0.0] s

  * igt@syncobj_timeline@single-wait-all-for-submit-available-submitted:
    - Statuses : 6 skip(s)
    - Exec time: [0.0] s

  * igt@syncobj_timeline@single-wait-all-for-submit-signaled:
    - Statuses : 6 skip(s)
    - Exec time: [0.0] s

  * igt@syncobj_timeline@single-wait-all-signaled:
    - Statuses : 5 skip(s)
    - Exec time: [0.0] s

  * igt@syncobj_timeline@single-wait-available-signaled:
    - Statuses : 5 skip(s)
    - Exec time: [0.0] s

  * igt@syncobj_timeline@single-wait-available-submitted:
    - Statuses : 6 skip(s)
    - Exec time: [0.0] s

  * igt@syncobj_timeline@single-wait-for-submit-available-signaled:
    - Statuses : 5 skip(s)
    - Exec time: [0.0] s

  * igt@syncobj_timeline@single-wait-for-submit-available-submitted:
    - Statuses : 6 skip(s)
    - Exec time: [0.0] s

  * igt@syncobj_timeline@single-wait-for-submit-signaled:
    - Statuses : 6 skip(s)
    - Exec time: [0.0] s

  * igt@syncobj_timeline@single-wait-signaled:
    - Statuses : 6 skip(s)
    - Exec time: [0.0] s

  * igt@syncobj_timeline@wait-all-complex:
    - Statuses : 6 skip(s)
    - Exec time: [0.0] s

  * igt@syncobj_timeline@wait-all-delayed-signal:
    - Statuses : 5 skip(s)
    - Exec time: [0.0] s

  * igt@syncobj_timeline@wait-all-for-submit-complex:
    - Statuses : 4 skip(s)
    - Exec time: [0.0] s

  * igt@syncobj_timeline@wait-all-for-submit-delayed-submit:
    - Statuses : 5 skip(s)
    - Exec time: [0.0] s

  * igt@syncobj_timeline@wait-all-for-submit-snapshot:
    - Statuses : 6 skip(s)
    - Exec time: [0.0] s

  * igt@syncobj_timeline@wait-all-interrupted:
    - Statuses : 6 skip(s)
    - Exec time: [0.0] s

  * igt@syncobj_timeline@wait-all-snapshot:
    - Statuses : 5 skip(s)
    - Exec time: [0.0] s

  * igt@syncobj_timeline@wait-any-complex:
    - Statuses : 6 skip(s)
    - Exec time: [0.0] s

  * igt@syncobj_timeline@wait-any-interrupted:
    - Statuses : 5 skip(s)
    - Exec time: [0.0] s

  * igt@syncobj_timeline@wait-any-snapshot:
    - Statuses : 6 skip(s)
    - Exec time: [0.0] s

  * igt@syncobj_timeline@wait-delayed-signal:
    - Statuses : 6 skip(s)
    - Exec time: [0.0] s

  * igt@syncobj_timeline@wait-for-submit-complex:
    - Statuses : 6 skip(s)
    - Exec time: [0.0] s

  * igt@syncobj_timeline@wait-for-submit-delayed-submit:
    - Statuses : 6 skip(s)
    - Exec time: [0.0] s

  * igt@syncobj_timeline@wait-for-submit-snapshot:
    - Statuses : 6 skip(s)
    - Exec time: [0.0] s

  

Known issues
------------

  Here are the changes found in IGTPW_2991_full that come from known issues:

### IGT changes ###

#### Issues hit ####

  * igt@kms_dp_dsc@basic-dsc-enable-edp:
    - shard-iclb:         [PASS][2] -> [SKIP][3] ([fdo#109349])
   [2]: https://intel-gfx-ci.01.org/tree/drm-tip/IGT_4994/shard-iclb2/igt@kms_dp_dsc@basic-dsc-enable-edp.html
   [3]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_2991/shard-iclb5/igt@kms_dp_dsc@basic-dsc-enable-edp.html

  * igt@kms_flip@flip-vs-expired-vblank-interruptible:
    - shard-glk:          [PASS][4] -> [FAIL][5] ([fdo#105363])
   [4]: https://intel-gfx-ci.01.org/tree/drm-tip/IGT_4994/shard-glk1/igt@kms_flip@flip-vs-expired-vblank-interruptible.html
   [5]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_2991/shard-glk6/igt@kms_flip@flip-vs-expired-vblank-interruptible.html

  * igt@kms_flip@flip-vs-suspend-interruptible:
    - shard-apl:          [PASS][6] -> [DMESG-WARN][7] ([fdo#108566])
   [6]: https://intel-gfx-ci.01.org/tree/drm-tip/IGT_4994/shard-apl3/igt@kms_flip@flip-vs-suspend-interruptible.html
   [7]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_2991/shard-apl5/igt@kms_flip@flip-vs-suspend-interruptible.html

  * igt@kms_frontbuffer_tracking@fbc-1p-primscrn-cur-indfb-draw-blt:
    - shard-iclb:         [PASS][8] -> [FAIL][9] ([fdo#103167]) +8 similar issues
   [8]: https://intel-gfx-ci.01.org/tree/drm-tip/IGT_4994/shard-iclb1/igt@kms_frontbuffer_tracking@fbc-1p-primscrn-cur-indfb-draw-blt.html
   [9]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_2991/shard-iclb8/igt@kms_frontbuffer_tracking@fbc-1p-primscrn-cur-indfb-draw-blt.html

  * igt@kms_psr@psr2_primary_page_flip:
    - shard-iclb:         [PASS][10] -> [SKIP][11] ([fdo#109441]) +1 similar issue
   [10]: https://intel-gfx-ci.01.org/tree/drm-tip/IGT_4994/shard-iclb2/igt@kms_psr@psr2_primary_page_flip.html
   [11]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_2991/shard-iclb1/igt@kms_psr@psr2_primary_page_flip.html

  * igt@kms_vblank@pipe-b-wait-idle-hang:
    - shard-apl:          [PASS][12] -> [INCOMPLETE][13] ([fdo#103927])
   [12]: https://intel-gfx-ci.01.org/tree/drm-tip/IGT_4994/shard-apl2/igt@kms_vblank@pipe-b-wait-idle-hang.html
   [13]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_2991/shard-apl1/igt@kms_vblank@pipe-b-wait-idle-hang.html

  
#### Possible fixes ####

  * igt@kms_flip@plain-flip-fb-recreate-interruptible:
    - shard-glk:          [FAIL][14] ([fdo#100368]) -> [PASS][15]
   [14]: https://intel-gfx-ci.01.org/tree/drm-tip/IGT_4994/shard-glk8/igt@kms_flip@plain-flip-fb-recreate-interruptible.html
   [15]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_2991/shard-glk1/igt@kms_flip@plain-flip-fb-recreate-interruptible.html

  * igt@kms_frontbuffer_tracking@fbcpsr-1p-primscrn-pri-shrfb-draw-render:
    - shard-iclb:         [FAIL][16] ([fdo#103167]) -> [PASS][17] +3 similar issues
   [16]: https://intel-gfx-ci.01.org/tree/drm-tip/IGT_4994/shard-iclb6/igt@kms_frontbuffer_tracking@fbcpsr-1p-primscrn-pri-shrfb-draw-render.html
   [17]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_2991/shard-iclb3/igt@kms_frontbuffer_tracking@fbcpsr-1p-primscrn-pri-shrfb-draw-render.html

  * igt@kms_psr2_su@page_flip:
    - shard-iclb:         [SKIP][18] ([fdo#109642]) -> [PASS][19]
   [18]: https://intel-gfx-ci.01.org/tree/drm-tip/IGT_4994/shard-iclb5/igt@kms_psr2_su@page_flip.html
   [19]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_2991/shard-iclb2/igt@kms_psr2_su@page_flip.html

  * igt@kms_psr@psr2_sprite_mmap_gtt:
    - shard-iclb:         [SKIP][20] ([fdo#109441]) -> [PASS][21] +1 similar issue
   [20]: https://intel-gfx-ci.01.org/tree/drm-tip/IGT_4994/shard-iclb1/igt@kms_psr@psr2_sprite_mmap_gtt.html
   [21]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_2991/shard-iclb2/igt@kms_psr@psr2_sprite_mmap_gtt.html

  * igt@kms_setmode@basic:
    - shard-apl:          [FAIL][22] ([fdo#99912]) -> [PASS][23]
   [22]: https://intel-gfx-ci.01.org/tree/drm-tip/IGT_4994/shard-apl3/igt@kms_setmode@basic.html
   [23]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_2991/shard-apl4/igt@kms_setmode@basic.html
    - shard-kbl:          [FAIL][24] ([fdo#99912]) -> [PASS][25]
   [24]: https://intel-gfx-ci.01.org/tree/drm-tip/IGT_4994/shard-kbl4/igt@kms_setmode@basic.html
   [25]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_2991/shard-kbl2/igt@kms_setmode@basic.html

  * igt@kms_sysfs_edid_timing:
    - shard-iclb:         [FAIL][26] ([fdo#100047]) -> [PASS][27]
   [26]: https://intel-gfx-ci.01.org/tree/drm-tip/IGT_4994/shard-iclb3/igt@kms_sysfs_edid_timing.html
   [27]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_2991/shard-iclb8/igt@kms_sysfs_edid_timing.html

  * igt@kms_vblank@pipe-c-ts-continuation-suspend:
    - shard-apl:          [DMESG-WARN][28] ([fdo#108566]) -> [PASS][29] +7 similar issues
   [28]: https://intel-gfx-ci.01.org/tree/drm-tip/IGT_4994/shard-apl3/igt@kms_vblank@pipe-c-ts-continuation-suspend.html
   [29]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_2991/shard-apl5/igt@kms_vblank@pipe-c-ts-continuation-suspend.html

  * igt@perf_pmu@rc6-runtime-pm-long:
    - shard-apl:          [FAIL][30] ([fdo#105010]) -> [PASS][31]
   [30]: https://intel-gfx-ci.01.org/tree/drm-tip/IGT_4994/shard-apl5/igt@perf_pmu@rc6-runtime-pm-long.html
   [31]: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_2991/shard-apl8/igt@perf_pmu@rc6-runtime-pm-long.html
    - shard-kbl:          [FAIL][32] ([fdo#105010]) -> [PASS][33]
   [32]: https://intel-gfx-ci.01.org/tree/drm-tip/IGT_4994/shard-kbl6/igt@perf_pmu@rc6-runtime-pm-lon

== Logs ==

For more details see: https://intel-gfx-ci.01.org/tree/drm-tip/IGTPW_2991/
_______________________________________________
igt-dev mailing list
igt-dev@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/igt-dev

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

* Re: [igt-dev] [PATCH i-g-t 4/5] igt: add timeline test cases
  2019-05-16 14:39 ` [igt-dev] [PATCH i-g-t 4/5] igt: add timeline test cases Lionel Landwerlin
@ 2019-05-16 20:03   ` Chris Wilson
  2019-05-17 16:39     ` Lionel Landwerlin
  0 siblings, 1 reply; 10+ messages in thread
From: Chris Wilson @ 2019-05-16 20:03 UTC (permalink / raw)
  To: Lionel Landwerlin, igt-dev; +Cc: Chunming Zhou

Quoting Lionel Landwerlin (2019-05-16 15:39:49)
> +static int
> +__syncobj_timeline_signal(int fd, uint32_t *handles, uint64_t *points, uint32_t count)
> +{
> +       struct drm_syncobj_timeline_array array = { 0 };

Note you can use the gcc {} extension here.

> +       int err = 0;
> +
> +       array.handles = to_user_pointer(handles);
> +       array.points = to_user_pointer(points);
> +       array.count_handles = count;
> +       if (drmIoctl(fd, DRM_IOCTL_SYNCOBJ_TIMELINE_SIGNAL, &array))
> +               err = -errno;

Clear errno afterwards, it just gets left around and messes up assert
strings.

Use igt_assume(err) otherwise Petri will have to silence coverity later.

Use igt_ioctl() instead of drmIoctl() so that we can replace the 
drmIoctl() with the fancy error/signal injection wrappers or whatever
takes our fancy later.
-Chris
_______________________________________________
igt-dev mailing list
igt-dev@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/igt-dev

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

* Re: [igt-dev] [PATCH i-g-t 4/5] igt: add timeline test cases
  2019-05-16 20:03   ` Chris Wilson
@ 2019-05-17 16:39     ` Lionel Landwerlin
  0 siblings, 0 replies; 10+ messages in thread
From: Lionel Landwerlin @ 2019-05-17 16:39 UTC (permalink / raw)
  To: Chris Wilson, igt-dev; +Cc: Chunming Zhou

On 16/05/2019 21:03, Chris Wilson wrote:
> Quoting Lionel Landwerlin (2019-05-16 15:39:49)
>> +static int
>> +__syncobj_timeline_signal(int fd, uint32_t *handles, uint64_t *points, uint32_t count)
>> +{
>> +       struct drm_syncobj_timeline_array array = { 0 };
> Note you can use the gcc {} extension here.
>
>> +       int err = 0;
>> +
>> +       array.handles = to_user_pointer(handles);
>> +       array.points = to_user_pointer(points);
>> +       array.count_handles = count;
>> +       if (drmIoctl(fd, DRM_IOCTL_SYNCOBJ_TIMELINE_SIGNAL, &array))
>> +               err = -errno;
> Clear errno afterwards, it just gets left around and messes up assert
> strings.
>
> Use igt_assume(err) otherwise Petri will have to silence coverity later.
>
> Use igt_ioctl() instead of drmIoctl() so that we can replace the
> drmIoctl() with the fancy error/signal injection wrappers or whatever
> takes our fancy later.
> -Chris
>
Thanks,

Applied the changes locally, will resend next week just in case more 
comments appear.


-Lionel

_______________________________________________
igt-dev mailing list
igt-dev@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/igt-dev

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

end of thread, other threads:[~2019-05-17 16:39 UTC | newest]

Thread overview: 10+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2019-05-16 14:39 [igt-dev] [PATCH i-g-t 0/5] tests: Add timeline syncobj tests Lionel Landwerlin
2019-05-16 14:39 ` [igt-dev] [PATCH i-g-t 1/5] lib/syncobj: fix comment typo Lionel Landwerlin
2019-05-16 14:39 ` [igt-dev] [PATCH i-g-t 2/5] include: bump drm headers Lionel Landwerlin
2019-05-16 14:39 ` [igt-dev] [PATCH i-g-t 3/5] lib/syncobj: drop local declarations Lionel Landwerlin
2019-05-16 14:39 ` [igt-dev] [PATCH i-g-t 4/5] igt: add timeline test cases Lionel Landwerlin
2019-05-16 20:03   ` Chris Wilson
2019-05-17 16:39     ` Lionel Landwerlin
2019-05-16 14:39 ` [igt-dev] [PATCH i-g-t 5/5] tests/syncobj_timeline: add more timeline tests Lionel Landwerlin
2019-05-16 15:12 ` [igt-dev] ✓ Fi.CI.BAT: success for tests: Add timeline syncobj tests Patchwork
2019-05-16 19:50 ` [igt-dev] ✓ Fi.CI.IGT: " Patchwork

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.