Example #1
0
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;
}
/*!
 *  @brief      Function to unmap
 *
 *
 *  @param      mappedAddr       The remote address to unmap
 *  @param      procId                 The remote Processor ID
 *
 *  @sa         SysLinkMemUtils_map
 */
Int
SysLinkMemUtils_unmap (UInt32 mappedAddr, ProcMgr_ProcId procId)
{
    ProcMgr_Handle procMgrHandle;
    Int32          status = PROCMGR_SUCCESS;

    /* Open a handle to the ProcMgr instance. */
    if (procId == PROC_APPM3) {
        procId = PROC_SYSM3;
    }

    /* Open a handle to the ProcMgr instance. */
    status = ProcMgr_open (&procMgrHandle, procId);
    if (status < 0) {
        Osal_printf ("Error in ProcMgr_open [0x%x]\n", status);
    }
    else {
        status = ProcMgr_unmap (procMgrHandle, mappedAddr, procId);
        /* FIX ME: Add Proc unreserve call */
        if (status < 0) {
            Osal_printf ("Error in ProcMgr_unmap [0x%x]\n", status);
        }
        else {
            status = ProcMgr_close (&procMgrHandle);
        }
    }

    return status;
}
Example #3
0
/*!
 *  @brief  Function to execute the shutdown for ProcMgrApp sample application
 */
Int
ProcMgrApp_shutdown (UInt16 procId)
{
    Int                          status = 0;
    ProcMgr_Handle               handle = NULL;
    ProcMgr_State                state;

    PRINTF ("Entered ProcMgrApp_shutdown\n");

    status = ProcMgr_open (&handle, procId);

    if (status >= 0) {
        status = Ipc_control (procId, Ipc_CONTROLCMD_STOPCALLBACK, NULL);
        PRINTF ("Ipc_control Ipc_CONTROLCMD_STOPCALLBACK status: [0x%x]\n",
                     status);

        status = ProcMgr_detach (handle);
        PRINTF ("ProcMgr_detach status: [0x%x]\n", status);

        state = ProcMgr_getState (handle);
        PRINTF ("After detach: ProcMgr_getState\n"
                     "    state [0x%x]\n",
                     state);

        status = ProcMgr_close (&handle);
        PRINTF ("ProcMgr_close status: [0x%x]\n", status);
    }

    PRINTF ("Leaving ProcMgrApp_shutdown\n");

    return 0;
}
Example #4
0
Int FirmwareLoad_startup (UInt16 procId, String filePath)
{
    Int                          status = 0;
    ProcMgr_Handle               handle = NULL;
    ProcMgr_AttachParams         attachParams;
    ProcMgr_StartParams          startParams;
    //String                       args [NUM_ARGS];
    UInt32                       fileId;

    status = ProcMgr_open (&handle, procId);

    if (status >= 0) {

        ProcMgr_getAttachParams (NULL, &attachParams);
        
        /* Default params will be used if NULL is passed. */
        status = ProcMgr_attach (handle, &attachParams);
        if (status < 0) 
            printf ("ProcMgr_attach failed [0x%x]\n", status);
        else 
            printf ("Attached to slave procId %d.\n", procId);

        if(status >= 0)
        {
            /* Send filePath as the args to the slave to demonstrate how args
             * are used.
             */
            //args [0] = filePath;
            status = ProcMgr_load (handle,
                                   filePath,
                                   0,
                                   NULL,
                                   NULL,
                                   &fileId);
            if (status < 0) 
                printf ("Error in ProcMgr_load [0x%x]\n", status);
            else 
                printf ("Loaded file %s on slave procId %d.\n", filePath, procId);
        }

        if (status >= 0)
        {
            ProcMgr_getStartParams (handle, &startParams);
            status = ProcMgr_start (handle, &startParams);
            if (status < 0) 
                printf ("ProcMgr_start failed [0x%x]\n", status);
            else 
                printf ("Started slave procId %d.\n", procId);
        }

        status = ProcMgr_close (&handle);
    }

    if(status>=0)    
        status = FirmwareLoad_ipcStart(procId);    

    return status;
}
/*!
 *  @brief      Function to retrieve physical entries given a remote
 *              Processor's virtual address.
 *
 *              This function returns success state of this function
 *
 *  @param      remoteAddr  The slave's address
 *  @param      size        size of buffer
 *  @param      physEntries Translated physical addresses of each Page.
 *  @param      procId      Remote Processor Id.
 *  @param      flags       Used to pass any custom information for optimization.
 *
 *  @sa         SysLinkMemUtils_virtToPhys
 */
