PUBLIC void cm_SRV_deallocateTraceBufferMemory(t_nmf_core_id coreId)
{
    t_ee_state *state = cm_EEM_getExecutiveEngine(coreId);

    state->traceDataAddr = 0;
    cm_DM_Free(state->traceDataHandle, TRUE);
}
PUBLIC t_cm_error cm_SRV_allocateTraceBufferMemory(t_nmf_core_id coreId, t_cm_domain_id domainId)
{
    t_ee_state *state = cm_EEM_getExecutiveEngine(coreId);

    state->traceDataHandle = cm_DM_Alloc(domainId, SDRAM_EXT16,
                                         TRACE_BUFFER_SIZE * sizeof(struct t_nmf_trace) / 2, CM_MM_ALIGN_WORD, TRUE);
    if (state->traceDataHandle == INVALID_MEMORY_HANDLE)
        return CM_NO_MORE_MEMORY;
    else
    {
        t_uint32 mmdspAddr;
        int i;

        state->traceDataAddr = (struct t_nmf_trace*)cm_DSP_GetHostLogicalAddress(state->traceDataHandle);
        cm_DSP_GetDspAddress(state->traceDataHandle, &mmdspAddr);
        cm_writeAttribute(state->instance, "rtos/commonpart/traceDataAddr", mmdspAddr);

        eeState[coreId].readTracePointer = 0;
        eeState[coreId].lastReadedTraceRevision = 0;

        for(i = 0; i < TRACE_BUFFER_SIZE; i++)
            state->traceDataAddr[i].revision = 0;

        return CM_OK;
    }
}
static int param_set_osttrace_nb(const char *val, const struct kernel_param *kp)
{
	t_ee_state *state;
	int coreId, rv;
	u32 oldSize;

	for (coreId = FIRST_MPC_ID; coreId <= LAST_MPC_ID; coreId++) {
		state = cm_EEM_getExecutiveEngine(coreId);
		if (&(state->traceBufferSize) == kp->arg)
			break;
	}

	oldSize = state->traceBufferSize;
	rv = param_set_uint(val, kp);
	if (rv)
		return rv;

	if (CM_ENGINE_resizeTraceBuffer(coreId, oldSize) == CM_OK) {
		pr_info("[CM]: OST Trace buffer resizing done successfully "
			"for %s DSP\n", osalEnv.mpc[COREIDX(coreId)].name);
		return 0;
	} else {
		return -EINVAL;
	}
}
Exemple #4
0
t_cm_error cm_bindInterfaceToVoid(
        const t_interface_require_description *itfRequire) {
    LOG_INTERNAL(1, "\n##### Bind %s/%x.%s -> Void #####\n",
		 itfRequire->client->pathname, itfRequire->client, itfRequire->origName, 0, 0, 0);

    cm_bindLowLevelInterfaceToConst(itfRequire,
            cm_EEM_getExecutiveEngine(itfRequire->client->Template->dspId)->voidAddr,
            (t_component_instance*)NMF_VOID_COMPONENT);

    cm_TRC_traceBinding(TRACE_BIND_COMMAND_BIND_SYNCHRONOUS,
            itfRequire->client, NULL,
            itfRequire->client->Template->requires[itfRequire->requireIndex].name,
            NULL);

	return CM_OK;
}
Exemple #5
0
t_cm_error cm_unbindInterfaceStaticInterrupt(
        const t_nmf_core_id coreId,
        const int interruptLine
)
{
    char requiredItfClientName[CM_IT_NAME_MAX_LENGTH];
    t_component_instance *client = cm_EEM_getExecutiveEngine(coreId)->instance;
    t_interface_require_description itfRequire;
    t_cm_error error;

    //build it[%d] name
    if (interruptLine < 0 || interruptLine > 255) {return CM_OUT_OF_LIMITS;}
    cm_fillItName(interruptLine, requiredItfClientName);

    //do unbinding
    if ((error = cm_getRequiredInterface(client,requiredItfClientName,&itfRequire)) !=  CM_OK) {return error;}
    cm_unbindInterface(&itfRequire);

    return CM_OK;
}
PUBLIC EXPORT_SHARED t_cm_error CM_ReadMPCString(
        t_nmf_core_id               coreId,
        t_uint32                    dspAddress,
        char *                      buffer,
        t_uint32                    bufferSize) {

    while(--bufferSize > 0)
    {
        char ch = cm_DSP_ReadXRamWord(coreId, dspAddress++);
        if(ch == 0)
            break;

        *buffer++ = ch;
    };

    *buffer = 0;

    // Reset panicReason
    cm_writeAttribute(cm_EEM_getExecutiveEngine(coreId)->instance,
            "rtos/commonpart/serviceReason", MPC_SERVICE_NONE);

    return CM_OK;
}
PUBLIC EXPORT_SHARED t_cm_error CM_getServiceDescription(
        t_nmf_core_id               coreId,
        t_cm_service_type           *srcType,
        t_cm_service_description    *srcDescr)
{
    t_uint32 serviceReason;
    t_component_instance *ee;

    // Acknowledge interrupt (do it before resetting panicReason)
    cm_DSP_AcknowledgeDspIrq(coreId, DSP2ARM_IRQ_1);

    ee = cm_EEM_getExecutiveEngine(coreId)->instance;

    // Read panicReason
    serviceReason = cm_readAttributeNoError(ee, "rtos/commonpart/serviceReason");
    if(serviceReason == MPC_SERVICE_PRINT)
    {
        *srcType = CM_MPC_SERVICE_PRINT;

        srcDescr->u.print.dspAddress = cm_readAttributeNoError(ee, "rtos/commonpart/serviceInfo0");
        srcDescr->u.print.value1 = cm_readAttributeNoError(ee, "rtos/commonpart/serviceInfo1");
        srcDescr->u.print.value2 = cm_readAttributeNoError(ee, "rtos/commonpart/serviceInfo2");
    }
    else if(serviceReason != MPC_SERVICE_NONE)
    {
        t_uint32 panicThis;
        t_dup_char itfName;
        t_component_instance *instance;

        *srcType = CM_MPC_SERVICE_PANIC;
        srcDescr->u.panic.panicReason = (t_panic_reason)serviceReason;
        srcDescr->u.panic.panicSource = MPC_EE;
        srcDescr->u.panic.info.mpc.coreid = coreId;

        // Read panicThis
        panicThis = cm_readAttributeNoError(ee, "rtos/commonpart/serviceInfo0");

        instance = getCorrespondingInstance(srcDescr->u.panic.panicReason, panicThis, &itfName, &srcDescr->u.panic.info.mpc.faultingComponent);

        LOG_INTERNAL(0, "Error: Panic(%s, %s), This=%x", cm_getDspName(coreId),
                reason_descrs[srcDescr->u.panic.panicReason].name, (void*)panicThis, 0, 0, 0);

        if(reason_descrs[srcDescr->u.panic.panicReason].interface != 0)
        {
            LOG_INTERNAL(0, ", interface=%s", itfName, 0, 0, 0, 0, 0);
        }

        if(reason_descrs[srcDescr->u.panic.panicReason].info1 != 0)
        {
            // Info 1
            srcDescr->u.panic.info.mpc.panicInfo1 = cm_readAttributeNoError(ee, "rtos/commonpart/serviceInfo1");

            LOG_INTERNAL(0, ", Info=%x", srcDescr->u.panic.info.mpc.panicInfo1, 0, 0, 0, 0, 0);
        }

        if(reason_descrs[srcDescr->u.panic.panicReason].PC != 0)
        {
            t_uint32 DspAddress = 0xFFFFFFFF;
            t_uint32 DspSize = 0x0;

            // PC need to be read in rtos/commonpart/serviceInfo1
            srcDescr->u.panic.info.mpc.panicInfo1 = cm_readAttributeNoError(ee, "rtos/commonpart/serviceInfo1");

            if(instance != 0)
            {
                cm_DSP_GetDspAddress(instance->memories[instance->Template->codeMemory->id], &DspAddress);
                cm_DSP_GetDspMemoryHandleSize(instance->memories[instance->Template->codeMemory->id], &DspSize);
            }

            if(DspAddress <= srcDescr->u.panic.info.mpc.panicInfo1 &&
                    srcDescr->u.panic.info.mpc.panicInfo1 < (DspAddress + DspSize))
                LOG_INTERNAL(0, ", PC:off=%x <abs=%x>",
                        srcDescr->u.panic.info.mpc.panicInfo1 - DspAddress,
                        srcDescr->u.panic.info.mpc.panicInfo1, 0, 0, 0, 0);
            else
                LOG_INTERNAL(0, ", PC:<abs=%x>", srcDescr->u.panic.info.mpc.panicInfo1, 0, 0, 0, 0, 0);
        }

        if(reason_descrs[srcDescr->u.panic.panicReason].SP != 0)
        {
            srcDescr->u.panic.info.mpc.panicInfo2 = cm_readAttributeNoError(ee, "rtos/commonpart/serviceInfo2");

            LOG_INTERNAL(0, ", SP=%x", srcDescr->u.panic.info.mpc.panicInfo2, 0, 0, 0, 0, 0);
        }

        LOG_INTERNAL(0, "\n", 0, 0, 0, 0, 0, 0);

        if(instance != 0)
        {
            LOG_INTERNAL(0, "Error:  Component=%s<%s>\n",
                    instance->pathname, instance->Template->name, 0, 0, 0, 0);
        }

        // We don't set rtos/commonpart/serviceReason = MPC_SERVICE_NONE, since we don't want the
        // MMDSP to continue execution, and we put in in Panic state
        cm_DSP_SetStatePanic(coreId);
    }
    else
    {
        *srcType = CM_MPC_SERVICE_NONE;
    }

    return CM_OK;
}
PUBLIC EXPORT_SHARED t_cm_trace_type CM_ENGINE_GetNextTrace(
    t_nmf_core_id               coreId,
    struct t_nmf_trace          *trace)
{
    t_ee_state *state = cm_EEM_getExecutiveEngine(coreId);
    t_uint32 foundRevision;
    t_cm_trace_type type;

