0001
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012
0013 #ifndef IBMVMC_H
0014 #define IBMVMC_H
0015
0016 #include <linux/types.h>
0017 #include <linux/cdev.h>
0018
0019 #include <asm/vio.h>
0020
0021 #define IBMVMC_PROTOCOL_VERSION 0x0101
0022
0023 #define MIN_BUF_POOL_SIZE 16
0024 #define MIN_HMCS 1
0025 #define MIN_MTU 4096
0026 #define MAX_BUF_POOL_SIZE 64
0027 #define MAX_HMCS 2
0028 #define MAX_MTU (4 * 4096)
0029 #define DEFAULT_BUF_POOL_SIZE 32
0030 #define DEFAULT_HMCS 1
0031 #define DEFAULT_MTU 4096
0032 #define HMC_ID_LEN 32
0033
0034 #define VMC_INVALID_BUFFER_ID 0xFFFF
0035
0036
0037 #define VMC_BASE 0xCC
0038 #define VMC_IOCTL_SETHMCID _IOW(VMC_BASE, 0x00, unsigned char *)
0039 #define VMC_IOCTL_QUERY _IOR(VMC_BASE, 0x01, struct ibmvmc_query_struct)
0040 #define VMC_IOCTL_REQUESTVMC _IOR(VMC_BASE, 0x02, u32)
0041
0042 #define VMC_MSG_CAP 0x01
0043 #define VMC_MSG_CAP_RESP 0x81
0044 #define VMC_MSG_OPEN 0x02
0045 #define VMC_MSG_OPEN_RESP 0x82
0046 #define VMC_MSG_CLOSE 0x03
0047 #define VMC_MSG_CLOSE_RESP 0x83
0048 #define VMC_MSG_ADD_BUF 0x04
0049 #define VMC_MSG_ADD_BUF_RESP 0x84
0050 #define VMC_MSG_REM_BUF 0x05
0051 #define VMC_MSG_REM_BUF_RESP 0x85
0052 #define VMC_MSG_SIGNAL 0x06
0053
0054 #define VMC_MSG_SUCCESS 0
0055 #define VMC_MSG_INVALID_HMC_INDEX 1
0056 #define VMC_MSG_INVALID_BUFFER_ID 2
0057 #define VMC_MSG_CLOSED_HMC 3
0058 #define VMC_MSG_INTERFACE_FAILURE 4
0059 #define VMC_MSG_NO_BUFFER 5
0060
0061 #define VMC_BUF_OWNER_ALPHA 0
0062 #define VMC_BUF_OWNER_HV 1
0063
0064 enum ibmvmc_states {
0065 ibmvmc_state_sched_reset = -1,
0066 ibmvmc_state_initial = 0,
0067 ibmvmc_state_crqinit = 1,
0068 ibmvmc_state_capabilities = 2,
0069 ibmvmc_state_ready = 3,
0070 ibmvmc_state_failed = 4,
0071 };
0072
0073 enum ibmhmc_states {
0074
0075 ibmhmc_state_free = 0,
0076
0077
0078 ibmhmc_state_initial = 1,
0079
0080
0081 ibmhmc_state_opening = 2,
0082
0083
0084 ibmhmc_state_ready = 3,
0085
0086
0087 ibmhmc_state_failed = 4,
0088 };
0089
0090 struct ibmvmc_buffer {
0091 u8 valid;
0092 u8 free;
0093 u8 owner;
0094 u16 id;
0095 u32 size;
0096 u32 msg_len;
0097 dma_addr_t dma_addr_local;
0098 dma_addr_t dma_addr_remote;
0099 void *real_addr_local;
0100 };
0101
0102 struct ibmvmc_admin_crq_msg {
0103 u8 valid;
0104 u8 type;
0105 u8 status;
0106
0107
0108
0109 u8 rsvd[2];
0110 u8 max_hmc;
0111 __be16 pool_size;
0112
0113
0114 __be32 max_mtu;
0115 __be16 crq_size;
0116
0117
0118
0119
0120 __be16 version;
0121
0122
0123
0124
0125 };
0126
0127 struct ibmvmc_crq_msg {
0128 u8 valid;
0129 u8 type;
0130 u8 status;
0131 union {
0132 u8 rsvd;
0133 u8 owner;
0134 } var1;
0135 u8 hmc_session;
0136 u8 hmc_index;
0137
0138
0139 union {
0140 __be16 rsvd;
0141 __be16 buffer_id;
0142 } var2;
0143 __be32 rsvd;
0144 union {
0145 __be32 rsvd;
0146 __be32 lioba;
0147 __be32 msg_len;
0148 } var3;
0149 };
0150
0151
0152 struct crq_queue {
0153 struct ibmvmc_crq_msg *msgs;
0154 int size, cur;
0155 dma_addr_t msg_token;
0156 spinlock_t lock;
0157 };
0158
0159
0160 struct crq_server_adapter {
0161 struct device *dev;
0162 struct crq_queue queue;
0163 u32 liobn;
0164 u32 riobn;
0165 struct tasklet_struct work_task;
0166 wait_queue_head_t reset_wait_queue;
0167 struct task_struct *reset_task;
0168 };
0169
0170
0171 struct ibmvmc_struct {
0172 u32 state;
0173 u32 max_mtu;
0174 u32 max_buffer_pool_size;
0175 u32 max_hmc_index;
0176 struct crq_server_adapter *adapter;
0177 struct cdev cdev;
0178 u32 vmc_drc_index;
0179 };
0180
0181 struct ibmvmc_file_session;
0182
0183
0184 struct ibmvmc_hmc {
0185 u8 session;
0186 u8 index;
0187 u32 state;
0188 struct crq_server_adapter *adapter;
0189 spinlock_t lock;
0190 unsigned char hmc_id[HMC_ID_LEN];
0191 struct ibmvmc_buffer buffer[MAX_BUF_POOL_SIZE];
0192 unsigned short queue_outbound_msgs[MAX_BUF_POOL_SIZE];
0193 int queue_head, queue_tail;
0194 struct ibmvmc_file_session *file_session;
0195 };
0196
0197 struct ibmvmc_file_session {
0198 struct file *file;
0199 struct ibmvmc_hmc *hmc;
0200 bool valid;
0201 };
0202
0203 struct ibmvmc_query_struct {
0204 int have_vmc;
0205 int state;
0206 int vmc_drc_index;
0207 };
0208
0209 #endif