From 8df54492568e25a91febd36190cb386be369195b Mon Sep 17 00:00:00 2001
From: Song Bing <bing.song@nxp.com>
Date: Fri, 12 Aug 2016 09:33:00 +0800
Subject: [PATCH] ion_allocator: refine ion allocator code.

Refine ion allocator code and remove all compile warning.
Changed ion allocated heap to DMA.

Upstream-Status: Pending

https://bugzilla.gnome.org/show_bug.cgi?id=768794
---
 gst-libs/gst/ion/gstionmemory.c | 232 ++++++++++++++--------------------------
 gst-libs/gst/ion/gstionmemory.h |   1 -
 2 files changed, 82 insertions(+), 151 deletions(-)

diff --git a/gst-libs/gst/ion/gstionmemory.c b/gst-libs/gst/ion/gstionmemory.c
index ea62ac4926c1..4c160c94176a 100755
--- a/gst-libs/gst/ion/gstionmemory.c
+++ b/gst-libs/gst/ion/gstionmemory.c
@@ -21,6 +21,7 @@
 #include <fcntl.h>
 #include <stdio.h>
 #include <string.h>
+#include <unistd.h>
 #include <sys/ioctl.h>
 #include <sys/mman.h>
 #include <sys/types.h>
@@ -29,116 +30,34 @@
 #include <gst/allocators/gstdmabuf.h>
 #include "gstionmemory.h"
 
-GST_DEBUG_CATEGORY_STATIC(ion_allocator_debug);
+GST_DEBUG_CATEGORY_STATIC (ion_allocator_debug);
 #define GST_CAT_DEFAULT ion_allocator_debug
 
 #define gst_ion_allocator_parent_class parent_class
 
 #define PAGE_ALIGN(x) (((x) + 4095) & ~4095)
 
-G_DEFINE_TYPE(GstIONAllocator, gst_ion_allocator, GST_TYPE_ALLOCATOR)
+G_DEFINE_TYPE (GstIONAllocator, gst_ion_allocator, GST_TYPE_ALLOCATOR)
 
-static int 
-gst_ion_open()
+static gint 
+gst_ion_ioctl (gint fd, gint req, void *arg)
 {
-  int fd = open("/dev/ion", O_RDWR);
-  if (fd < 0)
-    GST_ERROR ("open /dev/ion failed!\n");
-  return fd;
-}
-
-static int 
-gst_ion_close(int fd)
-{
-  int ret = close(fd);
-  if (ret < 0)
-    return -errno;
-  return ret;
-}
-
-static int 
-gst_ion_ioctl(int fd, int req, void *arg)
-{
-  int ret = ioctl(fd, req, arg);
+  gint ret = ioctl (fd, req, arg);
   if (ret < 0) {
-    GST_ERROR ("ioctl %x failed with code %d: %s\n", req,
-        ret, strerror(errno));
-    return -errno;
-  }
-  return ret;
-}
-
-static int 
-gst_ion_alloc(int fd, size_t len, size_t align, unsigned int heap_mask,
-    unsigned int flags, ion_user_handle_t *handle)
-{
-  int ret;
-  struct ion_allocation_data data = {
-    .len = len,
-    .align = align,
-    .heap_id_mask = heap_mask,
-    .flags = flags,
-  };
-
-  if (handle == NULL)
-    return -EINVAL;
-
-  ret = gst_ion_ioctl(fd, ION_IOC_ALLOC, &data);
-  if (ret < 0)
-    return ret;
-  *handle = data.handle;
-  return ret;
-}
-
-static int 
-gst_ion_free(int fd, ion_user_handle_t handle)
-{
-  struct ion_handle_data data = {
-    .handle = handle,
-  };
-  return gst_ion_ioctl(fd, ION_IOC_FREE, &data);
-}
-
-static int 
-gst_ion_map(int fd, ion_user_handle_t handle, size_t length, int prot,
-    int flags, off_t offset, unsigned char **ptr, int *map_fd)
-{
-  int ret;
-  unsigned char *tmp_ptr;
-  struct ion_fd_data data = {
-    .handle = handle,
-  };
-
-  if (map_fd == NULL)
-    return -EINVAL;
-  if (ptr == NULL)
-    return -EINVAL;
-
-  ret = gst_ion_ioctl(fd, ION_IOC_MAP, &data);
-  if (ret < 0)
-    return ret;
-  if (data.fd < 0) {
-    GST_ERROR ("map ioctl returned negative fd\n");
-    return -EINVAL;
-  }
-  tmp_ptr = mmap(NULL, length, prot, flags, data.fd, offset);
-  if (tmp_ptr == MAP_FAILED) {
-    GST_ERROR ("mmap failed: %s\n", strerror(errno));
-    return -errno;
+    GST_ERROR ("ioctl %x failed with code %d: %s\n", req, ret,
+        strerror (errno));
   }
-  *map_fd = data.fd;
-  *ptr = tmp_ptr;
   return ret;
 }
 
