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