Signed-off-by: Marek Vasut <marex@denx.de> Cc: Bryan Hundven <bryanhundven@gmail.com> Cc: Michael Schwingen <rincewind@discworld.dascon.de> Cc: Wolfgang Denk <wd@denx.de> Cc: Albert Aribaud <albert.u.boot@aribaud.net> Cc: U-Boot DM <u-boot-dm@lists.denx.de> Cc: Joe Hershberger <joe.hershberger@ni.com>
234 lines
7.1 KiB
C
234 lines
7.1 KiB
C
/**
|
|
* @file IxQMgrInit.c
|
|
*
|
|
* @author Intel Corporation
|
|
* @date 30-Oct-2001
|
|
*
|
|
* @brief: Provided initialization of the QMgr component and its subcomponents.
|
|
*
|
|
*
|
|
* @par
|
|
* IXP400 SW Release version 2.0
|
|
*
|
|
* -- Copyright Notice --
|
|
*
|
|
* @par
|
|
* Copyright 2001-2005, Intel Corporation.
|
|
* All rights reserved.
|
|
*
|
|
* @par
|
|
* Redistribution and use in source and binary forms, with or without
|
|
* modification, are permitted provided that the following conditions
|
|
* are met:
|
|
* 1. Redistributions of source code must retain the above copyright
|
|
* notice, this list of conditions and the following disclaimer.
|
|
* 2. Redistributions in binary form must reproduce the above copyright
|
|
* notice, this list of conditions and the following disclaimer in the
|
|
* documentation and/or other materials provided with the distribution.
|
|
* 3. Neither the name of the Intel Corporation nor the names of its contributors
|
|
* may be used to endorse or promote products derived from this software
|
|
* without specific prior written permission.
|
|
*
|
|
* @par
|
|
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ``AS IS''
|
|
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
|
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
|
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE
|
|
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
|
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
|
|
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
|
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
|
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
|
|
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
|
* SUCH DAMAGE.
|
|
*
|
|
* @par
|
|
* -- End of Copyright Notice --
|
|
*/
|
|
|
|
/*
|
|
* System defined include files.
|
|
*/
|
|
|
|
/*
|
|
* User defined include files.
|
|
*/
|
|
#include "IxOsal.h"
|
|
#include "IxQMgr.h"
|
|
#include "IxQMgrQCfg_p.h"
|
|
#include "IxQMgrDispatcher_p.h"
|
|
#include "IxQMgrLog_p.h"
|
|
#include "IxQMgrQAccess_p.h"
|
|
#include "IxQMgrDefines_p.h"
|
|
#include "IxQMgrAqmIf_p.h"
|
|
|
|
/*
|
|
* Set to true if initialized
|
|
* N.B. global so integration/unit tests can reinitialize
|
|
*/
|
|
BOOL qMgrIsInitialized = FALSE;
|
|
|
|
/*
|
|
* Function definitions.
|
|
*/
|
|
IX_STATUS
|
|
ixQMgrInit (void)
|
|
{
|
|
if (qMgrIsInitialized)
|
|
{
|
|
IX_QMGR_LOG0("ixQMgrInit: IxQMgr already initialised\n");
|
|
return IX_FAIL;
|
|
}
|
|
|
|
/* Initialise the QCfg component */
|
|
ixQMgrQCfgInit ();
|
|
|
|
/* Initialise the Dispatcher component */
|
|
ixQMgrDispatcherInit ();
|
|
|
|
/* Initialise the Access component */
|
|
ixQMgrQAccessInit ();
|
|
|
|
/* Initialization complete */
|
|
qMgrIsInitialized = TRUE;
|
|
|
|
return IX_SUCCESS;
|
|
}
|
|
|
|
IX_STATUS
|
|
ixQMgrUnload (void)
|
|
{
|
|
if (!qMgrIsInitialized)
|
|
{
|
|
return IX_FAIL;
|
|
}
|
|
|
|
/* Uninitialise the QCfg component */
|
|
ixQMgrQCfgUninit ();
|
|
|
|
/* Uninitialization complete */
|
|
qMgrIsInitialized = FALSE;
|
|
|
|
return IX_SUCCESS;
|
|
}
|
|
|
|
void
|
|
ixQMgrShow (void)
|
|
{
|
|
IxQMgrQCfgStats *qCfgStats = NULL;
|
|
IxQMgrDispatcherStats *dispatcherStats = NULL;
|
|
int i;
|
|
UINT32 lowIntRegRead, upIntRegRead;
|
|
|
|
qCfgStats = ixQMgrQCfgStatsGet ();
|
|
dispatcherStats = ixQMgrDispatcherStatsGet ();
|
|
ixQMgrAqmIfQInterruptRegRead (IX_QMGR_QUELOW_GROUP, &lowIntRegRead);
|
|
ixQMgrAqmIfQInterruptRegRead (IX_QMGR_QUEUPP_GROUP, &upIntRegRead);
|
|
printf("Generic Stats........\n");
|
|
printf("=====================\n");
|
|
printf("Loop Run Count..........%u\n",dispatcherStats->loopRunCnt);
|
|
printf("Watermark set count.....%d\n", qCfgStats->wmSetCnt);
|
|
printf("===========================================\n");
|
|
printf("On the fly Interrupt Register Stats........\n");
|
|
printf("===========================================\n");
|
|
printf("Lower Interrupt Register............0x%08x\n",lowIntRegRead);
|
|
printf("Upper Interrupt Register............0x%08x\n",upIntRegRead);
|
|
printf("==============================================\n");
|
|
printf("Queue Specific Stats........\n");
|
|
printf("============================\n");
|
|
|
|
for (i=0; i<IX_QMGR_MAX_NUM_QUEUES; i++)
|
|
{
|
|
if (ixQMgrQIsConfigured(i))
|
|
{
|
|
ixQMgrQShow(i);
|
|
}
|
|
}
|
|
|
|
printf("============================\n");
|
|
}
|
|
|
|
IX_STATUS
|
|
ixQMgrQShow (IxQMgrQId qId)
|
|
{
|
|
IxQMgrQCfgStats *qCfgStats = NULL;
|
|
IxQMgrDispatcherStats *dispatcherStats = NULL;
|
|
|
|
if (!ixQMgrQIsConfigured(qId))
|
|
{
|
|
return IX_QMGR_Q_NOT_CONFIGURED;
|
|
}
|
|
|
|
dispatcherStats = ixQMgrDispatcherStatsGet ();
|
|
qCfgStats = ixQMgrQCfgQStatsGet (qId);
|
|
|
|
printf("QId %d\n", qId);
|
|
printf("======\n");
|
|
printf(" IxQMgrQCfg Stats\n");
|
|
printf(" Name..................... \"%s\"\n", qCfgStats->qStats[qId].qName);
|
|
printf(" Size in words............ %u\n", qCfgStats->qStats[qId].qSizeInWords);
|
|
printf(" Entry size in words...... %u\n", qCfgStats->qStats[qId].qEntrySizeInWords);
|
|
printf(" Nearly empty watermark... %u\n", qCfgStats->qStats[qId].ne);
|
|
printf(" Nearly full watermark.... %u\n", qCfgStats->qStats[qId].nf);
|
|
printf(" Number of full entries... %u\n", qCfgStats->qStats[qId].numEntries);
|
|
printf(" Sram base address........ 0x%X\n", qCfgStats->qStats[qId].baseAddress);
|
|
printf(" Read pointer............. 0x%X\n", qCfgStats->qStats[qId].readPtr);
|
|
printf(" Write pointer............ 0x%X\n", qCfgStats->qStats[qId].writePtr);
|
|
|
|
#ifndef NDEBUG
|
|
if (dispatcherStats->queueStats[qId].notificationEnabled)
|
|
{
|
|
char *localEvent = "none ????";
|
|
switch (dispatcherStats->queueStats[qId].srcSel)
|
|
{
|
|
case IX_QMGR_Q_SOURCE_ID_E:
|
|
localEvent = "Empty";
|
|
break;
|
|
case IX_QMGR_Q_SOURCE_ID_NE:
|
|
localEvent = "Nearly Empty";
|
|
break;
|
|
case IX_QMGR_Q_SOURCE_ID_NF:
|
|
localEvent = "Nearly Full";
|
|
break;
|
|
case IX_QMGR_Q_SOURCE_ID_F:
|
|
localEvent = "Full";
|
|
break;
|
|
case IX_QMGR_Q_SOURCE_ID_NOT_E:
|
|
localEvent = "Not Empty";
|
|
break;
|
|
case IX_QMGR_Q_SOURCE_ID_NOT_NE:
|
|
localEvent = "Not Nearly Empty";
|
|
break;
|
|
case IX_QMGR_Q_SOURCE_ID_NOT_NF:
|
|
localEvent = "Not Nearly Full";
|
|
break;
|
|
case IX_QMGR_Q_SOURCE_ID_NOT_F:
|
|
localEvent = "Not Full";
|
|
break;
|
|
default :
|
|
break;
|
|
}
|
|
printf(" Notifications localEvent...... %s\n", localEvent);
|
|
}
|
|
else
|
|
{
|
|
printf(" Notifications............ not enabled\n");
|
|
}
|
|
printf(" IxQMgrDispatcher Stats\n");
|
|
printf(" Callback count................%d\n",
|
|
dispatcherStats->queueStats[qId].callbackCnt);
|
|
printf(" Priority change count.........%d\n",
|
|
dispatcherStats->queueStats[qId].priorityChangeCnt);
|
|
printf(" Interrupt no callback count...%d\n",
|
|
dispatcherStats->queueStats[qId].intNoCallbackCnt);
|
|
printf(" Interrupt lost callback count...%d\n",
|
|
dispatcherStats->queueStats[qId].intLostCallbackCnt);
|
|
#endif
|
|
|
|
return IX_SUCCESS;
|
|
}
|
|
|
|
|
|
|
|
|