static inline int setup_region( uint32_t* descBase, int descSize, int descNum, int startIndex, RegionNumber descRegion ){ Qmss_MemRegInfo qmss_regionCfg; Qmss_Result qmss_result; memset(&qmss_regionCfg, 0, sizeof(qmss_regionCfg)); memset(descBase, 0, descSize*descNum); qmss_regionCfg.descBase = descBase; qmss_regionCfg.descSize = descSize; qmss_regionCfg.descNum = descNum; qmss_regionCfg.manageDescFlag = Qmss_ManageDesc_UNMANAGED_DESCRIPTOR; qmss_regionCfg.memRegion = (Qmss_MemRegion)descRegion; qmss_regionCfg.startIndex = startIndex; qmss_result = Qmss_insertMemoryRegion (&qmss_regionCfg); if (qmss_result != descRegion){ printf ("Error : Inserting Data memory region %d error code : %d\n", qmss_regionCfg.memRegion, qmss_result); abort(); } printf ("Data Memory region %d inserted\n", qmss_result); return 0; }
/** ============================================================================ * @n@b Init_Qmss * * @b Description * @n This API initializes the QMSS LLD. * * @param[in] * @n None * * @return Int32 * -1 - Error * 0 - Success * ============================================================================= */ Int32 Init_Qmss (Void) { Int32 result; Qmss_MemRegInfo memCfg; Qmss_MemRegInfo sriomemCfg; Qmss_InitCfg qmssInitConfig; Cppi_DescCfg cppiDescCfg; UInt32 numAllocated; /* 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 = NUM_SRIO_HOST_DESC+NUM_CPSW_HOST_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 /* Initialize the Queue Manager */ result = Qmss_init (&qmssInitConfig, qmssGblCfgParams); if (result != QMSS_SOK) { uart_write ("Error initializing Queue Manager SubSystem, Error code : %d\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, SIZE_CPSW_HOST_DESC * NUM_CPSW_HOST_DESC); memCfg.descBase = (UInt32 *) Convert_CoreLocal2GlobalAddr ((UInt32) gHostDesc); memCfg.descSize = SIZE_CPSW_HOST_DESC; memCfg.descNum = NUM_CPSW_HOST_DESC; memCfg.manageDescFlag = Qmss_ManageDesc_MANAGE_DESCRIPTOR; memCfg.memRegion = Qmss_MemRegion_MEMORY_REGION0; memCfg.startIndex = 0; /* Insert Host Descriptor memory region */ result = Qmss_insertMemoryRegion(&memCfg); if (result == QMSS_MEMREGION_ALREADY_INITIALIZED) { uart_write ("Memory Region %d already Initialized \n", memCfg.memRegion); } else if (result < QMSS_SOK) { uart_write ("Error: Inserting CPSW memory region %d, Error code : %d\n", memCfg.memRegion, result); return -1; } else uart_write ("Debug: Memory Region %d inserted :0x%x size of desc %d num of the desc %d\n",memCfg.memRegion,gHostDesc,SIZE_CPSW_HOST_DESC,NUM_CPSW_HOST_DESC); /* Initialize and setup SRIO Host Descriptors required for example */ memset (host_region, 0, SIZE_SRIO_HOST_DESC * NUM_SRIO_HOST_DESC); sriomemCfg.descBase = (UInt32 *) Convert_CoreLocal2GlobalAddr ((UInt32) host_region); sriomemCfg.descSize = SIZE_SRIO_HOST_DESC; sriomemCfg.descNum = NUM_SRIO_HOST_DESC; sriomemCfg.manageDescFlag = Qmss_ManageDesc_MANAGE_DESCRIPTOR; sriomemCfg.memRegion = Qmss_MemRegion_MEMORY_REGION1; sriomemCfg.startIndex = NUM_CPSW_HOST_DESC; /* Insert Host Descriptor memory region */ result = Qmss_insertMemoryRegion(&sriomemCfg); if (result == QMSS_MEMREGION_ALREADY_INITIALIZED) { uart_write ("Memory Region %d already Initialized \n", sriomemCfg.memRegion); } else if (result < QMSS_SOK) { uart_write ("Error: Inserting SRIO memory region %d, Error code : %d\n", sriomemCfg.memRegion, result); return -1; } else uart_write ("Debug:Memory Region %d inserted :0x%x size of desc %d num of the desc %d\n",sriomemCfg.memRegion,host_region,SIZE_SRIO_HOST_DESC,NUM_SRIO_HOST_DESC); /* 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 = Qmss_MemRegion_MEMORY_REGION0; cppiDescCfg.descNum = NUM_CPSW_HOST_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; /* Initialize the descriptors, create a free queue and push descriptors to a global free queue */ if ((gGlobalFreeQHnd = Cppi_initDescriptor (&cppiDescCfg, &numAllocated)) <= 0) { uart_write ("Error Initializing Free Descriptors, Error: %d \n", gGlobalFreeQHnd); return -1; } else uart_write("No of descriptors in CPSW global free queue %d \n",Qmss_getQueueEntryCount(gGlobalFreeQHnd)); /* Queue Manager Initialization Done */ return 0; }