acornscsi-io.S
上传用户:lgb322
上传日期:2013-02-24
资源大小:30529k
文件大小:3k
源码类别:

嵌入式Linux

开发平台:

Unix_Linux

  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. #if (IO_BASE == (PCIO_BASE & 0xff000000))
  12. #define ADDR(off,reg)
  13. tst off, $0x80000000 ;
  14. mov reg, $IO_BASE ;
  15. orreq reg, reg, $(PCIO_BASE & 0x00ff0000)
  16. #else
  17. #define ADDR(off,reg)
  18. tst off, $0x80000000 ;
  19. movne reg, $IO_BASE ;
  20. moveq reg, $(PCIO_BASE & 0xff000000) ;
  21. orreq reg, reg, $(PCIO_BASE & 0x00ff0000)
  22. #endif
  23. @ Purpose: transfer a block of data from the acorn scsi card to memory
  24. @ Proto  : void acornscsi_in(unsigned int addr_start, char *buffer, int length)
  25. @ Returns: nothing
  26. .align
  27. ENTRY(__acornscsi_in)
  28. stmfd sp!, {r4 - r7, lr}
  29. bic r0, r0, #3
  30. mov lr, #0xff
  31. orr lr, lr, #0xff00
  32. acornscsi_in16lp:
  33. subs r2, r2, #16
  34. bmi acornscsi_in8
  35. ldmia r0!, {r3, r4, r5, r6}
  36. and r3, r3, lr
  37. orr r3, r3, r4, lsl #16
  38. and  r4, r5, lr
  39. orr r4, r4, r6, lsl #16
  40. ldmia r0!, {r5, r6, r7, ip}
  41. and r5, r5, lr
  42. orr r5, r5, r6, lsl #16
  43. and r6, r7, lr
  44. orr r6, r6, ip, lsl #16
  45. stmia r1!, {r3 - r6}
  46. bne acornscsi_in16lp
  47. LOADREGS(fd, sp!, {r4 - r7, pc})
  48. acornscsi_in8: adds r2, r2, #8
  49. bmi acornscsi_in4
  50. ldmia r0!, {r3, r4, r5, r6}
  51. and r3, r3, lr
  52. orr r3, r3, r4, lsl #16
  53. and r4, r5, lr
  54. orr r4, r4, r6, lsl #16
  55. stmia r1!, {r3 - r4}
  56. LOADREGS(eqfd, sp!, {r4 - r7, pc})
  57. sub r2, r2, #8
  58. acornscsi_in4: adds r2, r2, #4
  59. bmi acornscsi_in2
  60. ldmia r0!, {r3, r4}
  61. and r3, r3, lr
  62. orr r3, r3, r4, lsl #16
  63. str r3, [r1], #4
  64. LOADREGS(eqfd, sp!, {r4 - r7, pc})
  65. sub r2, r2, #4
  66. acornscsi_in2: adds r2, r2, #2
  67. ldr r3, [r0], #4
  68. and r3, r3, lr
  69. strb r3, [r1], #1
  70. mov r3, r3, lsr #8
  71. strplb r3, [r1], #1
  72. LOADREGS(fd, sp!, {r4 - r7, pc})
  73. @ Purpose: transfer a block of data from memory to the acorn scsi card
  74. @ Proto  : void acornscsi_in(unsigned int addr_start, char *buffer, int length)
  75. @ Returns: nothing
  76. ENTRY(__acornscsi_out)
  77. stmfd sp!, {r4 - r6, lr}
  78. bic r0, r0, #3
  79. acornscsi_out16lp:
  80. subs r2, r2, #16
  81. bmi acornscsi_out8
  82. ldmia r1!, {r4, r6, ip, lr}
  83. mov r3, r4, lsl #16
  84. orr r3, r3, r3, lsr #16
  85. mov r4, r4, lsr #16
  86. orr r4, r4, r4, lsl #16
  87. mov r5, r6, lsl #16
  88. orr r5, r5, r5, lsr #16
  89. mov r6, r6, lsr #16
  90. orr r6, r6, r6, lsl #16
  91. stmia r0!, {r3, r4, r5, r6}
  92. mov r3, ip, lsl #16
  93. orr r3, r3, r3, lsr #16
  94. mov r4, ip, lsr #16
  95. orr r4, r4, r4, lsl #16
  96. mov ip, lr, lsl #16
  97. orr ip, ip, ip, lsr #16
  98. mov lr, lr, lsr #16
  99. orr lr, lr, lr, lsl #16
  100. stmia r0!, {r3, r4, ip, lr}
  101. bne acornscsi_out16lp
  102. LOADREGS(fd, sp!, {r4 - r6, pc})
  103. acornscsi_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. sub r2, r2, #8
  117. acornscsi_out4: adds r2, r2, #4
  118. bmi acornscsi_out2
  119. ldr r4, [r1], #4
  120. mov r3, r4, lsl #16
  121. orr r3, r3, r3, lsr #16
  122. mov r4, r4, lsr #16
  123. orr r4, r4, r4, lsl #16
  124. stmia r0!, {r3, r4}
  125. LOADREGS(eqfd, sp!, {r4 - r6, pc})
  126. sub r2, r2, #4
  127. acornscsi_out2: adds r2, r2, #2
  128. ldr r3, [r1], #2
  129. strb r3, [r0], #1
  130. mov r3, r3, lsr #8
  131. strplb r3, [r0], #1
  132. LOADREGS(fd, sp!, {r4 - r6, pc})