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