/*******************************************************************************
Copyright (C) Marvell International Ltd. and its affiliates

This software file (the "File") is owned and distributed by Marvell
International Ltd. and/or its affiliates ("Marvell") under the following
alternative licensing terms.  Once you have made an election to distribute the
File under one of the following license alternatives, please (i) delete this
introductory statement regarding license alternatives, (ii) delete the two
license alternatives that you have not elected to use and (iii) preserve the
Marvell copyright notice above.

********************************************************************************
Marvell Commercial License Option

If you received this File from Marvell and you have entered into a commercial
license agreement (a "Commercial License") with Marvell, the File is licensed
to you under the terms of the applicable Commercial License.

********************************************************************************
Marvell GPL License Option

If you received this File from Marvell, you may opt to use, redistribute and/or
modify this File in accordance with the terms and conditions of the General
Public License Version 2, June 1991 (the "GPL License"), a copy of which is
available along with the File in the license.txt file or by writing to the Free
Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 or
on the worldwide web at http://www.gnu.org/licenses/gpl.txt.

THE FILE IS DISTRIBUTED AS-IS, WITHOUT WARRANTY OF ANY KIND, AND THE IMPLIED
WARRANTIES OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE ARE EXPRESSLY
DISCLAIMED.  The GPL License provides additional details about this warranty
disclaimer.
********************************************************************************
Marvell BSD License Option

If you received this File from Marvell, you may opt to use, redistribute and/or
modify this File under the following licensing terms.
Redistribution and use in source and binary forms, with or without modification,
are permitted provided that the following conditions are met:

    *   Redistributions of source code must retain the above copyright notice,
		this list of conditions and the following disclaimer.

    *   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.

    *   Neither the name of Marvell nor the names of its contributors may be
		used to endorse or promote products derived from this software without
		specific prior written permission.

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.

*******************************************************************************/

#include "mvCommon.h"
#include "mvOs.h"
#include "mvDebug.h"

#ifdef CONFIG_OF
#include "cesa_if.h"
#include "mvMD5.h"
#include "mvSHA1.h"
#include "mvSHA256.h"
#include "mvCesaRegs.h"
#include "mvCesa.h"
#include "AES/mvAes.h"
#else
#include "cesa/mvMD5.h"
#include "cesa/mvSHA1.h"
#include "cesa/mvSHA256.h"
#include "cesa/mvCesaRegs.h"
#include "cesa/mvCesa.h"
#include "cesa/AES/mvAes.h"
#endif /* CONFIG_OF */

#define MV_CESA_VERSION		3

static const char *mvCesaDebugStateStr(MV_CESA_STATE state)
{
	switch (state) {
	case MV_CESA_IDLE:
		return "Idle";

	case MV_CESA_PENDING:
		return "Pend";

	case MV_CESA_PROCESS:
		return "Proc";

	case MV_CESA_READY:
		return "Ready";

	default:
		break;
	}
	return "Unknown";
}

static const char *mvCesaDebugOperStr(MV_CESA_OPERATION oper)
{
	switch (oper) {
	case MV_CESA_MAC_ONLY:
		return "MacOnly";

	case MV_CESA_CRYPTO_ONLY:
		return "CryptoOnly";

	case MV_CESA_MAC_THEN_CRYPTO:
		return "MacCrypto";

	case MV_CESA_CRYPTO_THEN_MAC:
		return "CryptoMac";

	default:
		break;
	}
	return "Null";
}

static const char *mvCesaDebugCryptoAlgStr(MV_CESA_CRYPTO_ALG cryptoAlg)
{
	switch (cryptoAlg) {
	case MV_CESA_CRYPTO_DES:
		return "DES";

	case MV_CESA_CRYPTO_3DES:
		return "3DES";

	case MV_CESA_CRYPTO_AES:
		return "AES";

	default:
		break;
	}
	return "Null";
}

static const char *mvCesaDebugMacModeStr(MV_CESA_MAC_MODE macMode)
{
	switch (macMode) {
	case MV_CESA_MAC_MD5:
		return "MD5";

	case MV_CESA_MAC_SHA1:
		return "SHA1";

	case MV_CESA_MAC_SHA2:
		return "SHA2";

	case MV_CESA_MAC_HMAC_MD5:
		return "HMAC-MD5";

	case MV_CESA_MAC_HMAC_SHA1:
		return "HMAC_SHA1";

	case MV_CESA_MAC_HMAC_SHA2:
		return "HMAC_SHA2";

	default:
		break;
	}
	return "Null";
}