Int
SysLinkMemUtils_virtToPhysPages (UInt32         remoteAddr,
                                 UInt32         numOfPages,
                                 UInt32         physEntries[],
                                 ProcMgr_ProcId procId)
{
    Int             i;
    Int32           status = PROCMGR_SUCCESS;
    ProcMgr_Handle  procMgrHandle;

    GT_1trace (curTrace, GT_ENTER, "SysLinkMemUtils_virtToPhys: remote Addr",
                    remoteAddr);

    if (physEntries == NULL || (numOfPages == 0)) {
        Osal_printf("SysLinkMemUtils_virtToPhys: ERROR:Input arguments invalid:"
                    "physEntries = 0x%x, numOfPages = %d\n",
                    (UInt32)physEntries, numOfPages);
        return PROCMGR_E_FAIL;
    }

    if (procId == PROC_APPM3) {
        procId = PROC_SYSM3;
    }

    Osal_printf ("testing with ProcMgr_virtToPhysPages\n");

    /* Open a handle to the ProcMgr instance. */
    status = ProcMgr_open (&procMgrHandle, procId);
    if (status < 0) {
        Osal_printf ("Error in ProcMgr_open [0x%x]\n", status);
        return PROCMGR_E_FAIL;
    }
    /* TODO: Hack for tiler */
    if(remoteAddr >= TILER_ADDRESS_START && remoteAddr < TILER_ADDRESS_END) {
        for (i = 0; i < numOfPages; i++) {
            physEntries[i] = Page_ALIGN_LOW(remoteAddr, Page_SIZE_4K) + \
                                                                    (4096 * i);
        }
    }
    else {
        status = ProcMgr_virtToPhysPages (procMgrHandle, remoteAddr,
                    numOfPages, physEntries, procId);
    }

    if (status < 0) {
        Osal_printf ("Error in ProcMgr_virtToPhysPages [0x%x]\n", status);
    }
    else {
        for (i = 0; i < numOfPages; i++) {
            Osal_printf("physEntries[%d] = 0x%x\n", i, physEntries[i]);
        }
    }

    status = ProcMgr_close (&procMgrHandle);

    return status;
}
Example #6
0
Void Audio_systemProcDeInit (Void)
{
    Int32  state;
    Int32  status;

    state = ProcMgr_getState (procMgrHandle);

    status = ProcMgr_close (&procMgrHandle);

    SysLink_destroy ();
}
Example #7
0
Void FirmwareLoad_printStatus (Void)
{
    Int             status = 0;
    ProcMgr_Handle  handle = NULL;
    UInt16          numProcs;
    UInt16          i;
    ProcMgr_State   state;
    Char            strState [32u];

    printf ("Current status of slave cores:\n");
    numProcs = MultiProc_getNumProcessors ();
    for (i = 0 ; (i < numProcs) && (i != MultiProc_self ()) ; i++) {
        {
            status = ProcMgr_open (&handle, i);
            if (status >= 0) {
                state = ProcMgr_getState (handle);
                switch (state)
                {
                    case ProcMgr_State_Unknown:
                        strncpy (strState, "Unknown", 32u);
                        break;
                    case ProcMgr_State_Powered:
                        strncpy (strState, "Powered", 32u);
                        break;
                    case ProcMgr_State_Reset:
                        strncpy (strState, "Reset", 32u);
                        break;
                    case ProcMgr_State_Loaded:
                        strncpy (strState, "Loaded", 32u);
                        break;
                    case ProcMgr_State_Running:
                        strncpy (strState, "Running", 32u);
                        break;
                    case ProcMgr_State_Unavailable:
                        strncpy (strState, "Unavailable", 32u);
                        break;
                    case ProcMgr_State_EndValue:
                        /* Not a valid value. */
                        break;
                }
                printf ("Slave core %d: %8s [%s]\n",
                             i,
                             MultiProc_getName (i),
                             strState);
                status = ProcMgr_close (&handle);
            }
        }
    }
}
/*!
 *  @brief      Function to Map Host processor to Remote processors
 *              module
 *
 *              This function can be called by the application to map their
 *              address space to remote slave's address space.
 *
 *  @param      MpuAddr
 *
 *  @sa         SysLinkMemUtils_unmap
 */
Int
SysLinkMemUtils_map (SyslinkMemUtils_MpuAddrToMap   mpuAddrList [],
                     UInt32                         numOfBuffers,
                     UInt32 *                       mappedAddr,
                     ProcMgr_MapType                memType,
                     ProcMgr_ProcId                 procId)
{
    ProcMgr_Handle  procMgrHandle;
    UInt32          mappedSize;
    Int32           status = PROCMGR_SUCCESS;

    if (numOfBuffers > 1) {
        status = PROCMGR_E_INVALIDARG;
        Osal_printf ("SysLinkMemUtils_map numBufError [0x%x]\n", status);
        return status;
    }

    if (procId == PROC_APPM3) {
        procId = PROC_SYSM3;
    }

    if (memType == ProcMgr_MapType_Tiler) {
        /* TILER addresses are pre-mapped, so just return the TILER ssPtr */
        *mappedAddr = TilerMem_VirtToPhys ((Void *)mpuAddrList [0].mpuAddr);
        return status;
    }

    /* Open a handle to the ProcMgr instance. */
    status = ProcMgr_open (&procMgrHandle, procId);
    if (status < 0) {
        Osal_printf ("Error in ProcMgr_open [0x%x]\n", status);
    }
    else {
        /* FIX ME: Add Proc reserve call */
        status = ProcMgr_map (procMgrHandle, (UInt32)mpuAddrList [0].mpuAddr,
                        (UInt32)mpuAddrList [0].size, mappedAddr, &mappedSize,
                        memType, procId);
         /* FIX ME: Add the table that keeps the C-D translations */
        if (status < 0) {
            Osal_printf ("Error in ProcMgr_map [0x%x]\n", status);
        }
        else {
            status = ProcMgr_close (&procMgrHandle);
        }
    }

    return status;
}
/*
 *  ======== RcmClientCleanup ========
 */
