ARM: tegra: mc: move common code to mc.c
Alex Waterman [Wed, 30 Oct 2013 18:03:23 +0000 (11:03 -0700)]
o Move the PM related code in common-t3.c to mc.c and
  remove the old common-t3.c file. This is MC specific
  code and as such it should live in the mc.c file which
  is already common to all Tegra3 and beyond chips.

o Also remove some dead code that was sitting around for
  tegra 2x platforms.

Change-Id: I4ea91805ad43ffe67f13f5806dd7798b56678db9
Signed-off-by: Alex Waterman <alexw@nvidia.com>
Reviewed-on: http://git-master/r/309720
Reviewed-by: Automatic_Commit_Validation_User
Reviewed-by: Krishna Reddy <vdumpa@nvidia.com>

arch/arm/mach-tegra/Makefile
arch/arm/mach-tegra/common-t3.c [deleted file]
arch/arm/mach-tegra/include/mach/mc.h
arch/arm/mach-tegra/mc.c

index c59e641..a4f8711 100644 (file)
@@ -35,7 +35,6 @@ ifeq ($(CONFIG_CPU_IDLE),y)
 obj-$(CONFIG_PM_SLEEP)                  += cpuidle-t2.o
 endif
 else
-obj-y                                   += common-t3.o
 obj-y                                   += pm-t3.o
 obj-y                                   += sleep-t30.o
 obj-$(CONFIG_DEBUG_FS)                  += clocks_stats.o
diff --git a/arch/arm/mach-tegra/common-t3.c b/arch/arm/mach-tegra/common-t3.c
deleted file mode 100644 (file)
index b1b0c77..0000000
+++ /dev/null
@@ -1,120 +0,0 @@
-/*
- * arch/arm/mach-tegra/common-t3.c
- *
- * Tegra 3 SoC-specific initialization.
- *
- * Copyright (C) 2009-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/kernel.h>
-#include <linux/io.h>
-
-#include <mach/mcerr.h>
-
-#include "iomap.h"
-
-#define MC_TIMING_REG_NUM1                                     \
-       ((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;
-       u32 *ctx = mc_boot_timing;
-
-       for (off = MC_EMEM_ARB_CFG; off <= MC_EMEM_ARB_TIMING_W2R; off += 4)
-               *ctx++ = readl(mc + off);
-
-       for (off = MC_EMEM_ARB_DA_TURNS; off <= MC_EMEM_ARB_MISC1; off += 4)
-               *ctx++ = readl(mc + off);
-
-       *ctx++ = readl(mc + MC_EMEM_ARB_RING3_THROTTLE);
-       *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(IOMEM(mc + off));
-#endif
-
-       *ctx++ = readl(IOMEM((uintptr_t)mc + MC_INT_MASK));
-}
-
-void tegra_mc_timing_restore(void)
-{
-       u32 off;
-       u32 *ctx = mc_boot_timing;
-
-       for (off = MC_EMEM_ARB_CFG; off <= MC_EMEM_ARB_TIMING_W2R; off += 4)
-               __raw_writel(*ctx++, mc + off);
-
-       for (off = MC_EMEM_ARB_DA_TURNS; off <= MC_EMEM_ARB_MISC1; off += 4)
-               __raw_writel(*ctx++, mc + off);
-
-       __raw_writel(*ctx++, mc + MC_EMEM_ARB_RING3_THROTTLE);
-       __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++, IOMEM(mc + off));
-#endif
-
-       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);
-#if defined(CONFIG_ARCH_TEGRA_3x_SOC)
-       /* Bug 1059264
-        * Set extra snap level to avoid VI starving and dropping data.
-        */
-       writel(1, mc + MC_VE_EXTRA_SNAP_LEVELS);
-#endif
-}
-#else
-#define tegra_mc_timing_save()
-#endif
-
-static int __init tegra_mc_timing_init(void)
-{
-       tegra_mc_timing_save();
-       return 0;
-}
-arch_initcall(tegra_mc_timing_init);
index 302c992..651ec0d 100644 (file)
 #ifndef __MACH_TEGRA_MC_H
 #define __MACH_TEGRA_MC_H
 
