xref: /rk3399_rockchip-uboot/arch/arm/mach-uniphier/arm32/cache-uniphier.c (revision 8197d92843952b376915fdbcbf67c723feab1532)
14bab70a7SMasahiro Yamada /*
24bab70a7SMasahiro Yamada  * Copyright (C) 2012-2014 Panasonic Corporation
34bab70a7SMasahiro Yamada  * Copyright (C) 2015-2016 Socionext Inc.
44bab70a7SMasahiro Yamada  *   Author: Masahiro Yamada <yamada.masahiro@socionext.com>
54bab70a7SMasahiro Yamada  *
64bab70a7SMasahiro Yamada  * SPDX-License-Identifier:	GPL-2.0+
74bab70a7SMasahiro Yamada  */
84bab70a7SMasahiro Yamada 
94bab70a7SMasahiro Yamada #include <common.h>
104bab70a7SMasahiro Yamada #include <linux/io.h>
113ffc7475SMasahiro Yamada #include <linux/kernel.h>
124bab70a7SMasahiro Yamada #include <asm/armv7.h>
133ffc7475SMasahiro Yamada #include <asm/processor.h>
144bab70a7SMasahiro Yamada 
1595a1fecaSMasahiro Yamada #include "cache-uniphier.h"
1695646e1dSMasahiro Yamada 
1795646e1dSMasahiro Yamada /* control registers */
1895646e1dSMasahiro Yamada #define UNIPHIER_SSCC		0x500c0000	/* Control Register */
1995646e1dSMasahiro Yamada #define    UNIPHIER_SSCC_BST			(0x1 << 20)	/* UCWG burst read */
2095646e1dSMasahiro Yamada #define    UNIPHIER_SSCC_ACT			(0x1 << 19)	/* Inst-Data separate */
2195646e1dSMasahiro Yamada #define    UNIPHIER_SSCC_WTG			(0x1 << 18)	/* WT gathering on */
2295646e1dSMasahiro Yamada #define    UNIPHIER_SSCC_PRD			(0x1 << 17)	/* enable pre-fetch */
2395646e1dSMasahiro Yamada #define    UNIPHIER_SSCC_ON			(0x1 <<  0)	/* enable cache */
2495646e1dSMasahiro Yamada #define UNIPHIER_SSCLPDAWCR	0x500c0030	/* Unified/Data Active Way Control */
2595646e1dSMasahiro Yamada #define UNIPHIER_SSCLPIAWCR	0x500c0034	/* Instruction Active Way Control */
2695646e1dSMasahiro Yamada 
2795646e1dSMasahiro Yamada /* revision registers */
2895646e1dSMasahiro Yamada #define UNIPHIER_SSCID		0x503c0100	/* ID Register */
2995646e1dSMasahiro Yamada 
3095646e1dSMasahiro Yamada /* operation registers */
3195646e1dSMasahiro Yamada #define UNIPHIER_SSCOPE		0x506c0244	/* Cache Operation Primitive Entry */
3295646e1dSMasahiro Yamada #define    UNIPHIER_SSCOPE_CM_INV		0x0	/* invalidate */
3395646e1dSMasahiro Yamada #define    UNIPHIER_SSCOPE_CM_CLEAN		0x1	/* clean */
3495646e1dSMasahiro Yamada #define    UNIPHIER_SSCOPE_CM_FLUSH		0x2	/* flush */
3595646e1dSMasahiro Yamada #define    UNIPHIER_SSCOPE_CM_SYNC		0x8	/* sync (drain bufs) */
3695646e1dSMasahiro Yamada #define    UNIPHIER_SSCOPE_CM_FLUSH_PREFETCH	0x9	/* flush p-fetch buf */
3795646e1dSMasahiro Yamada #define UNIPHIER_SSCOQM		0x506c0248
3895646e1dSMasahiro Yamada #define    UNIPHIER_SSCOQM_TID_MASK		(0x3 << 21)
3995646e1dSMasahiro Yamada #define    UNIPHIER_SSCOQM_TID_LRU_DATA		(0x0 << 21)
4095646e1dSMasahiro Yamada #define    UNIPHIER_SSCOQM_TID_LRU_INST		(0x1 << 21)
4195646e1dSMasahiro Yamada #define    UNIPHIER_SSCOQM_TID_WAY		(0x2 << 21)
4295646e1dSMasahiro Yamada #define    UNIPHIER_SSCOQM_S_MASK		(0x3 << 17)
4395646e1dSMasahiro Yamada #define    UNIPHIER_SSCOQM_S_RANGE		(0x0 << 17)
4495646e1dSMasahiro Yamada #define    UNIPHIER_SSCOQM_S_ALL		(0x1 << 17)
4595646e1dSMasahiro Yamada #define    UNIPHIER_SSCOQM_S_WAY		(0x2 << 17)
4695646e1dSMasahiro Yamada #define    UNIPHIER_SSCOQM_CE			(0x1 << 15)	/* notify completion */
4795646e1dSMasahiro Yamada #define    UNIPHIER_SSCOQM_CW			(0x1 << 14)
4895646e1dSMasahiro Yamada #define    UNIPHIER_SSCOQM_CM_MASK		(0x7)
4995646e1dSMasahiro Yamada #define    UNIPHIER_SSCOQM_CM_INV		0x0	/* invalidate */
5095646e1dSMasahiro Yamada #define    UNIPHIER_SSCOQM_CM_CLEAN		0x1	/* clean */
5195646e1dSMasahiro Yamada #define    UNIPHIER_SSCOQM_CM_FLUSH		0x2	/* flush */
5295646e1dSMasahiro Yamada #define    UNIPHIER_SSCOQM_CM_PREFETCH		0x3	/* prefetch to cache */
5395646e1dSMasahiro Yamada #define    UNIPHIER_SSCOQM_CM_PREFETCH_BUF	0x4	/* prefetch to pf-buf */
5495646e1dSMasahiro Yamada #define    UNIPHIER_SSCOQM_CM_TOUCH		0x5	/* touch */
5595646e1dSMasahiro Yamada #define    UNIPHIER_SSCOQM_CM_TOUCH_ZERO	0x6	/* touch to zero */
5695646e1dSMasahiro Yamada #define    UNIPHIER_SSCOQM_CM_TOUCH_DIRTY	0x7	/* touch with dirty */
5795646e1dSMasahiro Yamada #define UNIPHIER_SSCOQAD	0x506c024c	/* Cache Operation Queue Address */
5895646e1dSMasahiro Yamada #define UNIPHIER_SSCOQSZ	0x506c0250	/* Cache Operation Queue Size */
5995646e1dSMasahiro Yamada #define UNIPHIER_SSCOQMASK	0x506c0254	/* Cache Operation Queue Address Mask */
6095646e1dSMasahiro Yamada #define UNIPHIER_SSCOQWN	0x506c0258	/* Cache Operation Queue Way Number */
6195646e1dSMasahiro Yamada #define UNIPHIER_SSCOPPQSEF	0x506c025c	/* Cache Operation Queue Set Complete */
6295646e1dSMasahiro Yamada #define    UNIPHIER_SSCOPPQSEF_FE		(0x1 << 1)
6395646e1dSMasahiro Yamada #define    UNIPHIER_SSCOPPQSEF_OE		(0x1 << 0)
6495646e1dSMasahiro Yamada #define UNIPHIER_SSCOLPQS	0x506c0260	/* Cache Operation Queue Status */
6595646e1dSMasahiro Yamada #define    UNIPHIER_SSCOLPQS_EF			(0x1 << 2)
6695646e1dSMasahiro Yamada #define    UNIPHIER_SSCOLPQS_EST		(0x1 << 1)
6795646e1dSMasahiro Yamada #define    UNIPHIER_SSCOLPQS_QST		(0x1 << 0)
6895646e1dSMasahiro Yamada 
6995646e1dSMasahiro Yamada #define UNIPHIER_SSC_LINE_SIZE		128
7095646e1dSMasahiro Yamada #define UNIPHIER_SSC_RANGE_OP_MAX_SIZE	(0x00400000 - (UNIPHIER_SSC_LINE_SIZE))
714bab70a7SMasahiro Yamada 
723ffc7475SMasahiro Yamada #define UNIPHIER_SSCOQAD_IS_NEEDED(op) \
733ffc7475SMasahiro Yamada 		((op & UNIPHIER_SSCOQM_S_MASK) == UNIPHIER_SSCOQM_S_RANGE)
7495a1fecaSMasahiro Yamada #define UNIPHIER_SSCOQWM_IS_NEEDED(op) \
7559416380SMasahiro Yamada 		(((op & UNIPHIER_SSCOQM_S_MASK) == UNIPHIER_SSCOQM_S_WAY) || \
7659416380SMasahiro Yamada 		 ((op & UNIPHIER_SSCOQM_TID_MASK) == UNIPHIER_SSCOQM_TID_WAY))
773ffc7475SMasahiro Yamada 
783ffc7475SMasahiro Yamada /* uniphier_cache_sync - perform a sync point for a particular cache level */
uniphier_cache_sync(void)794bab70a7SMasahiro Yamada static void uniphier_cache_sync(void)
804bab70a7SMasahiro Yamada {
814bab70a7SMasahiro Yamada 	/* drain internal buffers */
824bab70a7SMasahiro Yamada 	writel(UNIPHIER_SSCOPE_CM_SYNC, UNIPHIER_SSCOPE);
834bab70a7SMasahiro Yamada 	/* need a read back to confirm */
844bab70a7SMasahiro Yamada 	readl(UNIPHIER_SSCOPE);
854bab70a7SMasahiro Yamada }
864bab70a7SMasahiro Yamada 
873ffc7475SMasahiro Yamada /**
883ffc7475SMasahiro Yamada  * uniphier_cache_maint_common - run a queue operation
893ffc7475SMasahiro Yamada  *
903ffc7475SMasahiro Yamada  * @start: start address of range operation (don't care for "all" operation)
913ffc7475SMasahiro Yamada  * @size: data size of range operation (don't care for "all" operation)
9295a1fecaSMasahiro Yamada  * @ways: target ways (don't care for operations other than pre-fetch, touch
933ffc7475SMasahiro Yamada  * @operation: flags to specify the desired cache operation
943ffc7475SMasahiro Yamada  */
uniphier_cache_maint_common(u32 start,u32 size,u32 ways,u32 operation)9595a1fecaSMasahiro Yamada static void uniphier_cache_maint_common(u32 start, u32 size, u32 ways,
9695a1fecaSMasahiro Yamada 					u32 operation)
974bab70a7SMasahiro Yamada {
984bab70a7SMasahiro Yamada 	/* clear the complete notification flag */
994bab70a7SMasahiro Yamada 	writel(UNIPHIER_SSCOLPQS_EF, UNIPHIER_SSCOLPQS);
1004bab70a7SMasahiro Yamada 
1014bab70a7SMasahiro Yamada 	do {
1023ffc7475SMasahiro Yamada 		/* set cache operation */
1033ffc7475SMasahiro Yamada 		writel(UNIPHIER_SSCOQM_CE | operation, UNIPHIER_SSCOQM);
1043ffc7475SMasahiro Yamada 
1053ffc7475SMasahiro Yamada 		/* set address range if needed */
1063ffc7475SMasahiro Yamada 		if (likely(UNIPHIER_SSCOQAD_IS_NEEDED(operation))) {
1073ffc7475SMasahiro Yamada 			writel(start, UNIPHIER_SSCOQAD);
1083ffc7475SMasahiro Yamada 			writel(size, UNIPHIER_SSCOQSZ);
1093ffc7475SMasahiro Yamada 		}
11095a1fecaSMasahiro Yamada 
11195a1fecaSMasahiro Yamada 		/* set target ways if needed */
11295a1fecaSMasahiro Yamada 		if (unlikely(UNIPHIER_SSCOQWM_IS_NEEDED(operation)))
11395a1fecaSMasahiro Yamada 			writel(ways, UNIPHIER_SSCOQWN);
1143ffc7475SMasahiro Yamada 	} while (unlikely(readl(UNIPHIER_SSCOPPQSEF) &
1153ffc7475SMasahiro Yamada 			  (UNIPHIER_SSCOPPQSEF_FE | UNIPHIER_SSCOPPQSEF_OE)));
1164bab70a7SMasahiro Yamada 
1174bab70a7SMasahiro Yamada 	/* wait until the operation is completed */
1183ffc7475SMasahiro Yamada 	while (likely(readl(UNIPHIER_SSCOLPQS) != UNIPHIER_SSCOLPQS_EF))
1193ffc7475SMasahiro Yamada 		cpu_relax();
1203ffc7475SMasahiro Yamada }
1213ffc7475SMasahiro Yamada 
uniphier_cache_maint_all(u32 operation)1223ffc7475SMasahiro Yamada static void uniphier_cache_maint_all(u32 operation)
1233ffc7475SMasahiro Yamada {
12495a1fecaSMasahiro Yamada 	uniphier_cache_maint_common(0, 0, 0, UNIPHIER_SSCOQM_S_ALL | operation);
1253ffc7475SMasahiro Yamada 
1263ffc7475SMasahiro Yamada 	uniphier_cache_sync();
1273ffc7475SMasahiro Yamada }
1283ffc7475SMasahiro Yamada 
uniphier_cache_maint_range(u32 start,u32 end,u32 ways,u32 operation)12995a1fecaSMasahiro Yamada static void uniphier_cache_maint_range(u32 start, u32 end, u32 ways,
13095a1fecaSMasahiro Yamada 				       u32 operation)
1313ffc7475SMasahiro Yamada {
1323ffc7475SMasahiro Yamada 	u32 size;
1333ffc7475SMasahiro Yamada 
1343ffc7475SMasahiro Yamada 	/*
1353ffc7475SMasahiro Yamada 	 * If the start address is not aligned,
1363ffc7475SMasahiro Yamada 	 * perform a cache operation for the first cache-line
1373ffc7475SMasahiro Yamada 	 */
1383ffc7475SMasahiro Yamada 	start = start & ~(UNIPHIER_SSC_LINE_SIZE - 1);
1393ffc7475SMasahiro Yamada 
1403ffc7475SMasahiro Yamada 	size = end - start;
1413ffc7475SMasahiro Yamada 
1423ffc7475SMasahiro Yamada 	if (unlikely(size >= (u32)(-UNIPHIER_SSC_LINE_SIZE))) {
1433ffc7475SMasahiro Yamada 		/* this means cache operation for all range */
1443ffc7475SMasahiro Yamada 		uniphier_cache_maint_all(operation);
1453ffc7475SMasahiro Yamada 		return;
1463ffc7475SMasahiro Yamada 	}
1473ffc7475SMasahiro Yamada 
1483ffc7475SMasahiro Yamada 	/*
1493ffc7475SMasahiro Yamada 	 * If the end address is not aligned,
1503ffc7475SMasahiro Yamada 	 * perform a cache operation for the last cache-line
1513ffc7475SMasahiro Yamada 	 */
1523ffc7475SMasahiro Yamada 	size = ALIGN(size, UNIPHIER_SSC_LINE_SIZE);
1533ffc7475SMasahiro Yamada 
1543ffc7475SMasahiro Yamada 	while (size) {
1553ffc7475SMasahiro Yamada 		u32 chunk_size = min_t(u32, size, UNIPHIER_SSC_RANGE_OP_MAX_SIZE);
1563ffc7475SMasahiro Yamada 
15795a1fecaSMasahiro Yamada 		uniphier_cache_maint_common(start, chunk_size, ways,
1583ffc7475SMasahiro Yamada 					    UNIPHIER_SSCOQM_S_RANGE | operation);
1593ffc7475SMasahiro Yamada 
1603ffc7475SMasahiro Yamada 		start += chunk_size;
1613ffc7475SMasahiro Yamada 		size -= chunk_size;
1623ffc7475SMasahiro Yamada 	}
1634bab70a7SMasahiro Yamada 
1644bab70a7SMasahiro Yamada 	uniphier_cache_sync();
1654bab70a7SMasahiro Yamada }
1664bab70a7SMasahiro Yamada 
uniphier_cache_prefetch_range(u32 start,u32 end,u32 ways)16795a1fecaSMasahiro Yamada void uniphier_cache_prefetch_range(u32 start, u32 end, u32 ways)
16895a1fecaSMasahiro Yamada {
16995a1fecaSMasahiro Yamada 	uniphier_cache_maint_range(start, end, ways,
17095a1fecaSMasahiro Yamada 				   UNIPHIER_SSCOQM_TID_WAY |
17195a1fecaSMasahiro Yamada 				   UNIPHIER_SSCOQM_CM_PREFETCH);
17295a1fecaSMasahiro Yamada }
17395a1fecaSMasahiro Yamada 
uniphier_cache_touch_range(u32 start,u32 end,u32 ways)17495a1fecaSMasahiro Yamada void uniphier_cache_touch_range(u32 start, u32 end, u32 ways)
17595a1fecaSMasahiro Yamada {
17695a1fecaSMasahiro Yamada 	uniphier_cache_maint_range(start, end, ways,
17795a1fecaSMasahiro Yamada 				   UNIPHIER_SSCOQM_TID_WAY |
17895a1fecaSMasahiro Yamada 				   UNIPHIER_SSCOQM_CM_TOUCH);
17995a1fecaSMasahiro Yamada }
18095a1fecaSMasahiro Yamada 
uniphier_cache_touch_zero_range(u32 start,u32 end,u32 ways)18195a1fecaSMasahiro Yamada void uniphier_cache_touch_zero_range(u32 start, u32 end, u32 ways)
18295a1fecaSMasahiro Yamada {
18395a1fecaSMasahiro Yamada 	uniphier_cache_maint_range(start, end, ways,
18495a1fecaSMasahiro Yamada 				   UNIPHIER_SSCOQM_TID_WAY |
18595a1fecaSMasahiro Yamada 				   UNIPHIER_SSCOQM_CM_TOUCH_ZERO);
18695a1fecaSMasahiro Yamada }
18795a1fecaSMasahiro Yamada 
uniphier_cache_inv_way(u32 ways)18859416380SMasahiro Yamada void uniphier_cache_inv_way(u32 ways)
18959416380SMasahiro Yamada {
19059416380SMasahiro Yamada 	uniphier_cache_maint_common(0, 0, ways,
19159416380SMasahiro Yamada 				    UNIPHIER_SSCOQM_S_WAY |
19259416380SMasahiro Yamada 				    UNIPHIER_SSCOQM_CM_INV);
19359416380SMasahiro Yamada }
19459416380SMasahiro Yamada 
uniphier_cache_set_active_ways(int cpu,u32 active_ways)195*ee9bc77fSMasahiro Yamada void uniphier_cache_set_active_ways(int cpu, u32 active_ways)
196*ee9bc77fSMasahiro Yamada {
197*ee9bc77fSMasahiro Yamada 	void __iomem *base = (void __iomem *)UNIPHIER_SSCC + 0xc00;
198*ee9bc77fSMasahiro Yamada 
199*ee9bc77fSMasahiro Yamada 	switch (readl(UNIPHIER_SSCID)) { /* revision */
200*ee9bc77fSMasahiro Yamada 	case 0x12:	/* LD4 */
201*ee9bc77fSMasahiro Yamada 	case 0x16:	/* sld8 */
202*ee9bc77fSMasahiro Yamada 		base = (void __iomem *)UNIPHIER_SSCC + 0x840;
203*ee9bc77fSMasahiro Yamada 		break;
204*ee9bc77fSMasahiro Yamada 	default:
205*ee9bc77fSMasahiro Yamada 		base = (void __iomem *)UNIPHIER_SSCC + 0xc00;
206*ee9bc77fSMasahiro Yamada 		break;
207*ee9bc77fSMasahiro Yamada 	}
208*ee9bc77fSMasahiro Yamada 
209*ee9bc77fSMasahiro Yamada 	writel(active_ways, base + 4 * cpu);
210*ee9bc77fSMasahiro Yamada }
211*ee9bc77fSMasahiro Yamada 
uniphier_cache_endisable(int enable)2126f579db7SMasahiro Yamada static void uniphier_cache_endisable(int enable)
2136f579db7SMasahiro Yamada {
2146f579db7SMasahiro Yamada 	u32 tmp;
2156f579db7SMasahiro Yamada 
2166f579db7SMasahiro Yamada 	tmp = readl(UNIPHIER_SSCC);
2176f579db7SMasahiro Yamada 	if (enable)
2186f579db7SMasahiro Yamada 		tmp |= UNIPHIER_SSCC_ON;
2196f579db7SMasahiro Yamada 	else
2206f579db7SMasahiro Yamada 		tmp &= ~UNIPHIER_SSCC_ON;
2216f579db7SMasahiro Yamada 	writel(tmp, UNIPHIER_SSCC);
2226f579db7SMasahiro Yamada }
2236f579db7SMasahiro Yamada 
uniphier_cache_enable(void)2246f579db7SMasahiro Yamada void uniphier_cache_enable(void)
2256f579db7SMasahiro Yamada {
2266f579db7SMasahiro Yamada 	uniphier_cache_endisable(1);
2276f579db7SMasahiro Yamada }
2286f579db7SMasahiro Yamada 
uniphier_cache_disable(void)2296f579db7SMasahiro Yamada void uniphier_cache_disable(void)
2306f579db7SMasahiro Yamada {
2316f579db7SMasahiro Yamada 	uniphier_cache_endisable(0);
2326f579db7SMasahiro Yamada }
2336f579db7SMasahiro Yamada 
2347382d178SMasahiro Yamada #ifdef CONFIG_CACHE_UNIPHIER
v7_outer_cache_flush_all(void)2354bab70a7SMasahiro Yamada void v7_outer_cache_flush_all(void)
2364bab70a7SMasahiro Yamada {
2374bab70a7SMasahiro Yamada 	uniphier_cache_maint_all(UNIPHIER_SSCOQM_CM_FLUSH);
2384bab70a7SMasahiro Yamada }
2394bab70a7SMasahiro Yamada 
v7_outer_cache_inval_all(void)2404bab70a7SMasahiro Yamada void v7_outer_cache_inval_all(void)
2414bab70a7SMasahiro Yamada {
2424bab70a7SMasahiro Yamada 	uniphier_cache_maint_all(UNIPHIER_SSCOQM_CM_INV);
2434bab70a7SMasahiro Yamada }
2444bab70a7SMasahiro Yamada 
v7_outer_cache_flush_range(u32 start,u32 end)2454bab70a7SMasahiro Yamada void v7_outer_cache_flush_range(u32 start, u32 end)
2464bab70a7SMasahiro Yamada {
24795a1fecaSMasahiro Yamada 	uniphier_cache_maint_range(start, end, 0, UNIPHIER_SSCOQM_CM_FLUSH);
2484bab70a7SMasahiro Yamada }
2494bab70a7SMasahiro Yamada 
v7_outer_cache_inval_range(u32 start,u32 end)2504bab70a7SMasahiro Yamada void v7_outer_cache_inval_range(u32 start, u32 end)
2514bab70a7SMasahiro Yamada {
2524bab70a7SMasahiro Yamada 	if (start & (UNIPHIER_SSC_LINE_SIZE - 1)) {
2534bab70a7SMasahiro Yamada 		start &= ~(UNIPHIER_SSC_LINE_SIZE - 1);
25495a1fecaSMasahiro Yamada 		uniphier_cache_maint_range(start, UNIPHIER_SSC_LINE_SIZE, 0,
2554bab70a7SMasahiro Yamada 					   UNIPHIER_SSCOQM_CM_FLUSH);
2564bab70a7SMasahiro Yamada 		start += UNIPHIER_SSC_LINE_SIZE;
2574bab70a7SMasahiro Yamada 	}
2584bab70a7SMasahiro Yamada 
2594bab70a7SMasahiro Yamada 	if (start >= end) {
2604bab70a7SMasahiro Yamada 		uniphier_cache_sync();
2614bab70a7SMasahiro Yamada 		return;
2624bab70a7SMasahiro Yamada 	}
2634bab70a7SMasahiro Yamada 
2644bab70a7SMasahiro Yamada 	if (end & (UNIPHIER_SSC_LINE_SIZE - 1)) {
2654bab70a7SMasahiro Yamada 		end &= ~(UNIPHIER_SSC_LINE_SIZE - 1);
26695a1fecaSMasahiro Yamada 		uniphier_cache_maint_range(end, UNIPHIER_SSC_LINE_SIZE, 0,
2674bab70a7SMasahiro Yamada 					   UNIPHIER_SSCOQM_CM_FLUSH);
2684bab70a7SMasahiro Yamada 	}
2694bab70a7SMasahiro Yamada 
2704bab70a7SMasahiro Yamada 	if (start >= end) {
2714bab70a7SMasahiro Yamada 		uniphier_cache_sync();
2724bab70a7SMasahiro Yamada 		return;
2734bab70a7SMasahiro Yamada 	}
2744bab70a7SMasahiro Yamada 
27595a1fecaSMasahiro Yamada 	uniphier_cache_maint_range(start, end, 0, UNIPHIER_SSCOQM_CM_INV);
2764bab70a7SMasahiro Yamada }
2774bab70a7SMasahiro Yamada 
v7_outer_cache_enable(void)2784bab70a7SMasahiro Yamada void v7_outer_cache_enable(void)
2794bab70a7SMasahiro Yamada {
280*ee9bc77fSMasahiro Yamada 	uniphier_cache_set_active_ways(0, U32_MAX);	/* activate all ways */
2816f579db7SMasahiro Yamada 	uniphier_cache_enable();
2824bab70a7SMasahiro Yamada }
2834bab70a7SMasahiro Yamada 
v7_outer_cache_disable(void)2844bab70a7SMasahiro Yamada void v7_outer_cache_disable(void)
2854bab70a7SMasahiro Yamada {
2866f579db7SMasahiro Yamada 	uniphier_cache_disable();
2874bab70a7SMasahiro Yamada }
288e731a538SMasahiro Yamada #endif
2894bab70a7SMasahiro Yamada 
enable_caches(void)2904bab70a7SMasahiro Yamada void enable_caches(void)
2914bab70a7SMasahiro Yamada {
2924bab70a7SMasahiro Yamada 	dcache_enable();
2934bab70a7SMasahiro Yamada }
294