summaryrefslogtreecommitdiff
path: root/arch/arm/mach-omap2/omap4-common.c
diff options
context:
space:
mode:
Diffstat (limited to 'arch/arm/mach-omap2/omap4-common.c')
-rw-r--r--arch/arm/mach-omap2/omap4-common.c27
1 files changed, 25 insertions, 2 deletions
diff --git a/arch/arm/mach-omap2/omap4-common.c b/arch/arm/mach-omap2/omap4-common.c
index 42a9a91789c1..d697b3d22d55 100644
--- a/arch/arm/mach-omap2/omap4-common.c
+++ b/arch/arm/mach-omap2/omap4-common.c
@@ -36,6 +36,8 @@
#include <linux/export.h>
#ifdef CONFIG_CACHE_L2X0
+#define L2X0_POR_OFFSET_VALUE 0x5
+#define L2X0_POR_OFFSET_MASK 0x1f
static void __iomem *l2cache_base;
#endif
@@ -181,6 +183,7 @@ static void omap4_l2x0_set_debug(unsigned long val)
static int __init omap_l2_cache_init(void)
{
u32 aux_ctrl = 0;
+ u32 por_ctrl = 0;
u32 lockdown = 0;
/*
@@ -200,23 +203,43 @@ static int __init omap_l2_cache_init(void)
* Way size - 32KB (es1.0)
* Way size - 64KB (es2.0 +)
*/
+ aux_ctrl = readl_relaxed(l2cache_base + L2X0_AUX_CTRL);
aux_ctrl = ((1 << L2X0_AUX_CTRL_ASSOCIATIVITY_SHIFT) |
- (0x1 << 25) |
+ (0x1 << L2X0_AUX_CTRL_REPLACE_POLICY_SHIFT) |
(0x1 << L2X0_AUX_CTRL_NS_LOCKDOWN_SHIFT) |
(0x1 << L2X0_AUX_CTRL_NS_INT_CTRL_SHIFT));
if (omap_rev() == OMAP4430_REV_ES1_0) {
aux_ctrl |= 0x2 << L2X0_AUX_CTRL_WAY_SIZE_SHIFT;
} else {
+ /*
+ * Drop instruction prefetch as it degrades performances
+ */
aux_ctrl |= ((0x3 << L2X0_AUX_CTRL_WAY_SIZE_SHIFT) |
(1 << L2X0_AUX_CTRL_SHARE_OVERRIDE_SHIFT) |
(1 << L2X0_AUX_CTRL_DATA_PREFETCH_SHIFT) |
- (1 << L2X0_AUX_CTRL_INSTR_PREFETCH_SHIFT) |
(1 << L2X0_AUX_CTRL_EARLY_BRESP_SHIFT));
}
if (omap_rev() != OMAP4430_REV_ES1_0)
omap_smc1(0x109, aux_ctrl);
+ /* Setup POR Control register */
+ por_ctrl = readl_relaxed(l2cache_base + L2X0_PREFETCH_CTRL);
+
+ /*
+ * Double linefill is available only on OMAP4460 L2X0.
+ * It may cause single cache line memory corruption, leave it disabled
+ * on all devices
+ */
+ por_ctrl &= ~(1 << L2X0_PREFETCH_DOUBLE_LINEFILL_SHIFT);
+ por_ctrl &= ~L2X0_POR_OFFSET_MASK;
+ por_ctrl |= L2X0_POR_OFFSET_VALUE;
+
+ /* Set POR through Monitor API only in GP devices */
+ if (omap_type() == OMAP2_DEVICE_TYPE_GP &&
+ omap_rev() >= OMAP4430_REV_ES2_2)
+ omap_smc1(0x113, por_ctrl);
+
/*
* WA for OMAP4460 stability issue on ES1.0
* Lock-down specific L2 cache ways which makes effective