cache_octeon.h revision 1.3 1 1.3 simonb /* $NetBSD: cache_octeon.h,v 1.3 2019/04/11 09:18:55 simonb Exp $ */
2 1.1 hikaru
3 1.1 hikaru #define CACHE_OCTEON_I 0
4 1.1 hikaru #define CACHE_OCTEON_D 1
5 1.1 hikaru
6 1.1 hikaru #define CACHEOP_OCTEON_INV_ALL (0 << 2) /* I, D */
7 1.1 hikaru #define CACHEOP_OCTEON_INDEX_LOAD_TAG (1 << 2) /* I, D */
8 1.1 hikaru #define CACHEOP_OCTEON_BITMAP_STORE (3 << 2) /* I */
9 1.1 hikaru #define CACHEOP_OCTEON_VIRTUAL_TAG_INV (4 << 2) /* D */
10 1.1 hikaru
11 1.1 hikaru #if !defined(_LOCORE)
12 1.1 hikaru
13 1.1 hikaru /*
14 1.1 hikaru * cache_octeon_invalidate:
15 1.1 hikaru *
16 1.3 simonb * Invalidate all cache blocks.
17 1.1 hikaru * Argument "op" must be CACHE_OCTEON_I or CACHE_OCTEON_D.
18 1.1 hikaru * In Octeon specification, invalidate instruction works
19 1.1 hikaru * all cache blocks.
20 1.1 hikaru */
21 1.1 hikaru #define cache_octeon_invalidate(op) \
22 1.1 hikaru do { \
23 1.1 hikaru __asm __volatile( \
24 1.1 hikaru ".set noreorder \n\t" \
25 1.1 hikaru "cache %0, 0($0) \n\t" \
26 1.1 hikaru ".set reorder" \
27 1.1 hikaru : \
28 1.1 hikaru : "i" (op) \
29 1.1 hikaru : "memory"); \
30 1.1 hikaru } while (/*CONSTCOND*/0)
31 1.1 hikaru
32 1.1 hikaru /*
33 1.1 hikaru * cache_octeon_op_line:
34 1.1 hikaru *
35 1.1 hikaru * Perform the specified cache operation on a single line.
36 1.1 hikaru */
37 1.1 hikaru #define cache_op_octeon_line(va, op) \
38 1.1 hikaru do { \
39 1.1 hikaru __asm __volatile( \
40 1.1 hikaru ".set noreorder \n\t" \
41 1.1 hikaru "cache %1, 0(%0) \n\t" \
42 1.1 hikaru ".set reorder" \
43 1.1 hikaru : \
44 1.1 hikaru : "r" (va), "i" (op) \
45 1.1 hikaru : "memory"); \
46 1.1 hikaru } while (/*CONSTCOND*/0)
47 1.1 hikaru
48 1.1 hikaru void octeon_icache_sync_all(void);
49 1.2 matt void octeon_icache_sync_range(register_t va, vsize_t size);
50 1.1 hikaru void octeon_icache_sync_range_index(vaddr_t va, vsize_t size);
51 1.1 hikaru void octeon_pdcache_inv_all(void);
52 1.2 matt void octeon_pdcache_inv_range(register_t va, vsize_t size);
53 1.1 hikaru void octeon_pdcache_inv_range_index(vaddr_t va, vsize_t size);
54 1.2 matt void octeon_pdcache_wb_range(register_t va, vsize_t size);
55 1.1 hikaru
56 1.1 hikaru #endif /* !_LOCORE */
57