ibmvmc.h 5.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209
  1. /* SPDX-License-Identifier: GPL-2.0+ */
  2. /*
  3. * linux/drivers/misc/ibmvmc.h
  4. *
  5. * IBM Power Systems Virtual Management Channel Support.
  6. *
  7. * Copyright (c) 2004, 2018 IBM Corp.
  8. * Dave Engebretsen engebret@us.ibm.com
  9. * Steven Royer seroyer@linux.vnet.ibm.com
  10. * Adam Reznechek adreznec@linux.vnet.ibm.com
  11. * Bryant G. Ly <bryantly@linux.vnet.ibm.com>
  12. */
  13. #ifndef IBMVMC_H
  14. #define IBMVMC_H
  15. #include <linux/types.h>
  16. #include <linux/cdev.h>
  17. #include <asm/vio.h>
  18. #define IBMVMC_PROTOCOL_VERSION 0x0101
  19. #define MIN_BUF_POOL_SIZE 16
  20. #define MIN_HMCS 1
  21. #define MIN_MTU 4096
  22. #define MAX_BUF_POOL_SIZE 64
  23. #define MAX_HMCS 2
  24. #define MAX_MTU (4 * 4096)
  25. #define DEFAULT_BUF_POOL_SIZE 32
  26. #define DEFAULT_HMCS 1
  27. #define DEFAULT_MTU 4096
  28. #define HMC_ID_LEN 32
  29. #define VMC_INVALID_BUFFER_ID 0xFFFF
  30. /* ioctl numbers */
  31. #define VMC_BASE 0xCC
  32. #define VMC_IOCTL_SETHMCID _IOW(VMC_BASE, 0x00, unsigned char *)
  33. #define VMC_IOCTL_QUERY _IOR(VMC_BASE, 0x01, struct ibmvmc_query_struct)
  34. #define VMC_IOCTL_REQUESTVMC _IOR(VMC_BASE, 0x02, u32)
  35. #define VMC_MSG_CAP 0x01
  36. #define VMC_MSG_CAP_RESP 0x81
  37. #define VMC_MSG_OPEN 0x02
  38. #define VMC_MSG_OPEN_RESP 0x82
  39. #define VMC_MSG_CLOSE 0x03
  40. #define VMC_MSG_CLOSE_RESP 0x83
  41. #define VMC_MSG_ADD_BUF 0x04
  42. #define VMC_MSG_ADD_BUF_RESP 0x84
  43. #define VMC_MSG_REM_BUF 0x05
  44. #define VMC_MSG_REM_BUF_RESP 0x85
  45. #define VMC_MSG_SIGNAL 0x06
  46. #define VMC_MSG_SUCCESS 0
  47. #define VMC_MSG_INVALID_HMC_INDEX 1
  48. #define VMC_MSG_INVALID_BUFFER_ID 2
  49. #define VMC_MSG_CLOSED_HMC 3
  50. #define VMC_MSG_INTERFACE_FAILURE 4
  51. #define VMC_MSG_NO_BUFFER 5
  52. #define VMC_BUF_OWNER_ALPHA 0
  53. #define VMC_BUF_OWNER_HV 1
  54. enum ibmvmc_states {
  55. ibmvmc_state_sched_reset = -1,
  56. ibmvmc_state_initial = 0,
  57. ibmvmc_state_crqinit = 1,
  58. ibmvmc_state_capabilities = 2,
  59. ibmvmc_state_ready = 3,
  60. ibmvmc_state_failed = 4,
  61. };
  62. enum ibmhmc_states {
  63. /* HMC connection not established */
  64. ibmhmc_state_free = 0,
  65. /* HMC connection established (open called) */
  66. ibmhmc_state_initial = 1,
  67. /* open msg sent to HV, due to ioctl(1) call */
  68. ibmhmc_state_opening = 2,
  69. /* HMC connection ready, open resp msg from HV */
  70. ibmhmc_state_ready = 3,
  71. /* HMC connection failure */
  72. ibmhmc_state_failed = 4,
  73. };
  74. struct ibmvmc_buffer {
  75. u8 valid; /* 1 when DMA storage allocated to buffer */
  76. u8 free; /* 1 when buffer available for the Alpha Partition */
  77. u8 owner;
  78. u16 id;
  79. u32 size;
  80. u32 msg_len;
  81. dma_addr_t dma_addr_local;
  82. dma_addr_t dma_addr_remote;
  83. void *real_addr_local;
  84. };
  85. struct ibmvmc_admin_crq_msg {
  86. u8 valid; /* RPA Defined */
  87. u8 type; /* ibmvmc msg type */
  88. u8 status; /* Response msg status. Zero is success and on failure,
  89. * either 1 - General Failure, or 2 - Invalid Version is
  90. * returned.
  91. */
  92. u8 rsvd[2];
  93. u8 max_hmc; /* Max # of independent HMC connections supported */
  94. __be16 pool_size; /* Maximum number of buffers supported per HMC
  95. * connection
  96. */
  97. __be32 max_mtu; /* Maximum message size supported (bytes) */
  98. __be16 crq_size; /* # of entries available in the CRQ for the
  99. * source partition. The target partition must
  100. * limit the number of outstanding messages to
  101. * one half or less.
  102. */
  103. __be16 version; /* Indicates the code level of the management partition
  104. * or the hypervisor with the high-order byte
  105. * indicating a major version and the low-order byte
  106. * indicating a minor version.
  107. */
  108. };
  109. struct ibmvmc_crq_msg {
  110. u8 valid; /* RPA Defined */
  111. u8 type; /* ibmvmc msg type */
  112. u8 status; /* Response msg status */
  113. union {
  114. u8 rsvd; /* Reserved */
  115. u8 owner;
  116. } var1;
  117. u8 hmc_session; /* Session Identifier for the current VMC connection */
  118. u8 hmc_index; /* A unique HMC Idx would be used if multiple management
  119. * applications running concurrently were desired
  120. */
  121. union {
  122. __be16 rsvd;
  123. __be16 buffer_id;
  124. } var2;
  125. __be32 rsvd;
  126. union {
  127. __be32 rsvd;
  128. __be32 lioba;
  129. __be32 msg_len;
  130. } var3;
  131. };
  132. /* an RPA command/response transport queue */
  133. struct crq_queue {
  134. struct ibmvmc_crq_msg *msgs;
  135. int size, cur;
  136. dma_addr_t msg_token;
  137. spinlock_t lock;
  138. };
  139. /* VMC server adapter settings */
  140. struct crq_server_adapter {
  141. struct device *dev;
  142. struct crq_queue queue;
  143. u32 liobn;
  144. u32 riobn;
  145. struct tasklet_struct work_task;
  146. wait_queue_head_t reset_wait_queue;
  147. struct task_struct *reset_task;
  148. };
  149. /* Driver wide settings */
  150. struct ibmvmc_struct {
  151. u32 state;
  152. u32 max_mtu;
  153. u32 max_buffer_pool_size;
  154. u32 max_hmc_index;
  155. struct crq_server_adapter *adapter;
  156. struct cdev cdev;
  157. u32 vmc_drc_index;
  158. };
  159. struct ibmvmc_file_session;
  160. /* Connection specific settings */
  161. struct ibmvmc_hmc {
  162. u8 session;
  163. u8 index;
  164. u32 state;
  165. struct crq_server_adapter *adapter;
  166. spinlock_t lock;
  167. unsigned char hmc_id[HMC_ID_LEN];
  168. struct ibmvmc_buffer buffer[MAX_BUF_POOL_SIZE];
  169. unsigned short queue_outbound_msgs[MAX_BUF_POOL_SIZE];
  170. int queue_head, queue_tail;
  171. struct ibmvmc_file_session *file_session;
  172. };
  173. struct ibmvmc_file_session {
  174. struct file *file;
  175. struct ibmvmc_hmc *hmc;
  176. bool valid;
  177. };
  178. struct ibmvmc_query_struct {
  179. int have_vmc;
  180. int state;
  181. int vmc_drc_index;
  182. };
  183. #endif /* __IBMVMC_H */