tegra: pcie: Fix individual port detection on T20
Jay Agarwal [Mon, 27 Feb 2012 14:49:20 +0000 (19:49 +0530)]
This commit fix two issues.
1. MMIO space should be reserved for T30 as well
2. There is a bug in link reset sequence causing
   problem in detecting the other slot as well
   on T20

bug 826956
bug 637871

Reviewed-on: http://git-master/r/66814
(cherry picked from commit 11ce98902d0687646eb30a4bd1f9a1d5e8da34ce)

Change-Id: I1843e3a1d897a36768b05b33ab7624889191d011
Signed-off-by: Manoj Chourasia <mchourasia@nvidia.com>
Reviewed-on: http://git-master/r/86134
Reviewed-by: Simone Willett <swillett@nvidia.com>
Tested-by: Simone Willett <swillett@nvidia.com>

arch/arm/mach-tegra/pcie.c

index e16910c..462142f 100644 (file)
 #define MMIO_BASE              (TEGRA_PCIE_BASE + SZ_4M)
 #define MMIO_SIZE              SZ_64K
 #define MEM_BASE_0             (TEGRA_PCIE_BASE + SZ_256M)
-#define MEM_SIZE_0             SZ_128M
-#define MEM_BASE_1             (MEM_BASE_0 + MEM_SIZE_0)
-#define MEM_SIZE_1             SZ_128M
-#define MEM_SIZE               (MEM_SIZE_0 + MEM_SIZE_1)
-#define PREFETCH_MEM_BASE_0    (MEM_BASE_1 + MEM_SIZE_1)
-#define PREFETCH_MEM_SIZE_0    SZ_128M
-#define PREFETCH_MEM_BASE_1    (PREFETCH_MEM_BASE_0 + PREFETCH_MEM_SIZE_0)
-#define PREFETCH_MEM_SIZE_1    SZ_128M
-#define PREFETCH_MEM_SIZE      (PREFETCH_MEM_SIZE_0 + PREFETCH_MEM_SIZE_1)
+#define MEM_SIZE               SZ_256M
+#define PREFETCH_MEM_BASE_0    (MEM_BASE_0 + MEM_SIZE)
+#define PREFETCH_MEM_SIZE      SZ_512M
 
 #else
 
@@ -992,6 +986,7 @@ static int __init tegra_pcie_get_resources(void)
                goto err_map_reg;
        }
        res_mmio = &tegra_pcie.res_mmio;
+
        err = request_resource(&iomem_resource, res_mmio);
        if (err) {
                pr_err("PCIE: Failed to request resources: %d\n", err);
@@ -1045,6 +1040,13 @@ static bool tegra_pcie_check_link(struct tegra_pcie_port *pp, int idx,
        int timeout;
 
        do {
+               /* Pulse the PEX reset */
+               reg = afi_readl(reset_reg) & ~AFI_PEX_CTRL_RST;
+               afi_writel(reg, reset_reg);
+               mdelay(1);
+               reg = afi_readl(reset_reg) | AFI_PEX_CTRL_RST;
+               afi_writel(reg, reset_reg);
+
                timeout = TEGRA_PCIE_LINKUP_TIMEOUT;
                while (timeout) {
                        reg = readl(pp->base + RP_VEND_XP);
@@ -1073,13 +1075,6 @@ static bool tegra_pcie_check_link(struct tegra_pcie_port *pp, int idx,
                }
 
 retry:
-               /* Pulse the PEX reset */
-               reg = afi_readl(reset_reg) | AFI_PEX_CTRL_RST;
-               afi_writel(reg, reset_reg);
-               mdelay(1);
-               reg = afi_readl(reset_reg) & ~AFI_PEX_CTRL_RST;
-               afi_writel(reg, reset_reg);
-
                retries--;
        } while (retries);