pci: renesas: Make map address and mask power of two on Gen3
authorMarek Vasut <marek.vasut+renesas@gmail.com>
Sun, 24 Jan 2021 17:37:11 +0000 (18:37 +0100)
committerMarek Vasut <marek.vasut+renesas@gmail.com>
Sat, 20 Feb 2021 21:38:28 +0000 (22:38 +0100)
Both the map address and mask must be power of two per documentation,
adjust the code accordingly.

Signed-off-by: Marek Vasut <marek.vasut+renesas@gmail.com>
Cc: Bin Meng <bmeng.cn@gmail.com>
Cc: Nobuhiro Iwamatsu <iwamatsu@nigauri.org>
drivers/pci/pci-rcar-gen3.c

index cd116a5..6b08409 100644 (file)
@@ -23,6 +23,7 @@
 #include <pci.h>
 #include <wait_bit.h>
 #include <linux/bitops.h>
+#include <linux/log2.h>
 
 #define PCIECAR                        0x000010
 #define PCIECCTLR              0x000018
@@ -347,10 +348,12 @@ static int rcar_gen3_pcie_probe(struct udevice *dev)
                if (hose->regions[i].phys_start == 0)
                        continue;
 
-               mask = (hose->regions[i].size - 1) & ~0xf;
+               mask = (roundup_pow_of_two(hose->regions[i].size) - 1) & ~0xf;
                mask |= LAR_ENABLE;
-               writel(hose->regions[i].phys_start, priv->regs + PCIEPRAR(0));
-               writel(hose->regions[i].phys_start, priv->regs + PCIELAR(0));
+               writel(rounddown_pow_of_two(hose->regions[i].phys_start),
+                       priv->regs + PCIEPRAR(0));
+               writel(rounddown_pow_of_two(hose->regions[i].phys_start),
+                       priv->regs + PCIELAR(0));
                writel(mask, priv->regs + PCIELAMR(0));
                break;
        }