[PATCH] arm64: mm: fix DMA zone when dma-ranges is missing
Baruch Siach
baruch at tkos.co.il
Tue Aug 27 21:14:56 PDT 2024
Hi Robin,
On Tue, Aug 27 2024, Robin Murphy wrote:
> On 2024-08-27 9:44 am, Baruch Siach wrote:
>> Some platforms, like Rockchip RK3568 based Odroid M1, do not provide DMA
>> limits information in device-tree dma-ranges property. Still some device
>> drivers set DMA limit that relies on DMA zone at low 4GB memory area.
>> Until commit ba0fb44aed47 ("dma-mapping: replace zone_dma_bits by
>> zone_dma_limit"), zone_sizes_init() restricted DMA zone to low 32-bit
>> when there is RAM there.
>> Restore DMA zone 32-bit limit for platforms that have RAM in this area.
>> Fixes: ba0fb44aed47 ("dma-mapping: replace zone_dma_bits by zone_dma_limit")
>> Reported-by: Marek Szyprowski <m.szyprowski at samsung.com>
>> Tested-by: Marek Szyprowski <m.szyprowski at samsung.com>
>> Signed-off-by: Baruch Siach <baruch at tkos.co.il>
>> ---
>> This should go via the dma-mapping tree that contains the fixed commit.
>> ---
>> arch/arm64/mm/init.c | 3 +++
>> 1 file changed, 3 insertions(+)
>> diff --git a/arch/arm64/mm/init.c b/arch/arm64/mm/init.c
>> index bfb10969cbf0..7fcd0aaa9bb6 100644
>> --- a/arch/arm64/mm/init.c
>> +++ b/arch/arm64/mm/init.c
>> @@ -116,6 +116,9 @@ static void __init arch_reserve_crashkernel(void)
>> static phys_addr_t __init max_zone_phys(phys_addr_t zone_limit)
>> {
>> + if (memblock_start_of_DRAM() < U32_MAX)
>> + zone_limit = min(zone_limit, U32_MAX);
>
> This seems like a bit of a bodge, since it now means we either get the old or
> the new behaviour depending on where DRAM is, so if, say, RAM starts at 3GB
> but all devices have a 3GB DMA offset, we still can't have a properly-sized
> DMA zone.
I'm not following your example here. What is "3GB DMA offset"? Is it
relative to 0? Relative to start of RAM?
> Really it comes down to this change:
>
> - zone_dma_bits = min3(32U, dt_zone_dma_bits, acpi_zone_dma_bits);
> + zone_dma_limit = min(dt_zone_dma_limit, acpi_zone_dma_limit);
>
> where although the "32" represented the assumption of RAM starting at 0, it
> also implicitly removed the handling of the case where no DMA ranges are
> specified. Per the commit message, it's that which we want to account for, not
> the placement of RAM.
>
> I think the more correct version should be:
>
> if (zone_limit == PHYS_ADDR_MAX)
> zone_limit = U32_MAX;
I like your proposal. The condition of no dma-ranges data is explicit.
I'll post v2 later today.
Thanks,
baruch
--
~. .~ Tk Open Systems
=}------------------------------------------------ooO--U--Ooo------------{=
- baruch at tkos.co.il - tel: +972.52.368.4656, http://www.tkos.co.il -
More information about the linux-arm-kernel
mailing list