HvCallEvent.h 8.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292
  1. /*
  2. * HvCallEvent.h
  3. * Copyright (C) 2001 Mike Corrigan IBM Corporation
  4. *
  5. * This program is free software; you can redistribute it and/or modify
  6. * it under the terms of the GNU General Public License as published by
  7. * the Free Software Foundation; either version 2 of the License, or
  8. * (at your option) any later version.
  9. *
  10. * This program is distributed in the hope that it will be useful,
  11. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  12. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  13. * GNU General Public License for more details.
  14. *
  15. * You should have received a copy of the GNU General Public License
  16. * along with this program; if not, write to the Free Software
  17. * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
  18. */
  19. /*
  20. * This file contains the "hypervisor call" interface which is used to
  21. * drive the hypervisor from the OS.
  22. */
  23. #ifndef _HVCALLEVENT_H
  24. #define _HVCALLEVENT_H
  25. #include <asm/iSeries/HvCallSc.h>
  26. #include <asm/iSeries/HvTypes.h>
  27. #include <asm/abs_addr.h>
  28. struct HvLpEvent;
  29. typedef u8 HvLpEvent_Type;
  30. typedef u8 HvLpEvent_AckInd;
  31. typedef u8 HvLpEvent_AckType;
  32. struct HvCallEvent_PackedParms {
  33. u8 xAckType:1;
  34. u8 xAckInd:1;
  35. u8 xRsvd:1;
  36. u8 xTargetLp:5;
  37. u8 xType;
  38. u16 xSubtype;
  39. HvLpInstanceId xSourceInstId;
  40. HvLpInstanceId xTargetInstId;
  41. };
  42. typedef u8 HvLpDma_Direction;
  43. typedef u8 HvLpDma_AddressType;
  44. struct HvCallEvent_PackedDmaParms {
  45. u8 xDirection:1;
  46. u8 xLocalAddrType:1;
  47. u8 xRemoteAddrType:1;
  48. u8 xRsvd1:5;
  49. HvLpIndex xRemoteLp;
  50. u8 xType;
  51. u8 xRsvd2;
  52. HvLpInstanceId xLocalInstId;
  53. HvLpInstanceId xRemoteInstId;
  54. };
  55. typedef u64 HvLpEvent_Rc;
  56. typedef u64 HvLpDma_Rc;
  57. #define HvCallEventAckLpEvent HvCallEvent + 0
  58. #define HvCallEventCancelLpEvent HvCallEvent + 1
  59. #define HvCallEventCloseLpEventPath HvCallEvent + 2
  60. #define HvCallEventDmaBufList HvCallEvent + 3
  61. #define HvCallEventDmaSingle HvCallEvent + 4
  62. #define HvCallEventDmaToSp HvCallEvent + 5
  63. #define HvCallEventGetOverflowLpEvents HvCallEvent + 6
  64. #define HvCallEventGetSourceLpInstanceId HvCallEvent + 7
  65. #define HvCallEventGetTargetLpInstanceId HvCallEvent + 8
  66. #define HvCallEventOpenLpEventPath HvCallEvent + 9
  67. #define HvCallEventSetLpEventStack HvCallEvent + 10
  68. #define HvCallEventSignalLpEvent HvCallEvent + 11
  69. #define HvCallEventSignalLpEventParms HvCallEvent + 12
  70. #define HvCallEventSetInterLpQueueIndex HvCallEvent + 13
  71. #define HvCallEventSetLpEventQueueInterruptProc HvCallEvent + 14
  72. #define HvCallEventRouter15 HvCallEvent + 15
  73. static inline void HvCallEvent_getOverflowLpEvents(u8 queueIndex)
  74. {
  75. HvCall1(HvCallEventGetOverflowLpEvents, queueIndex);
  76. // getPaca()->adjustHmtForNoOfSpinLocksHeld();
  77. }
  78. static inline void HvCallEvent_setInterLpQueueIndex(u8 queueIndex)
  79. {
  80. HvCall1(HvCallEventSetInterLpQueueIndex, queueIndex);
  81. // getPaca()->adjustHmtForNoOfSpinLocksHeld();
  82. }
  83. static inline void HvCallEvent_setLpEventStack(u8 queueIndex,
  84. char *eventStackAddr, u32 eventStackSize)
  85. {
  86. u64 abs_addr;
  87. abs_addr = virt_to_abs(eventStackAddr);
  88. HvCall3(HvCallEventSetLpEventStack, queueIndex, abs_addr,
  89. eventStackSize);
  90. // getPaca()->adjustHmtForNoOfSpinLocksHeld();
  91. }
  92. static inline void HvCallEvent_setLpEventQueueInterruptProc(u8 queueIndex,
  93. u16 lpLogicalProcIndex)
  94. {
  95. HvCall2(HvCallEventSetLpEventQueueInterruptProc, queueIndex,
  96. lpLogicalProcIndex);
  97. // getPaca()->adjustHmtForNoOfSpinLocksHeld();
  98. }
  99. static inline HvLpEvent_Rc HvCallEvent_signalLpEvent(struct HvLpEvent *event)
  100. {
  101. u64 abs_addr;
  102. HvLpEvent_Rc retVal;
  103. #ifdef DEBUG_SENDEVENT
  104. printk("HvCallEvent_signalLpEvent: *event = %016lx\n ",
  105. (unsigned long)event);
  106. #endif
  107. abs_addr = virt_to_abs(event);
  108. retVal = (HvLpEvent_Rc)HvCall1(HvCallEventSignalLpEvent, abs_addr);
  109. // getPaca()->adjustHmtForNoOfSpinLocksHeld();
  110. return retVal;
  111. }
  112. static inline HvLpEvent_Rc HvCallEvent_signalLpEventFast(HvLpIndex targetLp,
  113. HvLpEvent_Type type, u16 subtype, HvLpEvent_AckInd ackInd,
  114. HvLpEvent_AckType ackType, HvLpInstanceId sourceInstanceId,
  115. HvLpInstanceId targetInstanceId, u64 correlationToken,
  116. u64 eventData1, u64 eventData2, u64 eventData3,
  117. u64 eventData4, u64 eventData5)
  118. {
  119. HvLpEvent_Rc retVal;
  120. /* Pack the misc bits into a single Dword to pass to PLIC */
  121. union {
  122. struct HvCallEvent_PackedParms parms;
  123. u64 dword;
  124. } packed;
  125. packed.parms.xAckType = ackType;
  126. packed.parms.xAckInd = ackInd;
  127. packed.parms.xRsvd = 0;
  128. packed.parms.xTargetLp = targetLp;
  129. packed.parms.xType = type;
  130. packed.parms.xSubtype = subtype;
  131. packed.parms.xSourceInstId = sourceInstanceId;
  132. packed.parms.xTargetInstId = targetInstanceId;
  133. retVal = (HvLpEvent_Rc)HvCall7(HvCallEventSignalLpEventParms,
  134. packed.dword, correlationToken, eventData1,eventData2,
  135. eventData3,eventData4, eventData5);
  136. // getPaca()->adjustHmtForNoOfSpinLocksHeld();
  137. return retVal;
  138. }
  139. static inline HvLpEvent_Rc HvCallEvent_ackLpEvent(struct HvLpEvent *event)
  140. {
  141. u64 abs_addr;
  142. HvLpEvent_Rc retVal;
  143. abs_addr = virt_to_abs(event);
  144. retVal = (HvLpEvent_Rc)HvCall1(HvCallEventAckLpEvent, abs_addr);
  145. // getPaca()->adjustHmtForNoOfSpinLocksHeld();
  146. return retVal;
  147. }
  148. static inline HvLpEvent_Rc HvCallEvent_cancelLpEvent(struct HvLpEvent *event)
  149. {
  150. u64 abs_addr;
  151. HvLpEvent_Rc retVal;
  152. abs_addr = virt_to_abs(event);
  153. retVal = (HvLpEvent_Rc)HvCall1(HvCallEventCancelLpEvent, abs_addr);
  154. // getPaca()->adjustHmtForNoOfSpinLocksHeld();
  155. return retVal;
  156. }
  157. static inline HvLpInstanceId HvCallEvent_getSourceLpInstanceId(
  158. HvLpIndex targetLp, HvLpEvent_Type type)
  159. {
  160. HvLpInstanceId retVal;
  161. retVal = HvCall2(HvCallEventGetSourceLpInstanceId, targetLp, type);
  162. // getPaca()->adjustHmtForNoOfSpinLocksHeld();
  163. return retVal;
  164. }
  165. static inline HvLpInstanceId HvCallEvent_getTargetLpInstanceId(
  166. HvLpIndex targetLp, HvLpEvent_Type type)
  167. {
  168. HvLpInstanceId retVal;
  169. retVal = HvCall2(HvCallEventGetTargetLpInstanceId, targetLp, type);
  170. // getPaca()->adjustHmtForNoOfSpinLocksHeld();
  171. return retVal;
  172. }
  173. static inline void HvCallEvent_openLpEventPath(HvLpIndex targetLp,
  174. HvLpEvent_Type type)
  175. {
  176. HvCall2(HvCallEventOpenLpEventPath, targetLp, type);
  177. // getPaca()->adjustHmtForNoOfSpinLocksHeld();
  178. }
  179. static inline void HvCallEvent_closeLpEventPath(HvLpIndex targetLp,
  180. HvLpEvent_Type type)
  181. {
  182. HvCall2(HvCallEventCloseLpEventPath, targetLp, type);
  183. // getPaca()->adjustHmtForNoOfSpinLocksHeld();
  184. }
  185. static inline HvLpDma_Rc HvCallEvent_dmaBufList(HvLpEvent_Type type,
  186. HvLpIndex remoteLp, HvLpDma_Direction direction,
  187. HvLpInstanceId localInstanceId,
  188. HvLpInstanceId remoteInstanceId,
  189. HvLpDma_AddressType localAddressType,
  190. HvLpDma_AddressType remoteAddressType,
  191. /* Do these need to be converted to absolute addresses? */
  192. u64 localBufList, u64 remoteBufList, u32 transferLength)
  193. {
  194. HvLpDma_Rc retVal;
  195. /* Pack the misc bits into a single Dword to pass to PLIC */
  196. union {
  197. struct HvCallEvent_PackedDmaParms parms;
  198. u64 dword;
  199. } packed;
  200. packed.parms.xDirection = direction;
  201. packed.parms.xLocalAddrType = localAddressType;
  202. packed.parms.xRemoteAddrType = remoteAddressType;
  203. packed.parms.xRsvd1 = 0;
  204. packed.parms.xRemoteLp = remoteLp;
  205. packed.parms.xType = type;
  206. packed.parms.xRsvd2 = 0;
  207. packed.parms.xLocalInstId = localInstanceId;
  208. packed.parms.xRemoteInstId = remoteInstanceId;
  209. retVal = (HvLpDma_Rc)HvCall4(HvCallEventDmaBufList,
  210. packed.dword, localBufList, remoteBufList,
  211. transferLength);
  212. // getPaca()->adjustHmtForNoOfSpinLocksHeld();
  213. return retVal;
  214. }
  215. static inline HvLpDma_Rc HvCallEvent_dmaSingle(HvLpEvent_Type type,
  216. HvLpIndex remoteLp, HvLpDma_Direction direction,
  217. HvLpInstanceId localInstanceId,
  218. HvLpInstanceId remoteInstanceId,
  219. HvLpDma_AddressType localAddressType,
  220. HvLpDma_AddressType remoteAddressType,
  221. u64 localAddrOrTce, u64 remoteAddrOrTce, u32 transferLength)
  222. {
  223. HvLpDma_Rc retVal;
  224. /* Pack the misc bits into a single Dword to pass to PLIC */
  225. union {
  226. struct HvCallEvent_PackedDmaParms parms;
  227. u64 dword;
  228. } packed;
  229. packed.parms.xDirection = direction;
  230. packed.parms.xLocalAddrType = localAddressType;
  231. packed.parms.xRemoteAddrType = remoteAddressType;
  232. packed.parms.xRsvd1 = 0;
  233. packed.parms.xRemoteLp = remoteLp;
  234. packed.parms.xType = type;
  235. packed.parms.xRsvd2 = 0;
  236. packed.parms.xLocalInstId = localInstanceId;
  237. packed.parms.xRemoteInstId = remoteInstanceId;
  238. retVal = (HvLpDma_Rc)HvCall4(HvCallEventDmaSingle,
  239. packed.dword, localAddrOrTce, remoteAddrOrTce,
  240. transferLength);
  241. // getPaca()->adjustHmtForNoOfSpinLocksHeld();
  242. return retVal;
  243. }
  244. static inline HvLpDma_Rc HvCallEvent_dmaToSp(void *local, u32 remote,
  245. u32 length, HvLpDma_Direction dir)
  246. {
  247. u64 abs_addr;
  248. HvLpDma_Rc retVal;
  249. abs_addr = virt_to_abs(local);
  250. retVal = (HvLpDma_Rc)HvCall4(HvCallEventDmaToSp, abs_addr, remote,
  251. length, dir);
  252. // getPaca()->adjustHmtForNoOfSpinLocksHeld();
  253. return retVal;
  254. }
  255. #endif /* _HVCALLEVENT_H */