ARM: tegra12: fix MC latency allowance programming
Peng Du [Wed, 19 Jun 2013 00:09:53 +0000 (17:09 -0700)]
Unlike T3 and T114, MC latency allowance registers on T124+ are
not in a contiguous MMIO range anymore, which is fixed by this
change. This change also updated the latency allowance register
definitions based on T124's HW spec.

Bug 1289211

Change-Id: I225d1956f669c1efcebce0442856a8d28a692bef
Signed-off-by: Peng Du <pdu@nvidia.com>
Reviewed-on: http://git-master/r/242508
Reviewed-by: Adeel Raza <araza@nvidia.com>
Tested-by: Adeel Raza <araza@nvidia.com>
Reviewed-by: Seema Khowala <seemaj@nvidia.com>

arch/arm/mach-tegra/Makefile
arch/arm/mach-tegra/common-t3.c
arch/arm/mach-tegra/mc-timing-t12x.c [new file with mode: 0644]
arch/arm/mach-tegra/mcerr.h
arch/arm/mach-tegra/tegra12_emc.h

index ce734dd..36b0456 100644 (file)
@@ -50,6 +50,10 @@ ifeq ($(CONFIG_ARCH_TEGRA_12x_SOC),y)
 obj-$(CONFIG_PM_SLEEP)                 += wakeups-t12x.o
 endif
 
+ifeq ($(CONFIG_PM_SLEEP),y)
+obj-$(CONFIG_ARCH_TEGRA_12x_SOC)        += mc-timing-t12x.o
+endif
+
 ifeq ($(CONFIG_CPU_IDLE),y)
 ifeq ($(CONFIG_PM_SLEEP),y)
 obj-$(CONFIG_ARCH_TEGRA_3x_SOC)         += cpuidle-t3.o
index 84a7c6c..c6367c1 100644 (file)
        ((MC_EMEM_ARB_TIMING_W2R - MC_EMEM_ARB_CFG) / 4 + 1)
 #define MC_TIMING_REG_NUM2                                     \
        ((MC_EMEM_ARB_MISC1 - MC_EMEM_ARB_DA_TURNS) / 4 + 1)
+#if defined(CONFIG_ARCH_TEGRA_12x_SOC)
+#define MC_TIMING_REG_NUM3     T12X_MC_LATENCY_ALLOWANCE_NUM_REGS
+#else
 #define MC_TIMING_REG_NUM3                                             \
        ((MC_LATENCY_ALLOWANCE_VI_2 - MC_LATENCY_ALLOWANCE_BASE) / 4 + 1)
+#endif
 
 #ifdef CONFIG_PM_SLEEP
 static u32 mc_boot_timing[MC_TIMING_REG_NUM1 + MC_TIMING_REG_NUM2
                          + MC_TIMING_REG_NUM3 + 4];
 
+#if defined(CONFIG_ARCH_TEGRA_12x_SOC)
+extern void tegra12_mc_latency_allowance_save(u32 **pctx);
+extern void tegra12_mc_latency_allowance_restore(u32 **pctx);
+#endif
+
 static void tegra_mc_timing_save(void)
 {
        u32 off;
@@ -52,11 +61,15 @@ static void tegra_mc_timing_save(void)
        *ctx++ = readl(mc + MC_EMEM_ARB_OVERRIDE);
        *ctx++ = readl(mc + MC_RESERVED_RSV);
 
+#if defined(CONFIG_ARCH_TEGRA_12x_SOC)
+       tegra12_mc_latency_allowance_save(&ctx);
+#else
        for (off = MC_LATENCY_ALLOWANCE_BASE; off <= MC_LATENCY_ALLOWANCE_VI_2;
                off += 4)
-               *ctx++ = readl(mc + off);
+               *ctx++ = readl(IOMEM(mc + off));
+#endif
 
-       *ctx++ = readl(mc + MC_INT_MASK);
+       *ctx++ = readl(IOMEM((uintptr_t)mc + MC_INT_MASK));
 }
 
 void tegra_mc_timing_restore(void)
@@ -74,12 +87,16 @@ void tegra_mc_timing_restore(void)
        __raw_writel(*ctx++, mc + MC_EMEM_ARB_OVERRIDE);
        __raw_writel(*ctx++, mc + MC_RESERVED_RSV);
 
+#if defined(CONFIG_ARCH_TEGRA_12x_SOC)
+       tegra12_mc_latency_allowance_restore(&ctx);
+#else
        for (off = MC_LATENCY_ALLOWANCE_BASE; off <= MC_LATENCY_ALLOWANCE_VI_2;
                off += 4)
-               __raw_writel(*ctx++, mc + off);
+               __raw_writel(*ctx++, IOMEM(mc + off));
+#endif
 