Int RcmClientCleanup (Int testCase)
{
    Int                  status             = 0;
    RcmClient_Message  * rcmMsg             = NULL;
    RcmClient_Message  * returnMsg          = NULL;
    UInt                 rcmMsgSize;
    RCM_Remote_FxnArgs * fxnExitArgs;
#if !defined(SYSLINK_USE_DAEMON)
    ProcMgr_StopParams   stopParams;
#endif

    Osal_printf ("\nRcmClientCleanup: Entering RcmClientCleanup()\n");

    /* Send terminate message */
    /* Allocate a remote command message */
    rcmMsgSize = sizeof(RCM_Remote_FxnArgs);
    status = RcmClient_alloc (rcmClientHandle, rcmMsgSize, &rcmMsg);
    if (status < 0) {
        Osal_printf ("RcmClientCleanup: Error allocating RCM message\n");
        goto exit;
    }

    /* Fill in the remote command message */
    rcmMsg->fxnIdx = fxnExitIdx;
    fxnExitArgs = (RCM_Remote_FxnArgs *)(&rcmMsg->data);
    fxnExitArgs->a = 0xFFFF;

#if !defined(SYSLINK_USE_DAEMON)
    /* Execute the remote command message */
    Osal_printf ("RcmClientCleanup: calling RcmClient_execDpc \n");
    status = RcmClient_execDpc (rcmClientHandle, rcmMsg, &returnMsg);
    if (status < 0) {
        Osal_printf ("RcmClientCleanup: RcmClient_execDpc error [0x%x]\n",
                        status);
        goto exit;
    }
#endif /* !defined(SYSLINK_USE_DAEMON) */

    /* Return message to the heap */
    Osal_printf ("RcmClientCleanup: Calling RcmClient_free \n");
    RcmClient_free (rcmClientHandle, returnMsg);

    /* Delete the rcm client */
    Osal_printf ("RcmClientCleanup: Delete RCM client instance \n");
    status = RcmClient_delete (&rcmClientHandle);
    if (status < 0)
        Osal_printf ("RcmClientCleanup: Error in RCM Client instance delete"
                     " [0x%x]\n", status);
    else
        Osal_printf ("RcmClientCleanup: RcmClient_delete status: [0x%x]\n",
                        status);

    /* Rcm client module destroy */
    Osal_printf ("RcmClientCleanup: Destroy RCM client module \n");
    RcmClient_exit ();

    /* Finalize modules */
#if !defined(SYSLINK_USE_DAEMON)    // Do not call ProcMgr_stop if using daemon
    status = MessageQ_unregisterHeap (RCM_MSGQ_HEAPID);
    if (status < 0)
        Osal_printf ("RcmClientCleanup: Error in MessageQ_unregisterHeap"
                     " [0x%x]\n", status);
    else
        Osal_printf ("RcmClientCleanup: MessageQ_unregisterHeap status:"
                     " [0x%x]\n", status);

    if (heapHandle) {
        status = HeapBufMP_delete (&heapHandle);
        if (status < 0)
            Osal_printf ("RcmClientCleanup: Error in HeapBufMP_delete [0x%x]\n",
                            status);
        else
            Osal_printf ("RcmClientCleanup: HeapBufMP_delete status: [0x%x]\n",
                            status);
    }

    if (heapBufPtr) {
        Memory_free (srHeap, heapBufPtr, heapSize);
    }

    stopParams.proc_id = remoteIdClient;
    if (testCase == 2) {
        status = ProcMgr_stop(procMgrHandleClient1, &stopParams);
        if (status < 0)
            Osal_printf ("RcmClientCleanup: Error in ProcMgr_stop [0x%x]\n",
                            status);
        else
            Osal_printf ("RcmClientCleanup: ProcMgr_stop status: [0x%x]\n",
                            status);
        stopParams.proc_id = MultiProc_getId (SYSM3_PROC_NAME);
    }

    status = ProcMgr_stop(procMgrHandleClient, &stopParams);
    if (status < 0)
        Osal_printf ("RcmClientCleanup: Error in ProcMgr_stop [0x%x]\n",
                        status);
    else
        Osal_printf ("RcmClientCleanup: ProcMgr_stop status: [0x%x]\n",
                        status);
#endif

    if (testCase == 2) {
        status =  ProcMgr_detach (procMgrHandleClient1);
        Osal_printf ("RcmClientCleanup: ProcMgr_detach status [0x%x]\n",
                        status);

        status = ProcMgr_close (&procMgrHandleClient1);
        if (status < 0)
            Osal_printf ("RcmClientCleanup: Error in ProcMgr_close [0x%x]\n",
                            status);
        else
            Osal_printf ("RcmClientCleanup: ProcMgr_close status: [0x%x]\n",
                            status);
    }

    status =  ProcMgr_detach (procMgrHandleClient);
    Osal_printf ("RcmClientCleanup: ProcMgr_detach status [0x%x]\n", status);

    status = ProcMgr_close (&procMgrHandleClient);
    if (status < 0)
        Osal_printf ("RcmClientCleanup: Error in ProcMgr_close [0x%x]\n",
                        status);
    else
        Osal_printf ("RcmClientCleanup: ProcMgr_close status: [0x%x]\n",
                        status);

    status = Ipc_destroy ();
    if (status < 0)
        Osal_printf("RcmClientCleanup: Error in Ipc_destroy [0x%x]\n", status);
    else
        Osal_printf("RcmClientCleanup: Ipc_destroy status: [0x%x]\n", status);

exit:
    Osal_printf ("RcmClientCleanup: Leaving RcmClientCleanup()\n");
    return status;
}
/*
 *  ======== ipc_setup ========
 */
	Int ipc_setup()
	{
		SysMgr_Config config;
		ProcMgr_StopParams stopParams;
		ProcMgr_StartParams start_params;
		ProcMgr_Handle procMgrHandle_server;
		UInt32 entry_point = 0;
		UInt16 remoteIdSysM3;
		UInt16 remoteIdAppM3;
		UInt32 shAddrBase;
		UInt32 shAddrBase1;
		UInt16 procId;
#if defined (SYSLINK_USE_LOADER)
		Char uProcId;
		UInt32 fileId;
#endif
		Int status = 0;
		Bool appM3Client = FALSE;

		  SysMgr_getConfig(&config);
		  status = SysMgr_setup(&config);
		if (status < 0)
		{
			printf("Error in SysMgr_setup [0x%x]\n", status);
			goto exit;
		}

		/* Get MultiProc IDs by name. */
		remoteIdSysM3 = MultiProc_getId(SYSM3_PROC_NAME);
		printf("MultiProc_getId remoteId: [0x%x]\n", remoteIdSysM3);
		remoteIdAppM3 = MultiProc_getId(APPM3_PROC_NAME);
		printf("MultiProc_getId remoteId: [0x%x]\n", remoteIdAppM3);
		procId = remoteIdSysM3;
		printf("MultiProc_getId procId: [0x%x]\n", procId);

		printf("RCM procId= %d\n", procId);
		/* Open a handle to the ProcMgr instance. */
		status = ProcMgr_open(&procMgrHandle_server, procId);
		if (status < 0)
		{
			printf("Error in ProcMgr_open [0x%x]\n", status);
			goto exit_sysmgr_destroy;
		} else
		{
			printf("ProcMgr_open status [0x%x]\n", status);
			/* Get the address of the shared region in kernel space. */
			status = ProcMgr_translateAddr(procMgrHandle_server,
			    (Ptr) & shAddrBase,
			    ProcMgr_AddrType_MasterUsrVirt,
			    (Ptr) SHAREDMEM, ProcMgr_AddrType_SlaveVirt);
			if (status < 0)
			{
				printf
				    ("Error in ProcMgr_translateAddr [0x%x]\n",
				    status);
				goto exit_procmgr_close;
			} else
			{
				printf
				    ("Virt address of shared address base #1:"
				    " [0x%x]\n", shAddrBase);
			}

			if (status >= 0)
			{
				/* Get the address of the shared region in kernel space. */
				status =
				    ProcMgr_translateAddr
				    (procMgrHandle_server,
				    (Ptr) & shAddrBase1,
				    ProcMgr_AddrType_MasterUsrVirt,
				    (Ptr) SHAREDMEM1,
				    ProcMgr_AddrType_SlaveVirt);
				if (status < 0)
				{
					printf
					    ("Error in ProcMgr_translateAddr [0x%x]\n",
					    status);
					goto exit_procmgr_close;
				} else
				{
					printf
					    ("Virt address of shared address base #2:"
					    " [0x%x]\n", shAddrBase1);
				}
			}
		}
		if (status >= 0)
		{
			/* Add the region to SharedRegion module. */
			status = SharedRegion_add(SHAREDMEMNUMBER,
			    (Ptr) shAddrBase, SHAREDMEMSIZE);
			if (status < 0)
			{
				printf("Error in SharedRegion_add [0x%x]\n",
				    status);
				goto exit_procmgr_close;
			}
		}

		if (status >= 0)
		{
			/* Add the region to SharedRegion module. */
			status = SharedRegion_add(SHAREDMEMNUMBER1,
			    (Ptr) shAddrBase1, SHAREDMEMSIZE1);
			if (status < 0)
			{
				printf("Error in SharedRegion_add1 [0x%x]\n",
				    status);
				goto exit_procmgr_close;
			}
		}

		printf("IPC setup completed successfully!\n");
		return 0;

	      exit_procmgr_close:
		status = ProcMgr_close(&procMgrHandle_server);
		if (status < 0)
		{
			printf("Error in ProcMgr_close: status = 0x%x\n",
			    status);
		}

	      exit_sysmgr_destroy:
		status = SysMgr_destroy();
		if (status < 0)
		{
			printf("Error in SysMgr_destroy: status = 0x%x\n",
			    status);
		}
	      exit:
		return (-1);
	}
