arm: socfpga: enable data/inst prefetch and shared override in the L2
authorDinh Nguyen <dinguyen@opensource.altera.com>
Thu, 15 Oct 2015 15:13:36 +0000 (10:13 -0500)
committerMarek Vasut <marex@denx.de>
Fri, 16 Oct 2015 23:47:31 +0000 (01:47 +0200)
Update the L2 AUX CTRL settings for the SoCFPGA.

Enabling D and I prefetch bits helps improve SDRAM performance on the
platform.

Also, we need to enable bit 22 of the L2. By not having bit 22 set in the
PL310 Auxiliary Control register (shared attribute override enable) has the
side effect of transforming Normal Shared Non-cacheable reads into Cacheable
no-allocate reads.

Coherent DMA buffers in Linux always have a Cacheable alias via the
kernel linear mapping and the processor can speculatively load cache
lines into the PL310 controller. With bit 22 cleared, Non-cacheable
reads would unexpectedly hit such cache lines leading to buffer
corruption.

Signed-off-by: Dinh Nguyen <dinguyen@opensource.altera.com>
arch/arm/include/asm/pl310.h
arch/arm/mach-socfpga/misc.c

index de7650eae73df2e8fd706cd0a1f26b07b83fce6a..d588f9435039eb66a9922bf8c3a2c0df686bc753 100644 (file)
@@ -17,6 +17,8 @@
 #define L2X0_CTRL_EN                           1
 
 #define L310_SHARED_ATT_OVERRIDE_ENABLE                (1 << 22)
+#define L310_AUX_CTRL_DATA_PREFETCH_MASK       (1 << 28)
+#define L310_AUX_CTRL_INST_PREFETCH_MASK       (1 << 29)
 
 struct pl310_regs {
        u32 pl310_cache_id;
index 0940cc5a4ff3f684e8b7882d53f496c8955a73a3..bbd31ef7b522dcd6bab0ff445f6ba3da0c69e097 100644 (file)
@@ -52,6 +52,18 @@ void enable_caches(void)
 #endif
 }
 
+void v7_outer_cache_enable(void)
+{
+       /* disable the L2 cache */
+       writel(0, &pl310->pl310_ctrl);
+
+       /* enable BRESP, instruction and data prefetch, full line of zeroes */
+       setbits_le32(&pl310->pl310_aux_ctrl,
+                    L310_AUX_CTRL_DATA_PREFETCH_MASK |
+                    L310_AUX_CTRL_INST_PREFETCH_MASK |
+                    L310_SHARED_ATT_OVERRIDE_ENABLE);
+}
+
 /*
  * DesignWare Ethernet initialization
  */