1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20#ifndef _MEGARAID_SAS_FUSION_H_
21#define _MEGARAID_SAS_FUSION_H_
22
23
24#define MEGASAS_CHAIN_FRAME_SZ_MIN 1024
25#define MFI_FUSION_ENABLE_INTERRUPT_MASK (0x00000009)
26#define MEGASAS_MAX_CHAIN_SHIFT 5
27#define MEGASAS_MAX_CHAIN_SIZE_UNITS_MASK 0x400000
28#define MEGASAS_MAX_CHAIN_SIZE_MASK 0x3E0
29#define MEGASAS_256K_IO 128
30#define MEGASAS_1MB_IO (MEGASAS_256K_IO * 4)
31#define MEGA_MPI2_RAID_DEFAULT_IO_FRAME_SIZE 256
32#define MEGASAS_MPI2_FUNCTION_PASSTHRU_IO_REQUEST 0xF0
33#define MEGASAS_MPI2_FUNCTION_LD_IO_REQUEST 0xF1
34#define MEGASAS_LOAD_BALANCE_FLAG 0x1
35#define MEGASAS_DCMD_MBOX_PEND_FLAG 0x1
36#define HOST_DIAG_WRITE_ENABLE 0x80
37#define HOST_DIAG_RESET_ADAPTER 0x4
38#define MEGASAS_FUSION_MAX_RESET_TRIES 3
39#define MAX_MSIX_QUEUES_FUSION 128
40#define RDPQ_MAX_INDEX_IN_ONE_CHUNK 16
41#define RDPQ_MAX_CHUNK_COUNT (MAX_MSIX_QUEUES_FUSION / RDPQ_MAX_INDEX_IN_ONE_CHUNK)
42
43
44#define MPI2_TYPE_CUDA 0x2
45#define MPI25_SAS_DEVICE0_FLAGS_ENABLED_FAST_PATH 0x4000
46#define MR_RL_FLAGS_GRANT_DESTINATION_CPU0 0x00
47#define MR_RL_FLAGS_GRANT_DESTINATION_CPU1 0x10
48#define MR_RL_FLAGS_GRANT_DESTINATION_CUDA 0x80
49#define MR_RL_FLAGS_SEQ_NUM_ENABLE 0x8
50#define MR_RL_WRITE_THROUGH_MODE 0x00
51#define MR_RL_WRITE_BACK_MODE 0x01
52
53
54#define MR_PROT_INFO_TYPE_CONTROLLER 0x8
55#define MEGASAS_SCSI_VARIABLE_LENGTH_CMD 0x7f
56#define MEGASAS_SCSI_SERVICE_ACTION_READ32 0x9
57#define MEGASAS_SCSI_SERVICE_ACTION_WRITE32 0xB
58#define MEGASAS_SCSI_ADDL_CDB_LEN 0x18
59#define MEGASAS_RD_WR_PROTECT_CHECK_ALL 0x20
60#define MEGASAS_RD_WR_PROTECT_CHECK_NONE 0x60
61
62#define MPI2_SUP_REPLY_POST_HOST_INDEX_OFFSET (0x0000030C)
63#define MPI2_REPLY_POST_HOST_INDEX_OFFSET (0x0000006C)
64
65
66
67
68
69#define MR_RAID_CTX_RAID_FLAGS_IO_SUB_TYPE_SHIFT 0x4
70#define MR_RAID_CTX_RAID_FLAGS_IO_SUB_TYPE_MASK 0x30
71enum MR_RAID_FLAGS_IO_SUB_TYPE {
72 MR_RAID_FLAGS_IO_SUB_TYPE_NONE = 0,
73 MR_RAID_FLAGS_IO_SUB_TYPE_SYSTEM_PD = 1,
74 MR_RAID_FLAGS_IO_SUB_TYPE_RMW_DATA = 2,
75 MR_RAID_FLAGS_IO_SUB_TYPE_RMW_P = 3,
76 MR_RAID_FLAGS_IO_SUB_TYPE_RMW_Q = 4,
77 MR_RAID_FLAGS_IO_SUB_TYPE_CACHE_BYPASS = 6,
78 MR_RAID_FLAGS_IO_SUB_TYPE_LDIO_BW_LIMIT = 7,
79 MR_RAID_FLAGS_IO_SUB_TYPE_R56_DIV_OFFLOAD = 8
80};
81
82
83
84
85#define MEGASAS_REQ_DESCRIPT_FLAGS_LD_IO 0x7
86#define MEGASAS_REQ_DESCRIPT_FLAGS_MFA 0x1
87#define MEGASAS_REQ_DESCRIPT_FLAGS_NO_LOCK 0x2
88#define MEGASAS_REQ_DESCRIPT_FLAGS_TYPE_SHIFT 1
89
90#define MEGASAS_FP_CMD_LEN 16
91#define MEGASAS_FUSION_IN_RESET 0
92#define RAID_1_PEER_CMDS 2
93#define JBOD_MAPS_COUNT 2
94#define MEGASAS_REDUCE_QD_COUNT 64
95#define IOC_INIT_FRAME_SIZE 4096
96
97
98
99
100
101
102struct RAID_CONTEXT {
103#if defined(__BIG_ENDIAN_BITFIELD)
104 u8 nseg:4;
105 u8 type:4;
106#else
107 u8 type:4;
108 u8 nseg:4;
109#endif
110 u8 resvd0;
111 __le16 timeout_value;
112 u8 reg_lock_flags;
113 u8 resvd1;
114 __le16 virtual_disk_tgt_id;
115 __le64 reg_lock_row_lba;
116 __le32 reg_lock_length;
117 __le16 next_lmid;
118 u8 ex_status;
119 u8 status;
120 u8 raid_flags;
121 u8 num_sge;
122 __le16 config_seq_num;
123 u8 span_arm;
124 u8 priority;
125 u8 num_sge_ext;
126 u8 resvd2;
127};
128
129
130
131
132
133
134struct RAID_CONTEXT_G35 {
135 #define RAID_CONTEXT_NSEG_MASK 0x00F0
136 #define RAID_CONTEXT_NSEG_SHIFT 4
137 #define RAID_CONTEXT_TYPE_MASK 0x000F
138 #define RAID_CONTEXT_TYPE_SHIFT 0
139 u16 nseg_type;
140 u16 timeout_value;
141 u16 routing_flags;
142 u16 virtual_disk_tgt_id;
143 __le64 reg_lock_row_lba;
144 u32 reg_lock_length;
145 union {
146 u16 rmw_op_index;
147 u16 peer_smid;
148 u16 r56_arm_map;
149
150 } flow_specific;
151
152 u8 ex_status;
153 u8 status;
154 u8 raid_flags;
155
156
157 u8 span_arm;
158 u16 config_seq_num;
159 union {
160
161
162
163
164
165
166
167
168
169
170 #define NUM_SGE_MASK_LOWER 0xFF
171 #define NUM_SGE_MASK_UPPER 0x0F
172 #define NUM_SGE_SHIFT_UPPER 8
173 #define STREAM_DETECT_SHIFT 7
174 #define STREAM_DETECT_MASK 0x80
175 struct {
176#if defined(__BIG_ENDIAN_BITFIELD)
177 u16 stream_detected:1;
178 u16 reserved:3;
179 u16 num_sge:12;
180#else
181 u16 num_sge:12;
182 u16 reserved:3;
183 u16 stream_detected:1;
184#endif
185 } bits;
186 u8 bytes[2];
187 } u;
188 u8 resvd2[2];
189};
190
191#define MR_RAID_CTX_ROUTINGFLAGS_SLD_SHIFT 1
192#define MR_RAID_CTX_ROUTINGFLAGS_C2D_SHIFT 2
193#define MR_RAID_CTX_ROUTINGFLAGS_FWD_SHIFT 3
194#define MR_RAID_CTX_ROUTINGFLAGS_SQN_SHIFT 4
195#define MR_RAID_CTX_ROUTINGFLAGS_SBS_SHIFT 5
196#define MR_RAID_CTX_ROUTINGFLAGS_RW_SHIFT 6
197#define MR_RAID_CTX_ROUTINGFLAGS_LOG_SHIFT 7
198#define MR_RAID_CTX_ROUTINGFLAGS_CPUSEL_SHIFT 8
199#define MR_RAID_CTX_ROUTINGFLAGS_CPUSEL_MASK 0x0F00
200#define MR_RAID_CTX_ROUTINGFLAGS_SETDIVERT_SHIFT 12
201#define MR_RAID_CTX_ROUTINGFLAGS_SETDIVERT_MASK 0xF000
202
203static inline void set_num_sge(struct RAID_CONTEXT_G35 *rctx_g35,
204 u16 sge_count)
205{
206 rctx_g35->u.bytes[0] = (u8)(sge_count & NUM_SGE_MASK_LOWER);
207 rctx_g35->u.bytes[1] |= (u8)((sge_count >> NUM_SGE_SHIFT_UPPER)
208 & NUM_SGE_MASK_UPPER);
209}
210
211static inline u16 get_num_sge(struct RAID_CONTEXT_G35 *rctx_g35)
212{
213 u16 sge_count;
214
215 sge_count = (u16)(((rctx_g35->u.bytes[1] & NUM_SGE_MASK_UPPER)
216 << NUM_SGE_SHIFT_UPPER) | (rctx_g35->u.bytes[0]));
217 return sge_count;
218}
219
220#define SET_STREAM_DETECTED(rctx_g35) \
221 (rctx_g35.u.bytes[1] |= STREAM_DETECT_MASK)
222
223#define CLEAR_STREAM_DETECTED(rctx_g35) \
224 (rctx_g35.u.bytes[1] &= ~(STREAM_DETECT_MASK))
225
226static inline bool is_stream_detected(struct RAID_CONTEXT_G35 *rctx_g35)
227{
228 return ((rctx_g35->u.bytes[1] & STREAM_DETECT_MASK));
229}
230
231union RAID_CONTEXT_UNION {
232 struct RAID_CONTEXT raid_context;
233 struct RAID_CONTEXT_G35 raid_context_g35;
234};
235
236#define RAID_CTX_SPANARM_ARM_SHIFT (0)
237#define RAID_CTX_SPANARM_ARM_MASK (0x1f)
238
239#define RAID_CTX_SPANARM_SPAN_SHIFT (5)
240#define RAID_CTX_SPANARM_SPAN_MASK (0xE0)
241
242
243#define RAID_CTX_R56_Q_ARM_MASK (0x1F)
244#define RAID_CTX_R56_P_ARM_SHIFT (5)
245#define RAID_CTX_R56_P_ARM_MASK (0x3E0)
246#define RAID_CTX_R56_LOG_ARM_SHIFT (10)
247#define RAID_CTX_R56_LOG_ARM_MASK (0x7C00)
248
249
250#define BITS_PER_INDEX_STREAM 4
251#define INVALID_STREAM_NUM 16
252#define MR_STREAM_BITMAP 0x76543210
253#define STREAM_MASK ((1 << BITS_PER_INDEX_STREAM) - 1)
254#define ZERO_LAST_STREAM 0x0fffffff
255#define MAX_STREAMS_TRACKED 8
256
257
258
259
260enum REGION_TYPE {
261 REGION_TYPE_UNUSED = 0,
262 REGION_TYPE_SHARED_READ = 1,
263 REGION_TYPE_SHARED_WRITE = 2,
264 REGION_TYPE_EXCLUSIVE = 3,
265};
266
267
268#define MPI2_FUNCTION_IOC_INIT (0x02)
269#define MPI2_WHOINIT_HOST_DRIVER (0x04)
270#define MPI2_VERSION_MAJOR (0x02)
271#define MPI2_VERSION_MINOR (0x00)
272#define MPI2_VERSION_MAJOR_MASK (0xFF00)
273#define MPI2_VERSION_MAJOR_SHIFT (8)
274#define MPI2_VERSION_MINOR_MASK (0x00FF)
275#define MPI2_VERSION_MINOR_SHIFT (0)
276#define MPI2_VERSION ((MPI2_VERSION_MAJOR << MPI2_VERSION_MAJOR_SHIFT) | \
277 MPI2_VERSION_MINOR)
278#define MPI2_HEADER_VERSION_UNIT (0x10)
279#define MPI2_HEADER_VERSION_DEV (0x00)
280#define MPI2_HEADER_VERSION_UNIT_MASK (0xFF00)
281#define MPI2_HEADER_VERSION_UNIT_SHIFT (8)
282#define MPI2_HEADER_VERSION_DEV_MASK (0x00FF)
283#define MPI2_HEADER_VERSION_DEV_SHIFT (0)
284#define MPI2_HEADER_VERSION ((MPI2_HEADER_VERSION_UNIT << 8) | \
285 MPI2_HEADER_VERSION_DEV)
286#define MPI2_IEEE_SGE_FLAGS_IOCPLBNTA_ADDR (0x03)
287#define MPI2_SCSIIO_EEDPFLAGS_INC_PRI_REFTAG (0x8000)
288#define MPI2_SCSIIO_EEDPFLAGS_CHECK_REFTAG (0x0400)
289#define MPI2_SCSIIO_EEDPFLAGS_CHECK_REMOVE_OP (0x0003)
290#define MPI2_SCSIIO_EEDPFLAGS_CHECK_APPTAG (0x0200)
291#define MPI2_SCSIIO_EEDPFLAGS_CHECK_GUARD (0x0100)
292#define MPI2_SCSIIO_EEDPFLAGS_INSERT_OP (0x0004)
293
294#define MPI25_SCSIIO_EEDPFLAGS_DO_NOT_DISABLE_MODE (0x0040)
295#define MPI2_FUNCTION_SCSI_IO_REQUEST (0x00)
296#define MPI2_FUNCTION_SCSI_TASK_MGMT (0x01)
297#define MPI2_REQ_DESCRIPT_FLAGS_HIGH_PRIORITY (0x03)
298#define MPI2_REQ_DESCRIPT_FLAGS_FP_IO (0x06)
299#define MPI2_REQ_DESCRIPT_FLAGS_SCSI_IO (0x00)
300#define MPI2_SGE_FLAGS_64_BIT_ADDRESSING (0x02)
301#define MPI2_SCSIIO_CONTROL_WRITE (0x01000000)
302#define MPI2_SCSIIO_CONTROL_READ (0x02000000)
303#define MPI2_REQ_DESCRIPT_FLAGS_TYPE_MASK (0x0E)
304#define MPI2_RPY_DESCRIPT_FLAGS_UNUSED (0x0F)
305#define MPI2_RPY_DESCRIPT_FLAGS_SCSI_IO_SUCCESS (0x00)
306#define MPI2_RPY_DESCRIPT_FLAGS_TYPE_MASK (0x0F)
307#define MPI2_WRSEQ_FLUSH_KEY_VALUE (0x0)
308#define MPI2_WRITE_SEQUENCE_OFFSET (0x00000004)
309#define MPI2_WRSEQ_1ST_KEY_VALUE (0xF)
310#define MPI2_WRSEQ_2ND_KEY_VALUE (0x4)
311#define MPI2_WRSEQ_3RD_KEY_VALUE (0xB)
312#define MPI2_WRSEQ_4TH_KEY_VALUE (0x2)
313#define MPI2_WRSEQ_5TH_KEY_VALUE (0x7)
314#define MPI2_WRSEQ_6TH_KEY_VALUE (0xD)
315
316struct MPI25_IEEE_SGE_CHAIN64 {
317 __le64 Address;
318 __le32 Length;
319 __le16 Reserved1;
320 u8 NextChainOffset;
321 u8 Flags;
322};
323
324struct MPI2_SGE_SIMPLE_UNION {
325 __le32 FlagsLength;
326 union {
327 __le32 Address32;
328 __le64 Address64;
329 } u;
330};
331
332struct MPI2_SCSI_IO_CDB_EEDP32 {
333 u8 CDB[20];
334 __be32 PrimaryReferenceTag;
335 __be16 PrimaryApplicationTag;
336 __be16 PrimaryApplicationTagMask;
337 __le32 TransferLength;
338};
339
340struct MPI2_SGE_CHAIN_UNION {
341 __le16 Length;
342 u8 NextChainOffset;
343 u8 Flags;
344 union {
345 __le32 Address32;
346 __le64 Address64;
347 } u;
348};
349
350struct MPI2_IEEE_SGE_SIMPLE32 {
351 __le32 Address;
352 __le32 FlagsLength;
353};
354
355struct MPI2_IEEE_SGE_CHAIN32 {
356 __le32 Address;
357 __le32 FlagsLength;
358};
359
360struct MPI2_IEEE_SGE_SIMPLE64 {
361 __le64 Address;
362 __le32 Length;
363 __le16 Reserved1;
364 u8 Reserved2;
365 u8 Flags;
366};
367
368struct MPI2_IEEE_SGE_CHAIN64 {
369 __le64 Address;
370 __le32 Length;
371 __le16 Reserved1;
372 u8 Reserved2;
373 u8 Flags;
374};
375
376union MPI2_IEEE_SGE_SIMPLE_UNION {
377 struct MPI2_IEEE_SGE_SIMPLE32 Simple32;
378 struct MPI2_IEEE_SGE_SIMPLE64 Simple64;
379};
380
381union MPI2_IEEE_SGE_CHAIN_UNION {
382 struct MPI2_IEEE_SGE_CHAIN32 Chain32;
383 struct MPI2_IEEE_SGE_CHAIN64 Chain64;
384};
385
386union MPI2_SGE_IO_UNION {
387 struct MPI2_SGE_SIMPLE_UNION MpiSimple;
388 struct MPI2_SGE_CHAIN_UNION MpiChain;
389 union MPI2_IEEE_SGE_SIMPLE_UNION IeeeSimple;
390 union MPI2_IEEE_SGE_CHAIN_UNION IeeeChain;
391};
392
393union MPI2_SCSI_IO_CDB_UNION {
394 u8 CDB32[32];
395 struct MPI2_SCSI_IO_CDB_EEDP32 EEDP32;
396 struct MPI2_SGE_SIMPLE_UNION SGE;
397};
398
399
400
401
402
403
404struct MPI2_SCSI_TASK_MANAGE_REQUEST {
405 u16 DevHandle;
406 u8 ChainOffset;
407 u8 Function;
408 u8 Reserved1;
409 u8 TaskType;
410 u8 Reserved2;
411 u8 MsgFlags;
412 u8 VP_ID;
413 u8 VF_ID;
414 u16 Reserved3;
415 u8 LUN[8];
416 u32 Reserved4[7];
417 u16 TaskMID;
418 u16 Reserved5;
419};
420
421
422
423struct MPI2_SCSI_TASK_MANAGE_REPLY {
424 u16 DevHandle;
425 u8 MsgLength;
426 u8 Function;
427 u8 ResponseCode;
428 u8 TaskType;
429 u8 Reserved1;
430 u8 MsgFlags;
431 u8 VP_ID;
432 u8 VF_ID;
433 u16 Reserved2;
434 u16 Reserved3;
435 u16 IOCStatus;
436 u32 IOCLogInfo;
437 u32 TerminationCount;
438 u32 ResponseInfo;
439};
440
441struct MR_TM_REQUEST {
442 char request[128];
443};
444
445struct MR_TM_REPLY {
446 char reply[128];
447};
448
449
450struct MR_TASK_MANAGE_REQUEST {
451
452 struct MR_TM_REQUEST TmRequest;
453 union {
454 struct {
455#if defined(__BIG_ENDIAN_BITFIELD)
456 u32 reserved1:30;
457 u32 isTMForPD:1;
458 u32 isTMForLD:1;
459#else
460 u32 isTMForLD:1;
461 u32 isTMForPD:1;
462 u32 reserved1:30;
463#endif
464 u32 reserved2;
465 } tmReqFlags;
466 struct MR_TM_REPLY TMReply;
467 };
468};
469
470
471
472#define MPI2_SCSITASKMGMT_TASKTYPE_ABORT_TASK (0x01)
473#define MPI2_SCSITASKMGMT_TASKTYPE_ABRT_TASK_SET (0x02)
474#define MPI2_SCSITASKMGMT_TASKTYPE_TARGET_RESET (0x03)
475#define MPI2_SCSITASKMGMT_TASKTYPE_LOGICAL_UNIT_RESET (0x05)
476#define MPI2_SCSITASKMGMT_TASKTYPE_CLEAR_TASK_SET (0x06)
477#define MPI2_SCSITASKMGMT_TASKTYPE_QUERY_TASK (0x07)
478#define MPI2_SCSITASKMGMT_TASKTYPE_CLR_ACA (0x08)
479#define MPI2_SCSITASKMGMT_TASKTYPE_QRY_TASK_SET (0x09)
480#define MPI2_SCSITASKMGMT_TASKTYPE_QRY_ASYNC_EVENT (0x0A)
481
482
483
484#define MPI2_SCSITASKMGMT_RSP_TM_COMPLETE (0x00)
485#define MPI2_SCSITASKMGMT_RSP_INVALID_FRAME (0x02)
486#define MPI2_SCSITASKMGMT_RSP_TM_NOT_SUPPORTED (0x04)
487#define MPI2_SCSITASKMGMT_RSP_TM_FAILED (0x05)
488#define MPI2_SCSITASKMGMT_RSP_TM_SUCCEEDED (0x08)
489#define MPI2_SCSITASKMGMT_RSP_TM_INVALID_LUN (0x09)
490#define MPI2_SCSITASKMGMT_RSP_TM_OVERLAPPED_TAG (0x0A)
491#define MPI2_SCSITASKMGMT_RSP_IO_QUEUED_ON_IOC (0x80)
492
493
494
495
496
497struct MPI2_RAID_SCSI_IO_REQUEST {
498 __le16 DevHandle;
499 u8 ChainOffset;
500 u8 Function;
501 __le16 Reserved1;
502 u8 Reserved2;
503 u8 MsgFlags;
504 u8 VP_ID;
505 u8 VF_ID;
506 __le16 Reserved3;
507 __le32 SenseBufferLowAddress;
508 __le16 SGLFlags;
509 u8 SenseBufferLength;
510 u8 Reserved4;
511 u8 SGLOffset0;
512 u8 SGLOffset1;
513 u8 SGLOffset2;
514 u8 SGLOffset3;
515 __le32 SkipCount;
516 __le32 DataLength;
517 __le32 BidirectionalDataLength;
518 __le16 IoFlags;
519 __le16 EEDPFlags;
520 __le32 EEDPBlockSize;
521 __le32 SecondaryReferenceTag;
522 __le16 SecondaryApplicationTag;
523 __le16 ApplicationTagTranslationMask;
524 u8 LUN[8];
525 __le32 Control;
526 union MPI2_SCSI_IO_CDB_UNION CDB;
527 union RAID_CONTEXT_UNION RaidContext;
528 union MPI2_SGE_IO_UNION SGL;
529};
530
531
532
533
534struct MEGASAS_RAID_MFA_IO_REQUEST_DESCRIPTOR {
535 u32 RequestFlags:8;
536 u32 MessageAddress1:24;
537 u32 MessageAddress2;
538};
539
540
541struct MPI2_DEFAULT_REQUEST_DESCRIPTOR {
542 u8 RequestFlags;
543 u8 MSIxIndex;
544 __le16 SMID;
545 __le16 LMID;
546 __le16 DescriptorTypeDependent;
547};
548
549
550struct MPI2_HIGH_PRIORITY_REQUEST_DESCRIPTOR {
551 u8 RequestFlags;
552 u8 MSIxIndex;
553 __le16 SMID;
554 __le16 LMID;
555 __le16 Reserved1;
556};
557
558
559struct MPI2_SCSI_IO_REQUEST_DESCRIPTOR {
560 u8 RequestFlags;
561 u8 MSIxIndex;
562 __le16 SMID;
563 __le16 LMID;
564 __le16 DevHandle;
565};
566
567
568struct MPI2_SCSI_TARGET_REQUEST_DESCRIPTOR {
569 u8 RequestFlags;
570 u8 MSIxIndex;
571 __le16 SMID;
572 __le16 LMID;
573 __le16 IoIndex;
574};
575
576
577struct MPI2_RAID_ACCEL_REQUEST_DESCRIPTOR {
578 u8 RequestFlags;
579 u8 MSIxIndex;
580 __le16 SMID;
581 __le16 LMID;
582 __le16 Reserved;
583};
584
585
586union MEGASAS_REQUEST_DESCRIPTOR_UNION {
587 struct MPI2_DEFAULT_REQUEST_DESCRIPTOR Default;
588 struct MPI2_HIGH_PRIORITY_REQUEST_DESCRIPTOR HighPriority;
589 struct MPI2_SCSI_IO_REQUEST_DESCRIPTOR SCSIIO;
590 struct MPI2_SCSI_TARGET_REQUEST_DESCRIPTOR SCSITarget;
591 struct MPI2_RAID_ACCEL_REQUEST_DESCRIPTOR RAIDAccelerator;
592 struct MEGASAS_RAID_MFA_IO_REQUEST_DESCRIPTOR MFAIo;
593 union {
594 struct {
595 __le32 low;
596 __le32 high;
597 } u;
598 __le64 Words;
599 };
600};
601
602
603struct MPI2_DEFAULT_REPLY_DESCRIPTOR {
604 u8 ReplyFlags;
605 u8 MSIxIndex;
606 __le16 DescriptorTypeDependent1;
607 __le32 DescriptorTypeDependent2;
608};
609
610
611struct MPI2_ADDRESS_REPLY_DESCRIPTOR {
612 u8 ReplyFlags;
613 u8 MSIxIndex;
614 __le16 SMID;
615 __le32 ReplyFrameAddress;
616};
617
618
619struct MPI2_SCSI_IO_SUCCESS_REPLY_DESCRIPTOR {
620 u8 ReplyFlags;
621 u8 MSIxIndex;
622 __le16 SMID;
623 __le16 TaskTag;
624 __le16 Reserved1;
625};
626
627
628struct MPI2_TARGETASSIST_SUCCESS_REPLY_DESCRIPTOR {
629 u8 ReplyFlags;
630 u8 MSIxIndex;
631 __le16 SMID;
632 u8 SequenceNumber;
633 u8 Reserved1;
634 __le16 IoIndex;
635};
636
637
638struct MPI2_TARGET_COMMAND_BUFFER_REPLY_DESCRIPTOR {
639 u8 ReplyFlags;
640 u8 MSIxIndex;
641 u8 VP_ID;
642 u8 Flags;
643 __le16 InitiatorDevHandle;
644 __le16 IoIndex;
645};
646
647
648struct MPI2_RAID_ACCELERATOR_SUCCESS_REPLY_DESCRIPTOR {
649 u8 ReplyFlags;
650 u8 MSIxIndex;
651 __le16 SMID;
652 __le32 Reserved;
653};
654
655
656union MPI2_REPLY_DESCRIPTORS_UNION {
657 struct MPI2_DEFAULT_REPLY_DESCRIPTOR Default;
658 struct MPI2_ADDRESS_REPLY_DESCRIPTOR AddressReply;
659 struct MPI2_SCSI_IO_SUCCESS_REPLY_DESCRIPTOR SCSIIOSuccess;
660 struct MPI2_TARGETASSIST_SUCCESS_REPLY_DESCRIPTOR TargetAssistSuccess;
661 struct MPI2_TARGET_COMMAND_BUFFER_REPLY_DESCRIPTOR TargetCommandBuffer;
662 struct MPI2_RAID_ACCELERATOR_SUCCESS_REPLY_DESCRIPTOR
663 RAIDAcceleratorSuccess;
664 __le64 Words;
665};
666
667
668struct MPI2_IOC_INIT_REQUEST {
669 u8 WhoInit;
670 u8 Reserved1;
671 u8 ChainOffset;
672 u8 Function;
673 __le16 Reserved2;
674 u8 Reserved3;
675 u8 MsgFlags;
676 u8 VP_ID;
677 u8 VF_ID;
678 __le16 Reserved4;
679 __le16 MsgVersion;
680 __le16 HeaderVersion;
681 u32 Reserved5;
682 __le16 Reserved6;
683 u8 HostPageSize;
684 u8 HostMSIxVectors;
685 __le16 Reserved8;
686 __le16 SystemRequestFrameSize;
687 __le16 ReplyDescriptorPostQueueDepth;
688 __le16 ReplyFreeQueueDepth;
689 __le32 SenseBufferAddressHigh;
690 __le32 SystemReplyAddressHigh;
691 __le64 SystemRequestFrameBaseAddress;
692 __le64 ReplyDescriptorPostQueueAddress;
693 __le64 ReplyFreeQueueAddress;
694 __le64 TimeStamp;
695};
696
697
698#define MR_PD_INVALID 0xFFFF
699#define MR_DEVHANDLE_INVALID 0xFFFF
700#define MAX_SPAN_DEPTH 8
701#define MAX_QUAD_DEPTH MAX_SPAN_DEPTH
702#define MAX_RAIDMAP_SPAN_DEPTH (MAX_SPAN_DEPTH)
703#define MAX_ROW_SIZE 32
704#define MAX_RAIDMAP_ROW_SIZE (MAX_ROW_SIZE)
705#define MAX_LOGICAL_DRIVES 64
706#define MAX_LOGICAL_DRIVES_EXT 256
707#define MAX_LOGICAL_DRIVES_DYN 512
708#define MAX_RAIDMAP_LOGICAL_DRIVES (MAX_LOGICAL_DRIVES)
709#define MAX_RAIDMAP_VIEWS (MAX_LOGICAL_DRIVES)
710#define MAX_ARRAYS 128
711#define MAX_RAIDMAP_ARRAYS (MAX_ARRAYS)
712#define MAX_ARRAYS_EXT 256
713#define MAX_API_ARRAYS_EXT (MAX_ARRAYS_EXT)
714#define MAX_API_ARRAYS_DYN 512
715#define MAX_PHYSICAL_DEVICES 256
716#define MAX_RAIDMAP_PHYSICAL_DEVICES (MAX_PHYSICAL_DEVICES)
717#define MAX_RAIDMAP_PHYSICAL_DEVICES_DYN 512
718#define MR_DCMD_LD_MAP_GET_INFO 0x0300e101
719#define MR_DCMD_SYSTEM_PD_MAP_GET_INFO 0x0200e102
720#define MR_DCMD_DRV_GET_TARGET_PROP 0x0200e103
721#define MR_DCMD_CTRL_SHARED_HOST_MEM_ALLOC 0x010e8485
722#define MR_DCMD_LD_VF_MAP_GET_ALL_LDS_111 0x03200200
723#define MR_DCMD_LD_VF_MAP_GET_ALL_LDS 0x03150200
724#define MR_DCMD_CTRL_SNAPDUMP_GET_PROPERTIES 0x01200100
725#define MR_DCMD_CTRL_DEVICE_LIST_GET 0x01190600
726
727struct MR_DEV_HANDLE_INFO {
728 __le16 curDevHdl;
729 u8 validHandles;
730 u8 interfaceType;
731 __le16 devHandle[2];
732};
733
734struct MR_ARRAY_INFO {
735 __le16 pd[MAX_RAIDMAP_ROW_SIZE];
736};
737
738struct MR_QUAD_ELEMENT {
739 __le64 logStart;
740 __le64 logEnd;
741 __le64 offsetInSpan;
742 __le32 diff;
743 __le32 reserved1;
744};
745
746struct MR_SPAN_INFO {
747 __le32 noElements;
748 __le32 reserved1;
749 struct MR_QUAD_ELEMENT quad[MAX_RAIDMAP_SPAN_DEPTH];
750};
751
752struct MR_LD_SPAN {
753 __le64 startBlk;
754 __le64 numBlks;
755 __le16 arrayRef;
756 u8 spanRowSize;
757 u8 spanRowDataSize;
758 u8 reserved[4];
759};
760
761struct MR_SPAN_BLOCK_INFO {
762 __le64 num_rows;
763 struct MR_LD_SPAN span;
764 struct MR_SPAN_INFO block_span_info;
765};
766
767#define MR_RAID_CTX_CPUSEL_0 0
768#define MR_RAID_CTX_CPUSEL_1 1
769#define MR_RAID_CTX_CPUSEL_2 2
770#define MR_RAID_CTX_CPUSEL_3 3
771#define MR_RAID_CTX_CPUSEL_FCFS 0xF
772
773struct MR_CPU_AFFINITY_MASK {
774 union {
775 struct {
776#ifndef MFI_BIG_ENDIAN
777 u8 hw_path:1;
778 u8 cpu0:1;
779 u8 cpu1:1;
780 u8 cpu2:1;
781 u8 cpu3:1;
782 u8 reserved:3;
783#else
784 u8 reserved:3;
785 u8 cpu3:1;
786 u8 cpu2:1;
787 u8 cpu1:1;
788 u8 cpu0:1;
789 u8 hw_path:1;
790#endif
791 };
792 u8 core_mask;
793 };
794};
795
796struct MR_IO_AFFINITY {
797 union {
798 struct {
799 struct MR_CPU_AFFINITY_MASK pdRead;
800 struct MR_CPU_AFFINITY_MASK pdWrite;
801 struct MR_CPU_AFFINITY_MASK ldRead;
802 struct MR_CPU_AFFINITY_MASK ldWrite;
803 };
804 u32 word;
805 };
806 u8 maxCores;
807 u8 reserved[3];
808};
809
810struct MR_LD_RAID {
811 struct {
812#if defined(__BIG_ENDIAN_BITFIELD)
813 u32 reserved4:2;
814 u32 fp_cache_bypass_capable:1;
815 u32 fp_rmw_capable:1;
816 u32 disable_coalescing:1;
817 u32 fpBypassRegionLock:1;
818 u32 tmCapable:1;
819 u32 fpNonRWCapable:1;
820 u32 fpReadAcrossStripe:1;
821 u32 fpWriteAcrossStripe:1;
822 u32 fpReadCapable:1;
823 u32 fpWriteCapable:1;
824 u32 encryptionType:8;
825 u32 pdPiMode:4;
826 u32 ldPiMode:4;
827 u32 reserved5:2;
828 u32 ra_capable:1;
829 u32 fpCapable:1;
830#else
831 u32 fpCapable:1;
832 u32 ra_capable:1;
833 u32 reserved5:2;
834 u32 ldPiMode:4;
835 u32 pdPiMode:4;
836 u32 encryptionType:8;
837 u32 fpWriteCapable:1;
838 u32 fpReadCapable:1;
839 u32 fpWriteAcrossStripe:1;
840 u32 fpReadAcrossStripe:1;
841 u32 fpNonRWCapable:1;
842 u32 tmCapable:1;
843 u32 fpBypassRegionLock:1;
844 u32 disable_coalescing:1;
845 u32 fp_rmw_capable:1;
846 u32 fp_cache_bypass_capable:1;
847 u32 reserved4:2;
848#endif
849 } capability;
850 __le32 reserved6;
851 __le64 size;
852 u8 spanDepth;
853 u8 level;
854 u8 stripeShift;
855 u8 rowSize;
856 u8 rowDataSize;
857 u8 writeMode;
858 u8 PRL;
859 u8 SRL;
860 __le16 targetId;
861 u8 ldState;
862 u8 regTypeReqOnWrite;
863 u8 modFactor;
864 u8 regTypeReqOnRead;
865 __le16 seqNum;
866
867 struct {
868 u32 ldSyncRequired:1;
869 u32 reserved:31;
870 } flags;
871
872 u8 LUN[8];
873 u8 fpIoTimeoutForLd;
874
875 u8 ld_accept_priority_type;
876 u8 reserved2[2];
877
878 u32 logical_block_length;
879 struct {
880#ifndef MFI_BIG_ENDIAN
881
882 u32 ld_pi_exp:4;
883
884
885
886 u32 ld_logical_block_exp:4;
887 u32 reserved1:24;
888#else
889 u32 reserved1:24;
890
891
892
893 u32 ld_logical_block_exp:4;
894
895 u32 ld_pi_exp:4;
896#endif
897 };
898
899
900
901 struct MR_IO_AFFINITY cpuAffinity;
902
903 u8 reserved3[0x80 - 0x40];
904};
905
906struct MR_LD_SPAN_MAP {
907 struct MR_LD_RAID ldRaid;
908 u8 dataArmMap[MAX_RAIDMAP_ROW_SIZE];
909 struct MR_SPAN_BLOCK_INFO spanBlock[MAX_RAIDMAP_SPAN_DEPTH];
910};
911
912struct MR_FW_RAID_MAP {
913 __le32 totalSize;
914 union {
915 struct {
916 __le32 maxLd;
917 __le32 maxSpanDepth;
918 __le32 maxRowSize;
919 __le32 maxPdCount;
920 __le32 maxArrays;
921 } validationInfo;
922 __le32 version[5];
923 };
924
925 __le32 ldCount;
926 __le32 Reserved1;
927 u8 ldTgtIdToLd[MAX_RAIDMAP_LOGICAL_DRIVES+
928 MAX_RAIDMAP_VIEWS];
929 u8 fpPdIoTimeoutSec;
930 u8 reserved2[7];
931 struct MR_ARRAY_INFO arMapInfo[MAX_RAIDMAP_ARRAYS];
932 struct MR_DEV_HANDLE_INFO devHndlInfo[MAX_RAIDMAP_PHYSICAL_DEVICES];
933 struct MR_LD_SPAN_MAP ldSpanMap[1];
934};
935
936struct IO_REQUEST_INFO {
937 u64 ldStartBlock;
938 u32 numBlocks;
939 u16 ldTgtId;
940 u8 isRead;
941 __le16 devHandle;
942 u8 pd_interface;
943 u64 pdBlock;
944 u8 fpOkForIo;
945 u8 IoforUnevenSpan;
946 u8 start_span;
947 u8 do_fp_rlbypass;
948 u64 start_row;
949 u8 span_arm;
950 u8 pd_after_lb;
951 u16 r1_alt_dev_handle;
952 bool ra_capable;
953 u8 data_arms;
954};
955
956struct MR_LD_TARGET_SYNC {
957 u8 targetId;
958 u8 reserved;
959 __le16 seqNum;
960};
961
962
963
964
965
966enum MR_RAID_MAP_DESC_TYPE {
967
968 RAID_MAP_DESC_TYPE_DEVHDL_INFO = 0x0,
969
970 RAID_MAP_DESC_TYPE_TGTID_INFO = 0x1,
971
972 RAID_MAP_DESC_TYPE_ARRAY_INFO = 0x2,
973
974 RAID_MAP_DESC_TYPE_SPAN_INFO = 0x3,
975 RAID_MAP_DESC_TYPE_COUNT,
976};
977
978
979
980
981
982struct MR_RAID_MAP_DESC_TABLE {
983
984 u32 raid_map_desc_type;
985
986
987
988 u32 raid_map_desc_offset;
989
990
991
992 u32 raid_map_desc_buffer_size;
993
994
995
996 u32 raid_map_desc_elements;
997};
998
999
1000
1001
1002struct MR_FW_RAID_MAP_DYNAMIC {
1003 u32 raid_map_size;
1004 u32 desc_table_offset;
1005 u32 desc_table_size;
1006
1007 u32 desc_table_num_elements;
1008 u64 reserved1;
1009 u32 reserved2[3];
1010
1011 u8 fp_pd_io_timeout_sec;
1012 u8 reserved3[3];
1013
1014
1015
1016 u32 rmw_fp_seq_num;
1017 u16 ld_count;
1018 u16 ar_count;
1019 u16 span_count;
1020 u16 reserved4[3];
1021
1022
1023
1024
1025
1026
1027 union {
1028 struct {
1029 struct MR_DEV_HANDLE_INFO *dev_hndl_info;
1030 u16 *ld_tgt_id_to_ld;
1031 struct MR_ARRAY_INFO *ar_map_info;
1032 struct MR_LD_SPAN_MAP *ld_span_map;
1033 };
1034 u64 ptr_structure_size[RAID_MAP_DESC_TYPE_COUNT];
1035 };
1036
1037
1038
1039
1040
1041 struct MR_RAID_MAP_DESC_TABLE
1042 raid_map_desc_table[RAID_MAP_DESC_TYPE_COUNT];
1043
1044 u32 raid_map_desc_data[1];
1045};
1046
1047#define IEEE_SGE_FLAGS_ADDR_MASK (0x03)
1048#define IEEE_SGE_FLAGS_SYSTEM_ADDR (0x00)
1049#define IEEE_SGE_FLAGS_IOCDDR_ADDR (0x01)
1050#define IEEE_SGE_FLAGS_IOCPLB_ADDR (0x02)
1051#define IEEE_SGE_FLAGS_IOCPLBNTA_ADDR (0x03)
1052#define IEEE_SGE_FLAGS_CHAIN_ELEMENT (0x80)
1053#define IEEE_SGE_FLAGS_END_OF_LIST (0x40)
1054
1055#define MPI2_SGE_FLAGS_SHIFT (0x02)
1056#define IEEE_SGE_FLAGS_FORMAT_MASK (0xC0)
1057#define IEEE_SGE_FLAGS_FORMAT_IEEE (0x00)
1058#define IEEE_SGE_FLAGS_FORMAT_NVME (0x02)
1059
1060#define MPI26_IEEE_SGE_FLAGS_NSF_MASK (0x1C)
1061#define MPI26_IEEE_SGE_FLAGS_NSF_MPI_IEEE (0x00)
1062#define MPI26_IEEE_SGE_FLAGS_NSF_NVME_PRP (0x08)
1063#define MPI26_IEEE_SGE_FLAGS_NSF_NVME_SGL (0x10)
1064
1065#define MEGASAS_DEFAULT_SNAP_DUMP_WAIT_TIME 15
1066#define MEGASAS_MAX_SNAP_DUMP_WAIT_TIME 60
1067
1068struct megasas_register_set;
1069struct megasas_instance;
1070
1071union desc_word {
1072 u64 word;
1073 struct {
1074 u32 low;
1075 u32 high;
1076 } u;
1077};
1078
1079struct megasas_cmd_fusion {
1080 struct MPI2_RAID_SCSI_IO_REQUEST *io_request;
1081 dma_addr_t io_request_phys_addr;
1082
1083 union MPI2_SGE_IO_UNION *sg_frame;
1084 dma_addr_t sg_frame_phys_addr;
1085
1086 u8 *sense;
1087 dma_addr_t sense_phys_addr;
1088
1089 struct list_head list;
1090 struct scsi_cmnd *scmd;
1091 struct megasas_instance *instance;
1092
1093 u8 retry_for_fw_reset;
1094 union MEGASAS_REQUEST_DESCRIPTOR_UNION *request_desc;
1095
1096
1097
1098
1099
1100 u32 sync_cmd_idx;
1101 u32 index;
1102 u8 pd_r1_lb;
1103 struct completion done;
1104 u8 pd_interface;
1105 u16 r1_alt_dev_handle;
1106 bool cmd_completed;
1107
1108};
1109
1110struct LD_LOAD_BALANCE_INFO {
1111 u8 loadBalanceFlag;
1112 u8 reserved1;
1113 atomic_t scsi_pending_cmds[MAX_PHYSICAL_DEVICES];
1114 u64 last_accessed_block[MAX_PHYSICAL_DEVICES];
1115};
1116
1117
1118typedef struct _LD_SPAN_SET {
1119 u64 log_start_lba;
1120 u64 log_end_lba;
1121 u64 span_row_start;
1122 u64 span_row_end;
1123 u64 data_strip_start;
1124 u64 data_strip_end;
1125 u64 data_row_start;
1126 u64 data_row_end;
1127 u8 strip_offset[MAX_SPAN_DEPTH];
1128 u32 span_row_data_width;
1129 u32 diff;
1130 u32 reserved[2];
1131} LD_SPAN_SET, *PLD_SPAN_SET;
1132
1133typedef struct LOG_BLOCK_SPAN_INFO {
1134 LD_SPAN_SET span_set[MAX_SPAN_DEPTH];
1135} LD_SPAN_INFO, *PLD_SPAN_INFO;
1136
1137struct MR_FW_RAID_MAP_ALL {
1138 struct MR_FW_RAID_MAP raidMap;
1139 struct MR_LD_SPAN_MAP ldSpanMap[MAX_LOGICAL_DRIVES - 1];
1140} __attribute__ ((packed));
1141
1142struct MR_DRV_RAID_MAP {
1143
1144
1145
1146
1147 __le32 totalSize;
1148
1149 union {
1150 struct {
1151 __le32 maxLd;
1152 __le32 maxSpanDepth;
1153 __le32 maxRowSize;
1154 __le32 maxPdCount;
1155 __le32 maxArrays;
1156 } validationInfo;
1157 __le32 version[5];
1158 };
1159
1160
1161 u8 fpPdIoTimeoutSec;
1162 u8 reserved2[7];
1163
1164 __le16 ldCount;
1165 __le16 arCount;
1166 __le16 spanCount;
1167 __le16 reserve3;
1168
1169 struct MR_DEV_HANDLE_INFO
1170 devHndlInfo[MAX_RAIDMAP_PHYSICAL_DEVICES_DYN];
1171 u16 ldTgtIdToLd[MAX_LOGICAL_DRIVES_DYN];
1172 struct MR_ARRAY_INFO arMapInfo[MAX_API_ARRAYS_DYN];
1173 struct MR_LD_SPAN_MAP ldSpanMap[1];
1174
1175};
1176
1177
1178
1179
1180
1181struct MR_DRV_RAID_MAP_ALL {
1182
1183 struct MR_DRV_RAID_MAP raidMap;
1184 struct MR_LD_SPAN_MAP ldSpanMap[MAX_LOGICAL_DRIVES_DYN - 1];
1185} __packed;
1186
1187
1188
1189struct MR_FW_RAID_MAP_EXT {
1190
1191 u32 reserved;
1192
1193 union {
1194 struct {
1195 u32 maxLd;
1196 u32 maxSpanDepth;
1197 u32 maxRowSize;
1198 u32 maxPdCount;
1199 u32 maxArrays;
1200 } validationInfo;
1201 u32 version[5];
1202 };
1203
1204 u8 fpPdIoTimeoutSec;
1205 u8 reserved2[7];
1206
1207 __le16 ldCount;
1208 __le16 arCount;
1209 __le16 spanCount;
1210 __le16 reserve3;
1211
1212 struct MR_DEV_HANDLE_INFO devHndlInfo[MAX_RAIDMAP_PHYSICAL_DEVICES];
1213 u8 ldTgtIdToLd[MAX_LOGICAL_DRIVES_EXT];
1214 struct MR_ARRAY_INFO arMapInfo[MAX_API_ARRAYS_EXT];
1215 struct MR_LD_SPAN_MAP ldSpanMap[MAX_LOGICAL_DRIVES_EXT];
1216};
1217
1218
1219
1220
1221struct MR_PD_CFG_SEQ {
1222 u16 seqNum;
1223 u16 devHandle;
1224 struct {
1225#if defined(__BIG_ENDIAN_BITFIELD)
1226 u8 reserved:7;
1227 u8 tmCapable:1;
1228#else
1229 u8 tmCapable:1;
1230 u8 reserved:7;
1231#endif
1232 } capability;
1233 u8 reserved;
1234 u16 pd_target_id;
1235} __packed;
1236
1237struct MR_PD_CFG_SEQ_NUM_SYNC {
1238 __le32 size;
1239 __le32 count;
1240 struct MR_PD_CFG_SEQ seq[1];
1241} __packed;
1242
1243
1244struct STREAM_DETECT {
1245 u64 next_seq_lba;
1246 struct megasas_cmd_fusion *first_cmd_fusion;
1247 struct megasas_cmd_fusion *last_cmd_fusion;
1248 u32 count_cmds_in_stream;
1249 u16 num_sges_in_group;
1250 u8 is_read;
1251 u8 group_depth;
1252
1253 bool group_flush;
1254 u8 reserved[7];
1255};
1256
1257struct LD_STREAM_DETECT {
1258 bool write_back;
1259 bool fp_write_enabled;
1260 bool members_ssds;
1261 bool fp_cache_bypass_capable;
1262 u32 mru_bit_map;
1263
1264 struct STREAM_DETECT stream_track[MAX_STREAMS_TRACKED];
1265};
1266
1267struct MPI2_IOC_INIT_RDPQ_ARRAY_ENTRY {
1268 u64 RDPQBaseAddress;
1269 u32 Reserved1;
1270 u32 Reserved2;
1271};
1272
1273struct rdpq_alloc_detail {
1274 struct dma_pool *dma_pool_ptr;
1275 dma_addr_t pool_entry_phys;
1276 union MPI2_REPLY_DESCRIPTORS_UNION *pool_entry_virt;
1277};
1278
1279struct fusion_context {
1280 struct megasas_cmd_fusion **cmd_list;
1281 dma_addr_t req_frames_desc_phys;
1282 u8 *req_frames_desc;
1283
1284 struct dma_pool *io_request_frames_pool;
1285 dma_addr_t io_request_frames_phys;
1286 u8 *io_request_frames;
1287
1288 struct dma_pool *sg_dma_pool;
1289 struct dma_pool *sense_dma_pool;
1290
1291 u8 *sense;
1292 dma_addr_t sense_phys_addr;
1293
1294 dma_addr_t reply_frames_desc_phys[MAX_MSIX_QUEUES_FUSION];
1295 union MPI2_REPLY_DESCRIPTORS_UNION *reply_frames_desc[MAX_MSIX_QUEUES_FUSION];
1296 struct rdpq_alloc_detail rdpq_tracker[RDPQ_MAX_CHUNK_COUNT];
1297 struct dma_pool *reply_frames_desc_pool;
1298 struct dma_pool *reply_frames_desc_pool_align;
1299
1300 u16 last_reply_idx[MAX_MSIX_QUEUES_FUSION];
1301
1302 u32 reply_q_depth;
1303 u32 request_alloc_sz;
1304 u32 reply_alloc_sz;
1305 u32 io_frames_alloc_sz;
1306
1307 struct MPI2_IOC_INIT_RDPQ_ARRAY_ENTRY *rdpq_virt;
1308 dma_addr_t rdpq_phys;
1309 u16 max_sge_in_main_msg;
1310 u16 max_sge_in_chain;
1311
1312 u8 chain_offset_io_request;
1313 u8 chain_offset_mfi_pthru;
1314
1315 struct MR_FW_RAID_MAP_DYNAMIC *ld_map[2];
1316 dma_addr_t ld_map_phys[2];
1317
1318
1319 struct MR_DRV_RAID_MAP_ALL *ld_drv_map[2];
1320
1321 u32 max_map_sz;
1322 u32 current_map_sz;
1323 u32 old_map_sz;
1324 u32 new_map_sz;
1325 u32 drv_map_sz;
1326 u32 drv_map_pages;
1327 struct MR_PD_CFG_SEQ_NUM_SYNC *pd_seq_sync[JBOD_MAPS_COUNT];
1328 dma_addr_t pd_seq_phys[JBOD_MAPS_COUNT];
1329 u8 fast_path_io;
1330 struct LD_LOAD_BALANCE_INFO *load_balance_info;
1331 u32 load_balance_info_pages;
1332 LD_SPAN_INFO *log_to_span;
1333 u32 log_to_span_pages;
1334 struct LD_STREAM_DETECT **stream_detect_by_ld;
1335 dma_addr_t ioc_init_request_phys;
1336 struct MPI2_IOC_INIT_REQUEST *ioc_init_request;
1337 struct megasas_cmd *ioc_init_cmd;
1338 bool pcie_bw_limitation;
1339 bool r56_div_offload;
1340};
1341
1342union desc_value {
1343 __le64 word;
1344 struct {
1345 __le32 low;
1346 __le32 high;
1347 } u;
1348};
1349
1350enum CMD_RET_VALUES {
1351 REFIRE_CMD = 1,
1352 COMPLETE_CMD = 2,
1353 RETURN_CMD = 3,
1354};
1355
1356struct MR_SNAPDUMP_PROPERTIES {
1357 u8 offload_num;
1358 u8 max_num_supported;
1359 u8 cur_num_supported;
1360 u8 trigger_min_num_sec_before_ocr;
1361 u8 reserved[12];
1362};
1363
1364struct megasas_debugfs_buffer {
1365 void *buf;
1366 u32 len;
1367};
1368
1369void megasas_free_cmds_fusion(struct megasas_instance *instance);
1370int megasas_ioc_init_fusion(struct megasas_instance *instance);
1371u8 megasas_get_map_info(struct megasas_instance *instance);
1372int megasas_sync_map_info(struct megasas_instance *instance);
1373void megasas_release_fusion(struct megasas_instance *instance);
1374void megasas_reset_reply_desc(struct megasas_instance *instance);
1375int megasas_check_mpio_paths(struct megasas_instance *instance,
1376 struct scsi_cmnd *scmd);
1377void megasas_fusion_ocr_wq(struct work_struct *work);
1378
1379#endif
1380