-static void 
-gst_ion_mem_init(void)
+static void
+gst_ion_mem_init (void)
 {
-	GstAllocator *allocator = g_object_new(gst_ion_allocator_get_type(), NULL);
+  GstAllocator *allocator = g_object_new (gst_ion_allocator_get_type (), NULL);
   GstIONAllocator *self = GST_ION_ALLOCATOR (allocator);
   gint fd;
 
-  fd = gst_ion_open();
+  fd = open ("/dev/ion", O_RDWR);
   if (fd < 0) {
     GST_ERROR ("Could not open ion driver");
     g_object_unref (self);
@@ -146,24 +65,24 @@ gst_ion_mem_init(void)
   }
 
   self->fd = fd;
-  self->dma_allocator = gst_dmabuf_allocator_new();
+  self->dma_allocator = gst_dmabuf_allocator_new ();
 
-	gst_allocator_register(GST_TYPE_ION_ALLOCATOR, allocator);
+  gst_allocator_register (GST_ALLOCATOR_ION, allocator);
 }
 
-GstAllocator* 
-gst_ion_allocator_obtain(void)
+GstAllocator *
+gst_ion_allocator_obtain (void)
 {
-	static GOnce ion_allocator_once = G_ONCE_INIT;
-	GstAllocator *allocator;
+  static GOnce ion_allocator_once = G_ONCE_INIT;
+  GstAllocator *allocator;
 
-	g_once(&ion_allocator_once, (GThreadFunc)gst_ion_mem_init, NULL);
+  g_once (&ion_allocator_once, (GThreadFunc) gst_ion_mem_init, NULL);
 
-	allocator = gst_allocator_find(GST_TYPE_ION_ALLOCATOR);
-	if (allocator == NULL)
-		GST_WARNING("No allocator named %s found", GST_TYPE_ION_ALLOCATOR);
+  allocator = gst_allocator_find (GST_ALLOCATOR_ION);
+  if (allocator == NULL)
+    GST_WARNING ("No allocator named %s found", GST_ALLOCATOR_ION);
 
-	return allocator;
+  return allocator;
 }
 
 GQuark
@@ -178,62 +97,69 @@ gst_ion_memory_quark (void)
 }
 
 static GstMemory *
