cache_octeon.h revision 1.4 1 1.4 simonb /* $NetBSD: cache_octeon.h,v 1.4 2020/06/14 08:43:07 simonb Exp $ */
2 1.4 simonb
3 1.4 simonb #ifndef _MIPS_CACHE_OCTEON_H_
4 1.4 simonb #define _MIPS_CACHE_OCTEON_H_
5 1.1 hikaru
6 1.1 hikaru #define CACHE_OCTEON_I 0
7 1.1 hikaru #define CACHE_OCTEON_D 1
8 1.1 hikaru
9 1.1 hikaru #define CACHEOP_OCTEON_INV_ALL (0 << 2) /* I, D */
10 1.1 hikaru #define CACHEOP_OCTEON_INDEX_LOAD_TAG (1 << 2) /* I, D */
11 1.1 hikaru #define CACHEOP_OCTEON_BITMAP_STORE (3 << 2) /* I */
12 1.1 hikaru #define CACHEOP_OCTEON_VIRTUAL_TAG_INV (4 << 2) /* D */
13 1.1 hikaru
14 1.4 simonb #define OCTEON_CACHELINE_SIZE 128
15 1.4 simonb
16 1.4 simonb /*
17 1.4 simonb * Note that for the Dcache the 50XX manual says 1 set per way (Config1
18 1.4 simonb * register - DS=0 ("... actual is 1"), p173) as does U-boot sources,
19 1.4 simonb * however this only adds up to an 8kB Dcache. The 50XX manual
20 1.4 simonb * elsewhere references a 16kB Dcache as does the CN50XX product brief.
21 1.4 simonb * The original NetBSD code, current OpenBSD and Linux code all use 2
22 1.4 simonb * sets per way. lmbench's "cache" program also detects a 16kB Dcache.
23 1.4 simonb * So we assume that all Octeon 1 and Octeon Plus cores have a 16kB
24 1.4 simonb * Dcache.
25 1.4 simonb */
26 1.4 simonb #define OCTEON_I_DCACHE_WAYS 64
27 1.4 simonb #define OCTEON_I_DCACHE_SETS 2
28 1.4 simonb
29 1.4 simonb #define OCTEON_II_DCACHE_SETS 8
30 1.4 simonb #define OCTEON_II_DCACHE_WAYS 32
31 1.4 simonb #define OCTEON_II_ICACHE_SETS 8
32 1.4 simonb #define OCTEON_II_ICACHE_WAYS 37
33 1.4 simonb
34 1.4 simonb #define OCTEON_III_DCACHE_SETS 8
35 1.4 simonb #define OCTEON_III_DCACHE_WAYS 32
36 1.4 simonb #define OCTEON_III_ICACHE_SETS 16
37 1.4 simonb #define OCTEON_III_ICACHE_WAYS 39
38 1.4 simonb
39 1.1 hikaru #if !defined(_LOCORE)
40 1.1 hikaru
41 1.1 hikaru /*
42 1.1 hikaru * cache_octeon_invalidate:
43 1.1 hikaru *
44 1.3 simonb * Invalidate all cache blocks.
45 1.1 hikaru * Argument "op" must be CACHE_OCTEON_I or CACHE_OCTEON_D.
46 1.1 hikaru * In Octeon specification, invalidate instruction works
47 1.1 hikaru * all cache blocks.
48 1.1 hikaru */
49 1.1 hikaru #define cache_octeon_invalidate(op) \
50 1.1 hikaru do { \
51 1.1 hikaru __asm __volatile( \
52 1.1 hikaru ".set noreorder \n\t" \
53 1.1 hikaru "cache %0, 0($0) \n\t" \
54 1.1 hikaru ".set reorder" \
55 1.1 hikaru : \
56 1.1 hikaru : "i" (op) \
57 1.1 hikaru : "memory"); \
58 1.1 hikaru } while (/*CONSTCOND*/0)
59 1.1 hikaru
60 1.1 hikaru /*
61 1.1 hikaru * cache_octeon_op_line:
62 1.1 hikaru *
63 1.1 hikaru * Perform the specified cache operation on a single line.
64 1.1 hikaru */
65 1.1 hikaru #define cache_op_octeon_line(va, op) \
66 1.1 hikaru do { \
67 1.1 hikaru __asm __volatile( \
68 1.1 hikaru ".set noreorder \n\t" \
69 1.1 hikaru "cache %1, 0(%0) \n\t" \
70 1.1 hikaru ".set reorder" \
71 1.1 hikaru : \
72 1.1 hikaru : "r" (va), "i" (op) \
73 1.1 hikaru : "memory"); \
74 1.1 hikaru } while (/*CONSTCOND*/0)
75 1.1 hikaru
76 1.1 hikaru void octeon_icache_sync_all(void);
77 1.2 matt void octeon_icache_sync_range(register_t va, vsize_t size);
78 1.1 hikaru void octeon_icache_sync_range_index(vaddr_t va, vsize_t size);
79 1.1 hikaru void octeon_pdcache_inv_all(void);
80 1.2 matt void octeon_pdcache_inv_range(register_t va, vsize_t size);
81 1.1 hikaru void octeon_pdcache_inv_range_index(vaddr_t va, vsize_t size);
82 1.2 matt void octeon_pdcache_wb_range(register_t va, vsize_t size);
83 1.1 hikaru
84 1.1 hikaru #endif /* !_LOCORE */
85 1.4 simonb #endif /* _MIPS_CACHE_OCTEON_H_ */
86