[<prev] [next>] [day] [month] [year] [list]
Message-ID: <cover.1723357023.git.baruchs-c@neureality.ai>
Date: Sun, 11 Aug 2024 09:25:38 +0300
From: Baruch Siach <baruch@...s.co.il>
To: Christoph Hellwig <hch@....de>,
Marek Szyprowski <m.szyprowski@...sung.com>,
Catalin Marinas <catalin.marinas@....com>,
Will Deacon <will@...nel.org>
Cc: Baruch Siach <baruchs-c@...reality.ai>,
Robin Murphy <robin.murphy@....com>,
iommu@...ts.linux.dev,
linux-arm-kernel@...ts.infradead.org,
linux-kernel@...r.kernel.org,
linuxppc-dev@...ts.ozlabs.org,
linux-s390@...r.kernel.org,
Petr Tesařík <petr@...arici.cz>,
Ramon Fried <ramon@...reality.ai>,
Elad Nachman <enachman@...vell.com>
Subject: [PATCH v6 0/2] dma: support DMA zone starting above 4GB
From: Baruch Siach <baruchs-c@...reality.ai>
DMA zones code assumes that DMA lower limit is zero. When there is no RAM
below 4GB, arm64 platform code sets DMA/DMA32 zone limits to cover the entire
RAM[0].
My target platform has RAM starting at 32GB. Devices with 30-bit DMA mask are
mapped to 1GB at the bottom of RAM, between 32GB - 33GB. DMA zone over the
entire RAM breaks DMA allocation for these devices.
In response to a previous RFC hack[1] Catalin Marinas suggested to add a
separate offset value as base address for the DMA zone, and then refined the
suggestion to use start of RAM[3]. This series attempts to implement that
suggestion.
With this series applied, the DMA zone covers the right RAM range for my
platform.
v6:
* Drop the first patch; existing logic is just fine
* Modify powerpc code to avoid off by one issue
v5:
* Test the correct kernel
* Add missing patch that actually makes DMA zone work
* Extend the treatment of zone_dma_limit > DMA_BIT_MASK(32)
* Use max() to make the code somewhat more readable
* Change zone_dma_limit type to u64 to match DMA_BIT_MASK()
v4:
* Drop last patch. zone_dma_limit includes RAM base address.
* Adjust DMA zone selection in swiotlb as well.
* Don't change max_zone_phys() behaviour
* Update code to fallback to DMA zone when zone_dma_limit > DMA_BIT_MASK(32)
v3:
* Rebase on v6.11-rc1.
* Drop zone_dma_base. Use memblock_start_of_DRAM() instead.
* Drop DT patches. Low DMA range limit no longer needed.
* Add patch to improve dma_direct_optimal_gfp_mask() heuristics as Catalin
suggested.
RFC v2:
* Add patch from Catalin[2] changing zone_dma_bits to zone_dma_limit to
simplify subsequent patches
* Test on real hardware
RFC v1: https://lore.kernel.org/all/cover.1703683642.git.baruch@tkos.co.il/
[0] See commit 791ab8b2e3db ("arm64: Ignore any DMA offsets in the
max_zone_phys() calculation")
[1] https://lore.kernel.org/all/9af8a19c3398e7dc09cfc1fbafed98d795d9f83e.1699464622.git.baruch@tkos.co.il/
[2] https://lore.kernel.org/all/ZZ2HnHJV3gdzu1Aj@arm.com/
[3] https://lore.kernel.org/all/ZnH-VU2iz9Q2KLbr@arm.com/
Catalin Marinas (2):
dma: replace zone_dma_bits by zone_dma_limit
arm64: support DMA zone above 4GB
arch/arm64/mm/init.c | 32 ++++++++++----------------------
arch/powerpc/mm/mem.c | 5 ++++-
arch/s390/mm/init.c | 2 +-
include/linux/dma-direct.h | 2 +-
kernel/dma/direct.c | 6 +++---
kernel/dma/pool.c | 4 ++--
kernel/dma/swiotlb.c | 6 +++---
7 files changed, 24 insertions(+), 33 deletions(-)
base-commit: 8400291e289ee6b2bf9779ff1c83a291501f017b
--
2.43.0
Powered by blists - more mailing lists