1 1.5 simonb /* $NetBSD: cache_octeon.h,v 1.5 2020/07/26 08:08:41 simonb Exp $ */ 2 1.4 simonb 3 1.4 simonb #ifndef _MIPS_CACHE_OCTEON_H_ 4 1.5 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