acornscsi-io.S 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132
  1. /*
  2. * linux/drivers/acorn/scsi/acornscsi-io.S: Acorn SCSI card IO
  3. *
  4. * This program is free software; you can redistribute it and/or modify
  5. * it under the terms of the GNU General Public License version 2 as
  6. * published by the Free Software Foundation.
  7. */
  8. #include <linux/linkage.h>
  9. #include <asm/assembler.h>
  10. #include <asm/hardware.h>
  11. @ Purpose: transfer a block of data from the acorn scsi card to memory
  12. @ Proto : void acornscsi_in(unsigned int addr_start, char *buffer, int length)
  13. @ Returns: nothing
  14. .align
  15. ENTRY(__acornscsi_in)
  16. stmfd sp!, {r4 - r7, lr}
  17. bic r0, r0, #3
  18. mov lr, #0xff
  19. orr lr, lr, #0xff00
  20. acornscsi_in16lp:
  21. subs r2, r2, #16
  22. bmi acornscsi_in8
  23. ldmia r0!, {r3, r4, r5, r6}
  24. and r3, r3, lr
  25. orr r3, r3, r4, lsl #16
  26. and r4, r5, lr
  27. orr r4, r4, r6, lsl #16
  28. ldmia r0!, {r5, r6, r7, ip}
  29. and r5, r5, lr
  30. orr r5, r5, r6, lsl #16
  31. and r6, r7, lr
  32. orr r6, r6, ip, lsl #16
  33. stmia r1!, {r3 - r6}
  34. bne acornscsi_in16lp
  35. LOADREGS(fd, sp!, {r4 - r7, pc})
  36. acornscsi_in8: adds r2, r2, #8
  37. bmi acornscsi_in4
  38. ldmia r0!, {r3, r4, r5, r6}
  39. and r3, r3, lr
  40. orr r3, r3, r4, lsl #16
  41. and r4, r5, lr
  42. orr r4, r4, r6, lsl #16
  43. stmia r1!, {r3 - r4}
  44. LOADREGS(eqfd, sp!, {r4 - r7, pc})
  45. sub r2, r2, #8
  46. acornscsi_in4: adds r2, r2, #4
  47. bmi acornscsi_in2
  48. ldmia r0!, {r3, r4}
  49. and r3, r3, lr
  50. orr r3, r3, r4, lsl #16
  51. str r3, [r1], #4
  52. LOADREGS(eqfd, sp!, {r4 - r7, pc})
  53. sub r2, r2, #4
  54. acornscsi_in2: adds r2, r2, #2
  55. ldr r3, [r0], #4
  56. and r3, r3, lr
  57. strb r3, [r1], #1
  58. mov r3, r3, lsr #8
  59. strplb r3, [r1], #1
  60. LOADREGS(fd, sp!, {r4 - r7, pc})
  61. @ Purpose: transfer a block of data from memory to the acorn scsi card
  62. @ Proto : void acornscsi_in(unsigned int addr_start, char *buffer, int length)
  63. @ Returns: nothing
  64. ENTRY(__acornscsi_out)
  65. stmfd sp!, {r4 - r6, lr}
  66. bic r0, r0, #3
  67. acornscsi_out16lp:
  68. subs r2, r2, #16
  69. bmi acornscsi_out8
  70. ldmia r1!, {r4, r6, ip, lr}
  71. mov r3, r4, lsl #16
  72. orr r3, r3, r3, lsr #16
  73. mov r4, r4, lsr #16
  74. orr r4, r4, r4, lsl #16
  75. mov r5, r6, lsl #16
  76. orr r5, r5, r5, lsr #16
  77. mov r6, r6, lsr #16
  78. orr r6, r6, r6, lsl #16
  79. stmia r0!, {r3, r4, r5, r6}
  80. mov r3, ip, lsl #16
  81. orr r3, r3, r3, lsr #16
  82. mov r4, ip, lsr #16
  83. orr r4, r4, r4, lsl #16
  84. mov ip, lr, lsl #16
  85. orr ip, ip, ip, lsr #16
  86. mov lr, lr, lsr #16
  87. orr lr, lr, lr, lsl #16
  88. stmia r0!, {r3, r4, ip, lr}
  89. bne acornscsi_out16lp
  90. LOADREGS(fd, sp!, {r4 - r6, pc})
  91. acornscsi_out8: adds r2, r2, #8
  92. bmi acornscsi_out4
  93. ldmia r1!, {r4, r6}
  94. mov r3, r4, lsl #16
  95. orr r3, r3, r3, lsr #16
  96. mov r4, r4, lsr #16
  97. orr r4, r4, r4, lsl #16
  98. mov r5, r6, lsl #16
  99. orr r5, r5, r5, lsr #16
  100. mov r6, r6, lsr #16
  101. orr r6, r6, r6, lsl #16
  102. stmia r0!, {r3, r4, r5, r6}
  103. LOADREGS(eqfd, sp!, {r4 - r6, pc})
  104. sub r2, r2, #8
  105. acornscsi_out4: adds r2, r2, #4
  106. bmi acornscsi_out2
  107. ldr r4, [r1], #4
  108. mov r3, r4, lsl #16
  109. orr r3, r3, r3, lsr #16
  110. mov r4, r4, lsr #16
  111. orr r4, r4, r4, lsl #16
  112. stmia r0!, {r3, r4}
  113. LOADREGS(eqfd, sp!, {r4 - r6, pc})
  114. sub r2, r2, #4
  115. acornscsi_out2: adds r2, r2, #2
  116. ldr r3, [r1], #2
  117. strb r3, [r0], #1
  118. mov r3, r3, lsr #8
  119. strplb r3, [r0], #1
  120. LOADREGS(fd, sp!, {r4 - r6, pc})