Back to home page

OSCL-LXR

 
 

    


0001 /* SPDX-License-Identifier: GPL-2.0-only */
0002 /*
0003  *  linux/drivers/acorn/scsi/acornscsi-io.S: Acorn SCSI card IO
0004  */
0005 #include <linux/linkage.h>
0006 
0007 #include <asm/assembler.h>
0008 #include <mach/hardware.h>
0009 
0010 #if defined(__APCS_32__)
0011 #define LOADREGS(t,r,l...)  ldm##t  r, l
0012 #elif defined(__APCS_26__)
0013 #define LOADREGS(t,r,l...)  ldm##t  r, l##^
0014 #endif
0015 
0016 @ Purpose: transfer a block of data from the acorn scsi card to memory
0017 @ Proto  : void acornscsi_in(unsigned int addr_start, char *buffer, int length)
0018 @ Returns: nothing
0019 
0020         .align
0021 ENTRY(__acornscsi_in)
0022         stmfd   sp!, {r4 - r7, lr}
0023         bic r0, r0, #3
0024         mov lr, #0xff
0025         orr lr, lr, #0xff00
0026 acornscsi_in16lp:
0027         subs    r2, r2, #16
0028         bmi acornscsi_in8
0029         ldmia   r0!, {r3, r4, r5, r6}
0030         and r3, r3, lr
0031         orr r3, r3, r4, lsl #16
0032         and     r4, r5, lr
0033         orr r4, r4, r6, lsl #16
0034         ldmia   r0!, {r5, r6, r7, ip}
0035         and r5, r5, lr
0036         orr r5, r5, r6, lsl #16
0037         and r6, r7, lr
0038         orr r6, r6, ip, lsl #16
0039         stmia   r1!, {r3 - r6}
0040         bne acornscsi_in16lp
0041         LOADREGS(fd, sp!, {r4 - r7, pc})
0042 
0043 acornscsi_in8:  adds    r2, r2, #8
0044         bmi acornscsi_in4
0045         ldmia   r0!, {r3, r4, r5, r6}
0046         and r3, r3, lr
0047         orr r3, r3, r4, lsl #16
0048         and r4, r5, lr
0049         orr r4, r4, r6, lsl #16
0050         stmia   r1!, {r3 - r4}
0051         LOADREGS(eqfd, sp!, {r4 - r7, pc})
0052         sub r2, r2, #8
0053 
0054 acornscsi_in4:  adds    r2, r2, #4
0055         bmi acornscsi_in2
0056         ldmia   r0!, {r3, r4}
0057         and r3, r3, lr
0058         orr r3, r3, r4, lsl #16
0059         str r3, [r1], #4
0060         LOADREGS(eqfd, sp!, {r4 - r7, pc})
0061         sub r2, r2, #4
0062 
0063 acornscsi_in2:  adds    r2, r2, #2
0064         ldr r3, [r0], #4
0065         and r3, r3, lr
0066         strb    r3, [r1], #1
0067         mov r3, r3, lsr #8
0068         strplb  r3, [r1], #1
0069         LOADREGS(fd, sp!, {r4 - r7, pc})
0070 
0071 @ Purpose: transfer a block of data from memory to the acorn scsi card
0072 @ Proto  : void acornscsi_in(unsigned int addr_start, char *buffer, int length)
0073 @ Returns: nothing
0074 
0075 ENTRY(__acornscsi_out)
0076         stmfd   sp!, {r4 - r6, lr}
0077         bic r0, r0, #3
0078 acornscsi_out16lp:
0079         subs    r2, r2, #16
0080         bmi acornscsi_out8
0081         ldmia   r1!, {r4, r6, ip, lr}
0082         mov r3, r4, lsl #16
0083         orr r3, r3, r3, lsr #16
0084         mov r4, r4, lsr #16
0085         orr r4, r4, r4, lsl #16
0086         mov r5, r6, lsl #16
0087         orr r5, r5, r5, lsr #16
0088         mov r6, r6, lsr #16
0089         orr r6, r6, r6, lsl #16
0090         stmia   r0!, {r3, r4, r5, r6}
0091         mov r3, ip, lsl #16
0092         orr r3, r3, r3, lsr #16
0093         mov r4, ip, lsr #16
0094         orr r4, r4, r4, lsl #16
0095         mov ip, lr, lsl #16
0096         orr ip, ip, ip, lsr #16
0097         mov lr, lr, lsr #16
0098         orr lr, lr, lr, lsl #16
0099         stmia   r0!, {r3, r4, ip, lr}
0100         bne acornscsi_out16lp
0101         LOADREGS(fd, sp!, {r4 - r6, pc})
0102 
0103 acornscsi_out8: adds    r2, r2, #8
0104         bmi acornscsi_out4
0105         ldmia   r1!, {r4, r6}
0106         mov r3, r4, lsl #16
0107         orr r3, r3, r3, lsr #16
0108         mov r4, r4, lsr #16
0109         orr r4, r4, r4, lsl #16
0110         mov r5, r6, lsl #16
0111         orr r5, r5, r5, lsr #16
0112         mov r6, r6, lsr #16
0113         orr r6, r6, r6, lsl #16
0114         stmia   r0!, {r3, r4, r5, r6}
0115         LOADREGS(eqfd, sp!, {r4 - r6, pc})
0116 
0117         sub r2, r2, #8
0118 acornscsi_out4: adds    r2, r2, #4
0119         bmi acornscsi_out2
0120         ldr r4, [r1], #4
0121         mov r3, r4, lsl #16
0122         orr r3, r3, r3, lsr #16
0123         mov r4, r4, lsr #16
0124         orr r4, r4, r4, lsl #16
0125         stmia   r0!, {r3, r4}
0126         LOADREGS(eqfd, sp!, {r4 - r6, pc})
0127 
0128         sub r2, r2, #4
0129 acornscsi_out2: adds    r2, r2, #2
0130         ldr r3, [r1], #2
0131         strb    r3, [r0], #1
0132         mov r3, r3, lsr #8
0133         strplb  r3, [r0], #1
0134         LOADREGS(fd, sp!, {r4 - r6, pc})
0135