Example #11
0
/*
 *  ======== ipcSetup ========
 */
static Int ipcSetup (Char * sysM3ImageName, Char * appM3ImageName)
{
    Ipc_Config                      config;
    ProcMgr_StopParams              stopParams;
    ProcMgr_StartParams             startParams;
    UInt32                          entryPoint = 0;
    UInt16                          procId;
    Int                             status = 0;
    ProcMgr_AttachParams            attachParams;
    ProcMgr_State                   state;
    HeapBufMP_Params                heapbufmpParams;
    Int                             i;
    UInt32                          srCount;
    SharedRegion_Entry              srEntry;

    if(appM3ImageName != NULL)
        appM3Client = TRUE;
    else
        appM3Client = FALSE;

    Ipc_getConfig (&config);
    status = Ipc_setup (&config);
    if (status < 0) {
        Osal_printf ("Error in Ipc_setup [0x%x]\n", status);
        goto exit;
    }

    /* Get MultiProc IDs by name. */
    remoteIdSysM3 = MultiProc_getId (SYSM3_PROC_NAME);
    Osal_printf ("MultiProc_getId remoteId: [0x%x]\n", remoteIdSysM3);
    remoteIdAppM3 = MultiProc_getId (APPM3_PROC_NAME);
    Osal_printf ("MultiProc_getId remoteId: [0x%x]\n", remoteIdAppM3);
    procId = remoteIdSysM3;
    Osal_printf ("MultiProc_getId procId: [0x%x]\n", procId);

    /* Temporary fix to account for a timing issue during recovery. */
    usleep(FAULT_RECOVERY_DELAY);

    printf("RCM procId= %d\n", procId);
    /* Open a handle to the ProcMgr instance. */
    status = ProcMgr_open (&procMgrHandleSysM3, procId);
    if (status < 0) {
        Osal_printf ("Error in ProcMgr_open [0x%x]\n", status);
        goto exit_ipc_destroy;
    }
    else {
        Osal_printf ("ProcMgr_open Status [0x%x]\n", status);
        ProcMgr_getAttachParams (NULL, &attachParams);
        /* Default params will be used if NULL is passed. */
        status = ProcMgr_attach (procMgrHandleSysM3, &attachParams);
        if (status < 0) {
            Osal_printf ("ProcMgr_attach failed [0x%x]\n", status);
        }
        else {
            Osal_printf ("ProcMgr_attach status: [0x%x]\n", status);
            state = ProcMgr_getState (procMgrHandleSysM3);
            Osal_printf ("After attach: ProcMgr_getState\n"
                         "    state [0x%x]\n", status);
        }
    }

    if (status >= 0 && appM3Client) {
        procId = remoteIdAppM3;
        Osal_printf ("MultiProc_getId procId: [0x%x]\n", procId);

        /* Open a handle to the ProcMgr instance. */
        status = ProcMgr_open (&procMgrHandleAppM3, procId);
        if (status < 0) {
            Osal_printf ("Error in ProcMgr_open [0x%x]\n", status);
            goto exit_ipc_destroy;
        }
        else {
            Osal_printf ("ProcMgr_open Status [0x%x]\n", status);
            ProcMgr_getAttachParams (NULL, &attachParams);
            /* Default params will be used if NULL is passed. */
            status = ProcMgr_attach (procMgrHandleAppM3, &attachParams);
            if (status < 0) {
                Osal_printf ("ProcMgr_attach failed [0x%x]\n", status);
            }
            else {
                Osal_printf ("ProcMgr_attach status: [0x%x]\n", status);
                state = ProcMgr_getState (procMgrHandleAppM3);
                Osal_printf ("After attach: ProcMgr_getState\n"
                             "    state [0x%x]\n", status);
            }
        }
    }

#if defined(SYSLINK_USE_LOADER)
    Osal_printf ("SysM3 Load: loading the SysM3 image %s\n",
                sysM3ImageName);

    status = ProcMgr_load (procMgrHandleSysM3, sysM3ImageName, 2,
                            &sysM3ImageName, &entryPoint, &fileIdSysM3,
                            remoteIdSysM3);
    if(status < 0) {
        Osal_printf ("Error in ProcMgr_load, status [0x%x]\n", status);
        goto exit_procmgr_close_sysm3;
    }
#endif
    startParams.proc_id = remoteIdSysM3;
    Osal_printf ("Starting ProcMgr for procID = %d\n", startParams.proc_id);
    status  = ProcMgr_start(procMgrHandleSysM3, entryPoint, &startParams);
    if(status < 0) {
        Osal_printf ("Error in ProcMgr_start, status [0x%x]\n", status);
        goto exit_procmgr_close_sysm3;
    }

    if(appM3Client) {
#if defined(SYSLINK_USE_LOADER)
        Osal_printf ("AppM3 Load: loading the AppM3 image %s\n",
                    appM3ImageName);
        status = ProcMgr_load (procMgrHandleAppM3, appM3ImageName, 2,
                              &appM3ImageName, &entryPoint, &fileIdAppM3,
                              remoteIdAppM3);
        if(status < 0) {
            Osal_printf ("Error in ProcMgr_load, status [0x%x]\n", status);
            goto exit_procmgr_stop_sysm3;
        }
#endif
        startParams.proc_id = remoteIdAppM3;
        Osal_printf ("Starting ProcMgr for procID = %d\n", startParams.proc_id);
        status  = ProcMgr_start(procMgrHandleAppM3, entryPoint,
                                &startParams);
        if(status < 0) {
            Osal_printf ("Error in ProcMgr_start, status [0x%x]\n", status);
            goto exit_procmgr_stop_sysm3;
        }
    }

    Osal_printf ("SysM3: Creating Ducati DMM pool of size 0x%x\n",
                DUCATI_DMM_POOL_0_SIZE);
    status = ProcMgr_createDMMPool (DUCATI_DMM_POOL_0_ID,
                                    DUCATI_DMM_POOL_0_START,
                                    DUCATI_DMM_POOL_0_SIZE,
                                    remoteIdSysM3);
    if(status < 0) {
        Osal_printf ("Error in ProcMgr_createDMMPool, status [0x%x]\n", status);
        goto exit_procmgr_stop_sysm3;
    }

    srCount = SharedRegion_getNumRegions();
    Osal_printf ("SharedRegion_getNumRegions = %d\n", srCount);
    for (i = 0; i < srCount; i++) {
        status = SharedRegion_getEntry (i, &srEntry);
        Osal_printf ("SharedRegion_entry #%d: base = 0x%x len = 0x%x "
                        "ownerProcId = %d isValid = %d cacheEnable = %d "
                        "cacheLineSize = 0x%x createHeap = %d name = %s\n",
                        i, srEntry.base, srEntry.len, srEntry.ownerProcId,
                        (Int)srEntry.isValid, (Int)srEntry.cacheEnable,
                        srEntry.cacheLineSize, (Int)srEntry.createHeap,
                        srEntry.name);
    }

    /* Create the heap to be used by RCM and register it with MessageQ */
    /* TODO: Do this dynamically by reading from the IPC config from the
     *       baseimage using Ipc_readConfig() */
    if (status >= 0) {
        HeapBufMP_Params_init (&heapbufmpParams);
        heapbufmpParams.sharedAddr = NULL;
        heapbufmpParams.align      = RCM_MSGQ_TILER_HEAP_ALIGN;
        heapbufmpParams.numBlocks  = RCM_MSGQ_TILER_HEAP_BLOCKS;
        heapbufmpParams.blockSize  = RCM_MSGQ_TILER_MSGSIZE;
        heapSize = HeapBufMP_sharedMemReq (&heapbufmpParams);
        Osal_printf ("heapSize = 0x%x\n", heapSize);

        srHeap = SharedRegion_getHeap (RCM_MSGQ_HEAP_SR);
        if (srHeap == NULL) {
            status = MEMORYOS_E_FAIL;
            Osal_printf ("SharedRegion_getHeap failed for srHeap:"
                         " [0x%x]\n", srHeap);
            goto exit_procmgr_stop_sysm3;
        }
        else {
            Osal_printf ("Before Memory_alloc = 0x%x\n", srHeap);
            heapBufPtr = Memory_alloc (srHeap, heapSize, 0);
            if (heapBufPtr == NULL) {
                status = MEMORYOS_E_MEMORY;
                Osal_printf ("Memory_alloc failed for ptr: [0x%x]\n",
                             heapBufPtr);
                goto exit_procmgr_stop_sysm3;
            }
            else {
                heapbufmpParams.name           = RCM_MSGQ_TILER_HEAPNAME;
                heapbufmpParams.sharedAddr     = heapBufPtr;
                Osal_printf ("Before HeapBufMP_Create: [0x%x]\n", heapBufPtr);
                heapHandle = HeapBufMP_create (&heapbufmpParams);
                if (heapHandle == NULL) {
                    status = HeapBufMP_E_FAIL;
                    Osal_printf ("HeapBufMP_create failed for Handle:"
                                 "[0x%x]\n", heapHandle);
                    goto exit_procmgr_stop_sysm3;
                }
                else {
                    /* Register this heap with MessageQ */
                    status = MessageQ_registerHeap (heapHandle,
                                                    RCM_MSGQ_TILER_HEAPID);
                    if (status < 0) {
                        Osal_printf ("MessageQ_registerHeap failed!\n");
                        goto exit_procmgr_stop_sysm3;
                    }
                }
            }
        }
    }

    if (status >= 0) {
        HeapBufMP_Params_init (&heapbufmpParams);
        heapbufmpParams.sharedAddr = NULL;
        heapbufmpParams.align      = RCM_MSGQ_DOMX_HEAP_ALIGN;
        heapbufmpParams.numBlocks  = RCM_MSGQ_DOMX_HEAP_BLOCKS;
        heapbufmpParams.blockSize  = RCM_MSGQ_DOMX_MSGSIZE;
        heapSize1 = HeapBufMP_sharedMemReq (&heapbufmpParams);
        Osal_printf ("heapSize1 = 0x%x\n", heapSize1);

        heapBufPtr1 = Memory_alloc (srHeap, heapSize1, 0);
        if (heapBufPtr1 == NULL) {
            status = MEMORYOS_E_MEMORY;
            Osal_printf ("Memory_alloc failed for ptr: [0x%x]\n",
                         heapBufPtr1);
            goto exit_procmgr_stop_sysm3;
        }
        else {
            heapbufmpParams.name           = RCM_MSGQ_DOMX_HEAPNAME;
            heapbufmpParams.sharedAddr     = heapBufPtr1;
            Osal_printf ("Before HeapBufMP_Create: [0x%x]\n", heapBufPtr1);
            heapHandle1 = HeapBufMP_create (&heapbufmpParams);
            if (heapHandle1 == NULL) {
                status = HeapBufMP_E_FAIL;
                Osal_printf ("HeapBufMP_create failed for Handle:"
                             "[0x%x]\n", heapHandle1);
                goto exit_procmgr_stop_sysm3;
            }
            else {
                /* Register this heap with MessageQ */
                status = MessageQ_registerHeap (heapHandle1,
                                                RCM_MSGQ_DOMX_HEAPID);
                if (status < 0) {
                    Osal_printf ("MessageQ_registerHeap failed!\n");
                    goto exit_procmgr_stop_sysm3;
                }
            }
        }
    }

    Osal_printf ("=== SysLink-IPC setup completed successfully!===\n");
    return 0;

exit_procmgr_stop_sysm3:
    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);
    }

