pci_sun4v_asm.S 6.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361
  1. /* pci_sun4v_asm: Hypervisor calls for PCI support.
  2. *
  3. * Copyright (C) 2006 David S. Miller <davem@davemloft.net>
  4. */
  5. #include <asm/hypervisor.h>
  6. /* %o0: devhandle
  7. * %o1: tsbid
  8. * %o2: num ttes
  9. * %o3: io_attributes
  10. * %o4: io_page_list phys address
  11. *
  12. * returns %o0: -status if status was non-zero, else
  13. * %o0: num pages mapped
  14. */
  15. .globl pci_sun4v_iommu_map
  16. pci_sun4v_iommu_map:
  17. mov %o5, %g1
  18. mov HV_FAST_PCI_IOMMU_MAP, %o5
  19. ta HV_FAST_TRAP
  20. brnz,pn %o0, 1f
  21. sub %g0, %o0, %o0
  22. mov %o1, %o0
  23. 1: retl
  24. nop
  25. /* %o0: devhandle
  26. * %o1: tsbid
  27. * %o2: num ttes
  28. *
  29. * returns %o0: num ttes demapped
  30. */
  31. .globl pci_sun4v_iommu_demap
  32. pci_sun4v_iommu_demap:
  33. mov HV_FAST_PCI_IOMMU_DEMAP, %o5
  34. ta HV_FAST_TRAP
  35. retl
  36. mov %o1, %o0
  37. /* %o0: devhandle
  38. * %o1: tsbid
  39. * %o2: &io_attributes
  40. * %o3: &real_address
  41. *
  42. * returns %o0: status
  43. */
  44. .globl pci_sun4v_iommu_getmap
  45. pci_sun4v_iommu_getmap:
  46. mov %o2, %o4
  47. mov HV_FAST_PCI_IOMMU_GETMAP, %o5
  48. ta HV_FAST_TRAP
  49. stx %o1, [%o4]
  50. stx %o2, [%o3]
  51. retl
  52. mov %o0, %o0
  53. /* %o0: devhandle
  54. * %o1: pci_device
  55. * %o2: pci_config_offset
  56. * %o3: size
  57. *
  58. * returns %o0: data
  59. *
  60. * If there is an error, the data will be returned
  61. * as all 1's.
  62. */
  63. .globl pci_sun4v_config_get
  64. pci_sun4v_config_get:
  65. mov HV_FAST_PCI_CONFIG_GET, %o5
  66. ta HV_FAST_TRAP
  67. brnz,a,pn %o1, 1f
  68. mov -1, %o2
  69. 1: retl
  70. mov %o2, %o0
  71. /* %o0: devhandle
  72. * %o1: pci_device
  73. * %o2: pci_config_offset
  74. * %o3: size
  75. * %o4: data
  76. *
  77. * returns %o0: status
  78. *
  79. * status will be zero if the operation completed
  80. * successfully, else -1 if not
  81. */
  82. .globl pci_sun4v_config_put
  83. pci_sun4v_config_put:
  84. mov HV_FAST_PCI_CONFIG_PUT, %o5
  85. ta HV_FAST_TRAP
  86. brnz,a,pn %o1, 1f
  87. mov -1, %o1
  88. 1: retl
  89. mov %o1, %o0
  90. /* %o0: devhandle
  91. * %o1: msiqid
  92. * %o2: msiq phys address
  93. * %o3: num entries
  94. *
  95. * returns %o0: status
  96. *
  97. * status will be zero if the operation completed
  98. * successfully, else -1 if not
  99. */
  100. .globl pci_sun4v_msiq_conf
  101. pci_sun4v_msiq_conf:
  102. mov HV_FAST_PCI_MSIQ_CONF, %o5
  103. ta HV_FAST_TRAP
  104. retl
  105. mov %o0, %o0
  106. /* %o0: devhandle
  107. * %o1: msiqid
  108. * %o2: &msiq_phys_addr
  109. * %o3: &msiq_num_entries
  110. *
  111. * returns %o0: status
  112. */
  113. .globl pci_sun4v_msiq_info
  114. pci_sun4v_msiq_info:
  115. mov %o2, %o4
  116. mov HV_FAST_PCI_MSIQ_INFO, %o5
  117. ta HV_FAST_TRAP
  118. stx %o1, [%o4]
  119. stx %o2, [%o3]
  120. retl
  121. mov %o0, %o0
  122. /* %o0: devhandle
  123. * %o1: msiqid
  124. * %o2: &valid
  125. *
  126. * returns %o0: status
  127. */
  128. .globl pci_sun4v_msiq_getvalid
  129. pci_sun4v_msiq_getvalid:
  130. mov HV_FAST_PCI_MSIQ_GETVALID, %o5
  131. ta HV_FAST_TRAP
  132. stx %o1, [%o2]
  133. retl
  134. mov %o0, %o0
  135. /* %o0: devhandle
  136. * %o1: msiqid
  137. * %o2: valid
  138. *
  139. * returns %o0: status
  140. */
  141. .globl pci_sun4v_msiq_setvalid
  142. pci_sun4v_msiq_setvalid:
  143. mov HV_FAST_PCI_MSIQ_SETVALID, %o5
  144. ta HV_FAST_TRAP
  145. retl
  146. mov %o0, %o0
  147. /* %o0: devhandle
  148. * %o1: msiqid
  149. * %o2: &state
  150. *
  151. * returns %o0: status
  152. */
  153. .globl pci_sun4v_msiq_getstate
  154. pci_sun4v_msiq_getstate:
  155. mov HV_FAST_PCI_MSIQ_GETSTATE, %o5
  156. ta HV_FAST_TRAP
  157. stx %o1, [%o2]
  158. retl
  159. mov %o0, %o0
  160. /* %o0: devhandle
  161. * %o1: msiqid
  162. * %o2: state
  163. *
  164. * returns %o0: status
  165. */
  166. .globl pci_sun4v_msiq_setstate
  167. pci_sun4v_msiq_setstate:
  168. mov HV_FAST_PCI_MSIQ_SETSTATE, %o5
  169. ta HV_FAST_TRAP
  170. retl
  171. mov %o0, %o0
  172. /* %o0: devhandle
  173. * %o1: msiqid
  174. * %o2: &head
  175. *
  176. * returns %o0: status
  177. */
  178. .globl pci_sun4v_msiq_gethead
  179. pci_sun4v_msiq_gethead:
  180. mov HV_FAST_PCI_MSIQ_GETHEAD, %o5
  181. ta HV_FAST_TRAP
  182. stx %o1, [%o2]
  183. retl
  184. mov %o0, %o0
  185. /* %o0: devhandle
  186. * %o1: msiqid
  187. * %o2: head
  188. *
  189. * returns %o0: status
  190. */
  191. .globl pci_sun4v_msiq_sethead
  192. pci_sun4v_msiq_sethead:
  193. mov HV_FAST_PCI_MSIQ_SETHEAD, %o5
  194. ta HV_FAST_TRAP
  195. retl
  196. mov %o0, %o0
  197. /* %o0: devhandle
  198. * %o1: msiqid
  199. * %o2: &tail
  200. *
  201. * returns %o0: status
  202. */
  203. .globl pci_sun4v_msiq_gettail
  204. pci_sun4v_msiq_gettail:
  205. mov HV_FAST_PCI_MSIQ_GETTAIL, %o5
  206. ta HV_FAST_TRAP
  207. stx %o1, [%o2]
  208. retl
  209. mov %o0, %o0
  210. /* %o0: devhandle
  211. * %o1: msinum
  212. * %o2: &valid
  213. *
  214. * returns %o0: status
  215. */
  216. .globl pci_sun4v_msi_getvalid
  217. pci_sun4v_msi_getvalid:
  218. mov HV_FAST_PCI_MSI_GETVALID, %o5
  219. ta HV_FAST_TRAP
  220. stx %o1, [%o2]
  221. retl
  222. mov %o0, %o0
  223. /* %o0: devhandle
  224. * %o1: msinum
  225. * %o2: valid
  226. *
  227. * returns %o0: status
  228. */
  229. .globl pci_sun4v_msi_setvalid
  230. pci_sun4v_msi_setvalid:
  231. mov HV_FAST_PCI_MSI_SETVALID, %o5
  232. ta HV_FAST_TRAP
  233. retl
  234. mov %o0, %o0
  235. /* %o0: devhandle
  236. * %o1: msinum
  237. * %o2: &msiq
  238. *
  239. * returns %o0: status
  240. */
  241. .globl pci_sun4v_msi_getmsiq
  242. pci_sun4v_msi_getmsiq:
  243. mov HV_FAST_PCI_MSI_GETMSIQ, %o5
  244. ta HV_FAST_TRAP
  245. stx %o1, [%o2]
  246. retl
  247. mov %o0, %o0
  248. /* %o0: devhandle
  249. * %o1: msinum
  250. * %o2: msitype
  251. * %o3: msiq
  252. *
  253. * returns %o0: status
  254. */
  255. .globl pci_sun4v_msi_setmsiq
  256. pci_sun4v_msi_setmsiq:
  257. mov HV_FAST_PCI_MSI_SETMSIQ, %o5
  258. ta HV_FAST_TRAP
  259. retl
  260. mov %o0, %o0
  261. /* %o0: devhandle
  262. * %o1: msinum
  263. * %o2: &state
  264. *
  265. * returns %o0: status
  266. */
  267. .globl pci_sun4v_msi_getstate
  268. pci_sun4v_msi_getstate:
  269. mov HV_FAST_PCI_MSI_GETSTATE, %o5
  270. ta HV_FAST_TRAP
  271. stx %o1, [%o2]
  272. retl
  273. mov %o0, %o0
  274. /* %o0: devhandle
  275. * %o1: msinum
  276. * %o2: state
  277. *
  278. * returns %o0: status
  279. */
  280. .globl pci_sun4v_msi_setstate
  281. pci_sun4v_msi_setstate:
  282. mov HV_FAST_PCI_MSI_SETSTATE, %o5
  283. ta HV_FAST_TRAP
  284. retl
  285. mov %o0, %o0
  286. /* %o0: devhandle
  287. * %o1: msinum
  288. * %o2: &msiq
  289. *
  290. * returns %o0: status
  291. */
  292. .globl pci_sun4v_msg_getmsiq
  293. pci_sun4v_msg_getmsiq:
  294. mov HV_FAST_PCI_MSG_GETMSIQ, %o5
  295. ta HV_FAST_TRAP
  296. stx %o1, [%o2]
  297. retl
  298. mov %o0, %o0
  299. /* %o0: devhandle
  300. * %o1: msinum
  301. * %o2: msiq
  302. *
  303. * returns %o0: status
  304. */
  305. .globl pci_sun4v_msg_setmsiq
  306. pci_sun4v_msg_setmsiq:
  307. mov HV_FAST_PCI_MSG_SETMSIQ, %o5
  308. ta HV_FAST_TRAP
  309. retl
  310. mov %o0, %o0
  311. /* %o0: devhandle
  312. * %o1: msinum
  313. * %o2: &valid
  314. *
  315. * returns %o0: status
  316. */
  317. .globl pci_sun4v_msg_getvalid
  318. pci_sun4v_msg_getvalid:
  319. mov HV_FAST_PCI_MSG_GETVALID, %o5
  320. ta HV_FAST_TRAP
  321. stx %o1, [%o2]
  322. retl
  323. mov %o0, %o0
  324. /* %o0: devhandle
  325. * %o1: msinum
  326. * %o2: valid
  327. *
  328. * returns %o0: status
  329. */
  330. .globl pci_sun4v_msg_setvalid
  331. pci_sun4v_msg_setvalid:
  332. mov HV_FAST_PCI_MSG_SETVALID, %o5
  333. ta HV_FAST_TRAP
  334. retl
  335. mov %o0, %o0