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