xref: /freebsd/sys/dev/isci/scil/scu_task_context.h (revision e8d8bef961a50d4dc22501cde4fb9fb0be1b2532)
1 /*-
2  * SPDX-License-Identifier: BSD-2-Clause OR GPL-2.0
3  *
4  * This file is provided under a dual BSD/GPLv2 license.  When using or
5  * redistributing this file, you may do so under either license.
6  *
7  * GPL LICENSE SUMMARY
8  *
9  * Copyright(c) 2008 - 2011 Intel Corporation. All rights reserved.
10  *
11  * This program is free software; you can redistribute it and/or modify
12  * it under the terms of version 2 of the GNU General Public License as
13  * published by the Free Software Foundation.
14  *
15  * This program is distributed in the hope that it will be useful, but
16  * WITHOUT ANY WARRANTY; without even the implied warranty of
17  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
18  * General Public License for more details.
19  *
20  * You should have received a copy of the GNU General Public License
21  * along with this program; if not, write to the Free Software
22  * Foundation, Inc., 51 Franklin St - Fifth Floor, Boston, MA 02110-1301 USA.
23  * The full GNU General Public License is included in this distribution
24  * in the file called LICENSE.GPL.
25  *
26  * BSD LICENSE
27  *
28  * Copyright(c) 2008 - 2011 Intel Corporation. All rights reserved.
29  * All rights reserved.
30  *
31  * Redistribution and use in source and binary forms, with or without
32  * modification, are permitted provided that the following conditions
33  * are met:
34  *
35  *   * Redistributions of source code must retain the above copyright
36  *     notice, this list of conditions and the following disclaimer.
37  *   * Redistributions in binary form must reproduce the above copyright
38  *     notice, this list of conditions and the following disclaimer in
39  *     the documentation and/or other materials provided with the
40  *     distribution.
41  *
42  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
43  * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
44  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
45  * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
46  * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
47  * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
48  * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
49  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
50  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
51  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
52  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
53  *
54  * $FreeBSD$
55  */
56 #ifndef _SCU_TASK_CONTEXT_H_
57 #define _SCU_TASK_CONTEXT_H_
58 
59 /**
60  * @file
61  *
62  * @brief This file contains the structures and constants for the SCU hardware
63  *        task context.
64  */
65 
66 #ifdef __cplusplus
67 extern "C" {
68 #endif // __cplusplus
69 
70 #include <dev/isci/scil/sci_types.h>
71 
72 /**
73  * @enum SCU_SSP_TASK_TYPE
74  *
75  * @brief This enumberation defines the various SSP task types the SCU
76  *        hardware will accept.
77  *
78  * The definition for the various task types the SCU hardware will accept can
79  * be found in the DS specification.
80  */
81 typedef enum
82 {
83     SCU_TASK_TYPE_IOREAD,        ///< IO READ direction or no direction
84     SCU_TASK_TYPE_IOWRITE,       ///< IO Write direction
85     SCU_TASK_TYPE_SMP_REQUEST,   ///< SMP Request type
86     SCU_TASK_TYPE_RESPONSE,      ///< Driver generated response frame (targt mode)
87     SCU_TASK_TYPE_RAW_FRAME,     ///< Raw frame request type
88     SCU_TASK_TYPE_PRIMITIVE      ///< Request for a primitive to be transmitted
89 } SCU_SSP_TASK_TYPE;
90 
91 /**
92  * @enum SCU_SATA_TASK_TYPE
93  *
94  * @brief This enumeration defines the various SATA task types the SCU
95  *        hardware will accept.
96  *
97  * The definition for the various task types the SCU hardware will accept can
98  * be found in the DS specification.
99  */
100 typedef enum
101 {
102     SCU_TASK_TYPE_DMA_IN,           ///< Read request
103     SCU_TASK_TYPE_FPDMAQ_READ,      ///< NCQ read request
104     SCU_TASK_TYPE_PACKET_DMA_IN,    ///< Packet read request
105     SCU_TASK_TYPE_SATA_RAW_FRAME,   ///< Raw frame request
106     RESERVED_4,
107     RESERVED_5,
108     RESERVED_6,
109     RESERVED_7,
110     SCU_TASK_TYPE_DMA_OUT,          ///< Write request
111     SCU_TASK_TYPE_FPDMAQ_WRITE,     ///< NCQ write Request
112     SCU_TASK_TYPE_PACKET_DMA_OUT    ///< Packet write request
113 } SCU_SATA_TASK_TYPE;
114 
115 
116 /**
117  * @name SCU_CONTEXT_TYPE
118  */
119 /*@{*/
120 #define SCU_TASK_CONTEXT_TYPE  0
121 #define SCU_RNC_CONTEXT_TYPE   1
122 /*@}*/
123 
124 /**
125  * @name SCU_TASK_CONTEXT_VALIDITY
126  */
127 /*@{*/
128 #define SCU_TASK_CONTEXT_INVALID          0
129 #define SCU_TASK_CONTEXT_VALID            1
130 /*@}*/
131 
132 /**
133  * @name SCU_COMMAND_CODE
134  */
135 /*@{*/
136 #define SCU_COMMAND_CODE_INITIATOR_NEW_TASK   0
137 #define SCU_COMMAND_CODE_ACTIVE_TASK          1
138 #define SCU_COMMAND_CODE_PRIMITIVE_SEQ_TASK   2
139 #define SCU_COMMAND_CODE_TARGET_RAW_FRAMES    3
140 /*@}*/
141 
142 /**
143  * @name SCU_TASK_PRIORITY
144  */
145 /*@{*/
146 /**
147  * This priority is used when there is no priority request for this request.
148  */
149 #define SCU_TASK_PRIORITY_NORMAL          0
150 
151 /**
152  * This priority indicates that the task should be scheduled to the head
153  * of the queue.  The task will NOT be executed if the TX is suspended for
154  * the remote node.
155  */
156 #define SCU_TASK_PRIORITY_HEAD_OF_Q       1
157 
158 /**
159  * This priority indicates that the task will be executed before all
160  * SCU_TASK_PRIORITY_NORMAL and SCU_TASK_PRIORITY_HEAD_OF_Q tasks.
161  * The task WILL be executed if the TX is suspended for the remote node.
162  */
163 #define SCU_TASK_PRIORITY_HIGH            2
164 
165 /**
166  * This task priority is reserved and should not be used.
167  */
168 #define SCU_TASK_PRIORITY_RESERVED        3
169 /*@}*/
170 
171 #define SCU_TASK_INITIATOR_MODE           1
172 #define SCU_TASK_TARGET_MODE              0
173 
174 #define SCU_TASK_REGULAR                  0
175 #define SCU_TASK_ABORTED                  1
176 
177 //direction bit definition
178 /**
179  * @name SATA_DIRECTION
180  */
181 /*@{*/
182 #define SCU_SATA_WRITE_DATA_DIRECTION     0
183 #define SCU_SATA_READ_DATA_DIRECTION      1
184 /*@}*/
185 
186 /**
187  * @name SCU_COMMAND_CONTEXT_MACROS
188  *
189  * These macros provide the mask and shift operations to construct the various
190  * SCU commands
191  */
192 /*@{*/
193 #define SCU_CONTEXT_COMMAND_REQUEST_TYPE_SHIFT           21UL
194 #define SCU_CONTEXT_COMMAND_REQUEST_TYPE_MASK            0x00E00000UL
195 #define scu_get_command_request_type(x) \
196                ((x) & SCU_CONTEXT_COMMAND_REQUEST_TYPE_MASK)
197 
198 #define SCU_CONTEXT_COMMAND_REQUEST_SUBTYPE_SHIFT        18UL
199 #define SCU_CONTEXT_COMMAND_REQUEST_SUBTYPE_MASK         0x001C0000UL
200 #define scu_get_command_request_subtype(x) \
201                ((x) & SCU_CONTEXT_COMMAND_REQUEST_SUBTYPE_MASK)
202 
203 #define SCU_CONTEXT_COMMAND_REQUEST_FULLTYPE_MASK        \
204    (                                                     \
205        SCU_CONTEXT_COMMAND_REQUEST_TYPE_MASK             \
206      | SCU_CONTEXT_COMMAND_REQUEST_SUBTYPE_MASK          \
207    )
208 #define scu_get_command_request_full_type(x) \
209                ((x) & SCU_CONTEXT_COMMAND_REQUEST_FULLTYPE_MASK)
210 
211 #define SCU_CONTEXT_COMMAND_PROTOCOL_ENGINE_GROUP_SHIFT  16UL
212 #define SCU_CONTEXT_COMMAND_PROTOCOL_ENGINE_GROUP_MASK   0x00010000UL
213 #define scu_get_command_protocl_engine_group(x) \
214                ((x) & SCU_CONTEXT_COMMAND_PROTOCOL_ENGINE_GROUP_MASK)
215 
216 #define SCU_CONTEXT_COMMAND_LOGICAL_PORT_SHIFT           12UL
217 #define SCU_CONTEXT_COMMAND_LOGICAL_PORT_MASK            0x00007000UL
218 #define scu_get_command_reqeust_logical_port(x) \
219                ((x) & SCU_CONTEXT_COMMAND_LOGICAL_PORT_MASK)
220 
221 
222 #define MAKE_SCU_CONTEXT_COMMAND_TYPE(type) \
223    ((U32)(type) << SCU_CONTEXT_COMMAND_REQUEST_TYPE_SHIFT)
224 /*@}*/
225 
226 /**
227  * @name SCU_COMMAND_TYPES
228  *
229  * These constants provide the grouping of the different SCU command types.
230  */
231 /*@{*/
232 #define SCU_CONTEXT_COMMAND_REQUEST_TYPE_POST_TC    MAKE_SCU_CONTEXT_COMMAND_TYPE(0UL)
233 #define SCU_CONTEXT_COMMAND_REQUEST_TYPE_DUMP_TC    MAKE_SCU_CONTEXT_COMMAND_TYPE(1UL)
234 #define SCU_CONTEXT_COMMAND_REQUEST_TYPE_POST_RNC   MAKE_SCU_CONTEXT_COMMAND_TYPE(2UL)
235 #define SCU_CONTEXT_COMMAND_REQUEST_TYPE_DUMP_RNC   MAKE_SCU_CONTEXT_COMMAND_TYPE(3UL)
236 #define SCU_CONTEXT_COMMAND_REQUEST_TYPE_OTHER_RNC  MAKE_SCU_CONTEXT_COMMAND_TYPE(6UL)
237 /*@}*/
238 
239 #define MAKE_SCU_CONTEXT_COMMAND_REQUEST(type, command) \
240    ((type) | (((U32)(command)) << SCU_CONTEXT_COMMAND_REQUEST_SUBTYPE_SHIFT))
241 
242 /**
243  * @name SCU_REQUEST_TYPES
244  *
245  * These constants are the various request types that can be posted to the SCU
246  * hardware.
247  */
248 /*@{*/
249 #define SCU_CONTEXT_COMMAND_REQUST_POST_TC \
250    (MAKE_SCU_CONTEXT_COMMAND_REQUEST(SCU_CONTEXT_COMMAND_REQUEST_TYPE_POST_TC, 0))
251 
252 #define SCU_CONTEXT_COMMAND_REQUEST_POST_TC_ABORT \
253    (MAKE_SCU_CONTEXT_COMMAND_REQUEST(SCU_CONTEXT_COMMAND_REQUEST_TYPE_POST_TC, 1))
254 
255 #define SCU_CONTEXT_COMMAND_REQUST_DUMP_TC \
256    (MAKE_SCU_CONTEXT_COMMAND_REQUEST(SCU_CONTEXT_COMMAND_REQUEST_TYPE_DUMP_TC, 0))
257 
258 #define SCU_CONTEXT_COMMAND_POST_RNC_32 \
259    (MAKE_SCU_CONTEXT_COMMAND_REQUEST(SCU_CONTEXT_COMMAND_REQUEST_TYPE_POST_RNC, 0))
260 
261 #define SCU_CONTEXT_COMMAND_POST_RNC_96 \
262    (MAKE_SCU_CONTEXT_COMMAND_REQUEST(SCU_CONTEXT_COMMAND_REQUEST_TYPE_POST_RNC, 1))
263 
264 #define SCU_CONTEXT_COMMAND_POST_RNC_INVALIDATE \
265    (MAKE_SCU_CONTEXT_COMMAND_REQUEST(SCU_CONTEXT_COMMAND_REQUEST_TYPE_POST_RNC, 2))
266 
267 #define SCU_CONTEXT_COMMAND_DUMP_RNC_32 \
268    (MAKE_SCU_CONTEXT_COMMAND_REQUEST(SCU_CONTEXT_COMMAND_REQUEST_TYPE_DUMP_RNC, 0))
269 
270 #define SCU_CONTEXT_COMMAND_DUMP_RNC_96 \
271    (MAKE_SCU_CONTEXT_COMMAND_REQUEST(SCU_CONTEXT_COMMAND_REQUEST_TYPE_DUMP_RNC, 1))
272 
273 #define SCU_CONTEXT_COMMAND_POST_RNC_SUSPEND_TX \
274    (MAKE_SCU_CONTEXT_COMMAND_REQUEST(SCU_CONTEXT_COMMAND_REQUEST_TYPE_OTHER_RNC, 0))
275 
276 #define SCU_CONTEXT_COMMAND_POST_RNC_SUSPEND_TX_RX \
277    (MAKE_SCU_CONTEXT_COMMAND_REQUEST(SCU_CONTEXT_COMMAND_REQUEST_TYPE_OTHER_RNC, 1))
278 
279 #define SCU_CONTEXT_COMMAND_POST_RNC_RESUME \
280    (MAKE_SCU_CONTEXT_COMMAND_REQUEST(SCU_CONTEXT_COMMAND_REQUEST_TYPE_OTHER_RNC, 2))
281 
282 #define SCU_CONTEXT_IT_NEXUS_LOSS_TIMER_ENABLE \
283    (MAKE_SCU_CONTEXT_COMMAND_REQUEST(SCU_CONTEXT_COMMAND_REQUEST_TYPE_OTHER_RNC, 3))
284 
285 #define SCU_CONTEXT_IT_NEXUS_LOSS_TIMER_DISABLE \
286    (MAKE_SCU_CONTEXT_COMMAND_REQUEST(SCU_CONTEXT_COMMAND_REQUEST_TYPE_OTHER_RNC, 4))
287 /*@}*/
288 
289 /**
290  * @name SCU_TASK_CONTEXT_PROTOCOL
291  * SCU Task context protocol types this is uesd to program the SCU Task
292  * context protocol field in word 0x00.
293  */
294 /*@{*/
295 #define SCU_TASK_CONTEXT_PROTOCOL_SMP    0x00
296 #define SCU_TASK_CONTEXT_PROTOCOL_SSP    0x01
297 #define SCU_TASK_CONTEXT_PROTOCOL_STP    0x02
298 #define SCU_TASK_CONTEXT_PROTOCOL_NONE   0x07
299 /*@}*/
300 
301 /**
302  * @struct SSP_TASK_CONTEXT
303  *
304  * @brief This is the SCU hardware definition for an SSP request.
305  */
306 struct SSP_TASK_CONTEXT
307 {
308    // OFFSET 0x18
309    U32  reserved00              : 24;
310    U32  frame_type              : 8;
311 
312    // OFFSET 0x1C
313    U32  reserved01;
314 
315    // OFFSET 0x20
316    U32  fill_bytes              : 2;
317    U32  reserved02              : 6;
318    U32  changing_data_pointer   : 1;
319    U32  retransmit              : 1;
320    U32  retry_data_frame        : 1;
321    U32  tlr_control             : 2;
322    U32  reserved03              : 19;
323 
324    // OFFSET 0x24
325    U32  uiRsvd4;
326 
327    // OFFSET 0x28
328    U32 target_port_transfer_tag : 16;
329    U32 tag                      : 16;
330 
331    // OFFSET 0x2C
332    U32 data_offset;
333 };
334 
335 /**
336  * @struct STP_TASK_CONTEXT
337  *
338  * @brief This is the SCU hardware definition for an STP request.
339  */
340 struct STP_TASK_CONTEXT
341 {
342    // OFFSET 0x18
343    U32 fis_type    : 8;
344    U32 pm_port     : 4;
345    U32 reserved0   : 3;
346    U32 control     : 1;
347    U32 command     : 8;
348    U32 features    : 8;
349 
350    // OFFSET 0x1C
351    U32 reserved1;
352 
353    // OFFSET 0x20
354    U32 reserved2;
355 
356    // OFFSET 0x24
357    U32 reserved3;
358 
359    // OFFSET 0x28
360    U32 ncq_tag     : 5;
361    U32 reserved4   : 27;
362 
363    // OFFSET 0x2C
364    U32 data_offset;    // TODO: What is this used for?
365 };
366 
367 /**
368  * @struct SMP_TASK_CONTEXT
369  *
370  * @brief This is the SCU hardware definition for an SMP request.
371  */
372 struct SMP_TASK_CONTEXT
373 {
374    // OFFSET 0x18
375    U32 response_length    : 8;
376    U32 function_result    : 8;
377    U32 function           : 8;
378    U32 frame_type         : 8;
379 
380    // OFFSET 0x1C
381    U32 smp_response_ufi   : 12;
382    U32 reserved1          : 20;
383 
384    // OFFSET 0x20
385    U32 reserved2;
386 
387    // OFFSET 0x24
388    U32 reserved3;
389 
390    // OFFSET 0x28
391    U32 reserved4;
392 
393    // OFFSET 0x2C
394    U32 reserved5;
395 };
396 
397 /**
398  * @struct PRIMITIVE_TASK_CONTEXT
399  *
400  * @brief This is the SCU hardware definition used when the driver wants to
401  *        send a primitive on the link.
402  */
403 struct PRIMITIVE_TASK_CONTEXT
404 {
405    // OFFSET 0x18
406    /**
407     * This field is the control word and it must be 0.
408     */
409    U32 control;  ///< must be set to 0
410 
411    // OFFSET 0x1C
412    /**
413     * This field specifies the primitive that is to be transmitted.
414     */
415    U32 sequence;
416 
417    // OFFSET 0x20
418    U32 reserved0;
419 
420    // OFFSET 0x24
421    U32 reserved1;
422 
423    // OFFSET 0x28
424    U32 reserved2;
425 
426    // OFFSET 0x2C
427    U32 reserved3;
428 };
429 
430 /**
431  * @union PROTOCOL_CONTEXT
432  *
433  * @brief The union of the protocols that can be selected in the SCU task
434  *        context field.
435  */
436 union PROTOCOL_CONTEXT
437 {
438     struct SSP_TASK_CONTEXT         ssp;
439     struct STP_TASK_CONTEXT         stp;
440     struct SMP_TASK_CONTEXT         smp;
441     struct PRIMITIVE_TASK_CONTEXT   primitive;
442     U32                             words[6];
443 };
444 
445 /**
446  * @struct SCU_SGL_ELEMENT
447  * @typedef SCU_SGL_ELEMENT_T
448  *
449  * @brief This structure represents a single SCU defined SGL element.
450  *
451  * SCU SGLs contain a 64 bit address with the maximum data transfer being 24
452  * bits in size.  The SGL can not cross a 4GB boundary.
453  */
454 typedef struct SCU_SGL_ELEMENT
455 {
456    /**
457     * This field is the upper 32 bits of the 64 bit physical address.
458     */
459    U32    address_upper;
460 
461    /**
462     * This field is the lower 32 bits of the 64 bit physical address.
463     */
464    U32    address_lower;
465 
466    /**
467     * This field is the number of bytes to transfer.
468     */
469    U32    length: 24;
470 
471    /**
472     * This field is the address modifier to be used when a virtual function is
473     * requesting a data transfer.
474     */
475    U32    address_modifier: 8;
476 
477 } SCU_SGL_ELEMENT_T;
478 
479 #define SCU_SGL_ELEMENT_PAIR_A   0
480 #define SCU_SGL_ELEMENT_PAIR_B   1
481 
482 /**
483  * @struct SCU_SGL_ELEMENT_PAIR
484  *
485  * @brief This structure is the SCU hardware definition of a pair of SGL
486  *        elements.
487  *
488  * The SCU hardware always works on SGL pairs.  They are referred to in the DS
489  * specification as SGL A and SGL B.  Each SGL pair is followed by the address
490  * of the next pair.
491  */
492 typedef struct SCU_SGL_ELEMENT_PAIR
493 {
494    // OFFSET 0x60-0x68
495    /**
496     * This field is the SGL element A of the SGL pair.
497     */
498    SCU_SGL_ELEMENT_T A;
499 
500    // OFFSET 0x6C-0x74
501    /**
502     * This field is the SGL element B of the SGL pair.
503     */
504    SCU_SGL_ELEMENT_T B;
505 
506    // OFFSET 0x78-0x7C
507    /**
508     * This field is the upper 32 bits of the 64 bit address to the next SGL
509     * element pair.
510     */
511    U32 next_pair_upper;
512 
513    /**
514     * This field is the lower 32 bits of the 64 bit address to the next SGL
515     * element pair.
516     */
517    U32 next_pair_lower;
518 
519 } SCU_SGL_ELEMENT_PAIR_T;
520 
521 /**
522  * @struct TRANSPORT_SNAPSHOT
523  *
524  * @brief This structure is the SCU hardware scratch area for the task
525  *        context.
526  *
527  * This is set to 0 by the driver but can be read by issuing a dump TC request
528  * to the SCU.
529  */
530 struct TRANSPORT_SNAPSHOT
531 {
532    // OFFSET 0x48
533    U32  xfer_rdy_write_data_length;
534 
535    // OFFSET 0x4C
536    U32  data_offset;
537 
538    // OFFSET 0x50
539    U32  data_transfer_size   : 24;
540    U32  reserved_50_0        : 8;
541 
542    // OFFSET 0x54
543    U32  next_initiator_write_data_offset;
544 
545    // OFFSET 0x58
546    U32  next_initiator_write_data_xfer_size : 24;
547    U32  reserved_58_0                       : 8;
548 };
549 
550 /**
551  * @struct SCU_TASK_CONTEXT
552  *
553  * @brief This structure defines the contents of the SCU silicon task context.
554  *        It lays out all of the fields according to the expected order and
555  *        location for the Storage Controller unit.
556  */
557 typedef struct SCU_TASK_CONTEXT
558 {
559    // OFFSET 0x00 ------
560    /**
561     * This field must be encoded to one of the valid SCU task priority values
562     *    - SCU_TASK_PRIORITY_NORMAL
563     *    - SCU_TASK_PRIORITY_HEAD_OF_Q
564     *    - SCU_TASK_PRIORITY_HIGH
565     */
566    U32    priority              : 2;
567 
568    /**
569     * This field must be set to TRUE if this is an initiator generated request.
570     * Until target mode is supported all task requests are initiator requests.
571     */
572    U32    initiator_request     : 1;
573 
574    /**
575     * This field must be set to one of the valid connection rates valid values
576     * are 0x8, 0x9, and 0xA.
577     */
578    U32    connection_rate       : 4;
579 
580    /**
581     * This field muse be programed when generating an SMP response since the SMP
582     * connection remains open until the SMP response is generated.
583     */
584    U32    protocol_engine_index : 3;
585 
586    /**
587     * This field must contain the logical port for the task request.
588     */
589    U32    logical_port_index    : 3;
590 
591    /**
592     * This field must be set to one of the SCU_TASK_CONTEXT_PROTOCOL values
593     *    - SCU_TASK_CONTEXT_PROTOCOL_SMP
594     *    - SCU_TASK_CONTEXT_PROTOCOL_SSP
595     *    - SCU_TASK_CONTEXT_PROTOCOL_STP
596     *    - SCU_TASK_CONTEXT_PROTOCOL_NONE
597     */
598    U32    protocol_type         : 3;
599 
600    /**
601     * This filed must be set to the TCi allocated for this task
602     */
603    U32    task_index            : 12;
604 
605    /**
606     * This field is reserved and must be set to 0x00
607     */
608    U32    reserved_00_0         : 1;
609 
610    /**
611     * For a normal task request this must be set to 0.  If this is an abort of
612     * this task request it must be set to 1.
613     */
614    U32    abort                 : 1;
615 
616    /**
617     * This field must be set to TRUE for the SCU hardware to process the task.
618     */
619    U32    valid                 : 1;
620 
621    /**
622     * This field must be set to SCU_TASK_CONTEXT_TYPE
623     */
624    U32    context_type          : 1;
625 
626    // OFFSET 0x04
627    /**
628     * This field contains the RNi that is the target of this request.
629     */
630    U32    remote_node_index     : 12;
631 
632    /**
633     * This field is programmed if this is a mirrored request, which we are not
634     * using, in which case it is the RNi for the mirrored target.
635     */
636    U32    mirrored_node_index   : 12;
637 
638    /**
639     * This field is programmed with the direction of the SATA reqeust
640     *    - SCU_SATA_WRITE_DATA_DIRECTION
641     *    - SCU_SATA_READ_DATA_DIRECTION
642     */
643    U32    sata_direction        : 1;
644 
645    /**
646     * This field is programmsed with one of the following SCU_COMMAND_CODE
647     *    - SCU_COMMAND_CODE_INITIATOR_NEW_TASK
648     *    - SCU_COMMAND_CODE_ACTIVE_TASK
649     *    - SCU_COMMAND_CODE_PRIMITIVE_SEQ_TASK
650     *    - SCU_COMMAND_CODE_TARGET_RAW_FRAMES
651     */
652    U32    command_code          : 2;
653 
654    /**
655     * This field is set to TRUE if the remote node should be suspended.
656     * This bit is only valid for SSP & SMP target devices.
657     */
658    U32    suspend_node          : 1;
659 
660    /**
661     * This field is programmed with one of the following command type codes
662     *
663     * For SAS requests use the SCU_SSP_TASK_TYPE
664     *    - SCU_TASK_TYPE_IOREAD
665     *    - SCU_TASK_TYPE_IOWRITE
666     *    - SCU_TASK_TYPE_SMP_REQUEST
667     *    - SCU_TASK_TYPE_RESPONSE
668     *    - SCU_TASK_TYPE_RAW_FRAME
669     *    - SCU_TASK_TYPE_PRIMITIVE
670     *
671     * For SATA requests use the SCU_SATA_TASK_TYPE
672     *    - SCU_TASK_TYPE_DMA_IN
673     *    - SCU_TASK_TYPE_FPDMAQ_READ
674     *    - SCU_TASK_TYPE_PACKET_DMA_IN
675     *    - SCU_TASK_TYPE_SATA_RAW_FRAME
676     *    - SCU_TASK_TYPE_DMA_OUT
677     *    - SCU_TASK_TYPE_FPDMAQ_WRITE
678     *    - SCU_TASK_TYPE_PACKET_DMA_OUT
679     */
680    U32    task_type             : 4;
681 
682    // OFFSET 0x08
683    /**
684     * This field is reserved and the must be set to 0x00
685     */
686    U32    link_layer_control          : 8;  // presently all reserved
687 
688    /**
689     * This field is set to TRUE when TLR is to be enabled
690     */
691    U32    ssp_tlr_enable              : 1;
692 
693    /**
694     * This is field specifies if the SCU DMAs a response frame to host
695     * memory for good response frames when operating in target mode.
696     */
697    U32    dma_ssp_target_good_response : 1;
698 
699    /**
700     * This field indicates if the SCU should DMA the response frame to
701     * host memory.
702     */
703    U32    do_not_dma_ssp_good_response : 1;
704 
705    /**
706     * This field is set to TRUE when strict ordering is to be enabled
707     */
708    U32    strict_ordering              : 1;
709 
710    /**
711     * This field indicates the type of endianness to be utilized for the
712     * frame.  command, task, and response frames utilized control_frame
713     * set to 1.
714     */
715    U32    control_frame               : 1;
716 
717    /**
718     * This field is reserved and the driver should set to 0x00
719     */
720    U32    tl_control_reserved         : 3;
721 
722    /**
723     * This field is set to TRUE when the SCU hardware task timeout control is to
724     * be enabled
725     */
726    U32    timeout_enable              : 1;
727 
728    /**
729     * This field is reserved and the driver should set it to 0x00
730     */
731    U32    pts_control_reserved        : 7;
732 
733    /**
734     * This field should be set to TRUE when block guard is to be enabled
735     */
736    U32    block_guard_enable          : 1;
737 
738    /**
739     * This field is reserved and the driver should set to 0x00
740     */
741    U32    sdma_control_reserved       : 7;
742 
743    // OFFSET 0x0C
744    /**
745     * This field is the address modifier for this io request it should be
746     * programmed with the virtual function that is making the request.
747     */
748    U32    address_modifier            : 16;
749 
750    /**
751     * @todo What we support mirrored SMP response frame?
752     */
753    U32    mirrored_protocol_engine    : 3;    // mirrored protocol Engine Index
754 
755    /**
756     * If this is a mirrored request the logical port index for the mirrored RNi
757     * must be programmed.
758     */
759    U32    mirrored_logical_port       : 4;    // mirrored local port index
760 
761    /**
762     * This field is reserved and the driver must set it to 0x00
763     */
764    U32    reserved_0C_0               : 8;
765 
766    /**
767     * This field must be set to TRUE if the mirrored request processing is to be
768     * enabled.
769     */
770    U32    mirror_request_enable       : 1;    // Mirrored request Enable
771 
772    // OFFSET 0x10
773    /**
774     * This field is the command iu length in dwords
775     */
776    U32    ssp_command_iu_length       : 8;
777 
778    /**
779     * This is the target TLR enable bit it must be set to 0 when creatning the
780     * task context.
781     */
782    U32    xfer_ready_tlr_enable       : 1;
783 
784    /**
785     * This field is reserved and the driver must set it to 0x00
786     */
787    U32    reserved_10_0               : 7;
788 
789    /**
790     * This is the maximum burst size that the SCU hardware will send in one
791     * connection its value is (N x 512) and N must be a multiple of 2.  If the
792     * value is 0x00 then maximum burst size is disabled.
793     */
794    U32    ssp_max_burst_size          : 16;
795 
796    // OFFSET 0x14
797    /**
798     * This filed is set to the number of bytes to be transferred in the request.
799     */
800    U32    transfer_length_bytes       : 24;   // In terms of bytes
801 
802    /**
803     * This field is reserved and the driver should set it to 0x00
804     */
805    U32    reserved_14_0               : 8;
806 
807    // OFFSET 0x18-0x2C
808    /**
809     * This union provides for the protocol specific part of the SCU Task Context.
810     */
811    union PROTOCOL_CONTEXT  type;
812 
813    // OFFSET 0x30-0x34
814    /**
815     * This field is the upper 32 bits of the 64 bit physical address of the
816     * command iu buffer
817     */
818    U32  command_iu_upper;
819 
820    /**
821     * This field is the lower 32 bits of the 64 bit physical address of the
822     * command iu buffer
823     */
824    U32  command_iu_lower;
825 
826    // OFFSET 0x38-0x3C
827    /**
828     * This field is the upper 32 bits of the 64 bit physical address of the
829     * response iu buffer
830     */
831    U32  response_iu_upper;
832 
833    /**
834     * This field is the lower 32 bits of the 64 bit physical address of the
835     * response iu buffer
836     */
837    U32  response_iu_lower;
838 
839    // OFFSET 0x40
840    /**
841     * This field is set to the task phase of the SCU hardware. The driver must
842     * set this to 0x01
843     */
844    U32  task_phase            : 8;
845 
846    /**
847     * This field is set to the transport layer task status.  The driver must set
848     * this to 0x00
849     */
850    U32  task_status           : 8;
851 
852    /**
853     * This field is used during initiator write TLR
854     */
855    U32  previous_extended_tag : 4;
856 
857    /**
858     * This field is set the maximum number of retries for a STP non-data FIS
859     */
860    U32  stp_retry_count       : 2;
861 
862    /**
863     * This field is reserved and the driver must set it to 0x00
864     */
865    U32  reserved_40_1         : 2;
866 
867    /**
868     * This field is used by the SCU TL to determine when to take a snapshot when
869     * tranmitting read data frames.
870     *    - 0x00 The entire IO
871     *    - 0x01 32k
872     *    - 0x02 64k
873     *    - 0x04 128k
874     *    - 0x08 256k
875     */
876    U32  ssp_tlr_threshold     : 4;
877 
878    /**
879     * This field is reserved and the driver must set it to 0x00
880     */
881    U32  reserved_40_2         : 4;
882 
883    // OFFSET 0x44
884    U32  write_data_length;   // read only set to 0
885 
886    // OFFSET 0x48-0x58
887    struct TRANSPORT_SNAPSHOT snapshot;  // read only set to 0
888 
889    // OFFSET 0x5C
890    U32  block_protection_enable       : 1;
891    U32  block_size                    : 2;
892    U32  block_protection_function     : 2;
893    U32  reserved_5C_0                 : 9;
894    U32  active_sgl_element            : 2;   // read only set to 0
895    U32  sgl_exhausted                 : 1;   // read only set to 0
896    U32  payload_data_transfer_error   : 4;   // read only set to 0
897    U32  frame_buffer_offset           : 11;  // read only set to 0
898 
899    // OFFSET 0x60-0x7C
900    /**
901     * This field is the first SGL element pair found in the TC data structure.
902     */
903    SCU_SGL_ELEMENT_PAIR_T sgl_pair_ab;
904    // OFFSET 0x80-0x9C
905    /**
906     * This field is the second SGL element pair found in the TC data structure.
907     */
908    SCU_SGL_ELEMENT_PAIR_T sgl_pair_cd;
909 
910    // OFFSET 0xA0-BC
911    SCU_SGL_ELEMENT_PAIR_T sgl_snapshot_ac;
912 
913    // OFFSET 0xC0
914    U32  active_sgl_element_pair; // read only set to 0
915 
916    // OFFSET 0xC4-0xCC
917    U32 reserved_C4_CC[3];
918 
919    // OFFSET 0xD0
920    U32  intermediate_crc_value : 16;
921    U32  initial_crc_seed       : 16;
922 
923    // OFFSET 0xD4
924    U32  application_tag_for_verify    : 16;
925    U32  application_tag_for_generate  : 16;
926 
927    // OFFSET 0xD8
928    U32  reference_tag_seed_for_verify_function;
929 
930    // OFFSET 0xDC
931    U32  reserved_DC;
932 
933    // OFFSET 0xE0
934    U32  reserved_E0_0                    : 16;
935    U32  application_tag_mask_for_generate: 16;
936 
937    // OFFSET 0xE4
938    U32  block_protection_control         : 16;
939    U32  application_tag_mask_for_verify  : 16;
940 
941    // OFFSET 0xE8
942    U32  block_protection_error  : 8;
943    U32  reserved_E8_0           :24;
944 
945    // OFFSET 0xEC
946    U32  reference_tag_seed_for_verify;
947 
948    // OFFSET 0xF0
949    U32  intermediate_crc_valid_snapshot  : 16;
950    U32  reserved_F0_0                    : 16;
951 
952    // OFFSET 0xF4
953    U32  reference_tag_seed_for_verify_function_snapshot;
954 
955    // OFFSET 0xF8
956    U32  snapshot_of_reserved_dword_DC_of_tc;
957 
958    // OFFSET 0xFC
959    U32  reference_tag_seed_for_generate_function_snapshot;
960 
961 } SCU_TASK_CONTEXT_T;
962 
963 #ifdef __cplusplus
964 }
965 #endif // __cplusplus
966 
967 #endif // _SCU_TASK_CONTEXT_H_
968