Back to home page

OSCL-LXR

 
 

    


0001 /* SPDX-License-Identifier: GPL-2.0+ */
0002 /*
0003  * linux/drivers/misc/ibmvmc.h
0004  *
0005  * IBM Power Systems Virtual Management Channel Support.
0006  *
0007  * Copyright (c) 2004, 2018 IBM Corp.
0008  *   Dave Engebretsen engebret@us.ibm.com
0009  *   Steven Royer seroyer@linux.vnet.ibm.com
0010  *   Adam Reznechek adreznec@linux.vnet.ibm.com
0011  *   Bryant G. Ly <bryantly@linux.vnet.ibm.com>
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 /* ioctl numbers */
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     /* HMC connection not established */
0075     ibmhmc_state_free    = 0,
0076 
0077     /* HMC connection established (open called) */
0078     ibmhmc_state_initial = 1,
0079 
0080     /* open msg sent to HV, due to ioctl(1) call */
0081     ibmhmc_state_opening = 2,
0082 
0083     /* HMC connection ready, open resp msg from HV */
0084     ibmhmc_state_ready   = 3,
0085 
0086     /* HMC connection failure */
0087     ibmhmc_state_failed  = 4,
0088 };
0089 
0090 struct ibmvmc_buffer {
0091     u8 valid;   /* 1 when DMA storage allocated to buffer          */
0092     u8 free;    /* 1 when buffer available for the Alpha Partition */
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;   /* RPA Defined           */
0104     u8 type;    /* ibmvmc msg type       */
0105     u8 status;  /* Response msg status. Zero is success and on failure,
0106              * either 1 - General Failure, or 2 - Invalid Version is
0107              * returned.
0108              */
0109     u8 rsvd[2];
0110     u8 max_hmc; /* Max # of independent HMC connections supported */
0111     __be16 pool_size;   /* Maximum number of buffers supported per HMC
0112                  * connection
0113                  */
0114     __be32 max_mtu;     /* Maximum message size supported (bytes) */
0115     __be16 crq_size;    /* # of entries available in the CRQ for the
0116                  * source partition. The target partition must
0117                  * limit the number of outstanding messages to
0118                  * one half or less.
0119                  */
0120     __be16 version; /* Indicates the code level of the management partition
0121              * or the hypervisor with the high-order byte
0122              * indicating a major version and the low-order byte
0123              * indicating a minor version.
0124              */
0125 };
0126 
0127 struct ibmvmc_crq_msg {
0128     u8 valid;     /* RPA Defined           */
0129     u8 type;      /* ibmvmc msg type       */
0130     u8 status;    /* Response msg status   */
0131     union {
0132         u8 rsvd;  /* Reserved              */
0133         u8 owner;
0134     } var1;
0135     u8 hmc_session; /* Session Identifier for the current VMC connection */
0136     u8 hmc_index;   /* A unique HMC Idx would be used if multiple management
0137              * applications running concurrently were desired
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 /* an RPA command/response transport queue */
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 /* VMC server adapter settings */
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 /* Driver wide settings */
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 /* Connection specific settings */
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 /* __IBMVMC_H */