-       writel(*ctx++, mc + MC_INT_MASK);
-       off = readl(mc + MC_INT_MASK);
+       writel(*ctx++, IOMEM(mc + MC_INT_MASK));
+       off = readl(IOMEM(mc + MC_INT_MASK));
 
        writel(0x1, mc + MC_TIMING_CONTROL);
        off = readl(mc + MC_TIMING_CONTROL);
diff --git a/arch/arm/mach-tegra/mc-timing-t12x.c b/arch/arm/mach-tegra/mc-timing-t12x.c
new file mode 100644 (file)
index 0000000..eb2779c
--- /dev/null
@@ -0,0 +1,87 @@
+/*
+ * arch/arm/mach-tegra/mc-timing-t12x.c
+ *
+ * Copyright (c) 2013, NVIDIA Corporation. All rights reserved.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for
+ * more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
+ */
+
+#include <linux/io.h>
+
+#include "iomap.h"
+#include "mcerr.h"
+
+#define MC_LA_REG(mod) MC_LATENCY_ALLOWANCE_ ## mod
+
+static u32 mc_timing_reg_table[] = {
+       MC_LA_REG(AFI_0),
+       MC_LA_REG(AVPC_0),
+       MC_LA_REG(DC_0),
+       MC_LA_REG(DC_1),
+       MC_LA_REG(DC_2),
+       MC_LA_REG(DCB_0),
+       MC_LA_REG(DCB_1),
+       MC_LA_REG(DCB_2),
+       MC_LA_REG(HC_0),
+       MC_LA_REG(HC_1),
+       MC_LA_REG(HDA_0),
+       MC_LA_REG(MPCORE_0),
+       MC_LA_REG(MPCORELP_0),
+       MC_LA_REG(MSENC_0),
+       MC_LA_REG(PPCS_0),
+       MC_LA_REG(PPCS_1),
+       MC_LA_REG(PTC_0),
+       MC_LA_REG(SATA_0),
+       MC_LA_REG(VDE_0),
+       MC_LA_REG(VDE_1),
+       MC_LA_REG(VDE_2),
+       MC_LA_REG(VDE_3),
+       MC_LA_REG(ISP2_0),
+       MC_LA_REG(ISP2_1),
+       MC_LA_REG(XUSB_0),
+       MC_LA_REG(XUSB_1),
+       MC_LA_REG(ISP2B_0),
+       MC_LA_REG(ISP2B_1),
+       MC_LA_REG(TSEC_0),
+       MC_LA_REG(VIC_0),
+       MC_LA_REG(VI2_0),
+       MC_LA_REG(A9AVP_0),
+       MC_LA_REG(GPU_0),
+       MC_LA_REG(SDMMCA_0),
+       MC_LA_REG(SDMMCAA_0),
+       MC_LA_REG(SDMMC_0),
+       MC_LA_REG(SDMMCAB_0),
+       MC_LA_REG(DC_3)
+};
+
+#define NUM_LA_REGS ARRAY_SIZE(mc_timing_reg_table)
+
+void tegra12_mc_latency_allowance_save(u32 **pctx)
+{
+       u32 *ctx = *pctx;
+       u32 i;
+       for (i = 0; i < NUM_LA_REGS; ++i)
+               *ctx++ = readl(IOMEM(mc +
+                       mc_timing_reg_table[i]));
+}
+
+void tegra12_mc_latency_allowance_restore(u32 **pctx)
+{
+       u32 *ctx = *pctx;
+       u32 i;
+       for (i = 0; i < NUM_LA_REGS; ++i)
+               __raw_writel(*ctx++, IOMEM(mc +
+                       mc_timing_reg_table[i]));
+}
index a189ae3..7195504 100644 (file)
@@ -39,7 +39,7 @@
 #include "tegra14_emc.h"
 #define MC_LATENCY_ALLOWANCE_BASE      MC_LATENCY_ALLOWANCE_AVPC_0
 #elif defined(CONFIG_ARCH_TEGRA_12x_SOC)
-#include "tegra11_emc.h"
+#include "tegra12_emc.h"
 #define MC_LATENCY_ALLOWANCE_BASE      MC_LATENCY_ALLOWANCE_AVPC_0
 #endif
 
