diff options
Diffstat (limited to 'target/linux/bcm27xx/patches-5.4/950-0724-dma-buf-heaps-Add-system-heap-to-dmabuf-heaps.patch')
-rw-r--r-- | target/linux/bcm27xx/patches-5.4/950-0724-dma-buf-heaps-Add-system-heap-to-dmabuf-heaps.patch | 200 |
1 files changed, 0 insertions, 200 deletions
diff --git a/target/linux/bcm27xx/patches-5.4/950-0724-dma-buf-heaps-Add-system-heap-to-dmabuf-heaps.patch b/target/linux/bcm27xx/patches-5.4/950-0724-dma-buf-heaps-Add-system-heap-to-dmabuf-heaps.patch deleted file mode 100644 index 55c2450821..0000000000 --- a/target/linux/bcm27xx/patches-5.4/950-0724-dma-buf-heaps-Add-system-heap-to-dmabuf-heaps.patch +++ /dev/null @@ -1,200 +0,0 @@ -From 8392cd87592f31737286ea16f11781a234de3564 Mon Sep 17 00:00:00 2001 -From: John Stultz <john.stultz@linaro.org> -Date: Tue, 3 Dec 2019 17:26:39 +0000 -Subject: [PATCH] dma-buf: heaps: Add system heap to dmabuf heaps - -Commit efa04fefebbd724ffda7f49e42d057a7217c45b0 upstream. - -This patch adds system heap to the dma-buf heaps framework. - -This allows applications to get a page-allocator backed dma-buf -for non-contiguous memory. - -This code is an evolution of the Android ION implementation, so -thanks to its original authors and maintainters: - Rebecca Schultz Zavin, Colin Cross, Laura Abbott, and others! - -Cc: Laura Abbott <labbott@redhat.com> -Cc: Benjamin Gaignard <benjamin.gaignard@linaro.org> -Cc: Sumit Semwal <sumit.semwal@linaro.org> -Cc: Liam Mark <lmark@codeaurora.org> -Cc: Pratik Patel <pratikp@codeaurora.org> -Cc: Brian Starkey <Brian.Starkey@arm.com> -Cc: Vincent Donnefort <Vincent.Donnefort@arm.com> -Cc: Sudipto Paul <Sudipto.Paul@arm.com> -Cc: Andrew F. Davis <afd@ti.com> -Cc: Christoph Hellwig <hch@infradead.org> -Cc: Chenbo Feng <fengc@google.com> -Cc: Alistair Strachan <astrachan@google.com> -Cc: Hridya Valsaraju <hridya@google.com> -Cc: Sandeep Patil <sspatil@google.com> -Cc: Hillf Danton <hdanton@sina.com> -Cc: Dave Airlie <airlied@gmail.com> -Cc: dri-devel@lists.freedesktop.org -Reviewed-by: Benjamin Gaignard <benjamin.gaignard@linaro.org> -Reviewed-by: Brian Starkey <brian.starkey@arm.com> -Acked-by: Sandeep Patil <sspatil@android.com> -Acked-by: Laura Abbott <labbott@redhat.com> -Tested-by: Ayan Kumar Halder <ayan.halder@arm.com> -Signed-off-by: John Stultz <john.stultz@linaro.org> -Signed-off-by: Sumit Semwal <sumit.semwal@linaro.org> -Link: https://patchwork.freedesktop.org/patch/msgid/20191203172641.66642-4-john.stultz@linaro.org ---- - drivers/dma-buf/Kconfig | 2 + - drivers/dma-buf/heaps/Kconfig | 6 ++ - drivers/dma-buf/heaps/Makefile | 1 + - drivers/dma-buf/heaps/system_heap.c | 123 ++++++++++++++++++++++++++++ - 4 files changed, 132 insertions(+) - create mode 100644 drivers/dma-buf/heaps/Kconfig - create mode 100644 drivers/dma-buf/heaps/system_heap.c - ---- a/drivers/dma-buf/Kconfig -+++ b/drivers/dma-buf/Kconfig -@@ -53,4 +53,6 @@ menuconfig DMABUF_HEAPS - allows userspace to allocate dma-bufs that can be shared - between drivers. - -+source "drivers/dma-buf/heaps/Kconfig" -+ - endmenu ---- /dev/null -+++ b/drivers/dma-buf/heaps/Kconfig -@@ -0,0 +1,6 @@ -+config DMABUF_HEAPS_SYSTEM -+ bool "DMA-BUF System Heap" -+ depends on DMABUF_HEAPS -+ help -+ Choose this option to enable the system dmabuf heap. The system heap -+ is backed by pages from the buddy allocator. If in doubt, say Y. ---- a/drivers/dma-buf/heaps/Makefile -+++ b/drivers/dma-buf/heaps/Makefile -@@ -1,2 +1,3 @@ - # SPDX-License-Identifier: GPL-2.0 - obj-y += heap-helpers.o -+obj-$(CONFIG_DMABUF_HEAPS_SYSTEM) += system_heap.o ---- /dev/null -+++ b/drivers/dma-buf/heaps/system_heap.c -@@ -0,0 +1,123 @@ -+// SPDX-License-Identifier: GPL-2.0 -+/* -+ * DMABUF System heap exporter -+ * -+ * Copyright (C) 2011 Google, Inc. -+ * Copyright (C) 2019 Linaro Ltd. -+ */ -+ -+#include <linux/dma-buf.h> -+#include <linux/dma-mapping.h> -+#include <linux/dma-heap.h> -+#include <linux/err.h> -+#include <linux/highmem.h> -+#include <linux/mm.h> -+#include <linux/module.h> -+#include <linux/scatterlist.h> -+#include <linux/slab.h> -+#include <linux/sched/signal.h> -+#include <asm/page.h> -+ -+#include "heap-helpers.h" -+ -+struct dma_heap *sys_heap; -+ -+static void system_heap_free(struct heap_helper_buffer *buffer) -+{ -+ pgoff_t pg; -+ -+ for (pg = 0; pg < buffer->pagecount; pg++) -+ __free_page(buffer->pages[pg]); -+ kfree(buffer->pages); -+ kfree(buffer); -+} -+ -+static int system_heap_allocate(struct dma_heap *heap, -+ unsigned long len, -+ unsigned long fd_flags, -+ unsigned long heap_flags) -+{ -+ struct heap_helper_buffer *helper_buffer; -+ struct dma_buf *dmabuf; -+ int ret = -ENOMEM; -+ pgoff_t pg; -+ -+ helper_buffer = kzalloc(sizeof(*helper_buffer), GFP_KERNEL); -+ if (!helper_buffer) -+ return -ENOMEM; -+ -+ init_heap_helper_buffer(helper_buffer, system_heap_free); -+ helper_buffer->heap = heap; -+ helper_buffer->size = len; -+ -+ helper_buffer->pagecount = len / PAGE_SIZE; -+ helper_buffer->pages = kmalloc_array(helper_buffer->pagecount, -+ sizeof(*helper_buffer->pages), -+ GFP_KERNEL); -+ if (!helper_buffer->pages) { -+ ret = -ENOMEM; -+ goto err0; -+ } -+ -+ for (pg = 0; pg < helper_buffer->pagecount; pg++) { -+ /* -+ * Avoid trying to allocate memory if the process -+ * has been killed by by SIGKILL -+ */ -+ if (fatal_signal_pending(current)) -+ goto err1; -+ -+ helper_buffer->pages[pg] = alloc_page(GFP_KERNEL | __GFP_ZERO); -+ if (!helper_buffer->pages[pg]) -+ goto err1; -+ } -+ -+ /* create the dmabuf */ -+ dmabuf = heap_helper_export_dmabuf(helper_buffer, fd_flags); -+ if (IS_ERR(dmabuf)) { -+ ret = PTR_ERR(dmabuf); -+ goto err1; -+ } -+ -+ helper_buffer->dmabuf = dmabuf; -+ -+ ret = dma_buf_fd(dmabuf, fd_flags); -+ if (ret < 0) { -+ dma_buf_put(dmabuf); -+ /* just return, as put will call release and that will free */ -+ return ret; -+ } -+ -+ return ret; -+ -+err1: -+ while (pg > 0) -+ __free_page(helper_buffer->pages[--pg]); -+ kfree(helper_buffer->pages); -+err0: -+ kfree(helper_buffer); -+ -+ return ret; -+} -+ -+static const struct dma_heap_ops system_heap_ops = { -+ .allocate = system_heap_allocate, -+}; -+ -+static int system_heap_create(void) -+{ -+ struct dma_heap_export_info exp_info; -+ int ret = 0; -+ -+ exp_info.name = "system_heap"; -+ exp_info.ops = &system_heap_ops; -+ exp_info.priv = NULL; -+ -+ sys_heap = dma_heap_add(&exp_info); -+ if (IS_ERR(sys_heap)) -+ ret = PTR_ERR(sys_heap); -+ -+ return ret; -+} -+module_init(system_heap_create); -+MODULE_LICENSE("GPL v2"); |