Message ID | 20200227115146.24515-1-m.szyprowski@samsung.com (mailing list archive) |
---|---|
State | Mainlined, archived |
Commit | 73a7a271b3eee7b83f29b13866163776f1cbef89 |
Delegated to: | Lorenzo Pieralisi |
Headers | show |
Series | pci: brcmstb: Fix build on 32bit ARM platforms with older compilers | expand |
On Thu, 2020-02-27 at 12:51 +0100, Marek Szyprowski wrote: > Some older compilers have no implementation for the helper for 64-bit > unsigned division/modulo, so linking pcie-brcmstb driver causes the > "undefined reference to `__aeabi_uldivmod'" error. > > *rc_bar2_size is always a power of two, because it is calculated as: > "1ULL << fls64(entry->res->end - entry->res->start)", so the modulo > operation in the subsequent check can be replaced by a simple logical > AND with a proper mask. > > Signed-off-by: Marek Szyprowski <m.szyprowski@samsung.com> Acked-by: Nicolas Saenz Julienne <nsaenzjulienne@suse.de> Thanks! Nicolas
Subject should be: PCI: brcmstb: Fix build on 32bit ARM platforms with older compilers On Thu, Feb 27, 2020 at 12:51:46PM +0100, Marek Szyprowski wrote: > Some older compilers have no implementation for the helper for 64-bit > unsigned division/modulo, so linking pcie-brcmstb driver causes the > "undefined reference to `__aeabi_uldivmod'" error. > > *rc_bar2_size is always a power of two, because it is calculated as: > "1ULL << fls64(entry->res->end - entry->res->start)", so the modulo > operation in the subsequent check can be replaced by a simple logical > AND with a proper mask. > Add a Fixes: tag please. Fixes: c0452137034b ("PCI: brcmstb: Add Broadcom STB PCIe host controller driver") > Signed-off-by: Marek Szyprowski <m.szyprowski@samsung.com> > --- > drivers/pci/controller/pcie-brcmstb.c | 2 +- > 1 file changed, 1 insertion(+), 1 deletion(-) Hi Bjorn, I think this should be merged in one of the upcoming -rc, given that it fixes v5.6 material. Here is my ACK to that end, if you prefer postponing it to v5.7 please let me know. Acked-by: Lorenzo Pieralisi <lorenzo.pieralisi@arm.com> > diff --git a/drivers/pci/controller/pcie-brcmstb.c b/drivers/pci/controller/pcie-brcmstb.c > index d20aabc26273..3a10e678c7f4 100644 > --- a/drivers/pci/controller/pcie-brcmstb.c > +++ b/drivers/pci/controller/pcie-brcmstb.c > @@ -670,7 +670,7 @@ static inline int brcm_pcie_get_rc_bar2_size_and_offset(struct brcm_pcie *pcie, > * outbound memory @ 3GB). So instead it will start at the 1x > * multiple of its size > */ > - if (!*rc_bar2_size || *rc_bar2_offset % *rc_bar2_size || > + if (!*rc_bar2_size || (*rc_bar2_offset & (*rc_bar2_size - 1)) || > (*rc_bar2_offset < SZ_4G && *rc_bar2_offset > SZ_2G)) { > dev_err(dev, "Invalid rc_bar2_offset/size: size 0x%llx, off 0x%llx\n", > *rc_bar2_size, *rc_bar2_offset); > -- > 2.17.1 >
On Thu, Feb 27, 2020 at 12:51:46PM +0100, Marek Szyprowski wrote: > Some older compilers have no implementation for the helper for 64-bit > unsigned division/modulo, so linking pcie-brcmstb driver causes the > "undefined reference to `__aeabi_uldivmod'" error. > > *rc_bar2_size is always a power of two, because it is calculated as: > "1ULL << fls64(entry->res->end - entry->res->start)", so the modulo > operation in the subsequent check can be replaced by a simple logical > AND with a proper mask. > > Signed-off-by: Marek Szyprowski <m.szyprowski@samsung.com> Applied to for-linus for v5.6, thanks! I added acks from Nicolas and Lorenzo and also the Fixes: tag from Lorenzo. > --- > drivers/pci/controller/pcie-brcmstb.c | 2 +- > 1 file changed, 1 insertion(+), 1 deletion(-) > > diff --git a/drivers/pci/controller/pcie-brcmstb.c b/drivers/pci/controller/pcie-brcmstb.c > index d20aabc26273..3a10e678c7f4 100644 > --- a/drivers/pci/controller/pcie-brcmstb.c > +++ b/drivers/pci/controller/pcie-brcmstb.c > @@ -670,7 +670,7 @@ static inline int brcm_pcie_get_rc_bar2_size_and_offset(struct brcm_pcie *pcie, > * outbound memory @ 3GB). So instead it will start at the 1x > * multiple of its size > */ > - if (!*rc_bar2_size || *rc_bar2_offset % *rc_bar2_size || > + if (!*rc_bar2_size || (*rc_bar2_offset & (*rc_bar2_size - 1)) || > (*rc_bar2_offset < SZ_4G && *rc_bar2_offset > SZ_2G)) { > dev_err(dev, "Invalid rc_bar2_offset/size: size 0x%llx, off 0x%llx\n", > *rc_bar2_size, *rc_bar2_offset); > -- > 2.17.1 >
diff --git a/drivers/pci/controller/pcie-brcmstb.c b/drivers/pci/controller/pcie-brcmstb.c index d20aabc26273..3a10e678c7f4 100644 --- a/drivers/pci/controller/pcie-brcmstb.c +++ b/drivers/pci/controller/pcie-brcmstb.c @@ -670,7 +670,7 @@ static inline int brcm_pcie_get_rc_bar2_size_and_offset(struct brcm_pcie *pcie, * outbound memory @ 3GB). So instead it will start at the 1x * multiple of its size */ - if (!*rc_bar2_size || *rc_bar2_offset % *rc_bar2_size || + if (!*rc_bar2_size || (*rc_bar2_offset & (*rc_bar2_size - 1)) || (*rc_bar2_offset < SZ_4G && *rc_bar2_offset > SZ_2G)) { dev_err(dev, "Invalid rc_bar2_offset/size: size 0x%llx, off 0x%llx\n", *rc_bar2_size, *rc_bar2_offset);
Some older compilers have no implementation for the helper for 64-bit unsigned division/modulo, so linking pcie-brcmstb driver causes the "undefined reference to `__aeabi_uldivmod'" error. *rc_bar2_size is always a power of two, because it is calculated as: "1ULL << fls64(entry->res->end - entry->res->start)", so the modulo operation in the subsequent check can be replaced by a simple logical AND with a proper mask. Signed-off-by: Marek Szyprowski <m.szyprowski@samsung.com> --- drivers/pci/controller/pcie-brcmstb.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)