136 lines · plain
1/* SPDX-License-Identifier: GPL-2.0-only */2/*3 * linux/drivers/acorn/scsi/acornscsi-io.S: Acorn SCSI card IO4 */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, l12#elif defined(__APCS_26__)13#define LOADREGS(t,r,l...) ldm##t r, l##^14#endif15 16@ Purpose: transfer a block of data from the acorn scsi card to memory17@ Proto : void acornscsi_in(unsigned int addr_start, char *buffer, int length)18@ Returns: nothing19 20 .align21ENTRY(__acornscsi_in)22 stmfd sp!, {r4 - r7, lr}23 bic r0, r0, #324 mov lr, #0xff25 orr lr, lr, #0xff0026acornscsi_in16lp:27 subs r2, r2, #1628 bmi acornscsi_in829 ldmia r0!, {r3, r4, r5, r6}30 and r3, r3, lr31 orr r3, r3, r4, lsl #1632 and r4, r5, lr33 orr r4, r4, r6, lsl #1634 ldmia r0!, {r5, r6, r7, ip}35 and r5, r5, lr36 orr r5, r5, r6, lsl #1637 and r6, r7, lr38 orr r6, r6, ip, lsl #1639 stmia r1!, {r3 - r6}40 bne acornscsi_in16lp41 LOADREGS(fd, sp!, {r4 - r7, pc})42 43acornscsi_in8: adds r2, r2, #844 bmi acornscsi_in445 ldmia r0!, {r3, r4, r5, r6}46 and r3, r3, lr47 orr r3, r3, r4, lsl #1648 and r4, r5, lr49 orr r4, r4, r6, lsl #1650 stmia r1!, {r3 - r4}51 LOADREGS(eqfd, sp!, {r4 - r7, pc})52 sub r2, r2, #853 54acornscsi_in4: adds r2, r2, #455 bmi acornscsi_in256 ldmia r0!, {r3, r4}57 and r3, r3, lr58 orr r3, r3, r4, lsl #1659 str r3, [r1], #460 LOADREGS(eqfd, sp!, {r4 - r7, pc})61 sub r2, r2, #462 63acornscsi_in2: adds r2, r2, #264 ldr r3, [r0], #465 and r3, r3, lr66 strb r3, [r1], #167 mov r3, r3, lsr #868 strplb r3, [r1], #169 LOADREGS(fd, sp!, {r4 - r7, pc})70 71@ Purpose: transfer a block of data from memory to the acorn scsi card72@ Proto : void acornscsi_in(unsigned int addr_start, char *buffer, int length)73@ Returns: nothing74 75ENTRY(__acornscsi_out)76 stmfd sp!, {r4 - r6, lr}77 bic r0, r0, #378acornscsi_out16lp:79 subs r2, r2, #1680 bmi acornscsi_out881 ldmia r1!, {r4, r6, ip, lr}82 mov r3, r4, lsl #1683 orr r3, r3, r3, lsr #1684 mov r4, r4, lsr #1685 orr r4, r4, r4, lsl #1686 mov r5, r6, lsl #1687 orr r5, r5, r5, lsr #1688 mov r6, r6, lsr #1689 orr r6, r6, r6, lsl #1690 stmia r0!, {r3, r4, r5, r6}91 mov r3, ip, lsl #1692 orr r3, r3, r3, lsr #1693 mov r4, ip, lsr #1694 orr r4, r4, r4, lsl #1695 mov ip, lr, lsl #1696 orr ip, ip, ip, lsr #1697 mov lr, lr, lsr #1698 orr lr, lr, lr, lsl #1699 stmia r0!, {r3, r4, ip, lr}100 bne acornscsi_out16lp101 LOADREGS(fd, sp!, {r4 - r6, pc})102 103acornscsi_out8: adds r2, r2, #8104 bmi acornscsi_out4105 ldmia r1!, {r4, r6}106 mov r3, r4, lsl #16107 orr r3, r3, r3, lsr #16108 mov r4, r4, lsr #16109 orr r4, r4, r4, lsl #16110 mov r5, r6, lsl #16111 orr r5, r5, r5, lsr #16112 mov r6, r6, lsr #16113 orr r6, r6, r6, lsl #16114 stmia r0!, {r3, r4, r5, r6}115 LOADREGS(eqfd, sp!, {r4 - r6, pc})116 117 sub r2, r2, #8118acornscsi_out4: adds r2, r2, #4119 bmi acornscsi_out2120 ldr r4, [r1], #4121 mov r3, r4, lsl #16122 orr r3, r3, r3, lsr #16123 mov r4, r4, lsr #16124 orr r4, r4, r4, lsl #16125 stmia r0!, {r3, r4}126 LOADREGS(eqfd, sp!, {r4 - r6, pc})127 128 sub r2, r2, #4129acornscsi_out2: adds r2, r2, #2130 ldr r3, [r1], #2131 strb r3, [r0], #1132 mov r3, r3, lsr #8133 strplb r3, [r0], #1134 LOADREGS(fd, sp!, {r4 - r6, pc})135 136