xref: /openbmc/linux/drivers/misc/ibmvmc.h (revision 0eca353e7ae75a56d5a10cd1c0ff1f06d89e60e3)
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