-#if defined(CONFIG_ARCH_TEGRA_2x_SOC)
-#define TEGRA_MC_FPRI_CTRL_AVPC                0x17c
-#define TEGRA_MC_FPRI_CTRL_DC          0x180
-#define TEGRA_MC_FPRI_CTRL_DCB         0x184
-#define TEGRA_MC_FPRI_CTRL_EPP         0x188
-#define TEGRA_MC_FPRI_CTRL_G2          0x18c
-#define TEGRA_MC_FPRI_CTRL_HC          0x190
-#define TEGRA_MC_FPRI_CTRL_ISP         0x194
-#define TEGRA_MC_FPRI_CTRL_MPCORE      0x198
-#define TEGRA_MC_FPRI_CTRL_MPEA                0x19c
-#define TEGRA_MC_FPRI_CTRL_MPEB                0x1a0
-#define TEGRA_MC_FPRI_CTRL_MPEC                0x1a4
-#define TEGRA_MC_FPRI_CTRL_NV          0x1a8
-#define TEGRA_MC_FPRI_CTRL_PPCS                0x1ac
-#define TEGRA_MC_FPRI_CTRL_VDE         0x1b0
-#define TEGRA_MC_FPRI_CTRL_VI          0x1b4
-
-#define TEGRA_MC_CLIENT_AVPCARM7R      ((TEGRA_MC_FPRI_CTRL_AVPC << 8) | 0)
-#define TEGRA_MC_CLIENT_AVPCARM7W      ((TEGRA_MC_FPRI_CTRL_AVPC << 8) | 2)
-#define TEGRA_MC_CLIENT_DISPLAY0A      ((TEGRA_MC_FPRI_CTRL_DC << 8) | 0)
-#define TEGRA_MC_CLIENT_DISPLAY0B      ((TEGRA_MC_FPRI_CTRL_DC << 8) | 2)
-#define TEGRA_MC_CLIENT_DISPLAY0C      ((TEGRA_MC_FPRI_CTRL_DC << 8) | 4)
-#define TEGRA_MC_CLIENT_DISPLAY1B      ((TEGRA_MC_FPRI_CTRL_DC << 8) | 6)
-#define TEGRA_MC_CLIENT_DISPLAYHC      ((TEGRA_MC_FPRI_CTRL_DC << 8) | 8)
-#define TEGRA_MC_CLIENT_DISPLAY0AB     ((TEGRA_MC_FPRI_CTRL_DCB << 8) | 0)
-#define TEGRA_MC_CLIENT_DISPLAY0BB     ((TEGRA_MC_FPRI_CTRL_DCB << 8) | 2)
-#define TEGRA_MC_CLIENT_DISPLAY0CB     ((TEGRA_MC_FPRI_CTRL_DCB << 8) | 4)
-#define TEGRA_MC_CLIENT_DISPLAY1BB     ((TEGRA_MC_FPRI_CTRL_DCB << 8) | 6)
-#define TEGRA_MC_CLIENT_DISPLAYHCB     ((TEGRA_MC_FPRI_CTRL_DCB << 8) | 8)
-#define TEGRA_MC_CLIENT_EPPUP          ((TEGRA_MC_FPRI_CTRL_EPP << 8) | 0)
-#define TEGRA_MC_CLIENT_EPPU           ((TEGRA_MC_FPRI_CTRL_EPP << 8) | 2)
-#define TEGRA_MC_CLIENT_EPPV           ((TEGRA_MC_FPRI_CTRL_EPP << 8) | 4)
-#define TEGRA_MC_CLIENT_EPPY           ((TEGRA_MC_FPRI_CTRL_EPP << 8) | 6)
-#define TEGRA_MC_CLIENT_G2PR           ((TEGRA_MC_FPRI_CTRL_G2 << 8) | 0)
-#define TEGRA_MC_CLIENT_G2SR           ((TEGRA_MC_FPRI_CTRL_G2 << 8) | 2)
-#define TEGRA_MC_CLIENT_G2DR           ((TEGRA_MC_FPRI_CTRL_G2 << 8) | 4)
-#define TEGRA_MC_CLIENT_G2DW           ((TEGRA_MC_FPRI_CTRL_G2 << 8) | 6)
-#define TEGRA_MC_CLIENT_HOST1XDMAR     ((TEGRA_MC_FPRI_CTRL_HC << 8) | 0)
-#define TEGRA_MC_CLIENT_HOST1XR                ((TEGRA_MC_FPRI_CTRL_HC << 8) | 2)
-#define TEGRA_MC_CLIENT_HOST1XW                ((TEGRA_MC_FPRI_CTRL_HC << 8) | 4)
-#define TEGRA_MC_CLIENT_ISPW           ((TEGRA_MC_FPRI_CTRL_ISP << 8) | 0)
-#define TEGRA_MC_CLIENT_MPCORER                ((TEGRA_MC_FPRI_CTRL_MPCORE << 8) | 0)
-#define TEGRA_MC_CLIENT_MPCOREW                ((TEGRA_MC_FPRI_CTRL_MPCORE << 8) | 2)
-#define TEGRA_MC_CLIENT_MPEAMEMRD      ((TEGRA_MC_FPRI_CTRL_MPEA << 8) | 0)
-#define TEGRA_MC_CLIENT_MPEUNIFBR      ((TEGRA_MC_FPRI_CTRL_MPEB << 8) | 0)
-#define TEGRA_MC_CLIENT_MPE_IPRED      ((TEGRA_MC_FPRI_CTRL_MPEB << 8) | 2)
-#define TEGRA_MC_CLIENT_MPEUNIFBW      ((TEGRA_MC_FPRI_CTRL_MPEB << 8) | 4)
-#define TEGRA_MC_CLIENT_MPECSRD                ((TEGRA_MC_FPRI_CTRL_MPEC << 8) | 0)
-#define TEGRA_MC_CLIENT_MPECSWR                ((TEGRA_MC_FPRI_CTRL_MPEC << 8) | 2)
-#define TEGRA_MC_CLIENT_FDCDRD         ((TEGRA_MC_FPRI_CTRL_NV << 8) | 0)
-#define TEGRA_MC_CLIENT_IDXSRD         ((TEGRA_MC_FPRI_CTRL_NV << 8) | 2)
-#define TEGRA_MC_CLIENT_TEXSRD         ((TEGRA_MC_FPRI_CTRL_NV << 8) | 4)
-#define TEGRA_MC_CLIENT_FDCDWR         ((TEGRA_MC_FPRI_CTRL_NV << 8) | 6)
-#define TEGRA_MC_CLIENT_PPCSAHBDMAR    ((TEGRA_MC_FPRI_CTRL_PPCS << 8) | 0)
-#define TEGRA_MC_CLIENT_PPCSAHBSLVR     ((TEGRA_MC_FPRI_CTRL_PPCS << 8) | 2)
-#define TEGRA_MC_CLIENT_PPCSAHBDMAW     ((TEGRA_MC_FPRI_CTRL_PPCS << 8) | 4)
-#define TEGRA_MC_CLIENT_PPCSAHBSLVW     ((TEGRA_MC_FPRI_CTRL_PPCS << 8) | 6)
-#define TEGRA_MC_CLIENT_VDEBSEVR       ((TEGRA_MC_FPRI_CTRL_VDE << 8) | 0)
-#define TEGRA_MC_CLIENT_VDEMBER                ((TEGRA_MC_FPRI_CTRL_VDE << 8) | 2)
-#define TEGRA_MC_CLIENT_VDEMCER                ((TEGRA_MC_FPRI_CTRL_VDE << 8) | 4)
-#define TEGRA_MC_CLIENT_VDETPER                ((TEGRA_MC_FPRI_CTRL_VDE << 8) | 6)
-#define TEGRA_MC_CLIENT_VDEBSEVW       ((TEGRA_MC_FPRI_CTRL_VDE << 8) | 8)
-#define TEGRA_MC_CLIENT_VDEMBEW                ((TEGRA_MC_FPRI_CTRL_VDE << 8) | 10)
-#define TEGRA_MC_CLIENT_VDETPMW                ((TEGRA_MC_FPRI_CTRL_VDE << 8) | 12)
-#define TEGRA_MC_CLIENT_VIRUV          ((TEGRA_MC_FPRI_CTRL_VI << 8) | 0)
-#define TEGRA_MC_CLIENT_VIWSB          ((TEGRA_MC_FPRI_CTRL_VI << 8) | 2)
-#define TEGRA_MC_CLIENT_VIWU           ((TEGRA_MC_FPRI_CTRL_VI << 8) | 4)
-#define TEGRA_MC_CLIENT_VIWV           ((TEGRA_MC_FPRI_CTRL_VI << 8) | 6)
-#define TEGRA_MC_CLIENT_VIWY           ((TEGRA_MC_FPRI_CTRL_VI << 8) | 8)
-
-#define TEGRA_MC_PRIO_LOWEST           0
-#define TEGRA_MC_PRIO_LOW              1
-#define TEGRA_MC_PRIO_MED              2
-#define TEGRA_MC_PRIO_HIGH             3
-#define TEGRA_MC_PRIO_MASK             3
-
-void tegra_mc_set_priority(unsigned long client, unsigned long prio);
-
-#else
-       /* !!!FIXME!!! IMPLEMENT ME */
+/* !!!FIXME!!! IMPLEMENT ME */
 #define tegra_mc_set_priority(client, prio) \
        do { /* nothing for now */ } while (0)
