linux/drivers/scsi/cxlflash/sislite.h
<<
>>
Prefs
   1/*
   2 * CXL Flash Device Driver
   3 *
   4 * Written by: Manoj N. Kumar <manoj@linux.vnet.ibm.com>, IBM Corporation
   5 *             Matthew R. Ochs <mrochs@linux.vnet.ibm.com>, IBM Corporation
   6 *
   7 * Copyright (C) 2015 IBM Corporation
   8 *
   9 * This program is free software; you can redistribute it and/or
  10 * modify it under the terms of the GNU General Public License
  11 * as published by the Free Software Foundation; either version
  12 * 2 of the License, or (at your option) any later version.
  13 */
  14
  15#ifndef _SISLITE_H
  16#define _SISLITE_H
  17
  18#include <linux/types.h>
  19
  20typedef u16 ctx_hndl_t;
  21typedef u32 res_hndl_t;
  22
  23#define SIZE_4K         4096
  24#define SIZE_64K        65536
  25
  26/*
  27 * IOARCB: 64 bytes, min 16 byte alignment required, host native endianness
  28 * except for SCSI CDB which remains big endian per SCSI standards.
  29 */
  30struct sisl_ioarcb {
  31        u16 ctx_id;             /* ctx_hndl_t */
  32        u16 req_flags;
  33#define SISL_REQ_FLAGS_RES_HNDL       0x8000U   /* bit 0 (MSB) */
  34#define SISL_REQ_FLAGS_PORT_LUN_ID    0x0000U
  35
  36#define SISL_REQ_FLAGS_SUP_UNDERRUN   0x4000U   /* bit 1 */
  37
  38#define SISL_REQ_FLAGS_TIMEOUT_SECS   0x0000U   /* bits 8,9 */
  39#define SISL_REQ_FLAGS_TIMEOUT_MSECS  0x0040U
  40#define SISL_REQ_FLAGS_TIMEOUT_USECS  0x0080U
  41#define SISL_REQ_FLAGS_TIMEOUT_CYCLES 0x00C0U
  42
  43#define SISL_REQ_FLAGS_TMF_CMD        0x0004u   /* bit 13 */
  44
  45#define SISL_REQ_FLAGS_AFU_CMD        0x0002U   /* bit 14 */
  46
  47#define SISL_REQ_FLAGS_HOST_WRITE     0x0001U   /* bit 15 (LSB) */
  48#define SISL_REQ_FLAGS_HOST_READ      0x0000U
  49
  50        union {
  51                u32 res_hndl;   /* res_hndl_t */
  52                u32 port_sel;   /* this is a selection mask:
  53                                 * 0x1 -> port#0 can be selected,
  54                                 * 0x2 -> port#1 can be selected.
  55                                 * Can be bitwise ORed.
  56                                 */
  57        };
  58        u64 lun_id;
  59        u32 data_len;           /* 4K for read/write */
  60        u32 ioadl_len;
  61        union {
  62                u64 data_ea;    /* min 16 byte aligned */
  63                u64 ioadl_ea;
  64        };
  65        u8 msi;                 /* LISN to send on RRQ write */
  66#define SISL_MSI_CXL_PFAULT        0    /* reserved for CXL page faults */
  67#define SISL_MSI_SYNC_ERROR        1    /* recommended for AFU sync error */
  68#define SISL_MSI_RRQ_UPDATED       2    /* recommended for IO completion */
  69#define SISL_MSI_ASYNC_ERROR       3    /* master only - for AFU async error */
  70
  71        u8 rrq;                 /* 0 for a single RRQ */
  72        u16 timeout;            /* in units specified by req_flags */
  73        u32 rsvd1;
  74        u8 cdb[16];             /* must be in big endian */
  75        struct scsi_cmnd *scp;
  76} __packed;
  77
  78struct sisl_rc {
  79        u8 flags;
  80#define SISL_RC_FLAGS_SENSE_VALID         0x80U
  81#define SISL_RC_FLAGS_FCP_RSP_CODE_VALID  0x40U
  82#define SISL_RC_FLAGS_OVERRUN             0x20U
  83#define SISL_RC_FLAGS_UNDERRUN            0x10U
  84
  85        u8 afu_rc;
  86#define SISL_AFU_RC_RHT_INVALID           0x01U /* user error */
  87#define SISL_AFU_RC_RHT_UNALIGNED         0x02U /* should never happen */
  88#define SISL_AFU_RC_RHT_OUT_OF_BOUNDS     0x03u /* user error */
  89#define SISL_AFU_RC_RHT_DMA_ERR           0x04u /* see afu_extra
  90                                                   may retry if afu_retry is off
  91                                                   possible on master exit
  92                                                 */
  93#define SISL_AFU_RC_RHT_RW_PERM           0x05u /* no RW perms, user error */
  94#define SISL_AFU_RC_LXT_UNALIGNED         0x12U /* should never happen */
  95#define SISL_AFU_RC_LXT_OUT_OF_BOUNDS     0x13u /* user error */
  96#define SISL_AFU_RC_LXT_DMA_ERR           0x14u /* see afu_extra
  97                                                   may retry if afu_retry is off
  98                                                   possible on master exit
  99                                                 */
 100#define SISL_AFU_RC_LXT_RW_PERM           0x15u /* no RW perms, user error */
 101
 102#define SISL_AFU_RC_NOT_XLATE_HOST        0x1au /* possible if master exited */
 103
 104        /* NO_CHANNELS means the FC ports selected by dest_port in
 105         * IOARCB or in the LXT entry are down when the AFU tried to select
 106         * a FC port. If the port went down on an active IO, it will set
 107         * fc_rc to =0x54(NOLOGI) or 0x57(LINKDOWN) instead.
 108         */
 109#define SISL_AFU_RC_NO_CHANNELS           0x20U /* see afu_extra, may retry */
 110#define SISL_AFU_RC_CAP_VIOLATION         0x21U /* either user error or
 111                                                   afu reset/master restart
 112                                                 */
 113#define SISL_AFU_RC_OUT_OF_DATA_BUFS      0x30U /* always retry */
 114#define SISL_AFU_RC_DATA_DMA_ERR          0x31U /* see afu_extra
 115                                                   may retry if afu_retry is off
 116                                                 */
 117
 118        u8 scsi_rc;             /* SCSI status byte, retry as appropriate */
 119#define SISL_SCSI_RC_CHECK                0x02U
 120#define SISL_SCSI_RC_BUSY                 0x08u
 121
 122        u8 fc_rc;               /* retry */
 123        /*
 124         * We should only see fc_rc=0x57 (LINKDOWN) or 0x54(NOLOGI) for
 125         * commands that are in flight when a link goes down or is logged out.
 126         * If the link is down or logged out before AFU selects the port, either
 127         * it will choose the other port or we will get afu_rc=0x20 (no_channel)
 128         * if there is no valid port to use.
 129         *
 130         * ABORTPEND/ABORTOK/ABORTFAIL/TGTABORT can be retried, typically these
 131         * would happen if a frame is dropped and something times out.
 132         * NOLOGI or LINKDOWN can be retried if the other port is up.
 133         * RESIDERR can be retried as well.
 134         *
 135         * ABORTFAIL might indicate that lots of frames are getting CRC errors.
 136         * So it maybe retried once and reset the link if it happens again.
 137         * The link can also be reset on the CRC error threshold interrupt.
 138         */
 139#define SISL_FC_RC_ABORTPEND    0x52    /* exchange timeout or abort request */
 140#define SISL_FC_RC_WRABORTPEND  0x53    /* due to write XFER_RDY invalid */
 141#define SISL_FC_RC_NOLOGI       0x54    /* port not logged in, in-flight cmds */
 142#define SISL_FC_RC_NOEXP        0x55    /* FC protocol error or HW bug */
 143#define SISL_FC_RC_INUSE        0x56    /* tag already in use, HW bug */
 144#define SISL_FC_RC_LINKDOWN     0x57    /* link down, in-flight cmds */
 145#define SISL_FC_RC_ABORTOK      0x58    /* pending abort completed w/success */
 146#define SISL_FC_RC_ABORTFAIL    0x59    /* pending abort completed w/fail */
 147#define SISL_FC_RC_RESID        0x5A    /* ioasa underrun/overrun flags set */
 148#define SISL_FC_RC_RESIDERR     0x5B    /* actual data len does not match SCSI
 149                                           reported len, possibly due to dropped
 150                                           frames */
 151#define SISL_FC_RC_TGTABORT     0x5C    /* command aborted by target */
 152};
 153
 154#define SISL_SENSE_DATA_LEN     20      /* Sense data length         */
 155
 156/*
 157 * IOASA: 64 bytes & must follow IOARCB, min 16 byte alignment required,
 158 * host native endianness
 159 */
 160struct sisl_ioasa {
 161        union {
 162                struct sisl_rc rc;
 163                u32 ioasc;
 164#define SISL_IOASC_GOOD_COMPLETION        0x00000000U
 165        };
 166        u32 resid;
 167        u8 port;
 168        u8 afu_extra;
 169        /* when afu_rc=0x04, 0x14, 0x31 (_xxx_DMA_ERR):
 170         * afu_exta contains PSL response code. Useful codes are:
 171         */
 172#define SISL_AFU_DMA_ERR_PAGE_IN        0x0A    /* AFU_retry_on_pagein Action
 173                                                 *  Enabled            N/A
 174                                                 *  Disabled           retry
 175                                                 */
 176#define SISL_AFU_DMA_ERR_INVALID_EA     0x0B    /* this is a hard error
 177                                                 * afu_rc       Implies
 178                                                 * 0x04, 0x14   master exit.
 179                                                 * 0x31         user error.
 180                                                 */
 181        /* when afu rc=0x20 (no channels):
 182         * afu_extra bits [4:5]: available portmask,  [6:7]: requested portmask.
 183         */
 184#define SISL_AFU_NO_CLANNELS_AMASK(afu_extra) (((afu_extra) & 0x0C) >> 2)
 185#define SISL_AFU_NO_CLANNELS_RMASK(afu_extra) ((afu_extra) & 0x03)
 186
 187        u8 scsi_extra;
 188        u8 fc_extra;
 189        u8 sense_data[SISL_SENSE_DATA_LEN];
 190
 191        /* These fields are defined by the SISlite architecture for the
 192         * host to use as they see fit for their implementation.
 193         */
 194        union {
 195                u64 host_use[4];
 196                u8 host_use_b[32];
 197        };
 198} __packed;
 199
 200#define SISL_RESP_HANDLE_T_BIT        0x1ULL    /* Toggle bit */
 201
 202/* MMIO space is required to support only 64-bit access */
 203
 204/*
 205 * This AFU has two mechanisms to deal with endian-ness.
 206 * One is a global configuration (in the afu_config) register
 207 * below that specifies the endian-ness of the host.
 208 * The other is a per context (i.e. application) specification
 209 * controlled by the endian_ctrl field here. Since the master
 210 * context is one such application the master context's
 211 * endian-ness is set to be the same as the host.
 212 *
 213 * As per the SISlite spec, the MMIO registers are always
 214 * big endian.
 215 */
 216#define SISL_ENDIAN_CTRL_BE           0x8000000000000080ULL
 217#define SISL_ENDIAN_CTRL_LE           0x0000000000000000ULL
 218
 219#ifdef __BIG_ENDIAN
 220#define SISL_ENDIAN_CTRL              SISL_ENDIAN_CTRL_BE
 221#else
 222#define SISL_ENDIAN_CTRL              SISL_ENDIAN_CTRL_LE
 223#endif
 224
 225/* per context host transport MMIO  */
 226struct sisl_host_map {
 227        __be64 endian_ctrl;     /* Per context Endian Control. The AFU will
 228                              * operate on whatever the context is of the
 229                              * host application.
 230                              */
 231
 232        __be64 intr_status;     /* this sends LISN# programmed in ctx_ctrl.
 233                                 * Only recovery in a PERM_ERR is a context
 234                                 * exit since there is no way to tell which
 235                                 * command caused the error.
 236                                 */
 237#define SISL_ISTATUS_PERM_ERR_CMDROOM    0x0010ULL      /* b59, user error */
 238#define SISL_ISTATUS_PERM_ERR_RCB_READ   0x0008ULL      /* b60, user error */
 239#define SISL_ISTATUS_PERM_ERR_SA_WRITE   0x0004ULL      /* b61, user error */
 240#define SISL_ISTATUS_PERM_ERR_RRQ_WRITE  0x0002ULL      /* b62, user error */
 241        /* Page in wait accessing RCB/IOASA/RRQ is reported in b63.
 242         * Same error in data/LXT/RHT access is reported via IOASA.
 243         */
 244#define SISL_ISTATUS_TEMP_ERR_PAGEIN     0x0001ULL      /* b63, can be generated
 245                                                         * only when AFU auto
 246                                                         * retry is disabled.
 247                                                         * If user can determine
 248                                                         * the command that
 249                                                         * caused the error, it
 250                                                         * can be retried.
 251                                                         */
 252#define SISL_ISTATUS_UNMASK  (0x001FULL)        /* 1 means unmasked */
 253#define SISL_ISTATUS_MASK    ~(SISL_ISTATUS_UNMASK)     /* 1 means masked */
 254
 255        __be64 intr_clear;
 256        __be64 intr_mask;
 257        __be64 ioarrin;         /* only write what cmd_room permits */
 258        __be64 rrq_start;       /* start & end are both inclusive */
 259        __be64 rrq_end;         /* write sequence: start followed by end */
 260        __be64 cmd_room;
 261        __be64 ctx_ctrl;        /* least significant byte or b56:63 is LISN# */
 262        __be64 mbox_w;          /* restricted use */
 263};
 264
 265/* per context provisioning & control MMIO */
 266struct sisl_ctrl_map {
 267        __be64 rht_start;
 268        __be64 rht_cnt_id;
 269        /* both cnt & ctx_id args must be ULL */
 270#define SISL_RHT_CNT_ID(cnt, ctx_id)  (((cnt) << 48) | ((ctx_id) << 32))
 271
 272        __be64 ctx_cap; /* afu_rc below is when the capability is violated */
 273#define SISL_CTX_CAP_PROXY_ISSUE       0x8000000000000000ULL /* afu_rc 0x21 */
 274#define SISL_CTX_CAP_REAL_MODE         0x4000000000000000ULL /* afu_rc 0x21 */
 275#define SISL_CTX_CAP_HOST_XLATE        0x2000000000000000ULL /* afu_rc 0x1a */
 276#define SISL_CTX_CAP_PROXY_TARGET      0x1000000000000000ULL /* afu_rc 0x21 */
 277#define SISL_CTX_CAP_AFU_CMD           0x0000000000000008ULL /* afu_rc 0x21 */
 278#define SISL_CTX_CAP_GSCSI_CMD         0x0000000000000004ULL /* afu_rc 0x21 */
 279#define SISL_CTX_CAP_WRITE_CMD         0x0000000000000002ULL /* afu_rc 0x21 */
 280#define SISL_CTX_CAP_READ_CMD          0x0000000000000001ULL /* afu_rc 0x21 */
 281        __be64 mbox_r;
 282};
 283
 284/* single copy global regs */
 285struct sisl_global_regs {
 286        __be64 aintr_status;
 287        /* In cxlflash, each FC port/link gets a byte of status */
 288#define SISL_ASTATUS_FC0_OTHER   0x8000ULL /* b48, other err,
 289                                              FC_ERRCAP[31:20] */
 290#define SISL_ASTATUS_FC0_LOGO    0x4000ULL /* b49, target sent FLOGI/PLOGI/LOGO
 291                                                   while logged in */
 292#define SISL_ASTATUS_FC0_CRC_T   0x2000ULL /* b50, CRC threshold exceeded */
 293#define SISL_ASTATUS_FC0_LOGI_R  0x1000ULL /* b51, login state machine timed out
 294                                                   and retrying */
 295#define SISL_ASTATUS_FC0_LOGI_F  0x0800ULL /* b52, login failed,
 296                                              FC_ERROR[19:0] */
 297#define SISL_ASTATUS_FC0_LOGI_S  0x0400ULL /* b53, login succeeded */
 298#define SISL_ASTATUS_FC0_LINK_DN 0x0200ULL /* b54, link online to offline */
 299#define SISL_ASTATUS_FC0_LINK_UP 0x0100ULL /* b55, link offline to online */
 300
 301#define SISL_ASTATUS_FC1_OTHER   0x0080ULL /* b56 */
 302#define SISL_ASTATUS_FC1_LOGO    0x0040ULL /* b57 */
 303#define SISL_ASTATUS_FC1_CRC_T   0x0020ULL /* b58 */
 304#define SISL_ASTATUS_FC1_LOGI_R  0x0010ULL /* b59 */
 305#define SISL_ASTATUS_FC1_LOGI_F  0x0008ULL /* b60 */
 306#define SISL_ASTATUS_FC1_LOGI_S  0x0004ULL /* b61 */
 307#define SISL_ASTATUS_FC1_LINK_DN 0x0002ULL /* b62 */
 308#define SISL_ASTATUS_FC1_LINK_UP 0x0001ULL /* b63 */
 309
 310#define SISL_FC_INTERNAL_UNMASK 0x0000000300000000ULL   /* 1 means unmasked */
 311#define SISL_FC_INTERNAL_MASK   ~(SISL_FC_INTERNAL_UNMASK)
 312#define SISL_FC_INTERNAL_SHIFT  32
 313
 314#define SISL_ASTATUS_UNMASK     0xFFFFULL               /* 1 means unmasked */
 315#define SISL_ASTATUS_MASK       ~(SISL_ASTATUS_UNMASK)  /* 1 means masked */
 316
 317        __be64 aintr_clear;
 318        __be64 aintr_mask;
 319        __be64 afu_ctrl;
 320        __be64 afu_hb;
 321        __be64 afu_scratch_pad;
 322        __be64 afu_port_sel;
 323#define SISL_AFUCONF_AR_IOARCB  0x4000ULL
 324#define SISL_AFUCONF_AR_LXT     0x2000ULL
 325#define SISL_AFUCONF_AR_RHT     0x1000ULL
 326#define SISL_AFUCONF_AR_DATA    0x0800ULL
 327#define SISL_AFUCONF_AR_RSRC    0x0400ULL
 328#define SISL_AFUCONF_AR_IOASA   0x0200ULL
 329#define SISL_AFUCONF_AR_RRQ     0x0100ULL
 330/* Aggregate all Auto Retry Bits */
 331#define SISL_AFUCONF_AR_ALL     (SISL_AFUCONF_AR_IOARCB|SISL_AFUCONF_AR_LXT| \
 332                                 SISL_AFUCONF_AR_RHT|SISL_AFUCONF_AR_DATA|   \
 333                                 SISL_AFUCONF_AR_RSRC|SISL_AFUCONF_AR_IOASA| \
 334                                 SISL_AFUCONF_AR_RRQ)
 335#ifdef __BIG_ENDIAN
 336#define SISL_AFUCONF_ENDIAN            0x0000ULL
 337#else
 338#define SISL_AFUCONF_ENDIAN            0x0020ULL
 339#endif
 340#define SISL_AFUCONF_MBOX_CLR_READ     0x0010ULL
 341        __be64 afu_config;
 342        __be64 rsvd[0xf8];
 343        __le64 afu_version;
 344        __be64 interface_version;
 345};
 346
 347#define CXLFLASH_NUM_FC_PORTS   2
 348#define CXLFLASH_MAX_CONTEXT  512       /* how many contexts per afu */
 349#define CXLFLASH_NUM_VLUNS    512
 350
 351struct sisl_global_map {
 352        union {
 353                struct sisl_global_regs regs;
 354                char page0[SIZE_4K];    /* page 0 */
 355        };
 356
 357        char page1[SIZE_4K];    /* page 1 */
 358
 359        /* pages 2 & 3 */
 360        __be64 fc_regs[CXLFLASH_NUM_FC_PORTS][CXLFLASH_NUM_VLUNS];
 361
 362        /* pages 4 & 5 (lun tbl) */
 363        __be64 fc_port[CXLFLASH_NUM_FC_PORTS][CXLFLASH_NUM_VLUNS];
 364
 365};
 366
 367/*
 368 * CXL Flash Memory Map
 369 *
 370 *      +-------------------------------+
 371 *      |    512 * 64 KB User MMIO      |
 372 *      |        (per context)          |
 373 *      |       User Accessible         |
 374 *      +-------------------------------+
 375 *      |    512 * 128 B per context    |
 376 *      |    Provisioning and Control   |
 377 *      |   Trusted Process accessible  |
 378 *      +-------------------------------+
 379 *      |         64 KB Global          |
 380 *      |   Trusted Process accessible  |
 381 *      +-------------------------------+
 382*/
 383struct cxlflash_afu_map {
 384        union {
 385                struct sisl_host_map host;
 386                char harea[SIZE_64K];   /* 64KB each */
 387        } hosts[CXLFLASH_MAX_CONTEXT];
 388
 389        union {
 390                struct sisl_ctrl_map ctrl;
 391                char carea[cache_line_size()];  /* 128B each */
 392        } ctrls[CXLFLASH_MAX_CONTEXT];
 393
 394        union {
 395                struct sisl_global_map global;
 396                char garea[SIZE_64K];   /* 64KB single block */
 397        };
 398};
 399
 400/*
 401 * LXT - LBA Translation Table
 402 * LXT control blocks
 403 */
 404struct sisl_lxt_entry {
 405        u64 rlba_base;  /* bits 0:47 is base
 406                         * b48:55 is lun index
 407                         * b58:59 is write & read perms
 408                         * (if no perm, afu_rc=0x15)
 409                         * b60:63 is port_sel mask
 410                         */
 411};
 412
 413/*
 414 * RHT - Resource Handle Table
 415 * Per the SISlite spec, RHT entries are to be 16-byte aligned
 416 */
 417struct sisl_rht_entry {
 418        struct sisl_lxt_entry *lxt_start;
 419        u32 lxt_cnt;
 420        u16 rsvd;
 421        u8 fp;                  /* format & perm nibbles.
 422                                 * (if no perm, afu_rc=0x05)
 423                                 */
 424        u8 nmask;
 425} __packed __aligned(16);
 426
 427struct sisl_rht_entry_f1 {
 428        u64 lun_id;
 429        union {
 430                struct {
 431                        u8 valid;
 432                        u8 rsvd[5];
 433                        u8 fp;
 434                        u8 port_sel;
 435                };
 436
 437                u64 dw;
 438        };
 439} __packed __aligned(16);
 440
 441/* make the fp byte */
 442#define SISL_RHT_FP(fmt, perm) (((fmt) << 4) | (perm))
 443
 444/* make the fp byte for a clone from a source fp and clone flags
 445 * flags must be only 2 LSB bits.
 446 */
 447#define SISL_RHT_FP_CLONE(src_fp, cln_flags) ((src_fp) & (0xFC | (cln_flags)))
 448
 449#define RHT_PERM_READ  0x01U
 450#define RHT_PERM_WRITE 0x02U
 451#define RHT_PERM_RW    (RHT_PERM_READ | RHT_PERM_WRITE)
 452
 453/* extract the perm bits from a fp */
 454#define SISL_RHT_PERM(fp) ((fp) & RHT_PERM_RW)
 455
 456#define PORT0  0x01U
 457#define PORT1  0x02U
 458#define BOTH_PORTS    (PORT0 | PORT1)
 459
 460/* AFU Sync Mode byte */
 461#define AFU_LW_SYNC 0x0U
 462#define AFU_HW_SYNC 0x1U
 463#define AFU_GSYNC   0x2U
 464
 465/* Special Task Management Function CDB */
 466#define TMF_LUN_RESET  0x1U
 467#define TMF_CLEAR_ACA  0x2U
 468
 469
 470#define SISLITE_MAX_WS_BLOCKS 512
 471
 472#endif /* _SISLITE_H */
 473