Int32 IpcFramesInLink_init() { Int32 status; System_LinkObj linkObj; UInt32 ipcFramesInId; IpcFramesInLink_Obj *pObj; char tskName[32]; UInt32 procId = System_getSelfProcId(); // UTILS_COMPILETIME_ASSERT(offsetof(SystemIpcFrames_ListElem, frameBuf) == 0); UTILS_COMPILETIME_ASSERT(offsetof(SystemIpcFrames_ListElem, frameBuf) == 0); UTILS_COMPILETIME_ASSERT(offsetof(VIDFrame_Buf, reserved) == 0); UTILS_COMPILETIME_ASSERT(sizeof(((SystemIpcFrames_ListElem *) 0)->frameBuf.reserved) == sizeof(ListMP_Elem)); for (ipcFramesInId = 0; ipcFramesInId < IPC_FRAMES_IN_LINK_OBJ_MAX; ipcFramesInId++) { pObj = &gIpcFramesInLink_obj[ipcFramesInId]; memset(pObj, 0, sizeof(*pObj)); pObj->tskId = SYSTEM_MAKE_LINK_ID(procId, SYSTEM_LINK_ID_IPC_FRAMES_IN_0) + ipcFramesInId; pObj->state = IPC_FRAMES_IN_LINK_STATE_INACTIVE; linkObj.pTsk = &pObj->tsk; linkObj.linkGetFullFrames = NULL; linkObj.linkPutEmptyFrames = NULL; linkObj.linkGetFullFrames = IpcFramesInLink_getFullFrames; linkObj.linkPutEmptyFrames = IpcFramesInLink_putEmptyFrames; linkObj.getLinkInfo = IpcFramesInLink_getLinkInfo; System_registerLink(pObj->tskId, &linkObj); UTILS_SNPRINTF(tskName, "IPC_FRAMES_IN%d", ipcFramesInId); System_ipcRegisterNotifyCb(pObj->tskId, IpcFramesInLink_notifyCb); status = Utils_tskCreate(&pObj->tsk, IpcFramesInLink_tskMain, IPC_LINK_TSK_PRI, gIpcFramesInLink_tskStack[ipcFramesInId], IPC_LINK_TSK_STACK_SIZE, pObj, tskName); UTILS_assert(status == FVID2_SOK); } return status; }
static Void DisplayLink_drvCreateFrameInfo(DisplayLink_Obj * pObj) { Int32 status,i; struct DisplayLink_FrameInfoObj *frameInfo = &pObj->frameInfo; UTILS_COMPILETIME_ASSERT(UTILS_ARRAYSIZE(frameInfo->infoQMem) == UTILS_ARRAYSIZE(frameInfo->infoMem)); status = Utils_queCreate(&frameInfo->infoQ, UTILS_ARRAYSIZE(frameInfo->infoQMem), &frameInfo->infoQMem[0], UTILS_QUE_FLAG_NO_BLOCK_QUE); UTILS_assert(status == 0); for (i = 0; i < UTILS_ARRAYSIZE(frameInfo->infoMem);i++) { DisplayLink_FrameInfo *frameInfoElem; frameInfoElem = &frameInfo->infoMem[i]; status = Utils_quePut(&frameInfo->infoQ,frameInfoElem, BIOS_NO_WAIT); UTILS_assert(status == 0); } return; }
static Void DisplayLink_drvCreateRtParams(DisplayLink_Obj * pObj) { Int32 status; Int i; UTILS_COMPILETIME_ASSERT(UTILS_ARRAYSIZE(pObj->rtParams.freeQMem) == UTILS_ARRAYSIZE(pObj->rtParams.paramsMem)); status = Utils_queCreate(&pObj->rtParams.freeQ, UTILS_ARRAYSIZE(pObj->rtParams.freeQMem), pObj->rtParams.freeQMem, UTILS_QUE_FLAG_NO_BLOCK_QUE); UTILS_assert(0 == status); for (i = 0; i < UTILS_ARRAYSIZE(pObj->rtParams.paramsMem); i++) { DisplayLink_drvRtParams *rtParams = &pObj->rtParams.paramsMem[i]; rtParams->dispRtPrms.inFrmPrms = &rtParams->inFrmPrms; status = Utils_quePut(&pObj->rtParams.freeQ, rtParams, BIOS_NO_WAIT); UTILS_assert(0 == status); } }
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 IpcFramesInLink_copyFrameInfo(IpcFramesInLink_Obj * pObj, VIDFrame_Buf *src, FVID2_Frame *dst, volatile SharedRegion_SRPtr srPtr[VIDFRAME_MAX_FIELDS][VIDFRAME_MAX_PLANES]) { Int i; UInt32 numPlanes; Uint32 fieldIdx; System_FrameInfo *frmInfo; //UTILS_assert(pObj->inQueInfo.numQue == 1); UTILS_COMPILETIME_ASSERT(VIDFRAME_MAX_FIELDS == FVID2_MAX_FIELDS); UTILS_COMPILETIME_ASSERT(VIDFRAME_MAX_PLANES == FVID2_MAX_PLANES); numPlanes = IpcFrameInLink_mapDataFormat2NumPlanes((FVID2_DataFormat) pObj->inQueInfo.queInfo[0].chInfo[src->channelNum].dataFormat); for (i = 0; i < numPlanes; i++) { if (src->fid == FVID2_FID_BOTTOM) { fieldIdx = 1; } else { fieldIdx = 0; } /* Force field idx to 0 irrespective of top/bot field since * other links expect in this format */ fieldIdx = 0; if (SYSTEM_MT_TILEDMEM == pObj->inQueInfo.queInfo[0].chInfo[src->channelNum].memType) { dst->addr[fieldIdx][i] = (Ptr)src->phyAddr[fieldIdx][i]; } else { if (srPtr[fieldIdx][i] != IPC_LINK_INVALID_SRPTR) { dst->addr[fieldIdx][i] = SharedRegion_getPtr(srPtr[fieldIdx][i]); } else { /*!WARNING. Assume phyiscalAddr == VirtualAddr on RTOS side. * This will break once we have mmu on RTOS side * TODO: Invoke syslink API on RTOS side to map virt2phy */ dst->addr[fieldIdx][i] = src->phyAddr[fieldIdx][i]; } } } dst->channelNum = src->channelNum; UTILS_assert(dst->channelNum < pObj->info.queInfo[0].numCh); dst->fid = src->fid; dst->timeStamp = src->timeStamp; dst->blankData = NULL; dst->drvData = NULL; dst->perFrameCfg = NULL; dst->subFrameInfo = NULL; frmInfo = dst->appData; UTILS_assert(frmInfo != NULL); frmInfo->pOrgListMPElem = src; frmInfo->rtChInfo.height = src->frameHeight; frmInfo->rtChInfo.width = src->frameWidth; frmInfo->rtChInfo.pitch[0] = src->framePitch[0]; frmInfo->rtChInfo.pitch[1] = src->framePitch[1]; /* HACK HACK HACK !!! modify rtChInfoUpdate = TRUE once the next link support dynamic resolution change */ frmInfo->rtChInfoUpdate = TRUE;//FALSE; }