This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

TDA4VM: Disable cores for QNX IPC resource manager.

Part Number: TDA4VM

Hello,

I have an issue with the IPC resource manager. I have a test application that uses IPC to send/receive messages to/from MCU2_0 and MCU2_1. In vision apps, I have disabled IPC for all cores except MCU2_0, MCU2_1, and MPU1_0. For the QNX application, I only used cores MCU2_0 and MCU2_1. When calling the Ipc_mpSetConfig no error is returned, but in the System log, I can see the following.

# slog2info
Jan 01 00:02:44.356                tiipc_mgr.36880                 slog*    55  Ipc_mpSetConfig: supplied config doesn't match with existing config   

Jan 01 00:02:44.356                tiipc_mgr.36880                 slog     55  mp_config invalid

Jan 01 00:02:44.356   CtCdMiddlewareQM_PH00.319547                 slog*    55  Ipc_mpSetConfig failed: check your config is matching with resgmr     

I noticed that the return value in the user library is not setting an error code. Line 26 from the following code block

int32_t Ipc_mpSetConfig(uint32_t selfId, uint16_t numProc, uint32_t procArry[IPC_MAX_PROCS])
{
    int32_t        retVal = IPC_SOK;
    int32_t        fd = -1;
    uint16_t       i = 0;
    TIIPC_CmdArgs  cargs;

    fd = open(TIIPC_DEVICE_NAME, O_RDWR);
    if (fd >= 0) {
        cargs.args.mp_setconfig.selfId = selfId;
        cargs.args.mp_setconfig.numProc = numProc;
    for (i = 0; i < numProc; i++)
    {
        cargs.args.mp_setconfig.procArry[i] = procArry[i];
    }

        retVal = devctl(fd, DCMD_TIIPC_MPSETCONFIG, &cargs,
                        sizeof(TIIPC_CmdArgs), NULL);

        if (retVal != IPC_SOK)
    {
            ipc_slogerr("Ipc_mpSetConfig: devctl failed %d\n", retVal);
        }
    else if (cargs.status != IPC_SOK)
    {
        ipc_slogerr("Ipc_mpSetConfig failed: check your config is matching with resgmr\n");
    }
    else
        {
            retVal = _Ipc_mpSetConfig(selfId, cargs.args.mp_setconfig.selfName,
                                      numProc, procArry, cargs.args.mp_setconfig.names);
        }
        close(fd);
    }
    else {
        retVal = IPC_EFAIL;
    }
    return retVal;
}

Also, a question since I also took a look at some functions from the resource manager.

In the resource manager source, I have to modify the remoteProc list. Is there a different way to disable the other cores for mpSetConfig?

Regards,

Stefan

  • Hi Stefan,

    A couple of quick questions:

    1) Which PSDK QNX release is under test?

    2) Has a full "clean/scrub" been done to ensure all library / binaries and images have been rebuilt for IPC only on MCU2_0, MCU2_1, and MPU1_0, and all updated content copied to the target filesystem?

      If using vision_apps, below commands would confirm (2) the rebuild / re-install for an SPL SD Card boot setups.

    •   make sdk_clean;make sdk_scrub; make vision_apps_clean; make vision_apps_scrub;
    •   make sdk -j4
    •   make vision_apps -j4
    •  make qnx_fs_install_sd

    Regards,

    kb

  • Hi KB

    1) I'm using the QNX-J721E/07.02.00.04, but I also noticed that the function implementation I referenced is the same for QNX-J721E_07.03.00.02

    2) clean/scrub has been done all below commands have been executed. I have modified some paths for qnx_fs_install_sd (I have a qnx6 partition instead of rootfs and uboot is modified to load rtos bins from  a different path on the FAT32 partitition) but they are present and loaded during boot . I still see the error in the slog.

    Regards,

    Stefan

  • Hi Stefan,

    This is a bug, the user library should be returning the proper error code if the cargs.status is failed. The IPC stack has a notion of procId that needs to be the same on all the processors, so this initial check is performed to check the sanity of the procList for a given SoC. This list is fixed for a given SoC, and the proc id are used in underneath layers for retrieving/allocating various resources, looking up transport buffers etc.

    So, you would have to use the same list that matches the SoC configuration.

     regards

    Suman