#ifndef _SH_CACHE_SH3_H_
#define _SH_CACHE_SH3_H_
#include <sh/devreg.h>
#ifdef _KERNEL
#define SH3_CCR 0xffffffec
#define SH3_CCR_CE 0x00000001
#define SH3_CCR_WT 0x00000002
#define SH3_CCR_CB 0x00000004
#define SH3_CCR_CF 0x00000008
#define SH3_CCR_RA 0x00000020
#define SH7709A_CCR2 0xa40000b0
#define SH7709A_CCR2_W2LOCK 0x00000001
#define SH7709A_CCR2_W2LOAD 0x00000002
#define SH7709A_CCR2_W3LOCK 0x00000100
#define SH7709A_CCR2_W3LOAD 0x00000200
#define SH3_CCA 0xf0000000
#define CCA_A 0x00000008
#define CCA_ENTRY_SHIFT 4
#define CCA_8K_ENTRY 128
#define CCA_8K_ENTRY_MASK 0x000007f0
#define CCA_8K_WAY_SHIFT 11
#define CCA_8K_WAY_MASK 0x00001800
#define CCA_16K_ENTRY 256
#define CCA_16K_ENTRY_MASK 0x00000ff0
#define CCA_16K_WAY_SHIFT 12
#define CCA_16K_WAY_MASK 0x00003000
#define CCA_V 0x00000001
#define CCA_U 0x00000002
#define CCA_LRU_SHIFT 4
#define CCA_LRU_MASK 0x000003f0
#define CCA_TAGADDR_SHIFT 10
#define CCA_TAGADDR_MASK 0xfffffc00
#define SH3_CCD 0xf1000000
#define CCD_L_SHIFT 2
#define CCD_L_MASK 0x0000000c
#define CCD_E_SHIFT 4
#define CCD_8K_E_MASK 0x000007f0
#define CCD_16K_E_MASK 0x00000ff0
#define CCD_8K_W_SHIFT 11
#define CCD_8K_W_MASK 0x00001800
#define CCD_16K_W_SHIFT 12
#define CCD_16K_W_MASK 0x00003000
#define SH3_CACHE_LINESZ 16
#define SH3_CACHE_NORMAL_WAY 4
#define SH3_CACHE_RAMMODE_WAY 2
#define SH3_CACHE_8K_ENTRY 128
#define SH3_CACHE_8K_WAY_NORMAL 4
#define SH3_CACHE_8K_WAY_RAMMODE 2
#define SH3_CACHE_16K_ENTRY 256
#define SH3_CACHE_16K_WAY 4
#define SH3_CACHE_8K_FLUSH(maxway) \
do { \
uint32_t __e, __w, __wa, __a; \
\
for (__w = 0; __w < maxway; __w++) { \
__wa = SH3_CCA | __w << CCA_8K_WAY_SHIFT; \
for (__e = 0; __e < CCA_8K_ENTRY; __e++) { \
__a = __wa |(__e << CCA_ENTRY_SHIFT); \
(*(volatile uint32_t *)__a) &= \
~(CCA_U | CCA_V); \
} \
} \
} while (0)
#define SH3_CACHE_16K_FLUSH() \
do { \
uint32_t __e, __w, __wa, __a; \
\
for (__w = 0; __w < SH3_CACHE_16K_WAY; __w++) { \
__wa = SH3_CCA | __w << CCA_16K_WAY_SHIFT; \
for (__e = 0; __e < CCA_16K_ENTRY; __e++) { \
__a = __wa |(__e << CCA_ENTRY_SHIFT); \
(*(volatile uint32_t *)__a) &= \
~(CCA_U | CCA_V); \
} \
} \
} while (0)
#define SH7708_CACHE_FLUSH() SH3_CACHE_8K_FLUSH(4)
#define SH7708_CACHE_FLUSH_RAMMODE() SH3_CACHE_8K_FLUSH(2)
#define SH7708S_CACHE_FLUSH() SH3_CACHE_8K_FLUSH(4)
#define SH7708S_CACHE_FLUSH_RAMMODE() SH3_CACHE_8K_FLUSH(2)
#define SH7708R_CACHE_FLUSH() SH3_CACHE_8K_FLUSH(4)
#define SH7708R_CACHE_FLUSH_RAMMODE() SH3_CACHE_8K_FLUSH(2)
#define SH7709_CACHE_FLUSH() SH3_CACHE_8K_FLUSH(4)
#define SH7709_CACHE_FLUSH_RAMMODE() SH3_CACHE_8K_FLUSH(2)
#define SH7709A_CACHE_FLUSH() SH3_CACHE_16K_FLUSH()
#ifndef _LOCORE
extern void sh3_cache_config(void);
#endif
#endif
#endif