From 619969770f1486b82daa03d0b6f00eca3331f2ca Mon Sep 17 00:00:00 2001 From: Michael Zoran Date: Sun, 29 Jan 2017 23:31:10 -0800 Subject: staging: vc04_services: Add vchi_queue_user_message function The vchi_msg_queue function which is used by other drivers to queue a message is difficult to understand and overly generic. Add a new function which is a wrapper on top of vchi_msg_queue that is specifically for queuing a message located in user address space. int vchi_queue_user_message(VCHI_SERVICE_HANDLE_T handle, void __user *data, unsigned int size) Signed-off-by: Michael Zoran Signed-off-by: Greg Kroah-Hartman --- .../staging/vc04_services/interface/vchi/vchi.h | 6 ++++ .../vc04_services/interface/vchiq_arm/vchiq_shim.c | 34 ++++++++++++++++++++++ 2 files changed, 40 insertions(+) (limited to 'drivers/staging/vc04_services') diff --git a/drivers/staging/vc04_services/interface/vchi/vchi.h b/drivers/staging/vc04_services/interface/vchi/vchi.h index 7ab74f76f2f8..1a401f04d03f 100644 --- a/drivers/staging/vc04_services/interface/vchi/vchi.h +++ b/drivers/staging/vc04_services/interface/vchi/vchi.h @@ -233,6 +233,12 @@ vchi_queue_kernel_message(VCHI_SERVICE_HANDLE_T handle, void *data, unsigned int size); +/* Routine to send a message from user memory across a service */ +extern int +vchi_queue_user_message(VCHI_SERVICE_HANDLE_T handle, + void __user *data, + unsigned int size); + // Routine to receive a msg from a service // Dequeue is equivalent to hold, copy into client buffer, release extern int32_t vchi_msg_dequeue( VCHI_SERVICE_HANDLE_T handle, diff --git a/drivers/staging/vc04_services/interface/vchiq_arm/vchiq_shim.c b/drivers/staging/vc04_services/interface/vchiq_arm/vchiq_shim.c index 26edd6e69dcd..8987c4ad3653 100644 --- a/drivers/staging/vc04_services/interface/vchiq_arm/vchiq_shim.c +++ b/drivers/staging/vc04_services/interface/vchiq_arm/vchiq_shim.c @@ -210,6 +210,40 @@ vchi_queue_kernel_message(VCHI_SERVICE_HANDLE_T handle, } EXPORT_SYMBOL(vchi_queue_kernel_message); +struct vchi_queue_user_message_context { + void __user *data; +}; + +static ssize_t +vchi_queue_user_message_callback(void *context, + void *dest, + size_t offset, + size_t maxsize) +{ + struct vchi_queue_user_message_context *copycontext = context; + + if (copy_from_user(dest, copycontext->data + offset, maxsize)) + return -EFAULT; + + return maxsize; +} + +int +vchi_queue_user_message(VCHI_SERVICE_HANDLE_T handle, + void __user *data, + unsigned int size) +{ + struct vchi_queue_user_message_context copycontext = { + .data = data + }; + + return vchi_msg_queue(handle, + vchi_queue_user_message_callback, + ©context, + size); +} +EXPORT_SYMBOL(vchi_queue_user_message); + /*********************************************************** * Name: vchi_bulk_queue_receive * -- cgit v1.2.3