OpenCores
URL https://opencores.org/ocsvn/or1k/or1k/trunk

Subversion Repositories or1k

[/] [or1k/] [trunk/] [linux/] [linux-2.4/] [drivers/] [acorn/] [scsi/] [acornscsi-io.S] - Rev 1779

Go to most recent revision | Compare with Previous | Blame | View Log

/*
 *  linux/drivers/acorn/scsi/acornscsi-io.S: Acorn SCSI card IO
 *
 * This program is free software; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License version 2 as
 * published by the Free Software Foundation.
 */
#include <linux/linkage.h>

#include <asm/assembler.h>
#include <asm/hardware.h>

#if (IO_BASE == (PCIO_BASE & 0xff000000))
#define ADDR(off,reg)                                           \
                tst     off, $0x80000000                        ;\
                mov     reg, $IO_BASE                           ;\
                orreq   reg, reg, $(PCIO_BASE & 0x00ff0000)
#else
#define ADDR(off,reg)                                           \
                tst     off, $0x80000000                        ;\
                movne   reg, $IO_BASE                           ;\
                moveq   reg, $(PCIO_BASE & 0xff000000)          ;\
                orreq   reg, reg, $(PCIO_BASE & 0x00ff0000)
#endif

@ Purpose: transfer a block of data from the acorn scsi card to memory
@ Proto  : void acornscsi_in(unsigned int addr_start, char *buffer, int length)
@ Returns: nothing

                .align
ENTRY(__acornscsi_in)
                stmfd   sp!, {r4 - r7, lr}
                bic     r0, r0, #3
                mov     lr, #0xff
                orr     lr, lr, #0xff00
acornscsi_in16lp:
                subs    r2, r2, #16
                bmi     acornscsi_in8
                ldmia   r0!, {r3, r4, r5, r6}
                and     r3, r3, lr
                orr     r3, r3, r4, lsl #16
                and     r4, r5, lr
                orr     r4, r4, r6, lsl #16
                ldmia   r0!, {r5, r6, r7, ip}
                and     r5, r5, lr
                orr     r5, r5, r6, lsl #16
                and     r6, r7, lr
                orr     r6, r6, ip, lsl #16
                stmia   r1!, {r3 - r6}
                bne     acornscsi_in16lp
                LOADREGS(fd, sp!, {r4 - r7, pc})

acornscsi_in8:  adds    r2, r2, #8
                bmi     acornscsi_in4
                ldmia   r0!, {r3, r4, r5, r6}
                and     r3, r3, lr
                orr     r3, r3, r4, lsl #16
                and     r4, r5, lr
                orr     r4, r4, r6, lsl #16
                stmia   r1!, {r3 - r4}
                LOADREGS(eqfd, sp!, {r4 - r7, pc})
                sub     r2, r2, #8

acornscsi_in4:  adds    r2, r2, #4
                bmi     acornscsi_in2
                ldmia   r0!, {r3, r4}
                and     r3, r3, lr
                orr     r3, r3, r4, lsl #16
                str     r3, [r1], #4
                LOADREGS(eqfd, sp!, {r4 - r7, pc})
                sub     r2, r2, #4

acornscsi_in2:  adds    r2, r2, #2
                ldr     r3, [r0], #4
                and     r3, r3, lr
                strb    r3, [r1], #1
                mov     r3, r3, lsr #8
                strplb  r3, [r1], #1
                LOADREGS(fd, sp!, {r4 - r7, pc})

@ Purpose: transfer a block of data from memory to the acorn scsi card
@ Proto  : void acornscsi_in(unsigned int addr_start, char *buffer, int length)
@ Returns: nothing

ENTRY(__acornscsi_out)
                stmfd   sp!, {r4 - r6, lr}
                bic     r0, r0, #3
acornscsi_out16lp:
                subs    r2, r2, #16
                bmi     acornscsi_out8
                ldmia   r1!, {r4, r6, ip, lr}
                mov     r3, r4, lsl #16
                orr     r3, r3, r3, lsr #16
                mov     r4, r4, lsr #16
                orr     r4, r4, r4, lsl #16
                mov     r5, r6, lsl #16
                orr     r5, r5, r5, lsr #16
                mov     r6, r6, lsr #16
                orr     r6, r6, r6, lsl #16
                stmia   r0!, {r3, r4, r5, r6}
                mov     r3, ip, lsl #16
                orr     r3, r3, r3, lsr #16
                mov     r4, ip, lsr #16
                orr     r4, r4, r4, lsl #16
                mov     ip, lr, lsl #16
                orr     ip, ip, ip, lsr #16
                mov     lr, lr, lsr #16
                orr     lr, lr, lr, lsl #16
                stmia   r0!, {r3, r4, ip, lr}
                bne     acornscsi_out16lp
                LOADREGS(fd, sp!, {r4 - r6, pc})

acornscsi_out8: adds    r2, r2, #8
                bmi     acornscsi_out4
                ldmia   r1!, {r4, r6}
                mov     r3, r4, lsl #16
                orr     r3, r3, r3, lsr #16
                mov     r4, r4, lsr #16
                orr     r4, r4, r4, lsl #16
                mov     r5, r6, lsl #16
                orr     r5, r5, r5, lsr #16
                mov     r6, r6, lsr #16
                orr     r6, r6, r6, lsl #16
                stmia   r0!, {r3, r4, r5, r6}
                LOADREGS(eqfd, sp!, {r4 - r6, pc})

                sub     r2, r2, #8
acornscsi_out4: adds    r2, r2, #4
                bmi     acornscsi_out2
                ldr     r4, [r1], #4
                mov     r3, r4, lsl #16
                orr     r3, r3, r3, lsr #16
                mov     r4, r4, lsr #16
                orr     r4, r4, r4, lsl #16
                stmia   r0!, {r3, r4}
                LOADREGS(eqfd, sp!, {r4 - r6, pc})

                sub     r2, r2, #4
acornscsi_out2: adds    r2, r2, #2
                ldr     r3, [r1], #2
                strb    r3, [r0], #1
                mov     r3, r3, lsr #8
                strplb  r3, [r0], #1
                LOADREGS(fd, sp!, {r4 - r6, pc})

Go to most recent revision | Compare with Previous | Blame | View Log

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.