1/* SPDX-License-Identifier: GPL-2.0-only */ 2/* 3 * linux/drivers/acorn/scsi/acornscsi-io.S: Acorn SCSI card IO 4 */ 5#include <linux/linkage.h> 6 7#include <asm/assembler.h> 8#include <mach/hardware.h> 9 10#if defined(__APCS_32__) 11#define LOADREGS(t,r,l...) ldm##t r, l 12#elif defined(__APCS_26__) 13#define LOADREGS(t,r,l...) ldm##t r, l##^ 14#endif 15 16@ Purpose: transfer a block of data from the acorn scsi card to memory 17@ Proto : void acornscsi_in(unsigned int addr_start, char *buffer, int length) 18@ Returns: nothing 19 20 .align 21ENTRY(__acornscsi_in) 22 stmfd sp!, {r4 - r7, lr} 23 bic r0, r0, #3 24 mov lr, #0xff 25 orr lr, lr, #0xff00 26acornscsi_in16lp: 27 subs r2, r2, #16 28 bmi acornscsi_in8 29 ldmia r0!, {r3, r4, r5, r6} 30 and r3, r3, lr 31 orr r3, r3, r4, lsl #16 32 and r4, r5, lr 33 orr r4, r4, r6, lsl #16 34 ldmia r0!, {r5, r6, r7, ip} 35 and r5, r5, lr 36 orr r5, r5, r6, lsl #16 37 and r6, r7, lr 38 orr r6, r6, ip, lsl #16 39 stmia r1!, {r3 - r6} 40 bne acornscsi_in16lp 41 LOADREGS(fd, sp!, {r4 - r7, pc}) 42 43acornscsi_in8: adds r2, r2, #8 44 bmi acornscsi_in4 45 ldmia r0!, {r3, r4, r5, r6} 46 and r3, r3, lr 47 orr r3, r3, r4, lsl #16 48 and r4, r5, lr 49 orr r4, r4, r6, lsl #16 50 stmia r1!, {r3 - r4} 51 LOADREGS(eqfd, sp!, {r4 - r7, pc}) 52 sub r2, r2, #8 53 54acornscsi_in4: adds r2, r2, #4 55 bmi acornscsi_in2 56 ldmia r0!, {r3, r4} 57 and r3, r3, lr 58 orr r3, r3, r4, lsl #16 59 str r3, [r1], #4 60 LOADREGS(eqfd, sp!, {r4 - r7, pc}) 61 sub r2, r2, #4 62 63acornscsi_in2: adds r2, r2, #2 64 ldr r3, [r0], #4 65 and r3, r3, lr 66 strb r3, [r1], #1 67 mov r3, r3, lsr #8 68 strplb r3, [r1], #1 69 LOADREGS(fd, sp!, {r4 - r7, pc}) 70 71@ Purpose: transfer a block of data from memory to the acorn scsi card 72@ Proto : void acornscsi_in(unsigned int addr_start, char *buffer, int length) 73@ Returns: nothing 74 75ENTRY(__acornscsi_out) 76 stmfd sp!, {r4 - r6, lr} 77 bic r0, r0, #3 78acornscsi_out16lp: 79 subs r2, r2, #16 80 bmi acornscsi_out8 81 ldmia r1!, {r4, r6, ip, lr} 82 mov r3, r4, lsl #16 83 orr r3, r3, r3, lsr #16 84 mov r4, r4, lsr #16 85 orr r4, r4, r4, lsl #16 86 mov r5, r6, lsl #16 87 orr r5, r5, r5, lsr #16 88 mov r6, r6, lsr #16 89 orr r6, r6, r6, lsl #16 90 stmia r0!, {r3, r4, r5, r6} 91 mov r3, ip, lsl #16 92 orr r3, r3, r3, lsr #16 93 mov r4, ip, lsr #16 94 orr r4, r4, r4, lsl #16 95 mov ip, lr, lsl #16 96 orr ip, ip, ip, lsr #16 97 mov lr, lr, lsr #16 98 orr lr, lr, lr, lsl #16 99 stmia r0!, {r3, r4, ip, lr} 100 bne acornscsi_out16lp 101 LOADREGS(fd, sp!, {r4 - r6, pc}) 102 103acornscsi_out8: adds r2, r2, #8 104 bmi acornscsi_out4 105 ldmia r1!, {r4, r6} 106 mov r3, r4, lsl #16 107 orr r3, r3, r3, lsr #16 108 mov r4, r4, lsr #16 109 orr r4, r4, r4, lsl #16 110 mov r5, r6, lsl #16 111 orr r5, r5, r5, lsr #16 112 mov r6, r6, lsr #16 113 orr r6, r6, r6, lsl #16 114 stmia r0!, {r3, r4, r5, r6} 115 LOADREGS(eqfd, sp!, {r4 - r6, pc}) 116 117 sub r2, r2, #8 118acornscsi_out4: adds r2, r2, #4 119 bmi acornscsi_out2 120 ldr r4, [r1], #4 121 mov r3, r4, lsl #16 122 orr r3, r3, r3, lsr #16 123 mov r4, r4, lsr #16 124 orr r4, r4, r4, lsl #16 125 stmia r0!, {r3, r4} 126 LOADREGS(eqfd, sp!, {r4 - r6, pc}) 127 128 sub r2, r2, #4 129acornscsi_out2: adds r2, r2, #2 130 ldr r3, [r1], #2 131 strb r3, [r0], #1 132 mov r3, r3, lsr #8 133 strplb r3, [r0], #1 134 LOADREGS(fd, sp!, {r4 - r6, pc}) 135 136