-gst_ion_alloc_alloc (GstAllocator * allocator, gint size,
+gst_ion_alloc_alloc (GstAllocator * allocator, gsize size,
     GstAllocationParams * params)
 {
   GstIONAllocator *self = GST_ION_ALLOCATOR (allocator);
-  gint dmafd = -1;
-  guint8 *ptr = NULL;
-  ion_user_handle_t ionHandle;
-  gint ionSize = PAGE_ALIGN (size + params->prefix + params->padding);
-  gint err;
-
-  if (self->fd < 0)
+  struct ion_allocation_data allocation_data = { 0 };
+  struct ion_fd_data fd_data = { 0 };
+  struct ion_handle_data handle_data = { 0 };
+  ion_user_handle_t ion_handle;
+  GstIONMemory *ion_mem;
+  GstMemory *mem;
+  gsize ion_size;
+  gint dma_fd = -1;
+  gint ret;
+
+  if (self->fd < 0) {
+    GST_ERROR ("ion allocate param wrong");
     return NULL;
+  }
 
-  err = gst_ion_alloc(self->fd, ionSize, 8, 1, 0, &ionHandle);
-  if (err) {
-    GST_ERROR ("gst_ion_alloc failed.");
+  ion_size = PAGE_ALIGN (size + params->prefix + params->padding);
+  allocation_data.len = ion_size;
+  allocation_data.align = params->align;
+  allocation_data.heap_id_mask = ION_HEAP_TYPE_DMA_MASK;
+  allocation_data.flags = 0;
+  if (gst_ion_ioctl (self->fd, ION_IOC_ALLOC, &allocation_data) < 0) {
+    GST_ERROR ("ion allocate failed.");
     return NULL;
   }
+  ion_handle = allocation_data.handle;
 
-  err = gst_ion_map(self->fd, ionHandle, ionSize, PROT_READ | PROT_WRITE,
-      MAP_SHARED, 0, &ptr, &dmafd);
-  if (err) {
-    GST_ERROR ("gst_ion_map failed.");
+  fd_data.handle = ion_handle;
+  ret = gst_ion_ioctl (self->fd, ION_IOC_MAP, &fd_data);
+  if (ret < 0 || fd_data.fd < 0) {
+    GST_ERROR ("map ioctl failed or returned negative fd");
     goto bail;
   }
-  GST_DEBUG ("phyalloc ptr:0x%x, ionSize:%d dmafd: %d", (int32_t)ptr,
-      ionSize, dmafd);
+  dma_fd = fd_data.fd;
 
-  GstIONMemory *ion_mem = g_slice_new0 (GstIONMemory);
+  ion_mem = g_slice_new0 (GstIONMemory);
   gst_memory_init (GST_MEMORY_CAST (ion_mem), GST_MEMORY_FLAG_NO_SHARE,
-                    allocator, 0, size, 0, 0, size);
+      allocator, NULL, ion_size, params->align, params->prefix, size);
 
-  ion_mem->vaddr = ptr;
-  ion_mem->size = ionSize;
-  ion_mem->handle = ionHandle;
-  ion_mem->fd = dmafd;
+  ion_mem->size = ion_size;
+  ion_mem->handle = ion_handle;
+  ion_mem->fd = dma_fd;
 
-  GstMemory * mem =
-    gst_dmabuf_allocator_alloc(self->dma_allocator, dmafd, ionSize);
+  mem = gst_dmabuf_allocator_alloc (self->dma_allocator, dma_fd, size);
 
   gst_mini_object_set_qdata (GST_MINI_OBJECT (mem), GST_ION_MEMORY_QUARK,
-                              ion_mem, gst_memory_unref);
+      ion_mem, (GDestroyNotify) gst_memory_unref);
 
-  GST_LOG ("allocated memory %p by allocator %p with qdata %p\n",
-            mem, allocator, ion_mem);
+  GST_LOG ("ion allocated size: %" G_GSIZE_FORMAT "DMA FD: %d", ion_size,
+      dma_fd);
 
   return mem;
 
 bail:
-  gst_ion_free(self->fd, ionHandle);
-  if (ptr != MAP_FAILED) {
-    munmap(ptr, ionSize);
-  }
-  if (dmafd > 0) {
-    close(dmafd);
+  if (dma_fd >= 0) {
+    close (dma_fd);
   }
+  handle_data.handle = ion_handle;
+  gst_ion_ioctl (self->fd, ION_IOC_FREE, &handle_data);
+
   return NULL;
 }
 
@@ -242,15 +168,20 @@ gst_ion_alloc_free (GstAllocator * allocator, GstMemory * memory)
 {
   GstIONAllocator *self = GST_ION_ALLOCATOR (allocator);
   GstIONMemory *ion_mem = (GstIONMemory *) memory;
+  struct ion_handle_data handle_data = { 0 };
+  ion_user_handle_t ion_handle;
 
-  if (!ion_mem || self->fd < 0)
+  if (self->fd < 0 || !ion_mem || ion_mem->fd < 0) {
+    GST_ERROR ("ion free param wrong");
     return;
+  }
 
-  ion_user_handle_t ionHandle =
-    (ion_user_handle_t)ion_mem->handle;
-  munmap(ion_mem->vaddr, ion_mem->size);
-  close(ion_mem->fd);
-  gst_ion_free(self->fd, ionHandle);
+  GST_LOG ("ion free size: %" G_GSIZE_FORMAT "DMA FD: %d", ion_mem->size,
+      ion_mem->fd);
+  close (ion_mem->fd);
+  ion_handle = (ion_user_handle_t) ion_mem->handle;
+  handle_data.handle = ion_handle;
+  gst_ion_ioctl (self->fd, ION_IOC_FREE, &handle_data);
 
   g_slice_free (GstIONMemory, ion_mem);
 }
@@ -261,13 +192,14 @@ gst_ion_allocator_dispose (GObject * object)
   GstIONAllocator *self = GST_ION_ALLOCATOR (object);
 
   if (self->fd > 0) {
-    close(self->fd);
+    close (self->fd);
     self->fd = -1;
   }
 
-  if (self->dma_allocator)
-    gst_object_unref(self->dma_allocator);
-  self->dma_allocator = NULL;
+  if (self->dma_allocator) {
+    gst_object_unref (self->dma_allocator);
+    self->dma_allocator = NULL;
+  }
 
   G_OBJECT_CLASS (parent_class)->dispose (object);
 }
@@ -282,7 +214,8 @@ gst_ion_allocator_class_init (GstIONAllocatorClass * klass)
   allocator_class->free = GST_DEBUG_FUNCPTR (gst_ion_alloc_free);
   gobject_class->dispose = GST_DEBUG_FUNCPTR (gst_ion_allocator_dispose);
 
-  GST_DEBUG_CATEGORY_INIT(ion_allocator_debug, "ionmemory", 0, "DMA FD memory allocator based on ion");
+  GST_DEBUG_CATEGORY_INIT (ion_allocator_debug, "ionmemory", 0,
+      "DMA FD memory allocator based on ion");
 }
 
 static void
@@ -294,4 +227,3 @@ gst_ion_allocator_init (GstIONAllocator * self)
   allocator->mem_map = NULL;
   allocator->mem_unmap = NULL;
 }
-
diff --git a/gst-libs/gst/ion/gstionmemory.h b/gst-libs/gst/ion/gstionmemory.h
index b6dca5fb9bfe..406806d8d7cb 100755
--- a/gst-libs/gst/ion/gstionmemory.h
+++ b/gst-libs/gst/ion/gstionmemory.h
@@ -59,7 +59,6 @@ struct _GstIONMemory {
   GstMemory mem;
 
   gint fd;
-  guint8 *vaddr;
   gsize size;
   gint handle;
 };
