From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S969507AbdEXK0A (ORCPT ); Wed, 24 May 2017 06:26:00 -0400 Received: from foss.arm.com ([217.140.101.70]:35672 "EHLO foss.arm.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S969408AbdEXKYu (ORCPT ); Wed, 24 May 2017 06:24:50 -0400 From: Vladimir Murzin To: linux-arm-kernel@lists.infradead.org Cc: linux-kernel@vger.kernel.org, linux@armlinux.org.uk, sza@esh.hu, arnd@arndb.de, gregkh@linuxfoundation.org, akpm@linux-foundation.org, alexandre.torgue@st.com, robin.murphy@arm.com, benjamin.gaignard@linaro.org, kbuild-all@01.org, Joerg Roedel , Christian Borntraeger , Michal Nazarewicz , Marek Szyprowski , Alan Stern , Yoshinori Sato , Rich Felker , Roger Quadros , Rob Herring , Mark Rutland , Doug Ledford Subject: [PATCH v5 0/7] ARM: Fix dma_alloc_coherent() and friends for NOMMU Date: Wed, 24 May 2017 11:24:25 +0100 Message-Id: <1495621472-9323-1-git-send-email-vladimir.murzin@arm.com> X-Mailer: git-send-email 2.0.0 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Short story: Without these patches coherent DMA is broken for AndrĂ¡s and Alexandre, so they cannot safely enable DMA on their platforms. Patches have been circulated on a list since last year without much attention to changes in dma-coherent.c and dma-noop.c. Meanwhile, ARM bits have been reviewed and there is no strict objection to get them merged. Unfortunately, applying only ARM bits doesn't help much and the original issue would still exist. Please, let me know how to move with this fix forward? Long story: It seems that addition of cache support for M-class CPUs uncovered latent bug in DMA usage. NOMMU memory model has been treated as being always consistent; however, for R/M CPU classes memory can be covered by MPU which in turn might configure RAM as Normal i.e. bufferable and cacheable. It breaks dma_alloc_coherent() and friends, since data can stuck in caches now or be buffered. This patch set is trying to address the issue by providing region of memory suitable for consistent DMA operations. It is supposed that such region is marked by MPU as non-cacheable. Robin suggested to advertise such memory as reserved shared-dma-pool, rather then using homebrew command line option, and extend dma-coherent to provide default DMA area in the similar way as it is done for CMA (PATCH 4/7). It allows us to offload all bookkeeping on generic coherent DMA framework, and it seems that it might be reused by other architectures like c6x and blackfin. While reviewing/testing previous versions of the patch set it turned out that dma-coherent does not take into account "dma-ranges" device tree property, so it is addressed in PATCH 3/7. For ARM, dedicated DMA region is required for cases other than: - MMU/MPU is off - cpu is v7m w/o cache support - device is coherent In case any of the above conditions is true dma operations are forced to be coherent and wired with dma_noop_ops. To make life easier NOMMU dma operations are kept in separate compilation unit. Since the issue was reported at the same time as Benjamin sent his patch [1] to allow mmap for NOMMU, his case is also addressed in this series (PATCH 1/7 and PATCH 2/7). Thanks! [1] http://www.armlinux.org.uk/developer/patches/viewpatch.php?id=8633/1 Cc: Joerg Roedel Cc: Christian Borntraeger Cc: Michal Nazarewicz Cc: Marek Szyprowski Cc: Alan Stern Cc: Yoshinori Sato Cc: Rich Felker Cc: Roger Quadros Cc: Greg Kroah-Hartman Cc: Rob Herring Cc: Mark Rutland Cc: Doug Ledford Changelog: v4 -> v5 - rebased on v4.12-rc2 - updated description for CONFIG_ARM_DMA_MEM_BUFFERABLE v3 -> v4 - rebased on v4.11-rc7 - made CONFIG_ARM_DMA_MEM_BUFFERABLE optional for CPU_V7M - added Arnd's Acked-by v2 -> v3 - fixed warnings reported by Alexandre and kbuild robot v1 -> v2 - rebased on v4.11-rc1 - added Robin's Reviewed-by - dedicated flag is introduced to use dev->dma_pfn_offset rather than mem->device_base in case memory region is configured via device tree (so Tested-by discarded there) RFC v6 -> v1 - dropped RFC tag - added Alexandre's Tested-by Vladimir Murzin (7): dma: Take into account dma_pfn_offset dma: Add simple dma_noop_mmap drivers: dma-coherent: Account dma_pfn_offset when used with device tree drivers: dma-coherent: Introduce default DMA pool ARM: NOMMU: Introduce dma operations for noMMU ARM: NOMMU: Set ARM_DMA_MEM_BUFFERABLE for M-class cpus ARM: dma-mapping: Remove traces of NOMMU code .../bindings/reserved-memory/reserved-memory.txt | 3 + arch/arm/Kconfig | 1 + arch/arm/include/asm/dma-mapping.h | 2 +- arch/arm/mm/Kconfig | 8 +- arch/arm/mm/Makefile | 5 +- arch/arm/mm/dma-mapping-nommu.c | 253 +++++++++++++++++++++ arch/arm/mm/dma-mapping.c | 29 +-- drivers/base/dma-coherent.c | 74 +++++- lib/dma-noop.c | 29 ++- 9 files changed, 359 insertions(+), 45 deletions(-) create mode 100644 arch/arm/mm/dma-mapping-nommu.c -- 2.0.0