Hello,
I'm working on EVMK2H Rev40 on ARM core.
Trying to bring cppi & Qmss.
Fail while init Cppi_initDescriptor.
check numAllocated is 0.
It seems no desc is in Global queue.
My config is as below:
1. use nimu_cppi_qmss_iface.h for MACROs..
#define MAX_NUM_DESC (MAX_NUM_NIMU_DESC) /**< Maximum number of descriptors used by all the modules */
#define MAX_DESC_SIZE 128 /**< Maximum size of descriptor in bytes */
all of above macro is 128.
2. QMSS config
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");
}
3. NIMU_initQmss is NOT changed.
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;
UINT32 *puiDescBuffer;
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;
}
4. Q manager regs as below:
Q Manager config: 0
revision: 4e5d0105
divert: 00000000
link_ram_base0: 00100000
link_ram_size0: 00007fff
link_ram_base1: 00000000
link_ram_size1: 00000000
link_ram_base2: 00000000
starvation0: 00000000
starvation1: 00000000
Q Manager mem region: 0
base_addr: 82400000
start_idx: 00000000
desc_reg_size: 00070002
Q Manager mem region: 1
base_addr: 00000000
start_idx: 00000000
desc_reg_size: 00000000
Q Manager mem region: 2
base_addr: 00000000
start_idx: 00000000
desc_reg_size: 00000000
Q Manager mem region: 3
base_addr: 00000000
start_idx: 00000000
desc_reg_size: 00000000
Any advice for this issue?
Thanks!