0001
0002
0003
0004
0005
0006
0007
0008 #ifndef _SPARC_ROSS_H
0009 #define _SPARC_ROSS_H
0010
0011 #include <asm/asi.h>
0012 #include <asm/page.h>
0013
0014
0015
0016
0017
0018
0019
0020
0021
0022
0023
0024
0025
0026
0027
0028
0029
0030
0031
0032
0033
0034
0035
0036
0037
0038
0039
0040
0041
0042
0043
0044 #define HYPERSPARC_CWENABLE 0x00200000
0045 #define HYPERSPARC_SBENABLE 0x00100000
0046 #define HYPERSPARC_WBENABLE 0x00080000
0047 #define HYPERSPARC_MIDMASK 0x00078000
0048 #define HYPERSPARC_BMODE 0x00004000
0049 #define HYPERSPARC_ACENABLE 0x00002000
0050 #define HYPERSPARC_CSIZE 0x00001000
0051 #define HYPERSPARC_MRFLCT 0x00000800
0052 #define HYPERSPARC_CMODE 0x00000400
0053 #define HYPERSPARC_CENABLE 0x00000100
0054 #define HYPERSPARC_NFAULT 0x00000002
0055 #define HYPERSPARC_MENABLE 0x00000001
0056
0057
0058
0059
0060
0061
0062
0063
0064
0065
0066
0067
0068
0069
0070
0071
0072
0073
0074
0075
0076
0077
0078
0079
0080
0081
0082
0083
0084
0085
0086
0087
0088
0089
0090
0091
0092
0093
0094
0095 #define HYPERSPARC_ICCR_FTD 0x00000002
0096 #define HYPERSPARC_ICCR_ICE 0x00000001
0097
0098 #ifndef __ASSEMBLY__
0099
0100 static inline unsigned int get_ross_icr(void)
0101 {
0102 unsigned int icreg;
0103
0104 __asm__ __volatile__(".word 0x8347c000\n\t"
0105 "mov %%g1, %0\n\t"
0106 : "=r" (icreg)
0107 :
0108 : "g1", "memory");
0109
0110 return icreg;
0111 }
0112
0113 static inline void put_ross_icr(unsigned int icreg)
0114 {
0115 __asm__ __volatile__("or %%g0, %0, %%g1\n\t"
0116 ".word 0xbf806000\n\t"
0117 "nop\n\t"
0118 "nop\n\t"
0119 "nop\n\t"
0120 :
0121 : "r" (icreg)
0122 : "g1", "memory");
0123
0124 return;
0125 }
0126
0127
0128
0129
0130 static inline void hyper_flush_whole_icache(void)
0131 {
0132 __asm__ __volatile__("sta %%g0, [%%g0] %0\n\t"
0133 :
0134 : "i" (ASI_M_FLUSH_IWHOLE)
0135 : "memory");
0136 return;
0137 }
0138
0139 extern int vac_cache_size;
0140 extern int vac_line_size;
0141
0142 static inline void hyper_clear_all_tags(void)
0143 {
0144 unsigned long addr;
0145
0146 for(addr = 0; addr < vac_cache_size; addr += vac_line_size)
0147 __asm__ __volatile__("sta %%g0, [%0] %1\n\t"
0148 :
0149 : "r" (addr), "i" (ASI_M_DATAC_TAG)
0150 : "memory");
0151 }
0152
0153 static inline void hyper_flush_unconditional_combined(void)
0154 {
0155 unsigned long addr;
0156
0157 for (addr = 0; addr < vac_cache_size; addr += vac_line_size)
0158 __asm__ __volatile__("sta %%g0, [%0] %1\n\t"
0159 :
0160 : "r" (addr), "i" (ASI_M_FLUSH_CTX)
0161 : "memory");
0162 }
0163
0164 static inline void hyper_flush_cache_user(void)
0165 {
0166 unsigned long addr;
0167
0168 for (addr = 0; addr < vac_cache_size; addr += vac_line_size)
0169 __asm__ __volatile__("sta %%g0, [%0] %1\n\t"
0170 :
0171 : "r" (addr), "i" (ASI_M_FLUSH_USER)
0172 : "memory");
0173 }
0174
0175 static inline void hyper_flush_cache_page(unsigned long page)
0176 {
0177 unsigned long end;
0178
0179 page &= PAGE_MASK;
0180 end = page + PAGE_SIZE;
0181 while (page < end) {
0182 __asm__ __volatile__("sta %%g0, [%0] %1\n\t"
0183 :
0184 : "r" (page), "i" (ASI_M_FLUSH_PAGE)
0185 : "memory");
0186 page += vac_line_size;
0187 }
0188 }
0189
0190 #endif
0191
0192 #endif