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_
Cache object: adbb513910dc21185ac400303980cf51
|