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