/*************************************************************************/ /*!
@File
@Title          Debug Functionality
@Copyright      Copyright (c) Imagination Technologies Ltd. All Rights Reserved
@Description	Provides kernel side Debug Functionality.
@License        MIT

The contents of this file are subject to the MIT license as set out below.

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in
all copies or substantial portions of the Software.

This License is also included in this distribution in the file called
"MIT-COPYING".

EXCEPT AS OTHERWISE STATED IN A NEGOTIATED AGREEMENT: (A) THE SOFTWARE IS
PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING
BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR
PURPOSE AND NONINFRINGEMENT; AND (B) IN NO EVENT SHALL THE AUTHORS OR
COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
*/ /**************************************************************************/

#include <stdarg.h>
#include <stdlib.h>

#include <ddk/debug.h>

extern "C"
{
#include "img_types.h"
#include "pvr_debug.h"
#include "pvrsrv.h"
#include "pvrversion.h"
}

#define NOT_IMPLEMENTED() fprintf(stderr, PVR_BUILD_DIR ": Not implemented in %s:%s:%d\n", __func__, __FILE__, __LINE__);

/*************************************************************************/ /*!
@Function       PVRSRVReleasePrintf
@Description    To output an important message to the user in release builds
@Input          pszFormat   The message format string
@Input          ...         Zero or more arguments for use by the format string
*/ /**************************************************************************/
void
PVRSRVReleasePrintf(const IMG_CHAR *pszFormat, ...)
{
	va_list vl;
	va_start(vl, pszFormat);
	char data[512];
	vsnprintf(data, sizeof(data), pszFormat, vl);
#if defined(NO_HARDWARE)
	// Reduce logging when using the debug-only no-hardware driver.
	zxlogf(TRACE, PVR_BUILD_DIR ": %s\n", data);
#else
	zxlogf(INFO, PVR_BUILD_DIR ": %s\n", data);
#endif
	va_end(vl);
}

#if defined(PVRSRV_NEED_PVR_TRACE)

/*************************************************************************/ /*!
@Function       PVRTrace
@Description    To output a debug message to the user
@Input          pszFormat   The message format string
@Input          ...         Zero or more arguments for use by the format string
*/ /**************************************************************************/
void
PVRSRVTrace(const IMG_CHAR *pszFormat, ...)
{
	va_list vl;
	va_start(vl, pszFormat);
	char data[512];
	vsnprintf(data, sizeof(data), pszFormat, vl);
	zxlogf(TRACE, PVR_BUILD_DIR ": %s\n", data);
	va_end(vl);
}

#endif /* defined(PVRSRV_NEED_PVR_TRACE) */

#if defined(PVRSRV_NEED_PVR_DPF)


/*************************************************************************/ /*!
@Function       PVRSRVDebugPrintf
@Description    To output a debug message to the user
@Input          uDebugLevel The current debug level
@Input          pszFile     The source file generating the message
@Input          uLine       The line of the source file
@Input          pszFormat   The message format string
@Input          ...         Zero or more arguments for use by the format string
*/ /**************************************************************************/
void
PVRSRVDebugPrintf(IMG_UINT32 ui32DebugLevel,
		  const IMG_CHAR *pszFullFileName,
		  IMG_UINT32 ui32Line,
		  const IMG_CHAR *pszFormat,
		  ...)
{
	uint32_t log_level;
	if (ui32DebugLevel & (DBGPRIV_FATAL | DBGPRIV_ERROR))
	{
		log_level = DDK_LOG_ERROR;
	}
	else if (ui32DebugLevel & DBGPRIV_WARNING)
	{
		log_level = DDK_LOG_WARNING;
	}
	else
	{
		log_level = DDK_LOG_TRACE;
	}

	if (zxlog_level_enabled_etc(log_level))
	{
		va_list vl;
		va_start(vl, pszFormat);
		char data[512];
		vsnprintf(data, sizeof(data), pszFormat, vl);
		zxlogf_etc(log_level, PVR_BUILD_DIR " at %s:%d - %s\n", pszFullFileName, ui32Line, data);
		va_end(vl);
	}
}

IMG_EXPORT void IMG_CALLCONV __noreturn
PVRSRVDebugAssertFail(const IMG_CHAR *pszFile, IMG_UINT32 ui32Line, const IMG_CHAR *pszAssertion)
{
	fprintf(stderr, PVR_BUILD_DIR " ASSERT at %s:%d - %s\n", pszFile, ui32Line, pszAssertion);
	abort();
}

#endif /* PVRSRV_NEED_PVR_DPF */