void mvCesaDebugCmd(MV_CESA_COMMAND *pCmd, int mode)
{
	mvOsPrintf("pCmd=%p, pReqPrv=%p, pSrc=%p, pDst=%p, pCB=%p, sid=%d\n",
		   pCmd, pCmd->pReqPrv, pCmd->pSrc, pCmd->pDst, pCmd->pFuncCB, pCmd->sessionId);
	mvOsPrintf("isUser=%d, ivOffs=%d, crOffs=%d, crLen=%d, digest=%d, macOffs=%d, macLen=%d\n",
		   pCmd->ivFromUser, pCmd->ivOffset, pCmd->cryptoOffset, pCmd->cryptoLength,
		   pCmd->digestOffset, pCmd->macOffset, pCmd->macLength);
}

/* no need to use in tool */
void mvCesaDebugMbuf(const char *str, MV_CESA_MBUF *pMbuf, int offset, int size)
{
	int frag, len, fragOffset;

	if (str != NULL)
		mvOsPrintf("%s: pMbuf=%p, numFrags=%d, mbufSize=%d\n", str, pMbuf, pMbuf->numFrags, pMbuf->mbufSize);

	frag = mvCesaMbufOffset(pMbuf, offset, &fragOffset);
	if (frag == MV_INVALID) {
		mvOsPrintf("CESA Mbuf Error: offset (%d) out of range\n", offset);
		return;
	}

	for (; frag < pMbuf->numFrags; frag++) {
		mvOsPrintf("#%2d. bufVirt=%p, bufSize=%d\n",
			   frag, pMbuf->pFrags[frag].bufVirtPtr, pMbuf->pFrags[frag].bufSize);
		if (size > 0) {
			len = MV_MIN(pMbuf->pFrags[frag].bufSize, size);
#ifdef CONFIG_OF
			mv_debug_mem_dump(pMbuf->pFrags[frag].bufVirtPtr + fragOffset, len, 1);
#else
			mvDebugMemDump(pMbuf->pFrags[frag].bufVirtPtr + fragOffset, len, 1);
#endif
			size -= len;
			fragOffset = 0;
		}
	}
}

