Int FirmwareLoad_shutdown (UInt16 procId) { Int status = 0; ProcMgr_Handle handle = NULL; UInt32 fileId; if(status>=0) status = FirmwareLoad_ipcStop(procId); if(status>=0) status = ProcMgr_open (&handle, procId); if (status >= 0) { status = ProcMgr_stop (handle); printf ("Stopped slave procId %d.\n", procId); fileId = ProcMgr_getLoadedFileId (handle); status = ProcMgr_unload (handle, fileId) ; printf ("Unloaded slave procId %d.\n", procId); status = ProcMgr_detach (handle); printf ("Detached from slave procId %d.\n", procId); status = ProcMgr_close (&handle); } return status; }
/* * ======== ipc_cleanup ======== */ static Void ipcCleanup (Void) { ProcMgr_StopParams stopParams; Int status = 0; /* Cleanup the default HeapBufMP registered with MessageQ */ status = MessageQ_unregisterHeap (RCM_MSGQ_DOMX_HEAPID); if (status < 0) { Osal_printf ("Error in MessageQ_unregisterHeap [0x%x]\n", status); } if (heapHandle1) { status = HeapBufMP_delete (&heapHandle1); if (status < 0) { Osal_printf ("Error in HeapBufMP_delete [0x%x]\n", status); } } if (heapBufPtr1) { Memory_free (srHeap, heapBufPtr1, heapSize1); } status = MessageQ_unregisterHeap (RCM_MSGQ_TILER_HEAPID); if (status < 0) { Osal_printf ("Error in MessageQ_unregisterHeap [0x%x]\n", status); } if (heapHandle) { status = HeapBufMP_delete (&heapHandle); if (status < 0) { Osal_printf ("Error in HeapBufMP_delete [0x%x]\n", status); } } if (heapBufPtr) { Memory_free (srHeap, heapBufPtr, heapSize); } status = ProcMgr_deleteDMMPool (DUCATI_DMM_POOL_0_ID, remoteIdSysM3); if (status < 0) { Osal_printf ("Error in ProcMgr_deleteDMMPool:status = 0x%x\n", status); } if(appM3Client) { stopParams.proc_id = remoteIdAppM3; status = ProcMgr_stop (procMgrHandleAppM3, &stopParams); if (status < 0) { Osal_printf ("Error in ProcMgr_stop(%d): status = 0x%x\n", stopParams.proc_id, status); } #if defined(SYSLINK_USE_LOADER) status = ProcMgr_unload (procMgrHandleAppM3, fileIdAppM3); if(status < 0) { Osal_printf ("Error in ProcMgr_unload, status [0x%x]\n", status); } #endif } stopParams.proc_id = remoteIdSysM3; status = ProcMgr_stop (procMgrHandleSysM3, &stopParams); if (status < 0) { Osal_printf ("Error in ProcMgr_stop(%d): status = 0x%x\n", stopParams.proc_id, status); } #if defined(SYSLINK_USE_LOADER) status = ProcMgr_unload (procMgrHandleSysM3, fileIdSysM3); if(status < 0) { Osal_printf ("Error in ProcMgr_unload, status [0x%x]\n", status); } #endif if(appM3Client) { status = ProcMgr_detach (procMgrHandleAppM3); if (status < 0) { Osal_printf ("Error in ProcMgr_detach(AppM3): status = 0x%x\n", status); } status = ProcMgr_close (&procMgrHandleAppM3); if (status < 0) { Osal_printf ("Error in ProcMgr_close(AppM3): status = 0x%x\n", status); } } status = ProcMgr_detach (procMgrHandleSysM3); if (status < 0) { Osal_printf ("Error in ProcMgr_detach(SysM3): status = 0x%x\n", status); } status = ProcMgr_close (&procMgrHandleSysM3); if (status < 0) { Osal_printf ("Error in ProcMgr_close(SysM3): status = 0x%x\n", status); } status = Ipc_destroy (); if (status < 0) { Osal_printf ("Error in Ipc_destroy: status = 0x%x\n", status); } Osal_printf ("Done cleaning up ipc!\n\n"); }
/* * ======== procDelete ======== */ static Void procDelete(Processor_Handle proc) { Int status = 0; Int16 heapId; Bool unregisterAndDeleteHeap; ProcMgr_AddrInfo CMEMAddrInfo; CMEM_BlockAttrs cmemBlockAttrs; Int blockNum; Int nCMEMBlocks; Log_print1(Diags_ENTRY, "[+E] Processor_delete_d> Enter (proc=0x%x)", (IArg)proc); if (proc == NULL) { goto procDelete_return; } /* close tranport and stop DSP, detach, destroy */ /* unregister this heap with MessageQ */ if (proc->startCallBackStatus >= 0) { blockNum = 0; nCMEMBlocks = 0; status = CMEM_getNumBlocks(&nCMEMBlocks); if (status != 0) { Log_print1(Diags_USER2, "[+2] Processor_delete_d> " "CMEM_getNumBlocks() failed: %d", status); } while (blockNum < nCMEMBlocks) { status = CMEM_getBlockAttrs(blockNum, &cmemBlockAttrs); if (status != 0) { Log_print2(Diags_USER7, "[+7] Processor_delete_d> " "CMEM_getBlockAttrs(%d) failed: %d", blockNum, status); goto cmemDone; } CMEMAddrInfo.addr[ProcMgr_AddrType_MasterPhys] = cmemBlockAttrs.phys_base; CMEMAddrInfo.addr[ProcMgr_AddrType_SlaveVirt] = cmemBlockAttrs.phys_base; CMEMAddrInfo.size = cmemBlockAttrs.size; CMEMAddrInfo.isCached = FALSE; Log_print3(Diags_USER1, "[+1] Processor_delete_d> CMEM block " "#%d found, doing ProcMgr_unmap(0x%x, 0x%x)...", blockNum, (IArg)cmemBlockAttrs.phys_base, (IArg)cmemBlockAttrs.size); status = ProcMgr_unmap(proc->procMgrH, ProcMgr_SLAVEVIRT, &CMEMAddrInfo, ProcMgr_AddrType_MasterPhys); if (status < 0) { Log_print1(Diags_USER7, "[+7] Processor_delete_d> " "ProcMgr_unmap() failed: %d", status); goto cmemDone; } blockNum++; } cmemDone: Log_print2(Diags_USER7, "[+2] Processor_delete_d> " "defaultHeapH: 0x%x, proc->heapH: 0x%x", (IArg)defaultHeapH, (IArg)proc->heapH); if (proc->heapH != NULL) { unregisterAndDeleteHeap = FALSE; if (proc->heapH == defaultHeapH) { Log_print1(Diags_USER1, "[+1] Processor_delete_d> " "defaultHeapRefCount = %d", (IArg)defaultHeapRefCount); if (--defaultHeapRefCount == 0) { /* this is the last one using the default heap */ unregisterAndDeleteHeap = TRUE; } } else { unregisterAndDeleteHeap = TRUE; } if (unregisterAndDeleteHeap) { heapId = proc->heapId; Log_print1(Diags_USER1, "[+1] Processor_delete_d> " "unregisterAndDeleteHeap, heapId = %d", (IArg)heapId); if (heapId != Processor_INVALID) { Log_print1(Diags_USER1, "[+1] Processor_delete_d> " "MessageQ_unregisterHeap(heapId: %d)", (IArg)heapId); if (MessageQ_unregisterHeap(heapId) !=MessageQ_S_SUCCESS) { Log_print1(Diags_USER7, "[+7] Processor_delete_d> " "MessageQ_unregisterHeap(heapId: %d) failed", heapId); } } /* delete heap used by message queue */ Log_print1(Diags_USER1, "[+1] Processor_delete_d> " "calling HeapBufMP_delete(heapH: 0x%x)", (IArg)(proc->heapH)); HeapBufMP_delete(&proc->heapH); } } /* Stop execution on DSP */ Log_print0(Diags_USER1, "[+2] Processor_delete_d> " "calling Ipc_control(STOPCALLBACK)..."); status = Ipc_control(proc->cpuId, Ipc_CONTROLCMD_STOPCALLBACK, NULL); Log_print2(Diags_USER2, "[+2] Processor_delete_d> " "Ipc_control(STOPCALLBACK) status: 0x%x [%d]", (IArg)status, (IArg)status); } else { Log_print2(Diags_USER2, "[+2] Processor_delete_d> Not calling " "Ipc_control(STOPCALLBACK) because startCallBackStatus = " "0x%x [%d]", (IArg)proc->startCallBackStatus, (IArg)proc->startCallBackStatus); } if (proc->useExtLoader == FALSE) { /* We unload the slave processor */ Log_print0(Diags_USER2, "[+2] Processor_delete_d> Stopping DSP..."); status = ProcMgr_stop(proc->procMgrH); if (status < 0) { Log_print1(Diags_USER6, "[+6] Processor_delete_d> " "Stopping DSP FAILED, status=0x%x", (IArg)status); } if (proc->fileId != 0xffffffff) { Log_print0(Diags_USER2, "[+2] Processor_delete_d> " "Unloading DSP..."); status = ProcMgr_unload(proc->procMgrH, proc->fileId); if (status < 0) { Log_print1(Diags_USER6, "[+6] Processor_delete_d> " "Unloading DSP FAILED, status=0x%x", (IArg)status); } } /* Unmap slave memory */ if (!mapByFile(proc->procMgrH, proc->memMapName, proc->cpuId, FALSE)) { Log_print0(Diags_USER6, "Processor_delete_d> mapByFile() failed!"); } /* Detach from the processor */ Log_print0(Diags_USER1, "[+1] Processor_delete_d> " "calling ProcMgr_detach()..."); status = ProcMgr_detach(proc->procMgrH); if (status < 0) { Log_print1(Diags_USER6, "[+6] Processor_delete_d> " "Detaching from DSP FAILED, status=0x%x", (IArg)status); } } // proc->useExtLoader == FALSE Log_print0(Diags_USER1, "[+1] Processor_delete_d> " "calling ProcMgr_close()..."); status = ProcMgr_close(&proc->procMgrH); if (status < 0) { Log_print1(Diags_USER6, "[+6] Processor_delete_d> " "Closing ProcMgr FAILED, status=0x%x", (IArg)status); } procDelete_return: Log_print0(Diags_EXIT, "[+X] Processor_delete_d> return"); }