linux/drivers/scsi/cxlflash/sislite.h
<<
>>
Prefs
   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
  16typedef u16 ctx_hndl_t;
  17typedef 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 */
  26struct 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
  84struct 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 */
 168struct 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  */
 246struct 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 */
 300struct 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 */
 323struct 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
 437struct 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
 442struct 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 */
 472struct 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 */
 493struct 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 */
 506struct 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
 516struct 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 */
 561