diff options
Diffstat (limited to 'target/linux/bcm27xx/patches-5.4/950-0732-dma-buf-heaps-Add-system-heap-to-dmabuf-heaps.patch')
-rw-r--r-- | target/linux/bcm27xx/patches-5.4/950-0732-dma-buf-heaps-Add-system-heap-to-dmabuf-heaps.patch | 200 |
1 files changed, 200 insertions, 0 deletions
diff --git a/target/linux/bcm27xx/patches-5.4/950-0732-dma-buf-heaps-Add-system-heap-to-dmabuf-heaps.patch b/target/linux/bcm27xx/patches-5.4/950-0732-dma-buf-heaps-Add-system-heap-to-dmabuf-heaps.patch new file mode 100644 index 0000000000..55c2450821 --- /dev/null +++ b/target/linux/bcm27xx/patches-5.4/950-0732-dma-buf-heaps-Add-system-heap-to-dmabuf-heaps.patch @@ -0,0 +1,200 @@ +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"); |