2011-08-12 18:41:50 +07:00
|
|
|
/*
|
|
|
|
* Copyright (C) ST-Ericsson SA 2011
|
|
|
|
*
|
|
|
|
* License terms: GNU General Public License (GPL) version 2
|
|
|
|
*/
|
|
|
|
|
|
|
|
#include <linux/io.h>
|
2012-03-08 16:02:02 +07:00
|
|
|
#include <linux/of.h>
|
|
|
|
|
2011-08-12 18:41:50 +07:00
|
|
|
#include <asm/hardware/cache-l2x0.h>
|
2012-09-20 00:31:19 +07:00
|
|
|
|
2013-03-19 21:41:55 +07:00
|
|
|
#include "db8500-regs.h"
|
2012-09-20 00:31:19 +07:00
|
|
|
#include "id.h"
|
2011-08-12 18:41:50 +07:00
|
|
|
|
2011-10-09 02:47:06 +07:00
|
|
|
static int __init ux500_l2x0_unlock(void)
|
|
|
|
{
|
|
|
|
int i;
|
2014-07-10 15:42:05 +07:00
|
|
|
void __iomem *l2x0_base = __io_address(U8500_L2CC_BASE);
|
2011-10-09 02:47:06 +07:00
|
|
|
|
|
|
|
/*
|
|
|
|
* Unlock Data and Instruction Lock if locked. Ux500 U-Boot versions
|
|
|
|
* apparently locks both caches before jumping to the kernel. The
|
|
|
|
* l2x0 core will not touch the unlock registers if the l2x0 is
|
|
|
|
* already enabled, so we do it right here instead. The PL310 has
|
|
|
|
* 8 sets of registers, one per possible CPU.
|
|
|
|
*/
|
|
|
|
for (i = 0; i < 8; i++) {
|
|
|
|
writel_relaxed(0x0, l2x0_base + L2X0_LOCKDOWN_WAY_D_BASE +
|
|
|
|
i * L2X0_LOCKDOWN_STRIDE);
|
|
|
|
writel_relaxed(0x0, l2x0_base + L2X0_LOCKDOWN_WAY_I_BASE +
|
|
|
|
i * L2X0_LOCKDOWN_STRIDE);
|
|
|
|
}
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
2014-03-17 02:15:21 +07:00
|
|
|
static void ux500_l2c310_write_sec(unsigned long val, unsigned reg)
|
|
|
|
{
|
|
|
|
/*
|
|
|
|
* We can't write to secure registers as we are in non-secure
|
|
|
|
* mode, until we have some SMI service available.
|
|
|
|
*/
|
|
|
|
}
|
|
|
|
|
2011-10-09 02:47:06 +07:00
|
|
|
static int __init ux500_l2x0_init(void)
|
2011-08-12 18:41:50 +07:00
|
|
|
{
|
2014-07-10 15:42:05 +07:00
|
|
|
/* Multiplatform guard */
|
|
|
|
if (!((cpu_is_u8500_family() || cpu_is_ux540_family())))
|
2013-06-27 02:46:08 +07:00
|
|
|
return -ENODEV;
|
2011-08-12 18:41:50 +07:00
|
|
|
|
2011-10-09 02:47:06 +07:00
|
|
|
/* Unlock before init */
|
|
|
|
ux500_l2x0_unlock();
|
2014-03-17 02:15:21 +07:00
|
|
|
outer_cache.write_sec = ux500_l2c310_write_sec;
|
2014-07-10 15:42:05 +07:00
|
|
|
l2x0_of_init(0, ~0);
|
2011-08-12 18:41:50 +07:00
|
|
|
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
early_initcall(ux500_l2x0_init);
|