blob: e97ee556f92f8535e5f29f4cc5b369bfe73c3ab8 [file] [log] [blame]
Linus Walleij458eef2f2011-08-12 13:41:50 +02001/*
2 * Copyright (C) ST-Ericsson SA 2011
3 *
4 * License terms: GNU General Public License (GPL) version 2
5 */
6
7#include <linux/io.h>
Lee Jonesf1949ea2012-03-08 09:02:02 +00008#include <linux/of.h>
9
Linus Walleij458eef2f2011-08-12 13:41:50 +020010#include <asm/hardware/cache-l2x0.h>
Linus Walleij7a4f2602012-09-19 19:31:19 +020011
Linus Walleij174e7792013-03-19 15:41:55 +010012#include "db8500-regs.h"
Linus Walleij7a4f2602012-09-19 19:31:19 +020013#include "id.h"
Linus Walleij458eef2f2011-08-12 13:41:50 +020014
Arnd Bergmanna3849a42011-10-08 21:47:06 +020015static int __init ux500_l2x0_unlock(void)
16{
17 int i;
Linus Walleij823e7542014-07-10 10:42:05 +020018 void __iomem *l2x0_base = __io_address(U8500_L2CC_BASE);
Arnd Bergmanna3849a42011-10-08 21:47:06 +020019
20 /*
21 * Unlock Data and Instruction Lock if locked. Ux500 U-Boot versions
22 * apparently locks both caches before jumping to the kernel. The
23 * l2x0 core will not touch the unlock registers if the l2x0 is
24 * already enabled, so we do it right here instead. The PL310 has
25 * 8 sets of registers, one per possible CPU.
26 */
27 for (i = 0; i < 8; i++) {
28 writel_relaxed(0x0, l2x0_base + L2X0_LOCKDOWN_WAY_D_BASE +
29 i * L2X0_LOCKDOWN_STRIDE);
30 writel_relaxed(0x0, l2x0_base + L2X0_LOCKDOWN_WAY_I_BASE +
31 i * L2X0_LOCKDOWN_STRIDE);
32 }
33 return 0;
34}
35
Russell King67161732014-03-16 19:15:21 +000036static void ux500_l2c310_write_sec(unsigned long val, unsigned reg)
37{
38 /*
39 * We can't write to secure registers as we are in non-secure
40 * mode, until we have some SMI service available.
41 */
42}
43
Arnd Bergmanna3849a42011-10-08 21:47:06 +020044static int __init ux500_l2x0_init(void)
Linus Walleij458eef2f2011-08-12 13:41:50 +020045{
Linus Walleij823e7542014-07-10 10:42:05 +020046 /* Multiplatform guard */
47 if (!((cpu_is_u8500_family() || cpu_is_ux540_family())))
Linus Walleij31c72ab2013-06-26 21:46:08 +020048 return -ENODEV;
Linus Walleij458eef2f2011-08-12 13:41:50 +020049
Arnd Bergmanna3849a42011-10-08 21:47:06 +020050 /* Unlock before init */
51 ux500_l2x0_unlock();
Russell King67161732014-03-16 19:15:21 +000052 outer_cache.write_sec = ux500_l2c310_write_sec;
Linus Walleij823e7542014-07-10 10:42:05 +020053 l2x0_of_init(0, ~0);
Linus Walleij458eef2f2011-08-12 13:41:50 +020054
Linus Walleij458eef2f2011-08-12 13:41:50 +020055 return 0;
56}
Linus Walleij458eef2f2011-08-12 13:41:50 +020057early_initcall(ux500_l2x0_init);