new syncobj extension v3
Subsystems (3)
PATCH 1/8 new syncobj extension v3
v2: drop not implemented IOCTLs and flags
v3: add transfer/signal ioctls
--- include/drm/drm.h | 35 +++++++++++++++++++++++++++++++++++ 1 file changed, 35 insertions(+)
include/drm/drm.h +35 -0
@@ -729,8 +729,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)struct drm_syncobj_wait {__u64 handles;/* absolute timeout */
@@ -741,12 +751,31 @@ 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 +932,12 @@ 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.
Signature · 6 lines
2.17.1 _______________________________________________ Intel-gfx mailing list [email protected] https://lists.freedesktop.org/mailman/listinfo/intel-gfx
A message that is not in the archive (sent off-list or not yet received): [email protected]
PATCH 2/8 addr cs chunk for syncobj timeline
--- include/drm/amdgpu_drm.h | 9 +++++++++ 1 file changed, 9 insertions(+)
include/drm/amdgpu_drm.h +9 -0
@@ -517,6 +517,8 @@ 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_SYNCOBJ_TIMELINE_WAIT 0x07 +#define AMDGPU_CHUNK_ID_SYNCOBJ_TIMELINE_SIGNAL 0x08struct drm_amdgpu_cs_chunk {__u32 chunk_id;
@@ -592,6 +594,13 @@ 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
Signature · 6 lines
2.17.1 _______________________________________________ amd-gfx mailing list [email protected] https://lists.freedesktop.org/mailman/listinfo/amd-gfx
PATCH 4/8 wrap syncobj timeline query/wait APIs for amdgpu v3
In reply to a message not in the archivev2: symbos are stored in lexical order.
v3: drop export/import and extra query indirection
--- amdgpu/amdgpu-symbol-check | 2 ++ amdgpu/amdgpu.h | 39 ++++++++++++++++++++++++++++++++++++++ amdgpu/amdgpu_cs.c | 23 ++++++++++++++++++++++ 3 files changed, 64 insertions(+)
amdgpu/amdgpu-symbol-check +2 -0
@@ -49,8 +49,10 @@ amdgpu_cs_submit amdgpu_cs_submit_raw amdgpu_cs_syncobj_export_sync_file amdgpu_cs_syncobj_import_sync_file +amdgpu_cs_syncobj_query amdgpu_cs_syncobj_reset amdgpu_cs_syncobj_signal +amdgpu_cs_syncobj_timeline_wait amdgpu_cs_syncobj_wait amdgpu_cs_wait_fences amdgpu_cs_wait_semaphore
amdgpu/amdgpu.h +39 -0
@@ -1489,6 +1489,45 @@ int amdgpu_cs_syncobj_wait(amdgpu_device_handle dev, int64_t timeout_nsec, unsigned flags, uint32_t *first_signaled); +/** +* Wait for one or all sync objects on their points to signal. +* +* \param dev - \c [in] self-explanatory +* \param handles - \c [in] array of sync object handles +* \param points - \c [in] array of sync points to wait +* \param num_handles - \c [in] self-explanatory +* \param timeout_nsec - \c [in] self-explanatory +* \param flags - \c [in] a bitmask of DRM_SYNCOBJ_WAIT_FLAGS_* +* \param first_signaled - \c [in] self-explanatory +* +* \return 0 on success\n +* -ETIME - Timeout +* <0 - Negative POSIX Error code +* +*/ +int amdgpu_cs_syncobj_timeline_wait (amdgpu_device_handle dev, +uint32_t *handles,uint64_t *points, +unsigned num_handles, +int64_t timeout_nsec,unsigned flags, +uint32_t *first_signaled); +/** +* Query sync objects payloads. +* +* \param dev - \c [in] self-explanatory +* \param handles - \c [in] array of sync object handles +* \param points - \c [out] array of sync points returned, which presents +* syncobj payload. +* \param num_handles - \c [in] self-explanatory +* +* \return 0 on success\n +* -ETIME - Timeout +* <0 - Negative POSIX Error code +* +*/ +int amdgpu_cs_syncobj_query (amdgpu_device_handle dev, +uint32_t *handles,uint64_t *points, +unsigned num_handles); +/** * Export kernel sync object to shareable fd. *
amdgpu/amdgpu_cs.c +23 -0
@@ -661,6 +661,29 @@ drm_public int amdgpu_cs_syncobj_wait(amdgpu_device_handle dev, flags, first_signaled); } +drm_public int amdgpu_cs_syncobj_timeline_wait(amdgpu_device_handle dev, +uint32_t *handles,uint64_t *points, +unsigned num_handles, +int64_t timeout_nsec,unsigned flags, +uint32_t *first_signaled) +{ +if (NULL == dev) +return -EINVAL ; + +return drmSyncobjTimelineWait (dev->fd, handles, points, num_handles, + timeout_nsec, flags, first_signaled); +} + +drm_public int amdgpu_cs_syncobj_query(amdgpu_device_handle dev, +uint32_t *handles,uint64_t *points, +unsigned num_handles) +{ +if (NULL == dev) +return -EINVAL ; + +return drmSyncobjQuery (dev->fd, handles, points, num_handles); +} + drm_public int amdgpu_cs_export_syncobj(amdgpu_device_handle dev,uint32_t handle,int *shared_fd)
Signature · 6 lines
2.17.1 _______________________________________________ amd-gfx mailing list [email protected] https://lists.freedesktop.org/mailman/listinfo/amd-gfx
PATCH 5/8 add timeline signal/transfer ioctls v2
In reply to a message not in the archivev2: use one transfer ioctl
--- xf86drm.c | 33 +++++++++++++++++++++++++++++++++ xf86drm.h | 6 ++++++ 2 files changed, 39 insertions(+)
xf86drm.c +33 -0
@@ -4278,6 +4278,21 @@ drm_public int drmSyncobjSignal(int fd, const uint32_t *handles,return ret; } +drm_public int drmSyncobjTimelineSignal(int fd, const uint32_t *handles, +uint64_t *points,uint32_t handle_count) +{ +struct drm_syncobj_timeline_array args; +int ret; + +memclear (args); + args.handles = (uintptr_t )handles; + args.points = (uint64_t )(uintptr_t )points; + args.count_handles = handle_count; + + ret =drmIoctl (fd,DRM_IOCTL_SYNCOBJ_TIMELINE_SIGNAL , &args); +return ret; +} + drm_public int drmSyncobjTimelineWait(int fd, uint32_t *handles, uint64_t *points, unsigned num_handles, int64_t timeout_nsec, unsigned flags,
@@ -4320,4 +4335,22 @@ drm_public int drmSyncobjQuery(int fd, uint32_t *handles, uint64_t *points,return 0 ; } +drm_public int drmSyncobjTransfer(int fd, +uint32_t dst_handle,uint64_t dst_point, +uint32_t src_handle,uint64_t src_point, +uint32_t flags) +{ +struct drm_syncobj_transfer args; +int ret; + +memclear (args); + args.src_handle = src_handle; + args.dst_handle = dst_handle; + args.src_point = src_point; + args.dst_point = dst_point; + args.flags = flags; + + ret =drmIoctl (fd,DRM_IOCTL_SYNCOBJ_TRANSFER , &args); +return ret; +}
xf86drm.h +6 -0
@@ -875,12 +875,18 @@ extern int drmSyncobjWait(int fd, uint32_t *handles, unsigned num_handles, uint32_t *first_signaled);extern int drmSyncobjReset (int fd,const uint32_t *handles,uint32_t handle_count);extern int drmSyncobjSignal (int fd,const uint32_t *handles,uint32_t handle_count); +extern int drmSyncobjTimelineSignal (int fd,const uint32_t *handles, +uint64_t *points,uint32_t handle_count);extern int drmSyncobjTimelineWait (int fd,uint32_t *handles,uint64_t *points,unsigned num_handles,int64_t timeout_nsec,unsigned flags,uint32_t *first_signaled);extern int drmSyncobjQuery (int fd,uint32_t *handles,uint64_t *points,uint32_t handle_count); +extern int drmSyncobjTransfer (int fd, +uint32_t dst_handle,uint64_t dst_point, +uint32_t src_handle,uint64_t src_point, +uint32_t flags);#if defined(__cplusplus) }
Signature · 6 lines
2.17.1 _______________________________________________ amd-gfx mailing list [email protected] https://lists.freedesktop.org/mailman/listinfo/amd-gfx
PATCH 6/8 expose timeline signal/export/import interfaces v2
In reply to a message not in the archivev2: adapt to new one transfer ioctl
--- amdgpu/amdgpu-symbol-check | 3 ++ amdgpu/amdgpu.h | 51 ++++++++++++++++++++++++++++ amdgpu/amdgpu_cs.c | 68 ++++++++++++++++++++++++++++++++++++++ 3 files changed, 122 insertions(+)
amdgpu/amdgpu-symbol-check +3 -0
@@ -48,10 +48,13 @@ amdgpu_cs_signal_semaphore amdgpu_cs_submit amdgpu_cs_submit_raw amdgpu_cs_syncobj_export_sync_file +amdgpu_cs_syncobj_export_sync_file2 amdgpu_cs_syncobj_import_sync_file +amdgpu_cs_syncobj_import_sync_file2 amdgpu_cs_syncobj_query amdgpu_cs_syncobj_reset amdgpu_cs_syncobj_signal +amdgpu_cs_syncobj_timeline_signal amdgpu_cs_syncobj_timeline_wait amdgpu_cs_syncobj_wait amdgpu_cs_wait_fences
amdgpu/amdgpu.h +51 -0
64 lines not on this page · raw message
amdgpu/amdgpu_cs.c +68 -0
80 lines not on this page · raw message
Signature · 6 lines
2.17.1 _______________________________________________ amd-gfx mailing list [email protected] https://lists.freedesktop.org/mailman/listinfo/amd-gfx
PATCH 8/8 add syncobj timeline tests v3
In reply to a message not in the archivev2: drop DRM_SYNCOBJ_CREATE_TYPE_TIMELINE, fix timeout calculation,
fix some warnings
v3: add export/import and cpu signal testing cases
--- tests/amdgpu/Makefile.am | 3 +- tests/amdgpu/amdgpu_test.c | 12 ++ tests/amdgpu/amdgpu_test.h | 21 +++ tests/amdgpu/meson.build | 2 +- tests/amdgpu/syncobj_tests.c | 290 +++++++++++++++++++++++++++++++++++ 5 files changed, 326 insertions(+), 2 deletions(-) create mode 100644 tests/amdgpu/syncobj_tests.c
tests/amdgpu/Makefile.am +2 -1
@@ -33,4 +33,5 @@ amdgpu_test_SOURCES = \ vcn_tests.c \ uve_ib.h \ deadlock_tests.c \ - vm_tests.c + vm_tests.c \ + syncobj_tests.c
tests/amdgpu/amdgpu_test.c +12 -0
@@ -56,6 +56,7 @@#define UVD_ENC_TESTS_STR "UVD ENC Tests"#define DEADLOCK_TESTS_STR "Deadlock Tests"#define VM_TESTS_STR "VM Tests" +#define SYNCOBJ_TIMELINE_TESTS_STR "SYNCOBJ TIMELINE Tests"/** * Open handles for amdgpu devices
@@ -116,6 +117,12 @@ static CU_SuiteInfo suites[] = { .pCleanupFunc = suite_vm_tests_clean, .pTests = vm_tests, }, + { + .pName = SYNCOBJ_TIMELINE_TESTS_STR, + .pInitFunc = suite_syncobj_timeline_tests_init, + .pCleanupFunc = suite_syncobj_timeline_tests_clean, + .pTests = syncobj_timeline_tests, + }, CU_SUITE_INFO_NULL, };
@@ -165,6 +172,11 @@ static Suites_Active_Status suites_active_stat[] = { .pName = VM_TESTS_STR, .pActive = suite_vm_tests_enable, }, + { + .pName = SYNCOBJ_TIMELINE_TESTS_STR, + .pActive = suite_syncobj_timeline_tests_enable, + }, + };
tests/amdgpu/amdgpu_test.h +21 -0
@@ -194,6 +194,27 @@ CU_BOOL suite_vm_tests_enable(void);*/ extern CU_TestInfo vm_tests[]; +/** +* Initialize syncobj timeline test suite +*/ +int suite_syncobj_timeline_tests_init (); + +/** +* Deinitialize syncobj timeline test suite +*/ +int suite_syncobj_timeline_tests_clean (); + +/** +* Decide if the suite is enabled by default or not. +*/ +CU_BOOL suite_syncobj_timeline_tests_enable (void ); + +/** +* Tests in syncobj timeline test suite +*/ +extern CU_TestInfo syncobj_timeline_tests[]; + +/** * Helper functions */
tests/amdgpu/meson.build +1 -1
@@ -24,7 +24,7 @@ if dep_cunit.found() files( 'amdgpu_test.c', 'basic_tests.c', 'bo_tests.c', 'cs_tests.c', 'vce_tests.c', 'uvd_enc_tests.c', 'vcn_tests.c', 'deadlock_tests.c', - 'vm_tests.c', + 'vm_tests.c', 'syncobj_tests.c', ), dependencies : [dep_cunit, dep_threads], include_directories : [inc_root, inc_drm, include_directories('../../amdgpu')],
tests/amdgpu/syncobj_tests.c new file +290 -0
290 lines not on this page · raw message
Signature · 6 lines
2.17.1 _______________________________________________ amd-gfx mailing list [email protected] https://lists.freedesktop.org/mailman/listinfo/amd-gfx
PATCH 3/8 add timeline wait/query ioctl v2
In reply to Chunming Zhouv2: drop export/import
--- xf86drm.c | 44 ++++++++++++++++++++++++++++++++++++++++++++ xf86drm.h | 6 ++++++ 2 files changed, 50 insertions(+)
xf86drm.c +44 -0
@@ -4277,3 +4277,47 @@ drm_public int drmSyncobjSignal(int fd, const uint32_t *handles, ret =drmIoctl (fd,DRM_IOCTL_SYNCOBJ_SIGNAL , &args);return ret; } + +drm_public int drmSyncobjTimelineWait(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; + +memclear (args); + args.handles = (uintptr_t )handles; + args.points = (uint64_t )(uintptr_t )points; + args.timeout_nsec = timeout_nsec; + args.count_handles = num_handles; + args.flags = flags; + + ret =drmIoctl (fd,DRM_IOCTL_SYNCOBJ_TIMELINE_WAIT , &args); +if (ret <0 ) +return -errno; + +if (first_signaled) + *first_signaled = args.first_signaled; +return ret; +} + + +drm_public int drmSyncobjQuery(int fd, uint32_t *handles, uint64_t *points, +uint32_t handle_count) +{ +struct drm_syncobj_timeline_array args; +int ret; + +memclear (args); + args.handles = (uintptr_t )handles; + args.points = (uint64_t )(uintptr_t )points; + args.count_handles = handle_count; + + ret =drmIoctl (fd,DRM_IOCTL_SYNCOBJ_QUERY , &args); +if (ret) +return ret; +return 0 ; +} + +
xf86drm.h +6 -0
@@ -875,6 +875,12 @@ extern int drmSyncobjWait(int fd, uint32_t *handles, unsigned num_handles, uint32_t *first_signaled);extern int drmSyncobjReset (int fd,const uint32_t *handles,uint32_t handle_count);extern int drmSyncobjSignal (int fd,const uint32_t *handles,uint32_t handle_count); +extern int drmSyncobjTimelineWait (int fd,uint32_t *handles,uint64_t *points, +unsigned num_handles, +int64_t timeout_nsec,unsigned flags, +uint32_t *first_signaled); +extern int drmSyncobjQuery (int fd,uint32_t *handles,uint64_t *points, +uint32_t handle_count);#if defined(__cplusplus) }
Signature · 6 lines
2.17.1 _______________________________________________ Intel-gfx mailing list [email protected] https://lists.freedesktop.org/mailman/listinfo/intel-gfx
PATCH 7/8 wrap transfer interfaces
In reply to Chunming Zhou--- amdgpu/amdgpu.h | 22 ++++++++++++++++++++++ amdgpu/amdgpu_cs.c | 16 ++++++++++++++++ 2 files changed, 38 insertions(+)
amdgpu/amdgpu.h +22 -0
@@ -1638,6 +1638,28 @@ int amdgpu_cs_syncobj_import_sync_file2(amdgpu_device_handle dev,uint32_t syncobj, uint64_t point, int sync_file_fd); + +/** +* transfer between syncbojs. +* +* \param dev - \c [in] device handle +* \param dst_handle - \c [in] sync object handle +* \param dst_point - \c [in] timeline point, 0 presents dst is binary +* \param src_handle - \c [in] sync object handle +* \param src_point - \c [in] timeline point, 0 presents src is binary +* \param flags - \c [in] flags +* +* \return 0 on success\n +* <0 - Negative POSIX Error code +* +*/ +int amdgpu_cs_syncobj_transfer (amdgpu_device_handle dev, +uint32_t dst_handle, +uint64_t dst_point, +uint32_t src_handle, +uint64_t src_point, +uint32_t flags); +/** * Export an amdgpu fence as a handle (syncobj or fd). *
amdgpu/amdgpu_cs.c +16 -0
@@ -792,6 +792,22 @@ out:return ret; } +drm_public int amdgpu_cs_syncobj_transfer(amdgpu_device_handle dev, +uint32_t dst_handle, +uint64_t dst_point, +uint32_t src_handle, +uint64_t src_point, +uint32_t flags) +{ +if (NULL == dev) +return -EINVAL ; + +return drmSyncobjTransfer (dev->fd, + dst_handle, dst_point, + src_handle, src_point, + flags); +} + drm_public int amdgpu_cs_submit_raw(amdgpu_device_handle dev, amdgpu_context_handle context, amdgpu_bo_list_handle bo_list_handle,
Signature · 6 lines
2.17.1 _______________________________________________ dri-devel mailing list [email protected] https://lists.freedesktop.org/mailman/listinfo/dri-devel