U-Boot enables and uses IOC so if we don't want to use it in the kernel
we need to _disable_ it for real. This is in comparison to what we do
today based on "ioc_enable" flag - if it is set to 0 we just
_dont_enable_ IOC which effectively keeps IOC alive and kicking.
Signed-off-by: Alexey Brodkin <abrodkin@xxxxxxxxxxxx>
---
arch/arc/mm/cache.c | 47 +++++++++++++++++++++++++++--------------------
1 file changed, 27 insertions(+), 20 deletions(-)
diff --git a/arch/arc/mm/cache.c b/arch/arc/mm/cache.c
index eee924dfffa6..b763c34aa6bc 100644
--- a/arch/arc/mm/cache.c
+++ b/arch/arc/mm/cache.c
@@ -1149,6 +1149,10 @@ noinline void __init arc_ioc_setup(void)
{
unsigned int ioc_base, mem_sz;
+ /* Force disable IOC if it exists but we don't want to use it */
+ if (ioc_exists && !ioc_enable)
+ write_aux_reg(ARC_REG_IO_COH_ENABLE, 0);
+
/* Flush + invalidate + disable L1 dcache */
__dc_disable();
@@ -1156,31 +1160,34 @@ noinline void __init arc_ioc_setup(void)
if (read_aux_reg(ARC_REG_SLC_BCR))
slc_entire_op(OP_FLUSH_N_INV);
- /*
- * currently IOC Aperture covers entire DDR
- * TBD: fix for PGU + 1GB of low mem
- * TBD: fix for PAE
- */
- mem_sz = arc_get_mem_sz();
+ /* Only setup IOC if we really want to use it */
+ if (ioc_exists && ioc_enable) {
+ /*
+ * currently IOC Aperture covers entire DDR
+ * TBD: fix for PGU + 1GB of low mem
+ * TBD: fix for PAE
+ */
+ mem_sz = arc_get_mem_sz();
- if (!is_power_of_2(mem_sz) || mem_sz < 4096)
- panic("IOC Aperture size must be power of 2 larger than 4KB");
+ if (!is_power_of_2(mem_sz) || mem_sz < 4096)
+ panic("IOC Aperture size must be power of 2 larger than 4KB");
- /*
- * IOC Aperture size decoded as 2 ^ (SIZE + 2) KB,
- * so setting 0x11 implies 512MB, 0x12 implies 1GB...
- */
- write_aux_reg(ARC_REG_IO_COH_AP0_SIZE, order_base_2(mem_sz >> 10) - 2);
+ /*
+ * IOC Aperture size decoded as 2 ^ (SIZE + 2) KB,
+ * so setting 0x11 implies 512MB, 0x12 implies 1GB...
+ */
+ write_aux_reg(ARC_REG_IO_COH_AP0_SIZE, order_base_2(mem_sz >> 10) - 2);
- /* for now assume kernel base is start of IOC aperture */
- ioc_base = CONFIG_LINUX_RAM_BASE;
+ /* for now assume kernel base is start of IOC aperture */
+ ioc_base = CONFIG_LINUX_RAM_BASE;
- if (ioc_base % mem_sz != 0)
- panic("IOC Aperture start must be aligned to the size of the aperture");
+ if (ioc_base % mem_sz != 0)
+ panic("IOC Aperture start must be aligned to the size of the aperture");
- write_aux_reg(ARC_REG_IO_COH_AP0_BASE, ioc_base >> 12);
- write_aux_reg(ARC_REG_IO_COH_PARTIAL, 1);
- write_aux_reg(ARC_REG_IO_COH_ENABLE, 1);
+ write_aux_reg(ARC_REG_IO_COH_AP0_BASE, ioc_base >> 12);
+ write_aux_reg(ARC_REG_IO_COH_PARTIAL, 1);
+ write_aux_reg(ARC_REG_IO_COH_ENABLE, 1);
+ }
/* Re-enable L1 dcache */
__dc_enable();