1 /*******************************************************************************
2 *Copyright (c) 2014 PMC-Sierra, Inc. All rights reserved.
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
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.
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
21 ********************************************************************************/
22 #include <sys/cdefs.h>
23 __FBSDID("$FreeBSD$");
24 #include <dev/pms/config.h>
26 #include <dev/pms/freebsd/driver/common/osenv.h>
27 #include <dev/pms/freebsd/driver/common/ostypes.h>
28 #include <dev/pms/freebsd/driver/common/osdebug.h>
30 #include <dev/pms/RefTisa/tisa/api/titypes.h>
32 #include <dev/pms/RefTisa/sallsdk/api/sa.h>
33 #include <dev/pms/RefTisa/sallsdk/api/saapi.h>
34 #include <dev/pms/RefTisa/sallsdk/api/saosapi.h>
36 #include <dev/pms/RefTisa/sat/api/sm.h>
37 #include <dev/pms/RefTisa/sat/api/smapi.h>
38 #include <dev/pms/RefTisa/sat/api/tdsmapi.h>
40 #include <dev/pms/RefTisa/sat/src/smdefs.h>
41 #include <dev/pms/RefTisa/sat/src/smproto.h>
42 #include <dev/pms/RefTisa/sat/src/smtypes.h>
45 bit32 gSMDebugLevel = 1;
47 smRoot_t *gsmRoot = agNULL;
49 /* start smapi defined APIS */
53 smSwConfig_t *swConfig,
54 smMemoryRequirement_t *memoryRequirement,
59 bit32 memoryReqCount = 0;
61 bit32 max_dev = SM_MAX_DEV;
65 static char tmpBuffer[DEFAULT_KEY_BUFFER_SIZE];
66 char *pLastUsedChar = agNULL;
67 char globalStr[] = "Global";
68 char iniParmsStr[] = "InitiatorParms";
69 SM_DBG2(("smGetRequirements: start\n"));
72 SM_ASSERT((agNULL != swConfig), "");
73 SM_ASSERT((agNULL != memoryRequirement), "");
74 SM_ASSERT((agNULL != usecsPerTick), "");
75 SM_ASSERT((agNULL != maxNumLocks), "");
77 /* memory requirement for smRoot, CACHE memory */
78 memoryRequirement->smMemory[SM_ROOT_MEM_INDEX].singleElementLength = sizeof(smIntRoot_t);
79 memoryRequirement->smMemory[SM_ROOT_MEM_INDEX].numElements = 1;
80 memoryRequirement->smMemory[SM_ROOT_MEM_INDEX].totalLength =
81 (memoryRequirement->smMemory[SM_ROOT_MEM_INDEX].singleElementLength) * (memoryRequirement->smMemory[SM_ROOT_MEM_INDEX].numElements);
82 memoryRequirement->smMemory[SM_ROOT_MEM_INDEX].alignment = 4;
83 memoryRequirement->smMemory[SM_ROOT_MEM_INDEX].type = SM_CACHED_MEM;
86 /* reading the configurable parameter of MaxTargets */
88 buffLen = sizeof(tmpBuffer);
89 sm_memset(buffer, 0, buffLen);
91 if ((tdsmGetTransportParam(
103 ) == SM_RC_SUCCESS) && (lenRecv != 0))
105 if (osti_strncmp(buffer, "0x", 2) == 0)
107 max_dev = osti_strtoul (buffer, &pLastUsedChar, 0);
111 max_dev = osti_strtoul (buffer, &pLastUsedChar, 10);
114 SM_DBG3(("smGetRequirements: max_expander %d\n", max_dev));
115 /* memory requirement for Device Links, CACHE memory */
116 memoryRequirement->smMemory[SM_DEVICE_MEM_INDEX].singleElementLength = sizeof(smDeviceData_t);
117 memoryRequirement->smMemory[SM_DEVICE_MEM_INDEX].numElements = max_dev;
118 memoryRequirement->smMemory[SM_DEVICE_MEM_INDEX].totalLength =
119 (memoryRequirement->smMemory[SM_DEVICE_MEM_INDEX].singleElementLength) * (memoryRequirement->smMemory[SM_DEVICE_MEM_INDEX].numElements);
120 memoryRequirement->smMemory[SM_DEVICE_MEM_INDEX].alignment = 4;
121 memoryRequirement->smMemory[SM_DEVICE_MEM_INDEX].type = SM_CACHED_MEM;
124 /* memory requirement for IO inks, CACHE memory */
125 memoryRequirement->smMemory[SM_IO_MEM_INDEX].singleElementLength = sizeof(smIORequestBody_t);
126 memoryRequirement->smMemory[SM_IO_MEM_INDEX].numElements = SM_MAX_IO;
127 memoryRequirement->smMemory[SM_IO_MEM_INDEX].totalLength =
128 (memoryRequirement->smMemory[SM_IO_MEM_INDEX].singleElementLength) * (memoryRequirement->smMemory[SM_IO_MEM_INDEX].numElements);
129 memoryRequirement->smMemory[SM_IO_MEM_INDEX].alignment = 4;
130 memoryRequirement->smMemory[SM_IO_MEM_INDEX].type = SM_CACHED_MEM;
134 for (i=0;i< memoryReqCount;i++)
136 SM_DBG3(("smGetRequirements: index %d numElements %d totalLength %d singleElementLength %d alignment %d\n", i
137 , memoryRequirement->smMemory[i].numElements, memoryRequirement->smMemory[i].totalLength,
138 memoryRequirement->smMemory[i].singleElementLength,memoryRequirement->smMemory[i].alignment ));
140 /* set up memory requirement count */
141 memoryRequirement->count = memoryReqCount;
143 /* requirement for locks */
144 *maxNumLocks = SM_MAX_LOCKS;
146 /* setup the time tick */
147 *usecsPerTick = SM_USECS_PER_TICK;
149 /* set up the number of active IOs */
150 swConfig->maxActiveIOs = SM_MAX_IO;
152 /* set up the number of device handles */
153 swConfig->numDevHandles = SM_MAX_DEV;
163 smMemoryRequirement_t *memoryAllocated,
164 smSwConfig_t *swConfig,
168 smIntRoot_t *smIntRoot;
169 smDeviceData_t *smDevice;
170 smIORequestBody_t *smIORequest;
171 smIntContext_t *smAllShared;
173 bit32 max_dev = SM_MAX_DEV;
177 static char tmpBuffer[DEFAULT_KEY_BUFFER_SIZE];
178 char *pLastUsedChar = agNULL;
179 char globalStr[] = "Global";
180 char iniParmsStr[] = "InitiatorParms";
182 SM_DBG2(("smInitialize: start\n"));
185 SM_ASSERT((agNULL != smRoot), "");
186 SM_ASSERT((agNULL != agRoot), "");
187 SM_ASSERT((agNULL != memoryAllocated), "");
188 SM_ASSERT((agNULL != swConfig), "");
189 SM_ASSERT((SM_ROOT_MEM_INDEX < memoryAllocated->count), "");
190 SM_ASSERT((SM_DEVICE_MEM_INDEX < memoryAllocated->count), "");
191 SM_ASSERT((SM_IO_MEM_INDEX < memoryAllocated->count), "");
193 /* Check the memory allocated */
194 for ( i = 0; i < memoryAllocated->count; i ++ )
196 /* If memory allocatation failed */
197 if (memoryAllocated->smMemory[i].singleElementLength &&
198 memoryAllocated->smMemory[i].numElements)
200 if ( (0 != memoryAllocated->smMemory[i].numElements)
201 && (0 == memoryAllocated->smMemory[i].totalLength) )
204 SM_DBG1(("smInitialize: Memory[%d] singleElementLength = 0x%x numElements = 0x%x NOT allocated!!!\n",
206 memoryAllocated->smMemory[i].singleElementLength,
207 memoryAllocated->smMemory[i].numElements));
208 return SM_RC_FAILURE;
214 for ( i = 0; i < memoryAllocated->count; i ++ )
216 SM_DBG3(("smInitialize: index %d virtPtr %p osHandle%p\n",i, memoryAllocated->smMemory[i].virtPtr, memoryAllocated->smMemory[i].osHandle));
217 SM_DBG3(("smInitialize: index %d phyAddrUpper 0x%x phyAddrLower 0x%x totalLength %d numElements %d\n", i,
218 memoryAllocated->smMemory[i].physAddrUpper,
219 memoryAllocated->smMemory[i].physAddrLower,
220 memoryAllocated->smMemory[i].totalLength,
221 memoryAllocated->smMemory[i].numElements));
222 SM_DBG3(("smInitialize: index %d singleElementLength 0x%x alignment 0x%x type %d reserved %d\n", i,
223 memoryAllocated->smMemory[i].singleElementLength,
224 memoryAllocated->smMemory[i].alignment,
225 memoryAllocated->smMemory[i].type,
226 memoryAllocated->smMemory[i].reserved));
229 /* SM's internal root */
230 smIntRoot = (smIntRoot_t *) (memoryAllocated->smMemory[SM_ROOT_MEM_INDEX].virtPtr);
231 smRoot->smData = (void *) smIntRoot;
233 smAllShared = (smIntContext_t *)&(smIntRoot->smAllShared);
234 /**< Initialize the TDM data part of the interrupt context */
235 smAllShared->smRootOsData.smRoot = smRoot;
236 smAllShared->smRootOsData.smAllShared = (void *) smAllShared;
238 smAllShared->FCA = agTRUE;
241 smDevice = (smDeviceData_t *) (memoryAllocated->smMemory[SM_DEVICE_MEM_INDEX].virtPtr);
242 smAllShared->DeviceMem = (smDeviceData_t *)smDevice;
245 smIORequest = (smIORequestBody_t *) (memoryAllocated->smMemory[SM_IO_MEM_INDEX].virtPtr);
246 smAllShared->IOMem = (smIORequestBody_t *)smIORequest;
248 smAllShared->agRoot = agRoot;
250 smAllShared->usecsPerTick = usecsPerTick;
252 /**< initializes timers */
253 smInitTimers(smRoot);
255 /**< initializes devices */
257 buffLen = sizeof(tmpBuffer);
258 sm_memset(buffer, 0, buffLen);
260 if ((tdsmGetTransportParam(
272 ) == SM_RC_SUCCESS) && (lenRecv != 0))
274 if (osti_strncmp(buffer, "0x", 2) == 0)
276 max_dev = osti_strtoul (buffer, &pLastUsedChar, 0);
280 max_dev = osti_strtoul (buffer, &pLastUsedChar, 10);
282 SM_DBG1(("smInitialize: MaxTargets %d\n", max_dev));
285 smDeviceDataInit(smRoot, max_dev);
287 /**< initializes IOs */
291 gSMDebugLevel = swConfig->SMDebugLevel;
294 return SM_RC_SUCCESS;
302 smIntRoot_t *smIntRoot = (smIntRoot_t *)smRoot->smData;
303 smIntContext_t *smAllShared = (smIntContext_t *)&smIntRoot->smAllShared;
305 SM_DBG2(("smInitTimers: start\n"));
307 /* initialize the timerlist */
308 SMLIST_INIT_HDR(&(smAllShared->timerlist));
316 smDeviceData_t *oneDeviceData
320 smSatInternalIo_t *satIntIO;
322 SM_DBG2(("smDeviceDataReInit: start \n"));
324 if (oneDeviceData->satPendingIO != 0)
326 SM_DBG1(("smDeviceDataReInit: did %d\n", oneDeviceData->id));
327 SM_DBG1(("smDeviceDataReInit: satPendingIO %d satNCQMaxIO %d!!!\n", oneDeviceData->satPendingIO, oneDeviceData->satNCQMaxIO ));
328 SM_DBG1(("smDeviceDataReInit: satPendingNCQIO %d satPendingNONNCQIO %d!!!\n", oneDeviceData->satPendingNCQIO, oneDeviceData->satPendingNONNCQIO));
331 // oneDeviceData->smRoot = agNULL;
332 oneDeviceData->agDevHandle = agNULL;
333 oneDeviceData->valid = agFALSE;
334 oneDeviceData->SMAbortAll = agFALSE;
335 oneDeviceData->smDevHandle = agNULL;
336 oneDeviceData->directlyAttached = agFALSE;
337 oneDeviceData->agExpDevHandle = agNULL;
338 oneDeviceData->phyID = 0xFF;
339 oneDeviceData->SMNumOfFCA = 0;
342 oneDeviceData->satDriveState = SAT_DEV_STATE_NORMAL;
343 oneDeviceData->satNCQMaxIO =SAT_NCQ_MAX;
344 oneDeviceData->satPendingIO = 0;
345 oneDeviceData->satPendingNCQIO = 0;
346 oneDeviceData->satPendingNONNCQIO = 0;
347 oneDeviceData->IDDeviceValid = agFALSE;
348 oneDeviceData->freeSATAFDMATagBitmap = 0;
349 oneDeviceData->NumOfFCA = 0;
350 oneDeviceData->NumOfIDRetries = 0;
351 oneDeviceData->ID_Retries = 0;
352 oneDeviceData->OSAbortAll = agFALSE;
354 sm_memset(oneDeviceData->satMaxLBA, 0, sizeof(oneDeviceData->satMaxLBA));
355 sm_memset(&(oneDeviceData->satIdentifyData), 0xFF, sizeof(agsaSATAIdentifyData_t));
357 oneDeviceData->satSaDeviceData = oneDeviceData;
359 satIntIO = (smSatInternalIo_t *)&(oneDeviceData->satIntIo[0]);
360 for (j = 0; j < SAT_MAX_INT_IO; j++)
362 SM_DBG2(("tdsaDeviceDataReInit: in loop of internal io free, id %d\n", satIntIO->id));
363 smsatFreeIntIoResource(smRoot, oneDeviceData, satIntIO);
364 satIntIO = satIntIO + 1;
375 smIntRoot_t *smIntRoot = (smIntRoot_t *)smRoot->smData;
376 smIntContext_t *smAllShared = (smIntContext_t *)&smIntRoot->smAllShared;
377 smDeviceData_t *smDeviceData = (smDeviceData_t *)smAllShared->DeviceMem;
379 smSatInternalIo_t *satIntIO;
381 SM_DBG2(("smDeviceDataInit: start \n"));
383 SMLIST_INIT_HDR(&(smAllShared->MainDeviceList));
384 SMLIST_INIT_HDR(&(smAllShared->FreeDeviceList));
386 for(i=0;i<(int)max_dev;i++)
388 SMLIST_INIT_ELEMENT(&(smDeviceData[i].FreeLink));
389 SMLIST_INIT_ELEMENT(&(smDeviceData[i].MainLink));
390 smDeviceData[i].id = i;
391 smDeviceData[i].smRoot = agNULL;
392 smDeviceData[i].agDevHandle = agNULL;
393 smDeviceData[i].valid = agFALSE;
394 smDeviceData[i].SMAbortAll = agFALSE;
395 smDeviceData[i].smDevHandle = agNULL;
396 smDeviceData[i].directlyAttached = agFALSE;
397 smDeviceData[i].agExpDevHandle = agNULL;
398 smDeviceData[i].phyID = 0xFF;
399 smDeviceData[i].SMNumOfFCA = 0;
402 SMLIST_INIT_HDR(&(smDeviceData[i].satIoLinkList));
403 SMLIST_INIT_HDR(&(smDeviceData[i].satFreeIntIoLinkList));
404 SMLIST_INIT_HDR(&(smDeviceData[i].satActiveIntIoLinkList));
407 smDeviceData[i].satDriveState = SAT_DEV_STATE_NORMAL;
408 smDeviceData[i].satNCQMaxIO =SAT_NCQ_MAX;
409 smDeviceData[i].satPendingIO = 0;
410 smDeviceData[i].satPendingNCQIO = 0;
411 smDeviceData[i].satPendingNONNCQIO = 0;
412 smDeviceData[i].IDDeviceValid = agFALSE;
413 smDeviceData[i].freeSATAFDMATagBitmap = 0;
414 smDeviceData[i].NumOfFCA = 0;
415 smDeviceData[i].NumOfIDRetries = 0;
416 smDeviceData[i].ID_Retries = 0;
417 smDeviceData[i].OSAbortAll = agFALSE;
418 smInitTimerRequest(smRoot, &(smDeviceData[i].SATAIDDeviceTimer));
420 sm_memset(&(smDeviceData[i].satIdentifyData), 0xFF, sizeof(agsaSATAIdentifyData_t));
421 sm_memset(smDeviceData[i].satMaxLBA, 0, sizeof(smDeviceData[i].satMaxLBA));
423 smDeviceData[i].satSaDeviceData = &smDeviceData[i];
426 satIntIO = &smDeviceData[i].satIntIo[0];
427 for (j = 0; j < SAT_MAX_INT_IO; j++)
429 SMLIST_INIT_ELEMENT (&satIntIO->satIntIoLink);
430 SMLIST_ENQUEUE_AT_TAIL (&satIntIO->satIntIoLink,
431 &smDeviceData[i].satFreeIntIoLinkList);
432 satIntIO->satOrgSmIORequest = agNULL;
434 satIntIO = satIntIO + 1;
438 /* some other variables */
439 SMLIST_ENQUEUE_AT_TAIL(&(smDeviceData[i].FreeLink), &(smAllShared->FreeDeviceList));
450 smIntRoot_t *smIntRoot = (smIntRoot_t *)smRoot->smData;
451 smIntContext_t *smAllShared = (smIntContext_t *)&smIntRoot->smAllShared;
452 smIORequestBody_t *smIOCommand = (smIORequestBody_t *)smAllShared->IOMem;
455 SM_DBG3(("smIOInit: start\n"));
457 SMLIST_INIT_HDR(&(smAllShared->freeIOList));
458 SMLIST_INIT_HDR(&(smAllShared->mainIOList));
460 for(i=0;i<SM_MAX_IO;i++)
462 SMLIST_INIT_ELEMENT(&(smIOCommand[i].satIoBodyLink));
463 smIOCommand[i].id = i;
464 smIOCommand[i].InUse = agFALSE;
465 smIOCommand[i].ioStarted = agFALSE;
466 smIOCommand[i].ioCompleted = agFALSE;
467 smIOCommand[i].reTries = 0;
469 smIOCommand[i].smDevHandle = agNULL;
470 smIOCommand[i].smIORequest = agNULL;
471 smIOCommand[i].smIOToBeAbortedRequest = agNULL;
472 smIOCommand[i].transport.SATA.satIOContext.satOrgIOContext = agNULL;
474 sm_memset(&(smIOCommand[i].transport.SATA.agSATARequestBody), 0, sizeof(agsaSATAInitiatorRequest_t));
477 SMLIST_ENQUEUE_AT_TAIL(&(smIOCommand[i].satIoBodyLink), &(smAllShared->freeIOList));
486 smIORequestBody_t *smIORequestBody
489 SM_DBG3(("smIOReInit: start\n"));
490 smIORequestBody->InUse = agTRUE;
491 smIORequestBody->ioStarted = agFALSE;
492 smIORequestBody->ioCompleted = agFALSE;
493 smIORequestBody->reTries = 0;
494 smIORequestBody->smDevHandle = agNULL;
495 smIORequestBody->smIORequest = agNULL;
496 smIORequestBody->smIOToBeAbortedRequest = agNULL;
497 smIORequestBody->transport.SATA.satIOContext.satOrgIOContext = agNULL;
498 /*sm_memset(&(smIORequestBody->transport.SATA.agSATARequestBody), 0, sizeof(agsaSATAInitiatorRequest_t));*/
502 /* end smapi defined APIS */