exit_procmgr_close_sysm3:
    status = ProcMgr_close (&procMgrHandleSysM3);
    if (status < 0) {
        Osal_printf ("Error in ProcMgr_close: status = 0x%x\n", status);
    }
exit_ipc_destroy:
    status = Ipc_destroy ();
    if (status < 0) {
        Osal_printf ("Error in Ipc_destroy: status = 0x%x\n", status);
    }

exit:
    return (-1);
}
Example #12
0
/*
 *  ======== 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");
}
Example #13
0
/*
 *  ======== RcmServerCleanup ========
 */
Int RcmServerCleanup (Int testCase)
{
    Int                  status             = 0;
#if !defined(SYSLINK_USE_DAEMON)
    ProcMgr_StopParams   stopParams;
#endif

    Osal_printf ("\nRcmServerCleanup: Entering RcmServerCleanup()\n");
    /* Delete the rcm server */
    Osal_printf ("RcmServerCleanup: Delete RCM server instance \n");
    status = RcmServer_delete (&rcmServerHandle);
    if (status < 0)
        Osal_printf ("RcmServerCleanup: Error in RCM Server instance delete"
                    " [0x%x]\n", status);
    else
        Osal_printf ("RcmServerCleanup: RcmServer_delete status: [0x%x]\n",
                        status);

    /* Rcm server module destroy */
    Osal_printf ("RcmServerCleanup: Clean up RCM server module \n");
    RcmServer_exit ();

    /* Finalize modules */
#if !defined(SYSLINK_USE_DAEMON)    // Do not call ProcMgr_stop if using daemon
    status = MessageQ_unregisterHeap (RCM_MSGQ_HEAPID);
    if (status < 0)
        Osal_printf ("RcmServerCleanup: Error in MessageQ_unregisterHeap"
                     " [0x%x]\n", status);
    else
        Osal_printf ("RcmServerCleanup: MessageQ_unregisterHeap status:"
                     " [0x%x]\n", status);

    if (heapHandleServer) {
        status = HeapBufMP_delete (&heapHandleServer);
        if (status < 0)
            Osal_printf ("RcmServerCleanup: Error in HeapBufMP_delete [0x%x]\n",
                            status);
        else
            Osal_printf ("RcmServerCleanup: HeapBufMP_delete status: [0x%x]\n",
                            status);
    }

    if (heapBufPtrServer) {
        Memory_free (srHeapServer, heapBufPtrServer, heapSizeServer);
    }

    stopParams.proc_id = remoteIdServer;
    if (testCase == 2) {
        status = ProcMgr_stop (procMgrHandleServer1, &stopParams);
        if (status < 0)
            Osal_printf ("RcmServerCleanup: Error in ProcMgr_stop [0x%x]\n",
                            status);
        else
            Osal_printf ("RcmServerCleanup: ProcMgr_stop status: [0x%x]\n",
                            status);
        stopParams.proc_id = MultiProc_getId (SYSM3_PROC_NAME);
    }

    status = ProcMgr_stop (procMgrHandleServer, &stopParams);
    if (status < 0)
        Osal_printf ("RcmServerCleanup: Error in ProcMgr_stop [0x%x]\n",
                        status);
    else
        Osal_printf ("RcmServerCleanup: ProcMgr_stop status: [0x%x]\n",
                        status);
#endif

    if (testCase == 2) {
        status =  ProcMgr_detach (procMgrHandleServer1);
        Osal_printf ("RcmServerCleanup: ProcMgr_detach status [0x%x]\n",
                        status);

        status = ProcMgr_close (&procMgrHandleServer1);
        if (status < 0)
            Osal_printf ("RcmServerCleanup: Error in ProcMgr_close [0x%x]\n",
                            status);
        else
            Osal_printf ("RcmServerCleanup: ProcMgr_close status: [0x%x]\n",
                            status);
    }

    status =  ProcMgr_detach (procMgrHandleServer);
    Osal_printf ("RcmServerCleanup: ProcMgr_detach status [0x%x]\n", status);

    status = ProcMgr_close (&procMgrHandleServer);
    if (status < 0)
        Osal_printf ("RcmServerCleanup: Error in ProcMgr_close [0x%x]\n",
                        status);
    else
        Osal_printf ("RcmServerCleanup: ProcMgr_close status: [0x%x]\n",
                        status);

    status = Ipc_destroy ();
    if (status < 0)
        Osal_printf ("RcmServerCleanup: Error in Ipc_destroy [0x%x]\n", status);
    else
        Osal_printf ("RcmServerCleanup: Ipc_destroy status: [0x%x]\n", status);

    Osal_printf ("RcmServerCleanup: Leaving RcmServerCleanup()\n");
    return status;
}
/*
 *  ======== 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");
}
Example #15
0
/*!
 *  @brief  Function to execute the startup for ProcMgrApp sample application
 */
