363 lines · c
1/* SPDX-License-Identifier: GPL-2.0-or-later */2/*******************************************************************************3 * IBM Virtual SCSI Target Driver4 * 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_TGT18#define __H_IBMVSCSI_TGT19 20#include <linux/interrupt.h>21#include "libsrp.h"22 23#define SYS_ID_NAME_LEN 6424#define PARTITION_NAMELEN 9625#define IBMVSCSIS_NAMELEN 3226 27#define MSG_HI 028#define MSG_LOW 129 30#define MAX_CMD_Q_PAGES 431#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_PAGE34#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 145 46struct 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 52struct target_dds {53 u64 unit_id; /* 64 bit will force alignment */54#define NUM_DMA_WINDOWS 255#define LOCAL 056#define REMOTE 157 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 165#define MAX_H_COPY_RDMA (128 * 1024)66 67#define MAX_EYE 6468 69/* Return codes */70#define ADAPT_SUCCESS 0L71/* choose error codes that do not conflict with PHYP */72#define ERROR -40L73 74struct format_code {75 u8 reserved;76 u8 buffers;77};78 79struct 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 before93 * considering the client will never service its queue again.94 */95#define SECONDS_TO_CONSIDER_FAILED 3096/*97 * These constants set the polling period used to determine if the client98 * has freed at least one element in the response queue.99 */100#define WAIT_SECONDS 1101#define WAIT_NANO_SECONDS 5000102#define MAX_TIMER_POPS ((1000000 / WAIT_NANO_SECONDS) * \103 SECONDS_TO_CONSIDER_FAILED)104/*105 * general purpose timer control block106 * which can be used for multiple functions107 */108struct timer_cb {109 struct hrtimer timer;110 /*111 * how long has it been since the client112 * serviced the queue. The variable is incrmented113 * in the service_wait_q routine and cleared114 * in send messages115 */116 int timer_pops;117 /* the timer is started */118 bool started;119};120 121struct 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 1133#define UCSOLNT_RESP_SHIFT 2134 135#define SCSOLNT BIT(SCSOLNT_RESP_SHIFT)136#define UCSOLNT BIT(UCSOLNT_RESP_SHIFT)137 138enum 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 146struct 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 154struct 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 172struct ibmvscsis_nexus {173 struct se_session *se_sess;174};175 176struct 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 193struct 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 0x00200#define WAIT_ENABLED 0X01201#define WAIT_CONNECTION 0x04202 /* have established a connection */203#define CONNECTED 0x08204 /* at least one port is processing SRP IU */205#define SRP_PROCESSING 0x10206 /* remove request received */207#define UNCONFIGURING 0x20208 /* disconnect by letting adapter go idle, no error */209#define WAIT_IDLE 0x40210 /* disconnecting to clear an error */211#define ERR_DISCONNECT 0x80212 /* disconnect to clear error state, then come back up */213#define ERR_DISCONNECT_RECONNECT 0x100214 /* disconnected after clearing an error */215#define ERR_DISCONNECTED 0x200216 /* A series of errors caused unexpected errors */217#define UNDEFINED 0x400218 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 0x00002240 /* Waiting to go idle */241#define WAIT_FOR_IDLE 0x00004242 /* H_REG_CRQ called */243#define CRQ_CLOSED 0x00010244 /* detected that client has failed */245#define CLIENT_FAILED 0x00040246 /* detected that transport event occurred */247#define TRANS_EVENT 0x00080248 /* don't attempt to send anything to the client */249#define RESPONSE_Q_DOWN 0x00100250 /* request made to schedule disconnect handler */251#define SCHEDULE_DISCONNECT 0x00400252 /* disconnect handler is scheduled */253#define DISCONNECT_SCHEDULED 0x00800254 /* remove function is sleeping */255#define CFG_SLEEPING 0x01000256 /* Register for Prepare for Suspend Transport Events */257#define PREP_FOR_SUSPEND_ENABLED 0x02000258 /* Prepare for Suspend event sent */259#define PREP_FOR_SUSPEND_PENDING 0x04000260 /* Resume from Suspend event sent */261#define PREP_FOR_SUSPEND_ABORTED 0x08000262 /* Prepare for Suspend event overwrote another CRQ entry */263#define PREP_FOR_SUSPEND_OVERWRITE 0x10000264 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 that283 * 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 is286 * 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 is304 * 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 that311 * essentially lets the interrupt handler know that all requests should312 * 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 interrupt319 * 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_INFO341#define H_GET_PARTNER_INFO 0x0000000000000008LL342#endif343#ifndef H_ENABLE_PREPARE_FOR_SUSPEND344#define H_ENABLE_PREPARE_FOR_SUSPEND 0x000000000000001DLL345#endif346#ifndef H_READY_FOR_SUSPEND347#define H_READY_FOR_SUSPEND 0x000000000000001ELL348#endif349 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#endif363