HRESULT MV_CC_CBufBody_Destroy(UINT32 SHMOffset) { HRESULT res; MV_CC_DBG_Info("MV_CC_CBufBody_Destroy" " SHM Offset = [0x%08X]", SHMOffset); /* Parameter Check */ if (SHMOffset == ERROR_SHM_MALLOC_FAILED) { MV_CC_DBG_Error(E_INVALIDARG, "MV_CC_CBufBody_Destroy", NULL); } res = MV_SHM_Free( SHMOffset ); if (res != S_OK) { MV_CC_DBG_Error(res, "MV_CC_CBufBody_Destroy" " MV_SHM_Free", NULL); } return res; }
HRESULT MV_CC_CBufBody_Create(UINT32 *pSHMOffset, UINT32 BufSize, UINT32 EndBlockSize, UINT32 Flags) { pMV_CC_CBufBody_t pCBufBody; UINT32 CBuf_FullSize, SHMOffset; HRESULT res; #ifdef ENABLE_DEBUG_OSAL //Fill the end padding UINT32 buflen = BufSize; #endif /* Parameter Check */ if (pSHMOffset == NULL) MV_CC_DBG_Error(E_INVALIDARG, "MV_CC_CBufBody_Create", NULL); CBuf_FullSize = sizeof(MV_CC_CBufBody_t) + BufSize; /* Check Flag->MV_CC_CBUF_FLAGS_ALIGNMENT */ if ((MV_CC_FlagGet(Flags, MV_CC_CBUF_FLAGS_ALIGNMENT)) \ == MV_CC_CBUF_FLAGS_ALIGNMENT_Yes) CBuf_FullSize += MV_CC_HAL_MEMBOUNDARY; /* If EndBlockSize == 0, no End Block for the MV_CC_CBufBody_t and no limitation to the Block Operation */ if (EndBlockSize != 0) CBuf_FullSize += EndBlockSize; //Cbuf use cacheable memory in kernel driver, then use related virt addr SHMOffset = MV_SHM_Malloc(CBuf_FullSize, MV_CC_HAL_MEMBOUNDARY); if (SHMOffset == ERROR_SHM_MALLOC_FAILED) { *pSHMOffset = ERROR_SHM_MALLOC_FAILED; res = E_OUTOFMEMORY; MV_CC_DBG_Error(res, "MV_CC_CBufBody_Create MV_SHM_Malloc", NULL); return res; } MV_SHM_Takeover(SHMOffset); pCBufBody = (pMV_CC_CBufBody_t)MV_SHM_GetCacheVirtAddr(SHMOffset); if (pCBufBody == NULL) { MV_CC_DBG_Error(E_INVALIDARG, "MV_CC_CBufBody_Create", NULL); } GaloisMemClear((void *)pCBufBody, CBuf_FullSize); pCBufBody->m_StartOffset = sizeof(MV_CC_CBufBody_t); if ((MV_CC_FlagGet(Flags, MV_CC_CBUF_FLAGS_ALIGNMENT)) == MV_CC_CBUF_FLAGS_ALIGNMENT_Yes) { pCBufBody->m_StartOffset += MV_CC_HAL_MEMBOUNDARY - (((UINT32)pCBufBody + pCBufBody->m_StartOffset) % MV_CC_HAL_MEMBOUNDARY ); } //Fill the padding with 0xFF for debug easily #ifdef ENABLE_DEBUG_OSAL //Fill the front padding GaloisMemSet((void *)((UCHAR *)pCBufBody + sizeof(MV_CC_CBufBody_t)), 0xFF, (pCBufBody->m_StartOffset - sizeof(MV_CC_CBufBody_t)) ); if ( EndBlockSize != 0 ) buflen += EndBlockSize; GaloisMemSet((void *)((UCHAR *)pCBufBody + pCBufBody->m_StartOffset + buflen), 0xFF, CBuf_FullSize - pCBufBody->m_StartOffset - buflen); #endif pCBufBody->m_BufSize = BufSize; pCBufBody->m_EndBlockSize = EndBlockSize; pCBufBody->m_Flags = Flags; *pSHMOffset = SHMOffset; MV_CC_DBG_Info("DSS MV_CC_CBufBody_Create" " SHM Offset = [0x%08X]",SHMOffset); return S_OK; }
HRESULT MV_CC_DSS_DSPOnRecvDemux(void *self, UCHAR *pFrameBuf) { HRESULT res = S_OK, i; MV_OSAL_CPUID_U8_t DstCPU; UINT8 Cmd, Param1; pMV_CC_DSP_t pHandle; pMV_CC_DSS_ServiceInfo_t pSrvInfo, pSrvInfo_copy; /* Parameter Check */ if (((pHandle = (pMV_CC_DSP_t)self ) == NULL) || (pFrameBuf == NULL)) MV_CC_DBG_Error(E_NOTREADY, "MV_CC_DSS_DSPOnRecvDemux", NULL); DstCPU = ICCP_SrcCPU(pFrameBuf); Cmd = CCDSP_Command(pFrameBuf); switch (Cmd) { case CMD_DSS_AskUpdate: //if (DstCPU != MV_OSAL_CPU_LOCAL) if (DstCPU == pHandle->m_RemoteCPU) { // Ask DSS_Update_Task to update with Remote CPU //MV_OSAL_Sem_Post(pHandle->m_UpdateTaskSem); res = DSS_Update(pHandle); } else { MV_CC_DBG_Warning(res, "MV_CC_DSS_DSPOnRecvDemux CMD_DSS_AskUpdate error", NULL); res = E_FAIL; } break; case CMD_DSS_UpdateOK: MV_CC_DBG_Info("(CPU-%d)MV_CC_DSS_DSPOnRecvDemux CMD_DSS_UpdateOK from (CPU-%d)\n", MV_OSAL_CPU_LOCAL, DstCPU); pHandle->m_bStatusUpdate = true; res = S_OK; // Only for test //res = MV_CC_DSS_GlobalServiceList_Traversal(GSList_VisitFunc_Demo, NULL); break; case CMD_DSS_UpdateError: MV_CC_DBG_Info("(CPU-%d)MV_CC_DSS_DSPOnRecvDemux CMD_DSS_UpdateError from (CPU-%d)\n", MV_OSAL_CPU_LOCAL, DstCPU); //pHandle->m_bStatusUpdate = false; res = S_OK; break; case CMD_DSS_Add: Param1 = CCDSP_Param1(pFrameBuf); i = 0; while (i < Param1) { if ( (sizeof(MV_CC_DSS_ServiceInfo_t) * ( i + 1 )) > MV_CC_CCDSP_DATA_BYTESIZE) { res = E_OUTOFRANGE; MV_CC_DBG_Warning(res, "MV_CC_DSS_DSPOnRecvDemux CMD_DSS_Add->Parameter 1", NULl); break; } pSrvInfo = (pMV_CC_DSS_ServiceInfo_t)(DSPPacket_DataStart(pFrameBuf) + sizeof(MV_CC_DSS_ServiceInfo_t) * i); pSrvInfo_copy = MV_CC_DSS_GlobalServiceList_SrvInfo_Ctor(); if (pSrvInfo_copy == NULL) MV_CC_DBG_Error(E_OUTOFMEMORY, "MV_CC_DSS_DSPOnRecvDemux", NULL); GaloisMemcpy(pSrvInfo_copy, pSrvInfo, sizeof(MV_CC_DSS_ServiceInfo_t)); MV_OSAL_Mutex_Lock(pHandle->m_hGSListMutex); res = MV_CC_DSS_GlobalServiceList_Add(pSrvInfo->m_ServiceID, pSrvInfo_copy); if (res != S_OK) MV_CC_DBG_Warning(res, "MV_CC_DSS_DSPOnRecvDemux MV_CC_DSS_GlobalServiceList_Add", NULL); // Only for test //res = MV_CC_DSS_GlobalServiceList_Traversal(GSList_VisitFunc_Demo, NULL); MV_OSAL_Mutex_Unlock(pHandle->m_hGSListMutex); i++; } break; case CMD_DSS_Delete: Param1 = CCDSP_Param1(pFrameBuf); i = 0; while (i < Param1) { if ( (sizeof(MV_CC_DSS_ServiceInfo_t) * ( i + 1 )) > MV_CC_CCDSP_DATA_BYTESIZE) { res = E_OUTOFRANGE; MV_CC_DBG_Warning(res, "MV_CC_DSS_DSPOnRecvDemux CMD_DSS_Delete->Parameter 1", NULL); break; } pSrvInfo = (pMV_CC_DSS_ServiceInfo_t)(DSPPacket_DataStart(pFrameBuf) + sizeof(MV_CC_DSS_ServiceInfo_t) * i); MV_OSAL_Mutex_Lock(pHandle->m_hGSListMutex); res = MV_CC_DSS_GlobalServiceList_Delete(pSrvInfo->m_ServiceID); if (res != S_OK) MV_CC_DBG_Warning(res, "MV_CC_DSS_DSPOnRecvDemux MV_CC_DSS_GlobalServiceList_Delete", NULL); // Only for test //res = MV_CC_DSS_GlobalServiceList_Traversal(GSList_VisitFunc_Demo, NULL); MV_OSAL_Mutex_Unlock(pHandle->m_hGSListMutex); i++; } break; default: res = E_BADVALUE; MV_CC_DBG_Warning(res, "MV_CC_DSS_DSPOnRecvDemux Error Command", NULL); break; } if (res == S_OK) pHandle->m_RdCount++; else pHandle->m_RdErrCount++; return res; }