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