mirror of
https://github.com/AuxXxilium/linux_dsm_epyc7002.git
synced 2024-11-30 14:06:51 +07:00
1a5a954ce0
We have a mixture of different devices with different register layouts, but we group all the bits together in an opaque mess. Split them out into those which are L2C-310 specific and ones which refer to earlier devices. Provide full auxiliary control register definitions. Acked-by: Tony Lindgren <tony@atomide.com> Acked-by: Linus Walleij <linus.walleij@linaro.org> Acked-by: Shawn Guo <shawn.guo@linaro.org> Acked-by: Stephen Warren <swarren@nvidia.com> Signed-off-by: Russell King <rmk+kernel@arm.linux.org.uk>
78 lines
1.8 KiB
C
78 lines
1.8 KiB
C
/*
|
|
* Copyright (C) ST-Ericsson SA 2011
|
|
*
|
|
* License terms: GNU General Public License (GPL) version 2
|
|
*/
|
|
|
|
#include <linux/io.h>
|
|
#include <linux/of.h>
|
|
|
|
#include <asm/cacheflush.h>
|
|
#include <asm/hardware/cache-l2x0.h>
|
|
|
|
#include "db8500-regs.h"
|
|
#include "id.h"
|
|
|
|
static void __iomem *l2x0_base;
|
|
|
|
static int __init ux500_l2x0_unlock(void)
|
|
{
|
|
int i;
|
|
|
|
/*
|
|
* 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;
|
|
}
|
|
|
|
static int __init ux500_l2x0_init(void)
|
|
{
|
|
u32 aux_val = 0x3e000000;
|
|
|
|
if (cpu_is_u8500_family() || cpu_is_ux540_family())
|
|
l2x0_base = __io_address(U8500_L2CC_BASE);
|
|
else
|
|
/* Non-Ux500 platform */
|
|
return -ENODEV;
|
|
|
|
/* Unlock before init */
|
|
ux500_l2x0_unlock();
|
|
|
|
/* DBx540's L2 has 128KB way size */
|
|
if (cpu_is_ux540_family())
|
|
/* 128KB way size */
|
|
aux_val |= L2C_AUX_CTRL_WAY_SIZE(4);
|
|
else
|
|
/* 64KB way size */
|
|
aux_val |= L2C_AUX_CTRL_WAY_SIZE(3);
|
|
|
|
/* 64KB way size, 8 way associativity, force WA */
|
|
if (of_have_populated_dt())
|
|
l2x0_of_init(aux_val, 0xc0000fff);
|
|
else
|
|
l2x0_init(l2x0_base, aux_val, 0xc0000fff);
|
|
|
|
/*
|
|
* We can't disable l2 as we are in non secure mode, currently
|
|
* this seems be called only during kexec path. So let's
|
|
* override outer.disable with nasty assignment until we have
|
|
* some SMI service available.
|
|
*/
|
|
outer_cache.disable = NULL;
|
|
outer_cache.set_debug = NULL;
|
|
|
|
return 0;
|
|
}
|
|
|
|
early_initcall(ux500_l2x0_init);
|