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