root/drivers/scsi/cxlflash/sislite.h

/* [<][>][^][v][top][bottom][index][help] */

INCLUDED FROM


   1 /* SPDX-License-Identifier: GPL-2.0-or-later */
   2 /*
   3  * CXL Flash Device Driver
   4  *
   5  * Written by: Manoj N. Kumar <manoj@linux.vnet.ibm.com>, IBM Corporation
   6  *             Matthew R. Ochs <mrochs@linux.vnet.ibm.com>, IBM Corporation
   7  *
   8  * Copyright (C) 2015 IBM Corporation
   9  */
  10 
  11 #ifndef _SISLITE_H
  12 #define _SISLITE_H
  13 
  14 #include <linux/types.h>
  15 
  16 typedef u16 ctx_hndl_t;
  17 typedef u32 res_hndl_t;
  18 
  19 #define SIZE_4K         4096
  20 #define SIZE_64K        65536
  21 
  22 /*
  23  * IOARCB: 64 bytes, min 16 byte alignment required, host native endianness
  24  * except for SCSI CDB which remains big endian per SCSI standards.
  25  */
  26 struct sisl_ioarcb {
  27         u16 ctx_id;             /* ctx_hndl_t */
  28         u16 req_flags;
  29 #define SISL_REQ_FLAGS_RES_HNDL       0x8000U   /* bit 0 (MSB) */
  30 #define SISL_REQ_FLAGS_PORT_LUN_ID    0x0000U
  31 
  32 #define SISL_REQ_FLAGS_SUP_UNDERRUN   0x4000U   /* bit 1 */
  33 
  34 #define SISL_REQ_FLAGS_TIMEOUT_SECS   0x0000U   /* bits 8,9 */
  35 #define SISL_REQ_FLAGS_TIMEOUT_MSECS  0x0040U
  36 #define SISL_REQ_FLAGS_TIMEOUT_USECS  0x0080U
  37 #define SISL_REQ_FLAGS_TIMEOUT_CYCLES 0x00C0U
  38 
  39 #define SISL_REQ_FLAGS_TMF_CMD        0x0004u   /* bit 13 */
  40 
  41 #define SISL_REQ_FLAGS_AFU_CMD        0x0002U   /* bit 14 */
  42 
  43 #define SISL_REQ_FLAGS_HOST_WRITE     0x0001U   /* bit 15 (LSB) */
  44 #define SISL_REQ_FLAGS_HOST_READ      0x0000U
  45 
  46         union {
  47                 u32 res_hndl;   /* res_hndl_t */
  48                 u32 port_sel;   /* this is a selection mask:
  49                                  * 0x1 -> port#0 can be selected,
  50                                  * 0x2 -> port#1 can be selected.
  51                                  * Can be bitwise ORed.
  52                                  */
  53         };
  54         u64 lun_id;
  55         u32 data_len;           /* 4K for read/write */
  56         u32 ioadl_len;
  57         union {
  58                 u64 data_ea;    /* min 16 byte aligned */
  59                 u64 ioadl_ea;
  60         };
  61         u8 msi;                 /* LISN to send on RRQ write */
  62 #define SISL_MSI_CXL_PFAULT        0    /* reserved for CXL page faults */
  63 #define SISL_MSI_SYNC_ERROR        1    /* recommended for AFU sync error */
  64 #define SISL_MSI_RRQ_UPDATED       2    /* recommended for IO completion */
  65 #define SISL_MSI_ASYNC_ERROR       3    /* master only - for AFU async error */
  66 
  67         u8 rrq;                 /* 0 for a single RRQ */
  68         u16 timeout;            /* in units specified by req_flags */
  69         u32 rsvd1;
  70         u8 cdb[16];             /* must be in big endian */
  71 #define SISL_AFU_CMD_SYNC               0xC0    /* AFU sync command */
  72 #define SISL_AFU_CMD_LUN_PROVISION      0xD0    /* AFU LUN provision command */
  73 #define SISL_AFU_CMD_DEBUG              0xE0    /* AFU debug command */
  74 
  75 #define SISL_AFU_LUN_PROVISION_CREATE   0x00    /* LUN provision create type */
  76 #define SISL_AFU_LUN_PROVISION_DELETE   0x01    /* LUN provision delete type */
  77 
  78         union {
  79                 u64 reserved;                   /* Reserved for IOARRIN mode */
  80                 struct sisl_ioasa *ioasa;       /* IOASA EA for SQ Mode */
  81         };
  82 } __packed;
  83 
  84 struct sisl_rc {
  85         u8 flags;
  86 #define SISL_RC_FLAGS_SENSE_VALID         0x80U
  87 #define SISL_RC_FLAGS_FCP_RSP_CODE_VALID  0x40U
  88 #define SISL_RC_FLAGS_OVERRUN             0x20U
  89 #define SISL_RC_FLAGS_UNDERRUN            0x10U
  90 
  91         u8 afu_rc;
  92 #define SISL_AFU_RC_RHT_INVALID           0x01U /* user error */
  93 #define SISL_AFU_RC_RHT_UNALIGNED         0x02U /* should never happen */
  94 #define SISL_AFU_RC_RHT_OUT_OF_BOUNDS     0x03u /* user error */
  95 #define SISL_AFU_RC_RHT_DMA_ERR           0x04u /* see afu_extra
  96                                                  * may retry if afu_retry is off
  97                                                  * possible on master exit
  98                                                  */
  99 #define SISL_AFU_RC_RHT_RW_PERM           0x05u /* no RW perms, user error */
 100 #define SISL_AFU_RC_LXT_UNALIGNED         0x12U /* should never happen */
 101 #define SISL_AFU_RC_LXT_OUT_OF_BOUNDS     0x13u /* user error */
 102 #define SISL_AFU_RC_LXT_DMA_ERR           0x14u /* see afu_extra
 103                                                  * may retry if afu_retry is off
 104                                                  * possible on master exit
 105                                                  */
 106 #define SISL_AFU_RC_LXT_RW_PERM           0x15u /* no RW perms, user error */
 107 
 108 #define SISL_AFU_RC_NOT_XLATE_HOST        0x1au /* possible if master exited */
 109 
 110         /* NO_CHANNELS means the FC ports selected by dest_port in
 111          * IOARCB or in the LXT entry are down when the AFU tried to select
 112          * a FC port. If the port went down on an active IO, it will set
 113          * fc_rc to =0x54(NOLOGI) or 0x57(LINKDOWN) instead.
 114          */
 115 #define SISL_AFU_RC_NO_CHANNELS           0x20U /* see afu_extra, may retry */
 116 #define SISL_AFU_RC_CAP_VIOLATION         0x21U /* either user error or
 117                                                  * afu reset/master restart
 118                                                  */
 119 #define SISL_AFU_RC_OUT_OF_DATA_BUFS      0x30U /* always retry */
 120 #define SISL_AFU_RC_DATA_DMA_ERR          0x31U /* see afu_extra
 121                                                  * may retry if afu_retry is off
 122                                                  */
 123 
 124         u8 scsi_rc;             /* SCSI status byte, retry as appropriate */
 125 #define SISL_SCSI_RC_CHECK                0x02U
 126 #define SISL_SCSI_RC_BUSY                 0x08u
 127 
 128         u8 fc_rc;               /* retry */
 129         /*
 130          * We should only see fc_rc=0x57 (LINKDOWN) or 0x54(NOLOGI) for
 131          * commands that are in flight when a link goes down or is logged out.
 132          * If the link is down or logged out before AFU selects the port, either
 133          * it will choose the other port or we will get afu_rc=0x20 (no_channel)
 134          * if there is no valid port to use.
 135          *
 136          * ABORTPEND/ABORTOK/ABORTFAIL/TGTABORT can be retried, typically these
 137          * would happen if a frame is dropped and something times out.
 138          * NOLOGI or LINKDOWN can be retried if the other port is up.
 139          * RESIDERR can be retried as well.
 140          *
 141          * ABORTFAIL might indicate that lots of frames are getting CRC errors.
 142          * So it maybe retried once and reset the link if it happens again.
 143          * The link can also be reset on the CRC error threshold interrupt.
 144          */
 145 #define SISL_FC_RC_ABORTPEND    0x52    /* exchange timeout or abort request */
 146 #define SISL_FC_RC_WRABORTPEND  0x53    /* due to write XFER_RDY invalid */
 147 #define SISL_FC_RC_NOLOGI       0x54    /* port not logged in, in-flight cmds */
 148 #define SISL_FC_RC_NOEXP        0x55    /* FC protocol error or HW bug */
 149 #define SISL_FC_RC_INUSE        0x56    /* tag already in use, HW bug */
 150 #define SISL_FC_RC_LINKDOWN     0x57    /* link down, in-flight cmds */
 151 #define SISL_FC_RC_ABORTOK      0x58    /* pending abort completed w/success */
 152 #define SISL_FC_RC_ABORTFAIL    0x59    /* pending abort completed w/fail */
 153 #define SISL_FC_RC_RESID        0x5A    /* ioasa underrun/overrun flags set */
 154 #define SISL_FC_RC_RESIDERR     0x5B    /* actual data len does not match SCSI
 155                                          * reported len, possibly due to dropped
 156                                          * frames
 157                                          */
 158 #define SISL_FC_RC_TGTABORT     0x5C    /* command aborted by target */
 159 };
 160 
 161 #define SISL_SENSE_DATA_LEN     20      /* Sense data length         */
 162 #define SISL_WWID_DATA_LEN      16      /* WWID data length          */
 163 
 164 /*
 165  * IOASA: 64 bytes & must follow IOARCB, min 16 byte alignment required,
 166  * host native endianness
 167  */
 168 struct sisl_ioasa {
 169         union {
 170                 struct sisl_rc rc;
 171                 u32 ioasc;
 172 #define SISL_IOASC_GOOD_COMPLETION        0x00000000U
 173         };
 174 
 175         union {
 176                 u32 resid;
 177                 u32 lunid_hi;
 178         };
 179 
 180         u8 port;
 181         u8 afu_extra;
 182         /* when afu_rc=0x04, 0x14, 0x31 (_xxx_DMA_ERR):
 183          * afu_exta contains PSL response code. Useful codes are:
 184          */
 185 #define SISL_AFU_DMA_ERR_PAGE_IN        0x0A    /* AFU_retry_on_pagein Action
 186                                                  *  Enabled            N/A
 187                                                  *  Disabled           retry
 188                                                  */
 189 #define SISL_AFU_DMA_ERR_INVALID_EA     0x0B    /* this is a hard error
 190                                                  * afu_rc       Implies
 191                                                  * 0x04, 0x14   master exit.
 192                                                  * 0x31         user error.
 193                                                  */
 194         /* when afu rc=0x20 (no channels):
 195          * afu_extra bits [4:5]: available portmask,  [6:7]: requested portmask.
 196          */
 197 #define SISL_AFU_NO_CLANNELS_AMASK(afu_extra) (((afu_extra) & 0x0C) >> 2)
 198 #define SISL_AFU_NO_CLANNELS_RMASK(afu_extra) ((afu_extra) & 0x03)
 199 
 200         u8 scsi_extra;
 201         u8 fc_extra;
 202 
 203         union {
 204                 u8 sense_data[SISL_SENSE_DATA_LEN];
 205                 struct {
 206                         u32 lunid_lo;
 207                         u8 wwid[SISL_WWID_DATA_LEN];
 208                 };
 209         };
 210 
 211         /* These fields are defined by the SISlite architecture for the
 212          * host to use as they see fit for their implementation.
 213          */
 214         union {
 215                 u64 host_use[4];
 216                 u8 host_use_b[32];
 217         };
 218 } __packed;
 219 
 220 #define SISL_RESP_HANDLE_T_BIT        0x1ULL    /* Toggle bit */
 221 
 222 /* MMIO space is required to support only 64-bit access */
 223 
 224 /*
 225  * This AFU has two mechanisms to deal with endian-ness.
 226  * One is a global configuration (in the afu_config) register
 227  * below that specifies the endian-ness of the host.
 228  * The other is a per context (i.e. application) specification
 229  * controlled by the endian_ctrl field here. Since the master
 230  * context is one such application the master context's
 231  * endian-ness is set to be the same as the host.
 232  *
 233  * As per the SISlite spec, the MMIO registers are always
 234  * big endian.
 235  */
 236 #define SISL_ENDIAN_CTRL_BE           0x8000000000000080ULL
 237 #define SISL_ENDIAN_CTRL_LE           0x0000000000000000ULL
 238 
 239 #ifdef __BIG_ENDIAN
 240 #define SISL_ENDIAN_CTRL              SISL_ENDIAN_CTRL_BE
 241 #else
 242 #define SISL_ENDIAN_CTRL              SISL_ENDIAN_CTRL_LE
 243 #endif
 244 
 245 /* per context host transport MMIO  */
 246 struct sisl_host_map {
 247         __be64 endian_ctrl;     /* Per context Endian Control. The AFU will
 248                                  * operate on whatever the context is of the
 249                                  * host application.
 250                                  */
 251 
 252         __be64 intr_status;     /* this sends LISN# programmed in ctx_ctrl.
 253                                  * Only recovery in a PERM_ERR is a context
 254                                  * exit since there is no way to tell which
 255                                  * command caused the error.
 256                                  */
 257 #define SISL_ISTATUS_PERM_ERR_LISN_3_EA         0x0400ULL /* b53, user error */
 258 #define SISL_ISTATUS_PERM_ERR_LISN_2_EA         0x0200ULL /* b54, user error */
 259 #define SISL_ISTATUS_PERM_ERR_LISN_1_EA         0x0100ULL /* b55, user error */
 260 #define SISL_ISTATUS_PERM_ERR_LISN_3_PASID      0x0080ULL /* b56, user error */
 261 #define SISL_ISTATUS_PERM_ERR_LISN_2_PASID      0x0040ULL /* b57, user error */
 262 #define SISL_ISTATUS_PERM_ERR_LISN_1_PASID      0x0020ULL /* b58, user error */
 263 #define SISL_ISTATUS_PERM_ERR_CMDROOM           0x0010ULL /* b59, user error */
 264 #define SISL_ISTATUS_PERM_ERR_RCB_READ          0x0008ULL /* b60, user error */
 265 #define SISL_ISTATUS_PERM_ERR_SA_WRITE          0x0004ULL /* b61, user error */
 266 #define SISL_ISTATUS_PERM_ERR_RRQ_WRITE         0x0002ULL /* b62, user error */
 267         /* Page in wait accessing RCB/IOASA/RRQ is reported in b63.
 268          * Same error in data/LXT/RHT access is reported via IOASA.
 269          */
 270 #define SISL_ISTATUS_TEMP_ERR_PAGEIN            0x0001ULL /* b63, can only be
 271                                                            * generated when AFU
 272                                                            * auto retry is
 273                                                            * disabled. If user
 274                                                            * can determine the
 275                                                            * command that caused
 276                                                            * the error, it can
 277                                                            * be retried.
 278                                                            */
 279 #define SISL_ISTATUS_UNMASK     (0x07FFULL)             /* 1 means unmasked */
 280 #define SISL_ISTATUS_MASK       ~(SISL_ISTATUS_UNMASK)  /* 1 means masked */
 281 
 282         __be64 intr_clear;
 283         __be64 intr_mask;
 284         __be64 ioarrin;         /* only write what cmd_room permits */
 285         __be64 rrq_start;       /* start & end are both inclusive */
 286         __be64 rrq_end;         /* write sequence: start followed by end */
 287         __be64 cmd_room;
 288         __be64 ctx_ctrl;        /* least significant byte or b56:63 is LISN# */
 289 #define SISL_CTX_CTRL_UNMAP_SECTOR      0x8000000000000000ULL /* b0 */
 290 #define SISL_CTX_CTRL_LISN_MASK         (0xFFULL)
 291         __be64 mbox_w;          /* restricted use */
 292         __be64 sq_start;        /* Submission Queue (R/W): write sequence and */
 293         __be64 sq_end;          /* inclusion semantics are the same as RRQ    */
 294         __be64 sq_head;         /* Submission Queue Head (R): for debugging   */
 295         __be64 sq_tail;         /* Submission Queue TAIL (R/W): next IOARCB   */
 296         __be64 sq_ctx_reset;    /* Submission Queue Context Reset (R/W)       */
 297 };
 298 
 299 /* per context provisioning & control MMIO */
 300 struct sisl_ctrl_map {
 301         __be64 rht_start;
 302         __be64 rht_cnt_id;
 303         /* both cnt & ctx_id args must be ULL */
 304 #define SISL_RHT_CNT_ID(cnt, ctx_id)  (((cnt) << 48) | ((ctx_id) << 32))
 305 
 306         __be64 ctx_cap; /* afu_rc below is when the capability is violated */
 307 #define SISL_CTX_CAP_PROXY_ISSUE       0x8000000000000000ULL /* afu_rc 0x21 */
 308 #define SISL_CTX_CAP_REAL_MODE         0x4000000000000000ULL /* afu_rc 0x21 */
 309 #define SISL_CTX_CAP_HOST_XLATE        0x2000000000000000ULL /* afu_rc 0x1a */
 310 #define SISL_CTX_CAP_PROXY_TARGET      0x1000000000000000ULL /* afu_rc 0x21 */
 311 #define SISL_CTX_CAP_AFU_CMD           0x0000000000000008ULL /* afu_rc 0x21 */
 312 #define SISL_CTX_CAP_GSCSI_CMD         0x0000000000000004ULL /* afu_rc 0x21 */
 313 #define SISL_CTX_CAP_WRITE_CMD         0x0000000000000002ULL /* afu_rc 0x21 */
 314 #define SISL_CTX_CAP_READ_CMD          0x0000000000000001ULL /* afu_rc 0x21 */
 315         __be64 mbox_r;
 316         __be64 lisn_pasid[2];
 317         /* pasid _a arg must be ULL */
 318 #define SISL_LISN_PASID(_a, _b) (((_a) << 32) | (_b))
 319         __be64 lisn_ea[3];
 320 };
 321 
 322 /* single copy global regs */
 323 struct sisl_global_regs {
 324         __be64 aintr_status;
 325         /*
 326          * In cxlflash, FC port/link are arranged in port pairs, each
 327          * gets a byte of status:
 328          *
 329          *      *_OTHER:        other err, FC_ERRCAP[31:20]
 330          *      *_LOGO:         target sent FLOGI/PLOGI/LOGO while logged in
 331          *      *_CRC_T:        CRC threshold exceeded
 332          *      *_LOGI_R:       login state machine timed out and retrying
 333          *      *_LOGI_F:       login failed, FC_ERROR[19:0]
 334          *      *_LOGI_S:       login succeeded
 335          *      *_LINK_DN:      link online to offline
 336          *      *_LINK_UP:      link offline to online
 337          */
 338 #define SISL_ASTATUS_FC2_OTHER   0x80000000ULL /* b32 */
 339 #define SISL_ASTATUS_FC2_LOGO    0x40000000ULL /* b33 */
 340 #define SISL_ASTATUS_FC2_CRC_T   0x20000000ULL /* b34 */
 341 #define SISL_ASTATUS_FC2_LOGI_R  0x10000000ULL /* b35 */
 342 #define SISL_ASTATUS_FC2_LOGI_F  0x08000000ULL /* b36 */
 343 #define SISL_ASTATUS_FC2_LOGI_S  0x04000000ULL /* b37 */
 344 #define SISL_ASTATUS_FC2_LINK_DN 0x02000000ULL /* b38 */
 345 #define SISL_ASTATUS_FC2_LINK_UP 0x01000000ULL /* b39 */
 346 
 347 #define SISL_ASTATUS_FC3_OTHER   0x00800000ULL /* b40 */
 348 #define SISL_ASTATUS_FC3_LOGO    0x00400000ULL /* b41 */
 349 #define SISL_ASTATUS_FC3_CRC_T   0x00200000ULL /* b42 */
 350 #define SISL_ASTATUS_FC3_LOGI_R  0x00100000ULL /* b43 */
 351 #define SISL_ASTATUS_FC3_LOGI_F  0x00080000ULL /* b44 */
 352 #define SISL_ASTATUS_FC3_LOGI_S  0x00040000ULL /* b45 */
 353 #define SISL_ASTATUS_FC3_LINK_DN 0x00020000ULL /* b46 */
 354 #define SISL_ASTATUS_FC3_LINK_UP 0x00010000ULL /* b47 */
 355 
 356 #define SISL_ASTATUS_FC0_OTHER   0x00008000ULL /* b48 */
 357 #define SISL_ASTATUS_FC0_LOGO    0x00004000ULL /* b49 */
 358 #define SISL_ASTATUS_FC0_CRC_T   0x00002000ULL /* b50 */
 359 #define SISL_ASTATUS_FC0_LOGI_R  0x00001000ULL /* b51 */
 360 #define SISL_ASTATUS_FC0_LOGI_F  0x00000800ULL /* b52 */
 361 #define SISL_ASTATUS_FC0_LOGI_S  0x00000400ULL /* b53 */
 362 #define SISL_ASTATUS_FC0_LINK_DN 0x00000200ULL /* b54 */
 363 #define SISL_ASTATUS_FC0_LINK_UP 0x00000100ULL /* b55 */
 364 
 365 #define SISL_ASTATUS_FC1_OTHER   0x00000080ULL /* b56 */
 366 #define SISL_ASTATUS_FC1_LOGO    0x00000040ULL /* b57 */
 367 #define SISL_ASTATUS_FC1_CRC_T   0x00000020ULL /* b58 */
 368 #define SISL_ASTATUS_FC1_LOGI_R  0x00000010ULL /* b59 */
 369 #define SISL_ASTATUS_FC1_LOGI_F  0x00000008ULL /* b60 */
 370 #define SISL_ASTATUS_FC1_LOGI_S  0x00000004ULL /* b61 */
 371 #define SISL_ASTATUS_FC1_LINK_DN 0x00000002ULL /* b62 */
 372 #define SISL_ASTATUS_FC1_LINK_UP 0x00000001ULL /* b63 */
 373 
 374 #define SISL_FC_INTERNAL_UNMASK 0x0000000300000000ULL   /* 1 means unmasked */
 375 #define SISL_FC_INTERNAL_MASK   ~(SISL_FC_INTERNAL_UNMASK)
 376 #define SISL_FC_INTERNAL_SHIFT  32
 377 
 378 #define SISL_FC_SHUTDOWN_NORMAL         0x0000000000000010ULL
 379 #define SISL_FC_SHUTDOWN_ABRUPT         0x0000000000000020ULL
 380 
 381 #define SISL_STATUS_SHUTDOWN_ACTIVE     0x0000000000000010ULL
 382 #define SISL_STATUS_SHUTDOWN_COMPLETE   0x0000000000000020ULL
 383 
 384 #define SISL_ASTATUS_UNMASK     0xFFFFFFFFULL           /* 1 means unmasked */
 385 #define SISL_ASTATUS_MASK       ~(SISL_ASTATUS_UNMASK)  /* 1 means masked */
 386 
 387         __be64 aintr_clear;
 388         __be64 aintr_mask;
 389         __be64 afu_ctrl;
 390         __be64 afu_hb;
 391         __be64 afu_scratch_pad;
 392         __be64 afu_port_sel;
 393 #define SISL_AFUCONF_AR_IOARCB  0x4000ULL
 394 #define SISL_AFUCONF_AR_LXT     0x2000ULL
 395 #define SISL_AFUCONF_AR_RHT     0x1000ULL
 396 #define SISL_AFUCONF_AR_DATA    0x0800ULL
 397 #define SISL_AFUCONF_AR_RSRC    0x0400ULL
 398 #define SISL_AFUCONF_AR_IOASA   0x0200ULL
 399 #define SISL_AFUCONF_AR_RRQ     0x0100ULL
 400 /* Aggregate all Auto Retry Bits */
 401 #define SISL_AFUCONF_AR_ALL     (SISL_AFUCONF_AR_IOARCB|SISL_AFUCONF_AR_LXT| \
 402                                  SISL_AFUCONF_AR_RHT|SISL_AFUCONF_AR_DATA|   \
 403                                  SISL_AFUCONF_AR_RSRC|SISL_AFUCONF_AR_IOASA| \
 404                                  SISL_AFUCONF_AR_RRQ)
 405 #ifdef __BIG_ENDIAN
 406 #define SISL_AFUCONF_ENDIAN            0x0000ULL
 407 #else
 408 #define SISL_AFUCONF_ENDIAN            0x0020ULL
 409 #endif
 410 #define SISL_AFUCONF_MBOX_CLR_READ     0x0010ULL
 411         __be64 afu_config;
 412         __be64 rsvd[0xf8];
 413         __le64 afu_version;
 414         __be64 interface_version;
 415 #define SISL_INTVER_CAP_SHIFT                   16
 416 #define SISL_INTVER_MAJ_SHIFT                   8
 417 #define SISL_INTVER_CAP_MASK                    0xFFFFFFFF00000000ULL
 418 #define SISL_INTVER_MAJ_MASK                    0x00000000FFFF0000ULL
 419 #define SISL_INTVER_MIN_MASK                    0x000000000000FFFFULL
 420 #define SISL_INTVER_CAP_IOARRIN_CMD_MODE        0x800000000000ULL
 421 #define SISL_INTVER_CAP_SQ_CMD_MODE             0x400000000000ULL
 422 #define SISL_INTVER_CAP_RESERVED_CMD_MODE_A     0x200000000000ULL
 423 #define SISL_INTVER_CAP_RESERVED_CMD_MODE_B     0x100000000000ULL
 424 #define SISL_INTVER_CAP_LUN_PROVISION           0x080000000000ULL
 425 #define SISL_INTVER_CAP_AFU_DEBUG               0x040000000000ULL
 426 #define SISL_INTVER_CAP_OCXL_LISN               0x020000000000ULL
 427 };
 428 
 429 #define CXLFLASH_NUM_FC_PORTS_PER_BANK  2       /* fixed # of ports per bank */
 430 #define CXLFLASH_MAX_FC_BANKS           2       /* max # of banks supported */
 431 #define CXLFLASH_MAX_FC_PORTS   (CXLFLASH_NUM_FC_PORTS_PER_BANK *       \
 432                                  CXLFLASH_MAX_FC_BANKS)
 433 #define CXLFLASH_MAX_CONTEXT    512     /* number of contexts per AFU */
 434 #define CXLFLASH_NUM_VLUNS      512     /* number of vluns per AFU/port */
 435 #define CXLFLASH_NUM_REGS       512     /* number of registers per port */
 436 
 437 struct fc_port_bank {
 438         __be64 fc_port_regs[CXLFLASH_NUM_FC_PORTS_PER_BANK][CXLFLASH_NUM_REGS];
 439         __be64 fc_port_luns[CXLFLASH_NUM_FC_PORTS_PER_BANK][CXLFLASH_NUM_VLUNS];
 440 };
 441 
 442 struct sisl_global_map {
 443         union {
 444                 struct sisl_global_regs regs;
 445                 char page0[SIZE_4K];    /* page 0 */
 446         };
 447 
 448         char page1[SIZE_4K];    /* page 1 */
 449 
 450         struct fc_port_bank bank[CXLFLASH_MAX_FC_BANKS]; /* pages 2 - 9 */
 451 
 452         /* pages 10 - 15 are reserved */
 453 
 454 };
 455 
 456 /*
 457  * CXL Flash Memory Map
 458  *
 459  *      +-------------------------------+
 460  *      |    512 * 64 KB User MMIO      |
 461  *      |        (per context)          |
 462  *      |       User Accessible         |
 463  *      +-------------------------------+
 464  *      |    512 * 128 B per context    |
 465  *      |    Provisioning and Control   |
 466  *      |   Trusted Process accessible  |
 467  *      +-------------------------------+
 468  *      |         64 KB Global          |
 469  *      |   Trusted Process accessible  |
 470  *      +-------------------------------+
 471  */
 472 struct cxlflash_afu_map {
 473         union {
 474                 struct sisl_host_map host;
 475                 char harea[SIZE_64K];   /* 64KB each */
 476         } hosts[CXLFLASH_MAX_CONTEXT];
 477 
 478         union {
 479                 struct sisl_ctrl_map ctrl;
 480                 char carea[cache_line_size()];  /* 128B each */
 481         } ctrls[CXLFLASH_MAX_CONTEXT];
 482 
 483         union {
 484                 struct sisl_global_map global;
 485                 char garea[SIZE_64K];   /* 64KB single block */
 486         };
 487 };
 488 
 489 /*
 490  * LXT - LBA Translation Table
 491  * LXT control blocks
 492  */
 493 struct sisl_lxt_entry {
 494         u64 rlba_base;  /* bits 0:47 is base
 495                          * b48:55 is lun index
 496                          * b58:59 is write & read perms
 497                          * (if no perm, afu_rc=0x15)
 498                          * b60:63 is port_sel mask
 499                          */
 500 };
 501 
 502 /*
 503  * RHT - Resource Handle Table
 504  * Per the SISlite spec, RHT entries are to be 16-byte aligned
 505  */
 506 struct sisl_rht_entry {
 507         struct sisl_lxt_entry *lxt_start;
 508         u32 lxt_cnt;
 509         u16 rsvd;
 510         u8 fp;                  /* format & perm nibbles.
 511                                  * (if no perm, afu_rc=0x05)
 512                                  */
 513         u8 nmask;
 514 } __packed __aligned(16);
 515 
 516 struct sisl_rht_entry_f1 {
 517         u64 lun_id;
 518         union {
 519                 struct {
 520                         u8 valid;
 521                         u8 rsvd[5];
 522                         u8 fp;
 523                         u8 port_sel;
 524                 };
 525 
 526                 u64 dw;
 527         };
 528 } __packed __aligned(16);
 529 
 530 /* make the fp byte */
 531 #define SISL_RHT_FP(fmt, perm) (((fmt) << 4) | (perm))
 532 
 533 /* make the fp byte for a clone from a source fp and clone flags
 534  * flags must be only 2 LSB bits.
 535  */
 536 #define SISL_RHT_FP_CLONE(src_fp, cln_flags) ((src_fp) & (0xFC | (cln_flags)))
 537 
 538 #define RHT_PERM_READ  0x01U
 539 #define RHT_PERM_WRITE 0x02U
 540 #define RHT_PERM_RW    (RHT_PERM_READ | RHT_PERM_WRITE)
 541 
 542 /* extract the perm bits from a fp */
 543 #define SISL_RHT_PERM(fp) ((fp) & RHT_PERM_RW)
 544 
 545 #define PORT0  0x01U
 546 #define PORT1  0x02U
 547 #define PORT2  0x04U
 548 #define PORT3  0x08U
 549 #define PORT_MASK(_n)   ((1 << (_n)) - 1)
 550 
 551 /* AFU Sync Mode byte */
 552 #define AFU_LW_SYNC 0x0U
 553 #define AFU_HW_SYNC 0x1U
 554 #define AFU_GSYNC   0x2U
 555 
 556 /* Special Task Management Function CDB */
 557 #define TMF_LUN_RESET  0x1U
 558 #define TMF_CLEAR_ACA  0x2U
 559 
 560 #endif /* _SISLITE_H */

/* [<][>][^][v][top][bottom][index][help] */