From b9616d8f903c8f4c7eac78adc7a8ff41c3099be3 Mon Sep 17 00:00:00 2001 From: Marek Vasut Date: Sat, 16 Jan 2021 00:28:18 +0100 Subject: [PATCH 1/4] pci: renesas: Add root bus handling on Gen3 Add code to access the PCIe root bus space and configure it. Signed-off-by: Marek Vasut Cc: Bin Meng Cc: Nobuhiro Iwamatsu --- drivers/pci/pci-rcar-gen3.c | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/drivers/pci/pci-rcar-gen3.c b/drivers/pci/pci-rcar-gen3.c index 0d5b01f9f8..cd116a536e 100644 --- a/drivers/pci/pci-rcar-gen3.c +++ b/drivers/pci/pci-rcar-gen3.c @@ -151,6 +151,16 @@ static int rcar_pcie_config_access(const struct udevice *udev, struct rcar_gen3_pcie_priv *priv = dev_get_plat(udev); u32 reg = where & ~3; + /* Root bus */ + if (PCI_DEV(bdf) == 0) { + if (access_type == RCAR_PCI_ACCESS_READ) + *data = readl(priv->regs + PCICONF(where / 4)); + else + writel(*data, priv->regs + PCICONF(where / 4)); + + return 0; + } + /* Clear errors */ clrbits_le32(priv->regs + PCIEERRFR, 0); @@ -187,11 +197,14 @@ static int rcar_gen3_pcie_addr_valid(pci_dev_t d, uint where) { u32 slot; + if (PCI_BUS(d)) + return -EINVAL; + if (PCI_FUNC(d)) return -EINVAL; slot = PCI_DEV(d); - if (slot != 1) + if (slot > 1) return -EINVAL; return 0; From b169ef17984ff73bee3b4e94844699893971bb8a Mon Sep 17 00:00:00 2001 From: Marek Vasut Date: Sun, 24 Jan 2021 18:37:11 +0100 Subject: [PATCH 2/4] pci: renesas: Make map address and mask power of two on Gen3 Both the map address and mask must be power of two per documentation, adjust the code accordingly. Signed-off-by: Marek Vasut Cc: Bin Meng Cc: Nobuhiro Iwamatsu --- drivers/pci/pci-rcar-gen3.c | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/drivers/pci/pci-rcar-gen3.c b/drivers/pci/pci-rcar-gen3.c index cd116a536e..6b08409b85 100644 --- a/drivers/pci/pci-rcar-gen3.c +++ b/drivers/pci/pci-rcar-gen3.c @@ -23,6 +23,7 @@ #include #include #include +#include #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; } From 06183ac5f583d6a6279dd5479cd9b44b7edd9d4c Mon Sep 17 00:00:00 2001 From: Marek Vasut Date: Sat, 16 Jan 2021 00:33:17 +0100 Subject: [PATCH 3/4] pci: renesas: Fix BAR mapping on Gen3 Because the first PCIExAR(n) register is configured with the mapping, It is the second PCIExAR(n) register that must be written with 0, not the last one. Update the n from 4 to 1 to select the correct register. Signed-off-by: Marek Vasut Cc: Bin Meng Cc: Nobuhiro Iwamatsu --- drivers/pci/pci-rcar-gen3.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/drivers/pci/pci-rcar-gen3.c b/drivers/pci/pci-rcar-gen3.c index 6b08409b85..34a561ef8b 100644 --- a/drivers/pci/pci-rcar-gen3.c +++ b/drivers/pci/pci-rcar-gen3.c @@ -358,9 +358,9 @@ static int rcar_gen3_pcie_probe(struct udevice *dev) break; } - writel(0, priv->regs + PCIEPRAR(4)); - writel(0, priv->regs + PCIELAR(4)); - writel(0, priv->regs + PCIELAMR(4)); + writel(0, priv->regs + PCIEPRAR(1)); + writel(0, priv->regs + PCIELAR(1)); + writel(0, priv->regs + PCIELAMR(1)); ret = rcar_gen3_pcie_hw_init(dev); if (ret) From c98cc9b2e8754587770d33bbd0189fefec39965a Mon Sep 17 00:00:00 2001 From: Marek Vasut Date: Sat, 16 Jan 2021 00:27:50 +0100 Subject: [PATCH 4/4] ARM: rmobile: Enable CONFIG_PCI_REGION_MULTI_ENTRY on RCar3 R-Car3 can have multiple regions of type memory in DT, enable CONFIG_PCI_REGION_MULTI_ENTRY to handle those instead of using just one of the memory regions. Signed-off-by: Marek Vasut --- configs/rcar3_salvator-x_defconfig | 1 + 1 file changed, 1 insertion(+) diff --git a/configs/rcar3_salvator-x_defconfig b/configs/rcar3_salvator-x_defconfig index ff6e0e945e..6109a23a31 100644 --- a/configs/rcar3_salvator-x_defconfig +++ b/configs/rcar3_salvator-x_defconfig @@ -71,6 +71,7 @@ CONFIG_DM_ETH=y CONFIG_RENESAS_RAVB=y CONFIG_PCI=y CONFIG_DM_PCI=y +CONFIG_PCI_REGION_MULTI_ENTRY=y CONFIG_PCI_RCAR_GEN3=y CONFIG_DM_REGULATOR=y CONFIG_DM_REGULATOR_FIXED=y