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 ********************************************************************************/ 22 /*******************************************************************************/ 23 /** \file 24 * 25 * 26 * This file contains initiator initialization functions 27 * 28 */ 29 #include <sys/cdefs.h> 30 __FBSDID("$FreeBSD$"); 31 #include <dev/pms/config.h> 32 33 #include <dev/pms/freebsd/driver/common/osenv.h> 34 #include <dev/pms/freebsd/driver/common/ostypes.h> 35 #include <dev/pms/freebsd/driver/common/osdebug.h> 36 37 #include <dev/pms/RefTisa/sallsdk/api/sa.h> 38 #include <dev/pms/RefTisa/sallsdk/api/saapi.h> 39 #include <dev/pms/RefTisa/sallsdk/api/saosapi.h> 40 41 #include <dev/pms/RefTisa/tisa/api/titypes.h> 42 #include <dev/pms/RefTisa/tisa/api/ostiapi.h> 43 #include <dev/pms/RefTisa/tisa/api/tiapi.h> 44 #include <dev/pms/RefTisa/tisa/api/tiglobal.h> 45 46 #ifdef FDS_SM 47 #include <dev/pms/RefTisa/sat/api/sm.h> 48 #include <dev/pms/RefTisa/sat/api/smapi.h> 49 #include <dev/pms/RefTisa/sat/api/tdsmapi.h> 50 #endif 51 52 #ifdef FDS_DM 53 #include <dev/pms/RefTisa/discovery/api/dm.h> 54 #include <dev/pms/RefTisa/discovery/api/dmapi.h> 55 #include <dev/pms/RefTisa/discovery/api/tddmapi.h> 56 #endif 57 58 #include <dev/pms/RefTisa/tisa/sassata/sas/common/tdtypes.h> 59 #include <dev/pms/freebsd/driver/common/osstring.h> 60 #include <dev/pms/RefTisa/tisa/sassata/common/tdutil.h> 61 62 #ifdef INITIATOR_DRIVER 63 #include <dev/pms/RefTisa/tisa/sassata/sas/ini/itdtypes.h> 64 #include <dev/pms/RefTisa/tisa/sassata/sas/ini/itddefs.h> 65 #include <dev/pms/RefTisa/tisa/sassata/sas/ini/itdglobl.h> 66 #endif 67 68 #ifdef TARGET_DRIVER 69 #include <dev/pms/RefTisa/tisa/sassata/sas/tgt/ttdglobl.h> 70 #include <dev/pms/RefTisa/tisa/sassata/sas/tgt/ttdxchg.h> 71 #include <dev/pms/RefTisa/tisa/sassata/sas/tgt/ttdtypes.h> 72 #endif 73 74 #include <dev/pms/RefTisa/tisa/sassata/common/tdsatypes.h> 75 #include <dev/pms/RefTisa/tisa/sassata/common/tdproto.h> 76 77 /***************************************************************************** 78 *! \brief itdssGetResource 79 * 80 * Purpose: This function is called to determine the Transport 81 * Dependent Layer internal resource requirement for the initiator 82 * side. 83 * 84 * /param tiRoot: Pointer to driver/port instance. 85 * /param initiatorResource: Pointer to initiator functionality memory and 86 * option requirement. 87 * 88 * /return: None 89 * 90 * /note - This function only return the memory requirement in the tiMem_t 91 * structure in initiatorResource. It does not allocated memory, so the 92 * address fields in tiMem_t are not used. 93 * 94 *****************************************************************************/ 95 osGLOBAL void 96 itdssGetResource( 97 tiRoot_t * tiRoot, 98 tiInitiatorResource_t * initiatorResource 99 ) 100 { 101 itdssOperatingOption_t OperatingOption; 102 tiInitiatorMem_t *iniMem; 103 bit32 i; 104 105 iniMem = &initiatorResource->initiatorMem; 106 iniMem->count = 1; /* Only 1 memory descriptors are used */ 107 108 TI_DBG6(("itdssGetResource: start\n")); 109 110 /* other than [0], nothing is used 111 * tdCachedMem[0]: cached mem for initiator TD Layer main functionality : 112 * itdssIni_t 113 * tdCachedMem[1-5]: is availalbe 114 */ 115 116 /* 117 * Get default parameters from the OS Specific area 118 * and reads parameters from the configuration file 119 */ 120 itdssGetOperatingOptionParams(tiRoot, &OperatingOption); 121 122 /* 123 * Cached mem for initiator Transport Dependent Layer main functionality 124 */ 125 126 iniMem->tdCachedMem[0].singleElementLength = sizeof(itdsaIni_t); 127 iniMem->tdCachedMem[0].numElements = 1; 128 iniMem->tdCachedMem[0].totalLength = 129 iniMem->tdCachedMem[0].singleElementLength * 130 iniMem->tdCachedMem[0].numElements; 131 iniMem->tdCachedMem[0].alignment = sizeof (void *); /* 4 bytes */ 132 iniMem->tdCachedMem[0].type = TI_CACHED_MEM; 133 iniMem->tdCachedMem[0].reserved = 0; 134 iniMem->tdCachedMem[0].virtPtr = agNULL; 135 iniMem->tdCachedMem[0].osHandle = agNULL; 136 iniMem->tdCachedMem[0].physAddrUpper = 0; 137 iniMem->tdCachedMem[0].physAddrLower = 0; 138 139 140 /* 141 * Not used mem structure. Initialize them. 142 */ 143 for (i = iniMem->count; i < 6; i++) 144 { 145 iniMem->tdCachedMem[i].singleElementLength = 0; 146 iniMem->tdCachedMem[i].numElements = 0; 147 iniMem->tdCachedMem[i].totalLength = 0; 148 iniMem->tdCachedMem[i].alignment = 0; 149 iniMem->tdCachedMem[i].type = TI_CACHED_MEM; 150 iniMem->tdCachedMem[i].reserved = 0; 151 152 iniMem->tdCachedMem[i].virtPtr = agNULL; 153 iniMem->tdCachedMem[i].osHandle = agNULL; 154 iniMem->tdCachedMem[i].physAddrUpper = 0; 155 iniMem->tdCachedMem[i].physAddrLower = 0; 156 157 } 158 159 /* 160 * Operating option of TISA 161 * fills in tiInitiatorOption 162 */ 163 initiatorResource->initiatorOption.usecsPerTick = OperatingOption.UsecsPerTick; /* default value 1 sec*/ 164 165 initiatorResource->initiatorOption.pageSize = 0; 166 167 /* initialization */ 168 initiatorResource->initiatorOption.dynamicDmaMem.numElements = 0; 169 initiatorResource->initiatorOption.dynamicDmaMem.singleElementLength = 0; 170 initiatorResource->initiatorOption.dynamicDmaMem.totalLength = 0; 171 initiatorResource->initiatorOption.dynamicDmaMem.alignment = 0; 172 173 /* initialization */ 174 initiatorResource->initiatorOption.dynamicCachedMem.numElements = 0; 175 initiatorResource->initiatorOption.dynamicCachedMem.singleElementLength = 0; 176 initiatorResource->initiatorOption.dynamicCachedMem.totalLength = 0; 177 initiatorResource->initiatorOption.dynamicCachedMem.alignment = 0; 178 179 180 /* This is not used in OS like Linux which supports dynamic memeory allocation 181 In short, this is for Windows, which does not support dynamic memory allocation */ 182 /* ostiallocmemory(..... ,agFALSE) is supported by the following code eg) sat.c 183 The memory is DMA capable(uncached) 184 */ 185 #ifdef CCBUILD_EncryptionDriver 186 /* extend the DMA memory for supporting two encryption DEK tables */ 187 initiatorResource->initiatorOption.dynamicDmaMem.numElements = 128 + DEK_MAX_TABLE_ENTRIES / 2; 188 #else 189 initiatorResource->initiatorOption.dynamicDmaMem.numElements = 128; 190 #endif 191 /* worked 192 initiatorResource->initiatorOption.dynamicDmaMem.singleElementLength = sizeof(tdIORequestBody_t); 193 */ 194 initiatorResource->initiatorOption.dynamicDmaMem.singleElementLength = 512; 195 initiatorResource->initiatorOption.dynamicDmaMem.totalLength = 196 initiatorResource->initiatorOption.dynamicDmaMem.numElements * 197 initiatorResource->initiatorOption.dynamicDmaMem.singleElementLength; 198 initiatorResource->initiatorOption.dynamicDmaMem.alignment = sizeof(void *); 199 200 201 /* This is not used in OS like Linux which supports dynamic memeory allocation 202 In short, this is for Windows, which does not support dynamic memory allocation */ 203 /* ostiallocmemory(..... ,agTRUE) is supported by the following code eg) sat.c 204 The memory is DMA incapable(cached) 205 */ 206 initiatorResource->initiatorOption.dynamicCachedMem.numElements = 1024 + 256; 207 /* worked 208 initiatorResource->initiatorOption.dynamicCachedMem.singleElementLength = sizeof(tdIORequestBody_t); 209 initiatorResource->initiatorOption.dynamicCachedMem.singleElementLength = sizeof(tdssSMPRequestBody_t); 210 */ 211 initiatorResource->initiatorOption.dynamicCachedMem.singleElementLength = 512; 212 initiatorResource->initiatorOption.dynamicCachedMem.totalLength = 213 initiatorResource->initiatorOption.dynamicCachedMem.numElements * 214 initiatorResource->initiatorOption.dynamicCachedMem.singleElementLength; 215 initiatorResource->initiatorOption.dynamicCachedMem.alignment = sizeof(void *); 216 217 /* 218 * set the I/O request body size 219 */ 220 initiatorResource->initiatorOption.ioRequestBodySize = sizeof(tdIORequestBody_t); 221 TI_DBG6(("itdssGetResource: sizeof(tdssSMPRequestBody_t) %d\n", (int)sizeof(tdssSMPRequestBody_t))); 222 TI_DBG6(("itdssGetResource: end\n")); 223 224 return; 225 } 226 227 228 /***************************************************************************** 229 *! \brief itdssGetOperatingOptionParams 230 * 231 * Purpose: This function is called to get default parameters from the 232 * OS Specific area. This function is called in the context of 233 * tiCOMGetResource() and tiCOMInit(). 234 * 235 * 236 * \param tiRoot: Pointer to initiator driver/port instance. 237 * \param option: Pointer to the Transport Dependent options. 238 * 239 * \return: None 240 * 241 * \note - 242 * 243 *****************************************************************************/ 244 osGLOBAL void 245 itdssGetOperatingOptionParams( 246 tiRoot_t *tiRoot, 247 itdssOperatingOption_t *OperatingOption 248 ) 249 { 250 char *key = agNULL; 251 char *subkey1 = agNULL; 252 char *subkey2 = agNULL; 253 char *buffer; 254 bit32 buffLen; 255 bit32 lenRecv = 0; 256 char *pLastUsedChar = agNULL; 257 char tmpBuffer[DEFAULT_KEY_BUFFER_SIZE]; 258 char globalStr[] = "Global"; 259 char iniParmsStr[] = "InitiatorParms"; 260 261 TI_DBG6(("itdssGetOperatingOptionParams: start\n")); 262 263 /* 264 first set the values to Default values 265 Then, overwrite them using ostiGetTransportParam() 266 */ 267 268 269 /* to remove compiler warnings */ 270 pLastUsedChar = pLastUsedChar; 271 lenRecv = lenRecv; 272 subkey2 = subkey2; 273 subkey1 = subkey1; 274 key = key; 275 buffer = &tmpBuffer[0]; 276 buffLen = sizeof (tmpBuffer); 277 278 osti_memset(buffer, 0, buffLen); 279 280 281 282 /* default values */ 283 OperatingOption->MaxTargets = DEFAULT_MAX_DEV; /* DEFAULT_MAX_TARGETS; */ /* 256 */ 284 OperatingOption->UsecsPerTick = DEFAULT_INI_TIMER_TICK; /* 1 sec */ 285 286 osti_memset(buffer, 0, buffLen); 287 lenRecv = 0; 288 289 /* defaults are overwritten in the following */ 290 /* Get MaxTargets */ 291 if ((ostiGetTransportParam( 292 tiRoot, 293 globalStr, 294 iniParmsStr, 295 agNULL, 296 agNULL, 297 agNULL, 298 agNULL, 299 "MaxTargets", 300 buffer, 301 buffLen, 302 &lenRecv 303 ) == tiSuccess) && (lenRecv != 0)) 304 { 305 if (osti_strncmp(buffer, "0x", 2) == 0) 306 { 307 OperatingOption->MaxTargets = osti_strtoul (buffer, &pLastUsedChar, 0); 308 } 309 else 310 { 311 OperatingOption->MaxTargets = osti_strtoul (buffer, &pLastUsedChar, 10); 312 } 313 TI_DBG2(("itdssGetOperatingOptionParams: MaxTargets %d\n", OperatingOption->MaxTargets )); 314 } 315 316 #ifdef REMOVED 317 /* get UsecsPerTick */ 318 if ((ostiGetTransportParam( 319 tiRoot, 320 globalStr, 321 iniParmsStr, 322 agNULL, 323 agNULL, 324 agNULL, 325 agNULL, 326 "UsecsPerTick", 327 buffer, 328 buffLen, 329 &lenRecv 330 ) == tiSuccess) && (lenRecv != 0)) 331 { 332 if (osti_strncmp(buffer, "0x", 2) == 0) 333 { 334 OperatingOption->UsecsPerTick = osti_strtoul (buffer, &pLastUsedChar, 0); 335 } 336 else 337 { 338 OperatingOption->UsecsPerTick = osti_strtoul (buffer, &pLastUsedChar, 10); 339 } 340 } 341 osti_memset(buffer, 0, buffLen); 342 lenRecv = 0; 343 #endif 344 345 return; 346 } 347 348 349 /***************************************************************************** 350 *! \brief itdssInit 351 * 352 * Purpose: This function is called to initialize the initiator specific 353 * Transport Dependent Layer. 354 * This function is not directly called by OS Specific module, 355 * as it is internally called by tiCOMInit(). 356 * 357 * /param tiRoot: Pointer to driver/port instance. 358 * /param initiatorResource: Pointer to initiator functionality memory 359 * and option requirement. 360 * /param tdSharedMem: Pointer to cached memory required by the 361 * target/initiator shared functionality. 362 * 363 * /return: 364 * tiSuccess OK 365 * others not OK 366 * 367 * /note - 368 * 369 *****************************************************************************/ 370 osGLOBAL bit32 371 itdssInit( 372 tiRoot_t *tiRoot, 373 tiInitiatorResource_t *initiatorResource, 374 tiTdSharedMem_t *tdSharedMem 375 ) 376 { 377 tiInitiatorMem_t *iniMem; 378 itdsaIni_t *Initiator; 379 itdssOperatingOption_t *OperatingOption; 380 tdsaRoot_t *tdsaRoot; 381 382 TI_DBG6(("itdssInit: start\n")); 383 iniMem = &initiatorResource->initiatorMem; 384 tdsaRoot = (tdsaRoot_t *)tiRoot->tdData; 385 /* 386 * Cached mem for initiator Transport Dependent Layer main functionality 387 */ 388 Initiator = iniMem->tdCachedMem[0].virtPtr; 389 390 /* 391 * Get default parameters from the OS Specific area 392 */ 393 OperatingOption = &Initiator->OperatingOption; 394 395 /* 396 * Get default parameters from the OS Specific area 397 * and reads parameters from the configuration file 398 */ 399 400 itdssGetOperatingOptionParams(tiRoot, OperatingOption); 401 /* 402 * Update TD operating options with OS-layer-saved value 403 * Only UsecsPerTick is updated 404 */ 405 OperatingOption->UsecsPerTick = 406 initiatorResource->initiatorOption.usecsPerTick; 407 408 Initiator->NumIOsActive = 0; 409 410 /* 411 * tdCachedMem[0]: cached mem for initiator TD Layer main functionality : 412 * itdssIni_t 413 * tdCachedMem[1-5]: not in use 414 */ 415 416 /* initialize the timerlist */ 417 itdssInitTimers(tiRoot); 418 419 420 /* Initialize the tdsaAllShared, tdssSASShared pointers */ 421 422 Initiator->tdsaAllShared = &(tdsaRoot->tdsaAllShared); 423 424 TI_DBG6(("itdssInit: end\n")); 425 return (tiSuccess); 426 427 } 428 429 /***************************************************************************** 430 *! \brief 431 * itdssInitTimers 432 * 433 * Purpose: This function is called to initialize the timers 434 * for initiator 435 * 436 * \param tiRoot: pointer to the driver instance 437 * 438 * \return: None 439 * 440 * \note - 441 * 442 *****************************************************************************/ 443 osGLOBAL void 444 itdssInitTimers( 445 tiRoot_t *tiRoot 446 ) 447 { 448 tdsaRoot_t *tdsaRoot = (tdsaRoot_t *)(tiRoot->tdData); 449 tdsaContext_t *tdsaAllShared = (tdsaContext_t *)&tdsaRoot->tdsaAllShared; 450 itdsaIni_t *Initiator = (itdsaIni_t *)tdsaAllShared->itdsaIni; 451 452 /* initialize the timerlist */ 453 TDLIST_INIT_HDR(&(Initiator->timerlist)); 454 455 return; 456 } 457