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: Interrupt Request from MCU1_1 Failed on SDK8.6

Part Number: TDA4VM
Other Parts Discussed in Thread: SYSCONFIG

Hi Ti Experts,

Customer is running on TDA4VM SDK8.6 using SBL split mode.

Customer needs MAIN domain UART interrupt request from MCU1_1, but having the below error.

Customer has tried on SDK8.2 before, it does not have this problem.

May I know if the firewall in SDK8.6 has any restrictions on mcu1_1 for doing so?

Customer has also tried that not only the Main Uart interrupt but all the peripheral interrupt in the main domain could not be requested from MCU1_1. (requested from MCU1_0 is normal) 

Thanks a lot!

Kevin

  • Hi Kevin,

    Can you please share the code snippet showing how interrupts are being configured?

    Regards,
    Parth

  • We call BSP_UART_IrqInit() to config main_uartx interrupt to mcu1_1 domain.
    
    
    #ifdef BUILD_MCU1_0         /* MCU_R5FSS0_CORE0 */
    #define WKUP_UART_INT_NUM               CSLR_MCU_R5FSS0_CORE0_INTR_WKUP_UART0_USART_IRQ_0
    #define MCU_UART_INT_NUM                CSLR_MCU_R5FSS0_CORE0_INTR_MCU_UART0_USART_IRQ_0
    #define MAIN_UART_INT_OFFSET            (CSLR_MCU_R5FSS0_CORE0_INTR_MAIN2MCU_LVL_INTRTR0_OUTL_0 + BSP_UART_INT_NUM_START)
    #define MAIN_UART0_INT_NUM              (MAIN_UART_INT_OFFSET+0)
    #define MAIN_UART1_INT_NUM              (MAIN_UART_INT_OFFSET+1)
    #define MAIN_UART2_INT_NUM              (MAIN_UART_INT_OFFSET+2)
    #define MAIN_UART3_INT_NUM              (MAIN_UART_INT_OFFSET+3)
    #define MAIN_UART4_INT_NUM              (MAIN_UART_INT_OFFSET+4)
    #define MAIN_UART5_INT_NUM              (MAIN_UART_INT_OFFSET+5)
    #define MAIN_UART6_INT_NUM              (MAIN_UART_INT_OFFSET+6)
    #define MAIN_UART7_INT_NUM              (MAIN_UART_INT_OFFSET+7)
    #define MAIN_UART8_INT_NUM              (MAIN_UART_INT_OFFSET+8)
    #define MAIN_UART9_INT_NUM              (MAIN_UART_INT_OFFSET+9)
    #elif defined(BUILD_MCU1_1) /* MCU_R5FSS0_CORE1 */
    #define WKUP_UART_INT_NUM               CSLR_MCU_R5FSS0_CORE1_INTR_WKUP_UART0_USART_IRQ_0
    #define MCU_UART_INT_NUM                CSLR_MCU_R5FSS0_CORE1_INTR_MCU_UART0_USART_IRQ_0
    #define MAIN_UART_INT_OFFSET            (CSLR_MCU_R5FSS0_CORE1_INTR_MAIN2MCU_LVL_INTRTR0_OUTL_0 + BSP_UART_INT_NUM_START)
    #define MAIN_UART0_INT_NUM              (MAIN_UART_INT_OFFSET+0)
    #define MAIN_UART1_INT_NUM              (MAIN_UART_INT_OFFSET+1)
    #define MAIN_UART2_INT_NUM              (MAIN_UART_INT_OFFSET+2)
    #define MAIN_UART3_INT_NUM              (MAIN_UART_INT_OFFSET+3)//MAIN_UART_INT_OFFSET+3
    #define MAIN_UART4_INT_NUM              (MAIN_UART_INT_OFFSET+4)
    #define MAIN_UART5_INT_NUM              (MAIN_UART_INT_OFFSET+5)
    #define MAIN_UART6_INT_NUM              (MAIN_UART_INT_OFFSET+6)
    #define MAIN_UART7_INT_NUM              (MAIN_UART_INT_OFFSET+7)
    #define MAIN_UART8_INT_NUM              (MAIN_UART_INT_OFFSET+8)
    #define MAIN_UART9_INT_NUM              (MAIN_UART_INT_OFFSET+9)
    #endif
    
    int32_t BSP_Utils_RmIrqSet(uint16_t coreDevId,
                               uint16_t perId,
                               uint32_t perIdx,
                               uint32_t outputIdx)
    {
        int32_t retVal;
        struct tisci_msg_rm_irq_set_req rmIrqReq;
        struct tisci_msg_rm_irq_set_resp rmIrqResp;
    
        rmIrqReq.valid_params = TISCI_MSG_VALUE_RM_DST_ID_VALID;
        rmIrqReq.valid_params |= TISCI_MSG_VALUE_RM_DST_HOST_IRQ_VALID;
    
        rmIrqReq.global_event = 0U;
    
        rmIrqReq.src_id = perId;
        rmIrqReq.src_index = perIdx;
        rmIrqReq.dst_id = coreDevId;
        rmIrqReq.dst_host_irq = outputIdx;
    
        rmIrqReq.ia_id = 0U;
        rmIrqReq.vint = 0U;
        rmIrqReq.vint_status_bit_index = 0U;
        rmIrqReq.secondary_host = TISCI_MSG_VALUE_RM_UNUSED_SECONDARY_HOST;
    
        retVal = Sciclient_rmIrqSet(&rmIrqReq, &rmIrqResp, SCICLIENT_SERVICE_WAIT_FOREVER);
        if (CSL_PASS != retVal)
        {
            LOG_E("src_id:%d,src_index:%d,dst_id:%d,dst_host_irq:%d", rmIrqReq.src_id,rmIrqReq.src_index, rmIrqReq.dst_id, rmIrqReq.dst_host_irq);
            LOG_E("Sciclient_rmIrqSet error!ret:%d", retVal);
        }
        else
        {
            LOG_D("Sciclient_rmIrqSet configured,coreDevId:%d,perId:%d,perIdx:%d,coreIntNum:%d",
                  coreDevId, perId, perIdx, coreIntNum);
        }
        return retVal;
    }
    
    static int32_t BSP_UART_ConfigSocIntrPath(UART_Dev_t *dev, bool setIntrPath)
    {
        int32_t ret = 0;
    #if defined BUILD_MCU1_0 || defined BUILD_MCU1_1
        if (setIntrPath)
        {
            if (dev->port != MCU_UART0 && dev->port != WKUP_UART0)
            {
                ret = BSP_Utils_RmIrqSet(BSP_Utils_GetCoreId(),dev->sciDev,0,dev->intNum);
            }
        }
    #endif
        return ret;
    }
    
    static uint8_t BSP_UART_IrqInit(UART_Dev_t *dev)
    {
        int32_t configStatus = STW_SOK;
         configStatus = BSP_UART_ConfigSocIntrPath(dev, true);
        
         if(STW_SOK != configStatus)
         {
             LOG_E("%s config soc interrupt path failed!", dev->name);
             return 1;
         }
    
        configStatus = BSP_Utils_RegIntrInternal(&dev->hwi,
                                                dev->intNum, 
                                                UART_IrqHandler,
                                                BSP_UART_INT_PRIOROTY,
                                                OSAL_ARM_GIC_TRIG_TYPE_LEVEL,
                                                (uintptr_t)dev);
        if(STW_SOK != configStatus)
        {
            LOG_E("%s register interrupt failed!", dev->name);
            return 1;
        }
        return 0;
    }
    
    
    

  • Hi Jason,

    I don't see what interrupt number are you using. Can you please try getting the interrupt number as per the code below and try:

        struct tisci_msg_rm_irq_set_req     rmIrqReq;
        struct tisci_msg_rm_irq_set_resp    rmIrqResp;
        struct tisci_msg_rm_get_resource_range_resp res = {0};
        struct tisci_msg_rm_get_resource_range_req  req = {0};
    
        req.type = <Interrupt Router Device ID>;
        req.secondary_host = TISCI_MSG_VALUE_RM_UNUSED_SECONDARY_HOST;
        lSciRetVal  = Sciclient_rmGetResourceRange(&req,
                                              &res,
                                              SCICLIENT_SERVICE_WAIT_FOREVER);
        UART_printf("Sciclient_rmGetResourceRange retval = %d\n",lSciRetVal);
        
        lSciRetVal = Sciclient_rmIrqTranslateIrOutput(req.type,
                                                      res.range_start,
                                                      <Destination Core Device ID>,
                                                      &intNum);

    Regards,
    Parth

  • Hi Parth:

    For example, I want to use uart3 in mcu1_1, the interrupt number i using is MAIN_UART3_INT_NUM(163) which define above.

    In MCU1_0:

    We can use uart3 or other main domain peripheral in mcu1_0,the log is below:

    [9 0] D/mcu1_0.bsp.uart: mcu_uart0 open success,460800,interrupt mode,rxBufSize:4
    [17 0] D/mcu1_0.bsp.utils: src_id:280,src_index:0,dst_id:250,dst_host_irq:163
    [24 0] E/mcu1_0.bsp.utils: Sciclient_rmIrqTranslateIrOutput fail,retval:-2,req.type:280,res.range_start:0,dstId:250,dst_input:41025
    [38 0] D/mcu1_0.bsp.uart: main_uart3 open success,460800,dma mode,rxBufSize:4

    We call BSP_Utils_RmIrqSet() function to route main domain uart interrupt to mcu1_0.And you can see that the rmirqReq struct we fill in:src_id:280,src_index:0,dst_id:250,dst_host_irq:163

    rmIrqReq.src_id = perId;
    rmIrqReq.src_index = perIdx;
    rmIrqReq.dst_id = coreDevId;
    rmIrqReq.dst_host_irq = outputIdx;

    In MCU1_1:

    [5 0] D/mcu1_1.bsp.uart: mcu_uart0 open success,460800,interrupt mode,rxBufSize:4
    [13 0] E/mcu1_1.bsp.utils: src_id:280,src_index:0,dst_id:251,dst_host_irq:163
    [23 0] E/mcu1_1.bsp.utils: Sciclient_rmIrqSet error!ret:-1
    [30 0] E/mcu1_1.bsp.utils: Sciclient_rmIrqTranslateIrOutput fail,retval:-2,req.type:280,res.range_start:0,dstId:251,dst_input:0
    [45 0] E/mcu1_1.bsp.uart: main_uart3 config soc interrupt path failed!
    [53 0] E/mcu1_1.bsp.uart: main_uart3 open failed,460800,dma mode,rxBufSize:4

    We CAN NOT use uart3 or other main domain peripheral in mcu1_1,the log is below:

    You can see that the rmirqReq struct we fill in:src_id:280,src_index:0,dst_id:251,dst_host_irq:163

    src_id = TISCI_DEV_UART2
    
    src_index = 0
    
    dst_id = TISCI_DEV_MCU_R5FSS0_CORE1
    
    dst_host_irq = CSLR_MCU_R5FSS0_CORE1_INTR_MAIN2MCU_LVL_INTRTR0_OUTL_0 + 2

    I tried your code and write it as a function call BSP_Utils_RmIrqGet(), but you can see that it return error every time, the code is below:

    uint8_t BSP_Utils_RmIrqGet(uint32_t srcId,uint32_t dstId,uint16_t *intNum)
    {
        int32_t lSciRetVal;
        uint16_t _intNum;
        struct tisci_msg_rm_irq_set_req     rmIrqReq;
        struct tisci_msg_rm_irq_set_resp    rmIrqResp;
        struct tisci_msg_rm_get_resource_range_resp res = {0};
        struct tisci_msg_rm_get_resource_range_req  req = {0};
    
        req.type = srcId;
        req.secondary_host = TISCI_MSG_VALUE_RM_UNUSED_SECONDARY_HOST;
    
        lSciRetVal  = Sciclient_rmGetResourceRange(&req,
                                              &res,
                                              SCICLIENT_SERVICE_WAIT_FOREVER);
        if(lSciRetVal){
            LOG_E("Sciclient_rmGetResourceRange fail,retval = %d",lSciRetVal);
            return 1;
        }
    
        lSciRetVal = Sciclient_rmIrqTranslateIrOutput(req.type,
                                                      res.range_start,
                                                      dstId,
                                                      &_intNum);
        if(lSciRetVal){
            LOG_E("Sciclient_rmIrqTranslateIrOutput fail,retval:%d,req.type:%d,res.range_start:%d,dstId:%d,dst_input:%d",
                                                      lSciRetVal,
                                                      req.type,
                                                      res.range_start,
                                                      dstId,
                                                      _intNum);
            return 1;
        }
    
        *intNum = _intNum;
        LOG_I("srcId:%d,dstId:%d,intNum:%d",srcId,dstId,*intNum);
        return 0;
    }

    I have some question about how to route main domain interrupt:

    I am confused about the value that gave to dst_host_irq...In my understand, we can set an offset we want(0-32 or other larger after reconfig in sysconfig),and this value is an interrupt line which connect between mcu domain and main domain... am I right?

    What about the interrupt lines MAIN2MCU_LVL_INTROUTER means in spruil1c.pdf Figure 12-112. UART[3-9] Integration? when we have to use it?and how?

    What we actually do is: request resource from dmsc, dmsc connect interrupt line between UART2 to mcu1_1.am I right?

  • Hi Jason,

    I tried your code and write it as a function call BSP_Utils_RmIrqGet(), but you can see that it return error every time, the code is below:


    The res.type should be the device ID of the interrupt router used, in this case it should be the device ID of J721E_DEV_MAIN2MCU_LVL_INTRTR0 and not the UART3

    Main UART3 interrupt can be routed to MCU domain R5F i.e MCU1_0 and MCU1_1 via J721E_DEV_MAIN2MCU_LVL_INTRTR0. Sciclient_rmIrqSet API will take care of routing this interrupt if given proper parameters.

    Can you first please try with the suggestion of using interrupt router device ID as mentioned in the first comment and confirm if it is working properly, then I'll add the complete description.

    Regards,
    Parth

  • Hi Parth,

    Thanks a lot, it work after we change the wrong parameters, we use the follow code to route the interrupts

    uint32_t BSP_Irq_GetInterruptRouterId(uint32_t sciDevId)
    {
        uint32_t irId;
        /* Get the Interrupt Router ID for UART instance 3 to 9. */
        switch (sciDevId)
        {
            case TISCI_DEV_MCU_R5FSS0_CORE0:
            case TISCI_DEV_MCU_R5FSS0_CORE1:
                irId = TISCI_DEV_MAIN2MCU_LVL_INTRTR0;
                break;
            case TISCI_DEV_R5FSS0_CORE0:
            case TISCI_DEV_R5FSS0_CORE1:
                irId = TISCI_DEV_R5FSS0_INTROUTER0;
                break;
            case TISCI_DEV_R5FSS1_CORE0:
            case TISCI_DEV_R5FSS1_CORE1:
                irId = TISCI_DEV_R5FSS1_INTROUTER0;
                break;
            default:
                irId = 0;
                break;
        }
        return irId;
    }
    
    int32_t BSP_Irq_RegisterInterrupt(HwiP_Handle *hwiHandle, 
                                    uint32_t intNum, 
                                    void f(uintptr_t),
                                    uint32_t priority,
                                    uint32_t triggerSensitivity,
                                    uintptr_t arg)
    {
        int32_t configStatus = STW_SOK;
        OsalRegisterIntrParams_t    intrPrms;
        OsalInterruptRetCode_e      osalRetVal;
        Osal_RegisterInterrupt_initParams(&intrPrms);
        /* Populate the interrupt parameters */
        intrPrms.corepacConfig.arg              = (uintptr_t) arg;
        intrPrms.corepacConfig.isrRoutine       = f;
        intrPrms.corepacConfig.priority         = priority;
        intrPrms.corepacConfig.corepacEventNum  = 0U;
        intrPrms.corepacConfig.intVecNum        = intNum;
        intrPrms.corepacConfig.triggerSensitivity = triggerSensitivity;
        /* Register interrupts */
        osalRetVal = Osal_RegisterInterrupt(&intrPrms, hwiHandle);
        if(OSAL_INT_SUCCESS != osalRetVal)
        {
            configStatus = CSL_EFAIL;
        }
        return configStatus;
    }
    
    int32_t BSP_Irq_GetIrqRange(uint16_t ir_id, uint16_t dst_id, uint16_t *irq_range_start, uint16_t *irq_range_num)
    {
        int32_t         retVal = CSL_PASS;
        /* Get interrupt number range */
        uint16_t        irIntrIdx;
        struct tisci_msg_rm_get_resource_range_resp res = {0};
        struct tisci_msg_rm_get_resource_range_req  req = {0};
    
        req.type           = ir_id;
        req.subtype        = (uint8_t)TISCI_RESASG_SUBTYPE_IR_OUTPUT;
        req.secondary_host = (uint8_t)TISCI_MSG_VALUE_RM_UNUSED_SECONDARY_HOST;
    
        res.range_num = 0;
        res.range_start = 0;
        retVal =  Sciclient_rmGetResourceRange(
                    &req,
                    &res,
                    SCICLIENT_SERVICE_WAIT_FOREVER);
        if (CSL_PASS != retVal || res.range_num == 0) {
            /* Try with HOST_ID_ALL */
            req.type           = ir_id;
            req.subtype        = (uint8_t)TISCI_RESASG_SUBTYPE_IR_OUTPUT;
            req.secondary_host = TISCI_HOST_ID_ALL;
    
            retVal = Sciclient_rmGetResourceRange(
                    &req,
                    &res,
                    SCICLIENT_SERVICE_WAIT_FOREVER);
        }
        if ((CSL_PASS == retVal) && (res.range_num != 0))
        {
            *irq_range_num = res.range_num;
            /* Translate IR Idx to Core Interrupt Idx */
            irIntrIdx = res.range_start;
            retVal = Sciclient_rmIrqTranslateIrOutput(ir_id,
                                                      irIntrIdx,
                                                      dst_id,
                                                      irq_range_start);
                        
        }
        if (retVal == CSL_PASS)
        {
            retVal = 0;
        }
        else
        {
            retVal = 1;
        }
        return retVal;
    }
    
    int32_t BSP_Irq_ConfigInterruptRouter(uint16_t perId,uint32_t perIdx,uint32_t *intNum)
    {
        int32_t ret;
        uint16_t ir_id = 0U, irq_range_start = 0, irq_range_num = 0;
        uint16_t dst_id = 0;
        static uint32_t irqNum = 0;
    
        struct tisci_msg_rm_irq_set_req rmIrqReq;
        struct tisci_msg_rm_irq_set_resp rmIrqResp;
        (void)memset (&rmIrqReq, 0, sizeof(rmIrqReq));
        rmIrqReq.valid_params |= TISCI_MSG_VALUE_RM_DST_ID_VALID;
        rmIrqReq.valid_params |= TISCI_MSG_VALUE_RM_DST_HOST_IRQ_VALID;
    
        rmIrqReq.global_event = 0U;
    
        rmIrqReq.src_id = perId;
        rmIrqReq.src_index = perIdx;
        rmIrqReq.dst_id = BSP_Utils_GetSciDomain();
    
        rmIrqReq.ia_id = 0U;
        rmIrqReq.vint = 0U;
        rmIrqReq.vint_status_bit_index = 0U;
        rmIrqReq.secondary_host = TISCI_MSG_VALUE_RM_UNUSED_SECONDARY_HOST;
        
        dst_id = rmIrqReq.dst_id;
    
        #ifdef BUILD_MCU1_0
        ir_id = BSP_Irq_GetInterruptRouterId(TISCI_DEV_MCU_R5FSS0_CORE0);
        #elif defined BUILD_MCU1_1
        ir_id = BSP_Irq_GetInterruptRouterId(TISCI_DEV_MCU_R5FSS0_CORE1);
        #endif
    
        ret = BSP_Irq_GetIrqRange(ir_id,dst_id,&irq_range_start, &irq_range_num);
        if(ret)
        {
            LOG_E("BSP_Irq_GetIrqRange fail!");
        }
        
        if(irqNum<irq_range_num){
            rmIrqReq.dst_host_irq = irq_range_start+irqNum;
            irqNum++;
        }
        else{
            ret = 1;
            LOG_E("irq resource ran out!,max irqs:%d",irq_range_num);
            return ret;
        }
    
        ret = Sciclient_rmIrqSet(&rmIrqReq, &rmIrqResp, SCICLIENT_SERVICE_WAIT_FOREVER);
        if (CSL_PASS != ret)
        {
            LOG_E("irq_range_start:%d,irq_range_num:%d",irq_range_start,irq_range_num);
            LOG_E("src_id:%d,src_index:%d,dst_id:%d,dst_host_irq:%d",
                  rmIrqReq.src_id,rmIrqReq.src_index, rmIrqReq.dst_id, rmIrqReq.dst_host_irq);
            LOG_E("Sciclient_rmIrqSet error!ret:%d", ret);
        }
        else
        {
            // LOG_D("src_id:%d,src_index:%d,dst_id:%d,dst_host_irq:%d",
            //       rmIrqReq.src_id,rmIrqReq.src_index, rmIrqReq.dst_id, rmIrqReq.dst_host_irq);
        }
        *intNum = rmIrqReq.dst_host_irq;
        return ret;
    }