From patchwork Mon Jul 3 14:51:14 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: vitaly_kuzmichev@mentor.com X-Patchwork-Id: 783511 Return-Path: X-Original-To: incoming-dt@patchwork.ozlabs.org Delivered-To: patchwork-incoming-dt@bilbo.ozlabs.org Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 3x1VSx1zxkz9s76 for ; Tue, 4 Jul 2017 00:51:29 +1000 (AEST) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S932203AbdGCOv1 (ORCPT ); Mon, 3 Jul 2017 10:51:27 -0400 Received: from relay1.mentorg.com ([192.94.38.131]:33213 "EHLO relay1.mentorg.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S932206AbdGCOvY (ORCPT ); Mon, 3 Jul 2017 10:51:24 -0400 Received: from nat-ies.mentorg.com ([192.94.31.2] helo=SVR-IES-MBX-03.mgc.mentorg.com) by relay1.mentorg.com with esmtp id 1dS2h9-0003z2-8K from Vitaly_Kuzmichev@mentor.com ; Mon, 03 Jul 2017 07:51:23 -0700 Received: from vkuzmichev.world.mentorg.com (137.202.0.87) by SVR-IES-MBX-03.mgc.mentorg.com (139.181.222.3) with Microsoft SMTP Server (TLS) id 15.0.1263.5; Mon, 3 Jul 2017 15:51:19 +0100 From: To: CC: , , , , , Subject: [PATCH 1/2] drivers: dma-coherent: Add support for default DMA coherent pool Date: Mon, 3 Jul 2017 17:51:14 +0300 Message-ID: <1499093475-29859-2-git-send-email-vitaly_kuzmichev@mentor.com> X-Mailer: git-send-email 1.9.1 In-Reply-To: <1499093475-29859-1-git-send-email-vitaly_kuzmichev@mentor.com> References: <1499093475-29859-1-git-send-email-vitaly_kuzmichev@mentor.com> MIME-Version: 1.0 X-Originating-IP: [137.202.0.87] X-ClientProxiedBy: svr-ies-mbx-01.mgc.mentorg.com (139.181.222.1) To SVR-IES-MBX-03.mgc.mentorg.com (139.181.222.3) Sender: devicetree-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: devicetree@vger.kernel.org From: "George G. Davis" Use concept similar to the default CMA region for DMA coherent pools. Cc: Rob Herring Cc: Mark Rutland Cc: Greg Kroah-Hartman Signed-off-by: George G. Davis Signed-off-by: Jiada Wang Signed-off-by: Mark Craske Signed-off-by: Vitaly Kuzmichev --- .../bindings/reserved-memory/reserved-memory.txt | 2 ++ drivers/base/dma-coherent.c | 29 ++++++++++++++++------ 2 files changed, 24 insertions(+), 7 deletions(-) diff --git a/Documentation/devicetree/bindings/reserved-memory/reserved-memory.txt b/Documentation/devicetree/bindings/reserved-memory/reserved-memory.txt index 3da0ebd..ed9a051 100644 --- a/Documentation/devicetree/bindings/reserved-memory/reserved-memory.txt +++ b/Documentation/devicetree/bindings/reserved-memory/reserved-memory.txt @@ -67,6 +67,8 @@ reusable (optional) - empty property Linux implementation note: - If a "linux,cma-default" property is present, then Linux will use the region for the default pool of the contiguous memory allocator. +- If a "linux,dma-default" property is present, then Linux will use the + region for the default pool of the DMA coherent memory allocator. Device node references to reserved memory ----------------------------------------- diff --git a/drivers/base/dma-coherent.c b/drivers/base/dma-coherent.c index 640a7e6..a0b0f2b 100644 --- a/drivers/base/dma-coherent.c +++ b/drivers/base/dma-coherent.c @@ -18,6 +18,19 @@ struct dma_coherent_mem { spinlock_t spinlock; }; +static struct dma_coherent_mem **dma_coherent_default_area; + +static inline struct dma_coherent_mem *dev_get_dma_area(struct device *dev) +{ + if (dev && dev->dma_mem) + return dev->dma_mem; +#ifdef CONFIG_CMA + if (dev && dev->cma_area) + return NULL; +#endif + return dma_coherent_default_area ? *dma_coherent_default_area : NULL; +} + static bool dma_init_coherent_memory( phys_addr_t phys_addr, dma_addr_t device_addr, size_t size, int flags, struct dma_coherent_mem **mem) @@ -111,7 +124,7 @@ int dma_declare_coherent_memory(struct device *dev, phys_addr_t phys_addr, void dma_release_declared_memory(struct device *dev) { - struct dma_coherent_mem *mem = dev->dma_mem; + struct dma_coherent_mem *mem = dev_get_dma_area(dev); if (!mem) return; @@ -123,7 +136,7 @@ void dma_release_declared_memory(struct device *dev) void *dma_mark_declared_memory_occupied(struct device *dev, dma_addr_t device_addr, size_t size) { - struct dma_coherent_mem *mem = dev->dma_mem; + struct dma_coherent_mem *mem = dev_get_dma_area(dev); unsigned long flags; int pos, err; @@ -167,9 +180,7 @@ int dma_alloc_from_coherent(struct device *dev, ssize_t size, int pageno; int dma_memory_map; - if (!dev) - return 0; - mem = dev->dma_mem; + mem = dev_get_dma_area(dev); if (!mem) return 0; @@ -223,7 +234,7 @@ int dma_alloc_from_coherent(struct device *dev, ssize_t size, */ int dma_release_from_coherent(struct device *dev, int order, void *vaddr) { - struct dma_coherent_mem *mem = dev ? dev->dma_mem : NULL; + struct dma_coherent_mem *mem = dev_get_dma_area(dev); if (mem && vaddr >= mem->virt_base && vaddr < (mem->virt_base + (mem->size << PAGE_SHIFT))) { @@ -257,7 +268,7 @@ int dma_release_from_coherent(struct device *dev, int order, void *vaddr) int dma_mmap_from_coherent(struct device *dev, struct vm_area_struct *vma, void *vaddr, size_t size, int *ret) { - struct dma_coherent_mem *mem = dev ? dev->dma_mem : NULL; + struct dma_coherent_mem *mem = dev_get_dma_area(dev); if (mem && vaddr >= mem->virt_base && vaddr + size <= (mem->virt_base + (mem->size << PAGE_SHIFT))) { @@ -329,6 +340,10 @@ static int __init rmem_dma_setup(struct reserved_mem *rmem) } #endif + if (of_get_flat_dt_prop(node, "linux,dma-default", NULL)) + dma_coherent_default_area = + (struct dma_coherent_mem **)&rmem->priv; + rmem->ops = &rmem_dma_ops; pr_info("Reserved memory: created DMA memory pool at %pa, size %ld MiB\n", &rmem->base, (unsigned long)rmem->size / SZ_1M);