aboutsummaryrefslogtreecommitdiffstats
path: root/sys/linux
diff options
context:
space:
mode:
authorStephen Boyd <swboyd@chromium.org>2021-04-26 08:12:51 -0700
committerGitHub <noreply@github.com>2021-04-26 08:12:51 -0700
commit8ee2dea687224e1e5759783abf5046d298bbe167 (patch)
tree1f11e6308fecfe0b55045354e99075030a66e9cb /sys/linux
parente60b7df17cbe2ad01e7f75b3e515bf0e26c56edb (diff)
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
Diffstat (limited to 'sys/linux')
-rw-r--r--sys/linux/dev_dri.txt105
-rw-r--r--sys/linux/dev_dri.txt.const17
-rw-r--r--sys/linux/dev_msm.txt7
3 files changed, 99 insertions, 30 deletions
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
}