1 1.71 rillig /* $NetBSD: ctlreg.h,v 1.71 2024/03/10 17:34:47 rillig Exp $ */ 2 1.1 eeh 3 1.1 eeh /* 4 1.30 eeh * Copyright (c) 1996-2002 Eduardo Horvath 5 1.1 eeh * 6 1.1 eeh * Redistribution and use in source and binary forms, with or without 7 1.1 eeh * modification, are permitted provided that the following conditions 8 1.1 eeh * are met: 9 1.1 eeh * 1. Redistributions of source code must retain the above copyright 10 1.1 eeh * notice, this list of conditions and the following disclaimer. 11 1.11 eeh * 12 1.11 eeh * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND 13 1.1 eeh * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 14 1.1 eeh * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 15 1.11 eeh * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE 16 1.1 eeh * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 17 1.1 eeh * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 18 1.1 eeh * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 19 1.1 eeh * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 20 1.1 eeh * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 21 1.1 eeh * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 22 1.1 eeh * SUCH DAMAGE. 23 1.1 eeh * 24 1.1 eeh */ 25 1.1 eeh 26 1.33 petrov #ifndef _SPARC_CTLREG_H_ 27 1.33 petrov #define _SPARC_CTLREG_H_ 28 1.33 petrov 29 1.1 eeh /* 30 1.1 eeh * Sun 4u control registers. (includes address space definitions 31 1.1 eeh * and some registers in control space). 32 1.1 eeh */ 33 1.1 eeh 34 1.1 eeh /* 35 1.1 eeh * The Alternate address spaces. 36 1.1 eeh * 37 1.1 eeh * 0x00-0x7f are privileged 38 1.1 eeh * 0x80-0xff can be used by users 39 1.1 eeh */ 40 1.1 eeh 41 1.26 eeh #define ASI_LITTLE 0x08 /* This bit should make an ASI little endian */ 42 1.1 eeh 43 1.26 eeh #define ASI_NUCLEUS 0x04 /* [4u] kernel address space */ 44 1.26 eeh #define ASI_NUCLEUS_LITTLE 0x0c /* [4u] kernel address space, little endian */ 45 1.1 eeh 46 1.26 eeh #define ASI_AS_IF_USER_PRIMARY 0x10 /* [4u] primary user address space */ 47 1.26 eeh #define ASI_AS_IF_USER_SECONDARY 0x11 /* [4u] secondary user address space */ 48 1.1 eeh 49 1.26 eeh #define ASI_PHYS_CACHED 0x14 /* [4u] MMU bypass to main memory */ 50 1.26 eeh #define ASI_PHYS_NON_CACHED 0x15 /* [4u] MMU bypass to I/O location */ 51 1.26 eeh 52 1.26 eeh #define ASI_AS_IF_USER_PRIMARY_LITTLE 0x18 /* [4u] primary user address space, little endian */ 53 1.35 heas #define ASI_AS_IF_USER_SECONDARY_LITTLE 0x19 /* [4u] secondary user address space, little endian */ 54 1.26 eeh 55 1.26 eeh #define ASI_PHYS_CACHED_LITTLE 0x1c /* [4u] MMU bypass to main memory, little endian */ 56 1.26 eeh #define ASI_PHYS_NON_CACHED_LITTLE 0x1d /* [4u] MMU bypass to I/O location, little endian */ 57 1.26 eeh 58 1.63 palle #define ASI_MMU_CONTEXTID 0x21 /* [4v] MMU context control - both IMMU and DMMU */ 59 1.61 palle 60 1.26 eeh #define ASI_NUCLEUS_QUAD_LDD 0x24 /* [4u] use w/LDDA to load 128-bit item */ 61 1.62 palle #define ASI_QUEUE 0x25 /* [4v] interrupt queue registers */ 62 1.26 eeh #define ASI_NUCLEUS_QUAD_LDD_LITTLE 0x2c /* [4u] use w/LDDA to load 128-bit item, little endian */ 63 1.26 eeh 64 1.26 eeh #define ASI_FLUSH_D_PAGE_PRIMARY 0x38 /* [4u] flush D-cache page using primary context */ 65 1.26 eeh #define ASI_FLUSH_D_PAGE_SECONDARY 0x39 /* [4u] flush D-cache page using secondary context */ 66 1.26 eeh #define ASI_FLUSH_D_CTX_PRIMARY 0x3a /* [4u] flush D-cache context using primary context */ 67 1.26 eeh #define ASI_FLUSH_D_CTX_SECONDARY 0x3b /* [4u] flush D-cache context using secondary context */ 68 1.26 eeh 69 1.46 mrg #define ASI_DCACHE_INVALIDATE 0x42 /* [III] invalidate D-cache */ 70 1.46 mrg #define ASI_DCACHE_UTAG 0x43 /* [III] diagnostic access to D-cache micro tag */ 71 1.46 mrg #define ASI_DCACHE_SNOOP_TAG 0x44 /* [III] diagnostic access to D-cache snoop tag RAM */ 72 1.46 mrg 73 1.26 eeh #define ASI_LSU_CONTROL_REGISTER 0x45 /* [4u] load/store unit control register */ 74 1.26 eeh 75 1.26 eeh #define ASI_DCACHE_DATA 0x46 /* [4u] diagnostic access to D-cache data RAM */ 76 1.26 eeh #define ASI_DCACHE_TAG 0x47 /* [4u] diagnostic access to D-cache tag RAM */ 77 1.26 eeh 78 1.26 eeh #define ASI_INTR_DISPATCH_STATUS 0x48 /* [4u] interrupt dispatch status register */ 79 1.26 eeh #define ASI_INTR_RECEIVE 0x49 /* [4u] interrupt receive status register */ 80 1.26 eeh #define ASI_MID_REG 0x4a /* [4u] hardware config and MID */ 81 1.26 eeh #define ASI_ERROR_EN_REG 0x4b /* [4u] asynchronous error enables */ 82 1.26 eeh #define ASI_AFSR 0x4c /* [4u] asynchronous fault status register */ 83 1.26 eeh #define ASI_AFAR 0x4d /* [4u] asynchronous fault address register */ 84 1.26 eeh 85 1.51 mrg #define ASI_ICACHE_DATA 0x66 /* [4u] diagnostic access to I-cache data RAM */ 86 1.51 mrg #define ASI_ICACHE_TAG 0x67 /* [4u] diagnostic access to I-cache tag RAM */ 87 1.51 mrg #define ASI_FLUSH_I_PAGE_PRIMARY 0x68 /* [4u] flush I-cache page using primary context */ 88 1.51 mrg #define ASI_FLUSH_I_PAGE_SECONDARY 0x69 /* [4u] flush I-cache page using secondary context */ 89 1.51 mrg #define ASI_FLUSH_I_CTX_PRIMARY 0x6a /* [4u] flush I-cache context using primary context */ 90 1.51 mrg #define ASI_FLUSH_I_CTX_SECONDARY 0x6b /* [4u] flush I-cache context using secondary context */ 91 1.26 eeh 92 1.26 eeh #define ASI_BLOCK_AS_IF_USER_PRIMARY 0x70 /* [4u] primary user address space, block loads/stores */ 93 1.26 eeh #define ASI_BLOCK_AS_IF_USER_SECONDARY 0x71 /* [4u] secondary user address space, block loads/stores */ 94 1.26 eeh 95 1.26 eeh #define ASI_ECACHE_DIAG 0x76 /* [4u] diag access to E-cache tag and data */ 96 1.26 eeh #define ASI_DATAPATH_ERR_REG_WRITE 0x77 /* [4u] ASI is reused */ 97 1.26 eeh 98 1.26 eeh #define ASI_BLOCK_AS_IF_USER_PRIMARY_LITTLE 0x78 /* [4u] primary user address space, block loads/stores */ 99 1.26 eeh #define ASI_BLOCK_AS_IF_USER_SECONDARY_LITTLE 0x79 /* [4u] secondary user address space, block loads/stores */ 100 1.26 eeh 101 1.26 eeh #define ASI_INTERRUPT_RECEIVE_DATA 0x7f /* [4u] interrupt receive data registers {0,1,2} */ 102 1.26 eeh #define ASI_DATAPATH_ERR_REG_READ 0x7f /* [4u] read access to datapath error registers (ASI reused) */ 103 1.26 eeh 104 1.26 eeh #define ASI_PRIMARY 0x80 /* [4u] primary address space */ 105 1.26 eeh #define ASI_SECONDARY 0x81 /* [4u] secondary address space */ 106 1.28 eeh #define ASI_PRIMARY_NOFAULT 0x82 /* [4u] primary address space, no fault */ 107 1.28 eeh #define ASI_SECONDARY_NOFAULT 0x83 /* [4u] secondary address space, no fault */ 108 1.26 eeh 109 1.26 eeh #define ASI_PRIMARY_LITTLE 0x88 /* [4u] primary address space, little endian */ 110 1.26 eeh #define ASI_SECONDARY_LITTLE 0x89 /* [4u] secondary address space, little endian */ 111 1.28 eeh #define ASI_PRIMARY_NOFAULT_LITTLE 0x8a /* [4u] primary address space, no fault, little endian */ 112 1.28 eeh #define ASI_SECONDARY_NOFAULT_LITTLE 0x8b /* [4u] secondary address space, no fault, little endian */ 113 1.26 eeh 114 1.26 eeh #define ASI_PST8_PRIMARY 0xc0 /* [VIS] Eight 8-bit partial store, primary */ 115 1.26 eeh #define ASI_PST8_SECONDARY 0xc1 /* [VIS] Eight 8-bit partial store, secondary */ 116 1.26 eeh #define ASI_PST16_PRIMARY 0xc2 /* [VIS] Four 16-bit partial store, primary */ 117 1.26 eeh #define ASI_PST16_SECONDARY 0xc3 /* [VIS] Fout 16-bit partial store, secondary */ 118 1.26 eeh #define ASI_PST32_PRIMARY 0xc4 /* [VIS] Two 32-bit partial store, primary */ 119 1.26 eeh #define ASI_PST32_SECONDARY 0xc5 /* [VIS] Two 32-bit partial store, secondary */ 120 1.26 eeh 121 1.26 eeh #define ASI_PST8_PRIMARY_LITTLE 0xc8 /* [VIS] Eight 8-bit partial store, primary, little endian */ 122 1.26 eeh #define ASI_PST8_SECONDARY_LITTLE 0xc9 /* [VIS] Eight 8-bit partial store, secondary, little endian */ 123 1.26 eeh #define ASI_PST16_PRIMARY_LITTLE 0xca /* [VIS] Four 16-bit partial store, primary, little endian */ 124 1.26 eeh #define ASI_PST16_SECONDARY_LITTLE 0xcb /* [VIS] Fout 16-bit partial store, secondary, little endian */ 125 1.26 eeh #define ASI_PST32_PRIMARY_LITTLE 0xcc /* [VIS] Two 32-bit partial store, primary, little endian */ 126 1.26 eeh #define ASI_PST32_SECONDARY_LITTLE 0xcd /* [VIS] Two 32-bit partial store, secondary, little endian */ 127 1.26 eeh 128 1.26 eeh #define ASI_FL8_PRIMARY 0xd0 /* [VIS] One 8-bit load/store floating, primary */ 129 1.26 eeh #define ASI_FL8_SECONDARY 0xd1 /* [VIS] One 8-bit load/store floating, secondary */ 130 1.26 eeh #define ASI_FL16_PRIMARY 0xd2 /* [VIS] One 16-bit load/store floating, primary */ 131 1.26 eeh #define ASI_FL16_SECONDARY 0xd3 /* [VIS] One 16-bit load/store floating, secondary */ 132 1.26 eeh 133 1.26 eeh #define ASI_FL8_PRIMARY_LITTLE 0xd8 /* [VIS] One 8-bit load/store floating, primary, little endian */ 134 1.26 eeh #define ASI_FL8_SECONDARY_LITTLE 0xd9 /* [VIS] One 8-bit load/store floating, secondary, little endian */ 135 1.26 eeh #define ASI_FL16_PRIMARY_LITTLE 0xda /* [VIS] One 16-bit load/store floating, primary, little endian */ 136 1.26 eeh #define ASI_FL16_SECONDARY_LITTLE 0xdb /* [VIS] One 16-bit load/store floating, secondary, little endian */ 137 1.26 eeh 138 1.26 eeh #define ASI_BLOCK_COMMIT_PRIMARY 0xe0 /* [4u] block store with commit, primary */ 139 1.26 eeh #define ASI_BLOCK_COMMIT_SECONDARY 0xe1 /* [4u] block store with commit, secondary */ 140 1.26 eeh #define ASI_BLOCK_PRIMARY 0xf0 /* [4u] block load/store, primary */ 141 1.26 eeh #define ASI_BLOCK_SECONDARY 0xf1 /* [4u] block load/store, secondary */ 142 1.26 eeh #define ASI_BLOCK_PRIMARY_LITTLE 0xf8 /* [4u] block load/store, primary, little endian */ 143 1.26 eeh #define ASI_BLOCK_SECONDARY_LITTLE 0xf9 /* [4u] block load/store, secondary, little endian */ 144 1.1 eeh 145 1.1 eeh 146 1.1 eeh /* 147 1.1 eeh * These are the shorter names used by Solaris 148 1.1 eeh */ 149 1.1 eeh 150 1.26 eeh #define ASI_N ASI_NUCLEUS 151 1.26 eeh #define ASI_NL ASI_NUCLEUS_LITTLE 152 1.26 eeh #define ASI_AIUP ASI_AS_IF_USER_PRIMARY 153 1.26 eeh #define ASI_AIUS ASI_AS_IF_USER_SECONDARY 154 1.26 eeh #define ASI_AIUPL ASI_AS_IF_USER_PRIMARY_LITTLE 155 1.26 eeh #define ASI_AIUSL ASI_AS_IF_USER_SECONDARY_LITTLE 156 1.26 eeh #define ASI_P ASI_PRIMARY 157 1.26 eeh #define ASI_S ASI_SECONDARY 158 1.28 eeh #define ASI_PNF ASI_PRIMARY_NOFAULT 159 1.28 eeh #define ASI_SNF ASI_SECONDARY_NOFAULT 160 1.26 eeh #define ASI_PL ASI_PRIMARY_LITTLE 161 1.26 eeh #define ASI_SL ASI_SECONDARY_LITTLE 162 1.28 eeh #define ASI_PNFL ASI_PRIMARY_NOFAULT_LITTLE 163 1.28 eeh #define ASI_SNFL ASI_SECONDARY_NOFAULT_LITTLE 164 1.26 eeh #define ASI_FL8_P ASI_FL8_PRIMARY 165 1.26 eeh #define ASI_FL8_S ASI_FL8_SECONDARY 166 1.26 eeh #define ASI_FL16_P ASI_FL16_PRIMARY 167 1.26 eeh #define ASI_FL16_S ASI_FL16_SECONDARY 168 1.26 eeh #define ASI_FL8_PL ASI_FL8_PRIMARY_LITTLE 169 1.26 eeh #define ASI_FL8_SL ASI_FL8_SECONDARY_LITTLE 170 1.26 eeh #define ASI_FL16_PL ASI_FL16_PRIMARY_LITTLE 171 1.26 eeh #define ASI_FL16_SL ASI_FL16_SECONDARY_LITTLE 172 1.26 eeh #define ASI_BLK_AIUP ASI_BLOCK_AS_IF_USER_PRIMARY 173 1.26 eeh #define ASI_BLK_AIUPL ASI_BLOCK_AS_IF_USER_PRIMARY_LITTLE 174 1.26 eeh #define ASI_BLK_AIUS ASI_BLOCK_AS_IF_USER_SECONDARY 175 1.26 eeh #define ASI_BLK_AIUSL ASI_BLOCK_AS_IF_USER_SECONDARY_LITTLE 176 1.26 eeh #define ASI_BLK_COMMIT_P ASI_BLOCK_COMMIT_PRIMARY 177 1.26 eeh #define ASI_BLK_COMMIT_PRIMARY ASI_BLOCK_COMMIT_PRIMARY 178 1.26 eeh #define ASI_BLK_COMMIT_S ASI_BLOCK_COMMIT_SECONDARY 179 1.26 eeh #define ASI_BLK_COMMIT_SECONDARY ASI_BLOCK_COMMIT_SECONDARY 180 1.26 eeh #define ASI_BLK_P ASI_BLOCK_PRIMARY 181 1.26 eeh #define ASI_BLK_PL ASI_BLOCK_PRIMARY_LITTLE 182 1.26 eeh #define ASI_BLK_S ASI_BLOCK_SECONDARY 183 1.26 eeh #define ASI_BLK_SL ASI_BLOCK_SECONDARY_LITTLE 184 1.1 eeh 185 1.28 eeh /* Alternative spellings */ 186 1.28 eeh #define ASI_PRIMARY_NO_FAULT ASI_PRIMARY_NOFAULT 187 1.28 eeh #define ASI_PRIMARY_NO_FAULT_LITTLE ASI_PRIMARY_NOFAULT_LITTLE 188 1.28 eeh #define ASI_SECONDARY_NO_FAULT ASI_SECONDARY_NOFAULT 189 1.28 eeh #define ASI_SECONDARY_NO_FAULT_LITTLE ASI_SECONDARY_NOFAULT_LITTLE 190 1.28 eeh 191 1.29 eeh #define PHYS_ASI(x) (((x) | 0x09) == 0x1d) 192 1.26 eeh #define LITTLE_ASI(x) ((x) & ASI_LITTLE) 193 1.14 eeh 194 1.1 eeh /* 195 1.1 eeh * The following are 4u control registers 196 1.1 eeh */ 197 1.18 eeh 198 1.18 eeh /* Get the CPU's UPAID */ 199 1.36 petrov #define UPA_CR_MID_SHIFT (17) 200 1.36 petrov #define UPA_CR_MID_SIZE (5) 201 1.36 petrov #define UPA_CR_MID_MASK \ 202 1.36 petrov (((1 << UPA_CR_MID_SIZE) - 1) << UPA_CR_MID_SHIFT) 203 1.36 petrov 204 1.36 petrov #define UPA_CR_MID(x) (((x)>>UPA_CR_MID_SHIFT)&((1 << UPA_CR_MID_SIZE) - 1)) 205 1.36 petrov 206 1.36 petrov #ifdef _LOCORE 207 1.36 petrov 208 1.36 petrov #define UPA_GET_MID(r1) \ 209 1.36 petrov ldxa [%g0] ASI_MID_REG, r1 ; \ 210 1.36 petrov srlx r1, UPA_CR_MID_SHIFT, r1 ; \ 211 1.36 petrov and r1, (1 << UPA_CR_MID_SIZE) - 1, r1 212 1.36 petrov 213 1.36 petrov #else 214 1.18 eeh #define CPU_UPAID UPA_CR_MID(ldxa(0, ASI_MID_REG)) 215 1.36 petrov #endif 216 1.55 mrg 217 1.55 mrg /* Get the CPU's Fireplane agent ID */ 218 1.55 mrg #define FIREPLANE_CR_AID(x) (((x) >> 17) & 0x3ff) 219 1.55 mrg #define CPU_FIREPLANEID FIREPLANE_CR_AID(ldxa(0, ASI_MID_REG)) 220 1.55 mrg 221 1.55 mrg /* Get the CPU's Jupiter Bus interrupt target ID */ 222 1.55 mrg #define JUPITER_CR_ITID(x) ((x) & 0x3ff) 223 1.55 mrg #define CPU_JUPITERID JUPITER_CR_ITID(ldxa(0, ASI_MID_REG)) 224 1.1 eeh 225 1.1 eeh /* 226 1.1 eeh * [4u] MMU and Cache Control Register (MCCR) 227 1.1 eeh * use ASI = 0x45 228 1.1 eeh */ 229 1.26 eeh #define ASI_MCCR ASI_LSU_CONTROL_REGISTER 230 1.26 eeh #define MCCR 0x00 231 1.1 eeh 232 1.1 eeh /* MCCR Bits and their meanings */ 233 1.26 eeh #define MCCR_DMMU_EN 0x08 234 1.26 eeh #define MCCR_IMMU_EN 0x04 235 1.26 eeh #define MCCR_DCACHE_EN 0x02 236 1.26 eeh #define MCCR_ICACHE_EN 0x01 237 1.54 mrg #define MCCR_RAW_EN 0x400000000000 238 1.1 eeh 239 1.1 eeh 240 1.1 eeh /* 241 1.1 eeh * MMU control registers 242 1.1 eeh */ 243 1.1 eeh 244 1.1 eeh /* Choose an MMU */ 245 1.26 eeh #define ASI_DMMU 0x58 246 1.26 eeh #define ASI_IMMU 0x50 247 1.1 eeh 248 1.1 eeh /* Other assorted MMU ASIs */ 249 1.26 eeh #define ASI_IMMU_8KPTR 0x51 250 1.26 eeh #define ASI_IMMU_64KPTR 0x52 251 1.26 eeh #define ASI_IMMU_DATA_IN 0x54 252 1.26 eeh #define ASI_IMMU_TLB_DATA 0x55 253 1.26 eeh #define ASI_IMMU_TLB_TAG 0x56 254 1.26 eeh #define ASI_DMMU_8KPTR 0x59 255 1.26 eeh #define ASI_DMMU_64KPTR 0x5a 256 1.26 eeh #define ASI_DMMU_DATA_IN 0x5c 257 1.26 eeh #define ASI_DMMU_TLB_DATA 0x5d 258 1.26 eeh #define ASI_DMMU_TLB_TAG 0x5e 259 1.1 eeh 260 1.1 eeh /* 261 1.1 eeh * The following are the control registers 262 1.1 eeh * They work on both MMUs unless noted. 263 1.46 mrg * III = cheetah only 264 1.1 eeh * 265 1.1 eeh * Register contents are defined later on individual registers. 266 1.1 eeh */ 267 1.26 eeh #define TSB_TAG_TARGET 0x0 268 1.26 eeh #define TLB_DATA_IN 0x0 269 1.26 eeh #define CTX_PRIMARY 0x08 /* primary context -- DMMU only */ 270 1.26 eeh #define CTX_SECONDARY 0x10 /* secondary context -- DMMU only */ 271 1.26 eeh #define SFSR 0x18 272 1.26 eeh #define SFAR 0x20 /* fault address -- DMMU only */ 273 1.26 eeh #define TSB 0x28 274 1.26 eeh #define TLB_TAG_ACCESS 0x30 275 1.26 eeh #define VIRTUAL_WATCHPOINT 0x38 276 1.26 eeh #define PHYSICAL_WATCHPOINT 0x40 277 1.46 mrg #define TSB_PEXT 0x48 /* III primary ext */ 278 1.46 mrg #define TSB_SEXT 0x50 /* III 2ndary ext -- DMMU only */ 279 1.46 mrg #define TSB_NEXT 0x58 /* III nucleus ext */ 280 1.1 eeh 281 1.1 eeh /* Tag Target bits */ 282 1.26 eeh #define TAG_TARGET_VA_MASK 0x03ffffffffffffffffLL 283 1.26 eeh #define TAG_TARGET_VA(x) (((x)<<22)&TAG_TARGET_VA_MASK) 284 1.26 eeh #define TAG_TARGET_CONTEXT(x) ((x)>>48) 285 1.26 eeh #define TAG_TARGET(c,v) ((((uint64_t)c)<<48)|(((uint64_t)v)&TAG_TARGET_VA_MASK)) 286 1.1 eeh 287 1.1 eeh /* SFSR bits for both D_SFSR and I_SFSR */ 288 1.26 eeh #define SFSR_ASI(x) ((x)>>16) 289 1.70 andvar #define SFSR_FT_VA_OOR_2 0x02000 /* IMMU: jumpl or return to unsupported VA */ 290 1.26 eeh #define SFSR_FT_VA_OOR_1 0x01000 /* fault at unsupported VA */ 291 1.26 eeh #define SFSR_FT_NFO 0x00800 /* DMMU: Access to page marked NFO */ 292 1.26 eeh #define SFSR_ILL_ASI 0x00400 /* DMMU: Illegal (unsupported) ASI */ 293 1.26 eeh #define SFSR_FT_IO_ATOMIC 0x00200 /* DMMU: Atomic access to noncacheable page */ 294 1.26 eeh #define SFSR_FT_ILL_NF 0x00100 /* DMMU: NF load or flush to page marked E (has side effects) */ 295 1.26 eeh #define SFSR_FT_PRIV 0x00080 /* Privilege violation */ 296 1.69 andvar #define SFSR_FT_E 0x00040 /* DMMU: value of E bit associated address */ 297 1.26 eeh #define SFSR_CTXT(x) (((x)>>4)&0x3) 298 1.26 eeh #define SFSR_CTXT_IS_PRIM(x) (SFSR_CTXT(x)==0x00) 299 1.26 eeh #define SFSR_CTXT_IS_SECOND(x) (SFSR_CTXT(x)==0x01) 300 1.26 eeh #define SFSR_CTXT_IS_NUCLEUS(x) (SFSR_CTXT(x)==0x02) 301 1.26 eeh #define SFSR_PRIV 0x00008 /* value of PSTATE.PRIV for faulting access */ 302 1.26 eeh #define SFSR_W 0x00004 /* DMMU: attempted write */ 303 1.26 eeh #define SFSR_OW 0x00002 /* Overwrite; prev vault was still valid */ 304 1.26 eeh #define SFSR_FV 0x00001 /* Fault is valid */ 305 1.33 petrov #define SFSR_FT (SFSR_FT_VA_OOR_2|SFSR_FT_VA_OOR_1|SFSR_FT_NFO| \ 306 1.33 petrov SFSR_ILL_ASI|SFSR_FT_IO_ATOMIC|SFSR_FT_ILL_NF|SFSR_FT_PRIV) 307 1.1 eeh 308 1.26 eeh #define SFSR_BITS "\177\20" \ 309 1.71 rillig "f\20\30ASI\0" "b\15VAT\0" "b\14VAD\0" \ 310 1.71 rillig "b\13NFO\0" "b\12ASI\0" "b\11A\0" "b\10NF\0" \ 311 1.71 rillig "b\07PRIV\0" "b\06E\0" "b\05NUCLEUS\0" "b\04SECONDCTX\0" \ 312 1.71 rillig "b\03PRIV\0" "b\02W\0" "b\01OW\0" "b\00FV\0" 313 1.3 eeh 314 1.3 eeh /* ASFR bits */ 315 1.26 eeh #define ASFR_ME 0x100000000LL 316 1.26 eeh #define ASFR_PRIV 0x080000000LL 317 1.26 eeh #define ASFR_ISAP 0x040000000LL 318 1.26 eeh #define ASFR_ETP 0x020000000LL 319 1.26 eeh #define ASFR_IVUE 0x010000000LL 320 1.26 eeh #define ASFR_TO 0x008000000LL 321 1.26 eeh #define ASFR_BERR 0x004000000LL 322 1.26 eeh #define ASFR_LDP 0x002000000LL 323 1.26 eeh #define ASFR_CP 0x001000000LL 324 1.26 eeh #define ASFR_WP 0x000800000LL 325 1.26 eeh #define ASFR_EDP 0x000400000LL 326 1.26 eeh #define ASFR_UE 0x000200000LL 327 1.26 eeh #define ASFR_CE 0x000100000LL 328 1.26 eeh #define ASFR_ETS 0x0000f0000LL 329 1.26 eeh #define ASFT_P_SYND 0x00000ffffLL 330 1.3 eeh 331 1.26 eeh #define AFSR_BITS "\177\20" \ 332 1.3 eeh "b\40ME\0" "b\37PRIV\0" "b\36ISAP\0" "b\35ETP\0" \ 333 1.3 eeh "b\34IVUE\0" "b\33TO\0" "b\32BERR\0" "b\31LDP\0" \ 334 1.3 eeh "b\30CP\0" "b\27WP\0" "b\26EDP\0" "b\25UE\0" \ 335 1.3 eeh "b\24CE\0" "f\20\4ETS\0" "f\0\20P_SYND\0" 336 1.3 eeh 337 1.1 eeh /* 338 1.1 eeh * Here's the spitfire TSB control register bits. 339 1.1 eeh * 340 1.1 eeh * Each TSB entry is 16-bytes wide. The TSB must be size aligned 341 1.1 eeh */ 342 1.26 eeh #define TSB_SIZE_512 0x0 /* 8kB, etc. */ 343 1.26 eeh #define TSB_SIZE_1K 0x01 344 1.26 eeh #define TSB_SIZE_2K 0x02 345 1.26 eeh #define TSB_SIZE_4K 0x03 346 1.1 eeh #define TSB_SIZE_8K 0x04 347 1.26 eeh #define TSB_SIZE_16K 0x05 348 1.26 eeh #define TSB_SIZE_32K 0x06 349 1.26 eeh #define TSB_SIZE_64K 0x07 350 1.26 eeh #define TSB_SPLIT 0x1000 351 1.26 eeh #define TSB_BASE 0xffffffffffffe000 352 1.1 eeh 353 1.1 eeh /* TLB Tag Access bits */ 354 1.26 eeh #define TLB_TAG_ACCESS_VA 0xffffffffffffe000 355 1.26 eeh #define TLB_TAG_ACCESS_CTX 0x0000000000001fff 356 1.1 eeh 357 1.1 eeh /* 358 1.1 eeh * TLB demap registers. TTEs are defined in v9pte.h 359 1.1 eeh * 360 1.1 eeh * Use the address space to select between IMMU and DMMU. 361 1.1 eeh * The address of the register selects which context register 362 1.1 eeh * to read the ASI from. 363 1.1 eeh * 364 1.1 eeh * The data stored in the register is interpreted as the VA to 365 1.1 eeh * use. The DEMAP_CTX_<> registers ignore the address and demap the 366 1.1 eeh * entire ASI. 367 1.1 eeh * 368 1.1 eeh */ 369 1.26 eeh #define ASI_IMMU_DEMAP 0x57 /* [4u] IMMU TLB demap */ 370 1.26 eeh #define ASI_DMMU_DEMAP 0x5f /* [4u] IMMU TLB demap */ 371 1.1 eeh 372 1.26 eeh #define DEMAP_PAGE_NUCLEUS ((0x02)<<4) /* Demap page from kernel AS */ 373 1.26 eeh #define DEMAP_PAGE_PRIMARY ((0x00)<<4) /* Demap a page from primary CTXT */ 374 1.26 eeh #define DEMAP_PAGE_SECONDARY ((0x01)<<4) /* Demap page from secondary CTXT (DMMU only) */ 375 1.26 eeh #define DEMAP_CTX_NUCLEUS ((0x06)<<4) /* Demap all of kernel CTXT */ 376 1.26 eeh #define DEMAP_CTX_PRIMARY ((0x04)<<4) /* Demap all of primary CTXT */ 377 1.26 eeh #define DEMAP_CTX_SECONDARY ((0x05)<<4) /* Demap all of secondary CTXT */ 378 1.49 mrg #define DEMAP_ALL ((0x08)<<4) /* Demap all non-locked TLB entries [USIII] */ 379 1.1 eeh 380 1.1 eeh /* 381 1.50 mrg * These define the sizes of the TLB in various CPUs. 382 1.50 mrg * They're mostly not necessary except for diagnostic code. 383 1.50 mrg */ 384 1.50 mrg #define TLB_SIZE_SPITFIRE 64 385 1.50 mrg #define TLB_SIZE_CHEETAH_I16 16 386 1.50 mrg #define TLB_SIZE_CHEETAH_I128 128 387 1.50 mrg #define TLB_SIZE_CHEETAH_D16 16 388 1.50 mrg #define TLB_SIZE_CHEETAH_D512_0 512 389 1.50 mrg #define TLB_SIZE_CHEETAH_D512_1 512 390 1.52 mrg #define TLB_CHEETAH_I16 (0 << 16) 391 1.52 mrg #define TLB_CHEETAH_I128 (2 << 16) 392 1.52 mrg #define TLB_CHEETAH_D16 (0 << 16) 393 1.52 mrg #define TLB_CHEETAH_D512_0 (2 << 16) 394 1.52 mrg #define TLB_CHEETAH_D512_1 (3 << 16) 395 1.50 mrg 396 1.50 mrg /* 397 1.1 eeh * Interrupt registers. This really gets hairy. 398 1.1 eeh */ 399 1.1 eeh 400 1.68 andvar /* IRSR -- Interrupt Receive Status Register */ 401 1.26 eeh #define ASI_IRSR 0x49 402 1.26 eeh #define IRSR 0x00 403 1.26 eeh #define IRSR_BUSY 0x020 404 1.26 eeh #define IRSR_MID(x) (x&0x1f) 405 1.1 eeh 406 1.1 eeh /* IRDR -- Interrupt Receive Data Registers */ 407 1.26 eeh #define ASI_IRDR 0x7f 408 1.26 eeh #define IRDR_0H 0x40 409 1.26 eeh #define IRDR_0L 0x48 /* unimplemented */ 410 1.26 eeh #define IRDR_1H 0x50 411 1.26 eeh #define IRDR_1L 0x58 /* unimplemented */ 412 1.26 eeh #define IRDR_2H 0x60 413 1.26 eeh #define IRDR_2L 0x68 /* unimplemented */ 414 1.26 eeh #define IRDR_3H 0x70 /* unimplemented */ 415 1.26 eeh #define IRDR_3L 0x78 /* unimplemented */ 416 1.1 eeh 417 1.1 eeh /* Interrupt Dispatch -- usually reserved for cross-calls */ 418 1.59 nakayama #define ASI_IDSR 0x48 /* Interrupt dispatch status reg */ 419 1.26 eeh #define IDSR 0x00 420 1.26 eeh #define IDSR_NACK 0x02 421 1.26 eeh #define IDSR_BUSY 0x01 422 1.26 eeh 423 1.26 eeh #define ASI_INTERRUPT_DISPATCH 0x77 /* [4u] spitfire interrupt dispatch regs */ 424 1.31 chs 425 1.31 chs /* Interrupt delivery initiation */ 426 1.31 chs #define IDCR(x) ((((uint64_t)(x)) << 14) | 0x70) 427 1.31 chs 428 1.31 chs #define IDDR_0H 0x40 /* Store data to send in these regs */ 429 1.26 eeh #define IDDR_0L 0x48 /* unimplemented */ 430 1.26 eeh #define IDDR_1H 0x50 431 1.26 eeh #define IDDR_1L 0x58 /* unimplemented */ 432 1.26 eeh #define IDDR_2H 0x60 433 1.26 eeh #define IDDR_2L 0x68 /* unimplemented */ 434 1.26 eeh #define IDDR_3H 0x70 /* unimplemented */ 435 1.26 eeh #define IDDR_3L 0x78 /* unimplemented */ 436 1.1 eeh 437 1.1 eeh /* 438 1.1 eeh * Error registers 439 1.1 eeh */ 440 1.1 eeh 441 1.1 eeh /* Since we won't try to fix async errs, we don't care about the bits in the regs */ 442 1.26 eeh #define ASI_AFAR 0x4d /* Asynchronous fault address register */ 443 1.26 eeh #define AFAR 0x00 444 1.26 eeh #define ASI_AFSR 0x4c /* Asynchronous fault status register */ 445 1.26 eeh #define AFSR 0x00 446 1.26 eeh 447 1.26 eeh #define ASI_P_EER 0x4b /* Error enable register */ 448 1.26 eeh #define P_EER 0x00 449 1.26 eeh #define P_EER_ISAPEN 0x04 /* Enable fatal on ISAP */ 450 1.26 eeh #define P_EER_NCEEN 0x02 /* Enable trap on uncorrectable errs */ 451 1.26 eeh #define P_EER_CEEN 0x01 /* Enable trap on correctable errs */ 452 1.26 eeh 453 1.26 eeh #define ASI_DATAPATH_READ 0x7f /* Read the regs */ 454 1.26 eeh #define ASI_DATAPATH_WRITE 0x77 /* Write to the regs */ 455 1.26 eeh #define P_DPER_0 0x00 /* Datapath err reg 0 */ 456 1.26 eeh #define P_DPER_1 0x18 /* Datapath err reg 1 */ 457 1.26 eeh #define P_DCR_0 0x20 /* Datapath control reg 0 */ 458 1.26 eeh #define P_DCR_1 0x38 /* Datapath control reg 0 */ 459 1.1 eeh 460 1.2 eeh 461 1.2 eeh /* From sparc64/asm.h which I think I'll deprecate since it makes bus.h a pain. */ 462 1.2 eeh 463 1.21 eeh #ifndef _LOCORE 464 1.1 eeh /* 465 1.2 eeh * GCC __asm constructs for doing assembly stuff. 466 1.1 eeh */ 467 1.2 eeh 468 1.2 eeh /* 469 1.2 eeh * ``Routines'' to load and store from/to alternate address space. 470 1.2 eeh * The location can be a variable, the asi value (address space indicator) 471 1.2 eeh * must be a constant. 472 1.1 eeh * 473 1.2 eeh * N.B.: You can put as many special functions here as you like, since 474 1.2 eeh * they cost no kernel space or time if they are not used. 475 1.1 eeh * 476 1.2 eeh * These were static inline functions, but gcc screws up the constraints 477 1.2 eeh * on the address space identifiers (the "n"umeric value part) because 478 1.2 eeh * it inlines too late, so we have to use the funny valued-macro syntax. 479 1.2 eeh */ 480 1.6 eeh 481 1.20 eeh /* 482 1.20 eeh * Apparently the definition of bypass ASIs is that they all use the 483 1.20 eeh * D$ so we need to flush the D$ to make sure we don't get data pollution. 484 1.20 eeh */ 485 1.6 eeh 486 1.21 eeh #ifdef __arch64__ 487 1.21 eeh 488 1.47 nakayama /* 64-bit kernel, non-constant */ 489 1.67 nakayama #define SPARC64_LD_NONCONST(ld) \ 490 1.47 nakayama __asm volatile( \ 491 1.47 nakayama "wr %2,%%g0,%%asi; " \ 492 1.47 nakayama #ld " [%1]%%asi,%0 " \ 493 1.47 nakayama : "=r" (_v) \ 494 1.67 nakayama : "r" ((__uintptr_t)(loc)), "r" (asi)) 495 1.47 nakayama 496 1.47 nakayama #if defined(__GNUC__) && defined(__OPTIMIZE__) 497 1.47 nakayama #define SPARC64_LD_DEF(ld, type, vtype) \ 498 1.47 nakayama static __inline type ld(paddr_t loc, int asi) \ 499 1.47 nakayama { \ 500 1.47 nakayama vtype _v; \ 501 1.47 nakayama if (__builtin_constant_p(asi)) \ 502 1.47 nakayama __asm volatile( \ 503 1.47 nakayama #ld " [%1]%2,%0 " \ 504 1.47 nakayama : "=r" (_v) \ 505 1.67 nakayama : "r" ((__uintptr_t)(loc)), "n" (asi)); \ 506 1.47 nakayama else \ 507 1.67 nakayama SPARC64_LD_NONCONST(ld); \ 508 1.47 nakayama return _v; \ 509 1.47 nakayama } 510 1.47 nakayama #else 511 1.47 nakayama #define SPARC64_LD_DEF(ld, type, vtype) \ 512 1.47 nakayama static __inline type ld(paddr_t loc, int asi) \ 513 1.47 nakayama { \ 514 1.47 nakayama vtype _v; \ 515 1.67 nakayama SPARC64_LD_NONCONST(ld); \ 516 1.47 nakayama return _v; \ 517 1.21 eeh } 518 1.21 eeh #endif 519 1.47 nakayama #define SPARC64_LD_DEF64(ld, type) SPARC64_LD_DEF(ld, type, uint64_t) 520 1.21 eeh 521 1.47 nakayama #else /* __arch64__ */ 522 1.21 eeh 523 1.47 nakayama /* 32-bit kernel, MMU bypass, non-constant */ 524 1.47 nakayama #define SPARC64_LD_PHYS_NONCONST(ld) \ 525 1.47 nakayama __asm volatile( \ 526 1.53 nakayama "clruw %2; " \ 527 1.47 nakayama "rdpr %%pstate,%1; " \ 528 1.47 nakayama "sllx %3,32,%0; " \ 529 1.47 nakayama "wrpr %1,8,%%pstate; " \ 530 1.47 nakayama "or %0,%2,%0; " \ 531 1.47 nakayama "wr %4,%%g0,%%asi; " \ 532 1.47 nakayama #ld " [%0]%%asi,%0; " \ 533 1.47 nakayama "wrpr %1,0,%%pstate " \ 534 1.47 nakayama : "=&r" (_v), "=&r" (_pstate) \ 535 1.47 nakayama : "r" ((uint32_t)(loc)), "r" (_hi), "r" (asi)) 536 1.47 nakayama /* 32-bit kernel, non-constant */ 537 1.47 nakayama #define SPARC64_LD_NONCONST(ld) \ 538 1.47 nakayama __asm volatile( \ 539 1.47 nakayama "wr %2,%%g0,%%asi; " \ 540 1.47 nakayama #ld " [%1]%%asi,%0 " \ 541 1.47 nakayama : "=&r" (_v) \ 542 1.47 nakayama : "r" ((uint32_t)(loc)), "r" (asi)) 543 1.47 nakayama /* 32-bit kernel, MMU bypass, non-constant, 64-bit value */ 544 1.47 nakayama #define SPARC64_LD_PHYS_NONCONST64(ld) \ 545 1.47 nakayama __asm volatile( \ 546 1.53 nakayama "clruw %2; " \ 547 1.47 nakayama "rdpr %%pstate,%1; " \ 548 1.47 nakayama "sllx %3,32,%0; " \ 549 1.47 nakayama "wrpr %1,8,%%pstate; " \ 550 1.47 nakayama "or %0,%2,%0; " \ 551 1.47 nakayama "wr %4,%%g0,%%asi; " \ 552 1.47 nakayama #ld " [%0]%%asi,%0; " \ 553 1.47 nakayama "wrpr %1,0,%%pstate; " \ 554 1.47 nakayama "srlx %0,32,%1; " \ 555 1.47 nakayama "srl %0,0,%0 " \ 556 1.47 nakayama : "=&r" (_vlo), "=&r" (_vhi) \ 557 1.47 nakayama : "r" ((uint32_t)(loc)), "r" (_hi), "r" (asi)) 558 1.47 nakayama /* 32-bit kernel, non-constant, 64-bit value */ 559 1.47 nakayama #define SPARC64_LD_NONCONST64(ld) \ 560 1.47 nakayama __asm volatile( \ 561 1.47 nakayama "wr %3,%%g0,%%asi; " \ 562 1.47 nakayama #ld " [%2]%%asi,%0; " \ 563 1.47 nakayama "srlx %0,32,%1; " \ 564 1.47 nakayama "srl %0,0,%0 " \ 565 1.47 nakayama : "=&r" (_vlo), "=&r" (_vhi) \ 566 1.47 nakayama : "r" ((uint32_t)(loc)), "r" (asi)) 567 1.47 nakayama 568 1.47 nakayama #if defined(__GNUC__) && defined(__OPTIMIZE__) 569 1.47 nakayama #define SPARC64_LD_DEF(ld, type, vtype) \ 570 1.47 nakayama static __inline type ld(paddr_t loc, int asi) \ 571 1.47 nakayama { \ 572 1.47 nakayama vtype _v; \ 573 1.47 nakayama uint32_t _hi, _pstate; \ 574 1.47 nakayama if (PHYS_ASI(asi)) { \ 575 1.47 nakayama _hi = (uint64_t)(loc) >> 32; \ 576 1.47 nakayama if (__builtin_constant_p(asi)) \ 577 1.47 nakayama __asm volatile( \ 578 1.53 nakayama "clruw %2; " \ 579 1.47 nakayama "rdpr %%pstate,%1; " \ 580 1.47 nakayama "sllx %3,32,%0; " \ 581 1.47 nakayama "wrpr %1,8,%%pstate; " \ 582 1.47 nakayama "or %0,%2,%0; " \ 583 1.47 nakayama #ld " [%0]%4,%0; " \ 584 1.47 nakayama "wrpr %1,0,%%pstate; " \ 585 1.47 nakayama : "=&r" (_v), "=&r" (_pstate) \ 586 1.47 nakayama : "r" ((uint32_t)(loc)), "r" (_hi), \ 587 1.47 nakayama "n" (asi)); \ 588 1.47 nakayama else \ 589 1.47 nakayama SPARC64_LD_PHYS_NONCONST(ld); \ 590 1.47 nakayama } else { \ 591 1.47 nakayama if (__builtin_constant_p(asi)) \ 592 1.47 nakayama __asm volatile( \ 593 1.47 nakayama #ld " [%1]%2,%0 " \ 594 1.47 nakayama : "=&r" (_v) \ 595 1.47 nakayama : "r" ((uint32_t)(loc)), "n" (asi)); \ 596 1.47 nakayama else \ 597 1.47 nakayama SPARC64_LD_NONCONST(ld); \ 598 1.47 nakayama } \ 599 1.47 nakayama return _v; \ 600 1.47 nakayama } 601 1.47 nakayama #define SPARC64_LD_DEF64(ld, type) \ 602 1.47 nakayama static __inline type ld(paddr_t loc, int asi) \ 603 1.47 nakayama { \ 604 1.47 nakayama uint32_t _vlo, _vhi, _hi; \ 605 1.47 nakayama if (PHYS_ASI(asi)) { \ 606 1.47 nakayama _hi = (uint64_t)(loc) >> 32; \ 607 1.47 nakayama if (__builtin_constant_p(asi)) \ 608 1.47 nakayama __asm volatile( \ 609 1.53 nakayama "clruw %2; " \ 610 1.47 nakayama "rdpr %%pstate,%1; " \ 611 1.47 nakayama "sllx %3,32,%0; " \ 612 1.47 nakayama "wrpr %1,8,%%pstate; " \ 613 1.47 nakayama "or %0,%2,%0; " \ 614 1.47 nakayama #ld " [%0]%4,%0; " \ 615 1.47 nakayama "wrpr %1,0,%%pstate; " \ 616 1.47 nakayama "srlx %0,32,%1; " \ 617 1.47 nakayama "srl %0,0,%0 " \ 618 1.47 nakayama : "=&r" (_vlo), "=&r" (_vhi) \ 619 1.47 nakayama : "r" ((uint32_t)(loc)), "r" (_hi), \ 620 1.47 nakayama "n" (asi)); \ 621 1.47 nakayama else \ 622 1.47 nakayama SPARC64_LD_PHYS_NONCONST64(ld); \ 623 1.47 nakayama } else { \ 624 1.47 nakayama if (__builtin_constant_p(asi)) \ 625 1.47 nakayama __asm volatile( \ 626 1.47 nakayama #ld " [%2]%3,%0; " \ 627 1.47 nakayama "srlx %0,32,%1; " \ 628 1.47 nakayama "srl %0,0,%0 " \ 629 1.47 nakayama : "=&r" (_vlo), "=&r" (_vhi) \ 630 1.47 nakayama : "r" ((uint32_t)(loc)), "n" (asi)); \ 631 1.47 nakayama else \ 632 1.47 nakayama SPARC64_LD_NONCONST64(ld); \ 633 1.47 nakayama } \ 634 1.47 nakayama return ((uint64_t)_vhi << 32) | _vlo; \ 635 1.47 nakayama } 636 1.47 nakayama #else 637 1.47 nakayama #define SPARC64_LD_DEF(ld, type, vtype) \ 638 1.47 nakayama static __inline type ld(paddr_t loc, int asi) \ 639 1.47 nakayama { \ 640 1.47 nakayama vtype _v; \ 641 1.47 nakayama uint32_t _hi, _pstate; \ 642 1.47 nakayama if (PHYS_ASI(asi)) { \ 643 1.47 nakayama _hi = (uint64_t)(loc) >> 32; \ 644 1.47 nakayama SPARC64_LD_PHYS_NONCONST(ld); \ 645 1.47 nakayama } else \ 646 1.47 nakayama SPARC64_LD_NONCONST(ld); \ 647 1.47 nakayama return _v; \ 648 1.47 nakayama } 649 1.47 nakayama #define SPARC64_LD_DEF64(ld, type) \ 650 1.47 nakayama static __inline type ld(paddr_t loc, int asi) \ 651 1.47 nakayama { \ 652 1.47 nakayama uint32_t _vlo, _vhi, _hi; \ 653 1.47 nakayama if (PHYS_ASI(asi)) { \ 654 1.47 nakayama _hi = (uint64_t)(loc) >> 32; \ 655 1.47 nakayama SPARC64_LD_PHYS_NONCONST64(ld); \ 656 1.47 nakayama } else \ 657 1.47 nakayama SPARC64_LD_NONCONST64(ld); \ 658 1.47 nakayama return ((uint64_t)_vhi << 32) | _vlo; \ 659 1.21 eeh } 660 1.21 eeh #endif 661 1.21 eeh 662 1.47 nakayama #endif /* __arch64__ */ 663 1.21 eeh 664 1.47 nakayama /* load byte from alternate address space */ 665 1.47 nakayama SPARC64_LD_DEF(lduba, uint8_t, uint32_t) 666 1.47 nakayama /* load half-word from alternate address space */ 667 1.47 nakayama SPARC64_LD_DEF(lduha, uint16_t, uint32_t) 668 1.21 eeh /* load unsigned int from alternate address space */ 669 1.47 nakayama SPARC64_LD_DEF(lda, uint32_t, uint32_t) 670 1.60 palle /* load unsigned word from alternate address space */ 671 1.60 palle SPARC64_LD_DEF(lduwa, uint32_t, uint32_t) 672 1.21 eeh /* load signed int from alternate address space */ 673 1.47 nakayama SPARC64_LD_DEF(ldswa, int, int) 674 1.47 nakayama /* load 64-bit unsigned int from alternate address space */ 675 1.47 nakayama SPARC64_LD_DEF64(ldxa, uint64_t) 676 1.21 eeh 677 1.21 eeh 678 1.47 nakayama #ifdef __arch64__ 679 1.21 eeh 680 1.47 nakayama /* 64-bit kernel, non-constant */ 681 1.67 nakayama #define SPARC64_ST_NONCONST(st) \ 682 1.47 nakayama __asm volatile( \ 683 1.67 nakayama "wr %2,%%g0,%%asi; " \ 684 1.67 nakayama #st " %0,[%1]%%asi " \ 685 1.67 nakayama : : "r" (value), "r" ((__uintptr_t)(loc)), \ 686 1.67 nakayama "r" (asi)) 687 1.47 nakayama 688 1.47 nakayama #if defined(__GNUC__) && defined(__OPTIMIZE__) 689 1.47 nakayama #define SPARC64_ST_DEF(st, type) \ 690 1.47 nakayama static __inline void st(paddr_t loc, int asi, type value) \ 691 1.47 nakayama { \ 692 1.47 nakayama if (__builtin_constant_p(asi)) \ 693 1.47 nakayama __asm volatile( \ 694 1.67 nakayama #st " %0,[%1]%2 " \ 695 1.67 nakayama : : "r" (value), "r" ((__uintptr_t)(loc)), \ 696 1.67 nakayama "n" (asi)); \ 697 1.47 nakayama else \ 698 1.67 nakayama SPARC64_ST_NONCONST(st); \ 699 1.47 nakayama } 700 1.47 nakayama #else 701 1.47 nakayama #define SPARC64_ST_DEF(st, type) \ 702 1.47 nakayama static __inline void st(paddr_t loc, int asi, type value) \ 703 1.47 nakayama { \ 704 1.67 nakayama SPARC64_ST_NONCONST(st); \ 705 1.21 eeh } 706 1.47 nakayama #endif 707 1.47 nakayama #define SPARC64_ST_DEF64(st, type) SPARC64_ST_DEF(st, type) 708 1.21 eeh 709 1.47 nakayama #else /* __arch64__ */ 710 1.21 eeh 711 1.47 nakayama /* 32-bit kernel, MMU bypass, non-constant */ 712 1.47 nakayama #define SPARC64_ST_PHYS_NONCONST(st) \ 713 1.47 nakayama __asm volatile( \ 714 1.53 nakayama "clruw %3; " \ 715 1.47 nakayama "rdpr %%pstate,%1; " \ 716 1.47 nakayama "sllx %4,32,%0; " \ 717 1.47 nakayama "wrpr %1,8,%%pstate; " \ 718 1.47 nakayama "or %0,%3,%0; " \ 719 1.47 nakayama "wr %5,%%g0,%%asi; " \ 720 1.47 nakayama #st " %2,[%0]%%asi; " \ 721 1.47 nakayama "wrpr %1,0,%%pstate " \ 722 1.47 nakayama : "=&r" (_hi), "=&r" (_pstate) \ 723 1.47 nakayama : "r" (value), "r" ((uint32_t)(loc)), \ 724 1.47 nakayama "r" (_hi), "r" (asi)) 725 1.47 nakayama /* 32-bit kernel, non-constant */ 726 1.47 nakayama #define SPARC64_ST_NONCONST(st) \ 727 1.47 nakayama __asm volatile( \ 728 1.47 nakayama "wr %2,%%g0,%%asi; " \ 729 1.47 nakayama #st " %0,[%1]%%asi " \ 730 1.47 nakayama : : "r" (value), "r" ((uint32_t)(loc)), "r" (asi)) 731 1.47 nakayama /* 32-bit kernel, MMU bypass, non-constant, 64-bit value */ 732 1.47 nakayama #define SPARC64_ST_PHYS_NONCONST64(st) \ 733 1.47 nakayama __asm volatile( \ 734 1.53 nakayama "clruw %3; " \ 735 1.53 nakayama "clruw %5; " \ 736 1.47 nakayama "sllx %4,32,%1; " \ 737 1.47 nakayama "sllx %6,32,%0; " \ 738 1.47 nakayama "rdpr %%pstate,%2; " \ 739 1.47 nakayama "or %1,%3,%1; " \ 740 1.47 nakayama "wrpr %2,8,%%pstate; " \ 741 1.47 nakayama "or %0,%5,%0; " \ 742 1.47 nakayama "wr %7,%%g0,%%asi; " \ 743 1.47 nakayama #st " %1,[%0]%%asi; " \ 744 1.47 nakayama "wrpr %2,0,%%pstate " \ 745 1.47 nakayama : "=&r" (_hi), "=&r" (_vhi), "=&r" (_vlo) \ 746 1.47 nakayama : "r" (_vlo), "r" (_vhi), \ 747 1.47 nakayama "r" ((uint32_t)(loc)), "r" (_hi), "r" (asi)) 748 1.47 nakayama /* 32-bit kernel, non-constant, 64-bit value */ 749 1.47 nakayama #define SPARC64_ST_NONCONST64(st) \ 750 1.47 nakayama __asm volatile( \ 751 1.53 nakayama "clruw %1; " \ 752 1.47 nakayama "sllx %2,32,%0; " \ 753 1.47 nakayama "or %0,%1,%0; " \ 754 1.47 nakayama "wr %4,%%g0,%%asi; " \ 755 1.47 nakayama #st " %0,[%3]%%asi " \ 756 1.47 nakayama : "=&r" (_vhi) \ 757 1.47 nakayama : "r" (_vlo), "r" (_vhi), \ 758 1.47 nakayama "r" ((uint32_t)(loc)), "r" (asi)) 759 1.47 nakayama 760 1.47 nakayama #if defined(__GNUC__) && defined(__OPTIMIZE__) 761 1.47 nakayama #define SPARC64_ST_DEF(st, type) \ 762 1.47 nakayama static __inline void st(paddr_t loc, int asi, type value) \ 763 1.47 nakayama { \ 764 1.47 nakayama uint32_t _hi, _pstate; \ 765 1.47 nakayama if (PHYS_ASI(asi)) { \ 766 1.47 nakayama _hi = (uint64_t)(loc) >> 32; \ 767 1.47 nakayama if (__builtin_constant_p(asi)) \ 768 1.47 nakayama __asm volatile( \ 769 1.53 nakayama "clruw %3; " \ 770 1.47 nakayama "sllx %4,32,%0; " \ 771 1.47 nakayama "rdpr %%pstate,%1; " \ 772 1.47 nakayama "or %0,%3,%0; " \ 773 1.47 nakayama "wrpr %1,8,%%pstate; " \ 774 1.47 nakayama #st " %2,[%0]%5; " \ 775 1.47 nakayama "wrpr %1,0,%%pstate " \ 776 1.47 nakayama : "=&r" (_hi), "=&r" (_pstate) \ 777 1.47 nakayama : "r" (value), "r" ((uint32_t)(loc)), \ 778 1.47 nakayama "r" (_hi), "n" (asi)); \ 779 1.47 nakayama else \ 780 1.47 nakayama SPARC64_ST_PHYS_NONCONST(st); \ 781 1.47 nakayama } else { \ 782 1.47 nakayama if (__builtin_constant_p(asi)) \ 783 1.47 nakayama __asm volatile( \ 784 1.47 nakayama #st " %0,[%1]%2 " \ 785 1.47 nakayama : : "r" (value), "r" ((uint32_t)(loc)), \ 786 1.47 nakayama "n" (asi)); \ 787 1.47 nakayama else \ 788 1.47 nakayama SPARC64_ST_NONCONST(st); \ 789 1.47 nakayama } \ 790 1.47 nakayama } 791 1.47 nakayama #define SPARC64_ST_DEF64(st, type) \ 792 1.47 nakayama static __inline void st(paddr_t loc, int asi, type value) \ 793 1.47 nakayama { \ 794 1.47 nakayama uint32_t _vlo, _vhi, _hi; \ 795 1.47 nakayama _vlo = value; \ 796 1.47 nakayama _vhi = (uint64_t)(value) >> 32; \ 797 1.47 nakayama if (PHYS_ASI(asi)) { \ 798 1.47 nakayama _hi = (uint64_t)(loc) >> 32; \ 799 1.47 nakayama if (__builtin_constant_p(asi)) \ 800 1.47 nakayama __asm volatile( \ 801 1.53 nakayama "clruw %3; " \ 802 1.53 nakayama "clruw %5; " \ 803 1.47 nakayama "sllx %4,32,%1; " \ 804 1.47 nakayama "sllx %6,32,%0; " \ 805 1.47 nakayama "rdpr %%pstate,%2; " \ 806 1.47 nakayama "or %1,%3,%1; " \ 807 1.47 nakayama "or %0,%5,%0; " \ 808 1.47 nakayama "wrpr %2,8,%%pstate; " \ 809 1.47 nakayama #st " %1,[%0]%7; " \ 810 1.47 nakayama "wrpr %2,0,%%pstate " \ 811 1.47 nakayama : "=&r" (_hi), "=&r" (_vhi), "=&r" (_vlo) \ 812 1.47 nakayama : "r" (_vlo), "r" (_vhi), \ 813 1.47 nakayama "r" ((uint32_t)(loc)), "r" (_hi), \ 814 1.47 nakayama "n" (asi)); \ 815 1.47 nakayama else \ 816 1.47 nakayama SPARC64_ST_PHYS_NONCONST64(st); \ 817 1.47 nakayama } else { \ 818 1.47 nakayama if (__builtin_constant_p(asi)) \ 819 1.47 nakayama __asm volatile( \ 820 1.53 nakayama "clruw %1; " \ 821 1.47 nakayama "sllx %2,32,%0; " \ 822 1.47 nakayama "or %0,%1,%0; " \ 823 1.47 nakayama #st " %0,[%3]%4 " \ 824 1.47 nakayama : "=&r" (_vhi) \ 825 1.47 nakayama : "r" (_vlo), "r" (_vhi), \ 826 1.47 nakayama "r" ((uint32_t)(loc)), "n" (asi)); \ 827 1.47 nakayama else \ 828 1.47 nakayama SPARC64_ST_NONCONST64(st); \ 829 1.47 nakayama } \ 830 1.47 nakayama } 831 1.47 nakayama #else 832 1.47 nakayama #define SPARC64_ST_DEF(st, type) \ 833 1.47 nakayama static __inline void st(paddr_t loc, int asi, type value) \ 834 1.47 nakayama { \ 835 1.47 nakayama uint32_t _hi, _pstate; \ 836 1.47 nakayama if (PHYS_ASI(asi)) { \ 837 1.47 nakayama _hi = (uint64_t)(loc) >> 32; \ 838 1.47 nakayama SPARC64_ST_PHYS_NONCONST(st); \ 839 1.47 nakayama } else \ 840 1.47 nakayama SPARC64_ST_NONCONST(st); \ 841 1.47 nakayama } 842 1.47 nakayama #define SPARC64_ST_DEF64(st, type) \ 843 1.47 nakayama static __inline void st(paddr_t loc, int asi, type value) \ 844 1.47 nakayama { \ 845 1.47 nakayama uint32_t _vlo, _vhi, _hi; \ 846 1.47 nakayama _vlo = value; \ 847 1.47 nakayama _vhi = (uint64_t)(value) >> 32; \ 848 1.47 nakayama if (PHYS_ASI(asi)) { \ 849 1.47 nakayama _hi = (uint64_t)(loc) >> 32; \ 850 1.47 nakayama SPARC64_ST_PHYS_NONCONST64(st); \ 851 1.47 nakayama } else \ 852 1.47 nakayama SPARC64_ST_NONCONST64(st); \ 853 1.21 eeh } 854 1.21 eeh #endif 855 1.21 eeh 856 1.47 nakayama #endif /* __arch64__ */ 857 1.21 eeh 858 1.21 eeh /* store byte to alternate address space */ 859 1.47 nakayama SPARC64_ST_DEF(stba, uint8_t) 860 1.21 eeh /* store half-word to alternate address space */ 861 1.47 nakayama SPARC64_ST_DEF(stha, uint16_t) 862 1.47 nakayama /* store unsigned int to alternate address space */ 863 1.47 nakayama SPARC64_ST_DEF(sta, uint32_t) 864 1.47 nakayama /* store 64-bit unsigned int to alternate address space */ 865 1.47 nakayama SPARC64_ST_DEF64(stxa, uint64_t) 866 1.21 eeh 867 1.21 eeh 868 1.43 martin 869 1.64 martin /* flush address from cache */ 870 1.64 martin #define sparc_flush_icache(loc) __asm \ 871 1.64 martin volatile("flush %0" : : "r" ((__uintptr_t)(loc))) 872 1.6 eeh 873 1.6 eeh /* 874 1.6 eeh * SPARC V9 memory barrier instructions. 875 1.6 eeh */ 876 1.6 eeh /* Make all stores complete before next store */ 877 1.56 nakayama #define membar_StoreStore() __asm volatile("membar #StoreStore" : :) 878 1.6 eeh /* Make all loads complete before next store */ 879 1.56 nakayama #define membar_LoadStore() __asm volatile("membar #LoadStore" : :) 880 1.6 eeh /* Make all stores complete before next load */ 881 1.56 nakayama #define membar_StoreLoad() __asm volatile("membar #StoreLoad" : :) 882 1.6 eeh /* Make all loads complete before next load */ 883 1.56 nakayama #define membar_LoadLoad() __asm volatile("membar #LoadLoad" : :) 884 1.6 eeh /* Complete all outstanding memory operations and exceptions */ 885 1.56 nakayama #define membar_Sync() __asm volatile("membar #Sync" : :) 886 1.6 eeh /* Complete all outstanding memory operations */ 887 1.56 nakayama #define membar_MemIssue() __asm volatile("membar #MemIssue" : :) 888 1.6 eeh /* Complete all outstanding stores before any new loads */ 889 1.56 nakayama #define membar_Lookaside() __asm volatile("membar #Lookaside" : :) 890 1.2 eeh 891 1.56 nakayama #define membar_Load() __asm volatile("membar #LoadLoad | #LoadStore" : :) 892 1.56 nakayama #define membar_Store() __asm volatile("membar #LoadStore | #StoreStore" : :) 893 1.36 petrov 894 1.9 eeh #endif 895 1.33 petrov 896 1.33 petrov #endif /* _SPARC_CTLREG_H_ */ 897