Int
ProcMgrApp_startup (UInt16 procId)
{
    Int                          status = 0;
    ProcMgr_Handle               handle = NULL;
    ProcMgr_AttachParams         attachParams;
    ProcMgr_State                state;
    UInt32 resetVector = 0x00800000;

    PRINTF ("Entered ProcMgrApp_startup\n");

    status = ProcMgr_open (&handle, procId);

    if (status >= 0) {
        ProcMgr_getAttachParams (NULL, &attachParams);
        /* Default params will be used if NULL is passed. */

        attachParams.bootMode = ProcMgr_BootMode_NoBoot;
        /* set the boot mode */
        status = ProcMgr_attach (handle, &attachParams);
        if (status < 0) {
        	PRINTF ("ProcMgr_attach failed [0x%x]\n", status);
        }
        else {
            PRINTF ("ProcMgr_attach status: [0x%x]\n", status);
            state = ProcMgr_getState (handle);
            PRINTF ("After attach: ProcMgr_getState\n"
                         "    state [0x%x]\n",
                         state);

			/* Call Ipc_control for ProcMgr_BootMode_NoLoad_Pwr, ProcMgr_BootMode_NoLoad_NoPwr
			   and ProcMgr_BootMode_NoBoot modes */
			status = Ipc_control (procId,
								  Ipc_CONTROLCMD_LOADCALLBACK,
								  (Ptr)&resetVector);

            if (status < 0) {
                PRINTF ("Error in Ipc_control "
                             "Ipc_CONTROLCMD_LOADCALLBACK [0x%x]\n",
                             status);
            }
            else {
                state = ProcMgr_getState (handle);
                PRINTF ("After Ipc_loadcallback: ProcMgr_getState\n"
                             "    state [0x%x]\n",
                             state);
            }
        }

        if (status >= 0) {

            status = Ipc_control (procId,
                                  Ipc_CONTROLCMD_STARTCALLBACK,
                                  NULL);
            if (status < 0) {
                PRINTF ("Error in Ipc_control "
                             "Ipc_CONTROLCMD_STARTCALLBACK[0x%x]\n",
                             status);
            }
            else {
                state = ProcMgr_getState (handle);
                PRINTF ("After Ipc_startcallback: ProcMgr_getState\n"
                             "    state [0x%x]\n",
                             state);
            }
        }

        status = ProcMgr_close (&handle);
        PRINTF ("ProcMgr_close status: [0x%x]\n", status);
    }

    PRINTF ("Leaving ProcMgrApp_startup\n");

    return 0;
}
Example #16
0
/*!
 *  @brief      This function implements the interrupt service routine for the
 *              interrupt received from the remote cores.
 *
 *  @param      refData       object to be handled in ISR
 *
 *  @sa         VirtQueue_cb
 */
