1 1.12 thorpej /* $NetBSD: cacheops_40.h,v 1.12 2023/12/27 17:35:35 thorpej Exp $ */ 2 1.1 leo 3 1.1 leo /*- 4 1.1 leo * Copyright (c) 1997 The NetBSD Foundation, Inc. 5 1.1 leo * All rights reserved. 6 1.1 leo * 7 1.1 leo * This code is derived from software contributed to The NetBSD Foundation 8 1.1 leo * by Leo Weppelman 9 1.1 leo * 10 1.1 leo * Redistribution and use in source and binary forms, with or without 11 1.1 leo * modification, are permitted provided that the following conditions 12 1.1 leo * are met: 13 1.1 leo * 1. Redistributions of source code must retain the above copyright 14 1.1 leo * notice, this list of conditions and the following disclaimer. 15 1.1 leo * 2. Redistributions in binary form must reproduce the above copyright 16 1.1 leo * notice, this list of conditions and the following disclaimer in the 17 1.1 leo * documentation and/or other materials provided with the distribution. 18 1.1 leo * 19 1.1 leo * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS 20 1.1 leo * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED 21 1.1 leo * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 22 1.1 leo * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS 23 1.1 leo * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 24 1.1 leo * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 25 1.1 leo * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 26 1.1 leo * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 27 1.1 leo * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 28 1.1 leo * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 29 1.1 leo * POSSIBILITY OF SUCH DAMAGE. 30 1.1 leo */ 31 1.1 leo 32 1.12 thorpej #include <machine/fcode.h> 33 1.12 thorpej 34 1.1 leo /* 35 1.1 leo * Invalidate entire TLB. 36 1.1 leo */ 37 1.8 perry static __inline void __attribute__((__unused__)) 38 1.6 chs TBIA_40(void) 39 1.1 leo { 40 1.7 perry __asm volatile (" .word 0xf518" ); /* pflusha */ 41 1.1 leo } 42 1.1 leo 43 1.1 leo /* 44 1.1 leo * Invalidate any TLB entry for given VA (TB Invalidate Single) 45 1.1 leo */ 46 1.8 perry static __inline void __attribute__((__unused__)) 47 1.6 chs TBIS_40(vaddr_t va) 48 1.1 leo { 49 1.9 tsutsui register uint8_t *r_va __asm("%a0") = (void *)va; 50 1.1 leo int tmp; 51 1.1 leo 52 1.7 perry __asm volatile (" movc %1, %%dfc;" /* select supervisor */ 53 1.5 thorpej " .word 0xf508;" /* pflush %a0@ */ 54 1.1 leo " moveq %3, %1;" /* select user */ 55 1.5 thorpej " movc %1, %%dfc;" 56 1.1 leo " .word 0xf508;" : "=d" (tmp) : 57 1.1 leo "0" (FC_SUPERD), "a" (r_va), "i" (FC_USERD)); 58 1.1 leo } 59 1.1 leo 60 1.1 leo /* 61 1.1 leo * Invalidate supervisor side of TLB 62 1.1 leo */ 63 1.8 perry static __inline void __attribute__((__unused__)) 64 1.6 chs TBIAS_40(void) 65 1.1 leo { 66 1.1 leo /* 67 1.1 leo * Cannot specify supervisor/user on pflusha, so we flush all 68 1.1 leo */ 69 1.7 perry __asm volatile (" .word 0xf518;"); 70 1.1 leo } 71 1.1 leo 72 1.1 leo /* 73 1.1 leo * Invalidate user side of TLB 74 1.1 leo */ 75 1.8 perry static __inline void __attribute__((__unused__)) 76 1.6 chs TBIAU_40(void) 77 1.1 leo { 78 1.1 leo /* 79 1.1 leo * Cannot specify supervisor/user on pflusha, so we flush all 80 1.1 leo */ 81 1.7 perry __asm volatile (" .word 0xf518;"); 82 1.1 leo } 83 1.1 leo 84 1.1 leo /* 85 1.1 leo * Invalidate instruction cache 86 1.1 leo */ 87 1.8 perry static __inline void __attribute__((__unused__)) 88 1.6 chs ICIA_40(void) 89 1.1 leo { 90 1.7 perry __asm volatile (" .word 0xf498;"); /* cinva ic */ 91 1.1 leo } 92 1.1 leo 93 1.8 perry static __inline void __attribute__((__unused__)) 94 1.6 chs ICPA_40(void) 95 1.1 leo { 96 1.7 perry __asm volatile (" .word 0xf498;"); /* cinva ic */ 97 1.1 leo } 98 1.1 leo 99 1.1 leo /* 100 1.1 leo * Invalidate data cache. 101 1.1 leo */ 102 1.8 perry static __inline void __attribute__((__unused__)) 103 1.6 chs DCIA_40(void) 104 1.1 leo { 105 1.7 perry __asm volatile (" .word 0xf478;"); /* cpusha dc */ 106 1.1 leo } 107 1.1 leo 108 1.8 perry static __inline void __attribute__((__unused__)) 109 1.6 chs DCIS_40(void) 110 1.1 leo { 111 1.7 perry __asm volatile (" .word 0xf478;"); /* cpusha dc */ 112 1.1 leo } 113 1.1 leo 114 1.8 perry static __inline void __attribute__((__unused__)) 115 1.6 chs DCIU_40(void) 116 1.1 leo { 117 1.7 perry __asm volatile (" .word 0xf478;"); /* cpusha dc */ 118 1.1 leo } 119 1.1 leo 120 1.8 perry static __inline void __attribute__((__unused__)) 121 1.6 chs DCIAS_40(paddr_t pa) 122 1.1 leo { 123 1.9 tsutsui register uint8_t *r_pa __asm("%a0") = (void *)pa; 124 1.1 leo 125 1.7 perry __asm volatile (" .word 0xf468;" : : "a" (r_pa)); /* cpushl dc,%a0@ */ 126 1.1 leo } 127 1.1 leo 128 1.8 perry static __inline void __attribute__((__unused__)) 129 1.6 chs PCIA_40(void) 130 1.1 leo { 131 1.7 perry __asm volatile (" .word 0xf478;"); /* cpusha dc */ 132 1.1 leo } 133 1.1 leo 134 1.8 perry static __inline void __attribute__((__unused__)) 135 1.6 chs DCFA_40(void) 136 1.1 leo { 137 1.7 perry __asm volatile (" .word 0xf478;"); /* cpusha dc */ 138 1.1 leo } 139 1.1 leo 140 1.1 leo /* invalidate instruction physical cache line */ 141 1.8 perry static __inline void __attribute__((__unused__)) 142 1.6 chs ICPL_40(paddr_t pa) 143 1.1 leo { 144 1.9 tsutsui register uint8_t *r_pa __asm("%a0") = (void *)pa; 145 1.1 leo 146 1.7 perry __asm volatile (" .word 0xf488;" : : "a" (r_pa)); /* cinvl ic,%a0@ */ 147 1.1 leo } 148 1.1 leo 149 1.1 leo /* invalidate instruction physical cache page */ 150 1.8 perry static __inline void __attribute__((__unused__)) 151 1.6 chs ICPP_40(paddr_t pa) 152 1.1 leo { 153 1.9 tsutsui register uint8_t *r_pa __asm("%a0") = (void *)pa; 154 1.1 leo 155 1.7 perry __asm volatile (" .word 0xf490;" : : "a" (r_pa)); /* cinvp ic,%a0@ */ 156 1.1 leo } 157 1.1 leo 158 1.1 leo /* invalidate data physical cache line */ 159 1.8 perry static __inline void __attribute__((__unused__)) 160 1.6 chs DCPL_40(paddr_t pa) 161 1.1 leo { 162 1.9 tsutsui register uint8_t *r_pa __asm("%a0") = (void *)pa; 163 1.1 leo 164 1.7 perry __asm volatile (" .word 0xf448;" : : "a" (r_pa)); /* cinvl dc,%a0@ */ 165 1.1 leo } 166 1.1 leo 167 1.1 leo /* invalidate data physical cache page */ 168 1.8 perry static __inline void __attribute__((__unused__)) 169 1.6 chs DCPP_40(paddr_t pa) 170 1.1 leo { 171 1.9 tsutsui register uint8_t *r_pa __asm("%a0") = (void *)pa; 172 1.1 leo 173 1.7 perry __asm volatile (" .word 0xf450;" : : "a" (r_pa)); /* cinvp dc,%a0@ */ 174 1.1 leo } 175 1.1 leo 176 1.1 leo /* invalidate data physical all */ 177 1.8 perry static __inline void __attribute__((__unused__)) 178 1.6 chs DCPA_40(void) 179 1.1 leo { 180 1.7 perry __asm volatile (" .word 0xf458;"); /* cinva dc */ 181 1.1 leo } 182 1.1 leo 183 1.1 leo /* data cache flush line */ 184 1.8 perry static __inline void __attribute__((__unused__)) 185 1.6 chs DCFL_40(paddr_t pa) 186 1.1 leo { 187 1.9 tsutsui register uint8_t *r_pa __asm("%a0") = (void *)pa; 188 1.1 leo 189 1.7 perry __asm volatile (" .word 0xf468;" : : "a" (r_pa)); /* cpushl dc,%a0@ */ 190 1.1 leo } 191 1.1 leo 192 1.1 leo /* data cache flush page */ 193 1.8 perry static __inline void __attribute__((__unused__)) 194 1.6 chs DCFP_40(paddr_t pa) 195 1.1 leo { 196 1.9 tsutsui register uint8_t *r_pa __asm("%a0") = (void *)pa; 197 1.1 leo 198 1.7 perry __asm volatile (" .word 0xf470;" : : "a" (r_pa)); /* cpushp dc,%a0@ */ 199 1.1 leo } 200