1 /*
   2  * ld_pd_map.h
   3  *
   4  * Solaris MegaRAID device driver for SAS2.0 controllers
   5  * Copyright (c) 2008-2012, LSI Logic Corporation.
   6  * All rights reserved.
   7  *
   8  * Version:
   9  * Author:
  10  *              Swaminathan K S
  11  *              Arun Chandrashekhar
  12  *              Manju R
  13  *              Rasheed
  14  *              Shakeel Bukhari
  15  */
  16 
  17 #ifndef INCLUDE_LD_PD_MAP
  18 #define INCLUDE_LD_PD_MAP
  19 #include <sys/scsi/scsi.h>
  20 #include "fusion.h"
  21 
  22 /* raid->write_mode; raid->read_ahead; dcmd->state */
  23 /* Write through */
  24 #define WRITE_THROUGH                           0
  25 /* Delayed Write */
  26 #define WRITE_BACK                              1
  27 
  28 /* SCSI CDB definitions */
  29 #define READ_6          0x08
  30 #define READ_16         0x88
  31 #define READ_10         0x28
  32 #define READ_12         0xA8
  33 #define WRITE_16        0x8A
  34 #define WRITE_10        0x2A
  35 
  36 // maximum disks per array
  37 #define MAX_ROW_SIZE                            32
  38 // maximum spans per logical drive
  39 #define MAX_SPAN_DEPTH                          8
  40 #define MEGASAS_LOAD_BALANCE_FLAG               0x1
  41 #define MR_DEFAULT_IO_TIMEOUT   20
  42 
  43 
  44 union desc_value {
  45         U64 word;
  46         struct {
  47                 U32 low;
  48                 U32 high;
  49         } u1;
  50 };
  51 
  52 typedef struct _LD_LOAD_BALANCE_INFO
  53 {
  54     U8      loadBalanceFlag;
  55     U8      reserved1;
  56     U16     raid1DevHandle[2];
  57     U16     scsi_pending_cmds[2];
  58     U64     last_accessed_block[2];
  59 } LD_LOAD_BALANCE_INFO, *PLD_LOAD_BALANCE_INFO;
  60 
  61 #pragma pack(1)
  62 typedef struct _MR_FW_RAID_MAP_ALL {
  63         MR_FW_RAID_MAP raidMap;
  64         MR_LD_SPAN_MAP ldSpanMap[MAX_LOGICAL_DRIVES - 1];
  65 } MR_FW_RAID_MAP_ALL;
  66 
  67 /*
  68  * Raid Context structure which describes MegaRAID specific IO Paramenters
  69  * This resides at offset 0x60 where the SGL normally starts in MPT IO Frames
  70  */
  71 typedef struct _MPI2_SCSI_IO_VENDOR_UNIQUE {
  72         U8              nsegType;                       // 0x00 nseg[7:4], Type[3:0] */
  73         U8              resvd0;                         // 0x01
  74     U16     timeoutValue;       /* 0x02 -0x03  */
  75     U8      regLockFlags;       /* 0x04        */
  76     U8      reservedForHw1;     /* 0x05        */
  77     U16     ldTargetId;         /* 0x06 - 0x07 */
  78     U64     regLockRowLBA;      /* 0x08 - 0x0F */
  79     U32     regLockLength;      /* 0x10 - 0x13 */
  80     U16     nextLMId;           /* 0x14 - 0x15 */
  81     U8      extStatus;          /* 0x16        */
  82     U8      status;             /* 0x17 status */
  83     U8      RAIDFlags;          /* 0x18 resvd[7:6], ioSubType[5:4], resvd[3:1], preferredCpu[0] */
  84     U8      numSGE;             /* 0x19 numSge; not including chain entries*/
  85     U16     configSeqNum;       /* 0x1A -0x1B */
  86     U8      spanArm;            /* 0x1C span[7:5], arm[4:0] */
  87     U8      resvd2[3];          /* 0x1D-0x1f */
  88 } MPI2_SCSI_IO_VENDOR_UNIQUE, MPI25_SCSI_IO_VENDOR_UNIQUE;
  89 
  90 #define RAID_CTX_SPANARM_ARM_SHIFT      (0)
  91 #define RAID_CTX_SPANARM_ARM_MASK       (0x1f)
  92 
  93 #define RAID_CTX_SPANARM_SPAN_SHIFT     (5)
  94 #define RAID_CTX_SPANARM_SPAN_MASK      (0xE0)
  95 
  96 
  97 /*
  98  * RAID SCSI IO Request Message
  99  * Total SGE count will be one less
 100  * than  _MPI2_SCSI_IO_REQUEST
 101  */
 102 typedef struct _MPI2_RAID_SCSI_IO_REQUEST
 103 {
 104         uint16_t                DevHandle;                      /* 0x00 */
 
 122         uint32_t                DataLength;                     /* 0x1C */
 123         uint32_t                BidirectionalDataLength;        /* 0x20 */
 124         uint16_t                IoFlags;                        /* 0x24 */
 125         uint16_t                EEDPFlags;                      /* 0x26 */
 126         uint32_t                EEDPBlockSize;                  /* 0x28 */
 127         uint32_t                SecondaryReferenceTag;          /* 0x2C */
 128         uint16_t                SecondaryApplicationTag;        /* 0x30 */
 129         uint16_t                ApplicationTagTranslationMask;  /* 0x32 */
 130         uint8_t                 LUN[8];                         /* 0x34 */
 131         uint32_t                Control;                        /* 0x3C */
 132         Mpi2ScsiIoCdb_t         CDB;                            /* 0x40 */
 133         MPI2_SCSI_IO_VENDOR_UNIQUE              RaidContext;                    /* 0x60 */
 134         Mpi2SGEIOUnion_t        SGL; /* 0x80 */
 135 } MPI2_RAID_SCSI_IO_REQUEST, MPI2_POINTER PTR_MPI2_RAID_SCSI_IO_REQUEST,
 136 Mpi2RaidSCSIIORequest_t, MPI2_POINTER pMpi2RaidSCSIIORequest_t;
 137 
 138 /*
 139  * define region lock types
 140  */
 141 typedef enum    _REGION_TYPE {
 142         REGION_TYPE_UNUSED      = 0,    // lock is currently not active
 143         REGION_TYPE_SHARED_READ = 1,    // shared lock (for reads)
 144         REGION_TYPE_SHARED_WRITE = 2,
 145         REGION_TYPE_EXCLUSIVE   = 3,    // exclusive lock (for writes)
 146 } REGION_TYPE;
 147 
 148 
 149 #define DM_PATH_MAXPATH         2
 150 #define DM_PATH_FIRSTPATH       0
 151 #define DM_PATH_SECONDPATH      1
 152 
 153 // declare valid Region locking values
 154 typedef enum _REGION_LOCK {
 155         REGION_LOCK_BYPASS              = 0,
 156         // for RAID 6 single-drive failure
 157         REGION_LOCK_UNCOND_SHARED_READ  = 1,
 158         REGION_LOCK_UNCOND_SHARED_WRITE = 2,
 159         REGION_LOCK_UNCOND_SHARED_OTHER = 3,
 160         REGION_LOCK_UNCOND_SHARED_EXCLUSIVE = 0xFF
 161 } REGION_LOCK;
 162 
 163 
 164 struct mrsas_init_frame2 {
 165         uint8_t cmd;                            /* 00h */
 166         uint8_t reserved_0;                     /* 01h */
 167         uint8_t cmd_status;                     /* 02h */
 168 
 169         uint8_t reserved_1;                     /* 03h */
 170         uint32_t reserved_2;                    /* 04h */
 171 
 172         uint32_t context;                       /* 08h */
 173         uint32_t pad_0;                         /* 0Ch */
 174 
 175         uint16_t flags;                         /* 10h */
 176         uint16_t reserved_3;                    /* 12h */
 
 208 /* union of Request Descriptors */
 209 typedef union _MRSAS_REQUEST_DESCRIPTOR_UNION
 210 {
 211         MPI2_DEFAULT_REQUEST_DESCRIPTOR         Default;
 212         MPI2_HIGH_PRIORITY_REQUEST_DESCRIPTOR   HighPriority;
 213         MPI2_SCSI_IO_REQUEST_DESCRIPTOR         SCSIIO;
 214         MPI2_SCSI_TARGET_REQUEST_DESCRIPTOR     SCSITarget;
 215         MPI2_RAID_ACCEL_REQUEST_DESCRIPTOR      RAIDAccelerator;
 216         MR_RAID_MFA_IO_REQUEST_DESCRIPTOR       MFAIo;
 217         U64 Words;
 218 } MRSAS_REQUEST_DESCRIPTOR_UNION;
 219 
 220 #pragma pack()
 221 
 222 enum {
 223         MRSAS_SCSI_VARIABLE_LENGTH_CMD          = 0x7F,
 224         MRSAS_SCSI_SERVICE_ACTION_READ32        = 0x9,
 225         MRSAS_SCSI_SERVICE_ACTION_WRITE32       = 0xB,
 226         MRSAS_SCSI_ADDL_CDB_LEN                 = 0x18,
 227         MRSAS_RD_WR_PROTECT                     = 0x20,
 228         MRSAS_EEDPBLOCKSIZE                     = 512,
 229 };
 230 
 231 
 232 #define IEEE_SGE_FLAGS_ADDR_MASK        (0x03)
 233 #define IEEE_SGE_FLAGS_SYSTEM_ADDR      (0x00)
 234 #define IEEE_SGE_FLAGS_IOCDDR_ADDR      (0x01)
 235 #define IEEE_SGE_FLAGS_IOCPLB_ADDR      (0x02)
 236 #define IEEE_SGE_FLAGS_IOCPLBNTA_ADDR   (0x03)
 237 #define IEEE_SGE_FLAGS_CHAIN_ELEMENT    (0x80)
 238 #define IEEE_SGE_FLAGS_END_OF_LIST      (0x40)
 239 
 240 
 241 U8      MR_ValidateMapInfo(MR_FW_RAID_MAP_ALL *map, PLD_LOAD_BALANCE_INFO lbInfo);
 242 U16     MR_CheckDIF(U32, MR_FW_RAID_MAP_ALL *);
 243 #endif // INCLUDE_LD_PD_MAP
 | 
   1 /*
   2  * ld_pd_map.h
   3  *
   4  * Solaris MegaRAID device driver for SAS2.0 controllers
   5  * Copyright (c) 2008-2012, LSI Logic Corporation.
   6  * All rights reserved.
   7  *
   8  * Version:
   9  * Author:
  10  *              Swaminathan K S
  11  *              Arun Chandrashekhar
  12  *              Manju R
  13  *              Rasheed
  14  *              Shakeel Bukhari
  15  */
  16 
  17 #ifndef _LD_PD_MAP
  18 #define _LD_PD_MAP
  19 #include <sys/scsi/scsi.h>
  20 #include "fusion.h"
  21 
  22 struct mrsas_instance;  /* This will be defined in mr_sas.h */
  23 
  24 /* raid->write_mode; raid->read_ahead; dcmd->state */
  25 /* Write through */
  26 #define WRITE_THROUGH                           0
  27 /* Delayed Write */
  28 #define WRITE_BACK                              1
  29 
  30 /* SCSI CDB definitions */
  31 #define READ_6          0x08
  32 #define READ_16         0x88
  33 #define READ_10         0x28
  34 #define READ_12         0xA8
  35 #define WRITE_16        0x8A
  36 #define WRITE_10        0x2A
  37 
  38 /* maximum disks per array */
  39 #define MAX_ROW_SIZE                            32
  40 /* maximum spans per logical drive */
  41 #define MAX_SPAN_DEPTH                          8
  42 #define MEGASAS_LOAD_BALANCE_FLAG               0x1
  43 #define MR_DEFAULT_IO_TIMEOUT   20
  44 
  45 
  46 union desc_value {
  47         U64 word;
  48         struct {
  49                 U32 low;
  50                 U32 high;
  51         } u1;
  52 };
  53 
  54 typedef struct _LD_LOAD_BALANCE_INFO
  55 {
  56     U8      loadBalanceFlag;
  57     U8      reserved1;
  58     U16     raid1DevHandle[2];
  59     U16     scsi_pending_cmds[2];
  60     U64     last_accessed_block[2];
  61 } LD_LOAD_BALANCE_INFO, *PLD_LOAD_BALANCE_INFO;
  62 
  63 #pragma pack(1)
  64 typedef struct _MR_FW_RAID_MAP_ALL {
  65         MR_FW_RAID_MAP raidMap;
  66         MR_LD_SPAN_MAP ldSpanMap[MAX_LOGICAL_DRIVES - 1];
  67 } MR_FW_RAID_MAP_ALL;
  68 
  69 /*
  70  * Raid Context structure which describes MegaRAID specific IO Parameters
  71  * This resides at offset 0x60 where the SGL normally starts in MPT IO Frames
  72  */
  73 typedef struct _MPI2_SCSI_IO_VENDOR_UNIQUE {
  74         U8 nsegType;            /* 0x00 nseg[7:4], Type[3:0] */
  75         U8 resvd0;              /* 0x01 */
  76         U16 timeoutValue;       /* 0x02 -0x03 */
  77         U8 regLockFlags;        /* 0x04 */
  78         U8 reservedForHw1;      /* 0x05 */
  79         U16 ldTargetId;         /* 0x06 - 0x07 */
  80         U64 regLockRowLBA;      /* 0x08 - 0x0F */
  81         U32 regLockLength;      /* 0x10 - 0x13 */
  82         U16 nextLMId;           /* 0x14 - 0x15 */
  83         U8 extStatus;           /* 0x16 */
  84         U8 status;              /* 0x17 status */
  85         U8 RAIDFlags;           /* 0x18 resvd[7:6], ioSubType[5:4], */
  86                                 /* resvd[3:1], preferredCpu[0] */
  87         U8 numSGE;              /* 0x19 numSge; not including chain entries */
  88         U16 configSeqNum;       /* 0x1A -0x1B */
  89         U8 spanArm;             /* 0x1C span[7:5], arm[4:0] */
  90         U8 resvd2[3];           /* 0x1D-0x1f */
  91 } MPI2_SCSI_IO_VENDOR_UNIQUE, MPI25_SCSI_IO_VENDOR_UNIQUE;
  92 
  93 #define RAID_CTX_SPANARM_ARM_SHIFT      (0)
  94 #define RAID_CTX_SPANARM_ARM_MASK       (0x1f)
  95 
  96 #define RAID_CTX_SPANARM_SPAN_SHIFT     (5)
  97 #define RAID_CTX_SPANARM_SPAN_MASK      (0xE0)
  98 
  99 
 100 /*
 101  * RAID SCSI IO Request Message
 102  * Total SGE count will be one less
 103  * than  _MPI2_SCSI_IO_REQUEST
 104  */
 105 typedef struct _MPI2_RAID_SCSI_IO_REQUEST
 106 {
 107         uint16_t                DevHandle;                      /* 0x00 */
 
 125         uint32_t                DataLength;                     /* 0x1C */
 126         uint32_t                BidirectionalDataLength;        /* 0x20 */
 127         uint16_t                IoFlags;                        /* 0x24 */
 128         uint16_t                EEDPFlags;                      /* 0x26 */
 129         uint32_t                EEDPBlockSize;                  /* 0x28 */
 130         uint32_t                SecondaryReferenceTag;          /* 0x2C */
 131         uint16_t                SecondaryApplicationTag;        /* 0x30 */
 132         uint16_t                ApplicationTagTranslationMask;  /* 0x32 */
 133         uint8_t                 LUN[8];                         /* 0x34 */
 134         uint32_t                Control;                        /* 0x3C */
 135         Mpi2ScsiIoCdb_t         CDB;                            /* 0x40 */
 136         MPI2_SCSI_IO_VENDOR_UNIQUE RaidContext;                 /* 0x60 */
 137         Mpi2SGEIOUnion_t        SGL; /* 0x80 */
 138 } MPI2_RAID_SCSI_IO_REQUEST, MPI2_POINTER PTR_MPI2_RAID_SCSI_IO_REQUEST,
 139 Mpi2RaidSCSIIORequest_t, MPI2_POINTER pMpi2RaidSCSIIORequest_t;
 140 
 141 /*
 142  * define region lock types
 143  */
 144 typedef enum    _REGION_TYPE {
 145         REGION_TYPE_UNUSED      = 0,    /* lock is currently not active */
 146         REGION_TYPE_SHARED_READ = 1,    /* shared lock (for reads) */
 147         REGION_TYPE_SHARED_WRITE = 2,
 148         REGION_TYPE_EXCLUSIVE   = 3     /* exclusive lock (for writes) */
 149 } REGION_TYPE;
 150 
 151 
 152 #define DM_PATH_MAXPATH         2
 153 #define DM_PATH_FIRSTPATH       0
 154 #define DM_PATH_SECONDPATH      1
 155 
 156 /* declare valid Region locking values */
 157 typedef enum _REGION_LOCK {
 158         REGION_LOCK_BYPASS              = 0,
 159         /* for RAID 6 single-drive failure */
 160         REGION_LOCK_UNCOND_SHARED_READ  = 1,
 161         REGION_LOCK_UNCOND_SHARED_WRITE = 2,
 162         REGION_LOCK_UNCOND_SHARED_OTHER = 3,
 163         REGION_LOCK_UNCOND_SHARED_EXCLUSIVE = 0xFF
 164 } REGION_LOCK;
 165 
 166 
 167 struct mrsas_init_frame2 {
 168         uint8_t cmd;                            /* 00h */
 169         uint8_t reserved_0;                     /* 01h */
 170         uint8_t cmd_status;                     /* 02h */
 171 
 172         uint8_t reserved_1;                     /* 03h */
 173         uint32_t reserved_2;                    /* 04h */
 174 
 175         uint32_t context;                       /* 08h */
 176         uint32_t pad_0;                         /* 0Ch */
 177 
 178         uint16_t flags;                         /* 10h */
 179         uint16_t reserved_3;                    /* 12h */
 
 211 /* union of Request Descriptors */
 212 typedef union _MRSAS_REQUEST_DESCRIPTOR_UNION
 213 {
 214         MPI2_DEFAULT_REQUEST_DESCRIPTOR         Default;
 215         MPI2_HIGH_PRIORITY_REQUEST_DESCRIPTOR   HighPriority;
 216         MPI2_SCSI_IO_REQUEST_DESCRIPTOR         SCSIIO;
 217         MPI2_SCSI_TARGET_REQUEST_DESCRIPTOR     SCSITarget;
 218         MPI2_RAID_ACCEL_REQUEST_DESCRIPTOR      RAIDAccelerator;
 219         MR_RAID_MFA_IO_REQUEST_DESCRIPTOR       MFAIo;
 220         U64 Words;
 221 } MRSAS_REQUEST_DESCRIPTOR_UNION;
 222 
 223 #pragma pack()
 224 
 225 enum {
 226         MRSAS_SCSI_VARIABLE_LENGTH_CMD          = 0x7F,
 227         MRSAS_SCSI_SERVICE_ACTION_READ32        = 0x9,
 228         MRSAS_SCSI_SERVICE_ACTION_WRITE32       = 0xB,
 229         MRSAS_SCSI_ADDL_CDB_LEN                 = 0x18,
 230         MRSAS_RD_WR_PROTECT                     = 0x20,
 231         MRSAS_EEDPBLOCKSIZE                     = 512
 232 };
 233 
 234 
 235 #define IEEE_SGE_FLAGS_ADDR_MASK        (0x03)
 236 #define IEEE_SGE_FLAGS_SYSTEM_ADDR      (0x00)
 237 #define IEEE_SGE_FLAGS_IOCDDR_ADDR      (0x01)
 238 #define IEEE_SGE_FLAGS_IOCPLB_ADDR      (0x02)
 239 #define IEEE_SGE_FLAGS_IOCPLBNTA_ADDR   (0x03)
 240 #define IEEE_SGE_FLAGS_CHAIN_ELEMENT    (0x80)
 241 #define IEEE_SGE_FLAGS_END_OF_LIST      (0x40)
 242 
 243 
 244 U8 MR_ValidateMapInfo(MR_FW_RAID_MAP_ALL *map, PLD_LOAD_BALANCE_INFO lbInfo);
 245 U16 MR_CheckDIF(U32, MR_FW_RAID_MAP_ALL *);
 246 U8 MR_BuildRaidContext(struct mrsas_instance *, struct IO_REQUEST_INFO *,
 247     MPI2_SCSI_IO_VENDOR_UNIQUE *, MR_FW_RAID_MAP_ALL *);
 248 
 249 #endif /* _LD_PD_MAP */
 |