    OSAL_LOCK_API();
    if (state->traceDataAddr == NULL) {
        type = CM_MPC_TRACE_NONE;
        goto out;
    }

    foundRevision = swapHalfWord(state->traceDataAddr[state->readTracePointer].revision);

    if(foundRevision <= state->lastReadedTraceRevision)
    {
        // It's an old trace forgot it
        type = CM_MPC_TRACE_NONE;
    }
    else
    {
        struct t_nmf_trace          *traceRaw;

        if(foundRevision == state->lastReadedTraceRevision + 1)
        {
            type = CM_MPC_TRACE_READ;
        }
        else
        {
            type = CM_MPC_TRACE_READ_OVERRUN;
            /*
             * If we find that revision is bigger, thus we are in overrun, then we take the writePointer + 1 which
             * correspond to the older one.
             * => Here there is a window where the MMDSP could update writePointer just after
             */
            state->readTracePointer = (cm_readAttributeNoError(state->instance, "rtos/commonpart/writePointer") + 1) % TRACE_BUFFER_SIZE;
        }

        traceRaw = &state->traceDataAddr[state->readTracePointer];

        trace->timeStamp = swapHalfWord(traceRaw->timeStamp);
        trace->componentId = swapHalfWord(traceRaw->componentId);
        trace->traceId = swapHalfWord(traceRaw->traceId);
        trace->paramOpt = swapHalfWord(traceRaw->paramOpt);
        trace->componentHandle = swapHalfWord(traceRaw->componentHandle);
        trace->parentHandle = swapHalfWord(traceRaw->parentHandle);

        trace->params[0] = swapHalfWord(traceRaw->params[0]);
        trace->params[1] = swapHalfWord(traceRaw->params[1]);
        trace->params[2] = swapHalfWord(traceRaw->params[2]);
        trace->params[3] = swapHalfWord(traceRaw->params[3]);

        state->readTracePointer = (state->readTracePointer + 1) % TRACE_BUFFER_SIZE;
        state->lastReadedTraceRevision = swapHalfWord(traceRaw->revision);
        trace->revision = state->lastReadedTraceRevision;
    }

out:
    OSAL_UNLOCK_API();

    return type;
}