-#endif
 
 /*
  * Number of unique interrupts we have for this chip.
@@ -180,8 +100,11 @@ static inline int tegra_mc_get_effective_bytes_width(void)
 }
 
 unsigned int tegra_emc_bw_to_freq_req(unsigned int bw_kbps);
-
 unsigned int tegra_emc_freq_req_to_bw(unsigned int freq_kbps);
+#if defined(CONFIG_ARCH_TEGRA_12x_SOC)
+void         tegra12_mc_latency_allowance_save(u32 **pctx);
+void         tegra12_mc_latency_allowance_restore(u32 **pctx);
+#endif
 
 /* API to get freqency switch latency at given MC freq.
  * freq_khz: Frequncy in KHz.
index 41ad734..dc59f2b 100644 (file)
 
 #include "iomap.h"
 
+#define MC_CLIENT_HOTRESET_CTRL                0x200
+#define MC_CLIENT_HOTRESET_STAT                0x204
+#define MC_CLIENT_HOTRESET_CTRL_1      0x970
+#define MC_CLIENT_HOTRESET_STAT_1      0x974
+
+#define MC_TIMING_REG_NUM1                                     \
+       ((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
+
 static DEFINE_SPINLOCK(tegra_mc_lock);
 void __iomem *mc = (void __iomem *)IO_ADDRESS(TEGRA_MC_BASE);
 #ifdef MC_DUAL_CHANNEL
 void __iomem *mc1 = (void __iomem *)IO_ADDRESS(TEGRA_MC1_BASE);
 #endif
 
-#define MC_CLIENT_HOTRESET_CTRL                0x200
-#define MC_CLIENT_HOTRESET_STAT                0x204
-#define MC_CLIENT_HOTRESET_CTRL_1      0x970
-#define MC_CLIENT_HOTRESET_STAT_1      0x974
-
-#if defined(CONFIG_ARCH_TEGRA_2x_SOC)
+#ifdef CONFIG_PM_SLEEP
+static u32 mc_boot_timing[MC_TIMING_REG_NUM1 + MC_TIMING_REG_NUM2
+                         + MC_TIMING_REG_NUM3 + 4];
 
-void tegra_mc_set_priority(unsigned long client, unsigned long prio)
+static void tegra_mc_timing_save(void)
 {
-       unsigned long reg = client >> 8;
-       int field = client & 0xff;
-       unsigned long val;
-       unsigned long flags;
+       u32 off;
+       u32 *ctx = mc_boot_timing;
 
-       spin_lock_irqsave(&tegra_mc_lock, flags);
-       val = mc_readl(reg);
-       val &= ~(TEGRA_MC_PRIO_MASK << field);
-       val |= prio << field;
-       mc_writel(val, reg);
-       spin_unlock_irqrestore(&tegra_mc_lock, flags);
+       for (off = MC_EMEM_ARB_CFG; off <= MC_EMEM_ARB_TIMING_W2R; off += 4)
+               *ctx++ = readl(mc + off);
+
+       for (off = MC_EMEM_ARB_DA_TURNS; off <= MC_EMEM_ARB_MISC1; off += 4)
+               *ctx++ = readl(mc + off);
+
+       *ctx++ = readl(mc + MC_EMEM_ARB_RING3_THROTTLE);
+       *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(IOMEM(mc + off));
+#endif
+
+       *ctx++ = readl(IOMEM((uintptr_t)mc + MC_INT_MASK));
 }
 
-int tegra_mc_get_tiled_memory_bandwidth_multiplier(void)
+void tegra_mc_timing_restore(void)
 {
-       return 1;
-}
+       u32 off;
+       u32 *ctx = mc_boot_timing;
+
+       for (off = MC_EMEM_ARB_CFG; off <= MC_EMEM_ARB_TIMING_W2R; off += 4)
+               __raw_writel(*ctx++, mc + off);
+
+       for (off = MC_EMEM_ARB_DA_TURNS; off <= MC_EMEM_ARB_MISC1; off += 4)
+               __raw_writel(*ctx++, mc + off);
+
+       __raw_writel(*ctx++, mc + MC_EMEM_ARB_RING3_THROTTLE);
+       __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++, IOMEM(mc + off));
+#endif
+
+       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);
+#if defined(CONFIG_ARCH_TEGRA_3x_SOC)
+       /* Bug 1059264
+        * Set extra snap level to avoid VI starving and dropping data.
+        */
+       writel(1, mc + MC_VE_EXTRA_SNAP_LEVELS);
+#endif
+}
 #else
-       /* !!!FIXME!!! IMPLEMENT tegra_mc_set_priority() */
+#define tegra_mc_timing_save()
+#endif
 
 /*
  * If using T30/DDR3, the 2nd 16 bytes part of DDR3 atom is 2nd line and is
@@ -77,14 +131,12 @@ int tegra_mc_get_tiled_memory_bandwidth_multiplier(void)
        int type;
 
        type = tegra_emc_get_dram_type();
-       /*WARN_ONCE(type == -1, "unknown type DRAM because DVFS is disabled\n");*/
 
        if (type == DRAM_TYPE_DDR3)
                return 2;
        else
                return 1;
 }
-#endif
 
 /* API to get EMC freq to be requested, for Bandwidth.
  * bw_kbps: BandWidth passed is in KBps.
@@ -210,6 +262,8 @@ static int __init tegra_mc_init(void)
        u32 reg;
        struct dentry *mc_debugfs_dir;
 
+       tegra_mc_timing_save();
+
 #if defined(CONFIG_ARCH_TEGRA_3x_SOC)
        reg = 0x0f7f1010;
        mc_writel(reg, MC_RESERVED_RSV);