使用EVMK2H Rev 40 pdk_k2hk_4_0_3 ndk_2_24_03_35
Cppi_initDescriptor之后,出错:
NIMU_initQmss: expected 128 descriptors to be initialized, only 0 are initialized
调试显示Global FDQ入队是描述符地址和数量正确,但出队无描述符。
以下是初始化代码
qmss_cfg.master_core = 1;
qmss_cfg.max_num_desc = MAX_NUM_DESC;
qmss_cfg.desc_size = MAX_DESC_SIZE;
qmss_cfg.mem_region = Qmss_MemRegion_MEMORY_REGION0;
if ((iRet = NIMU_initQmss(&qmss_cfg)) != 0) {
printk("Failed to initialize the QMSS subsystem \n");
return (PX_ERROR);
} else {
printk("QMSS successfully initialized \n");
}
int32_t
NIMU_initQmss
(
NIMU_QMSS_CFG_T *p_qmss_cfg
)
{
int32_t result;
Qmss_MemRegInfo memCfg;
Qmss_InitCfg qmssInitConfig;
Cppi_DescCfg cppiDescCfg;
uint32_t numAllocated;
if (p_qmss_cfg->master_core)
{
/* Initialize QMSS */
memset (&qmssInitConfig, 0, sizeof (Qmss_InitCfg));
/* Set up QMSS configuration */
/* Use internal linking RAM */
qmssInitConfig.linkingRAM0Base = 0;
qmssInitConfig.linkingRAM0Size = 0;
qmssInitConfig.linkingRAM1Base = 0x0;
qmssInitConfig.maxDescNum = p_qmss_cfg->max_num_desc;
qmssInitConfig.pdspFirmware[0].pdspId = Qmss_PdspId_PDSP1;
#ifdef _LITTLE_ENDIAN
qmssInitConfig.pdspFirmware[0].firmware = (void *) &acc48_le;
qmssInitConfig.pdspFirmware[0].size = sizeof (acc48_le);
#else
qmssInitConfig.pdspFirmware[0].firmware = (void *) &acc48_be;
qmssInitConfig.pdspFirmware[0].size = sizeof (acc48_be);
#endif
#if RM
if (rmServiceHandle)
qmssGblCfgParams.qmRmServiceHandle = rmServiceHandle;
#endif
/* Initialize the Queue Manager */
#if defined(DEVICE_K2H) || defined(DEVICE_K2K) || defined(DEVICE_K2L) || defined(DEVICE_K2E) || defined(DEVICE_C6678)
result = Qmss_init (&qmssInitConfig, &qmssGblCfgParams);
#else
result = Qmss_init (&qmssInitConfig, &qmssGblCfgParams[0]);
#endif
if (result != QMSS_SOK)
{
NIMU_testLog ("Error initializing Queue Manager SubSystem, Error code : %x\n", result);
return -1;
}
}
/* Start Queue manager on this core */
Qmss_start ();
/* Setup the descriptor memory regions.
*
* The Descriptor base addresses MUST be global addresses and
* all memory regions MUST be setup in ascending order of the
* descriptor base addresses.
*/
/* Initialize and setup CPSW Host Descriptors required for example */
memset (gHostDesc, 0, p_qmss_cfg->desc_size * p_qmss_cfg->max_num_desc);
memCfg.descBase = (uint32_t *) NIMU_convertCoreLocal2GlobalAddr ((uint32_t) gHostDesc);
memCfg.descSize = p_qmss_cfg->desc_size;
memCfg.descNum = p_qmss_cfg->max_num_desc;
memCfg.manageDescFlag = Qmss_ManageDesc_MANAGE_DESCRIPTOR;
memCfg.memRegion = p_qmss_cfg->mem_region;
memCfg.startIndex = 0;
/* Insert Host Descriptor memory region */
result = Qmss_insertMemoryRegion(&memCfg);
if (result == QMSS_MEMREGION_ALREADY_INITIALIZED)
{
NIMU_testLog ("Memory Region %d already Initialized \n", memCfg.memRegion);
}
else if (result < QMSS_SOK)
{
NIMU_testLog ("Error: Inserting memory region %d, Error code : %d\n", memCfg.memRegion, result);
return -1;
}
/* Initialize all the descriptors we just allocated on the
* memory region above. Setup the descriptors with some well
* known values before we use them for data transfers.
*/
memset (&cppiDescCfg, 0, sizeof (cppiDescCfg));
cppiDescCfg.memRegion = p_qmss_cfg->mem_region;
cppiDescCfg.descNum = p_qmss_cfg->max_num_desc;
cppiDescCfg.destQueueNum = QMSS_PARAM_NOT_SPECIFIED;
cppiDescCfg.queueType = Qmss_QueueType_GENERAL_PURPOSE_QUEUE;
cppiDescCfg.initDesc = Cppi_InitDesc_INIT_DESCRIPTOR;
cppiDescCfg.descType = Cppi_DescType_HOST;
/* By default:
* (1) Return descriptors to tail of queue
* (2) Always return entire packet to this free queue
* (3) Set that PS Data is always present in start of SOP buffer
* (4) Configure free q num < 4K, hence qMgr = 0
* (5) Recycle back to the same Free queue by default.
*/
cppiDescCfg.returnPushPolicy = Qmss_Location_TAIL;
cppiDescCfg.cfg.host.returnPolicy = Cppi_ReturnPolicy_RETURN_ENTIRE_PACKET;
cppiDescCfg.cfg.host.psLocation = Cppi_PSLoc_PS_IN_DESC;
cppiDescCfg.returnQueue.qMgr = 0;
cppiDescCfg.returnQueue.qNum = QMSS_PARAM_NOT_SPECIFIED;
cppiDescCfg.epibPresent = Cppi_EPIB_EPIB_PRESENT;
_DebugFormat (0x8, "%s() cppiDescCfg.descNum: %d \r\n", __func__, cppiDescCfg.descNum);
/* Initialize the descriptors, create a free queue and push descriptors to a global free queue */
if ((gGlobalFreeQHnd = Cppi_initDescriptor (&cppiDescCfg, &numAllocated)) <= 0)
{
NIMU_testLog ("Error Initializing Free Descriptors, Error: 0x%08x \n", gGlobalFreeQHnd);
return -1;
}
if (numAllocated != cppiDescCfg.descNum) {
printk ("function NIMU_initQmss: expected %d descriptors to be initialized, only %d are initialized\n", cppiDescCfg.descNum, numAllocated);
return (-1);
}
/* Queue Manager Initialization Done */
return 0;
}
电源配置已开启
INT iRet = -1;
iRet = ksnetDomainPowerUp(CSL_PSC_PD_NETCP, CSL_PSC_LPSC_PA);
if (iRet != ERROR_NONE) {
return (iRet);
}
iRet = ksnetDomainPowerUp(CSL_PSC_PD_NETCP, CSL_PSC_LPSC_CPGMAC);
if (iRet != ERROR_NONE) {
return (iRet);
}