linux/drivers/scsi/ibmvscsi_tgt/ibmvscsi_tgt.h
<<
>>
Prefs
   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
  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 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
  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 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 */
 108struct 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
 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      1
 133#define UCSOLNT_RESP_SHIFT      2
 134
 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                    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