[PATCH v2 1/2] of: addr: Translate 'dma-ranges' for parent nodes missing 'dma-ranges'

'dma-ranges' frequently exists without parent nodes having 'dma-ranges'. While this is an error for 'ranges', this is fine because DMA capable devices always have a translatable DMA address. Also, with no 'dma-ranges' at all, the assumption is that DMA addresses are 1:1 with no restrictions unless perhaps the device itself has implicit restrictions.
This keeps in sync with Linux kernel commit:
81db12ee15cb: of/address: Translate 'dma-ranges' for parent nodes missing 'dma-ranges'
Signed-off-by: Bin Meng bmeng.cn@gmail.com Reviewed-by: Simon Glass sjg@chromium.org
---
Changes in v2: - rebase on top of Dario's revert patch: http://patchwork.ozlabs.org/project/uboot/patch/20210425141746.19115-6-dario... - drop commit "of: addr: Abort address translation for parent nodes missing 'ranges'", as the revert patch restores the abort behavior
drivers/core/of_addr.c | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-)
diff --git a/drivers/core/of_addr.c b/drivers/core/of_addr.c index 9b77308182..a3af48fd88 100644 --- a/drivers/core/of_addr.c +++ b/drivers/core/of_addr.c @@ -192,9 +192,13 @@ static int of_translate_one(const struct device_node *parent, * * As far as we know, this damage only exists on Apple machines, so * This code is only enabled on powerpc. --gcl + * + * This quirk also applies for 'dma-ranges' which frequently exist in + * child nodes without 'dma-ranges' in the parent nodes. --RobH */ ranges = of_get_property(parent, rprop, &rlen); - if (ranges == NULL && !of_empty_ranges_quirk(parent)) { + if (ranges == NULL && !of_empty_ranges_quirk(parent) && + strcmp(rprop, "dma-ranges")) { debug("no ranges; cannot translate\n"); return 1; }

In of_get_address(), there is:
dev_count_cells(dev, &na, &ns);
followed by:
bus->count_cells(dev, &na, &ns);
but no codes in between use na/ns, hence the first call is useless. By dropping the first call, dev_count_cells() is now useless too.
Signed-off-by: Bin Meng bmeng.cn@gmail.com
---
Changes in v2: - new patch: of: addr: Remove call to dev_count_cells() in of_get_address()
drivers/core/of_addr.c | 6 ------ 1 file changed, 6 deletions(-)
diff --git a/drivers/core/of_addr.c b/drivers/core/of_addr.c index a3af48fd88..3fbc0a7afa 100644 --- a/drivers/core/of_addr.c +++ b/drivers/core/of_addr.c @@ -118,11 +118,6 @@ static struct of_bus *of_match_bus(struct device_node *np) return NULL; }
-static void dev_count_cells(const struct device_node *np, int *nap, int *nsp) -{ - of_bus_default_count_cells(np, nap, nsp); -} - const __be32 *of_get_address(const struct device_node *dev, int index, u64 *size, unsigned int *flags) { @@ -136,7 +131,6 @@ const __be32 *of_get_address(const struct device_node *dev, int index, parent = of_get_parent(dev); if (parent == NULL) return NULL; - dev_count_cells(dev, &na, &ns); bus = of_match_bus(parent); bus->count_cells(dev, &na, &ns); of_node_put(parent);

On Fri, 30 Apr 2021 at 07:17, Bin Meng bmeng.cn@gmail.com wrote:
In of_get_address(), there is:
dev_count_cells(dev, &na, &ns);
followed by:
bus->count_cells(dev, &na, &ns);
but no codes in between use na/ns, hence the first call is useless. By dropping the first call, dev_count_cells() is now useless too.
Signed-off-by: Bin Meng bmeng.cn@gmail.com
Changes in v2:
- new patch: of: addr: Remove call to dev_count_cells() in of_get_address()
drivers/core/of_addr.c | 6 ------ 1 file changed, 6 deletions(-)
Reviewed-by: Simon Glass sjg@chromium.org
I wonder why this is now different from linux?

Hi Simon,
On Sat, May 1, 2021 at 2:14 AM Simon Glass sjg@chromium.org wrote:
On Fri, 30 Apr 2021 at 07:17, Bin Meng bmeng.cn@gmail.com wrote:
In of_get_address(), there is:
dev_count_cells(dev, &na, &ns);
followed by:
bus->count_cells(dev, &na, &ns);
but no codes in between use na/ns, hence the first call is useless. By dropping the first call, dev_count_cells() is now useless too.
Signed-off-by: Bin Meng bmeng.cn@gmail.com
Changes in v2:
- new patch: of: addr: Remove call to dev_count_cells() in of_get_address()
drivers/core/of_addr.c | 6 ------ 1 file changed, 6 deletions(-)
Reviewed-by: Simon Glass sjg@chromium.org
I wonder why this is now different from linux?
With this patch, the code flow is the same as Linux.
Regards, Bin

Hi Simon,
On Sat, May 1, 2021 at 2:14 AM Simon Glass sjg@chromium.org wrote:
On Fri, 30 Apr 2021 at 07:17, Bin Meng bmeng.cn@gmail.com wrote:
In of_get_address(), there is:
dev_count_cells(dev, &na, &ns);
followed by:
bus->count_cells(dev, &na, &ns);
but no codes in between use na/ns, hence the first call is useless. By dropping the first call, dev_count_cells() is now useless too.
Signed-off-by: Bin Meng bmeng.cn@gmail.com
Changes in v2:
- new patch: of: addr: Remove call to dev_count_cells() in of_get_address()
drivers/core/of_addr.c | 6 ------ 1 file changed, 6 deletions(-)
Reviewed-by: Simon Glass sjg@chromium.org
I wonder why this is now different from linux?
With this patch, the code flow is the same as Linux.
Regards, Bin
Applied to u-boot-dm, thanks!

Hi Simon,
On Fri, Apr 30, 2021 at 9:17 PM Bin Meng bmeng.cn@gmail.com wrote:
'dma-ranges' frequently exists without parent nodes having 'dma-ranges'. While this is an error for 'ranges', this is fine because DMA capable devices always have a translatable DMA address. Also, with no 'dma-ranges' at all, the assumption is that DMA addresses are 1:1 with no restrictions unless perhaps the device itself has implicit restrictions.
This keeps in sync with Linux kernel commit:
81db12ee15cb: of/address: Translate 'dma-ranges' for parent nodes missing 'dma-ranges'
Signed-off-by: Bin Meng bmeng.cn@gmail.com Reviewed-by: Simon Glass sjg@chromium.org
Changes in v2:
- rebase on top of Dario's revert patch: http://patchwork.ozlabs.org/project/uboot/patch/20210425141746.19115-6-dario...
The above dependent patch is now in u-boot/master.
Could you please apply this series?
- drop commit "of: addr: Abort address translation for parent nodes missing 'ranges'", as the revert patch restores the abort behavior
drivers/core/of_addr.c | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-)
Regards, Bin

On Mon, May 17, 2021 at 10:03 AM Bin Meng bmeng.cn@gmail.com wrote:
Hi Simon,
On Fri, Apr 30, 2021 at 9:17 PM Bin Meng bmeng.cn@gmail.com wrote:
'dma-ranges' frequently exists without parent nodes having 'dma-ranges'. While this is an error for 'ranges', this is fine because DMA capable devices always have a translatable DMA address. Also, with no 'dma-ranges' at all, the assumption is that DMA addresses are 1:1 with no restrictions unless perhaps the device itself has implicit restrictions.
This keeps in sync with Linux kernel commit:
81db12ee15cb: of/address: Translate 'dma-ranges' for parent nodes missing 'dma-ranges'
Signed-off-by: Bin Meng bmeng.cn@gmail.com Reviewed-by: Simon Glass sjg@chromium.org
Changes in v2:
- rebase on top of Dario's revert patch: http://patchwork.ozlabs.org/project/uboot/patch/20210425141746.19115-6-dario...
The above dependent patch is now in u-boot/master.
Could you please apply this series?
Ping?

Hi Bin,
On Fri, 4 Jun 2021 at 00:11, Bin Meng bmeng.cn@gmail.com wrote:
On Mon, May 17, 2021 at 10:03 AM Bin Meng bmeng.cn@gmail.com wrote:
Hi Simon,
On Fri, Apr 30, 2021 at 9:17 PM Bin Meng bmeng.cn@gmail.com wrote:
'dma-ranges' frequently exists without parent nodes having 'dma-ranges'. While this is an error for 'ranges', this is fine because DMA capable devices always have a translatable DMA address. Also, with no 'dma-ranges' at all, the assumption is that DMA addresses are 1:1 with no restrictions unless perhaps the device itself has implicit restrictions.
This keeps in sync with Linux kernel commit:
81db12ee15cb: of/address: Translate 'dma-ranges' for parent nodes missing 'dma-ranges'
Signed-off-by: Bin Meng bmeng.cn@gmail.com Reviewed-by: Simon Glass sjg@chromium.org
Changes in v2:
- rebase on top of Dario's revert patch: http://patchwork.ozlabs.org/project/uboot/patch/20210425141746.19115-6-dario...
The above dependent patch is now in u-boot/master.
Could you please apply this series?
Ping?
OK I am taking a look.
Regards, Simon

Hi Bin,
On Fri, 4 Jun 2021 at 00:11, Bin Meng bmeng.cn@gmail.com wrote:
On Mon, May 17, 2021 at 10:03 AM Bin Meng bmeng.cn@gmail.com wrote:
Hi Simon,
On Fri, Apr 30, 2021 at 9:17 PM Bin Meng bmeng.cn@gmail.com wrote:
'dma-ranges' frequently exists without parent nodes having 'dma-ranges'. While this is an error for 'ranges', this is fine because DMA capable devices always have a translatable DMA address. Also, with no 'dma-ranges' at all, the assumption is that DMA addresses are 1:1 with no restrictions unless perhaps the device itself has implicit restrictions.
This keeps in sync with Linux kernel commit:
81db12ee15cb: of/address: Translate 'dma-ranges' for parent nodes missing 'dma-ranges'
Signed-off-by: Bin Meng bmeng.cn@gmail.com Reviewed-by: Simon Glass sjg@chromium.org
Changes in v2:
- rebase on top of Dario's revert patch: http://patchwork.ozlabs.org/project/uboot/patch/20210425141746.19115-6-dario...
The above dependent patch is now in u-boot/master.
Could you please apply this series?
Ping?
OK I am taking a look.
Regards, Simon
Applied to u-boot-dm, thanks!
participants (2)
-
Bin Meng
-
Simon Glass