static
Bool
VirtQueue_ISR (UInt32 msg, Void * arg)
{
    UInt32 procId = (UInt32)arg;
    ProcMgr_Handle handle = NULL;
    Int status = 0;

    GT_2trace (curTrace, GT_ENTER, "_VirtQueue_ISR", msg, arg);

        /* Interrupt clear is done by ArchIpcInt. */

        switch(msg) {
            case (UInt)RP_MBOX_ECHO_REPLY:
                Osal_printf ("Echo reply from %s",
                             MultiProc_getName(procId));
                break;

            case (UInt)RP_MBOX_CRASH:
                Osal_printf ("Crash notification for %s",
                             MultiProc_getName(procId));
                status = ProcMgr_open(&handle, procId);
                if (status >= 0) {
                    ProcMgr_setState(handle, ProcMgr_State_Error);
                    ProcMgr_close(&handle);
                }
                else {
                    Osal_printf("Failed to open ProcMgr handle");
                }
                break;

            case (UInt)RP_MBOX_BOOTINIT_DONE:
                Osal_printf ("Got BootInit done from %s",
                             MultiProc_getName(procId));
                // TODO: What to do with this message?
                break;

            case (UInt)RP_MBOX_HIBERNATION_ACK:
                Osal_printf ("Got Hibernation ACK from %s",
                             MultiProc_getName(procId));
                break;

            case (UInt)RP_MBOX_HIBERNATION_CANCEL:
                Osal_printf ("Got Hibernation CANCEL from %s",
                             MultiProc_getName(procId));
                break;

            default:
                /*
                 *  If the message isn't one of the above, it's a virtqueue
                 *  message
                 */
                if (msg%2 < NUM_QUEUES) {
                    /* This message is for us! */
                    VirtQueue_cb((void *)msg, queueRegistry[procId][msg%2]);
                }
            break;
        }

    return TRUE;
}