static Void DisplayLink_drvFreeFrameInfo(DisplayLink_Obj * pObj, FVID2_FrameList *frameList) { Int i; FVID2_Frame *frame; DisplayLink_FrameInfo *frameInfo; Int32 status; for (i = 0; i < frameList->numFrames; i++) { frame = frameList->frames[i]; if (DISPLAY_LINK_BLANK_FRAME_CHANNEL_NUM != frame->channelNum) { frameInfo = frame->appData; UTILS_assert(UTILS_ARRAYISVALIDENTRY(frameInfo, pObj->frameInfo.infoMem)); status = Utils_quePut(&pObj->frameInfo.infoQ, frameInfo, BIOS_NO_WAIT); UTILS_assert(status == 0); } } }
static Void DisplayLink_drvFreeRtParams(DisplayLink_Obj * pObj, FVID2_FrameList *freeFrameList) { Int32 status; DisplayLink_drvRtParams *rtParams; rtParams = freeFrameList->perListCfg; if (rtParams) { UTILS_COMPILETIME_ASSERT( offsetof(DisplayLink_drvRtParams,dispRtPrms) == 0); UTILS_assert(UTILS_ARRAYISVALIDENTRY(rtParams,pObj->rtParams.paramsMem)); status = Utils_quePut(&pObj->rtParams.freeQ, rtParams, BIOS_NO_WAIT); UTILS_assert(status == 0); } }
static Void DisplayLink_validateFrameList(DisplayLink_Obj * pObj, FVID2_FrameList *frameList) { static Bool enableValidate = FALSE; FVID2_Frame *frame; DisplayLink_FrameInfo *frameInfo; Int i; if (enableValidate) { for (i = 0; i < frameList->numFrames; i++) { frame = frameList->frames[i]; if (DISPLAY_LINK_BLANK_FRAME_CHANNEL_NUM != frame->channelNum) { frameInfo = frame->appData; UTILS_assert(UTILS_ARRAYISVALIDENTRY(frameInfo, pObj->frameInfo.infoMem)); } } } }
Int32 IpcFramesInLink_putEmptyFrames(Utils_TskHndl * pTsk, UInt16 queId, FVID2_FrameList * pFrameBufList) { IpcFramesInLink_Obj *pObj = (IpcFramesInLink_Obj *) pTsk->appData; UInt32 bufId; FVID2_Frame *pFrameBuf; Int32 status; SystemIpcFrames_ListElem *pListElem = NULL; UInt32 curTime; System_FrameInfo *frmInfo; #ifdef SYSTEM_DEBUG_IPC_RT Vps_printf(" %d: IPC_FRAMES_IN : Releasing %d framebufs !!!\n", Utils_getCurTimeInMsec(), pFrameBufList->numFrames); #endif if ((pFrameBufList->numFrames) && (IPC_FRAMES_IN_LINK_STATE_ACTIVE == pObj->state)) { UTILS_assert(pFrameBufList->numFrames <= FVID2_MAX_FVID_FRAME_PTR); curTime = Utils_getCurTimeInMsec(); pObj->stats.freeCount += pFrameBufList->numFrames; for (bufId = 0; bufId < pFrameBufList->numFrames; bufId++) { pFrameBuf = pFrameBufList->frames[bufId]; frmInfo = pFrameBuf->appData; UTILS_assert(frmInfo != NULL); pListElem = (SystemIpcFrames_ListElem *) frmInfo->pOrgListMPElem; UTILS_assert(pListElem->frameBuf.phyAddr[0][0] == pFrameBuf->addr[0][0]); UTILS_assert(UTILS_ARRAYISVALIDENTRY(pFrameBuf,pObj->freeFrameMem)); UTILS_assert(SYSTEM_IPC_FRAMES_GET_BUFSTATE(pListElem->bufState) == IPC_FRAMEBUF_STATE_DEQUEUED); status = Utils_quePut(&pObj->freeFrameQue,pFrameBuf,BIOS_NO_WAIT); UTILS_assert(status == FVID2_SOK); if (curTime > pListElem->frameBuf.reserved[0]) { pObj->stats.totalRoundTrip += (curTime - pListElem->frameBuf.reserved[0]); } SYSTEM_IPC_FRAMES_SET_BUFSTATE(pListElem->bufState, IPC_FRAMEBUF_STATE_INQUE); status = ListMP_putTail(pObj->listMPInHndl, (ListMP_Elem *) pListElem); UTILS_assert(status == ListMP_S_SUCCESS); } if (pObj->createArgs.baseCreateParams.notifyPrevLink) { // Vps_printf("593:System_ipcSendNotify,id=%d\n",pObj->createArgs.baseCreateParams.inQueParams.prevLinkId); System_ipcSendNotify(pObj->createArgs.baseCreateParams.inQueParams. prevLinkId); } } if (IPC_FRAMES_IN_LINK_STATE_INACTIVE == pObj->state) { Vps_printf(" %d: IPC_FRAMES_IN:Warning! Free Frames invoked after link delete\n", Utils_getCurTimeInMsec()); } return IPC_FRAMES_IN_LINK_S_SUCCESS; }
static Int32 DisplayLink_drvDeQueue(DisplayLink_Obj * pObj, FVID2_FrameList *freeFrameList, UInt32 *freeQueId) { Int32 status,i; FVID2_Frame *frame; FVID2_FrameList tmpFreeFrameList; DisplayLink_FrameInfo *frameInfo; freeFrameList->numFrames = 0; tmpFreeFrameList.numFrames = 0; *freeQueId = DISPLAY_LINK_INVALID_INQUEID; status = FVID2_dequeue(pObj->displayHndl,&tmpFreeFrameList,0, BIOS_NO_WAIT); if (FVID2_SOK == status) { pObj->dequeCount += tmpFreeFrameList.numFrames; if (tmpFreeFrameList.numFrames) { pObj->maxQueueCount++; #ifdef SYSTEM_DEBUG_DISPLAY_RT Vps_printf(" %d: DISPLAY: Deque %d frames\n", Utils_getCurTimeInMsec(), tmpFreeFrameList.numFrames); #endif DisplayLink_drvFreeRtParams(pObj,&tmpFreeFrameList); } for (i = 0; i < tmpFreeFrameList.numFrames;i++) { frame = tmpFreeFrameList.frames[i]; if (DISPLAY_LINK_BLANK_FRAME_CHANNEL_NUM != frame->channelNum) { frameInfo = frame->appData; UTILS_assert(UTILS_ARRAYISVALIDENTRY(frameInfo,pObj->frameInfo.infoMem)); *freeQueId = frameInfo->activeQueueId; if (frameInfo->isFieldPair) { UInt32 curTime; curTime = Utils_getCurTimeInMsec(); UTILS_assert(freeFrameList->numFrames < UTILS_ARRAYSIZE(freeFrameList->frames)); freeFrameList->frames[freeFrameList->numFrames] = frameInfo->origFrame[0]; pObj->drvTopFieldLatency += (curTime - frameInfo->origFrame[0]->timeStamp); pObj->numTopFields++; freeFrameList->numFrames++; UTILS_assert(freeFrameList->numFrames < UTILS_ARRAYSIZE(freeFrameList->frames)); freeFrameList->frames[freeFrameList->numFrames] = frameInfo->origFrame[1]; freeFrameList->numFrames++; pObj->numBufsInDriver--; } else { /* If not field pair, restore original appData */ frame->appData = frameInfo->origFrameInfo; UTILS_assert(freeFrameList->numFrames < UTILS_ARRAYSIZE(freeFrameList->frames)); freeFrameList->frames[freeFrameList->numFrames] = frame; freeFrameList->numFrames++; pObj->numBufsInDriver--; } status = Utils_quePut(&pObj->frameInfo.infoQ, frameInfo, BIOS_NO_WAIT); UTILS_assert(status == 0); } } } return status; }