Thread (22 messages) 22 messages, 5 authors, 2019-08-08

Re: [PATCH 3/8] of/fdt: add function to get the SoC wide DMA addressable memory size

From: Nicolas Saenz Julienne <hidden>
Date: 2019-08-08 17:30:48
Also in: linux-devicetree, linux-iommu, linux-mm, lkml

On Thu, 2019-08-08 at 09:02 -0600, Rob Herring wrote:
On Tue, Aug 6, 2019 at 12:12 PM Nicolas Saenz Julienne
[off-list ref] wrote:
quoted
Hi Rob,

On Mon, 2019-08-05 at 13:23 -0600, Rob Herring wrote:
quoted
On Mon, Aug 5, 2019 at 10:03 AM Nicolas Saenz Julienne
[off-list ref] wrote:
quoted
Hi Rob,
Thanks for the review!

On Fri, 2019-08-02 at 11:17 -0600, Rob Herring wrote:
quoted
On Wed, Jul 31, 2019 at 9:48 AM Nicolas Saenz Julienne
[off-list ref] wrote:
quoted
Some SoCs might have multiple interconnects each with their own DMA
addressing limitations. This function parses the 'dma-ranges' on
each of
them and tries to guess the maximum SoC wide DMA addressable memory
size.

This is specially useful for arch code in order to properly setup
CMA
and memory zones.
We already have a way to setup CMA in reserved-memory, so why is this
needed for that?
Correct me if I'm wrong but I got the feeling you got the point of the
patch
later on.
No, for CMA I don't. Can't we already pass a size and location for CMA
region under /reserved-memory. The only advantage here is perhaps the
CMA range could be anywhere in the DMA zone vs. a fixed location.
Now I get it, sorry I wasn't aware of that interface.

Still, I'm not convinced it matches RPi's use case as this would hard-code
CMA's size. Most people won't care, but for the ones that do, it's nicer to
change the value from the kernel command line than editing the dtb.
Sure, I fully agree and am not a fan of the CMA DT overlays I've seen.
quoted
I get that
if you need to, for example, reserve some memory for the video to work, it's
silly not to hard-code it. Yet due to the board's nature and users base I
say
it's important to favor flexibility. It would also break compatibility with
earlier versions of the board and diverge from the downstream kernel
behaviour.
Which is a bigger issue than it seems as most users don't always understand
which kernel they are running and unknowingly copy configuration options
from
forums.

As I also need to know the DMA addressing limitations to properly configure
memory zones and dma-direct. Setting up the proper CMA constraints during
the
arch's init will be trivial anyway.
It was really just commentary on commit text as for CMA alone we have
a solution already. I agree on the need for zones.
Ok, understood :)
quoted
quoted
quoted
quoted
IMO, I'd just do:

if (of_fdt_machine_is_compatible(blob, "brcm,bcm2711"))
    dma_zone_size = XX;

2 lines of code is much easier to maintain than 10s of incomplete code
and is clearer who needs this. Maybe if we have dozens of SoCs with
this problem we should start parsing dma-ranges.
FYI that's what arm32 is doing at the moment and was my first instinct.
But
it
seems that arm64 has been able to survive so far without any machine
specific
code and I have the feeling Catalin and Will will not be happy about
this
solution. Am I wrong?
No doubt. I'm fine if the 2 lines live in drivers/of/.

Note that I'm trying to reduce the number of early_init_dt_scan_*
calls from arch code into the DT code so there's more commonality
across architectures in the early DT scans. So ideally, this can all
be handled under early_init_dt_scan() call.
How does this look? (I'll split it in two patches and add a comment
explaining
why dt_dma_zone_size is needed)
diff --git a/drivers/of/fdt.c b/drivers/of/fdt.c
index f2444c61a136..1395be40b722 100644
--- a/drivers/of/fdt.c
+++ b/drivers/of/fdt.c
@@ -30,6 +30,8 @@

 #include "of_private.h"

+u64 dt_dma_zone_size __ro_after_init;
Avoiding a call from arch code by just having a variable isn't really
better. I'd rather see a common, non DT specific variable that can be
adjusted. Something similar to initrd_start/end. Then the arch code
doesn't have to care what hardware description code adjusted the
value.
Way better, I'll update it.
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help