1 /******************************************************************************* 2 *Copyright (c) 2014 PMC-Sierra, Inc. All rights reserved. 3 * 4 *Redistribution and use in source and binary forms, with or without modification, are permitted provided 5 *that the following conditions are met: 6 *1. Redistributions of source code must retain the above copyright notice, this list of conditions and the 7 *following disclaimer. 8 *2. Redistributions in binary form must reproduce the above copyright notice, 9 *this list of conditions and the following disclaimer in the documentation and/or other materials provided 10 *with the distribution. 11 * 12 *THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED 13 *WARRANTIES,INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS 14 *FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE 15 *FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT 16 *NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR 17 *BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 18 *LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS 19 *SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE 20 * 21 * $FreeBSD$ 22 * 23 ********************************************************************************/ 24 /******************************************************************************** 25 ** 26 ** Version Control Information: 27 ** 28 ** 29 *******************************************************************************/ 30 /******************************************************************************** 31 ** 32 ** titypes.h 33 ** 34 ** Abstract: This module contains data structure definition used 35 ** by the Transport Independent API (TIAPI) Layer. 36 ** 37 ********************************************************************************/ 38 39 #include <dev/pms/RefTisa/tisa/api/tidefs.h> 40 41 #ifndef TITYPES_H 42 #define TITYPES_H 43 44 /***************************************************************************** 45 * SHARED TYPES 46 *****************************************************************************/ 47 48 typedef struct tiPortalContext 49 { 50 void *osData; 51 void *tdData; 52 } tiPortalContext_t; 53 54 typedef struct tiDeviceHandle 55 { 56 void *osData; 57 void *tdData; 58 } tiDeviceHandle_t; 59 60 typedef struct tiRoot 61 { 62 void *osData; 63 void *tdData; 64 } tiRoot_t; 65 66 typedef struct tiMem 67 { 68 void *virtPtr; 69 void *osHandle; 70 bit32 physAddrUpper; 71 bit32 physAddrLower; 72 bit32 totalLength; 73 bit32 numElements; 74 bit32 singleElementLength; 75 bit32 alignment; 76 bit32 type; 77 bit32 reserved; 78 } tiMem_t; 79 80 typedef struct tiLoLevelMem 81 { 82 bit32 count; 83 tiMem_t mem[MAX_LL_LAYER_MEM_DESCRIPTORS]; 84 } tiLoLevelMem_t; 85 86 typedef struct tiLoLevelOption 87 { 88 bit32 usecsPerTick; 89 bit32 numOfQueuesPerPort; 90 bit32 mutexLockUsage; 91 bit32 pciFunctionNumber; 92 bit32 maxPortContext; 93 bit32 maxNumOSLocks; 94 agBOOLEAN encryption; 95 bit32 maxInterruptVectors; 96 bit32 flag; 97 bit32 max_MSI_InterruptVectors; 98 #ifdef SA_ENABLE_PCI_TRIGGER 99 bit32 PCI_trigger; 100 #endif /* SA_ENABLE_PCI_TRIGGER */ 101 102 } tiLoLevelOption_t; 103 104 typedef struct tiLoLevelResource 105 { 106 tiLoLevelOption_t loLevelOption; 107 tiLoLevelMem_t loLevelMem; 108 } tiLoLevelResource_t; 109 110 typedef struct tiTdSharedMem 111 { 112 tiMem_t tdSharedCachedMem1; 113 } tiTdSharedMem_t; 114 115 typedef struct tiIORequest 116 { 117 void *osData; 118 void *tdData; 119 } tiIORequest_t; 120 121 typedef struct tiSgl_s 122 { 123 bit32 lower; 124 bit32 upper; 125 bit32 len; 126 bit32 type; 127 } tiSgl_t; 128 129 typedef struct tiSenseData 130 { 131 void *senseData; 132 bit8 senseLen; 133 } tiSenseData_t; 134 135 typedef struct tiIOCTLPayload 136 { 137 bit32 Signature; 138 bit16 MajorFunction; 139 bit16 MinorFunction; 140 bit16 Length; 141 bit16 Status; 142 bit32 Reserved; /* required for 64 bit alignment */ 143 bit8 FunctionSpecificArea[1]; 144 }tiIOCTLPayload_t; 145 146 147 typedef struct tiIOCTLPayload_wwn 148 { 149 bit32 Signature; 150 bit16 MajorFunction; 151 bit16 MinorFunction; 152 bit16 Length; 153 bit16 Status; 154 bit32 Reserved; /* required for 64 bit alignment */ 155 bit8 FunctionSpecificArea[8]; 156 }tiIOCTLPayload_wwn_t; 157 158 typedef struct tiPortInfo 159 { 160 char *name; 161 char *address; 162 char *localName; 163 char *remoteName; 164 bit32 localNameLen; 165 bit32 remoteNameLen; 166 } tiPortInfo_t; 167 168 typedef struct tiDif_s 169 { 170 agBOOLEAN enableDIFPerLA; 171 bit32 flags; 172 bit16 initialIOSeed; 173 bit16 reserved; 174 bit32 DIFPerLAAddrLo; 175 bit32 DIFPerLAAddrHi; 176 bit16 DIFPerLARegion0SecCount; 177 bit16 DIFPerLANumOfRegions; 178 bit8 udtArray[DIF_UDT_SIZE]; 179 bit8 udtrArray[DIF_UDT_SIZE]; 180 } tiDif_t; 181 182 #define DIF_INSERT 0 183 #define DIF_VERIFY_FORWARD 1 184 #define DIF_VERIFY_DELETE 2 185 #define DIF_VERIFY_REPLACE 3 186 #define DIF_VERIFY_UDT_REPLACE_CRC 5 187 #define DIF_REPLACE_UDT_REPLACE_CRC 7 188 189 #define DIF_BLOCK_SIZE_512 0x00 190 #define DIF_BLOCK_SIZE_520 0x01 191 #define DIF_BLOCK_SIZE_4096 0x02 192 #define DIF_BLOCK_SIZE_4160 0x03 193 194 #define DIF_ACTION_FLAG_MASK 0x00000007 /* 0 - 2 */ 195 #define DIF_CRC_VERIFICATION 0x00000008 /* 3 */ 196 #define DIF_CRC_INVERSION 0x00000010 /* 4 */ 197 #define DIF_CRC_IO_SEED 0x00000020 /* 5 */ 198 #define DIF_UDT_REF_BLOCK_COUNT 0x00000040 /* 6 */ 199 #define DIF_UDT_APP_BLOCK_COUNT 0x00000080 /* 7 */ 200 #define DIF_UDTR_REF_BLOCK_COUNT 0x00000100 /* 8 */ 201 #define DIF_UDTR_APP_BLOCK_COUNT 0x00000200 /* 9 */ 202 #define DIF_CUST_APP_TAG 0x00000C00 /* 10 - 11 */ 203 #define DIF_FLAG_RESERVED 0x0000F000 /* 12 - 15 */ 204 #define DIF_DATA_BLOCK_SIZE_MASK 0x000F0000 /* 16 - 19 */ 205 #define DIF_DATA_BLOCK_SIZE_SHIFT 16 206 #define DIF_TAG_VERIFY_MASK 0x03F00000 /* 20 - 25 */ 207 #define DIF_TAG_UPDATE_MASK 0xFC000000 /* 26 - 31 */ 208 209 210 #define NORMAL_BLOCK_SIZE_512 512 211 #define NORMAL_BLOCK_SIZE_4K 4096 212 213 #define DIF_PHY_BLOCK_SIZE_512 512 214 #define DIF_PHY_BLOCK_SIZE_520 520 215 #define DIF_PHY_BLOCK_SIZE_4096 4096 216 #define DIF_PHY_BLOCK_SIZE_4160 4160 217 218 #define DIF_LOGIC_BLOCK_SIZE_520 520 219 #define DIF_LOGIC_BLOCK_SIZE_528 528 220 #define DIF_LOGIC_BLOCK_SIZE_4104 4104 221 #define DIF_LOGIC_BLOCK_SIZE_4168 4168 222 223 224 225 226 typedef struct tiDetailedDeviceInfo 227 { 228 bit8 devType_S_Rate; 229 /* Bit 6-7: reserved 230 Bit 4-5: Two bits flag to specify a SAS or SATA (STP) device: 231 00: SATA or STP device 232 01: SSP or SMP device 233 10: Direct SATA device 234 Bit 0-3: Connection Rate field when opening the device. 235 Code Description: 236 00h: Device has not been registered 237 08h: 1,5 Gbps 238 09h: 3,0 Gbps 239 0ah: 6.0 Gbps 240 All others Reserved 241 */ 242 bit8 reserved1; 243 bit16 reserved2; 244 } tiDetailedDeviceInfo_t; 245 246 typedef struct tiDeviceInfo 247 { 248 char *localName; 249 char *localAddress; 250 char *remoteName; 251 char *remoteAddress; 252 bit16 osAddress1; 253 bit16 osAddress2; 254 bit32 loginState; 255 tiDetailedDeviceInfo_t info; 256 } tiDeviceInfo_t; 257 258 259 #define KEK_BLOB_SIZE 48 260 #define KEK_AUTH_SIZE 40 261 #define KEK_MAX_TABLE_ENTRIES 8 262 263 #define DEK_MAX_TABLES 2 264 #define DEK_MAX_TABLE_ENTRIES (1024*4) 265 266 #define DEK_BLOB_SIZE_07 72 267 #define DEK_BLOB_SIZE_08 80 268 269 #define OPERATOR_ROLE_ID_SIZE 1024 270 271 #define HMAC_SECRET_KEY_SIZE 72 272 273 typedef struct tiEncryptKekBlob 274 { 275 bit8 kekBlob[KEK_BLOB_SIZE]; 276 } tiEncryptKekBlob_t; 277 278 typedef struct tiEncryptDekBlob 279 { 280 bit8 dekBlob[DEK_BLOB_SIZE_08]; 281 } tiEncryptDekBlob_t; 282 283 typedef struct DEK_Table_s { 284 tiEncryptDekBlob_t Dek[DEK_MAX_TABLE_ENTRIES]; 285 }tiDEK_Table_t; 286 287 typedef struct DEK_Tables_s { 288 tiDEK_Table_t DekTable[DEK_MAX_TABLES]; 289 } tiDEK_Tables_t; 290 291 /*sTSDK 4.38 */ 292 #define OPR_MGMT_ID_STRING_SIZE 31 293 294 typedef struct tiID_s { 295 bit8 ID[OPR_MGMT_ID_STRING_SIZE]; 296 } tiID_t; 297 298 typedef struct tiEncryptInfo 299 { 300 bit32 securityCipherMode; 301 bit32 status; 302 bit32 sectorSize[6]; 303 } tiEncryptInfo_t; 304 305 typedef struct tiEncryptPort 306 { 307 bit32 encryptEvent; 308 bit32 subEvent; 309 void *pData; 310 } tiEncryptPort_t; 311 312 typedef struct tiEncryptDek 313 { 314 bit32 dekTable; 315 bit32 dekIndex; 316 } tiEncryptDek_t; 317 318 typedef struct tiEncrypt 319 { 320 tiEncryptDek_t dekInfo; 321 bit32 kekIndex; 322 agBOOLEAN keyTagCheck; 323 agBOOLEAN enableEncryptionPerLA; 324 bit32 sectorSizeIndex; 325 bit32 encryptMode; 326 bit32 keyTag_W0; 327 bit32 keyTag_W1; 328 bit32 tweakVal_W0; 329 bit32 tweakVal_W1; 330 bit32 tweakVal_W2; 331 bit32 tweakVal_W3; 332 bit32 EncryptionPerLAAddrLo; 333 bit32 EncryptionPerLAAddrHi; 334 bit16 EncryptionPerLRegion0SecCount; 335 bit16 reserved; 336 } tiEncrypt_t; 337 338 typedef struct tiHWEventMode_s 339 { 340 bit32 modePageOperation; 341 bit32 status; 342 bit32 modePageLen; 343 void *modePage; 344 void *context; 345 } tiHWEventMode_t; 346 347 /***************************************************************************** 348 * INITIATOR TYPES 349 *****************************************************************************/ 350 351 typedef struct tiInitiatorMem 352 { 353 bit32 count; 354 tiMem_t tdCachedMem[6]; 355 } tiInitiatorMem_t; 356 357 typedef struct tiInitiatorOption 358 { 359 bit32 usecsPerTick; 360 bit32 pageSize; 361 tiMem_t dynamicDmaMem; 362 tiMem_t dynamicCachedMem; 363 bit32 ioRequestBodySize; 364 } tiInitiatorOption_t; 365 366 367 typedef struct tiInitiatorResource 368 { 369 tiInitiatorOption_t initiatorOption; 370 tiInitiatorMem_t initiatorMem; 371 } tiInitiatorResource_t; 372 373 typedef struct tiLUN 374 { 375 bit8 lun[8]; 376 } tiLUN_t; 377 378 typedef struct tiIniScsiCmnd 379 { 380 tiLUN_t lun; 381 bit32 expDataLength; 382 bit32 taskAttribute; 383 bit32 crn; 384 bit8 cdb[16]; 385 } tiIniScsiCmnd_t; 386 387 typedef struct tiScsiInitiatorRequest 388 { 389 void *sglVirtualAddr; 390 tiIniScsiCmnd_t scsiCmnd; 391 tiSgl_t agSgl1; 392 tiDataDirection_t dataDirection; 393 } tiScsiInitiatorRequest_t; 394 395 /* This is the standard request body for I/O that requires DIF or encryption. */ 396 typedef struct tiSuperScsiInitiatorRequest 397 { 398 void *sglVirtualAddr; 399 tiIniScsiCmnd_t scsiCmnd; 400 tiSgl_t agSgl1; 401 tiDataDirection_t dataDirection; 402 bit32 flags; 403 #ifdef CCBUILD_INDIRECT_CDB 404 bit32 IndCDBLowAddr; /* The low physical address of indirect CDB buffer in host memory */ 405 bit32 IndCDBHighAddr; /* The high physical address of indirect CDB buffer in host memory */ 406 bit32 IndCDBLength; /* Indirect CDB length */ 407 void *IndCDBBuffer; /* Indirect SSPIU buffer */ 408 #endif 409 tiDif_t Dif; 410 tiEncrypt_t Encrypt; 411 } tiSuperScsiInitiatorRequest_t; 412 413 typedef struct tiSMPFrame 414 { 415 void *outFrameBuf; 416 bit32 outFrameAddrUpper32; 417 bit32 outFrameAddrLower32; 418 bit32 outFrameLen; 419 bit32 inFrameAddrUpper32; 420 bit32 inFrameAddrLower32; 421 bit32 inFrameLen; 422 bit32 expectedRespLen; 423 bit32 flag; 424 } tiSMPFrame_t; 425 typedef struct tiEVTData 426 { 427 bit32 SequenceNo; 428 bit32 TimeStamp; 429 bit32 Source; 430 bit32 Code; 431 bit8 Reserved; 432 bit8 BinaryDataLength; 433 bit8 DataAndMessage[EVENTLOG_MAX_MSG_LEN]; 434 } tiEVTData_t; 435 436 typedef bit32 (*IsrHandler_t)( 437 tiRoot_t *tiRoot, 438 bit32 channelNum 439 ); 440 typedef void (*DeferedHandler_t)( 441 tiRoot_t *tiRoot, 442 bit32 channelNum, 443 bit32 count, 444 bit32 context 445 ); 446 447 /***************************************************************************** 448 * TARGET TYPES 449 *****************************************************************************/ 450 451 typedef struct tiTargetMem { 452 bit32 count; 453 tiMem_t tdMem[10]; 454 } tiTargetMem_t; 455 456 typedef struct tiTargetOption { 457 bit32 usecsPerTick; 458 bit32 pageSize; 459 bit32 numLgns; 460 bit32 numSessions; 461 bit32 numXchgs; 462 tiMem_t dynamicDmaMem; 463 tiMem_t dynamicCachedMem; 464 } tiTargetOption_t; 465 466 typedef struct 467 { 468 tiTargetOption_t targetOption; 469 tiTargetMem_t targetMem; 470 } tiTargetResource_t; 471 472 typedef struct 473 { 474 bit8 *reqCDB; 475 bit8 *scsiLun; 476 bit32 taskAttribute; 477 bit32 taskId; 478 bit32 crn; 479 } tiTargetScsiCmnd_t; 480 481 typedef struct tiSuperScsiTargetRequest 482 { 483 bit32 flags; 484 tiDif_t Dif; 485 tiEncrypt_t Encrypt; 486 tiSgl_t agSgl; 487 void *sglVirtualAddr; 488 tiSgl_t agSglMirror; 489 void *sglVirtualAddrMirror; 490 bit32 Offset; 491 bit32 DataLength; 492 } tiSuperScsiTargetRequest_t; 493 494 /* SPCv controller mode page definitions */ 495 typedef struct tiEncryptGeneralPage_s { 496 bit32 pageCode; /* 0x20 */ 497 bit32 numberOfDeks; 498 } tiEncryptGeneralPage_t; 499 500 #define TD_ENC_CONFIG_PAGE_KEK_NUMBER 0x0000FF00 501 #define TD_ENC_CONFIG_PAGE_KEK_SHIFT 8 502 503 typedef struct tiEncryptDekConfigPage 504 { 505 bit32 pageCode; /* 0x21 */ 506 bit32 table0AddrLo; 507 bit32 table0AddrHi; 508 bit32 table0Entries; 509 bit32 table0Config; 510 bit32 table1AddrLo; 511 bit32 table1AddrHi; 512 bit32 table1Entries; 513 bit32 table1Config; 514 } tiEncryptDekConfigPage_t; 515 516 #define TD_ENC_DEK_CONFIG_PAGE_DEK_TABLE_NUMBER 0xF0000000 517 #define TD_ENC_DEK_CONFIG_PAGE_DEK_CACHE_WAYS 0x0F000000 518 #define TD_ENC_DEK_CONFIG_PAGE_DPR 0x00000200 519 #define TD_ENC_DEK_CONFIG_PAGE_DER 0x00000100 520 #define TD_ENC_DEK_CONFIG_PAGE_DEK_CACHE_SHIFT 24 521 #define TD_ENC_DEK_CONFIG_PAGE_DEK_TABLE_SHIFT 28 522 #define TD_ENC_DEK_CONFIG_PAGE_DEK_HDP_SHIFT 8 523 524 525 /* CCS (Current Crypto Services) and NOPR (Number of Operators) are valid only in GET_CONTROLLER_CONFIG */ 526 /* NAR, CORCAP and USRCAP are valid only when AUT==1 */ 527 typedef struct tiEncryptControlParamPage_s { 528 bit32 PageCode; /* 0x22 */ 529 bit32 CORCAP; /* Crypto Officer Role Capabilities */ 530 bit32 USRCAP; /* User Role Capabilities */ 531 bit32 CCS; /* Current Crypto Services */ 532 bit32 NOPR; /* Number of Operators */ 533 } tiEncryptControlParamPage_t; 534 535 typedef struct tiEncryptHMACConfigPage_s 536 { 537 bit32 PageCode; 538 bit32 CustomerTag; 539 bit32 KeyAddrLo; 540 bit32 KeyAddrHi; 541 } tiEncryptHMACConfigPage_t; 542 543 typedef struct tiInterruptConfigPage_s { 544 bit32 pageCode; /* 0x05 */ 545 bit32 vectorMask; 546 bit32 reserved; 547 bit32 ICTC0; 548 bit32 ICTC1; 549 bit32 ICTC2; 550 bit32 ICTC3; 551 bit32 ICTC4; 552 bit32 ICTC5; 553 bit32 ICTC6; 554 bit32 ICTC7; 555 } tiInterruptConfigPage_t; 556 557 /* brief data structure for SAS protocol timer configuration page. */ 558 typedef struct tiSASProtocolTimerConfigurationPage_s{ 559 bit32 pageCode; /* 0x04 */ 560 bit32 MST_MSI; 561 bit32 STP_SSP_MCT_TMO; 562 bit32 STP_FRM_TMO; 563 bit32 STP_IDLE_TMO; 564 bit32 OPNRJT_RTRY_INTVL; 565 bit32 Data_Cmd_OPNRJT_RTRY_TMO; 566 bit32 Data_Cmd_OPNRJT_RTRY_THR; 567 } tiSASProtocolTimerConfigurationPage_t; 568 569 /*sTSDK 4.19 */ 570 571 /* The command is for an operator to login to/logout from SPCve. */ 572 /* Only when all IOs are quiesced, can an operator logout. */ 573 typedef struct tiOperatorCommandSet_s { 574 bit32 OPRIDX_PIN_ACS; /* Access type (ACS) [4 bits] */ 575 /* KEYopr pinned in the KEK RAM (PIN) [1 bit] */ 576 /* KEYopr Index in the KEK RAM (OPRIDX) [8 bits] */ 577 bit8 cert[40]; /* Operator Certificate (CERT) [40 bytes] */ 578 bit32 reserved[3]; /* reserved */ 579 } tiOperatorCommandSet_t; 580 581 #define FIPS_SELFTEST_MAX_MSG_LEN (128*1024) 582 #define FIPS_SELFTEST_MAX_DIGEST_SIZE 64 583 584 typedef struct tiEncryptSelfTestDescriptor_s { 585 bit32 AESNTC_AESPTC; /* AES Negative/Positive Test Case Bit Map */ 586 bit32 KWPNTC_PKWPPTC; /* Key Wrap Negative/Positive Test Case Bit Map */ 587 bit32 HMACNTC_HMACPTC; /* HMAC Negative Test Case Bit Map */ 588 } tiEncryptSelfTestDescriptor_t; 589 590 typedef struct tiEncryptSelfTestResult_s{ 591 bit32 AESNTCS_AESPTCS; /* AES Negative/Positive Test Case Status */ 592 bit32 KWPNTCS_PKWPPTCS; /* Key Wrap Negative/Positive Test Case Status */ 593 bit32 HMACNTCS_HMACPTCS; /* HMAC Negative Test Case Status */ 594 } tiEncryptSelfTestResult_t; 595 596 /* 597 Tell SPCve controller the underlying SHA algorithm, where to fetch the message, 598 the size of the message, where to store the digest, where to fetch the secret key and the size of the key. 599 */ 600 typedef struct tiEncryptHMACTestDescriptor_s 601 { 602 bit32 Tlen_SHAAlgo; 603 bit32 MsgAddrLo; 604 bit32 MsgAddrHi; 605 bit32 MsgLen; 606 bit32 DigestAddrLo; 607 bit32 DigestAddrHi; 608 bit32 KeyAddrLo; 609 bit32 KeyAddrHi; 610 bit32 KeyLen; 611 } tiEncryptHMACTestDescriptor_t; 612 613 typedef struct tiEncryptHMACTestResult_s 614 { 615 bit32 Tlen_SHAAlgo; 616 bit32 Reserved[12]; 617 } tiEncryptHMACTestResult_t; 618 619 typedef struct tiEncryptSHATestDescriptor_s 620 { 621 bit32 Dword0; 622 bit32 MsgAddrLo; 623 bit32 MsgAddrHi; 624 bit32 MsgLen; 625 bit32 DigestAddrLo; 626 bit32 DigestAddrHi; 627 } tiEncryptSHATestDescriptor_t; 628 629 typedef struct tiEncryptSHATestResult_s 630 { 631 bit32 Dword0; 632 bit32 Dword[12]; 633 } tiEncryptSHATestResult_t; 634 635 636 #endif /* TITYPES_H */ 637