1*6f7d103fSpatrick/* $OpenBSD: bus_space_asm_armv7.S,v 1.5 2016/03/22 23:35:01 patrick Exp $ */ 2e6ca3953Spatrick/* $NetBSD: bus_space_asm_armv7.S,v 1.3 2003/03/27 19:46:14 mycroft Exp $ */ 3e6ca3953Spatrick 4e6ca3953Spatrick/* 5e6ca3953Spatrick * Copyright (c) 1997 Causality Limited. 6e6ca3953Spatrick * Copyright (c) 1997 Mark Brinicombe. 7e6ca3953Spatrick * All rights reserved. 8e6ca3953Spatrick * 9e6ca3953Spatrick * Redistribution and use in source and binary forms, with or without 10e6ca3953Spatrick * modification, are permitted provided that the following conditions 11e6ca3953Spatrick * are met: 12e6ca3953Spatrick * 1. Redistributions of source code must retain the above copyright 13e6ca3953Spatrick * notice, this list of conditions and the following disclaimer. 14e6ca3953Spatrick * 2. Redistributions in binary form must reproduce the above copyright 15e6ca3953Spatrick * notice, this list of conditions and the following disclaimer in the 16e6ca3953Spatrick * documentation and/or other materials provided with the distribution. 17e6ca3953Spatrick * 3. All advertising materials mentioning features or use of this software 18e6ca3953Spatrick * must display the following acknowledgement: 19e6ca3953Spatrick * This product includes software developed by Mark Brinicombe 20e6ca3953Spatrick * for the NetBSD Project. 21e6ca3953Spatrick * 4. The name of the company nor the name of the author may be used to 22e6ca3953Spatrick * endorse or promote products derived from this software without specific 23e6ca3953Spatrick * prior written permission. 24e6ca3953Spatrick * 25e6ca3953Spatrick * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED 26e6ca3953Spatrick * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF 27e6ca3953Spatrick * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. 28e6ca3953Spatrick * IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, 29e6ca3953Spatrick * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES 30e6ca3953Spatrick * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR 31e6ca3953Spatrick * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 32e6ca3953Spatrick * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 33e6ca3953Spatrick * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 34e6ca3953Spatrick * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 35e6ca3953Spatrick * SUCH DAMAGE. 36e6ca3953Spatrick */ 37e6ca3953Spatrick 38e6ca3953Spatrick#include <arm/asm.h> 39e6ca3953Spatrick#include <arm/cpuconf.h> 40e6ca3953Spatrick 41e6ca3953Spatrick/* 42e6ca3953Spatrick * Generic bus_space functions. 43e6ca3953Spatrick */ 44e6ca3953Spatrick 45e6ca3953Spatrick/* 46e6ca3953Spatrick * read single 47e6ca3953Spatrick */ 48e6ca3953Spatrick 49e6ca3953SpatrickENTRY(armv7_bs_r_1) 5010aa22a0Sjsg dsb sy 51e6ca3953Spatrick ldrb r0, [r1, r2] 52e6ca3953Spatrick mov pc, lr 53e6ca3953Spatrick 54e6ca3953SpatrickENTRY(armv7_bs_r_2) 5510aa22a0Sjsg dsb sy 56e6ca3953Spatrick ldrh r0, [r1, r2] 57e6ca3953Spatrick mov pc, lr 58e6ca3953Spatrick 59e6ca3953SpatrickENTRY(armv7_bs_r_4) 6010aa22a0Sjsg dsb sy 61e6ca3953Spatrick ldr r0, [r1, r2] 62e6ca3953Spatrick mov pc, lr 63e6ca3953Spatrick 64e6ca3953Spatrick/* 65e6ca3953Spatrick * write single 66e6ca3953Spatrick */ 67e6ca3953Spatrick 68e6ca3953SpatrickENTRY(armv7_bs_w_1) 69e6ca3953Spatrick strb r3, [r1, r2] 7010aa22a0Sjsg dsb sy 71e6ca3953Spatrick mov pc, lr 72e6ca3953Spatrick 73e6ca3953SpatrickENTRY(armv7_bs_w_2) 74e6ca3953Spatrick strh r3, [r1, r2] 7510aa22a0Sjsg dsb sy 76e6ca3953Spatrick mov pc, lr 77e6ca3953Spatrick 78e6ca3953SpatrickENTRY(armv7_bs_w_4) 79e6ca3953Spatrick str r3, [r1, r2] 8010aa22a0Sjsg dsb sy 81e6ca3953Spatrick mov pc, lr 82e6ca3953Spatrick 83e6ca3953Spatrick/* 84e6ca3953Spatrick * read multiple 85e6ca3953Spatrick */ 86e6ca3953Spatrick 87e6ca3953SpatrickENTRY(armv7_bs_rm_1) 88e6ca3953Spatrick add r0, r1, r2 89e6ca3953Spatrick mov r1, r3 90e6ca3953Spatrick ldr r2, [sp, #0] 91e6ca3953Spatrick teq r2, #0 92e6ca3953Spatrick moveq pc, lr 93e6ca3953Spatrick 94e6ca3953Spatrick1: ldrb r3, [r0] 95e6ca3953Spatrick strb r3, [r1], #1 96e6ca3953Spatrick subs r2, r2, #1 97e6ca3953Spatrick bne 1b 9810aa22a0Sjsg dsb sy 99e6ca3953Spatrick 100e6ca3953Spatrick mov pc, lr 101e6ca3953Spatrick 102e6ca3953SpatrickENTRY(armv7_bs_rm_2) 103e6ca3953Spatrick add r0, r1, r2 104e6ca3953Spatrick mov r1, r3 105e6ca3953Spatrick ldr r2, [sp, #0] 106e6ca3953Spatrick teq r2, #0 107e6ca3953Spatrick moveq pc, lr 108e6ca3953Spatrick 109e6ca3953Spatrick1: ldrh r3, [r0] 110e6ca3953Spatrick strh r3, [r1], #2 111e6ca3953Spatrick subs r2, r2, #1 112e6ca3953Spatrick bne 1b 11310aa22a0Sjsg dsb sy 114e6ca3953Spatrick 115e6ca3953Spatrick mov pc, lr 116e6ca3953Spatrick 117e6ca3953SpatrickENTRY(armv7_bs_rm_4) 118e6ca3953Spatrick add r0, r1, r2 119e6ca3953Spatrick mov r1, r3 120e6ca3953Spatrick ldr r2, [sp, #0] 121e6ca3953Spatrick teq r2, #0 122e6ca3953Spatrick moveq pc, lr 123e6ca3953Spatrick 124e6ca3953Spatrick1: ldr r3, [r0] 125e6ca3953Spatrick str r3, [r1], #4 126e6ca3953Spatrick subs r2, r2, #1 127e6ca3953Spatrick bne 1b 12810aa22a0Sjsg dsb sy 129e6ca3953Spatrick 130e6ca3953Spatrick mov pc, lr 131e6ca3953Spatrick 132e6ca3953Spatrick/* 133e6ca3953Spatrick * write multiple 134e6ca3953Spatrick */ 135e6ca3953Spatrick 136e6ca3953SpatrickENTRY(armv7_bs_wm_1) 137e6ca3953Spatrick add r0, r1, r2 138e6ca3953Spatrick mov r1, r3 139e6ca3953Spatrick ldr r2, [sp, #0] 140e6ca3953Spatrick teq r2, #0 141e6ca3953Spatrick moveq pc, lr 142e6ca3953Spatrick 143e6ca3953Spatrick1: ldrb r3, [r1], #1 144e6ca3953Spatrick strb r3, [r0] 145e6ca3953Spatrick subs r2, r2, #1 146e6ca3953Spatrick bne 1b 14710aa22a0Sjsg dsb sy 148e6ca3953Spatrick 149e6ca3953Spatrick mov pc, lr 150e6ca3953Spatrick 151e6ca3953SpatrickENTRY(armv7_bs_wm_2) 152e6ca3953Spatrick add r0, r1, r2 153e6ca3953Spatrick mov r1, r3 154e6ca3953Spatrick ldr r2, [sp, #0] 155e6ca3953Spatrick teq r2, #0 156e6ca3953Spatrick moveq pc, lr 157e6ca3953Spatrick 158e6ca3953Spatrick1: ldrh r3, [r1], #2 159e6ca3953Spatrick strh r3, [r0] 160e6ca3953Spatrick subs r2, r2, #1 161e6ca3953Spatrick bne 1b 16210aa22a0Sjsg dsb sy 163e6ca3953Spatrick 164e6ca3953Spatrick mov pc, lr 165e6ca3953Spatrick 166e6ca3953SpatrickENTRY(armv7_bs_wm_4) 167e6ca3953Spatrick add r0, r1, r2 168e6ca3953Spatrick mov r1, r3 169e6ca3953Spatrick ldr r2, [sp, #0] 170e6ca3953Spatrick teq r2, #0 171e6ca3953Spatrick moveq pc, lr 172e6ca3953Spatrick 173e6ca3953Spatrick1: ldr r3, [r1], #4 174e6ca3953Spatrick str r3, [r0] 175e6ca3953Spatrick subs r2, r2, #1 176e6ca3953Spatrick bne 1b 17710aa22a0Sjsg dsb sy 178e6ca3953Spatrick 179e6ca3953Spatrick mov pc, lr 180e6ca3953Spatrick 181e6ca3953Spatrick/* 182e6ca3953Spatrick * read region 183e6ca3953Spatrick */ 184e6ca3953Spatrick 185e6ca3953SpatrickENTRY(armv7_bs_rr_1) 186e6ca3953Spatrick add r0, r1, r2 187e6ca3953Spatrick mov r1, r3 188e6ca3953Spatrick ldr r2, [sp, #0] 189e6ca3953Spatrick teq r2, #0 190e6ca3953Spatrick moveq pc, lr 191e6ca3953Spatrick 192e6ca3953Spatrick1: ldrb r3, [r0], #1 193e6ca3953Spatrick strb r3, [r1], #1 194e6ca3953Spatrick subs r2, r2, #1 195e6ca3953Spatrick bne 1b 19610aa22a0Sjsg dsb sy 197e6ca3953Spatrick 198e6ca3953Spatrick mov pc, lr 199e6ca3953Spatrick 200e6ca3953SpatrickENTRY(armv7_bs_rr_2) 201e6ca3953Spatrick add r0, r1, r2 202e6ca3953Spatrick mov r1, r3 203e6ca3953Spatrick ldr r2, [sp, #0] 204e6ca3953Spatrick teq r2, #0 205e6ca3953Spatrick moveq pc, lr 206e6ca3953Spatrick 207e6ca3953Spatrick1: ldrh r3, [r0], #2 208e6ca3953Spatrick strh r3, [r1], #2 209e6ca3953Spatrick subs r2, r2, #1 210e6ca3953Spatrick bne 1b 21110aa22a0Sjsg dsb sy 212e6ca3953Spatrick 213e6ca3953Spatrick mov pc, lr 214e6ca3953Spatrick 215e6ca3953SpatrickENTRY(armv7_bs_rr_4) 216e6ca3953Spatrick add r0, r1, r2 217e6ca3953Spatrick mov r1, r3 218e6ca3953Spatrick ldr r2, [sp, #0] 219e6ca3953Spatrick teq r2, #0 220e6ca3953Spatrick moveq pc, lr 221e6ca3953Spatrick 222e6ca3953Spatrick1: ldr r3, [r0], #4 223e6ca3953Spatrick str r3, [r1], #4 224e6ca3953Spatrick subs r2, r2, #1 225e6ca3953Spatrick bne 1b 226e6ca3953Spatrick 227e6ca3953Spatrick mov pc, lr 228e6ca3953Spatrick 229e6ca3953Spatrick/* 230e6ca3953Spatrick * write region. 231e6ca3953Spatrick */ 232e6ca3953Spatrick 233e6ca3953SpatrickENTRY(armv7_bs_wr_1) 234e6ca3953Spatrick add r0, r1, r2 235e6ca3953Spatrick mov r1, r3 236e6ca3953Spatrick ldr r2, [sp, #0] 237e6ca3953Spatrick teq r2, #0 238e6ca3953Spatrick moveq pc, lr 239e6ca3953Spatrick 240e6ca3953Spatrick1: ldrb r3, [r1], #1 241e6ca3953Spatrick strb r3, [r0], #1 242e6ca3953Spatrick subs r2, r2, #1 243e6ca3953Spatrick bne 1b 24410aa22a0Sjsg dsb sy 245e6ca3953Spatrick 246e6ca3953Spatrick mov pc, lr 247e6ca3953Spatrick 248e6ca3953SpatrickENTRY(armv7_bs_wr_2) 249e6ca3953Spatrick add r0, r1, r2 250e6ca3953Spatrick mov r1, r3 251e6ca3953Spatrick ldr r2, [sp, #0] 252e6ca3953Spatrick teq r2, #0 253e6ca3953Spatrick moveq pc, lr 254e6ca3953Spatrick 255e6ca3953Spatrick1: ldrh r3, [r1], #2 256e6ca3953Spatrick strh r3, [r0], #2 257e6ca3953Spatrick subs r2, r2, #1 258e6ca3953Spatrick bne 1b 25910aa22a0Sjsg dsb sy 260e6ca3953Spatrick 261e6ca3953Spatrick mov pc, lr 262e6ca3953Spatrick 263e6ca3953SpatrickENTRY(armv7_bs_wr_4) 264e6ca3953Spatrick add r0, r1, r2 265e6ca3953Spatrick mov r1, r3 266e6ca3953Spatrick ldr r2, [sp, #0] 267e6ca3953Spatrick teq r2, #0 268e6ca3953Spatrick moveq pc, lr 269e6ca3953Spatrick 270e6ca3953Spatrick1: ldr r3, [r1], #4 271e6ca3953Spatrick str r3, [r0], #4 272e6ca3953Spatrick subs r2, r2, #1 273e6ca3953Spatrick bne 1b 27410aa22a0Sjsg dsb sy 275e6ca3953Spatrick 276e6ca3953Spatrick mov pc, lr 277e6ca3953Spatrick 278e6ca3953Spatrick/* 279e6ca3953Spatrick * set region 280e6ca3953Spatrick */ 281e6ca3953Spatrick 282e6ca3953SpatrickENTRY(armv7_bs_sr_1) 283e6ca3953Spatrick add r0, r1, r2 284e6ca3953Spatrick mov r1, r3 285e6ca3953Spatrick ldr r2, [sp, #0] 286e6ca3953Spatrick teq r2, #0 287e6ca3953Spatrick moveq pc, lr 288e6ca3953Spatrick 289e6ca3953Spatrick1: strb r1, [r0], #1 290e6ca3953Spatrick subs r2, r2, #1 291e6ca3953Spatrick bne 1b 29210aa22a0Sjsg dsb sy 293e6ca3953Spatrick 294e6ca3953Spatrick mov pc, lr 295e6ca3953Spatrick 296e6ca3953SpatrickENTRY(armv7_bs_sr_2) 297e6ca3953Spatrick add r0, r1, r2 298e6ca3953Spatrick mov r1, r3 299e6ca3953Spatrick ldr r2, [sp, #0] 300e6ca3953Spatrick teq r2, #0 301e6ca3953Spatrick moveq pc, lr 302e6ca3953Spatrick 303e6ca3953Spatrick1: strh r1, [r0], #2 304e6ca3953Spatrick subs r2, r2, #1 305e6ca3953Spatrick bne 1b 30610aa22a0Sjsg dsb sy 307e6ca3953Spatrick 308e6ca3953Spatrick mov pc, lr 309e6ca3953Spatrick 310e6ca3953SpatrickENTRY(armv7_bs_sr_4) 311e6ca3953Spatrick add r0, r1, r2 312e6ca3953Spatrick mov r1, r3 313e6ca3953Spatrick ldr r2, [sp, #0] 314e6ca3953Spatrick teq r2, #0 315e6ca3953Spatrick moveq pc, lr 316e6ca3953Spatrick 317e6ca3953Spatrick1: str r1, [r0], #4 318e6ca3953Spatrick subs r2, r2, #1 319e6ca3953Spatrick bne 1b 32010aa22a0Sjsg dsb sy 321e6ca3953Spatrick 322e6ca3953Spatrick mov pc, lr 323e6ca3953Spatrick 324e6ca3953Spatrick/* 325e6ca3953Spatrick * copy region 326e6ca3953Spatrick */ 327e6ca3953Spatrick 328e6ca3953SpatrickENTRY(armv7_bs_c_2) 329e6ca3953Spatrick add r0, r1, r2 330e6ca3953Spatrick ldr r2, [sp, #0] 331e6ca3953Spatrick add r1, r2, r3 332e6ca3953Spatrick ldr r2, [sp, #4] 333e6ca3953Spatrick teq r2, #0 334e6ca3953Spatrick moveq pc, lr 335e6ca3953Spatrick 336e6ca3953Spatrick cmp r0, r1 337e6ca3953Spatrick blt 2f 338e6ca3953Spatrick 339e6ca3953Spatrick1: ldrh r3, [r0], #2 340e6ca3953Spatrick strh r3, [r1], #2 341e6ca3953Spatrick subs r2, r2, #1 342e6ca3953Spatrick bne 1b 34310aa22a0Sjsg dsb sy 344e6ca3953Spatrick 345e6ca3953Spatrick mov pc, lr 346e6ca3953Spatrick 347e6ca3953Spatrick2: add r0, r0, r2, lsl #1 348e6ca3953Spatrick add r1, r1, r2, lsl #1 349e6ca3953Spatrick sub r0, r0, #2 350e6ca3953Spatrick sub r1, r1, #2 351e6ca3953Spatrick 352e6ca3953Spatrick3: ldrh r3, [r0], #-2 353e6ca3953Spatrick strh r3, [r1], #-2 354e6ca3953Spatrick subs r2, r2, #1 355e6ca3953Spatrick bne 3b 35610aa22a0Sjsg dsb sy 357e6ca3953Spatrick 358e6ca3953Spatrick mov pc, lr 359