]> bbs.cooldavid.org Git - net-next-2.6.git/commitdiff
ARM: Improve the L2 cache performance when PL310 is used
authorCatalin Marinas <catalin.marinas@arm.com>
Tue, 31 Aug 2010 12:05:22 +0000 (13:05 +0100)
committerSantosh Shilimkar <santosh.shilimkar@ti.com>
Tue, 26 Oct 2010 06:09:54 +0000 (11:39 +0530)
With this L2 cache controller, the cache maintenance by PA and sync
operations are atomic and do not require a "wait" loop. This patch
conditionally defines the cache_wait() function.

Since L2x0 cache controllers do not work with ARMv7 CPUs, the patch
automatically enables CACHE_PL310 when only CPU_V7 is defined.

Signed-off-by: Catalin Marinas <catalin.marinas@arm.com>
arch/arm/mm/Kconfig
arch/arm/mm/cache-l2x0.c

index a0a2928ae4dd7670a1342863040791833b57dbab..4414a01e1e8a392befa91d6da826f8ab1698223c 100644 (file)
@@ -779,6 +779,14 @@ config CACHE_L2X0
        help
          This option enables the L2x0 PrimeCell.
 
+config CACHE_PL310
+       bool
+       depends on CACHE_L2X0
+       default y if CPU_V7 && !CPU_V6
+       help
+         This option enables optimisations for the PL310 cache
+         controller.
+
 config CACHE_TAUROS2
        bool "Enable the Tauros2 L2 cache controller"
        depends on (ARCH_DOVE || ARCH_MMP)
index 9982eb385c0f9844d70f53d45c7377fcf5fa2887..edb43ff7aeef94abbaa04c42b9b91aacef72cc8a 100644 (file)
@@ -29,13 +29,22 @@ static void __iomem *l2x0_base;
 static DEFINE_SPINLOCK(l2x0_lock);
 static uint32_t l2x0_way_mask; /* Bitmask of active ways */
 
-static inline void cache_wait(void __iomem *reg, unsigned long mask)
+static inline void cache_wait_way(void __iomem *reg, unsigned long mask)
 {
-       /* wait for the operation to complete */
+       /* wait for cache operation by line or way to complete */
        while (readl_relaxed(reg) & mask)
                ;
 }
 
+#ifdef CONFIG_CACHE_PL310
+static inline void cache_wait(void __iomem *reg, unsigned long mask)
+{
+       /* cache operations by line are atomic on PL310 */
+}
+#else
+#define cache_wait     cache_wait_way
+#endif
+
 static inline void cache_sync(void)
 {
        void __iomem *base = l2x0_base;
@@ -110,7 +119,7 @@ static inline void l2x0_inv_all(void)
        /* invalidate all ways */
        spin_lock_irqsave(&l2x0_lock, flags);
        writel_relaxed(l2x0_way_mask, l2x0_base + L2X0_INV_WAY);
-       cache_wait(l2x0_base + L2X0_INV_WAY, l2x0_way_mask);
+       cache_wait_way(l2x0_base + L2X0_INV_WAY, l2x0_way_mask);
        cache_sync();
        spin_unlock_irqrestore(&l2x0_lock, flags);
 }