index 3524b13..cb51798 100644 (file)
@@ -414,6 +414,7 @@ enum {
 #define MC_EMEM_ARB_ISOCHRONOUS_1              0x20c
 #define MC_EMEM_ARB_ISOCHRONOUS_2              0x210
 #define MC_DIS_EXTRA_SNAP_LEVELS               0x2ac
+
 #define MC_LATENCY_ALLOWANCE_AFI_0             0x2e0
 #define MC_LATENCY_ALLOWANCE_AVPC_0            0x2e4
 #define MC_LATENCY_ALLOWANCE_DC_0              0x2e8
@@ -422,21 +423,12 @@ enum {
 #define MC_LATENCY_ALLOWANCE_DCB_0             0x2f4
 #define MC_LATENCY_ALLOWANCE_DCB_1             0x2f8
 #define MC_LATENCY_ALLOWANCE_DCB_2             0x2fc
-#define MC_LATENCY_ALLOWANCE_EPP_0             0x300
-#define MC_LATENCY_ALLOWANCE_EPP_1             0x304
-#define MC_LATENCY_ALLOWANCE_G2_0              0x308
-#define MC_LATENCY_ALLOWANCE_G2_1              0x30c
 #define MC_LATENCY_ALLOWANCE_HC_0              0x310
 #define MC_LATENCY_ALLOWANCE_HC_1              0x314
 #define MC_LATENCY_ALLOWANCE_HDA_0             0x318
-#define MC_LATENCY_ALLOWANCE_ISP_0             0x31c
-#define MC_LATENCY_ALLOWANCE_MPCORE_0          0x320
-#define MC_LATENCY_ALLOWANCE_MPCORELP_0                0x324
-#define MC_LATENCY_ALLOWANCE_MSENC_0           0x328
-#define MC_LATENCY_ALLOWANCE_NV_0              0x334
-#define MC_LATENCY_ALLOWANCE_NV_1              0x338
-#define MC_LATENCY_ALLOWANCE_NV2_0             0x33c
-#define MC_LATENCY_ALLOWANCE_NV2_1             0x340
+#define MC_LATENCY_ALLOWANCE_MPCORE_0  0x320
+#define MC_LATENCY_ALLOWANCE_MPCORELP_0        0x324
+#define MC_LATENCY_ALLOWANCE_MSENC_0   0x328
 #define MC_LATENCY_ALLOWANCE_PPCS_0            0x344
 #define MC_LATENCY_ALLOWANCE_PPCS_1            0x348
 #define MC_LATENCY_ALLOWANCE_PTC_0             0x34c
@@ -445,25 +437,26 @@ enum {
 #define MC_LATENCY_ALLOWANCE_VDE_1             0x358
 #define MC_LATENCY_ALLOWANCE_VDE_2             0x35c
 #define MC_LATENCY_ALLOWANCE_VDE_3             0x360
-#define MC_LATENCY_ALLOWANCE_VI_0              0x364
-#define MC_LATENCY_ALLOWANCE_VI_1              0x368
-#define MC_LATENCY_ALLOWANCE_VI_2              0x36c
 #define MC_LATENCY_ALLOWANCE_ISP2_0            0x370
 #define MC_LATENCY_ALLOWANCE_ISP2_1            0x374
 #define MC_LATENCY_ALLOWANCE_XUSB_0            0x37c
 #define MC_LATENCY_ALLOWANCE_XUSB_1            0x380
-#define MC_LATENCY_ALLOWANCE_ISP2B_0           0x384
-#define MC_LATENCY_ALLOWANCE_ISP2B_1           0x388
-#define MC_LATENCY_ALLOWANCE_EMUCIF_0          0x38c
+#define MC_LATENCY_ALLOWANCE_ISP2B_0   0x384
+#define MC_LATENCY_ALLOWANCE_ISP2B_1   0x388
 #define MC_LATENCY_ALLOWANCE_TSEC_0            0x390
 #define MC_LATENCY_ALLOWANCE_VIC_0             0x394
 #define MC_LATENCY_ALLOWANCE_VI2_0             0x398
-#define MC_LATENCY_ALLOWANCE_VDE_3              0x360
-#define MC_LATENCY_ALLOWANCE_GPU_0                             0x3ac
-#define MC_LATENCY_ALLOWANCE_SDMMCA_0                  0x3b8
-#define MC_LATENCY_ALLOWANCE_SDMMCAA_0                 0x3bc
-#define MC_LATENCY_ALLOWANCE_SDMMC_0                   0x3c0
-#define MC_LATENCY_ALLOWANCE_SDMMCAB_0                 0x3c4
+#define MC_LATENCY_ALLOWANCE_A9AVP_0   0x3a4
+#define MC_LATENCY_ALLOWANCE_GPU_0             0x3ac
+#define MC_LATENCY_ALLOWANCE_SDMMCA_0  0x3b8
+#define MC_LATENCY_ALLOWANCE_SDMMCAA_0 0x3bc
+#define MC_LATENCY_ALLOWANCE_SDMMC_0   0x3c0
+#define MC_LATENCY_ALLOWANCE_SDMMCAB_0 0x3c4
+#define MC_LATENCY_ALLOWANCE_DC_3              0x3c8
+
+/* NOTE: this must match the # of MC_LATENCY_XXX above */
+#define T12X_MC_LATENCY_ALLOWANCE_NUM_REGS 38
+
 #define MC_VIDEO_PROTECT_VPR_OVERRIDE          0x418
 #define MC_MLL_MPCORER_PTSA_RATE                       0x44c
 #define MC_VIDEO_PROTECT_BOM                   0x648