diff options
Diffstat (limited to 'drivers/gpu/mali400/r3p2/mali/linux')
5 files changed, 46 insertions, 0 deletions
diff --git a/drivers/gpu/mali400/r3p2/mali/linux/mali_kernel_linux.c b/drivers/gpu/mali400/r3p2/mali/linux/mali_kernel_linux.c index f337d09..f0265e3 100644 --- a/drivers/gpu/mali400/r3p2/mali/linux/mali_kernel_linux.c +++ b/drivers/gpu/mali400/r3p2/mali/linux/mali_kernel_linux.c @@ -697,6 +697,11 @@ static int mali_ioctl(struct inode *inode, struct file *filp, unsigned int cmd, err = sync_fence_create_empty_wrapper(session_data, (_mali_uk_fence_create_empty_s __user *)arg); break; #endif + case MALI_IOC_FENCE_CREATE_SIGNALLED: +#if defined(CONFIG_SYNC) + err = sync_fence_create_signalled_wrapper(session_data, (_mali_uk_fence_create_signalled_s __user *)arg); + break; +#endif case MALI_IOC_FENCE_VALIDATE: #if defined(CONFIG_SYNC) err = sync_fence_validate_wrapper(session_data, (_mali_uk_fence_validate_s __user *)arg); diff --git a/drivers/gpu/mali400/r3p2/mali/linux/mali_sync.h b/drivers/gpu/mali400/r3p2/mali/linux/mali_sync.h index 4415ec6..2da66df 100644 --- a/drivers/gpu/mali400/r3p2/mali/linux/mali_sync.h +++ b/drivers/gpu/mali400/r3p2/mali/linux/mali_sync.h @@ -39,6 +39,7 @@ _mali_osk_errcode_t mali_stream_create(const char * name, int * out_fd); struct sync_pt *mali_stream_create_point(int tl_fd); int mali_stream_create_fence(struct sync_pt *pt); int mali_stream_create_empty_fence(int tl_fd); +int mali_stream_create_signalled_fence(int tl_fd); /** * Commit an empty timed fence diff --git a/drivers/gpu/mali400/r3p2/mali/linux/mali_sync_user.c b/drivers/gpu/mali400/r3p2/mali/linux/mali_sync_user.c index 7f0fddfc..ba07f30 100644 --- a/drivers/gpu/mali400/r3p2/mali/linux/mali_sync_user.c +++ b/drivers/gpu/mali400/r3p2/mali/linux/mali_sync_user.c @@ -165,6 +165,25 @@ int mali_stream_create_empty_fence(int tl_fd) return fd; } +int mali_stream_create_signalled_fence(int tl_fd) +{ + int fd; + mali_sync_pt *pt; + + pt = mali_stream_create_point_internal(tl_fd, MALI_FALSE); + + if (NULL == pt) return -ENOMEM; + + fd = mali_stream_create_fence(pt); + + if (0 <= fd) + { + mali_sync_signal_pt(pt, 0); + } + + return fd; +} + _mali_osk_errcode_t mali_fence_validate(int fd) { struct sync_fence * fence; diff --git a/drivers/gpu/mali400/r3p2/mali/linux/mali_ukk_core.c b/drivers/gpu/mali400/r3p2/mali/linux/mali_ukk_core.c index 1768ff2..6eaea79 100644 --- a/drivers/gpu/mali400/r3p2/mali/linux/mali_ukk_core.c +++ b/drivers/gpu/mali400/r3p2/mali/linux/mali_ukk_core.c @@ -152,6 +152,26 @@ int sync_fence_create_empty_wrapper(struct mali_session_data *session_data, _mal return 0; } +int sync_fence_create_signalled_wrapper(struct mali_session_data *session_data, _mali_uk_fence_create_signalled_s __user *uargs) +{ + _mali_uk_fence_create_signalled_s kargs; + + MALI_CHECK_NON_NULL(uargs, -EINVAL); + + if (0 != get_user(kargs.stream, &uargs->stream)) return -EFAULT; + + kargs.fence = mali_stream_create_signalled_fence(kargs.stream); + if (0 > kargs.fence) + { + return kargs.fence; + } + + kargs.ctx = NULL; /* prevent kernel address to be returned to user space */ + if (0 != copy_to_user(uargs, &kargs, sizeof(_mali_uk_fence_create_signalled_s))) return -EFAULT; + + return 0; +} + int sync_fence_validate_wrapper(struct mali_session_data *session, _mali_uk_fence_validate_s __user *uargs) { int fd; diff --git a/drivers/gpu/mali400/r3p2/mali/linux/mali_ukk_wrappers.h b/drivers/gpu/mali400/r3p2/mali/linux/mali_ukk_wrappers.h index 08bdae4..8bec818 100644 --- a/drivers/gpu/mali400/r3p2/mali/linux/mali_ukk_wrappers.h +++ b/drivers/gpu/mali400/r3p2/mali/linux/mali_ukk_wrappers.h @@ -30,6 +30,7 @@ int get_user_settings_wrapper(struct mali_session_data *session_data, _mali_uk_g #if defined(CONFIG_SYNC) int stream_create_wrapper(struct mali_session_data *session_data, _mali_uk_stream_create_s __user *uargs); int sync_fence_create_empty_wrapper(struct mali_session_data *session_data, _mali_uk_fence_create_empty_s __user *uargs); +int sync_fence_create_signalled_wrapper(struct mali_session_data *session_data, _mali_uk_fence_create_signalled_s __user *uargs); int sync_fence_validate_wrapper(struct mali_session_data *session, _mali_uk_fence_validate_s __user *uargs); #endif int post_notification_wrapper(struct mali_session_data *session_data, _mali_uk_post_notification_s __user *uargs); |