From 8ee2dea687224e1e5759783abf5046d298bbe167 Mon Sep 17 00:00:00 2001 From: Stephen Boyd Date: Mon, 26 Apr 2021 08:12:51 -0700 Subject: sys/linux: support syncobjs in dev_msm (#2552) * sys/linux: support syncobjs in dev_msm * sys/linux: describe syncpoints and dma fences for dev_dri --- sys/linux/dev_dri.txt | 105 ++++++++++++++++++++++++++++++++++---------- sys/linux/dev_dri.txt.const | 17 +++++++ sys/linux/dev_msm.txt | 7 +-- 3 files changed, 99 insertions(+), 30 deletions(-) (limited to 'sys/linux') diff --git a/sys/linux/dev_dri.txt b/sys/linux/dev_dri.txt index 6e30f9e97..823f720aa 100644 --- a/sys/linux/dev_dri.txt +++ b/sys/linux/dev_dri.txt @@ -359,30 +359,82 @@ drm_mode_atomic { drm_mode_atomic_flags = DRM_MODE_PAGE_FLIP_EVENT, DRM_MODE_ATOMIC_TEST_ONLY, DRM_MODE_ATOMIC_NONBLOCK, DRM_MODE_ATOMIC_ALLOW_MODESET -# TODO: describe SYNCOBJ ioctls (but we don't have any DRIVER_SYNCOBJ hardware). -#resource drm_syncobj[int32] - -#ioctl$DRM_IOCTL_SYNCOBJ_CREATE(fd fd_dri, cmd const[DRM_IOCTL_SYNCOBJ_CREATE], arg ptr[in, drm_syncobj_create]) -#ioctl$DRM_IOCTL_SYNCOBJ_DESTROY(fd fd_dri, cmd const[DRM_IOCTL_SYNCOBJ_DESTROY], arg ptr[in, drm_syncobj_destroy]) -#ioctl$DRM_IOCTL_SYNCOBJ_HANDLE_TO_FD(fd fd_dri, cmd const[DRM_IOCTL_SYNCOBJ_HANDLE_TO_FD], arg ptr[in, XXXXX]) -#ioctl$DRM_IOCTL_SYNCOBJ_FD_TO_HANDLE(fd fd_dri, cmd const[DRM_IOCTL_SYNCOBJ_FD_TO_HANDLE], arg ptr[in, XXXXX]) -#ioctl$DRM_IOCTL_SYNCOBJ_TRANSFER(fd fd_dri, cmd const[DRM_IOCTL_SYNCOBJ_TRANSFER], arg ptr[in, XXXXX]) -#ioctl$DRM_IOCTL_SYNCOBJ_WAIT(fd fd_dri, cmd const[DRM_IOCTL_SYNCOBJ_WAIT], arg ptr[in, XXXXX]) -#ioctl$DRM_IOCTL_SYNCOBJ_TIMELINE_WAIT(fd fd_dri, cmd const[DRM_IOCTL_SYNCOBJ_TIMELINE_WAIT], arg ptr[in, XXXXX]) -#ioctl$DRM_IOCTL_SYNCOBJ_RESET(fd fd_dri, cmd const[DRM_IOCTL_SYNCOBJ_RESET], arg ptr[in, XXXXX]) -#ioctl$DRM_IOCTL_SYNCOBJ_SIGNAL(fd fd_dri, cmd const[DRM_IOCTL_SYNCOBJ_SIGNAL], arg ptr[in, XXXXX]) -#ioctl$DRM_IOCTL_SYNCOBJ_TIMELINE_SIGNAL(fd fd_dri, cmd const[DRM_IOCTL_SYNCOBJ_TIMELINE_SIGNAL], arg ptr[in, XXXXX]) -#ioctl$DRM_IOCTL_SYNCOBJ_QUERY(fd fd_dri, cmd const[DRM_IOCTL_SYNCOBJ_QUERY], arg ptr[in, XXXXX]) - -#drm_syncobj_create { -# handle drm_syncobj[opt] -# flags bool32 -#} - -#drm_syncobj_destroy { -# handle drm_syncobj -# pad const[0, int32] -#} +resource drm_syncobj_fd[fd] +resource drm_syncobj[int32] +resource drm_syncpoint[int64] + +# See https://www.kernel.org/doc/html/latest/gpu/drm-mm.html#drm-sync-objects +# for more details +ioctl$DRM_IOCTL_SYNCOBJ_CREATE(fd fd_dri, cmd const[DRM_IOCTL_SYNCOBJ_CREATE], arg ptr[inout, drm_syncobj_create]) +ioctl$DRM_IOCTL_SYNCOBJ_DESTROY(fd fd_dri, cmd const[DRM_IOCTL_SYNCOBJ_DESTROY], arg ptr[inout, drm_syncobj_destroy]) +ioctl$DRM_IOCTL_SYNCOBJ_HANDLE_TO_FD(fd fd_dri, cmd const[DRM_IOCTL_SYNCOBJ_HANDLE_TO_FD], arg ptr[inout, drm_syncobj_handle]) +ioctl$DRM_IOCTL_SYNCOBJ_FD_TO_HANDLE(fd fd_dri, cmd const[DRM_IOCTL_SYNCOBJ_FD_TO_HANDLE], arg ptr[inout, drm_syncobj_handle]) +ioctl$DRM_IOCTL_SYNCOBJ_TRANSFER(fd fd_dri, cmd const[DRM_IOCTL_SYNCOBJ_TRANSFER], arg ptr[inout, drm_syncobj_transfer]) +ioctl$DRM_IOCTL_SYNCOBJ_WAIT(fd fd_dri, cmd const[DRM_IOCTL_SYNCOBJ_WAIT], arg ptr[inout, drm_syncobj_wait]) +ioctl$DRM_IOCTL_SYNCOBJ_TIMELINE_WAIT(fd fd_dri, cmd const[DRM_IOCTL_SYNCOBJ_TIMELINE_WAIT], arg ptr[inout, drm_syncobj_timeline_wait]) +ioctl$DRM_IOCTL_SYNCOBJ_RESET(fd fd_dri, cmd const[DRM_IOCTL_SYNCOBJ_RESET], arg ptr[in, drm_syncobj_array]) +ioctl$DRM_IOCTL_SYNCOBJ_SIGNAL(fd fd_dri, cmd const[DRM_IOCTL_SYNCOBJ_SIGNAL], arg ptr[in, drm_syncobj_array]) +ioctl$DRM_IOCTL_SYNCOBJ_TIMELINE_SIGNAL(fd fd_dri, cmd const[DRM_IOCTL_SYNCOBJ_TIMELINE_SIGNAL], arg ptr[in, drm_syncobj_timeline_array]) +ioctl$DRM_IOCTL_SYNCOBJ_QUERY(fd fd_dri, cmd const[DRM_IOCTL_SYNCOBJ_QUERY], arg ptr[inout, drm_syncobj_timeline_array]) + +drm_syncobj_create { + handle drm_syncobj[opt] + flags flags[drm_syncobj_create_flags, int32] +} + +drm_syncobj_destroy { + handle drm_syncobj + pad const[0, int32] +} + +drm_syncobj_handle { + handle drm_syncobj[opt] + flags flags[drm_syncobj_handle_flags, int32] + + fd drm_syncobj_fd[opt] + pad const[0, int32] +} + +drm_syncobj_transfer { + src_handle drm_syncobj (in) + dst_handle drm_syncobj (in) + src_point drm_syncpoint[opt] + dst_point drm_syncpoint[opt] + flags flags[drm_syncobj_wait_flags, int32] (in) + pad const[0, int32] +} + +drm_syncobj_wait { + handles ptr64[in, array[drm_syncobj]] + timeout_nsec int64 (in) + count_handles len[handles, int32] + flags flags[drm_syncobj_wait_flags, int32] (in) + first_signaled drm_syncpoint (out) + pad const[0, int32] +} + +drm_syncobj_timeline_wait { + handles ptr64[in, array[drm_syncobj]] + points ptr64[in, array[drm_syncpoint]] + timeout_nsec int64 + count_handles len[handles, int32] + flags flags[drm_syncobj_wait_flags, int32] (in) + first_signaled drm_syncpoint (out) + pad const[0, int32] +} + +drm_syncobj_array { + handles ptr64[in, array[drm_syncobj]] + count_handles len[handles, int32] + pad const[0, int32] +} + +drm_syncobj_timeline_array { + handles ptr64[in, array[drm_syncobj]] + points ptr64[inout, array[drm_syncpoint]] + count_handles len[handles, int32] + flags flags[drm_syncobj_query_flags, int32] (in) +} # TODO: describe SEQUENCE ioctls (but we don't have DRIVER_MODESET hardware). #ioctl$DRM_IOCTL_CRTC_GET_SEQUENCE(fd fd_dri, cmd const[DRM_IOCTL_CRTC_GET_SEQUENCE], arg ptr[in, XXXXX]) @@ -686,3 +738,8 @@ drm_buf_flags = _DRM_PAGE_ALIGN, _DRM_AGP_BUFFER, _DRM_SG_BUFFER, _DRM_FB_BUFFER drm_dma_flags = _DRM_DMA_BLOCK, _DRM_DMA_WHILE_LOCKED, _DRM_DMA_PRIORITY, _DRM_DMA_WAIT, _DRM_DMA_SMALLER_OK, _DRM_DMA_LARGER_OK drm_control_type = DRM_ADD_COMMAND, DRM_RM_COMMAND, DRM_INST_HANDLER, DRM_UNINST_HANDLER drm_vblank_seq_type = _DRM_VBLANK_ABSOLUTE, _DRM_VBLANK_RELATIVE, _DRM_VBLANK_HIGH_CRTC_MASK, _DRM_VBLANK_EVENT, _DRM_VBLANK_FLIP, _DRM_VBLANK_NEXTONMISS, _DRM_VBLANK_SECONDARY, _DRM_VBLANK_SIGNAL +drm_syncobj_create_flags = DRM_SYNCOBJ_CREATE_SIGNALED +# DRM_SYNCOBJ_HANDLE_TO_FD_FLAGS_EXPORT_SYNC_FILE is the same so we just use one +drm_syncobj_handle_flags = DRM_SYNCOBJ_FD_TO_HANDLE_FLAGS_IMPORT_SYNC_FILE +drm_syncobj_wait_flags = DRM_SYNCOBJ_WAIT_FLAGS_WAIT_ALL, DRM_SYNCOBJ_WAIT_FLAGS_WAIT_FOR_SUBMIT, DRM_SYNCOBJ_WAIT_FLAGS_WAIT_AVAILABLE +drm_syncobj_query_flags = DRM_SYNCOBJ_QUERY_FLAGS_LAST_SUBMITTED diff --git a/sys/linux/dev_dri.txt.const b/sys/linux/dev_dri.txt.const index f023750f9..c94550379 100644 --- a/sys/linux/dev_dri.txt.const +++ b/sys/linux/dev_dri.txt.const @@ -100,6 +100,17 @@ DRM_IOCTL_SET_VERSION = 3222299655 DRM_IOCTL_SG_ALLOC = 3222299704, 386:arm:3221775416 DRM_IOCTL_SG_FREE = 1074816057, 386:arm:1074291769, mips64le:ppc64le:2148557881 DRM_IOCTL_SWITCH_CTX = 1074291748, mips64le:ppc64le:2148033572 +DRM_IOCTL_SYNCOBJ_CREATE = 3221775551 +DRM_IOCTL_SYNCOBJ_DESTROY = 3221775552 +DRM_IOCTL_SYNCOBJ_FD_TO_HANDLE = 3222299842 +DRM_IOCTL_SYNCOBJ_HANDLE_TO_FD = 3222299841 +DRM_IOCTL_SYNCOBJ_QUERY = 3222824139 +DRM_IOCTL_SYNCOBJ_RESET = 3222299844 +DRM_IOCTL_SYNCOBJ_SIGNAL = 3222299845 +DRM_IOCTL_SYNCOBJ_TIMELINE_SIGNAL = 3222824141 +DRM_IOCTL_SYNCOBJ_TIMELINE_WAIT = 3223872714 +DRM_IOCTL_SYNCOBJ_TRANSFER = 3223348428 +DRM_IOCTL_SYNCOBJ_WAIT = 3223348419 DRM_IOCTL_UNLOCK = 1074291755, mips64le:ppc64le:2148033579 DRM_IOCTL_VERSION = 3225445376, 386:arm:3223610368 DRM_IOCTL_WAIT_VBLANK = 3222823994, 386:arm:3222299706 @@ -129,6 +140,12 @@ DRM_PRIME_CAP_EXPORT = 2 DRM_PRIME_CAP_IMPORT = 1 DRM_PROP_NAME_LEN = 32 DRM_RM_COMMAND = 1 +DRM_SYNCOBJ_CREATE_SIGNALED = 1 +DRM_SYNCOBJ_FD_TO_HANDLE_FLAGS_IMPORT_SYNC_FILE = 1 +DRM_SYNCOBJ_QUERY_FLAGS_LAST_SUBMITTED = 1 +DRM_SYNCOBJ_WAIT_FLAGS_WAIT_ALL = 1 +DRM_SYNCOBJ_WAIT_FLAGS_WAIT_AVAILABLE = 4 +DRM_SYNCOBJ_WAIT_FLAGS_WAIT_FOR_SUBMIT = 2 DRM_UNINST_HANDLER = 3 O_CLOEXEC = 524288 O_NONBLOCK = 2048, mips64le:128 diff --git a/sys/linux/dev_msm.txt b/sys/linux/dev_msm.txt index 7c94b95ff..9fba66a5f 100644 --- a/sys/linux/dev_msm.txt +++ b/sys/linux/dev_msm.txt @@ -31,11 +31,6 @@ ioctl$DRM_IOCTL_MSM_SUBMITQUEUE_QUERY(fd fd_msm, cmd const[DRM_IOCTL_MSM_SUBMITQ mmap$DRM_MSM(addr vma, len len[addr], prot flags[mmap_prot], flags flags[mmap_flags], fd fd_msm, offset fileoff) _ = __NR_mmap2 -# This should be a resource for drm_syncobjs created by ioctls in -# include/uapi/drm/drm.h, described in sys/linux/dev_dri.txt, but we need to -# describe those ioctls first. Rename this to drm_syncobj then -type drm_syncobj_handle int32 - drm_msm_gem_new { size int64 flags flags[msm_gem_new_flags, int32] @@ -96,7 +91,7 @@ drm_msm_gem_submit_bo { } drm_msm_gem_submit_syncobj { - handle drm_syncobj_handle + handle drm_syncobj flags flags[msm_gem_submit_syncobj_flags, int32] point int64 } -- cgit mrf-deployment