1/* $NetBSD: bus_space_asm_generic.S,v 1.3 2003/03/27 19:46:14 mycroft Exp $ */ 2 3/*- 4 * Copyright (c) 1997 Causality Limited. 5 * Copyright (c) 1997 Mark Brinicombe. 6 * All rights reserved. 7 * 8 * Redistribution and use in source and binary forms, with or without 9 * modification, are permitted provided that the following conditions 10 * are met: 11 * 1. Redistributions of source code must retain the above copyright 12 * notice, this list of conditions and the following disclaimer. 13 * 2. Redistributions in binary form must reproduce the above copyright 14 * notice, this list of conditions and the following disclaimer in the 15 * documentation and/or other materials provided with the distribution. 16 * 3. All advertising materials mentioning features or use of this software 17 * must display the following acknowledgement: 18 * This product includes software developed by Mark Brinicombe 19 * for the NetBSD Project. 20 * 4. The name of the company nor the name of the author may be used to 21 * endorse or promote products derived from this software without specific 22 * prior written permission. 23 * 24 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED 25 * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF 26 * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. 27 * IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, 28 * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES 29 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR 30 * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 31 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 32 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 33 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 34 * SUCH DAMAGE. 35 * 36 */ 37 38#include <machine/asm.h> 39__FBSDID("$FreeBSD$"); 40 41/* 42 * Generic bus_space functions. 43 */ 44 45/* 46 * read single 47 */ 48 49ENTRY(generic_bs_r_1) 50 ldrb r0, [r1, r2] 51 RET 52END(generic_bs_r_1) 53 54ENTRY(generic_bs_r_2) 55 ldrh r0, [r1, r2] 56 RET 57END(generic_bs_r_2) 58 59ENTRY(generic_bs_r_4) 60 ldr r0, [r1, r2] 61 RET 62END(generic_bs_r_4) 63 64/* 65 * write single 66 */ 67 68ENTRY(generic_bs_w_1) 69 strb r3, [r1, r2] 70 RET 71END(generic_bs_w_1) 72 73ENTRY(generic_bs_w_2) 74 strh r3, [r1, r2] 75 RET 76END(generic_bs_w_2) 77 78ENTRY(generic_bs_w_4) 79 str r3, [r1, r2] 80 RET 81END(generic_bs_w_4) 82 83/* 84 * read multiple 85 */ 86 87ENTRY(generic_bs_rm_1) 88 add r0, r1, r2 89 mov r1, r3 90 ldr r2, [sp, #0] 91 teq r2, #0 92 RETeq 93 941: ldrb r3, [r0] 95 strb r3, [r1], #1 96 subs r2, r2, #1 97 bne 1b 98 99 RET 100END(generic_bs_rm_1) 101 102ENTRY(generic_bs_rm_2) 103 add r0, r1, r2 104 mov r1, r3 105 ldr r2, [sp, #0] 106 teq r2, #0 107 RETeq 108 1091: ldrh r3, [r0] 110 strh r3, [r1], #2 111 subs r2, r2, #1 112 bne 1b 113 114 RET 115END(generic_bs_rm_2) 116 117ENTRY(generic_bs_rm_4) 118 add r0, r1, r2 119 mov r1, r3 120 ldr r2, [sp, #0] 121 teq r2, #0 122 RETeq 123 1241: ldr r3, [r0] 125 str r3, [r1], #4 126 subs r2, r2, #1 127 bne 1b 128 129 RET 130END(generic_bs_rm_4) 131 132/* 133 * write multiple 134 */ 135 136ENTRY(generic_bs_wm_1) 137 add r0, r1, r2 138 mov r1, r3 139 ldr r2, [sp, #0] 140 teq r2, #0 141 RETeq 142 1431: ldrb r3, [r1], #1 144 strb r3, [r0] 145 subs r2, r2, #1 146 bne 1b 147 148 RET 149END(generic_bs_wm_1) 150 151ENTRY(generic_bs_wm_2) 152 add r0, r1, r2 153 mov r1, r3 154 ldr r2, [sp, #0] 155 teq r2, #0 156 RETeq 157 1581: ldrh r3, [r1], #2 159 strh r3, [r0] 160 subs r2, r2, #1 161 bne 1b 162 163 RET 164END(generic_bs_wm_2) 165 166ENTRY(generic_bs_wm_4) 167 add r0, r1, r2 168 mov r1, r3 169 ldr r2, [sp, #0] 170 teq r2, #0 171 RETeq 172 1731: ldr r3, [r1], #4 174 str r3, [r0] 175 subs r2, r2, #1 176 bne 1b 177 178 RET 179END(generic_bs_wm_4) 180 181/* 182 * read region 183 */ 184 185ENTRY(generic_bs_rr_1) 186 add r0, r1, r2 187 mov r1, r3 188 ldr r2, [sp, #0] 189 teq r2, #0 190 RETeq 191 1921: ldrb r3, [r0], #1 193 strb r3, [r1], #1 194 subs r2, r2, #1 195 bne 1b 196 197 RET 198END(generic_bs_rr_1) 199 200ENTRY(generic_bs_rr_2) 201 add r0, r1, r2 202 mov r1, r3 203 ldr r2, [sp, #0] 204 teq r2, #0 205 RETeq 206 2071: ldrh r3, [r0], #2 208 strh r3, [r1], #2 209 subs r2, r2, #1 210 bne 1b 211 212 RET 213END(generic_bs_rr_2) 214 215ENTRY(generic_bs_rr_4) 216 add r0, r1, r2 217 mov r1, r3 218 ldr r2, [sp, #0] 219 teq r2, #0 220 RETeq 221 2221: ldr r3, [r0], #4 223 str r3, [r1], #4 224 subs r2, r2, #1 225 bne 1b 226 227 RET 228END(generic_bs_rr_4) 229 230/* 231 * write region. 232 */ 233 234ENTRY(generic_bs_wr_1) 235 add r0, r1, r2 236 mov r1, r3 237 ldr r2, [sp, #0] 238 teq r2, #0 239 RETeq 240 2411: ldrb r3, [r1], #1 242 strb r3, [r0], #1 243 subs r2, r2, #1 244 bne 1b 245 246 RET 247END(generic_bs_wr_1) 248 249ENTRY(generic_bs_wr_2) 250 add r0, r1, r2 251 mov r1, r3 252 ldr r2, [sp, #0] 253 teq r2, #0 254 RETeq 255 2561: ldrh r3, [r1], #2 257 strh r3, [r0], #2 258 subs r2, r2, #1 259 bne 1b 260 261 RET 262END(generic_bs_wr_2) 263 264ENTRY(generic_bs_wr_4) 265 add r0, r1, r2 266 mov r1, r3 267 ldr r2, [sp, #0] 268 teq r2, #0 269 RETeq 270 2711: ldr r3, [r1], #4 272 str r3, [r0], #4 273 subs r2, r2, #1 274 bne 1b 275 276 RET 277END(generic_bs_wr_4) 278 279/* 280 * set region 281 */ 282 283ENTRY(generic_bs_sr_1) 284 add r0, r1, r2 285 mov r1, r3 286 ldr r2, [sp, #0] 287 teq r2, #0 288 RETeq 289 2901: strb r1, [r0], #1 291 subs r2, r2, #1 292 bne 1b 293 294 RET 295END(generic_bs_sr_1) 296 297ENTRY(generic_bs_sr_2) 298 add r0, r1, r2 299 mov r1, r3 300 ldr r2, [sp, #0] 301 teq r2, #0 302 RETeq 303 3041: strh r1, [r0], #2 305 subs r2, r2, #1 306 bne 1b 307 308 RET 309END(generic_bs_sr_2) 310 311ENTRY(generic_bs_sr_4) 312 add r0, r1, r2 313 mov r1, r3 314 ldr r2, [sp, #0] 315 teq r2, #0 316 RETeq 317 3181: str r1, [r0], #4 319 subs r2, r2, #1 320 bne 1b 321 322 RET 323END(generic_bs_sr_4) 324 325/* 326 * copy region 327 */ 328 329ENTRY(generic_bs_c_2) 330 add r0, r1, r2 331 ldr r2, [sp, #0] 332 add r1, r2, r3 333 ldr r2, [sp, #4] 334 teq r2, #0 335 RETeq 336 337 cmp r0, r1 338 blt 2f 339 3401: ldrh r3, [r0], #2 341 strh r3, [r1], #2 342 subs r2, r2, #1 343 bne 1b 344 345 RET 346 3472: add r0, r0, r2, lsl #1 348 add r1, r1, r2, lsl #1 349 sub r0, r0, #2 350 sub r1, r1, #2 351 3523: ldrh r3, [r0], #-2 353 strh r3, [r1], #-2 354 subs r2, r2, #1 355 bne 3b 356 357 RET 358END(generic_bs_c_2) 359 360