summaryrefslogtreecommitdiff
path: root/recipes-multimedia/gstreamer/gstreamer1.0-plugins-bad/0022-ionmemory-support-get-phys-memory.patch
diff options
context:
space:
mode:
Diffstat (limited to 'recipes-multimedia/gstreamer/gstreamer1.0-plugins-bad/0022-ionmemory-support-get-phys-memory.patch')
-rw-r--r--recipes-multimedia/gstreamer/gstreamer1.0-plugins-bad/0022-ionmemory-support-get-phys-memory.patch94
1 files changed, 94 insertions, 0 deletions
diff --git a/recipes-multimedia/gstreamer/gstreamer1.0-plugins-bad/0022-ionmemory-support-get-phys-memory.patch b/recipes-multimedia/gstreamer/gstreamer1.0-plugins-bad/0022-ionmemory-support-get-phys-memory.patch
new file mode 100644
index 0000000..5ab4183
--- /dev/null
+++ b/recipes-multimedia/gstreamer/gstreamer1.0-plugins-bad/0022-ionmemory-support-get-phys-memory.patch
@@ -0,0 +1,94 @@
+From 2f82ec644f10e2aefa9f80ee3909ba06466752e6 Mon Sep 17 00:00:00 2001
+From: Song Bing <bing.song@nxp.com>
+Date: Wed, 13 Sep 2017 13:39:53 +0800
+Subject: [PATCH 3/3] ionmemory: support get phys memory
+
+Upstream Status: Pending
+
+https://bugzilla.gnome.org/show_bug.cgi?id=768794
+---
+ gst-libs/gst/allocators/gstionmemory.c | 54 ++++++++++++++++++++++++++++++++--
+ 1 file changed, 52 insertions(+), 2 deletions(-)
+
+diff --git a/gst-libs/gst/allocators/gstionmemory.c b/gst-libs/gst/allocators/gstionmemory.c
+index bfe13ad..fad53db 100755
+--- a/gst-libs/gst/allocators/gstionmemory.c
++++ b/gst-libs/gst/allocators/gstionmemory.c
+@@ -29,6 +29,7 @@
+ #include <linux/ion.h>
+
+ #include <gst/allocators/gstdmabuf.h>
++#include "gstphysmemory.h"
+ #include "gstionmemory.h"
+
+ GST_DEBUG_CATEGORY_STATIC (ion_allocator_debug);
+@@ -36,8 +37,6 @@ GST_DEBUG_CATEGORY_STATIC (ion_allocator_debug);
+
+ #define gst_ion_allocator_parent_class parent_class
+
+-G_DEFINE_TYPE (GstIONAllocator, gst_ion_allocator, GST_TYPE_DMABUF_ALLOCATOR)
+-
+ #define DEFAULT_HEAP_ID 0
+ #define DEFAULT_FLAG 0
+
+@@ -49,6 +48,57 @@ enum
+ PROP_LAST
+ };
+
++static guintptr
++gst_ion_allocator_get_phys_addr (GstPhysMemoryAllocator *allocator, GstMemory *mem)
++{
++ GstIONAllocator *self = GST_ION_ALLOCATOR (allocator);
++ gint ret, fd;
++
++ if (self->fd < 0 || !mem) {
++ GST_ERROR ("ion get phys param wrong");
++ return 0;
++ }
++
++ if (!gst_is_dmabuf_memory (mem)) {
++ GST_ERROR ("isn't dmabuf memory");
++ return 0;
++ }
++
++ fd = gst_dmabuf_memory_get_fd (mem);
++ if (fd < 0) {
++ GST_ERROR ("dmabuf memory get fd failed");
++ return 0;
++ }
++
++ GST_DEBUG ("ion DMA FD: %d", fd);
++
++ struct ion_phys_dma_data data = {
++ .phys = 0,
++ .size = 0,
++ .dmafd = fd,
++ };
++
++ struct ion_custom_data custom = {
++ .cmd = ION_IOC_PHYS_DMA,
++ .arg = (unsigned long)&data,
++ };
++
++ ret = ioctl(self->fd, ION_IOC_CUSTOM, &custom);
++ if (ret < 0)
++ return 0;
++
++ return data.phys;
++}
++
++static void gst_ion_allocator_iface_init(gpointer g_iface)
++{
++ GstPhysMemoryAllocatorInterface *iface = g_iface;
++ iface->get_phys_addr = gst_ion_allocator_get_phys_addr;
++}
++
++G_DEFINE_TYPE_WITH_CODE (GstIONAllocator, gst_ion_allocator, GST_TYPE_DMABUF_ALLOCATOR,
++ G_IMPLEMENT_INTERFACE(GST_TYPE_PHYS_MEMORY_ALLOCATOR, gst_ion_allocator_iface_init));
++
+ static gint
+ gst_ion_ioctl (gint fd, gint req, void *arg)
+ {
+--
+2.7.4
+