On 2017å¹´09æ??29æ?¥ 06:10, Marek Olšák wrote: > From: Marek Olšák <marek.olsak at amd.com> > > --- > include/drm/drm.h | 24 ++++++++++++++++++++++++ > xf86drm.c | 22 ++++++++++++++++++++++ > xf86drm.h | 3 +++ > 3 files changed, 49 insertions(+) > > diff --git a/include/drm/drm.h b/include/drm/drm.h > index bf3674a..4da1667 100644 > --- a/include/drm/drm.h > +++ b/include/drm/drm.h > @@ -687,38 +687,57 @@ struct drm_prime_handle { > > /** Flags.. only applicable for handle->fd */ > __u32 flags; > > /** Returned dmabuf file descriptor */ > __s32 fd; > }; > > struct drm_syncobj_create { > __u32 handle; > +#define DRM_SYNCOBJ_CREATE_SIGNALED (1 << 0) > __u32 flags; > }; > > struct drm_syncobj_destroy { > __u32 handle; > __u32 pad; > }; > > #define DRM_SYNCOBJ_FD_TO_HANDLE_FLAGS_IMPORT_SYNC_FILE (1 << 0) > #define DRM_SYNCOBJ_HANDLE_TO_FD_FLAGS_EXPORT_SYNC_FILE (1 << 0) Typo for '(1 << 1)' ? With that fixes, the set is Reviewed-by: Chunming Zhou <david1.zhou at amd.com> > struct drm_syncobj_handle { > __u32 handle; > __u32 flags; > > __s32 fd; > __u32 pad; > }; > > +#define DRM_SYNCOBJ_WAIT_FLAGS_WAIT_ALL (1 << 0) > +#define DRM_SYNCOBJ_WAIT_FLAGS_WAIT_FOR_SUBMIT (1 << 1) > +struct drm_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 drm_syncobj_array { > + __u64 handles; > + __u32 count_handles; > + __u32 pad; > +}; > + > #if defined(__cplusplus) > } > #endif > > #include "drm_mode.h" > > #if defined(__cplusplus) > extern "C" { > #endif > > @@ -827,20 +846,23 @@ extern "C" { > #define DRM_IOCTL_MODE_OBJ_SETPROPERTY DRM_IOWR(0xBA, struct drm_mode_obj_set_property) > #define DRM_IOCTL_MODE_CURSOR2 DRM_IOWR(0xBB, struct drm_mode_cursor2) > #define DRM_IOCTL_MODE_ATOMIC DRM_IOWR(0xBC, struct drm_mode_atomic) > #define DRM_IOCTL_MODE_CREATEPROPBLOB DRM_IOWR(0xBD, struct drm_mode_create_blob) > #define DRM_IOCTL_MODE_DESTROYPROPBLOB DRM_IOWR(0xBE, struct drm_mode_destroy_blob) > > #define DRM_IOCTL_SYNCOBJ_CREATE DRM_IOWR(0xBF, struct drm_syncobj_create) > #define DRM_IOCTL_SYNCOBJ_DESTROY DRM_IOWR(0xC0, struct drm_syncobj_destroy) > #define DRM_IOCTL_SYNCOBJ_HANDLE_TO_FD DRM_IOWR(0xC1, struct drm_syncobj_handle) > #define DRM_IOCTL_SYNCOBJ_FD_TO_HANDLE DRM_IOWR(0xC2, struct drm_syncobj_handle) > +#define DRM_IOCTL_SYNCOBJ_WAIT DRM_IOWR(0xC3, struct drm_syncobj_wait) > +#define DRM_IOCTL_SYNCOBJ_RESET DRM_IOWR(0xC4, struct drm_syncobj_array) > +#define DRM_IOCTL_SYNCOBJ_SIGNAL DRM_IOWR(0xC5, struct drm_syncobj_array) > > /** > * Device specific ioctls should only be in their respective headers > * The device specific ioctl range is from 0x40 to 0x9f. > * Generic IOCTLS restart at 0xA0. > * > * \sa drmCommandNone(), drmCommandRead(), drmCommandWrite(), and > * drmCommandReadWrite(). > */ > #define DRM_COMMAND_BASE 0x40 > @@ -869,20 +891,21 @@ struct drm_event { > struct drm_event_vblank { > struct drm_event base; > __u64 user_data; > __u32 tv_sec; > __u32 tv_usec; > __u32 sequence; > __u32 crtc_id; /* 0 on older kernels that do not support this */ > }; > > /* typedef area */ > +#ifndef __KERNEL__ > typedef struct drm_clip_rect drm_clip_rect_t; > typedef struct drm_drawable_info drm_drawable_info_t; > typedef struct drm_tex_region drm_tex_region_t; > typedef struct drm_hw_lock drm_hw_lock_t; > typedef struct drm_version drm_version_t; > typedef struct drm_unique drm_unique_t; > typedef struct drm_list drm_list_t; > typedef struct drm_block drm_block_t; > typedef struct drm_control drm_control_t; > typedef enum drm_map_type drm_map_type_t; > @@ -910,16 +933,17 @@ typedef struct drm_draw drm_draw_t; > typedef struct drm_update_draw drm_update_draw_t; > typedef struct drm_auth drm_auth_t; > typedef struct drm_irq_busid drm_irq_busid_t; > typedef enum drm_vblank_seq_type drm_vblank_seq_type_t; > > typedef struct drm_agp_buffer drm_agp_buffer_t; > typedef struct drm_agp_binding drm_agp_binding_t; > typedef struct drm_agp_info drm_agp_info_t; > typedef struct drm_scatter_gather drm_scatter_gather_t; > typedef struct drm_set_version drm_set_version_t; > +#endif > > #if defined(__cplusplus) > } > #endif > > #endif > diff --git a/xf86drm.c b/xf86drm.c > index 6ea0112..8a32717 100644 > --- a/xf86drm.c > +++ b/xf86drm.c > @@ -4218,10 +4218,32 @@ int drmSyncobjExportSyncFile(int fd, uint32_t handle, int *sync_file_fd) > memclear(args); > args.fd = -1; > args.handle = handle; > args.flags = DRM_SYNCOBJ_HANDLE_TO_FD_FLAGS_EXPORT_SYNC_FILE; > ret = drmIoctl(fd, DRM_IOCTL_SYNCOBJ_HANDLE_TO_FD, &args); > if (ret) > return ret; > *sync_file_fd = args.fd; > return 0; > } > + > +int drmSyncobjWait(int fd, uint32_t *handles, unsigned num_handles, > + int64_t timeout_nsec, unsigned flags, > + uint32_t *first_signaled) > +{ > + struct drm_syncobj_wait args; > + int ret; > + > + memclear(args); > + args.handles = (intptr_t)handles; > + args.timeout_nsec = timeout_nsec; > + args.count_handles = num_handles; > + args.flags = flags; > + > + ret = drmIoctl(fd, DRM_IOCTL_SYNCOBJ_WAIT, &args); > + if (ret < 0) > + return ret; > + > + if (first_signaled) > + *first_signaled = args.first_signaled; > + return ret; > +} > diff --git a/xf86drm.h b/xf86drm.h > index 2855a3e..ea650ef 100644 > --- a/xf86drm.h > +++ b/xf86drm.h > @@ -853,16 +853,19 @@ extern int drmGetDevices2(uint32_t flags, drmDevicePtr devices[], int max_device > > extern int drmDevicesEqual(drmDevicePtr a, drmDevicePtr b); > > extern int drmSyncobjCreate(int fd, uint32_t flags, uint32_t *handle); > extern int drmSyncobjDestroy(int fd, uint32_t handle); > extern int drmSyncobjHandleToFD(int fd, uint32_t handle, int *obj_fd); > extern int drmSyncobjFDToHandle(int fd, int obj_fd, uint32_t *handle); > > extern int drmSyncobjImportSyncFile(int fd, uint32_t handle, int sync_file_fd); > extern int drmSyncobjExportSyncFile(int fd, uint32_t handle, int *sync_file_fd); > +extern int drmSyncobjWait(int fd, uint32_t *handles, unsigned num_handles, > + int64_t timeout_nsec, unsigned flags, > + uint32_t *first_signaled); > > #if defined(__cplusplus) > } > #endif > > #endif