Home | History | Annotate | Line # | Download | only in include
      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