ism.h 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221
  1. /* SPDX-License-Identifier: GPL-2.0 */
  2. #ifndef S390_ISM_H
  3. #define S390_ISM_H
  4. #include <linux/spinlock.h>
  5. #include <linux/types.h>
  6. #include <linux/pci.h>
  7. #include <net/smc.h>
  8. #define UTIL_STR_LEN 16
  9. /*
  10. * Do not use the first word of the DMB bits to ensure 8 byte aligned access.
  11. */
  12. #define ISM_DMB_WORD_OFFSET 1
  13. #define ISM_DMB_BIT_OFFSET (ISM_DMB_WORD_OFFSET * 32)
  14. #define ISM_NR_DMBS 1920
  15. #define ISM_REG_SBA 0x1
  16. #define ISM_REG_IEQ 0x2
  17. #define ISM_READ_GID 0x3
  18. #define ISM_ADD_VLAN_ID 0x4
  19. #define ISM_DEL_VLAN_ID 0x5
  20. #define ISM_SET_VLAN 0x6
  21. #define ISM_RESET_VLAN 0x7
  22. #define ISM_QUERY_INFO 0x8
  23. #define ISM_QUERY_RGID 0x9
  24. #define ISM_REG_DMB 0xA
  25. #define ISM_UNREG_DMB 0xB
  26. #define ISM_SIGNAL_IEQ 0xE
  27. #define ISM_UNREG_SBA 0x11
  28. #define ISM_UNREG_IEQ 0x12
  29. #define ISM_ERROR 0xFFFF
  30. struct ism_req_hdr {
  31. u32 cmd;
  32. u16 : 16;
  33. u16 len;
  34. };
  35. struct ism_resp_hdr {
  36. u32 cmd;
  37. u16 ret;
  38. u16 len;
  39. };
  40. union ism_reg_sba {
  41. struct {
  42. struct ism_req_hdr hdr;
  43. u64 sba;
  44. } request;
  45. struct {
  46. struct ism_resp_hdr hdr;
  47. } response;
  48. } __aligned(16);
  49. union ism_reg_ieq {
  50. struct {
  51. struct ism_req_hdr hdr;
  52. u64 ieq;
  53. u64 len;
  54. } request;
  55. struct {
  56. struct ism_resp_hdr hdr;
  57. } response;
  58. } __aligned(16);
  59. union ism_read_gid {
  60. struct {
  61. struct ism_req_hdr hdr;
  62. } request;
  63. struct {
  64. struct ism_resp_hdr hdr;
  65. u64 gid;
  66. } response;
  67. } __aligned(16);
  68. union ism_qi {
  69. struct {
  70. struct ism_req_hdr hdr;
  71. } request;
  72. struct {
  73. struct ism_resp_hdr hdr;
  74. u32 version;
  75. u32 max_len;
  76. u64 ism_state;
  77. u64 my_gid;
  78. u64 sba;
  79. u64 ieq;
  80. u32 ieq_len;
  81. u32 : 32;
  82. u32 dmbs_owned;
  83. u32 dmbs_used;
  84. u32 vlan_required;
  85. u32 vlan_nr_ids;
  86. u16 vlan_id[64];
  87. } response;
  88. } __aligned(64);
  89. union ism_query_rgid {
  90. struct {
  91. struct ism_req_hdr hdr;
  92. u64 rgid;
  93. u32 vlan_valid;
  94. u32 vlan_id;
  95. } request;
  96. struct {
  97. struct ism_resp_hdr hdr;
  98. } response;
  99. } __aligned(16);
  100. union ism_reg_dmb {
  101. struct {
  102. struct ism_req_hdr hdr;
  103. u64 dmb;
  104. u32 dmb_len;
  105. u32 sba_idx;
  106. u32 vlan_valid;
  107. u32 vlan_id;
  108. u64 rgid;
  109. } request;
  110. struct {
  111. struct ism_resp_hdr hdr;
  112. u64 dmb_tok;
  113. } response;
  114. } __aligned(32);
  115. union ism_sig_ieq {
  116. struct {
  117. struct ism_req_hdr hdr;
  118. u64 rgid;
  119. u32 trigger_irq;
  120. u32 event_code;
  121. u64 info;
  122. } request;
  123. struct {
  124. struct ism_resp_hdr hdr;
  125. } response;
  126. } __aligned(32);
  127. union ism_unreg_dmb {
  128. struct {
  129. struct ism_req_hdr hdr;
  130. u64 dmb_tok;
  131. } request;
  132. struct {
  133. struct ism_resp_hdr hdr;
  134. } response;
  135. } __aligned(16);
  136. union ism_cmd_simple {
  137. struct {
  138. struct ism_req_hdr hdr;
  139. } request;
  140. struct {
  141. struct ism_resp_hdr hdr;
  142. } response;
  143. } __aligned(8);
  144. union ism_set_vlan_id {
  145. struct {
  146. struct ism_req_hdr hdr;
  147. u64 vlan_id;
  148. } request;
  149. struct {
  150. struct ism_resp_hdr hdr;
  151. } response;
  152. } __aligned(16);
  153. struct ism_eq_header {
  154. u64 idx;
  155. u64 ieq_len;
  156. u64 entry_len;
  157. u64 : 64;
  158. };
  159. struct ism_eq {
  160. struct ism_eq_header header;
  161. struct smcd_event entry[15];
  162. };
  163. struct ism_sba {
  164. u32 s : 1; /* summary bit */
  165. u32 e : 1; /* event bit */
  166. u32 : 30;
  167. u32 dmb_bits[ISM_NR_DMBS / 32];
  168. u32 reserved[3];
  169. u16 dmbe_mask[ISM_NR_DMBS];
  170. };
  171. struct ism_dev {
  172. spinlock_t lock;
  173. struct pci_dev *pdev;
  174. struct smcd_dev *smcd;
  175. void __iomem *ctl;
  176. struct ism_sba *sba;
  177. dma_addr_t sba_dma_addr;
  178. DECLARE_BITMAP(sba_bitmap, ISM_NR_DMBS);
  179. struct ism_eq *ieq;
  180. dma_addr_t ieq_dma_addr;
  181. int ieq_idx;
  182. };
  183. #define ISM_CREATE_REQ(dmb, idx, sf, offset) \
  184. ((dmb) | (idx) << 24 | (sf) << 23 | (offset))
  185. static inline int __ism_move(struct ism_dev *ism, u64 dmb_req, void *data,
  186. unsigned int size)
  187. {
  188. struct zpci_dev *zdev = to_zpci(ism->pdev);
  189. u64 req = ZPCI_CREATE_REQ(zdev->fh, 0, size);
  190. return zpci_write_block(req, data, dmb_req);
  191. }
  192. #endif /* S390_ISM_H */