xref: /openbmc/linux/drivers/scsi/ibmvscsi_tgt/ibmvscsi_tgt.h (revision 75bf465f0bc33e9b776a46d6a1b9b990f5fb7c37)
1  /* SPDX-License-Identifier: GPL-2.0-or-later */
2  /*******************************************************************************
3   * IBM Virtual SCSI Target Driver
4   * Copyright (C) 2003-2005 Dave Boutcher (boutcher@us.ibm.com) IBM Corp.
5   *			   Santiago Leon (santil@us.ibm.com) IBM Corp.
6   *			   Linda Xie (lxie@us.ibm.com) IBM Corp.
7   *
8   * Copyright (C) 2005-2011 FUJITA Tomonori <tomof@acm.org>
9   * Copyright (C) 2010 Nicholas A. Bellinger <nab@kernel.org>
10   * Copyright (C) 2016 Bryant G. Ly <bryantly@linux.vnet.ibm.com> IBM Corp.
11   *
12   * Authors: Bryant G. Ly <bryantly@linux.vnet.ibm.com>
13   * Authors: Michael Cyr <mikecyr@linux.vnet.ibm.com>
14   *
15   ****************************************************************************/
16  
17  #ifndef __H_IBMVSCSI_TGT
18  #define __H_IBMVSCSI_TGT
19  
20  #include <linux/interrupt.h>
21  #include "libsrp.h"
22  
23  #define SYS_ID_NAME_LEN		64
24  #define PARTITION_NAMELEN	96
25  #define IBMVSCSIS_NAMELEN       32
26  
27  #define MSG_HI  0
28  #define MSG_LOW 1
29  
30  #define MAX_CMD_Q_PAGES       4
31  #define CRQ_PER_PAGE          (PAGE_SIZE / sizeof(struct viosrp_crq))
32  /* in terms of number of elements */
33  #define DEFAULT_CMD_Q_SIZE    CRQ_PER_PAGE
34  #define MAX_CMD_Q_SIZE        (DEFAULT_CMD_Q_SIZE * MAX_CMD_Q_PAGES)
35  
36  #define SRP_VIOLATION           0x102  /* general error code */
37  
38  /*
39   * SRP buffer formats defined as of 16.a supported by this driver.
40   */
41  #define SUPPORTED_FORMATS  ((SRP_DATA_DESC_DIRECT << 1) | \
42  			    (SRP_DATA_DESC_INDIRECT << 1))
43  
44  #define SCSI_LUN_ADDR_METHOD_FLAT	1
45  
46  struct dma_window {
47  	u32 liobn;	/* Unique per vdevice */
48  	u64 tce_base;	/* Physical location of the TCE table */
49  	u64 tce_size;	/* Size of the TCE table in bytes */
50  };
51  
52  struct target_dds {
53  	u64 unit_id;                /* 64 bit will force alignment */
54  #define NUM_DMA_WINDOWS 2
55  #define LOCAL  0
56  #define REMOTE 1
57  	struct dma_window  window[NUM_DMA_WINDOWS];
58  
59  	/* root node property "ibm,partition-no" */
60  	uint partition_num;
61  	char partition_name[PARTITION_NAMELEN];
62  };
63  
64  #define MAX_NUM_PORTS        1
65  #define MAX_H_COPY_RDMA      (128 * 1024)
66  
67  #define MAX_EYE   64
68  
69  /* Return codes */
70  #define ADAPT_SUCCESS            0L
71  /* choose error codes that do not conflict with PHYP */
72  #define ERROR                   -40L
73  
74  struct format_code {
75  	u8 reserved;
76  	u8 buffers;
77  };
78  
79  struct client_info {
80  #define SRP_VERSION "16.a"
81  	char srp_version[8];
82  	/* root node property ibm,partition-name */
83  	char partition_name[PARTITION_NAMELEN];
84  	/* root node property ibm,partition-no */
85  	u32 partition_number;
86  	/* initially 1 */
87  	u32 mad_version;
88  	u32 os_type;
89  };
90  
91  /*
92   * Changing this constant changes the number of seconds to wait before
93   * considering the client will never service its queue again.
94   */
95  #define SECONDS_TO_CONSIDER_FAILED 30
96  /*
97   * These constants set the polling period used to determine if the client
98   * has freed at least one element in the response queue.
99   */
100  #define WAIT_SECONDS 1
101  #define WAIT_NANO_SECONDS 5000
102  #define MAX_TIMER_POPS ((1000000 / WAIT_NANO_SECONDS) * \
103  			SECONDS_TO_CONSIDER_FAILED)
104  /*
105   * general purpose timer control block
106   * which can be used for multiple functions
107   */
108  struct timer_cb {
109  	struct hrtimer timer;
110  	/*
111  	 * how long has it been since the client
112  	 * serviced the queue. The variable is incrmented
113  	 * in the service_wait_q routine and cleared
114  	 * in send messages
115  	 */
116  	int timer_pops;
117  	/* the timer is started */
118  	bool started;
119  };
120  
121  struct cmd_queue {
122  	/* kva */
123  	struct viosrp_crq *base_addr;
124  	dma_addr_t crq_token;
125  	/* used to maintain index */
126  	uint mask;
127  	/* current element */
128  	uint index;
129  	int size;
130  };
131  
132  #define SCSOLNT_RESP_SHIFT	1
133  #define UCSOLNT_RESP_SHIFT	2
134  
135  #define SCSOLNT         BIT(SCSOLNT_RESP_SHIFT)
136  #define UCSOLNT         BIT(UCSOLNT_RESP_SHIFT)
137  
138  enum cmd_type {
139  	SCSI_CDB	= 0x01,
140  	TASK_MANAGEMENT	= 0x02,
141  	/* MAD or addressed to port 0 */
142  	ADAPTER_MAD	= 0x04,
143  	UNSET_TYPE	= 0x08,
144  };
145  
146  struct iu_rsp {
147  	u8 format;
148  	u8 sol_not;
149  	u16 len;
150  	/* tag is just to help client identify cmd, so don't translate be/le */
151  	u64 tag;
152  };
153  
154  struct ibmvscsis_cmd {
155  	struct list_head list;
156  	/* Used for TCM Core operations */
157  	struct se_cmd se_cmd;
158  	struct iu_entry *iue;
159  	struct iu_rsp rsp;
160  	struct work_struct work;
161  	struct scsi_info *adapter;
162  	struct ibmvscsis_cmd *abort_cmd;
163  	/* Sense buffer that will be mapped into outgoing status */
164  	unsigned char sense_buf[TRANSPORT_SENSE_BUFFER];
165  	u64 init_time;
166  #define CMD_FAST_FAIL	BIT(0)
167  #define DELAY_SEND	BIT(1)
168  	u32 flags;
169  	char type;
170  };
171  
172  struct ibmvscsis_nexus {
173  	struct se_session *se_sess;
174  };
175  
176  struct ibmvscsis_tport {
177  	/* SCSI protocol the tport is providing */
178  	u8 tport_proto_id;
179  	/* ASCII formatted WWPN for SRP Target port */
180  	char tport_name[IBMVSCSIS_NAMELEN];
181  	/* Returned by ibmvscsis_make_tport() */
182  	struct se_wwn tport_wwn;
183  	/* Returned by ibmvscsis_make_tpg() */
184  	struct se_portal_group se_tpg;
185  	/* ibmvscsis port target portal group tag for TCM */
186  	u16 tport_tpgt;
187  	/* Pointer to TCM session for I_T Nexus */
188  	struct ibmvscsis_nexus *ibmv_nexus;
189  	bool enabled;
190  	bool releasing;
191  };
192  
193  struct scsi_info {
194  	struct list_head list;
195  	char eye[MAX_EYE];
196  
197  	/* commands waiting for space on repsonse queue */
198  	struct list_head waiting_rsp;
199  #define NO_QUEUE                    0x00
200  #define WAIT_ENABLED                0X01
201  #define WAIT_CONNECTION             0x04
202  	/* have established a connection */
203  #define CONNECTED                   0x08
204  	/* at least one port is processing SRP IU */
205  #define SRP_PROCESSING              0x10
206  	/* remove request received */
207  #define UNCONFIGURING               0x20
208  	/* disconnect by letting adapter go idle, no error */
209  #define WAIT_IDLE                   0x40
210  	/* disconnecting to clear an error */
211  #define ERR_DISCONNECT              0x80
212  	/* disconnect to clear error state, then come back up */
213  #define ERR_DISCONNECT_RECONNECT    0x100
214  	/* disconnected after clearing an error */
215  #define ERR_DISCONNECTED            0x200
216  	/* A series of errors caused unexpected errors */
217  #define UNDEFINED                   0x400
218  	u16  state;
219  	int fast_fail;
220  	struct target_dds dds;
221  	char *cmd_pool;
222  	/* list of free commands */
223  	struct list_head free_cmd;
224  	/* command elements ready for scheduler */
225  	struct list_head schedule_q;
226  	/* commands sent to TCM */
227  	struct list_head active_q;
228  	caddr_t *map_buf;
229  	/* ioba of map buffer */
230  	dma_addr_t map_ioba;
231  	/* allowable number of outstanding SRP requests */
232  	int request_limit;
233  	/* extra credit */
234  	int credit;
235  	/* outstanding transactions against credit limit */
236  	int debit;
237  
238  	/* allow only one outstanding mad request */
239  #define PROCESSING_MAD                0x00002
240  	/* Waiting to go idle */
241  #define WAIT_FOR_IDLE		      0x00004
242  	/* H_REG_CRQ called */
243  #define CRQ_CLOSED                    0x00010
244  	/* detected that client has failed */
245  #define CLIENT_FAILED                 0x00040
246  	/* detected that transport event occurred */
247  #define TRANS_EVENT                   0x00080
248  	/* don't attempt to send anything to the client */
249  #define RESPONSE_Q_DOWN               0x00100
250  	/* request made to schedule disconnect handler */
251  #define SCHEDULE_DISCONNECT           0x00400
252  	/* disconnect handler is scheduled */
253  #define DISCONNECT_SCHEDULED          0x00800
254  	/* remove function is sleeping */
255  #define CFG_SLEEPING                  0x01000
256  	/* Register for Prepare for Suspend Transport Events */
257  #define PREP_FOR_SUSPEND_ENABLED      0x02000
258  	/* Prepare for Suspend event sent */
259  #define PREP_FOR_SUSPEND_PENDING      0x04000
260  	/* Resume from Suspend event sent */
261  #define PREP_FOR_SUSPEND_ABORTED      0x08000
262  	/* Prepare for Suspend event overwrote another CRQ entry */
263  #define PREP_FOR_SUSPEND_OVERWRITE    0x10000
264  	u32 flags;
265  	/* adapter lock */
266  	spinlock_t intr_lock;
267  	/* information needed to manage command queue */
268  	struct cmd_queue cmd_q;
269  	/* used in hcall to copy response back into srp buffer */
270  	u64  empty_iu_id;
271  	/* used in crq, to tag what iu the response is for */
272  	u64  empty_iu_tag;
273  	uint new_state;
274  	uint resume_state;
275  	/* control block for the response queue timer */
276  	struct timer_cb rsp_q_timer;
277  	/* keep last client to enable proper accounting */
278  	struct client_info client_data;
279  	/* what can this client do */
280  	u32 client_cap;
281  	/*
282  	 * The following two fields capture state and flag changes that
283  	 * can occur when the lock is given up.  In the orginal design,
284  	 * the lock was held during calls into phyp;
285  	 * however, phyp did not meet PAPR architecture.  This is
286  	 * a work around.
287  	 */
288  	u16  phyp_acr_state;
289  	u32 phyp_acr_flags;
290  
291  	struct workqueue_struct *work_q;
292  	struct completion wait_idle;
293  	struct completion unconfig;
294  	struct device dev;
295  	struct vio_dev *dma_dev;
296  	struct srp_target target;
297  	struct ibmvscsis_tport tport;
298  	struct tasklet_struct work_task;
299  	struct work_struct proc_work;
300  };
301  
302  /*
303   * Provide a constant that allows software to detect the adapter is
304   * disconnecting from the client from one of several states.
305   */
306  #define IS_DISCONNECTING (UNCONFIGURING | ERR_DISCONNECT_RECONNECT | \
307  			  ERR_DISCONNECT)
308  
309  /*
310   * Provide a constant that can be used with interrupt handling that
311   * essentially lets the interrupt handler know that all requests should
312   * be thrown out,
313   */
314  #define DONT_PROCESS_STATE (IS_DISCONNECTING | UNDEFINED | \
315  			    ERR_DISCONNECTED  | WAIT_IDLE)
316  
317  /*
318   * If any of these flag bits are set then do not allow the interrupt
319   * handler to schedule the off level handler.
320   */
321  #define BLOCK (DISCONNECT_SCHEDULED)
322  
323  /* State and transition events that stop the interrupt handler */
324  #define TARGET_STOP(VSCSI) (long)(((VSCSI)->state & DONT_PROCESS_STATE) | \
325  				  ((VSCSI)->flags & BLOCK))
326  
327  #define PREP_FOR_SUSPEND_FLAGS  (PREP_FOR_SUSPEND_ENABLED | \
328  				 PREP_FOR_SUSPEND_PENDING | \
329  				 PREP_FOR_SUSPEND_ABORTED | \
330  				 PREP_FOR_SUSPEND_OVERWRITE)
331  
332  /* flag bit that are not reset during disconnect */
333  #define PRESERVE_FLAG_FIELDS (PREP_FOR_SUSPEND_FLAGS)
334  
335  #define vio_iu(IUE) ((union viosrp_iu *)((IUE)->sbuf->buf))
336  
337  #define READ_CMD(cdb)	(((cdb)[0] & 0x1F) == 8)
338  #define WRITE_CMD(cdb)	(((cdb)[0] & 0x1F) == 0xA)
339  
340  #ifndef H_GET_PARTNER_INFO
341  #define H_GET_PARTNER_INFO              0x0000000000000008LL
342  #endif
343  #ifndef H_ENABLE_PREPARE_FOR_SUSPEND
344  #define H_ENABLE_PREPARE_FOR_SUSPEND    0x000000000000001DLL
345  #endif
346  #ifndef H_READY_FOR_SUSPEND
347  #define H_READY_FOR_SUSPEND             0x000000000000001ELL
348  #endif
349  
350  
351  #define h_copy_rdma(l, sa, sb, da, db) \
352  		plpar_hcall_norets(H_COPY_RDMA, l, sa, sb, da, db)
353  #define h_vioctl(u, o, a, u1, u2, u3, u4) \
354  		plpar_hcall_norets(H_VIOCTL, u, o, a, u1, u2)
355  #define h_reg_crq(ua, tok, sz) \
356  		plpar_hcall_norets(H_REG_CRQ, ua, tok, sz)
357  #define h_free_crq(ua) \
358  		plpar_hcall_norets(H_FREE_CRQ, ua)
359  #define h_send_crq(ua, d1, d2) \
360  		plpar_hcall_norets(H_SEND_CRQ, ua, d1, d2)
361  
362  #endif
363