| From 13fcca8f25f4e9ce7f55da9cd353bb743236e212 Mon Sep 17 00:00:00 2001 |
| From: Rob Herring <robh@kernel.org> |
| Date: Sun, 29 Dec 2013 19:37:43 -0600 |
| Subject: Revert "of/address: Handle #address-cells > 2 specially" |
| |
| From: Rob Herring <robh@kernel.org> |
| |
| commit 13fcca8f25f4e9ce7f55da9cd353bb743236e212 upstream. |
| |
| This reverts commit e38c0a1fbc5803cbacdaac0557c70ac8ca5152e7. |
| |
| Nikita Yushchenko reports: |
| While trying to make freescale p2020ds and mpc8572ds boards working |
| with mainline kernel, I faced that commit e38c0a1f (Handle |
| |
| Both these boards have uli1575 chip. |
| Corresponding part in device tree is something like |
| |
| uli1575@0 { |
| reg = <0x0 0x0 0x0 0x0 0x0>; |
| #size-cells = <2>; |
| #address-cells = <3>; |
| ranges = <0x2000000 0x0 0x80000000 |
| 0x2000000 0x0 0x80000000 |
| 0x0 0x20000000 |
| |
| 0x1000000 0x0 0x0 |
| 0x1000000 0x0 0x0 |
| 0x0 0x10000>; |
| isa@1e { |
| ... |
| |
| I.e. it has #address-cells = <3> |
| |
| With commit e38c0a1f reverted, devices under uli1575 are registered |
| correctly, e.g. for rtc |
| |
| OF: ** translation for device /pcie@ffe09000/pcie@0/uli1575@0/isa@1e/rtc@70 ** |
| OF: bus is isa (na=2, ns=1) on /pcie@ffe09000/pcie@0/uli1575@0/isa@1e |
| OF: translating address: 00000001 00000070 |
| OF: parent bus is default (na=3, ns=2) on /pcie@ffe09000/pcie@0/uli1575@0 |
| OF: walking ranges... |
| OF: ISA map, cp=0, s=1000, da=70 |
| OF: parent translation for: 01000000 00000000 00000000 |
| OF: with offset: 70 |
| OF: one level translation: 00000000 00000000 00000070 |
| OF: parent bus is pci (na=3, ns=2) on /pcie@ffe09000/pcie@0 |
| OF: walking ranges... |
| OF: default map, cp=a0000000, s=20000000, da=70 |
| OF: default map, cp=0, s=10000, da=70 |
| OF: parent translation for: 01000000 00000000 00000000 |
| OF: with offset: 70 |
| OF: one level translation: 01000000 00000000 00000070 |
| OF: parent bus is pci (na=3, ns=2) on /pcie@ffe09000 |
| OF: walking ranges... |
| OF: PCI map, cp=0, s=10000, da=70 |
| OF: parent translation for: 01000000 00000000 00000000 |
| OF: with offset: 70 |
| OF: one level translation: 01000000 00000000 00000070 |
| OF: parent bus is default (na=2, ns=2) on / |
| OF: walking ranges... |
| OF: PCI map, cp=0, s=10000, da=70 |
| OF: parent translation for: 00000000 ffc10000 |
| OF: with offset: 70 |
| OF: one level translation: 00000000 ffc10070 |
| OF: reached root node |
| |
| With commit e38c0a1f in place, address translation fails: |
| |
| OF: ** translation for device /pcie@ffe09000/pcie@0/uli1575@0/isa@1e/rtc@70 ** |
| OF: bus is isa (na=2, ns=1) on /pcie@ffe09000/pcie@0/uli1575@0/isa@1e |
| OF: translating address: 00000001 00000070 |
| OF: parent bus is default (na=3, ns=2) on /pcie@ffe09000/pcie@0/uli1575@0 |
| OF: walking ranges... |
| OF: ISA map, cp=0, s=1000, da=70 |
| OF: parent translation for: 01000000 00000000 00000000 |
| OF: with offset: 70 |
| OF: one level translation: 00000000 00000000 00000070 |
| OF: parent bus is pci (na=3, ns=2) on /pcie@ffe09000/pcie@0 |
| OF: walking ranges... |
| OF: default map, cp=a0000000, s=20000000, da=70 |
| OF: default map, cp=0, s=10000, da=70 |
| OF: not found ! |
| |
| Thierry Reding confirmed this commit was not needed after all: |
| "We ended up merging a different address representation for Tegra PCIe |
| and I've confirmed that reverting this commit doesn't cause any obvious |
| regressions. I think all other drivers in drivers/pci/host ended up |
| copying what we did on Tegra, so I wouldn't expect any other breakage |
| either." |
| |
| There doesn't appear to be a simple way to support both behaviours, so |
| reverting this as nothing should be depending on the new behaviour. |
| |
| Signed-off-by: Rob Herring <robh@kernel.org> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| |
| --- |
| drivers/of/address.c | 8 -------- |
| 1 file changed, 8 deletions(-) |
| |
| --- a/drivers/of/address.c |
| +++ b/drivers/of/address.c |
| @@ -69,14 +69,6 @@ static u64 of_bus_default_map(__be32 *ad |
| (unsigned long long)cp, (unsigned long long)s, |
| (unsigned long long)da); |
| |
| - /* |
| - * If the number of address cells is larger than 2 we assume the |
| - * mapping doesn't specify a physical address. Rather, the address |
| - * specifies an identifier that must match exactly. |
| - */ |
| - if (na > 2 && memcmp(range, addr, na * 4) != 0) |
| - return OF_BAD_ADDR; |
| - |
| if (da < cp || da >= (cp + s)) |
| return OF_BAD_ADDR; |
| return da - cp; |