예제 #1
0
파일: init_qmss.c 프로젝트: hewumars/Spider
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;
}