Skip to content

Commit 663c519

Browse files
committed
ARCv2: MMUv4: Support aliasing icache config
This is default for AXS103 release Signed-off-by: Vineet Gupta <[email protected]>
1 parent 33651fb commit 663c519

File tree

2 files changed

+54
-2
lines changed

2 files changed

+54
-2
lines changed

arch/arc/include/asm/cache.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -62,7 +62,7 @@ extern int ioc_exists;
6262
#define ARC_REG_IC_IVIC 0x10
6363
#define ARC_REG_IC_CTRL 0x11
6464
#define ARC_REG_IC_IVIL 0x19
65-
#if defined(CONFIG_ARC_MMU_V3)
65+
#if defined(CONFIG_ARC_MMU_V3) || defined(CONFIG_ARC_MMU_V4)
6666
#define ARC_REG_IC_PTAG 0x1E
6767
#endif
6868

arch/arc/mm/cache_arc700.c

Lines changed: 53 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -76,6 +76,8 @@
7676
static int l2_line_sz;
7777
int ioc_exists;
7878

79+
void (*_cache_line_loop_ic_fn)(unsigned long paddr, unsigned long vaddr,
80+
unsigned long sz, const int cacheop);
7981
void (*__dma_cache_wback_inv)(unsigned long start, unsigned long sz);
8082
void (*__dma_cache_inv)(unsigned long start, unsigned long sz);
8183
void (*__dma_cache_wback)(unsigned long start, unsigned long sz);
@@ -320,6 +322,45 @@ static inline void __cache_line_loop(unsigned long paddr, unsigned long vaddr,
320322
}
321323
}
322324

325+
static inline void
326+
__cache_line_loop_ic_alias(unsigned long paddr, unsigned long vaddr,
327+
unsigned long sz, const int cacheop)
328+
{
329+
unsigned int aux_cmd, aux_tag;
330+
int num_lines;
331+
const int full_page_op = __builtin_constant_p(sz) && sz == PAGE_SIZE;
332+
333+
aux_cmd = ARC_REG_IC_IVIL;
334+
aux_tag = ARC_REG_IC_PTAG;
335+
336+
/* Ensure we properly floor/ceil the non-line aligned/sized requests
337+
* and have @paddr - aligned to cache line and integral @num_lines.
338+
* This however can be avoided for page sized since:
339+
* -@paddr will be cache-line aligned already (being page aligned)
340+
* -@sz will be integral multiple of line size (being page sized).
341+
*/
342+
if (!full_page_op) {
343+
sz += paddr & ~CACHE_LINE_MASK;
344+
paddr &= CACHE_LINE_MASK;
345+
vaddr &= CACHE_LINE_MASK;
346+
} else {
347+
/* V-P const, PTAG can be written once outside loop */
348+
write_aux_reg(aux_tag, paddr);
349+
}
350+
351+
num_lines = DIV_ROUND_UP(sz, L1_CACHE_BYTES);
352+
353+
while (num_lines-- > 0) {
354+
if (!full_page_op) {
355+
write_aux_reg(aux_tag, paddr);
356+
paddr += L1_CACHE_BYTES;
357+
}
358+
359+
write_aux_reg(aux_cmd, vaddr);
360+
vaddr += L1_CACHE_BYTES;
361+
}
362+
}
363+
323364
#endif
324365

325366

@@ -471,7 +512,7 @@ __ic_line_inv_vaddr_local(unsigned long paddr, unsigned long vaddr,
471512
unsigned long flags;
472513

473514
local_irq_save(flags);
474-
__cache_line_loop(paddr, vaddr, sz, OP_INV_IC);
515+
(*_cache_line_loop_ic_fn)(paddr, vaddr, sz, OP_INV_IC);
475516
local_irq_restore(flags);
476517
}
477518

@@ -910,6 +951,17 @@ void arc_cache_init(void)
910951
if (ic->ver != CONFIG_ARC_MMU_VER)
911952
panic("Cache ver [%d] doesn't match MMU ver [%d]\n",
912953
ic->ver, CONFIG_ARC_MMU_VER);
954+
955+
#if (CONFIG_ARC_MMU_VER >= 4)
956+
/*
957+
* In MMU v4 (HS38x) the alising icache config uses IVIL/PTAG
958+
* pair to provide vaddr/paddr respectively, just as in MMU v3
959+
*/
960+
if (ic->alias)
961+
_cache_line_loop_ic_fn = __cache_line_loop_ic_alias;
962+
else
963+
#endif
964+
_cache_line_loop_ic_fn = __cache_line_loop;
913965
}
914966

915967
if (IS_ENABLED(CONFIG_ARC_HAS_DCACHE)) {

0 commit comments

Comments
 (0)