linux/drivers/scsi/megaraid/megaraid_sas_fusion.h
<<
>>
Prefs
   1/*
   2 *  Linux MegaRAID driver for SAS based RAID controllers
   3 *
   4 *  Copyright (c) 2009-2011  LSI Corporation.
   5 *
   6 *  This program is free software; you can redistribute it and/or
   7 *  modify it under the terms of the GNU General Public License
   8 *  as published by the Free Software Foundation; either version 2
   9 *  of the License, or (at your option) any later version.
  10 *
  11 *  This program is distributed in the hope that it will be useful,
  12 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
  13 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  14 *  GNU General Public License for more details.
  15 *
  16 *  You should have received a copy of the GNU General Public License
  17 *  along with this program; if not, write to the Free Software
  18 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
  19 *
  20 *  FILE: megaraid_sas_fusion.h
  21 *
  22 *  Authors: LSI Corporation
  23 *           Manoj Jose
  24 *           Sumant Patro
  25 *
  26 *  Send feedback to: <megaraidlinux@lsi.com>
  27 *
  28 *  Mail to: LSI Corporation, 1621 Barber Lane, Milpitas, CA 95035
  29 *     ATTN: Linuxraid
  30 */
  31
  32#ifndef _MEGARAID_SAS_FUSION_H_
  33#define _MEGARAID_SAS_FUSION_H_
  34
  35/* Fusion defines */
  36#define MEGASAS_MAX_SZ_CHAIN_FRAME 1024
  37#define MFI_FUSION_ENABLE_INTERRUPT_MASK (0x00000009)
  38#define MEGA_MPI2_RAID_DEFAULT_IO_FRAME_SIZE 256
  39#define MEGASAS_MPI2_FUNCTION_PASSTHRU_IO_REQUEST   0xF0
  40#define MEGASAS_MPI2_FUNCTION_LD_IO_REQUEST         0xF1
  41#define MEGASAS_LOAD_BALANCE_FLAG                   0x1
  42#define MEGASAS_DCMD_MBOX_PEND_FLAG                 0x1
  43#define HOST_DIAG_WRITE_ENABLE                      0x80
  44#define HOST_DIAG_RESET_ADAPTER                     0x4
  45#define MEGASAS_FUSION_MAX_RESET_TRIES              3
  46
  47/* T10 PI defines */
  48#define MR_PROT_INFO_TYPE_CONTROLLER                0x8
  49#define MEGASAS_SCSI_VARIABLE_LENGTH_CMD            0x7f
  50#define MEGASAS_SCSI_SERVICE_ACTION_READ32          0x9
  51#define MEGASAS_SCSI_SERVICE_ACTION_WRITE32         0xB
  52#define MEGASAS_SCSI_ADDL_CDB_LEN                   0x18
  53#define MEGASAS_RD_WR_PROTECT_CHECK_ALL             0x20
  54#define MEGASAS_RD_WR_PROTECT_CHECK_NONE            0x60
  55#define MEGASAS_EEDPBLOCKSIZE                       512
  56
  57/*
  58 * Raid context flags
  59 */
  60
  61#define MR_RAID_CTX_RAID_FLAGS_IO_SUB_TYPE_SHIFT   0x4
  62#define MR_RAID_CTX_RAID_FLAGS_IO_SUB_TYPE_MASK    0x30
  63enum MR_RAID_FLAGS_IO_SUB_TYPE {
  64        MR_RAID_FLAGS_IO_SUB_TYPE_NONE = 0,
  65        MR_RAID_FLAGS_IO_SUB_TYPE_SYSTEM_PD = 1,
  66};
  67
  68/*
  69 * Request descriptor types
  70 */
  71#define MEGASAS_REQ_DESCRIPT_FLAGS_LD_IO           0x7
  72#define MEGASAS_REQ_DESCRIPT_FLAGS_MFA             0x1
  73
  74#define MEGASAS_REQ_DESCRIPT_FLAGS_TYPE_SHIFT      1
  75
  76#define MEGASAS_FP_CMD_LEN      16
  77#define MEGASAS_FUSION_IN_RESET 0
  78
  79/*
  80 * Raid Context structure which describes MegaRAID specific IO Paramenters
  81 * This resides at offset 0x60 where the SGL normally starts in MPT IO Frames
  82 */
  83
  84struct RAID_CONTEXT {
  85        u16     resvd0;
  86        u16     timeoutValue;
  87        u8      regLockFlags;
  88        u8      resvd1;
  89        u16     VirtualDiskTgtId;
  90        u64     regLockRowLBA;
  91        u32     regLockLength;
  92        u16     nextLMId;
  93        u8      exStatus;
  94        u8      status;
  95        u8      RAIDFlags;
  96        u8      numSGE;
  97        u16     configSeqNum;
  98        u8      spanArm;
  99        u8      resvd2[3];
 100};
 101
 102#define RAID_CTX_SPANARM_ARM_SHIFT      (0)
 103#define RAID_CTX_SPANARM_ARM_MASK       (0x1f)
 104
 105#define RAID_CTX_SPANARM_SPAN_SHIFT     (5)
 106#define RAID_CTX_SPANARM_SPAN_MASK      (0xE0)
 107
 108/*
 109 * define region lock types
 110 */
 111enum REGION_TYPE {
 112        REGION_TYPE_UNUSED       = 0,
 113        REGION_TYPE_SHARED_READ  = 1,
 114        REGION_TYPE_SHARED_WRITE = 2,
 115        REGION_TYPE_EXCLUSIVE    = 3,
 116};
 117
 118/* MPI2 defines */
 119#define MPI2_FUNCTION_IOC_INIT              (0x02) /* IOC Init */
 120#define MPI2_WHOINIT_HOST_DRIVER            (0x04)
 121#define MPI2_VERSION_MAJOR                  (0x02)
 122#define MPI2_VERSION_MINOR                  (0x00)
 123#define MPI2_VERSION_MAJOR_MASK             (0xFF00)
 124#define MPI2_VERSION_MAJOR_SHIFT            (8)
 125#define MPI2_VERSION_MINOR_MASK             (0x00FF)
 126#define MPI2_VERSION_MINOR_SHIFT            (0)
 127#define MPI2_VERSION ((MPI2_VERSION_MAJOR << MPI2_VERSION_MAJOR_SHIFT) | \
 128                      MPI2_VERSION_MINOR)
 129#define MPI2_HEADER_VERSION_UNIT            (0x10)
 130#define MPI2_HEADER_VERSION_DEV             (0x00)
 131#define MPI2_HEADER_VERSION_UNIT_MASK       (0xFF00)
 132#define MPI2_HEADER_VERSION_UNIT_SHIFT      (8)
 133#define MPI2_HEADER_VERSION_DEV_MASK        (0x00FF)
 134#define MPI2_HEADER_VERSION_DEV_SHIFT       (0)
 135#define MPI2_HEADER_VERSION ((MPI2_HEADER_VERSION_UNIT << 8) | \
 136                             MPI2_HEADER_VERSION_DEV)
 137#define MPI2_IEEE_SGE_FLAGS_IOCPLBNTA_ADDR      (0x03)
 138#define MPI2_SCSIIO_EEDPFLAGS_INC_PRI_REFTAG        (0x8000)
 139#define MPI2_SCSIIO_EEDPFLAGS_CHECK_REFTAG          (0x0400)
 140#define MPI2_SCSIIO_EEDPFLAGS_CHECK_REMOVE_OP       (0x0003)
 141#define MPI2_SCSIIO_EEDPFLAGS_CHECK_APPTAG          (0x0200)
 142#define MPI2_SCSIIO_EEDPFLAGS_CHECK_GUARD           (0x0100)
 143#define MPI2_SCSIIO_EEDPFLAGS_INSERT_OP             (0x0004)
 144#define MPI2_FUNCTION_SCSI_IO_REQUEST               (0x00) /* SCSI IO */
 145#define MPI2_REQ_DESCRIPT_FLAGS_HIGH_PRIORITY           (0x06)
 146#define MPI2_REQ_DESCRIPT_FLAGS_SCSI_IO                 (0x00)
 147#define MPI2_SGE_FLAGS_64_BIT_ADDRESSING        (0x02)
 148#define MPI2_SCSIIO_CONTROL_WRITE               (0x01000000)
 149#define MPI2_SCSIIO_CONTROL_READ                (0x02000000)
 150#define MPI2_REQ_DESCRIPT_FLAGS_TYPE_MASK       (0x0E)
 151#define MPI2_RPY_DESCRIPT_FLAGS_UNUSED          (0x0F)
 152#define MPI2_RPY_DESCRIPT_FLAGS_SCSI_IO_SUCCESS (0x00)
 153#define MPI2_RPY_DESCRIPT_FLAGS_TYPE_MASK       (0x0F)
 154#define MPI2_WRSEQ_FLUSH_KEY_VALUE              (0x0)
 155#define MPI2_WRITE_SEQUENCE_OFFSET              (0x00000004)
 156#define MPI2_WRSEQ_1ST_KEY_VALUE                (0xF)
 157#define MPI2_WRSEQ_2ND_KEY_VALUE                (0x4)
 158#define MPI2_WRSEQ_3RD_KEY_VALUE                (0xB)
 159#define MPI2_WRSEQ_4TH_KEY_VALUE                (0x2)
 160#define MPI2_WRSEQ_5TH_KEY_VALUE                (0x7)
 161#define MPI2_WRSEQ_6TH_KEY_VALUE                (0xD)
 162
 163struct MPI25_IEEE_SGE_CHAIN64 {
 164        u64                     Address;
 165        u32                     Length;
 166        u16                     Reserved1;
 167        u8                      NextChainOffset;
 168        u8                      Flags;
 169};
 170
 171struct MPI2_SGE_SIMPLE_UNION {
 172        u32                     FlagsLength;
 173        union {
 174                u32                 Address32;
 175                u64                 Address64;
 176        } u;
 177};
 178
 179struct MPI2_SCSI_IO_CDB_EEDP32 {
 180        u8                      CDB[20];                    /* 0x00 */
 181        u32                     PrimaryReferenceTag;        /* 0x14 */
 182        u16                     PrimaryApplicationTag;      /* 0x18 */
 183        u16                     PrimaryApplicationTagMask;  /* 0x1A */
 184        u32                     TransferLength;             /* 0x1C */
 185};
 186
 187struct MPI2_SGE_CHAIN_UNION {
 188        u16                     Length;
 189        u8                      NextChainOffset;
 190        u8                      Flags;
 191        union {
 192                u32                 Address32;
 193                u64                 Address64;
 194        } u;
 195};
 196
 197struct MPI2_IEEE_SGE_SIMPLE32 {
 198        u32                     Address;
 199        u32                     FlagsLength;
 200};
 201
 202struct MPI2_IEEE_SGE_CHAIN32 {
 203        u32                     Address;
 204        u32                     FlagsLength;
 205};
 206
 207struct MPI2_IEEE_SGE_SIMPLE64 {
 208        u64                     Address;
 209        u32                     Length;
 210        u16                     Reserved1;
 211        u8                      Reserved2;
 212        u8                      Flags;
 213};
 214
 215struct MPI2_IEEE_SGE_CHAIN64 {
 216        u64                     Address;
 217        u32                     Length;
 218        u16                     Reserved1;
 219        u8                      Reserved2;
 220        u8                      Flags;
 221};
 222
 223union MPI2_IEEE_SGE_SIMPLE_UNION {
 224        struct MPI2_IEEE_SGE_SIMPLE32  Simple32;
 225        struct MPI2_IEEE_SGE_SIMPLE64  Simple64;
 226};
 227
 228union MPI2_IEEE_SGE_CHAIN_UNION {
 229        struct MPI2_IEEE_SGE_CHAIN32   Chain32;
 230        struct MPI2_IEEE_SGE_CHAIN64   Chain64;
 231};
 232
 233union MPI2_SGE_IO_UNION {
 234        struct MPI2_SGE_SIMPLE_UNION       MpiSimple;
 235        struct MPI2_SGE_CHAIN_UNION        MpiChain;
 236        union MPI2_IEEE_SGE_SIMPLE_UNION  IeeeSimple;
 237        union MPI2_IEEE_SGE_CHAIN_UNION   IeeeChain;
 238};
 239
 240union MPI2_SCSI_IO_CDB_UNION {
 241        u8                      CDB32[32];
 242        struct MPI2_SCSI_IO_CDB_EEDP32 EEDP32;
 243        struct MPI2_SGE_SIMPLE_UNION SGE;
 244};
 245
 246/*
 247 * RAID SCSI IO Request Message
 248 * Total SGE count will be one less than  _MPI2_SCSI_IO_REQUEST
 249 */
 250struct MPI2_RAID_SCSI_IO_REQUEST {
 251        u16                     DevHandle;                      /* 0x00 */
 252        u8                      ChainOffset;                    /* 0x02 */
 253        u8                      Function;                       /* 0x03 */
 254        u16                     Reserved1;                      /* 0x04 */
 255        u8                      Reserved2;                      /* 0x06 */
 256        u8                      MsgFlags;                       /* 0x07 */
 257        u8                      VP_ID;                          /* 0x08 */
 258        u8                      VF_ID;                          /* 0x09 */
 259        u16                     Reserved3;                      /* 0x0A */
 260        u32                     SenseBufferLowAddress;          /* 0x0C */
 261        u16                     SGLFlags;                       /* 0x10 */
 262        u8                      SenseBufferLength;              /* 0x12 */
 263        u8                      Reserved4;                      /* 0x13 */
 264        u8                      SGLOffset0;                     /* 0x14 */
 265        u8                      SGLOffset1;                     /* 0x15 */
 266        u8                      SGLOffset2;                     /* 0x16 */
 267        u8                      SGLOffset3;                     /* 0x17 */
 268        u32                     SkipCount;                      /* 0x18 */
 269        u32                     DataLength;                     /* 0x1C */
 270        u32                     BidirectionalDataLength;        /* 0x20 */
 271        u16                     IoFlags;                        /* 0x24 */
 272        u16                     EEDPFlags;                      /* 0x26 */
 273        u32                     EEDPBlockSize;                  /* 0x28 */
 274        u32                     SecondaryReferenceTag;          /* 0x2C */
 275        u16                     SecondaryApplicationTag;        /* 0x30 */
 276        u16                     ApplicationTagTranslationMask;  /* 0x32 */
 277        u8                      LUN[8];                         /* 0x34 */
 278        u32                     Control;                        /* 0x3C */
 279        union MPI2_SCSI_IO_CDB_UNION  CDB;                      /* 0x40 */
 280        struct RAID_CONTEXT     RaidContext;                    /* 0x60 */
 281        union MPI2_SGE_IO_UNION       SGL;                      /* 0x80 */
 282};
 283
 284/*
 285 * MPT RAID MFA IO Descriptor.
 286 */
 287struct MEGASAS_RAID_MFA_IO_REQUEST_DESCRIPTOR {
 288        u32     RequestFlags:8;
 289        u32     MessageAddress1:24; /* bits 31:8*/
 290        u32     MessageAddress2;      /* bits 61:32 */
 291};
 292
 293/* Default Request Descriptor */
 294struct MPI2_DEFAULT_REQUEST_DESCRIPTOR {
 295        u8              RequestFlags;               /* 0x00 */
 296        u8              MSIxIndex;                  /* 0x01 */
 297        u16             SMID;                       /* 0x02 */
 298        u16             LMID;                       /* 0x04 */
 299        u16             DescriptorTypeDependent;    /* 0x06 */
 300};
 301
 302/* High Priority Request Descriptor */
 303struct MPI2_HIGH_PRIORITY_REQUEST_DESCRIPTOR {
 304        u8              RequestFlags;               /* 0x00 */
 305        u8              MSIxIndex;                  /* 0x01 */
 306        u16             SMID;                       /* 0x02 */
 307        u16             LMID;                       /* 0x04 */
 308        u16             Reserved1;                  /* 0x06 */
 309};
 310
 311/* SCSI IO Request Descriptor */
 312struct MPI2_SCSI_IO_REQUEST_DESCRIPTOR {
 313        u8              RequestFlags;               /* 0x00 */
 314        u8              MSIxIndex;                  /* 0x01 */
 315        u16             SMID;                       /* 0x02 */
 316        u16             LMID;                       /* 0x04 */
 317        u16             DevHandle;                  /* 0x06 */
 318};
 319
 320/* SCSI Target Request Descriptor */
 321struct MPI2_SCSI_TARGET_REQUEST_DESCRIPTOR {
 322        u8              RequestFlags;               /* 0x00 */
 323        u8              MSIxIndex;                  /* 0x01 */
 324        u16             SMID;                       /* 0x02 */
 325        u16             LMID;                       /* 0x04 */
 326        u16             IoIndex;                    /* 0x06 */
 327};
 328
 329/* RAID Accelerator Request Descriptor */
 330struct MPI2_RAID_ACCEL_REQUEST_DESCRIPTOR {
 331        u8              RequestFlags;               /* 0x00 */
 332        u8              MSIxIndex;                  /* 0x01 */
 333        u16             SMID;                       /* 0x02 */
 334        u16             LMID;                       /* 0x04 */
 335        u16             Reserved;                   /* 0x06 */
 336};
 337
 338/* union of Request Descriptors */
 339union MEGASAS_REQUEST_DESCRIPTOR_UNION {
 340        struct MPI2_DEFAULT_REQUEST_DESCRIPTOR             Default;
 341        struct MPI2_HIGH_PRIORITY_REQUEST_DESCRIPTOR       HighPriority;
 342        struct MPI2_SCSI_IO_REQUEST_DESCRIPTOR             SCSIIO;
 343        struct MPI2_SCSI_TARGET_REQUEST_DESCRIPTOR         SCSITarget;
 344        struct MPI2_RAID_ACCEL_REQUEST_DESCRIPTOR          RAIDAccelerator;
 345        struct MEGASAS_RAID_MFA_IO_REQUEST_DESCRIPTOR      MFAIo;
 346        union {
 347                struct {
 348                        u32 low;
 349                        u32 high;
 350                } u;
 351                u64 Words;
 352        };
 353};
 354
 355/* Default Reply Descriptor */
 356struct MPI2_DEFAULT_REPLY_DESCRIPTOR {
 357        u8              ReplyFlags;                 /* 0x00 */
 358        u8              MSIxIndex;                  /* 0x01 */
 359        u16             DescriptorTypeDependent1;   /* 0x02 */
 360        u32             DescriptorTypeDependent2;   /* 0x04 */
 361};
 362
 363/* Address Reply Descriptor */
 364struct MPI2_ADDRESS_REPLY_DESCRIPTOR {
 365        u8              ReplyFlags;                 /* 0x00 */
 366        u8              MSIxIndex;                  /* 0x01 */
 367        u16             SMID;                       /* 0x02 */
 368        u32             ReplyFrameAddress;          /* 0x04 */
 369};
 370
 371/* SCSI IO Success Reply Descriptor */
 372struct MPI2_SCSI_IO_SUCCESS_REPLY_DESCRIPTOR {
 373        u8              ReplyFlags;                 /* 0x00 */
 374        u8              MSIxIndex;                  /* 0x01 */
 375        u16             SMID;                       /* 0x02 */
 376        u16             TaskTag;                    /* 0x04 */
 377        u16             Reserved1;                  /* 0x06 */
 378};
 379
 380/* TargetAssist Success Reply Descriptor */
 381struct MPI2_TARGETASSIST_SUCCESS_REPLY_DESCRIPTOR {
 382        u8              ReplyFlags;                 /* 0x00 */
 383        u8              MSIxIndex;                  /* 0x01 */
 384        u16             SMID;                       /* 0x02 */
 385        u8              SequenceNumber;             /* 0x04 */
 386        u8              Reserved1;                  /* 0x05 */
 387        u16             IoIndex;                    /* 0x06 */
 388};
 389
 390/* Target Command Buffer Reply Descriptor */
 391struct MPI2_TARGET_COMMAND_BUFFER_REPLY_DESCRIPTOR {
 392        u8              ReplyFlags;                 /* 0x00 */
 393        u8              MSIxIndex;                  /* 0x01 */
 394        u8              VP_ID;                      /* 0x02 */
 395        u8              Flags;                      /* 0x03 */
 396        u16             InitiatorDevHandle;         /* 0x04 */
 397        u16             IoIndex;                    /* 0x06 */
 398};
 399
 400/* RAID Accelerator Success Reply Descriptor */
 401struct MPI2_RAID_ACCELERATOR_SUCCESS_REPLY_DESCRIPTOR {
 402        u8              ReplyFlags;                 /* 0x00 */
 403        u8              MSIxIndex;                  /* 0x01 */
 404        u16             SMID;                       /* 0x02 */
 405        u32             Reserved;                   /* 0x04 */
 406};
 407
 408/* union of Reply Descriptors */
 409union MPI2_REPLY_DESCRIPTORS_UNION {
 410        struct MPI2_DEFAULT_REPLY_DESCRIPTOR                   Default;
 411        struct MPI2_ADDRESS_REPLY_DESCRIPTOR                   AddressReply;
 412        struct MPI2_SCSI_IO_SUCCESS_REPLY_DESCRIPTOR           SCSIIOSuccess;
 413        struct MPI2_TARGETASSIST_SUCCESS_REPLY_DESCRIPTOR TargetAssistSuccess;
 414        struct MPI2_TARGET_COMMAND_BUFFER_REPLY_DESCRIPTOR TargetCommandBuffer;
 415        struct MPI2_RAID_ACCELERATOR_SUCCESS_REPLY_DESCRIPTOR
 416        RAIDAcceleratorSuccess;
 417        u64                                             Words;
 418};
 419
 420/* IOCInit Request message */
 421struct MPI2_IOC_INIT_REQUEST {
 422        u8                      WhoInit;                        /* 0x00 */
 423        u8                      Reserved1;                      /* 0x01 */
 424        u8                      ChainOffset;                    /* 0x02 */
 425        u8                      Function;                       /* 0x03 */
 426        u16                     Reserved2;                      /* 0x04 */
 427        u8                      Reserved3;                      /* 0x06 */
 428        u8                      MsgFlags;                       /* 0x07 */
 429        u8                      VP_ID;                          /* 0x08 */
 430        u8                      VF_ID;                          /* 0x09 */
 431        u16                     Reserved4;                      /* 0x0A */
 432        u16                     MsgVersion;                     /* 0x0C */
 433        u16                     HeaderVersion;                  /* 0x0E */
 434        u32                     Reserved5;                      /* 0x10 */
 435        u16                     Reserved6;                      /* 0x14 */
 436        u8                      Reserved7;                      /* 0x16 */
 437        u8                      HostMSIxVectors;                /* 0x17 */
 438        u16                     Reserved8;                      /* 0x18 */
 439        u16                     SystemRequestFrameSize;         /* 0x1A */
 440        u16                     ReplyDescriptorPostQueueDepth;  /* 0x1C */
 441        u16                     ReplyFreeQueueDepth;            /* 0x1E */
 442        u32                     SenseBufferAddressHigh;         /* 0x20 */
 443        u32                     SystemReplyAddressHigh;         /* 0x24 */
 444        u64                     SystemRequestFrameBaseAddress;  /* 0x28 */
 445        u64                     ReplyDescriptorPostQueueAddress;/* 0x30 */
 446        u64                     ReplyFreeQueueAddress;          /* 0x38 */
 447        u64                     TimeStamp;                      /* 0x40 */
 448};
 449
 450/* mrpriv defines */
 451#define MR_PD_INVALID 0xFFFF
 452#define MAX_SPAN_DEPTH 8
 453#define MAX_RAIDMAP_SPAN_DEPTH (MAX_SPAN_DEPTH)
 454#define MAX_ROW_SIZE 32
 455#define MAX_RAIDMAP_ROW_SIZE (MAX_ROW_SIZE)
 456#define MAX_LOGICAL_DRIVES 64
 457#define MAX_RAIDMAP_LOGICAL_DRIVES (MAX_LOGICAL_DRIVES)
 458#define MAX_RAIDMAP_VIEWS (MAX_LOGICAL_DRIVES)
 459#define MAX_ARRAYS 128
 460#define MAX_RAIDMAP_ARRAYS (MAX_ARRAYS)
 461#define MAX_PHYSICAL_DEVICES 256
 462#define MAX_RAIDMAP_PHYSICAL_DEVICES (MAX_PHYSICAL_DEVICES)
 463#define MR_DCMD_LD_MAP_GET_INFO             0x0300e101
 464
 465struct MR_DEV_HANDLE_INFO {
 466        u16     curDevHdl;
 467        u8      validHandles;
 468        u8      reserved;
 469        u16     devHandle[2];
 470};
 471
 472struct MR_ARRAY_INFO {
 473        u16      pd[MAX_RAIDMAP_ROW_SIZE];
 474};
 475
 476struct MR_QUAD_ELEMENT {
 477        u64     logStart;
 478        u64     logEnd;
 479        u64     offsetInSpan;
 480        u32     diff;
 481        u32     reserved1;
 482};
 483
 484struct MR_SPAN_INFO {
 485        u32             noElements;
 486        u32             reserved1;
 487        struct MR_QUAD_ELEMENT quad[MAX_RAIDMAP_SPAN_DEPTH];
 488};
 489
 490struct MR_LD_SPAN {
 491        u64      startBlk;
 492        u64      numBlks;
 493        u16      arrayRef;
 494        u8       reserved[6];
 495};
 496
 497struct MR_SPAN_BLOCK_INFO {
 498        u64          num_rows;
 499        struct MR_LD_SPAN   span;
 500        struct MR_SPAN_INFO block_span_info;
 501};
 502
 503struct MR_LD_RAID {
 504        struct {
 505                u32     fpCapable:1;
 506                u32     reserved5:3;
 507                u32     ldPiMode:4;
 508                u32     pdPiMode:4;
 509                u32     encryptionType:8;
 510                u32     fpWriteCapable:1;
 511                u32     fpReadCapable:1;
 512                u32     fpWriteAcrossStripe:1;
 513                u32     fpReadAcrossStripe:1;
 514                u32     reserved4:8;
 515        } capability;
 516        u32     reserved6;
 517        u64     size;
 518        u8      spanDepth;
 519        u8      level;
 520        u8      stripeShift;
 521        u8      rowSize;
 522        u8      rowDataSize;
 523        u8      writeMode;
 524        u8      PRL;
 525        u8      SRL;
 526        u16     targetId;
 527        u8      ldState;
 528        u8      regTypeReqOnWrite;
 529        u8      modFactor;
 530        u8      reserved2[1];
 531        u16     seqNum;
 532
 533        struct {
 534                u32 ldSyncRequired:1;
 535                u32 reserved:31;
 536        } flags;
 537
 538        u8      reserved3[0x5C];
 539};
 540
 541struct MR_LD_SPAN_MAP {
 542        struct MR_LD_RAID          ldRaid;
 543        u8                  dataArmMap[MAX_RAIDMAP_ROW_SIZE];
 544        struct MR_SPAN_BLOCK_INFO  spanBlock[MAX_RAIDMAP_SPAN_DEPTH];
 545};
 546
 547struct MR_FW_RAID_MAP {
 548        u32                 totalSize;
 549        union {
 550                struct {
 551                        u32         maxLd;
 552                        u32         maxSpanDepth;
 553                        u32         maxRowSize;
 554                        u32         maxPdCount;
 555                        u32         maxArrays;
 556                } validationInfo;
 557                u32             version[5];
 558                u32             reserved1[5];
 559        };
 560
 561        u32                 ldCount;
 562        u32                 Reserved1;
 563        u8                  ldTgtIdToLd[MAX_RAIDMAP_LOGICAL_DRIVES+
 564                                        MAX_RAIDMAP_VIEWS];
 565        u8                  fpPdIoTimeoutSec;
 566        u8                  reserved2[7];
 567        struct MR_ARRAY_INFO       arMapInfo[MAX_RAIDMAP_ARRAYS];
 568        struct MR_DEV_HANDLE_INFO  devHndlInfo[MAX_RAIDMAP_PHYSICAL_DEVICES];
 569        struct MR_LD_SPAN_MAP      ldSpanMap[1];
 570};
 571
 572struct IO_REQUEST_INFO {
 573        u64 ldStartBlock;
 574        u32 numBlocks;
 575        u16 ldTgtId;
 576        u8 isRead;
 577        u16 devHandle;
 578        u64 pdBlock;
 579        u8 fpOkForIo;
 580};
 581
 582struct MR_LD_TARGET_SYNC {
 583        u8  targetId;
 584        u8  reserved;
 585        u16 seqNum;
 586};
 587
 588#define IEEE_SGE_FLAGS_ADDR_MASK            (0x03)
 589#define IEEE_SGE_FLAGS_SYSTEM_ADDR          (0x00)
 590#define IEEE_SGE_FLAGS_IOCDDR_ADDR          (0x01)
 591#define IEEE_SGE_FLAGS_IOCPLB_ADDR          (0x02)
 592#define IEEE_SGE_FLAGS_IOCPLBNTA_ADDR       (0x03)
 593#define IEEE_SGE_FLAGS_CHAIN_ELEMENT        (0x80)
 594#define IEEE_SGE_FLAGS_END_OF_LIST          (0x40)
 595
 596struct megasas_register_set;
 597struct megasas_instance;
 598
 599union desc_word {
 600        u64 word;
 601        struct {
 602                u32 low;
 603                u32 high;
 604        } u;
 605};
 606
 607struct megasas_cmd_fusion {
 608        struct MPI2_RAID_SCSI_IO_REQUEST        *io_request;
 609        dma_addr_t                      io_request_phys_addr;
 610
 611        union MPI2_SGE_IO_UNION *sg_frame;
 612        dma_addr_t              sg_frame_phys_addr;
 613
 614        u8 *sense;
 615        dma_addr_t sense_phys_addr;
 616
 617        struct list_head list;
 618        struct scsi_cmnd *scmd;
 619        struct megasas_instance *instance;
 620
 621        u8 retry_for_fw_reset;
 622        union MEGASAS_REQUEST_DESCRIPTOR_UNION  *request_desc;
 623
 624        /*
 625         * Context for a MFI frame.
 626         * Used to get the mfi cmd from list when a MFI cmd is completed
 627         */
 628        u32 sync_cmd_idx;
 629        u32 index;
 630        u8 flags;
 631};
 632
 633struct LD_LOAD_BALANCE_INFO {
 634        u8      loadBalanceFlag;
 635        u8      reserved1;
 636        u16     raid1DevHandle[2];
 637        atomic_t     scsi_pending_cmds[2];
 638        u64     last_accessed_block[2];
 639};
 640
 641struct MR_FW_RAID_MAP_ALL {
 642        struct MR_FW_RAID_MAP raidMap;
 643        struct MR_LD_SPAN_MAP ldSpanMap[MAX_LOGICAL_DRIVES - 1];
 644} __attribute__ ((packed));
 645
 646struct fusion_context {
 647        struct megasas_cmd_fusion **cmd_list;
 648        struct list_head cmd_pool;
 649
 650        spinlock_t cmd_pool_lock;
 651
 652        dma_addr_t req_frames_desc_phys;
 653        u8 *req_frames_desc;
 654
 655        struct dma_pool *io_request_frames_pool;
 656        dma_addr_t io_request_frames_phys;
 657        u8 *io_request_frames;
 658
 659        struct dma_pool *sg_dma_pool;
 660        struct dma_pool *sense_dma_pool;
 661
 662        dma_addr_t reply_frames_desc_phys;
 663        union MPI2_REPLY_DESCRIPTORS_UNION *reply_frames_desc;
 664        struct dma_pool *reply_frames_desc_pool;
 665
 666        u16 last_reply_idx;
 667
 668        u32 reply_q_depth;
 669        u32 request_alloc_sz;
 670        u32 reply_alloc_sz;
 671        u32 io_frames_alloc_sz;
 672
 673        u16     max_sge_in_main_msg;
 674        u16     max_sge_in_chain;
 675
 676        u8      chain_offset_io_request;
 677        u8      chain_offset_mfi_pthru;
 678
 679        struct MR_FW_RAID_MAP_ALL *ld_map[2];
 680        dma_addr_t ld_map_phys[2];
 681
 682        u32 map_sz;
 683        u8 fast_path_io;
 684        struct LD_LOAD_BALANCE_INFO load_balance_info[MAX_LOGICAL_DRIVES];
 685};
 686
 687union desc_value {
 688        u64 word;
 689        struct {
 690                u32 low;
 691                u32 high;
 692        } u;
 693};
 694
 695#endif /* _MEGARAID_SAS_FUSION_H_ */
 696