[<prev] [next>] [thread-next>] [day] [month] [year] [list]
Message-ID: <cover.1722578375.git.baruch@tkos.co.il>
Date: Fri,  2 Aug 2024 09:03:45 +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 <baruch@...s.co.il>,
	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 v5 0/3] dma: support DMA zone starting above 4GB
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.
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/
Baruch Siach (1):
  dma: improve DMA zone selection
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      |  9 ++++-----
 arch/s390/mm/init.c        |  2 +-
 include/linux/dma-direct.h |  2 +-
 kernel/dma/direct.c        | 10 +++++-----
 kernel/dma/pool.c          |  4 ++--
 kernel/dma/swiotlb.c       |  8 ++++----
 7 files changed, 27 insertions(+), 40 deletions(-)
base-commit: 8400291e289ee6b2bf9779ff1c83a291501f017b
-- 
2.43.0
Powered by blists - more mailing lists
 
