Lines Matching +full:cache +full:- +full:size

1 // SPDX-License-Identifier: GPL-2.0+
3 * Copyright (C) 2012-2014 Panasonic Corporation
4 * Copyright (C) 2015-2016 Socionext Inc.
14 #include "cache-uniphier.h"
19 #define UNIPHIER_SSCC_ACT (0x1 << 19) /* Inst-Data separate */
21 #define UNIPHIER_SSCC_PRD (0x1 << 17) /* enable pre-fetch */
22 #define UNIPHIER_SSCC_ON (0x1 << 0) /* enable cache */
30 #define UNIPHIER_SSCOPE 0x506c0244 /* Cache Operation Primitive Entry */
35 #define UNIPHIER_SSCOPE_CM_FLUSH_PREFETCH 0x9 /* flush p-fetch buf */
51 #define UNIPHIER_SSCOQM_CM_PREFETCH 0x3 /* prefetch to cache */
52 #define UNIPHIER_SSCOQM_CM_PREFETCH_BUF 0x4 /* prefetch to pf-buf */
56 #define UNIPHIER_SSCOQAD 0x506c024c /* Cache Operation Queue Address */
57 #define UNIPHIER_SSCOQSZ 0x506c0250 /* Cache Operation Queue Size */
58 #define UNIPHIER_SSCOQMASK 0x506c0254 /* Cache Operation Queue Address Mask */
59 #define UNIPHIER_SSCOQWN 0x506c0258 /* Cache Operation Queue Way Number */
60 #define UNIPHIER_SSCOPPQSEF 0x506c025c /* Cache Operation Queue Set Complete */
63 #define UNIPHIER_SSCOLPQS 0x506c0260 /* Cache Operation Queue Status */
69 #define UNIPHIER_SSC_RANGE_OP_MAX_SIZE (0x00400000 - (UNIPHIER_SSC_LINE_SIZE))
77 /* uniphier_cache_sync - perform a sync point for a particular cache level */
87 * uniphier_cache_maint_common - run a queue operation
90 * @size: data size of range operation (don't care for "all" operation)
91 * @ways: target ways (don't care for operations other than pre-fetch, touch
92 * @operation: flags to specify the desired cache operation
94 static void uniphier_cache_maint_common(u32 start, u32 size, u32 ways, in uniphier_cache_maint_common() argument
101 /* set cache operation */ in uniphier_cache_maint_common()
107 writel(size, UNIPHIER_SSCOQSZ); in uniphier_cache_maint_common()
131 u32 size; in uniphier_cache_maint_range() local
135 * perform a cache operation for the first cache-line in uniphier_cache_maint_range()
137 start = start & ~(UNIPHIER_SSC_LINE_SIZE - 1); in uniphier_cache_maint_range()
139 size = end - start; in uniphier_cache_maint_range()
141 if (unlikely(size >= (u32)(-UNIPHIER_SSC_LINE_SIZE))) { in uniphier_cache_maint_range()
142 /* this means cache operation for all range */ in uniphier_cache_maint_range()
149 * perform a cache operation for the last cache-line in uniphier_cache_maint_range()
151 size = ALIGN(size, UNIPHIER_SSC_LINE_SIZE); in uniphier_cache_maint_range()
153 while (size) { in uniphier_cache_maint_range()
154 u32 chunk_size = min_t(u32, size, UNIPHIER_SSC_RANGE_OP_MAX_SIZE); in uniphier_cache_maint_range()
160 size -= chunk_size; in uniphier_cache_maint_range()
251 if (start & (UNIPHIER_SSC_LINE_SIZE - 1)) { in v7_outer_cache_inval_range()
252 start &= ~(UNIPHIER_SSC_LINE_SIZE - 1); in v7_outer_cache_inval_range()
263 if (end & (UNIPHIER_SSC_LINE_SIZE - 1)) { in v7_outer_cache_inval_range()
264 end &= ~(UNIPHIER_SSC_LINE_SIZE - 1); in v7_outer_cache_inval_range()