staging: vc04_services: Add vchi_queue_kernel_message function
authorMichael Zoran <mzoran@crowfest.net>
Mon, 30 Jan 2017 07:31:09 +0000 (23:31 -0800)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Tue, 31 Jan 2017 09:48:14 +0000 (10:48 +0100)
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 kernel
address space.

int
vchi_queue_kernel_message(VCHI_SERVICE_HANDLE_T handle,
  void *data,
  unsigned int size)

Signed-off-by: Michael Zoran <mzoran@crowfest.net>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
drivers/staging/vc04_services/interface/vchi/vchi.h
drivers/staging/vc04_services/interface/vchiq_arm/vchiq_shim.c

index 44169d6..7ab74f7 100644 (file)
@@ -227,6 +227,12 @@ extern int32_t
                       void *context,
                       uint32_t data_size);
 
+/* Routine to send a message from kernel memory across a service */
+extern int
+vchi_queue_kernel_message(VCHI_SERVICE_HANDLE_T handle,
+                         void *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,
index a6b2ae0..26edd6e 100644 (file)
@@ -188,6 +188,28 @@ int32_t vchi_msg_queue(VCHI_SERVICE_HANDLE_T handle,
 }
 EXPORT_SYMBOL(vchi_msg_queue);
 
+static ssize_t
+vchi_queue_kernel_message_callback(void *context,
+                                  void *dest,
+                                  size_t offset,
+                                  size_t maxsize)
+{
+       memcpy(dest, context + offset, maxsize);
+       return maxsize;
+}
+
+int
+vchi_queue_kernel_message(VCHI_SERVICE_HANDLE_T handle,
+                         void *data,
+                         unsigned int size)
+{
+       return vchi_msg_queue(handle,
+                             vchi_queue_kernel_message_callback,
+                             data,
+                             size);
+}
+EXPORT_SYMBOL(vchi_queue_kernel_message);
+
 /***********************************************************
  * Name: vchi_bulk_queue_receive
  *