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