summaryrefslogtreecommitdiff
path: root/drivers/misc/ibmvmc.h
blob: e140ada8fe2cedb3e63d02027c7a7cb74c62e5c1 (plain) (blame)
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 */