Back to home page

OSCL-LXR

 
 

    


0001 /* SPDX-License-Identifier: GPL-2.0-or-later */
0002 /*
0003  * CXL Flash Device Driver
0004  *
0005  * Written by: Manoj N. Kumar <manoj@linux.vnet.ibm.com>, IBM Corporation
0006  *             Matthew R. Ochs <mrochs@linux.vnet.ibm.com>, IBM Corporation
0007  *
0008  * Copyright (C) 2015 IBM Corporation
0009  */
0010 
0011 #ifndef _SISLITE_H
0012 #define _SISLITE_H
0013 
0014 #include <linux/types.h>
0015 
0016 typedef u16 ctx_hndl_t;
0017 typedef u32 res_hndl_t;
0018 
0019 #define SIZE_4K     4096
0020 #define SIZE_64K    65536
0021 
0022 /*
0023  * IOARCB: 64 bytes, min 16 byte alignment required, host native endianness
0024  * except for SCSI CDB which remains big endian per SCSI standards.
0025  */
0026 struct sisl_ioarcb {
0027     u16 ctx_id;     /* ctx_hndl_t */
0028     u16 req_flags;
0029 #define SISL_REQ_FLAGS_RES_HNDL       0x8000U   /* bit 0 (MSB) */
0030 #define SISL_REQ_FLAGS_PORT_LUN_ID    0x0000U
0031 
0032 #define SISL_REQ_FLAGS_SUP_UNDERRUN   0x4000U   /* bit 1 */
0033 
0034 #define SISL_REQ_FLAGS_TIMEOUT_SECS   0x0000U   /* bits 8,9 */
0035 #define SISL_REQ_FLAGS_TIMEOUT_MSECS  0x0040U
0036 #define SISL_REQ_FLAGS_TIMEOUT_USECS  0x0080U
0037 #define SISL_REQ_FLAGS_TIMEOUT_CYCLES 0x00C0U
0038 
0039 #define SISL_REQ_FLAGS_TMF_CMD        0x0004u   /* bit 13 */
0040 
0041 #define SISL_REQ_FLAGS_AFU_CMD        0x0002U   /* bit 14 */
0042 
0043 #define SISL_REQ_FLAGS_HOST_WRITE     0x0001U   /* bit 15 (LSB) */
0044 #define SISL_REQ_FLAGS_HOST_READ      0x0000U
0045 
0046     union {
0047         u32 res_hndl;   /* res_hndl_t */
0048         u32 port_sel;   /* this is a selection mask:
0049                  * 0x1 -> port#0 can be selected,
0050                  * 0x2 -> port#1 can be selected.
0051                  * Can be bitwise ORed.
0052                  */
0053     };
0054     u64 lun_id;
0055     u32 data_len;       /* 4K for read/write */
0056     u32 ioadl_len;
0057     union {
0058         u64 data_ea;    /* min 16 byte aligned */
0059         u64 ioadl_ea;
0060     };
0061     u8 msi;         /* LISN to send on RRQ write */
0062 #define SISL_MSI_CXL_PFAULT        0    /* reserved for CXL page faults */
0063 #define SISL_MSI_SYNC_ERROR        1    /* recommended for AFU sync error */
0064 #define SISL_MSI_RRQ_UPDATED       2    /* recommended for IO completion */
0065 #define SISL_MSI_ASYNC_ERROR       3    /* master only - for AFU async error */
0066 
0067     u8 rrq;         /* 0 for a single RRQ */
0068     u16 timeout;        /* in units specified by req_flags */
0069     u32 rsvd1;
0070     u8 cdb[16];     /* must be in big endian */
0071 #define SISL_AFU_CMD_SYNC       0xC0    /* AFU sync command */
0072 #define SISL_AFU_CMD_LUN_PROVISION  0xD0    /* AFU LUN provision command */
0073 #define SISL_AFU_CMD_DEBUG      0xE0    /* AFU debug command */
0074 
0075 #define SISL_AFU_LUN_PROVISION_CREATE   0x00    /* LUN provision create type */
0076 #define SISL_AFU_LUN_PROVISION_DELETE   0x01    /* LUN provision delete type */
0077 
0078     union {
0079         u64 reserved;           /* Reserved for IOARRIN mode */
0080         struct sisl_ioasa *ioasa;   /* IOASA EA for SQ Mode */
0081     };
0082 } __packed;
0083 
0084 struct sisl_rc {
0085     u8 flags;
0086 #define SISL_RC_FLAGS_SENSE_VALID         0x80U
0087 #define SISL_RC_FLAGS_FCP_RSP_CODE_VALID  0x40U
0088 #define SISL_RC_FLAGS_OVERRUN             0x20U
0089 #define SISL_RC_FLAGS_UNDERRUN            0x10U
0090 
0091     u8 afu_rc;
0092 #define SISL_AFU_RC_RHT_INVALID           0x01U /* user error */
0093 #define SISL_AFU_RC_RHT_UNALIGNED         0x02U /* should never happen */
0094 #define SISL_AFU_RC_RHT_OUT_OF_BOUNDS     0x03u /* user error */
0095 #define SISL_AFU_RC_RHT_DMA_ERR           0x04u /* see afu_extra
0096                          * may retry if afu_retry is off
0097                          * possible on master exit
0098                          */
0099 #define SISL_AFU_RC_RHT_RW_PERM           0x05u /* no RW perms, user error */
0100 #define SISL_AFU_RC_LXT_UNALIGNED         0x12U /* should never happen */
0101 #define SISL_AFU_RC_LXT_OUT_OF_BOUNDS     0x13u /* user error */
0102 #define SISL_AFU_RC_LXT_DMA_ERR           0x14u /* see afu_extra
0103                          * may retry if afu_retry is off
0104                          * possible on master exit
0105                          */
0106 #define SISL_AFU_RC_LXT_RW_PERM           0x15u /* no RW perms, user error */
0107 
0108 #define SISL_AFU_RC_NOT_XLATE_HOST        0x1au /* possible if master exited */
0109 
0110     /* NO_CHANNELS means the FC ports selected by dest_port in
0111      * IOARCB or in the LXT entry are down when the AFU tried to select
0112      * a FC port. If the port went down on an active IO, it will set
0113      * fc_rc to =0x54(NOLOGI) or 0x57(LINKDOWN) instead.
0114      */
0115 #define SISL_AFU_RC_NO_CHANNELS           0x20U /* see afu_extra, may retry */
0116 #define SISL_AFU_RC_CAP_VIOLATION         0x21U /* either user error or
0117                          * afu reset/master restart
0118                          */
0119 #define SISL_AFU_RC_OUT_OF_DATA_BUFS      0x30U /* always retry */
0120 #define SISL_AFU_RC_DATA_DMA_ERR          0x31U /* see afu_extra
0121                          * may retry if afu_retry is off
0122                          */
0123 
0124     u8 scsi_rc;     /* SCSI status byte, retry as appropriate */
0125 #define SISL_SCSI_RC_CHECK                0x02U
0126 #define SISL_SCSI_RC_BUSY                 0x08u
0127 
0128     u8 fc_rc;       /* retry */
0129     /*
0130      * We should only see fc_rc=0x57 (LINKDOWN) or 0x54(NOLOGI) for
0131      * commands that are in flight when a link goes down or is logged out.
0132      * If the link is down or logged out before AFU selects the port, either
0133      * it will choose the other port or we will get afu_rc=0x20 (no_channel)
0134      * if there is no valid port to use.
0135      *
0136      * ABORTPEND/ABORTOK/ABORTFAIL/TGTABORT can be retried, typically these
0137      * would happen if a frame is dropped and something times out.
0138      * NOLOGI or LINKDOWN can be retried if the other port is up.
0139      * RESIDERR can be retried as well.
0140      *
0141      * ABORTFAIL might indicate that lots of frames are getting CRC errors.
0142      * So it maybe retried once and reset the link if it happens again.
0143      * The link can also be reset on the CRC error threshold interrupt.
0144      */
0145 #define SISL_FC_RC_ABORTPEND    0x52    /* exchange timeout or abort request */
0146 #define SISL_FC_RC_WRABORTPEND  0x53    /* due to write XFER_RDY invalid */
0147 #define SISL_FC_RC_NOLOGI   0x54    /* port not logged in, in-flight cmds */
0148 #define SISL_FC_RC_NOEXP    0x55    /* FC protocol error or HW bug */
0149 #define SISL_FC_RC_INUSE    0x56    /* tag already in use, HW bug */
0150 #define SISL_FC_RC_LINKDOWN 0x57    /* link down, in-flight cmds */
0151 #define SISL_FC_RC_ABORTOK  0x58    /* pending abort completed w/success */
0152 #define SISL_FC_RC_ABORTFAIL    0x59    /* pending abort completed w/fail */
0153 #define SISL_FC_RC_RESID    0x5A    /* ioasa underrun/overrun flags set */
0154 #define SISL_FC_RC_RESIDERR 0x5B    /* actual data len does not match SCSI
0155                      * reported len, possibly due to dropped
0156                      * frames
0157                      */
0158 #define SISL_FC_RC_TGTABORT 0x5C    /* command aborted by target */
0159 };
0160 
0161 #define SISL_SENSE_DATA_LEN     20  /* Sense data length         */
0162 #define SISL_WWID_DATA_LEN  16  /* WWID data length          */
0163 
0164 /*
0165  * IOASA: 64 bytes & must follow IOARCB, min 16 byte alignment required,
0166  * host native endianness
0167  */
0168 struct sisl_ioasa {
0169     union {
0170         struct sisl_rc rc;
0171         u32 ioasc;
0172 #define SISL_IOASC_GOOD_COMPLETION        0x00000000U
0173     };
0174 
0175     union {
0176         u32 resid;
0177         u32 lunid_hi;
0178     };
0179 
0180     u8 port;
0181     u8 afu_extra;
0182     /* when afu_rc=0x04, 0x14, 0x31 (_xxx_DMA_ERR):
0183      * afu_exta contains PSL response code. Useful codes are:
0184      */
0185 #define SISL_AFU_DMA_ERR_PAGE_IN    0x0A    /* AFU_retry_on_pagein Action
0186                          *  Enabled            N/A
0187                          *  Disabled           retry
0188                          */
0189 #define SISL_AFU_DMA_ERR_INVALID_EA 0x0B    /* this is a hard error
0190                          * afu_rc   Implies
0191                          * 0x04, 0x14   master exit.
0192                          * 0x31         user error.
0193                          */
0194     /* when afu rc=0x20 (no channels):
0195      * afu_extra bits [4:5]: available portmask,  [6:7]: requested portmask.
0196      */
0197 #define SISL_AFU_NO_CLANNELS_AMASK(afu_extra) (((afu_extra) & 0x0C) >> 2)
0198 #define SISL_AFU_NO_CLANNELS_RMASK(afu_extra) ((afu_extra) & 0x03)
0199 
0200     u8 scsi_extra;
0201     u8 fc_extra;
0202 
0203     union {
0204         u8 sense_data[SISL_SENSE_DATA_LEN];
0205         struct {
0206             u32 lunid_lo;
0207             u8 wwid[SISL_WWID_DATA_LEN];
0208         };
0209     };
0210 
0211     /* These fields are defined by the SISlite architecture for the
0212      * host to use as they see fit for their implementation.
0213      */
0214     union {
0215         u64 host_use[4];
0216         u8 host_use_b[32];
0217     };
0218 } __packed;
0219 
0220 #define SISL_RESP_HANDLE_T_BIT        0x1ULL    /* Toggle bit */
0221 
0222 /* MMIO space is required to support only 64-bit access */
0223 
0224 /*
0225  * This AFU has two mechanisms to deal with endian-ness.
0226  * One is a global configuration (in the afu_config) register
0227  * below that specifies the endian-ness of the host.
0228  * The other is a per context (i.e. application) specification
0229  * controlled by the endian_ctrl field here. Since the master
0230  * context is one such application the master context's
0231  * endian-ness is set to be the same as the host.
0232  *
0233  * As per the SISlite spec, the MMIO registers are always
0234  * big endian.
0235  */
0236 #define SISL_ENDIAN_CTRL_BE           0x8000000000000080ULL
0237 #define SISL_ENDIAN_CTRL_LE           0x0000000000000000ULL
0238 
0239 #ifdef __BIG_ENDIAN
0240 #define SISL_ENDIAN_CTRL              SISL_ENDIAN_CTRL_BE
0241 #else
0242 #define SISL_ENDIAN_CTRL              SISL_ENDIAN_CTRL_LE
0243 #endif
0244 
0245 /* per context host transport MMIO  */
0246 struct sisl_host_map {
0247     __be64 endian_ctrl; /* Per context Endian Control. The AFU will
0248                  * operate on whatever the context is of the
0249                  * host application.
0250                  */
0251 
0252     __be64 intr_status; /* this sends LISN# programmed in ctx_ctrl.
0253                  * Only recovery in a PERM_ERR is a context
0254                  * exit since there is no way to tell which
0255                  * command caused the error.
0256                  */
0257 #define SISL_ISTATUS_PERM_ERR_LISN_3_EA     0x0400ULL /* b53, user error */
0258 #define SISL_ISTATUS_PERM_ERR_LISN_2_EA     0x0200ULL /* b54, user error */
0259 #define SISL_ISTATUS_PERM_ERR_LISN_1_EA     0x0100ULL /* b55, user error */
0260 #define SISL_ISTATUS_PERM_ERR_LISN_3_PASID  0x0080ULL /* b56, user error */
0261 #define SISL_ISTATUS_PERM_ERR_LISN_2_PASID  0x0040ULL /* b57, user error */
0262 #define SISL_ISTATUS_PERM_ERR_LISN_1_PASID  0x0020ULL /* b58, user error */
0263 #define SISL_ISTATUS_PERM_ERR_CMDROOM       0x0010ULL /* b59, user error */
0264 #define SISL_ISTATUS_PERM_ERR_RCB_READ      0x0008ULL /* b60, user error */
0265 #define SISL_ISTATUS_PERM_ERR_SA_WRITE      0x0004ULL /* b61, user error */
0266 #define SISL_ISTATUS_PERM_ERR_RRQ_WRITE     0x0002ULL /* b62, user error */
0267     /* Page in wait accessing RCB/IOASA/RRQ is reported in b63.
0268      * Same error in data/LXT/RHT access is reported via IOASA.
0269      */
0270 #define SISL_ISTATUS_TEMP_ERR_PAGEIN        0x0001ULL /* b63, can only be
0271                                * generated when AFU
0272                                * auto retry is
0273                                * disabled. If user
0274                                * can determine the
0275                                * command that caused
0276                                * the error, it can
0277                                * be retried.
0278                                */
0279 #define SISL_ISTATUS_UNMASK (0x07FFULL)     /* 1 means unmasked */
0280 #define SISL_ISTATUS_MASK   ~(SISL_ISTATUS_UNMASK)  /* 1 means masked */
0281 
0282     __be64 intr_clear;
0283     __be64 intr_mask;
0284     __be64 ioarrin;     /* only write what cmd_room permits */
0285     __be64 rrq_start;   /* start & end are both inclusive */
0286     __be64 rrq_end;     /* write sequence: start followed by end */
0287     __be64 cmd_room;
0288     __be64 ctx_ctrl;    /* least significant byte or b56:63 is LISN# */
0289 #define SISL_CTX_CTRL_UNMAP_SECTOR  0x8000000000000000ULL /* b0 */
0290 #define SISL_CTX_CTRL_LISN_MASK     (0xFFULL)
0291     __be64 mbox_w;      /* restricted use */
0292     __be64 sq_start;    /* Submission Queue (R/W): write sequence and */
0293     __be64 sq_end;      /* inclusion semantics are the same as RRQ    */
0294     __be64 sq_head;     /* Submission Queue Head (R): for debugging   */
0295     __be64 sq_tail;     /* Submission Queue TAIL (R/W): next IOARCB   */
0296     __be64 sq_ctx_reset;    /* Submission Queue Context Reset (R/W)       */
0297 };
0298 
0299 /* per context provisioning & control MMIO */
0300 struct sisl_ctrl_map {
0301     __be64 rht_start;
0302     __be64 rht_cnt_id;
0303     /* both cnt & ctx_id args must be ULL */
0304 #define SISL_RHT_CNT_ID(cnt, ctx_id)  (((cnt) << 48) | ((ctx_id) << 32))
0305 
0306     __be64 ctx_cap; /* afu_rc below is when the capability is violated */
0307 #define SISL_CTX_CAP_PROXY_ISSUE       0x8000000000000000ULL /* afu_rc 0x21 */
0308 #define SISL_CTX_CAP_REAL_MODE         0x4000000000000000ULL /* afu_rc 0x21 */
0309 #define SISL_CTX_CAP_HOST_XLATE        0x2000000000000000ULL /* afu_rc 0x1a */
0310 #define SISL_CTX_CAP_PROXY_TARGET      0x1000000000000000ULL /* afu_rc 0x21 */
0311 #define SISL_CTX_CAP_AFU_CMD           0x0000000000000008ULL /* afu_rc 0x21 */
0312 #define SISL_CTX_CAP_GSCSI_CMD         0x0000000000000004ULL /* afu_rc 0x21 */
0313 #define SISL_CTX_CAP_WRITE_CMD         0x0000000000000002ULL /* afu_rc 0x21 */
0314 #define SISL_CTX_CAP_READ_CMD          0x0000000000000001ULL /* afu_rc 0x21 */
0315     __be64 mbox_r;
0316     __be64 lisn_pasid[2];
0317     /* pasid _a arg must be ULL */
0318 #define SISL_LISN_PASID(_a, _b) (((_a) << 32) | (_b))
0319     __be64 lisn_ea[3];
0320 };
0321 
0322 /* single copy global regs */
0323 struct sisl_global_regs {
0324     __be64 aintr_status;
0325     /*
0326      * In cxlflash, FC port/link are arranged in port pairs, each
0327      * gets a byte of status:
0328      *
0329      *  *_OTHER:    other err, FC_ERRCAP[31:20]
0330      *  *_LOGO:     target sent FLOGI/PLOGI/LOGO while logged in
0331      *  *_CRC_T:    CRC threshold exceeded
0332      *  *_LOGI_R:   login state machine timed out and retrying
0333      *  *_LOGI_F:   login failed, FC_ERROR[19:0]
0334      *  *_LOGI_S:   login succeeded
0335      *  *_LINK_DN:  link online to offline
0336      *  *_LINK_UP:  link offline to online
0337      */
0338 #define SISL_ASTATUS_FC2_OTHER   0x80000000ULL /* b32 */
0339 #define SISL_ASTATUS_FC2_LOGO    0x40000000ULL /* b33 */
0340 #define SISL_ASTATUS_FC2_CRC_T   0x20000000ULL /* b34 */
0341 #define SISL_ASTATUS_FC2_LOGI_R  0x10000000ULL /* b35 */
0342 #define SISL_ASTATUS_FC2_LOGI_F  0x08000000ULL /* b36 */
0343 #define SISL_ASTATUS_FC2_LOGI_S  0x04000000ULL /* b37 */
0344 #define SISL_ASTATUS_FC2_LINK_DN 0x02000000ULL /* b38 */
0345 #define SISL_ASTATUS_FC2_LINK_UP 0x01000000ULL /* b39 */
0346 
0347 #define SISL_ASTATUS_FC3_OTHER   0x00800000ULL /* b40 */
0348 #define SISL_ASTATUS_FC3_LOGO    0x00400000ULL /* b41 */
0349 #define SISL_ASTATUS_FC3_CRC_T   0x00200000ULL /* b42 */
0350 #define SISL_ASTATUS_FC3_LOGI_R  0x00100000ULL /* b43 */
0351 #define SISL_ASTATUS_FC3_LOGI_F  0x00080000ULL /* b44 */
0352 #define SISL_ASTATUS_FC3_LOGI_S  0x00040000ULL /* b45 */
0353 #define SISL_ASTATUS_FC3_LINK_DN 0x00020000ULL /* b46 */
0354 #define SISL_ASTATUS_FC3_LINK_UP 0x00010000ULL /* b47 */
0355 
0356 #define SISL_ASTATUS_FC0_OTHER   0x00008000ULL /* b48 */
0357 #define SISL_ASTATUS_FC0_LOGO    0x00004000ULL /* b49 */
0358 #define SISL_ASTATUS_FC0_CRC_T   0x00002000ULL /* b50 */
0359 #define SISL_ASTATUS_FC0_LOGI_R  0x00001000ULL /* b51 */
0360 #define SISL_ASTATUS_FC0_LOGI_F  0x00000800ULL /* b52 */
0361 #define SISL_ASTATUS_FC0_LOGI_S  0x00000400ULL /* b53 */
0362 #define SISL_ASTATUS_FC0_LINK_DN 0x00000200ULL /* b54 */
0363 #define SISL_ASTATUS_FC0_LINK_UP 0x00000100ULL /* b55 */
0364 
0365 #define SISL_ASTATUS_FC1_OTHER   0x00000080ULL /* b56 */
0366 #define SISL_ASTATUS_FC1_LOGO    0x00000040ULL /* b57 */
0367 #define SISL_ASTATUS_FC1_CRC_T   0x00000020ULL /* b58 */
0368 #define SISL_ASTATUS_FC1_LOGI_R  0x00000010ULL /* b59 */
0369 #define SISL_ASTATUS_FC1_LOGI_F  0x00000008ULL /* b60 */
0370 #define SISL_ASTATUS_FC1_LOGI_S  0x00000004ULL /* b61 */
0371 #define SISL_ASTATUS_FC1_LINK_DN 0x00000002ULL /* b62 */
0372 #define SISL_ASTATUS_FC1_LINK_UP 0x00000001ULL /* b63 */
0373 
0374 #define SISL_FC_INTERNAL_UNMASK 0x0000000300000000ULL   /* 1 means unmasked */
0375 #define SISL_FC_INTERNAL_MASK   ~(SISL_FC_INTERNAL_UNMASK)
0376 #define SISL_FC_INTERNAL_SHIFT  32
0377 
0378 #define SISL_FC_SHUTDOWN_NORMAL     0x0000000000000010ULL
0379 #define SISL_FC_SHUTDOWN_ABRUPT     0x0000000000000020ULL
0380 
0381 #define SISL_STATUS_SHUTDOWN_ACTIVE 0x0000000000000010ULL
0382 #define SISL_STATUS_SHUTDOWN_COMPLETE   0x0000000000000020ULL
0383 
0384 #define SISL_ASTATUS_UNMASK 0xFFFFFFFFULL       /* 1 means unmasked */
0385 #define SISL_ASTATUS_MASK   ~(SISL_ASTATUS_UNMASK)  /* 1 means masked */
0386 
0387     __be64 aintr_clear;
0388     __be64 aintr_mask;
0389     __be64 afu_ctrl;
0390     __be64 afu_hb;
0391     __be64 afu_scratch_pad;
0392     __be64 afu_port_sel;
0393 #define SISL_AFUCONF_AR_IOARCB  0x4000ULL
0394 #define SISL_AFUCONF_AR_LXT 0x2000ULL
0395 #define SISL_AFUCONF_AR_RHT 0x1000ULL
0396 #define SISL_AFUCONF_AR_DATA    0x0800ULL
0397 #define SISL_AFUCONF_AR_RSRC    0x0400ULL
0398 #define SISL_AFUCONF_AR_IOASA   0x0200ULL
0399 #define SISL_AFUCONF_AR_RRQ 0x0100ULL
0400 /* Aggregate all Auto Retry Bits */
0401 #define SISL_AFUCONF_AR_ALL (SISL_AFUCONF_AR_IOARCB|SISL_AFUCONF_AR_LXT| \
0402                  SISL_AFUCONF_AR_RHT|SISL_AFUCONF_AR_DATA|   \
0403                  SISL_AFUCONF_AR_RSRC|SISL_AFUCONF_AR_IOASA| \
0404                  SISL_AFUCONF_AR_RRQ)
0405 #ifdef __BIG_ENDIAN
0406 #define SISL_AFUCONF_ENDIAN            0x0000ULL
0407 #else
0408 #define SISL_AFUCONF_ENDIAN            0x0020ULL
0409 #endif
0410 #define SISL_AFUCONF_MBOX_CLR_READ     0x0010ULL
0411     __be64 afu_config;
0412     __be64 rsvd[0xf8];
0413     __le64 afu_version;
0414     __be64 interface_version;
0415 #define SISL_INTVER_CAP_SHIFT           16
0416 #define SISL_INTVER_MAJ_SHIFT           8
0417 #define SISL_INTVER_CAP_MASK            0xFFFFFFFF00000000ULL
0418 #define SISL_INTVER_MAJ_MASK            0x00000000FFFF0000ULL
0419 #define SISL_INTVER_MIN_MASK            0x000000000000FFFFULL
0420 #define SISL_INTVER_CAP_IOARRIN_CMD_MODE    0x800000000000ULL
0421 #define SISL_INTVER_CAP_SQ_CMD_MODE     0x400000000000ULL
0422 #define SISL_INTVER_CAP_RESERVED_CMD_MODE_A 0x200000000000ULL
0423 #define SISL_INTVER_CAP_RESERVED_CMD_MODE_B 0x100000000000ULL
0424 #define SISL_INTVER_CAP_LUN_PROVISION       0x080000000000ULL
0425 #define SISL_INTVER_CAP_AFU_DEBUG       0x040000000000ULL
0426 #define SISL_INTVER_CAP_OCXL_LISN       0x020000000000ULL
0427 };
0428 
0429 #define CXLFLASH_NUM_FC_PORTS_PER_BANK  2   /* fixed # of ports per bank */
0430 #define CXLFLASH_MAX_FC_BANKS       2   /* max # of banks supported */
0431 #define CXLFLASH_MAX_FC_PORTS   (CXLFLASH_NUM_FC_PORTS_PER_BANK *   \
0432                  CXLFLASH_MAX_FC_BANKS)
0433 #define CXLFLASH_MAX_CONTEXT    512 /* number of contexts per AFU */
0434 #define CXLFLASH_NUM_VLUNS  512 /* number of vluns per AFU/port */
0435 #define CXLFLASH_NUM_REGS   512 /* number of registers per port */
0436 
0437 struct fc_port_bank {
0438     __be64 fc_port_regs[CXLFLASH_NUM_FC_PORTS_PER_BANK][CXLFLASH_NUM_REGS];
0439     __be64 fc_port_luns[CXLFLASH_NUM_FC_PORTS_PER_BANK][CXLFLASH_NUM_VLUNS];
0440 };
0441 
0442 struct sisl_global_map {
0443     union {
0444         struct sisl_global_regs regs;
0445         char page0[SIZE_4K];    /* page 0 */
0446     };
0447 
0448     char page1[SIZE_4K];    /* page 1 */
0449 
0450     struct fc_port_bank bank[CXLFLASH_MAX_FC_BANKS]; /* pages 2 - 9 */
0451 
0452     /* pages 10 - 15 are reserved */
0453 
0454 };
0455 
0456 /*
0457  * CXL Flash Memory Map
0458  *
0459  *  +-------------------------------+
0460  *  |    512 * 64 KB User MMIO      |
0461  *  |        (per context)          |
0462  *  |       User Accessible         |
0463  *  +-------------------------------+
0464  *  |    512 * 128 B per context    |
0465  *  |    Provisioning and Control   |
0466  *  |   Trusted Process accessible  |
0467  *  +-------------------------------+
0468  *  |         64 KB Global          |
0469  *  |   Trusted Process accessible  |
0470  *  +-------------------------------+
0471  */
0472 struct cxlflash_afu_map {
0473     union {
0474         struct sisl_host_map host;
0475         char harea[SIZE_64K];   /* 64KB each */
0476     } hosts[CXLFLASH_MAX_CONTEXT];
0477 
0478     union {
0479         struct sisl_ctrl_map ctrl;
0480         char carea[cache_line_size()];  /* 128B each */
0481     } ctrls[CXLFLASH_MAX_CONTEXT];
0482 
0483     union {
0484         struct sisl_global_map global;
0485         char garea[SIZE_64K];   /* 64KB single block */
0486     };
0487 };
0488 
0489 /*
0490  * LXT - LBA Translation Table
0491  * LXT control blocks
0492  */
0493 struct sisl_lxt_entry {
0494     u64 rlba_base;  /* bits 0:47 is base
0495              * b48:55 is lun index
0496              * b58:59 is write & read perms
0497              * (if no perm, afu_rc=0x15)
0498              * b60:63 is port_sel mask
0499              */
0500 };
0501 
0502 /*
0503  * RHT - Resource Handle Table
0504  * Per the SISlite spec, RHT entries are to be 16-byte aligned
0505  */
0506 struct sisl_rht_entry {
0507     struct sisl_lxt_entry *lxt_start;
0508     u32 lxt_cnt;
0509     u16 rsvd;
0510     u8 fp;          /* format & perm nibbles.
0511                  * (if no perm, afu_rc=0x05)
0512                  */
0513     u8 nmask;
0514 } __packed __aligned(16);
0515 
0516 struct sisl_rht_entry_f1 {
0517     u64 lun_id;
0518     union {
0519         struct {
0520             u8 valid;
0521             u8 rsvd[5];
0522             u8 fp;
0523             u8 port_sel;
0524         };
0525 
0526         u64 dw;
0527     };
0528 } __packed __aligned(16);
0529 
0530 /* make the fp byte */
0531 #define SISL_RHT_FP(fmt, perm) (((fmt) << 4) | (perm))
0532 
0533 /* make the fp byte for a clone from a source fp and clone flags
0534  * flags must be only 2 LSB bits.
0535  */
0536 #define SISL_RHT_FP_CLONE(src_fp, cln_flags) ((src_fp) & (0xFC | (cln_flags)))
0537 
0538 #define RHT_PERM_READ  0x01U
0539 #define RHT_PERM_WRITE 0x02U
0540 #define RHT_PERM_RW    (RHT_PERM_READ | RHT_PERM_WRITE)
0541 
0542 /* extract the perm bits from a fp */
0543 #define SISL_RHT_PERM(fp) ((fp) & RHT_PERM_RW)
0544 
0545 #define PORT0  0x01U
0546 #define PORT1  0x02U
0547 #define PORT2  0x04U
0548 #define PORT3  0x08U
0549 #define PORT_MASK(_n)   ((1 << (_n)) - 1)
0550 
0551 /* AFU Sync Mode byte */
0552 #define AFU_LW_SYNC 0x0U
0553 #define AFU_HW_SYNC 0x1U
0554 #define AFU_GSYNC   0x2U
0555 
0556 /* Special Task Management Function CDB */
0557 #define TMF_LUN_RESET  0x1U
0558 #define TMF_CLEAR_ACA  0x2U
0559 
0560 #endif /* _SISLITE_H */