/* SPDX-License-Identifier: LGPL-2.1-only OR BSD-3-Clause */
/******************************************************************************
 *
 * This file is provided under a dual license.  When you use or
 * distribute this software, you may choose to be licensed under
 * version 2.1 of the GNU Lesser General Public License 
 * ("LGPLv2.1 License") or BSD License.
 *
 * LGPLv2.1 License
 *
 * Copyright(C) 2019 MediaTek Inc.
 *
 * This program is free software; you can redistribute it and/or modify
 * it under the terms of version 2.1 of the GNU Lesser General Public 
 * License as published by the Free Software Foundation.
 *
 * This program is distributed in the hope that it will be useful, but
 * WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
 * See https://www.gnu.org/licenses/old-licenses/lgpl-2.1.html for more
 * details.
 *
 * BSD LICENSE
 *
 * Copyright(C) 2019 MediaTek Inc.
 * All rights reserved.
 *
 * 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 the copyright holder 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
 * HOLDER 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.
 *
 *****************************************************************************/
/*-----------------------------------------------------------------------------
 *
 * $Author: brianpc.huang $
 * $Date: 2015/05/29 $
 * $RCSfile: gfx_debug.h,v $
 * $Revision: #1 $
 *
 *---------------------------------------------------------------------------*/

/** @file gfx_debug.h
 *  Brief of file gfx_debug.h.
 *  Details of file gfx_debug.h (optional).
 */

#ifndef GFX_DEBUG_H
#define GFX_DEBUG_H

//---------------------------------------------------------------------------
// Include files
//---------------------------------------------------------------------------

#define DEFINE_IS_LOG   GFX_IsLog
#include "x_debug.h"

//---------------------------------------------------------------------------
// Configurations
//---------------------------------------------------------------------------


//---------------------------------------------------------------------------
// Constant definitions
//---------------------------------------------------------------------------


//---------------------------------------------------------------------------
// Type definitions
//---------------------------------------------------------------------------

#if defined(GFX_DEBUG_MODE)

// gfx debug information
typedef struct _GFX_DBG_INFO_T
{
    INT32 i4DrvFlushCount; // driver     flush     count
    INT32 i4DrvIntCount; // driver     interrupt count
    INT32 i4MwFlushCount; // middleware flush     count
    INT32 i4MwIntCount; // middleware interrupt count
    INT32 i4CmFlushCount; // c-model    flush     count
    INT32 i4CmIntCount; // c-model    interrupt count
    INT32 i4EngineCrashCount; // engine     crash     count
    INT32 i4DrvCurrentStatus; // driver     current   status
    INT32 i4EngineExecuteMod; // engine     execute   mod
    INT32 i4EngineClockSrc; // engine     clock     source
}GFX_DBG_INFO_T;

typedef struct _GFX_DBG_ENUM2TEXT_T
{
    INT32 i4Value;
    CHAR *szText;
}GFX_DBG_ENUM2TEXT_T;

#endif // #if defined(GFX_DEBUG_MODE)

//---------------------------------------------------------------------------
// Macro definitions
//---------------------------------------------------------------------------

#if defined(GFX_DEBUG_MODE)

#define GFX_DBG_INC_DRV_FLUSH_COUNT()       GFX_DbgIncDrvFlushCount()
#define GFX_DBG_INC_DRV_INT_COUNT()         GFX_DbgIncDrvIntCount()
#define GFX_DBG_INC_MW_FLUSH_COUNT()        GFX_DbgIncMwFlushCount()
#define GFX_DBG_INC_MW_INT_COUNT()          GFX_DbgIncMwIntCount()
#define GFX_DBG_INC_CM_FLUSH_COUNT()        GFX_DbgIncCmFlushCount()
#define GFX_DBG_INC_CM_INT_COUNT()          GFX_DbgIncCmIntCount()
#define GFX_DBG_RECOVER_ENGINE()            GFX_DbgRecoverEngine()
#define GFX_DBG_REC_FLUSH_TIME()            GFX_DbgRecFlushTime()
#define GFX_DBG_REC_ENG_EXE_MOD(mod)        GFX_DbgRecEngExecuteMod(mod)
#define GFX_DBG_REC_CUR_STATUS(status)      GFX_DbgRecCurrentStatus(status)
#define GFX_DBG_REC_ENG_CLK_SRC(clk)        GFX_DbgRecEngClkSrc(clk)
#define GFX_DBG_CHK_ENG_IDLE()              GFX_DbgCheckEngIdle()

#else       // normal mode
#define GFX_DBG_INC_DRV_FLUSH_COUNT()
#define GFX_DBG_INC_DRV_INT_COUNT()
#define GFX_DBG_INC_MW_FLUSH_COUNT()
#define GFX_DBG_INC_MW_INT_COUNT()
#define GFX_DBG_INC_CM_FLUSH_COUNT()
#define GFX_DBG_INC_CM_INT_COUNT()
#define GFX_DBG_RECOVER_ENGINE()
#define GFX_DBG_REC_FLUSH_TIME()
#define GFX_DBG_REC_ENG_EXE_MOD(mod)
#define GFX_DBG_REC_CUR_STATUS(status)
#define GFX_DBG_REC_ENG_CLK_SRC(clk)
#define GFX_DBG_CHK_ENG_IDLE()

#endif // #if defined(GFX_DEBUG_MODE)

//---------------------------------------------------------------------------
// Inter-file functions
//---------------------------------------------------------------------------


//---------------------------------------------------------------------------
// Public functions
//---------------------------------------------------------------------------

#if defined(GFX_DEBUG_MODE)
extern void GFX_DbgInit(void);

extern void GFX_DbgIncDrvFlushCount(void);

extern void GFX_DbgIncDrvIntCount(void);

extern void GFX_DbgIncMwFlushCount(void);

extern void GFX_DbgIncMwIntCount(void);

extern void GFX_DbgIncCmFlushCount(void);

extern void GFX_DbgIncCmIntCount(void);

extern void GFX_DbgIncEngineCrashCount(void);

extern void GFX_DbgDumpInfo(void);

extern void GFX_DbgRecCurrentStatus(INT32 i4Status);

extern void GFX_DbgRecoverEngine(void);

extern void GFX_DbgRecFlushTime(void);

extern void GFX_DbgShowBusyTime(void);

extern void GFX_DbgRecEngExecuteMod(INT32 i4Mod);

extern void GFX_DbgEnum2Text(INT32 i4Enum, CHAR *szText,
        GFX_DBG_ENUM2TEXT_T *prEnum2Text, INT32 i4Stop);

extern void GFX_DbgRecEngClkSrc(INT32 i4ClkSrc);

extern void GFX_DbgCheckEngIdle(void);
#endif // #if defined(GFX_DEBUG_MODE)

#endif // GFX_DEBUG_H
