pci_sun4v_asm.S 7.4 KB

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