1 1.4 peter /* $NetBSD: sa11x0_io_asm.S,v 1.4 2006/06/27 13:58:08 peter Exp $ */ 2 1.1 rjs 3 1.1 rjs /* 4 1.1 rjs * Copyright (c) 1997 Mark Brinicombe. 5 1.1 rjs * Copyright (c) 1997 Causality Limited. 6 1.1 rjs * All rights reserved. 7 1.1 rjs * 8 1.1 rjs * Redistribution and use in source and binary forms, with or without 9 1.1 rjs * modification, are permitted provided that the following conditions 10 1.1 rjs * are met: 11 1.1 rjs * 1. Redistributions of source code must retain the above copyright 12 1.1 rjs * notice, this list of conditions and the following disclaimer. 13 1.1 rjs * 2. Redistributions in binary form must reproduce the above copyright 14 1.1 rjs * notice, this list of conditions and the following disclaimer in the 15 1.1 rjs * documentation and/or other materials provided with the distribution. 16 1.1 rjs * 3. All advertising materials mentioning features or use of this software 17 1.1 rjs * must display the following acknowledgement: 18 1.1 rjs * This product includes software developed by Mark Brinicombe. 19 1.1 rjs * 4. The name of the company nor the name of the author may be used to 20 1.1 rjs * endorse or promote products derived from this software without specific 21 1.1 rjs * prior written permission. 22 1.1 rjs * 23 1.1 rjs * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED 24 1.1 rjs * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF 25 1.1 rjs * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. 26 1.1 rjs * IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, 27 1.1 rjs * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES 28 1.1 rjs * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR 29 1.1 rjs * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 30 1.1 rjs * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 31 1.1 rjs * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 32 1.1 rjs * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 33 1.1 rjs * SUCH DAMAGE. 34 1.1 rjs */ 35 1.1 rjs 36 1.1 rjs #include <machine/asm.h> 37 1.1 rjs 38 1.1 rjs /* 39 1.1 rjs * bus_space I/O functions for sa11x0 40 1.1 rjs */ 41 1.1 rjs 42 1.1 rjs /* 43 1.1 rjs * read single 44 1.1 rjs */ 45 1.1 rjs 46 1.1 rjs ENTRY(sa11x0_bs_r_1) 47 1.1 rjs ldrb r0, [r1, r2] 48 1.1 rjs mov pc, lr 49 1.1 rjs 50 1.1 rjs ENTRY(sa11x0_bs_r_2) 51 1.1 rjs ldrh r0, [r1, r2] 52 1.1 rjs mov pc, lr 53 1.1 rjs 54 1.1 rjs ENTRY(sa11x0_bs_r_4) 55 1.1 rjs ldr r0, [r1, r2] 56 1.1 rjs mov pc, lr 57 1.1 rjs 58 1.1 rjs /* 59 1.1 rjs * write single 60 1.1 rjs */ 61 1.1 rjs 62 1.1 rjs ENTRY(sa11x0_bs_w_1) 63 1.1 rjs strb r3, [r1, r2] 64 1.1 rjs mov pc, lr 65 1.1 rjs 66 1.1 rjs ENTRY(sa11x0_bs_w_2) 67 1.1 rjs strh r3, [r1, r2] 68 1.1 rjs mov pc, lr 69 1.1 rjs 70 1.1 rjs ENTRY(sa11x0_bs_w_4) 71 1.1 rjs str r3, [r1, r2] 72 1.1 rjs mov pc, lr 73 1.1 rjs 74 1.1 rjs 75 1.1 rjs /* 76 1.1 rjs * read multiple 77 1.1 rjs */ 78 1.1 rjs 79 1.1 rjs ENTRY(sa11x0_bs_rm_1) 80 1.1 rjs add r0, r1, r2 81 1.1 rjs ldr r2, [sp, #0] 82 1.1 rjs cmp r2, #0x00000000 83 1.1 rjs movle pc, lr 84 1.1 rjs 85 1.1 rjs sa11x0_bs_rm_1_loop: 86 1.1 rjs ldrb r1, [r0] 87 1.1 rjs subs r2, r2, #0x00000001 88 1.1 rjs strb r1, [r3], #0x0001 89 1.1 rjs bgt sa11x0_bs_rm_1_loop 90 1.1 rjs 91 1.1 rjs mov pc, lr 92 1.1 rjs 93 1.1 rjs ENTRY(sa11x0_bs_rm_2) 94 1.1 rjs add r0, r1, r2 95 1.1 rjs ldr r2, [sp, #0] 96 1.1 rjs cmp r2, #0x00000000 97 1.1 rjs movle pc, lr 98 1.1 rjs 99 1.1 rjs tst r2, #0x00000007 100 1.1 rjs tsteq r3, #0x00000003 101 1.1 rjs beq sa11x0_bs_rm_2_fast 102 1.1 rjs 103 1.1 rjs sa11x0_bs_rm_2_loop: 104 1.1 rjs ldrh r1, [r0] 105 1.1 rjs subs r2, r2, #0x00000001 106 1.1 rjs strh r1, [r3], #0x0002 107 1.1 rjs bgt sa11x0_bs_rm_2_loop 108 1.1 rjs 109 1.1 rjs mov pc, lr 110 1.1 rjs 111 1.1 rjs sa11x0_bs_rm_2_fast: 112 1.1 rjs stmfd sp!, {r4, r5, lr} 113 1.1 rjs 114 1.1 rjs sa11x0_bs_rm_2_fastloop: 115 1.1 rjs ldrh r1, [r0] 116 1.1 rjs ldrh lr, [r0] 117 1.1 rjs orr r1, r1, lr, lsl #16 118 1.1 rjs 119 1.1 rjs ldrh r4, [r0] 120 1.1 rjs ldrh lr, [r0] 121 1.1 rjs orr r4, r4, lr, lsl #16 122 1.1 rjs 123 1.1 rjs ldrh r5, [r0] 124 1.1 rjs ldrh lr, [r0] 125 1.1 rjs orr r5, r5, lr, lsl #16 126 1.1 rjs 127 1.1 rjs ldrh ip, [r0] 128 1.1 rjs ldrh lr, [r0] 129 1.1 rjs orr ip, ip, lr, lsl #16 130 1.1 rjs 131 1.1 rjs stmia r3!, {r1, r4, r5, ip} 132 1.1 rjs subs r2, r2, #8 133 1.1 rjs bgt sa11x0_bs_rm_2_fastloop 134 1.1 rjs 135 1.1 rjs ldmfd sp!, {r4, r5, pc} 136 1.1 rjs 137 1.1 rjs 138 1.1 rjs ENTRY(sa11x0_bs_rm_4) 139 1.1 rjs add r0, r1, r2 140 1.1 rjs ldr r2, [sp, #0] 141 1.1 rjs cmp r2, #0x00000000 142 1.1 rjs movle pc, lr 143 1.1 rjs 144 1.1 rjs sa11x0_bs_rm_4_loop: 145 1.1 rjs ldr r1, [r0] 146 1.1 rjs subs r2, r2, #0x00000001 147 1.1 rjs str r1, [r3], #0x0004 148 1.1 rjs bgt sa11x0_bs_rm_4_loop 149 1.1 rjs 150 1.1 rjs mov pc, lr 151 1.1 rjs 152 1.1 rjs /* 153 1.1 rjs * write multiple 154 1.1 rjs */ 155 1.1 rjs 156 1.1 rjs ENTRY(sa11x0_bs_wm_1) 157 1.1 rjs add r0, r1, r2 158 1.1 rjs ldr r2, [sp, #0] 159 1.1 rjs cmp r2, #0x00000000 160 1.1 rjs movle pc, lr 161 1.1 rjs 162 1.1 rjs sa11x0_wm_1_loop: 163 1.1 rjs ldrb r1, [r3], #0x0001 164 1.1 rjs subs r2, r2, #0x00000001 165 1.1 rjs strb r1, [r0] 166 1.1 rjs bgt sa11x0_wm_1_loop 167 1.1 rjs 168 1.1 rjs mov pc, lr 169 1.1 rjs 170 1.1 rjs ENTRY(sa11x0_bs_wm_2) 171 1.1 rjs add r0, r1, r2 172 1.1 rjs ldr r2, [sp, #0] 173 1.1 rjs cmp r2, #0x00000000 174 1.1 rjs movle pc, lr 175 1.1 rjs 176 1.1 rjs sa11x0_bs_wm_2_loop: 177 1.1 rjs ldrh r1, [r3], #0x0002 178 1.1 rjs subs r2, r2, #0x00000001 179 1.1 rjs strh r1, [r0] 180 1.1 rjs bgt sa11x0_bs_wm_2_loop 181 1.1 rjs 182 1.1 rjs mov pc, lr 183 1.1 rjs 184 1.1 rjs ENTRY(sa11x0_bs_wm_4) 185 1.1 rjs add r0, r1, r2 186 1.1 rjs ldr r2, [sp, #0] 187 1.1 rjs cmp r2, #0x00000000 188 1.1 rjs movle pc, lr 189 1.1 rjs 190 1.1 rjs sa11x0_bs_wm_4_loop: 191 1.1 rjs ldr r1, [r3], #0x0004 192 1.1 rjs subs r2, r2, #0x00000001 193 1.1 rjs str r1, [r0] 194 1.1 rjs bgt sa11x0_bs_wm_4_loop 195 1.1 rjs 196 1.1 rjs mov pc, lr 197 1.1 rjs 198 1.1 rjs /* 199 1.1 rjs * read region 200 1.1 rjs */ 201 1.1 rjs 202 1.1 rjs ENTRY(sa11x0_bs_rr_2) 203 1.1 rjs add r0, r1, r2 204 1.1 rjs ldr r2, [sp, #0] 205 1.1 rjs cmp r2, #0x00000000 206 1.1 rjs movle pc, lr 207 1.1 rjs 208 1.1 rjs sa11x0_bs_rr_2_loop: 209 1.1 rjs ldrh r1, [r0], #0x0002 210 1.1 rjs strh r1, [r3], #0x0002 211 1.1 rjs subs r2, r2, #0x00000001 212 1.1 rjs bgt sa11x0_bs_rr_2_loop 213 1.1 rjs 214 1.1 rjs mov pc, lr 215 1.1 rjs 216 1.1 rjs /* 217 1.1 rjs * write region 218 1.1 rjs */ 219 1.1 rjs 220 1.1 rjs ENTRY(sa11x0_bs_wr_2) 221 1.1 rjs add r0, r1, r2 222 1.1 rjs ldr r2, [sp, #0] 223 1.1 rjs cmp r2, #0x00000000 224 1.1 rjs movle pc, lr 225 1.1 rjs 226 1.1 rjs sa11x0_bs_wr_2_loop: 227 1.1 rjs ldrh r1, [r3], #0x0002 228 1.1 rjs strh r1, [r0], #0x0002 229 1.1 rjs subs r2, r2, #0x00000001 230 1.1 rjs bgt sa11x0_bs_wr_2_loop 231 1.1 rjs 232 1.1 rjs mov pc, lr 233 1.1 rjs 234 1.1 rjs /* 235 1.2 peter * set region 236 1.1 rjs */ 237 1.1 rjs 238 1.1 rjs ENTRY(sa11x0_bs_sr_2) 239 1.1 rjs add r0, r1, r2 240 1.1 rjs ldr r2, [sp, #0] 241 1.1 rjs cmp r2, #0x00000000 242 1.1 rjs movle pc, lr 243 1.1 rjs 244 1.1 rjs sa11x0_bs_sr_2_loop: 245 1.1 rjs strh r3, [r0], #0x0002 246 1.1 rjs subs r2, r2, #0x00000001 247 1.1 rjs bgt sa11x0_bs_sr_2_loop 248 1.1 rjs 249 1.1 rjs mov pc, lr 250 1.1 rjs 251 1.1 rjs /* 252 1.1 rjs * copy region 253 1.1 rjs */ 254 1.1 rjs 255 1.1 rjs ENTRY(sa11x0_bs_c_2) 256 1.1 rjs add r0, r1, r2 257 1.1 rjs ldr r2, [sp, #0] 258 1.1 rjs add r1, r2, r3 259 1.1 rjs ldr r2, [sp, #4] 260 1.1 rjs cmp r2, #0x00000000 261 1.1 rjs movle pc, lr 262 1.1 rjs 263 1.1 rjs cmp r0, r1 264 1.1 rjs blt sa11x0_bs_c_2_backwards 265 1.1 rjs 266 1.1 rjs sa11x0_bs_cf_2_loop: 267 1.1 rjs ldrh r3, [r0], #0x0002 268 1.1 rjs strh r3, [r1], #0x0002 269 1.1 rjs subs r2, r2, #0x00000001 270 1.1 rjs bgt sa11x0_bs_cf_2_loop 271 1.1 rjs 272 1.1 rjs mov pc, lr 273 1.1 rjs 274 1.1 rjs sa11x0_bs_c_2_backwards: 275 1.1 rjs add r0, r0, r2, lsl #1 276 1.1 rjs add r1, r1, r2, lsl #1 277 1.1 rjs sub r0, r0, #2 278 1.1 rjs sub r1, r1, #2 279 1.1 rjs 280 1.1 rjs sa11x0_bs_cb_2_loop: 281 1.1 rjs ldrh r3, [r0], #-2 282 1.1 rjs strh r3, [r1], #-2 283 1.1 rjs subs r2, r2, #1 284 1.1 rjs bne sa11x0_bs_cb_2_loop 285 1.1 rjs 286 1.1 rjs mov pc, lr 287