Thread (30 messages) 30 messages, 7 authors, 2020-10-12

Re: [PATCH 1/4] of/fdt: Update zone_dma_bits when running in bcm2711

From: Ard Biesheuvel <ardb@kernel.org>
Date: 2020-10-09 09:14:14
Also in: linux-devicetree, linux-iommu, linux-mm, lkml

On Fri, 9 Oct 2020 at 10:36, Nicolas Saenz Julienne
[off-list ref] wrote:
On Fri, 2020-10-09 at 09:37 +0200, Ard Biesheuvel wrote:
quoted
On Fri, 9 Oct 2020 at 09:11, Christoph Hellwig [off-list ref] wrote:
quoted
On Thu, Oct 08, 2020 at 12:05:25PM +0200, Nicolas Saenz Julienne wrote:
quoted
Sadly I just realised that the series is incomplete, we have RPi4 users that
want to boot unsing ACPI, and this series would break things for them. I'll
have a word with them to see what we can do for their use-case.
Stupid question:  why do these users insist on a totally unsuitable
interface? And why would we as Linux developers care to support such
a aims?
The point is really whether we want to revert changes in Linux that
made both DT and ACPI boot work without quirks on RPi4.
Well, and broke a big amount of devices that were otherwise fine.
Yeah that was unfortunate.
quoted
Having to check the RPi4 compatible string or OEM id in core init code is
awful, regardless of whether you boot via ACPI or via DT.

The problem with this hardware is that it uses a DMA mask which is
narrower than 32, and the arm64 kernel is simply not set up to deal
with that at all. On DT, we have DMA ranges properties and the likes
to describe such limitations, on ACPI we have _DMA methods as well as
DMA range attributes in the IORT, both of which are now handled
correctly. So all the information is there, we just have to figure out
how to consume it early on.
Is it worth the effort just for a single board? I don't know about ACPI but
parsing dma-ranges that early at boot time is not trivial. My intuition tells
me that it'd be even harder for ACPI, being a more complex data structure.
Yes, it will be harder, especially for the _DMA methods.
quoted
Interestingly, this limitation always existed in the SoC, but it
wasn't until they started shipping it with more than 1 GB of DRAM that
it became a problem. This means issues like this could resurface in
the future with existing SoCs when they get shipped with more memory,
and so I would prefer fixing this in a generic way.
Actually what I proposed here is pretty generic. Specially from arm64's
perspective. We call early_init_dt_scan(), which sets up zone_dma_bits based on
whatever it finds in DT. Both those operations are architecture independent.
arm64 arch code doesn't care about the logic involved in ascertaining
zone_dma_bits. I get that the last step isn't generic. But it's all setup so as
to make it as such whenever it's worth the effort.
The problem is that, while we are providing a full description of the
SoC's capabilities, we short circuit this by inserting knowledge into
the code (that is shared between all DT architectures) that
"brcm,bcm2711" is special, and needs a DMA zone override.

I think for ACPI boot, we might be able to work around this by cold
plugging the memory above 1 GB, but I have to double check whether it
won't get pulled into ZONE_DMA32 anyway (unless anyone can answer that
for me here from the top of their head)

_______________________________________________
linux-arm-kernel mailing list
linux-arm-kernel@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/linux-arm-kernel
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help