void mvCesaDebugRegs(void)
{
	MV_U8 chan = 0;
	MV_U8 i = 0;

	mvOsPrintf("\t CESA Registers:\n");

#ifdef CONFIG_OF
	for (chan = 0; chan < mv_cesa_channels; chan++) {
#else
	for (chan = 0; chan < MV_CESA_CHANNELS; chan++) {
#endif
		mvOsPrintf("\n\nChannel %d:\n", chan);
		mvOsPrintf("===========\n");
		mvOsPrintf("MV_CESA_CMD_REG                     : 0x%X = 0x%08x\n",
			MV_CESA_CMD_REG(chan), MV_REG_READ(MV_CESA_CMD_REG(chan)));

		mvOsPrintf("MV_CESA_CHAN_DESC_OFFSET_REG        : 0x%X = 0x%08x\n",
			MV_CESA_CHAN_DESC_OFFSET_REG(chan), MV_REG_READ(MV_CESA_CHAN_DESC_OFFSET_REG(chan)));

		mvOsPrintf("MV_CESA_CFG_REG                     : 0x%X = 0x%08x\n",
			MV_CESA_CFG_REG(chan), MV_REG_READ(MV_CESA_CFG_REG(chan)));

		mvOsPrintf("MV_CESA_STATUS_REG                  : 0x%X = 0x%08x\n",
			MV_CESA_STATUS_REG(chan), MV_REG_READ(MV_CESA_STATUS_REG(chan)));

		mvOsPrintf("MV_CESA_ISR_CAUSE_REG               : 0x%X = 0x%08x\n",
			MV_CESA_ISR_CAUSE_REG(chan), MV_REG_READ(MV_CESA_ISR_CAUSE_REG(chan)));

		mvOsPrintf("MV_CESA_ISR_MASK_REG                : 0x%X = 0x%08x\n",
			MV_CESA_ISR_MASK_REG(chan), MV_REG_READ(MV_CESA_ISR_MASK_REG(chan)));
#if defined(MV_CESA_INT_COALESCING_SUPPORT) || defined(CONFIG_OF)
#ifdef CONFIG_OF
		if (mv_cesa_feature == INT_COALESCING) {
#endif /* CONFIG_OF */
			mvOsPrintf("%s\t: 0x%X = 0x%08x\n",
			    "MV_CESA_INT_COAL_TH_REG",
			    MV_CESA_INT_COAL_TH_REG(chan),
			    MV_REG_READ(MV_CESA_INT_COAL_TH_REG(chan)));
			mvOsPrintf("%s\t: 0x%X = 0x%08x\n",
			    "MV_CESA_INT_TIME_TH_REG",
			    MV_CESA_INT_TIME_TH_REG(chan),
			    MV_REG_READ(MV_CESA_INT_TIME_TH_REG(chan)));
#ifdef CONFIG_OF
		}
#endif /* CONFIG_OF */
#endif /* MV_CESA_INT_COALESCING_SUPPORT || CONFIG_OF */
#if (MV_CESA_VERSION >= 2)
		mvOsPrintf("MV_CESA_TDMA_CTRL_REG               : 0x%X = 0x%08x\n",
			MV_CESA_TDMA_CTRL_REG(chan), MV_REG_READ(MV_CESA_TDMA_CTRL_REG(chan)));

		mvOsPrintf("MV_CESA_TDMA_BYTE_COUNT_REG         : 0x%X = 0x%08x\n",
			MV_CESA_TDMA_BYTE_COUNT_REG(chan), MV_REG_READ(MV_CESA_TDMA_BYTE_COUNT_REG(chan)));

		mvOsPrintf("MV_CESA_TDMA_SRC_ADDR_REG           : 0x%X = 0x%08x\n",
			MV_CESA_TDMA_SRC_ADDR_REG(chan), MV_REG_READ(MV_CESA_TDMA_SRC_ADDR_REG(chan)));

		mvOsPrintf("MV_CESA_TDMA_DST_ADDR_REG           : 0x%X = 0x%08x\n",
			MV_CESA_TDMA_DST_ADDR_REG(chan), MV_REG_READ(MV_CESA_TDMA_DST_ADDR_REG(chan)));

		mvOsPrintf("MV_CESA_TDMA_NEXT_DESC_PTR_REG      : 0x%X = 0x%08x\n",
			MV_CESA_TDMA_NEXT_DESC_PTR_REG(chan), MV_REG_READ(MV_CESA_TDMA_NEXT_DESC_PTR_REG(chan)));

		mvOsPrintf("MV_CESA_TDMA_CURR_DESC_PTR_REG      : 0x%X = 0x%08x\n",
			MV_CESA_TDMA_CURR_DESC_PTR_REG(chan), MV_REG_READ(MV_CESA_TDMA_CURR_DESC_PTR_REG(chan)));

		mvOsPrintf("MV_CESA_TDMA_ERROR_CAUSE_REG        : 0x%X = 0x%08x\n",
			MV_CESA_TDMA_ERROR_CAUSE_REG(chan), MV_REG_READ(MV_CESA_TDMA_ERROR_CAUSE_REG(chan)));

		mvOsPrintf("MV_CESA_TDMA_ERROR_MASK_REG         : 0x%X = 0x%08x\n",
			MV_CESA_TDMA_ERROR_MASK_REG(chan),
			MV_REG_READ(MV_CESA_TDMA_ERROR_MASK_REG(chan)));

		mvOsPrintf("\n=========== decoding windows ===========\n");
		for (i = 0; i < MV_CESA_TDMA_ADDR_DEC_WIN; i++) {
			mvOsPrintf("%s\t: 0x%X = 0x%08x\n",
			    "MV_CESA_TDMA_BASE_ADDR_REG",
			    MV_CESA_TDMA_BASE_ADDR_REG(chan, i),
			    MV_REG_READ(MV_CESA_TDMA_BASE_ADDR_REG(chan, i)));
			mvOsPrintf("%s\t: 0x%X = 0x%08x\n",
			    "MV_CESA_TDMA_WIN_CTRL_REG",
			    MV_CESA_TDMA_WIN_CTRL_REG(chan, i),
			    MV_REG_READ(MV_CESA_TDMA_WIN_CTRL_REG(chan, i)));
		}

#endif
	}
}

void mvCesaDebugStatus(void)
{
	MV_U8 chan = 0;
	mvOsPrintf("\n\t CESA Status\n\n");
#ifdef CONFIG_OF
	for (chan = 0; chan < mv_cesa_channels; chan++) {
#else
	for (chan = 0; chan < MV_CESA_CHANNELS; chan++) {
#endif

		mvOsPrintf("Channel %d: pReqQ=%p, qDepth=%d, reqSize=%d bytes, qRes=%d",
			chan, pCesaReqFirst[chan], cesaQueueDepth[chan], (int)sizeof(MV_CESA_REQ), cesaReqResources[chan]);

#if defined(MV_CESA_CHAIN_MODE) || defined(CONFIG_OF)

#ifdef CONFIG_OF
		if (mv_cesa_feature == CHAIN) {
#endif /* CONFIG_OF */
			mvOsPrintf(", chainLength=%u", cesaChainLength[chan]);
#ifdef CONFIG_OF
		}
#endif /* CONFIG_OF */
#endif /* MV_CESA_CHAIN_MODE || CONFIG_OF */

		mvOsPrintf("\n");
	}
	mvOsPrintf("pSAD=%p, maxSA=%d, sizeSA=%d bytes\n", pCesaSAD, cesaMaxSA, (int)sizeof(MV_CESA_SA));

	mvOsPrintf("\n");

	mvCesaDebugRegs();
	mvCesaDebugStats();
	mvCesaDebugStatsClear();
}

void mvCesaDebugDescriptor(MV_CESA_DESC *pDesc)
{
	mvOsPrintf("config=0x%08x, crSrcOffs=0x%04x, crDstOffs=0x%04x\n",
		pDesc->config, pDesc->cryptoSrcOffset, pDesc->cryptoDstOffset);

	mvOsPrintf("crLen=0x%04x, crKeyOffs=0x%04x, ivOffs=0x%04x, ivBufOffs=0x%04x\n",
		pDesc->cryptoDataLen, pDesc->cryptoKeyOffset, pDesc->cryptoIvOffset, pDesc->cryptoIvBufOffset);

	mvOsPrintf("macSrc=0x%04x, digest=0x%04x, macLen=0x%04x, inIv=0x%04x, outIv=0x%04x\n",
			pDesc->macSrcOffset, pDesc->macDigestOffset, pDesc->macDataLen,
			pDesc->macInnerIvOffset, pDesc->macOuterIvOffset);
}

void mvCesaDebugQueue(int mode)
{
	MV_U8 chan = 0;

	mvOsPrintf("\n\t CESA Request Queue:\n\n");

#ifdef CONFIG_OF
	for (chan = 0; chan < mv_cesa_channels; chan++) {
#else
	for (chan = 0; chan < MV_CESA_CHANNELS; chan++) {
#endif
		mvOsPrintf("\n\nChannel %d:\n", chan);
		mvOsPrintf("===========\n");

		mvOsPrintf("pFirstReq=%p, pLastReq=%p, qDepth=%d, reqSize=%d bytes\n",
			pCesaReqFirst[chan], pCesaReqLast[chan], cesaQueueDepth[chan], (int)sizeof(MV_CESA_REQ));

		mvOsPrintf("pEmpty=%p, pProcess=%p, qResources=%d\n", pCesaReqEmpty[chan],
					pCesaReqProcess[chan], cesaReqResources[chan]);

		if (mode != 0) {
			int count = 0;
			MV_CESA_REQ *pReq = pCesaReqFirst[chan];

			for (count = 0; count < cesaQueueDepth[chan]; count++) {
				/* Print out requsts */
				mvOsPrintf("%02d. pReq=%p, state=%s, frag=0x%x, pCmd=%p, pDma=%p, pDesc=%p, reqId=%u, use=%u\n",
					count, pReq, mvCesaDebugStateStr(pReq->state),
					pReq->fragMode, pReq->pCmd, pReq->dma[0].pDmaFirst, &pReq->pCesaDesc[0],
					pReq->pCmd->reqId, pReq->use);
				if (pReq->fragMode != MV_CESA_FRAG_NONE) {
					int frag;

					mvOsPrintf("pFrags=%p, num=%d, next=%d, bufOffset=%d, cryptoSize=%d, macSize=%d\n",
						&pReq->frags, pReq->frags.numFrag, pReq->frags.nextFrag,
						pReq->frags.bufOffset, pReq->frags.cryptoSize, pReq->frags.macSize);
					for (frag = 0; frag < pReq->frags.numFrag; frag++) {
						mvOsPrintf("#%d: pDmaFirst=%p, pDesc=%p\n", frag,
							pReq->dma[frag].pDmaFirst, &pReq->pCesaDesc[frag]);
					}
				}
				if (mode > 1) {
					/* Print out Command */
					mvCesaDebugCmd(pReq->pCmd, mode);

					/* Print out Descriptor */
					mvCesaDebugDescriptor(&pReq->pCesaDesc[0]);
				}
				pReq++;
			}
		}
	}
}

void mvCesaDebugSramSA(MV_CESA_SRAM_SA *pSramSA, int mode)
{
	if (pSramSA == NULL) {
		mvOsPrintf("cesaSramSA: Unexpected pSramSA=%p\n", pSramSA);
		return;
	}
	mvOsPrintf("pSramSA=%p, sizeSramSA=%d bytes\n", pSramSA, (int)sizeof(MV_CESA_SRAM_SA));

	if (mode != 0) {
		mvOsPrintf("cryptoKey=%p, maxCryptoKey=%d bytes\n", pSramSA->cryptoKey, MV_CESA_MAX_CRYPTO_KEY_LENGTH);
#ifdef CONFIG_OF
		mv_debug_mem_dump(pSramSA->cryptoKey, MV_CESA_MAX_CRYPTO_KEY_LENGTH, 1);
#else
		mvDebugMemDump(pSramSA->cryptoKey, MV_CESA_MAX_CRYPTO_KEY_LENGTH, 1);
#endif

		mvOsPrintf("macInnerIV=%p, maxInnerIV=%d bytes\n", pSramSA->macInnerIV, MV_CESA_MAX_DIGEST_SIZE);
#ifdef CONFIG_OF
		mv_debug_mem_dump(pSramSA->macInnerIV, MV_CESA_MAX_DIGEST_SIZE, 1);
#else
		mvDebugMemDump(pSramSA->macInnerIV, MV_CESA_MAX_DIGEST_SIZE, 1);
#endif

		mvOsPrintf("macOuterIV=%p, maxOuterIV=%d bytes\n", pSramSA->macOuterIV, MV_CESA_MAX_DIGEST_SIZE);
#ifdef CONFIG_OF
		mv_debug_mem_dump(pSramSA->macOuterIV, MV_CESA_MAX_DIGEST_SIZE, 1);
#else
		mvDebugMemDump(pSramSA->macOuterIV, MV_CESA_MAX_DIGEST_SIZE, 1);
#endif
	}
}

void mvCesaDebugSA(short sid, int mode)
{
	MV_CESA_OPERATION oper;
	MV_CESA_DIRECTION dir;
	MV_CESA_CRYPTO_ALG cryptoAlg;
	MV_CESA_CRYPTO_MODE cryptoMode;
	MV_CESA_MAC_MODE macMode;
	MV_CESA_SA *pSA = pCesaSAD[sid];

	if (pSA != NULL) {
		/*if(((pSA->count != 0) && (mode > 0)) || (mode >= 2))
		   { */
		mvOsPrintf("\n\nCESA SA Entry #%d (%p) - %s (count=%d)\n",
			   sid, pSA, (pSA != NULL) ? "Valid" : "Invalid", pSA->count);

		oper = (pSA->config & MV_CESA_OPERATION_MASK) >> MV_CESA_OPERATION_OFFSET;
		dir = (pSA->config & MV_CESA_DIRECTION_MASK) >> MV_CESA_DIRECTION_BIT;
		mvOsPrintf("%s - %s ", mvCesaDebugOperStr(oper), (dir == MV_CESA_DIR_ENCODE) ? "Encode" : "Decode");
		if (oper != MV_CESA_MAC_ONLY) {
			cryptoAlg = (pSA->config & MV_CESA_CRYPTO_ALG_MASK) >> MV_CESA_CRYPTO_ALG_OFFSET;
			cryptoMode = (pSA->config & MV_CESA_CRYPTO_MODE_MASK) >> MV_CESA_CRYPTO_MODE_BIT;
			mvOsPrintf("- %s - %s ", mvCesaDebugCryptoAlgStr(cryptoAlg),
				   (cryptoMode == MV_CESA_CRYPTO_ECB) ? "ECB" : "CBC");
		}
		if (oper != MV_CESA_CRYPTO_ONLY) {
			macMode = (pSA->config & MV_CESA_MAC_MODE_MASK) >> MV_CESA_MAC_MODE_OFFSET;
			mvOsPrintf("- %s ", mvCesaDebugMacModeStr(macMode));
		}
		mvOsPrintf("\n");

		if (mode > 0) {
			mvOsPrintf("config=0x%08x, cryptoKeySize=%d, digestSize=%d\n",
				   pCesaSAD[sid]->config, pCesaSAD[sid]->cryptoKeyLength, pCesaSAD[sid]->digestSize);

			mvCesaDebugSramSA(pCesaSAD[sid]->pSramSA, mode);
		}
		/*} */
	}
}

 /**/ void mvCesaDebugSram(int mode)
{
	MV_U8 chan = 0;

#ifdef CONFIG_OF
	for (chan = 0; chan < mv_cesa_channels; chan++) {
#else
	for (chan = 0; chan < MV_CESA_CHANNELS; chan++) {
#endif
		mvOsPrintf("\n\nChannel %d:\n", chan);
		mvOsPrintf("===========\n");

		mvOsPrintf("\n\t SRAM contents: size=%d, pVirt=%p\n\n", (int)sizeof(MV_CESA_SRAM_MAP),
						cesaSramVirtPtr[chan]);

		mvOsPrintf("\n\t Sram buffer: size=%d, pVirt=%p\n", MV_CESA_MAX_BUF_SIZE, cesaSramVirtPtr[chan]->buf);
		if (mode != 0)
#ifdef CONFIG_OF
			mv_debug_mem_dump(cesaSramVirtPtr[chan]->buf, 64, 1);
#else
			mvDebugMemDump(cesaSramVirtPtr[chan]->buf, 64, 1);
#endif

		mvOsPrintf("\n");
		mvOsPrintf("\n\t Sram descriptor: size=%d, pVirt=%p\n", (int)sizeof(MV_CESA_DESC),
						&cesaSramVirtPtr[chan]->desc);
		if (mode != 0) {
			mvOsPrintf("\n");
			mvCesaDebugDescriptor(&cesaSramVirtPtr[chan]->desc);
		}
		mvOsPrintf("\n\t Sram IV: size=%d, pVirt=%p\n", MV_CESA_MAX_IV_LENGTH, &cesaSramVirtPtr[chan]->cryptoIV);
		if (mode != 0) {
			mvOsPrintf("\n");
#ifdef CONFIG_OF
			mv_debug_mem_dump(cesaSramVirtPtr[chan]->cryptoIV, MV_CESA_MAX_IV_LENGTH, 1);
#else
			mvDebugMemDump(cesaSramVirtPtr[chan]->cryptoIV, MV_CESA_MAX_IV_LENGTH, 1);
#endif
		}
		mvOsPrintf("\n");
		mvCesaDebugSramSA(&cesaSramVirtPtr[chan]->sramSA, 0);
	}
}

void mvCesaDebugSAD(int mode)
{
	int sid;

	mvOsPrintf("\n\t Cesa SAD status: pSAD=%p, maxSA=%d\n", pCesaSAD, cesaMaxSA);

	for (sid = 0; sid < cesaMaxSA; sid++)
		mvCesaDebugSA(sid, mode);
}

void mvCesaDebugStats(void)
{
	mvOsPrintf("\n\t Cesa Statistics\n");

	mvOsPrintf("Opened=%u, Closed=%u\n", cesaStats.openedCount, cesaStats.closedCount);
	mvOsPrintf("Req=%u, maxReq=%u, frags=%u, start=%u\n",
		   cesaStats.reqCount, cesaStats.maxReqCount, cesaStats.fragCount, cesaStats.startCount);

#if defined(MV_CESA_CHAIN_MODE) || defined(CONFIG_OF)
#ifdef CONFIG_OF
	if (mv_cesa_feature == CHAIN) {
#endif /* CONFIG_OF */
		mvOsPrintf("maxChainUsage=%u\n", cesaStats.maxChainUsage);
#ifdef CONFIG_OF
	}
#endif /* CONFIG_OF */
#endif /* MV_CESA_CHAIN_MODE || CONFIG_OF */

	mvOsPrintf("\n");
	mvOsPrintf("proc=%u, ready=%u, notReady=%u\n",
		   cesaStats.procCount, cesaStats.readyCount, cesaStats.notReadyCount);
}

void mvCesaDebugStatsClear(void)
{
	memset(&cesaStats, 0, sizeof(cesaStats));
}
