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