/*************************************************************************/ /*!
@File
@Title          pdump functions
@Copyright      Copyright (c) Imagination Technologies Ltd. All Rights Reserved
@Description    Main APIs for pdump functions
@License        Dual MIT/GPLv2

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.

Alternatively, the contents of this file may be used under the terms of
the GNU General Public License Version 2 ("GPL") in which case the provisions
of GPL are applicable instead of those above.

If you wish to allow use of your version of this file only under the terms of
GPL, and not to allow others to use your version of this file under the terms
of the MIT license, indicate your decision by deleting the provisions above
and replace them with the notice and other provisions required by GPL as set
out in the file called "GPL-COPYING" included in this distribution. If you do
not delete the provisions above, a recipient may use your version of this file
under the terms of either the MIT license or GPL.

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

#ifndef PDUMP_KM_H
#define PDUMP_KM_H

#if defined(PDUMP)
#include <stdarg.h>
#endif

/* services/srvkm/include/ */
#include "device.h"

/* include/ */
#include "pvrsrv_error.h"


#if defined(__KERNEL__) && defined(LINUX) && !defined(__GENKSYMS__)
#define __pvrsrv_defined_struct_enum__
#include <services_kernel_client.h>
#endif

#include "connection_server.h"
/*
 *	Pull in pdump flags from services include
 */
#include "pdump.h"
#include "pdumpdefs.h"

/* Define this to enable the PDUMP_HERE trace in the server */
#undef PDUMP_TRACE

#if defined(PDUMP_TRACE)
#define PDUMP_HERE_VAR  IMG_UINT32 here = 0;
#define PDUMP_HERE(a)	{ here = (a); if (ui32Flags & PDUMP_FLAGS_DEBUG) PVR_DPF((PVR_DBG_WARNING, "HERE %d", (a))); }
#define PDUMP_HEREA(a)	{ here = (a); PVR_DPF((PVR_DBG_WARNING, "HERE ALWAYS %d", (a))); }
#else
#define PDUMP_HERE_VAR  IMG_UINT32 here = 0;
#define PDUMP_HERE(a)	here = (a);
#define PDUMP_HEREA(a)	here = (a);
#endif

#define PDUMP_PD_UNIQUETAG	(IMG_HANDLE)0
#define PDUMP_PT_UNIQUETAG	(IMG_HANDLE)0

/* Invalid value for PDump block number */
#define PDUMP_BLOCKNUM_INVALID      IMG_UINT32_MAX

typedef struct _PDUMP_CONNECTION_DATA_ PDUMP_CONNECTION_DATA;

/* PDump transition events */
typedef enum _PDUMP_TRANSITION_EVENT_
{
	PDUMP_TRANSITION_EVENT_NONE,              /* No event */
	PDUMP_TRANSITION_EVENT_BLOCK_FINISHED,    /* Block mode event, current PDump-block has finished */
	PDUMP_TRANSITION_EVENT_BLOCK_STARTED,     /* Block mode event, new PDump-block has started */
	PDUMP_TRANSITION_EVENT_RANGE_ENTERED,     /* Transition into capture range */
	PDUMP_TRANSITION_EVENT_RANGE_EXITED,      /* Transition out of capture range */
} PDUMP_TRANSITION_EVENT;

typedef PVRSRV_ERROR (*PFN_PDUMP_TRANSITION)(void *pvData, void *pvDevice, PDUMP_TRANSITION_EVENT eEvent, IMG_UINT32 ui32PDumpFlags);
typedef void (*PFN_PDUMP_SYNCBLOCKS)(void *pvData, PDUMP_TRANSITION_EVENT eEvent);


#ifdef PDUMP

/*! Macro used to record a panic in the PDump script stream */
#define PDUMP_PANIC(_id, _msg) do \
		{ PVRSRV_ERROR _eE;\
			_eE = PDumpPanic(((RGX_PDUMP_PANIC_ ## _id) & 0xFFFF), _msg, __func__, __LINE__);	\
			PVR_LOG_IF_ERROR(_eE, "PDumpPanic");\
		MSC_SUPPRESS_4127\
		} while (0)

/*! Macro used to record a driver error in the PDump script stream to invalidate the capture */
#define PDUMP_ERROR(_err, _msg) \
	(void)PDumpCaptureError(_err, _msg, __func__, __LINE__)

#define SZ_MSG_SIZE_MAX			PVRSRV_PDUMP_MAX_COMMENT_SIZE
#define SZ_SCRIPT_SIZE_MAX		PVRSRV_PDUMP_MAX_COMMENT_SIZE
#define SZ_FILENAME_SIZE_MAX	(PVRSRV_PDUMP_MAX_FILENAME_SIZE+sizeof(PDUMP_PARAM_N_FILE_NAME))

#define PDUMP_GET_SCRIPT_STRING()																			\
	IMG_HANDLE hScript;																						\
	void *pvScriptAlloc;																					\
	IMG_UINT32 ui32MaxLen = SZ_SCRIPT_SIZE_MAX-1;															\
	pvScriptAlloc = OSAllocMem( SZ_SCRIPT_SIZE_MAX );														\
	if (!pvScriptAlloc)																						\
	{																										\
		PVR_DPF((PVR_DBG_ERROR, "PDUMP_GET_SCRIPT_STRING() failed to allocate memory for script buffer"));	\
		return PVRSRV_ERROR_OUT_OF_MEMORY;																	\
	}																										\
																											\
	hScript = (IMG_HANDLE) pvScriptAlloc;

#define PDUMP_GET_MSG_STRING()																				\
	IMG_CHAR *pszMsg;																						\
	void *pvMsgAlloc;																						\
	IMG_UINT32 ui32MaxLen = SZ_MSG_SIZE_MAX-1;																\
	pvMsgAlloc = OSAllocMem( SZ_MSG_SIZE_MAX );																\
	if (!pvMsgAlloc)																						\
	{																										\
		PVR_DPF((PVR_DBG_ERROR, "PDUMP_GET_MSG_STRING() failed to allocate memory for message buffer"));	\
		return PVRSRV_ERROR_OUT_OF_MEMORY;																	\
	}																										\
	pszMsg = (IMG_CHAR *)pvMsgAlloc;

#define PDUMP_GET_SCRIPT_AND_FILE_STRING()																	\
	IMG_HANDLE hScript;																						\
	IMG_CHAR *pszFileName;																					\
	IMG_UINT32 ui32MaxLenScript = SZ_SCRIPT_SIZE_MAX-1;														\
	void *pvScriptAlloc;																					\
	void *pvFileAlloc;																						\
	pvScriptAlloc = OSAllocMem( SZ_SCRIPT_SIZE_MAX );														\
	if (!pvScriptAlloc)																						\
	{																										\
		PVR_DPF((PVR_DBG_ERROR, "PDUMP_GET_SCRIPT_AND_FILE_STRING() failed to allocate memory for script buffer"));		\
		return PVRSRV_ERROR_OUT_OF_MEMORY;																	\
	}																										\
																											\
	hScript = (IMG_HANDLE) pvScriptAlloc;																	\
	pvFileAlloc = OSAllocMem( SZ_FILENAME_SIZE_MAX );														\
	if (!pvFileAlloc)																						\
	{																										\
		PVR_DPF((PVR_DBG_ERROR, "PDUMP_GET_SCRIPT_AND_FILE_STRING() failed to allocate memory for filename buffer"));	\
		OSFreeMem(pvScriptAlloc);																			\
		return PVRSRV_ERROR_OUT_OF_MEMORY;																	\
	}																										\
	pszFileName = (IMG_CHAR *)pvFileAlloc;

#define PDUMP_RELEASE_SCRIPT_STRING()																		\
	if (pvScriptAlloc)																						\
	{																										\
		OSFreeMem(pvScriptAlloc);																			\
		pvScriptAlloc = NULL;																				\
	}

#define PDUMP_RELEASE_MSG_STRING()																			\
	if (pvMsgAlloc)																							\
	{																										\
		OSFreeMem(pvMsgAlloc);																				\
		pvMsgAlloc = NULL;																					\
	}

#define PDUMP_RELEASE_FILE_STRING()																			\
	if (pvFileAlloc)																						\
	{																										\
		OSFreeMem(pvFileAlloc);																				\
		pvFileAlloc = NULL;																					\
	}

#define PDUMP_RELEASE_SCRIPT_AND_FILE_STRING()																\
	if (pvScriptAlloc)																						\
	{																										\
		OSFreeMem(pvScriptAlloc);																			\
		pvScriptAlloc = NULL;																				\
	}																										\
	if (pvFileAlloc)																						\
	{																										\
		OSFreeMem(pvFileAlloc);																				\
		pvFileAlloc = NULL;																					\
	}


/* Shared across pdump_x files */
PVRSRV_ERROR PDumpInitCommon(void);
void PDumpDeInitCommon(void);
PVRSRV_ERROR PDumpReady(void);
void PDumpGetParameterZeroPageInfo(PDUMP_FILEOFFSET_T *puiZeroPageOffset,
				size_t *puiZeroPageSize,
				const IMG_CHAR **ppszZeroPageFilename);

void PDumpConnectionNotify(void);
void PDumpDisconnectionNotify(void);

void PDumpStopInitPhase(void);
PVRSRV_ERROR PDumpSetFrameKM(CONNECTION_DATA *psConnection,
				PVRSRV_DEVICE_NODE * psDeviceNode,
				IMG_UINT32 ui32Frame);
PVRSRV_ERROR PDumpGetFrameKM(CONNECTION_DATA *psConnection,
				PVRSRV_DEVICE_NODE * psDeviceNode,
				IMG_UINT32* pui32Frame);
PVRSRV_ERROR PDumpCommentKM(IMG_CHAR *pszComment, IMG_UINT32 ui32Flags);

PVRSRV_ERROR PDumpSetDefaultCaptureParamsKM(IMG_UINT32 ui32Mode,
				IMG_UINT32 ui32Start,
				IMG_UINT32 ui32End,
				IMG_UINT32 ui32Interval,
				IMG_UINT32 ui32MaxParamFileSize);


PVRSRV_ERROR PDumpReg32(IMG_CHAR	*pszPDumpRegName,
				IMG_UINT32	ui32RegAddr,
				IMG_UINT32	ui32RegValue,
				IMG_UINT32	ui32Flags);

PVRSRV_ERROR PDumpReg64(IMG_CHAR	*pszPDumpRegName,
				IMG_UINT32	ui32RegAddr,
				IMG_UINT64	ui64RegValue,
				IMG_UINT32	ui32Flags);

PVRSRV_ERROR PDumpRegLabelToReg64(IMG_CHAR *pszPDumpRegName,
				IMG_UINT32 ui32RegDst,
				IMG_UINT32 ui32RegSrc,
				IMG_UINT32 ui32Flags);

PVRSRV_ERROR PDumpPhysHandleToInternalVar64(IMG_CHAR *pszInternalVar,
				IMG_HANDLE hPdumpPages,
				IMG_UINT32 ui32Flags);

PVRSRV_ERROR PDumpMemLabelToInternalVar64(IMG_CHAR *pszInternalVar,
				PMR *psPMR,
				IMG_DEVMEM_OFFSET_T uiLogicalOffset,
				IMG_UINT32 ui32Flags);

PVRSRV_ERROR PDumpWriteVarORValueOp(const IMG_CHAR *pszInternalVariable,
				const IMG_UINT64 ui64Value,
				const IMG_UINT32 ui32PDumpFlags);

PVRSRV_ERROR PDumpWriteVarANDValueOp(const IMG_CHAR *pszInternalVariable,
				const IMG_UINT64 ui64Value,
				const IMG_UINT32 ui32PDumpFlags);

PVRSRV_ERROR PDumpWriteVarSHRValueOp(const IMG_CHAR *pszInternalVariable,
				const IMG_UINT64 ui64Value,
				const IMG_UINT32 ui32PDumpFlags);

PVRSRV_ERROR PDumpInternalVarToReg32(IMG_CHAR *pszPDumpRegName,
				IMG_UINT32	ui32Reg,
				IMG_CHAR *pszInternalVar,
				IMG_UINT32	ui32Flags);

PVRSRV_ERROR PDumpInternalVarToReg64(IMG_CHAR *pszPDumpRegName,
				IMG_UINT32	ui32Reg,
				IMG_CHAR *pszInternalVar,
				IMG_UINT32	ui32Flags);

PVRSRV_ERROR PDumpMemLabelToMem32(PMR *psPMRSource,
				PMR *psPMRDest,
				IMG_DEVMEM_OFFSET_T uiLogicalOffsetSource,
				IMG_DEVMEM_OFFSET_T uiLogicalOffsetDest,
				IMG_UINT32 ui32Flags);

PVRSRV_ERROR PDumpMemLabelToMem64(PMR *psPMRSource,
				PMR *psPMRDest,
				IMG_DEVMEM_OFFSET_T uiLogicalOffsetSource,
				IMG_DEVMEM_OFFSET_T uiLogicalOffsetDest,
				IMG_UINT32	ui32Flags);

PVRSRV_ERROR PDumpRegLabelToMem32(IMG_CHAR *pszPDumpRegName,
				IMG_UINT32 ui32Reg,
				PMR *psPMR,
				IMG_DEVMEM_OFFSET_T uiLogicalOffset,
				IMG_UINT32 ui32Flags);

PVRSRV_ERROR PDumpRegLabelToMem64(IMG_CHAR *pszPDumpRegName,
				IMG_UINT32 ui32Reg,
				PMR *psPMR,
				IMG_DEVMEM_OFFSET_T uiLogicalOffset,
				IMG_UINT32 ui32Flags);

PVRSRV_ERROR PDumpRegLabelToInternalVar(IMG_CHAR *pszPDumpRegName,
				IMG_UINT32 ui32Reg,
				IMG_CHAR *pszInternalVar,
				IMG_UINT32 ui32Flags);

PVRSRV_ERROR PDumpSAW(IMG_CHAR      *pszDevSpaceName,
				IMG_UINT32    ui32HPOffsetBytes,
				IMG_UINT32    ui32NumSaveBytes,
				IMG_CHAR      *pszOutfileName,
				IMG_UINT32    ui32OutfileOffsetByte,
				PDUMP_FLAGS_T uiPDumpFlags);

PVRSRV_ERROR PDumpRegPolKM(IMG_CHAR				*pszPDumpRegName,
				IMG_UINT32			ui32RegAddr,
				IMG_UINT32			ui32RegValue,
				IMG_UINT32			ui32Mask,
				IMG_UINT32			ui32Flags,
				PDUMP_POLL_OPERATOR	eOperator);

PVRSRV_ERROR PDumpBitmapKM(PVRSRV_DEVICE_NODE *psDeviceNode,
							  IMG_CHAR *pszFileName,
							  IMG_UINT32 ui32FileOffset,
							  IMG_UINT32 ui32Width,
							  IMG_UINT32 ui32Height,
							  IMG_UINT32 ui32StrideInBytes,
							  IMG_DEV_VIRTADDR sDevBaseAddr,
							  IMG_UINT32 ui32MMUContextID,
							  IMG_UINT32 ui32Size,
							  PDUMP_PIXEL_FORMAT ePixelFormat,
							  IMG_UINT32 ui32AddrMode,
							  IMG_UINT32 ui32PDumpFlags);


/**************************************************************************/ /*!
@Function       PDumpImageDescriptor
@Description    PDumps image data out as an IMGBv2 data section
@Input          psDeviceNode         Pointer to device node.
@Input          ui32MMUContextID     PDUMP MMU context ID.
@Input          pszSABFileName       Pointer to string containing file name of
                                     Image being SABed
@Input          sData                GPU virtual address of this surface.
@Input          ui32DataSize         Image data size
@Input          ui32LogicalWidth     Image logical width
@Input          ui32LogicalHeight    Image logical height
@Input          ui32PhysicalWidth    Image physical width
@Input          ui32PhysicalHeight   Image physical height
@Input          ePixFmt              Image pixel format
@Input          eFBCompression       FB compression mode
@Input          paui32FBCClearColour FB clear colour (Only applicable to FBC surfaces)
@Input          eFBCSwizzle          FBC channel swizzle (Only applicable to FBC surfaces)
@Input          sHeader              GPU virtual address of the headers of this
                                     surface (Only applicable to FBC surfaces)
@Input          ui32DataSize         Header size (Only applicable to FBC surfaces)
@Input          ui32PDumpFlags       PDUMP flags
@Return         PVRSRV_ERROR:        PVRSRV_OK on success. Otherwise, a PVRSRV_
                                     error code
*/ /***************************************************************************/
PVRSRV_ERROR PDumpImageDescriptor(PVRSRV_DEVICE_NODE *psDeviceNode,
									IMG_UINT32 ui32MMUContextID,
									IMG_CHAR *pszSABFileName,
									IMG_DEV_VIRTADDR sData,
									IMG_UINT32 ui32DataSize,
									IMG_UINT32 ui32LogicalWidth,
									IMG_UINT32 ui32LogicalHeight,
									IMG_UINT32 ui32PhysicalWidth,
									IMG_UINT32 ui32PhysicalHeight,
									PDUMP_PIXEL_FORMAT ePixFmt,
									IMG_MEMLAYOUT eMemLayout,
									IMG_FB_COMPRESSION eFBCompression,
									const IMG_UINT32 *paui32FBCClearColour,
									PDUMP_FBC_SWIZZLE eFBCSwizzle,
									IMG_DEV_VIRTADDR sHeader,
									IMG_UINT32 ui32HeaderSize,
									IMG_UINT32 ui32PDumpFlags);

/**************************************************************************/ /*!
@Function       PDumpDataDescriptor
@Description    PDumps non-image data out as an IMGCv1 data section
@Input          psDeviceNode         Pointer to device node.
@Input          ui32MMUContextID     PDUMP MMU context ID.
@Input          pszSABFileName       Pointer to string containing file name of
                                     Data being SABed
@Input          sData                GPU virtual address of this data.
@Input          ui32DataSize         Data size
@Input          ui32ElementType      Data element type
@Input          ui32ElementCount     Number of data elements
@Input          ui32PDumpFlags       PDUMP flags
@Return         PVRSRV_ERROR:        PVRSRV_OK on success. Otherwise, a PVRSRV_
                                     error code
*/ /***************************************************************************/
PVRSRV_ERROR PDumpDataDescriptor(PVRSRV_DEVICE_NODE *psDeviceNode,
									IMG_UINT32 ui32MMUContextID,
									IMG_CHAR *pszSABFileName,
									IMG_DEV_VIRTADDR sData,
									IMG_UINT32 ui32DataSize,
									IMG_UINT32 ui32ElementType,
									IMG_UINT32 ui32ElementCount,
									IMG_UINT32 ui32PDumpFlags);


PVRSRV_ERROR PDumpReadRegKM(IMG_CHAR *pszPDumpRegName,
				IMG_CHAR *pszFileName,
				IMG_UINT32 ui32FileOffset,
				IMG_UINT32 ui32Address,
				IMG_UINT32 ui32Size,
				IMG_UINT32 ui32PDumpFlags);

__printf(2, 3)
PVRSRV_ERROR PDumpCommentWithFlagsNoLock(IMG_UINT32	ui32Flags,
				IMG_CHAR*	pszFormat,
				...);

PVRSRV_ERROR PDumpCommentWithFlagsNoLockVA(IMG_UINT32 ui32Flags,
				const IMG_CHAR * pszFormat,
				va_list args);

__printf(2, 3)
PVRSRV_ERROR PDumpCommentWithFlags(IMG_UINT32	ui32Flags,
				IMG_CHAR*	pszFormat,
				...);

PVRSRV_ERROR PDumpCommentWithFlagsVA(IMG_UINT32 ui32Flags,
				const IMG_CHAR * pszFormat,
				va_list args);

PVRSRV_ERROR PDumpPanic(IMG_UINT32      ui32PanicNo,
				IMG_CHAR*       pszPanicMsg,
				const IMG_CHAR* pszPPFunc,
				IMG_UINT32      ui32PPline);

PVRSRV_ERROR PDumpCaptureError(PVRSRV_ERROR    ui32ErrorNo,
				IMG_CHAR*       pszErrorMsg,
				const IMG_CHAR* pszPPFunc,
				IMG_UINT32      ui32PPline);

PVRSRV_ERROR PDumpPDReg(PDUMP_MMU_ATTRIB *psMMUAttrib,
				IMG_UINT32	ui32Reg,
				IMG_UINT32	ui32dwData,
				IMG_HANDLE	hUniqueTag);
PVRSRV_ERROR PDumpPDRegWithFlags(PDUMP_MMU_ATTRIB *psMMUAttrib,
				IMG_UINT32		ui32Reg,
				IMG_UINT32		ui32Data,
				IMG_UINT32		ui32Flags,
				IMG_HANDLE		hUniqueTag);

PVRSRV_ERROR PDumpIsLastCaptureFrameKM(IMG_BOOL *pbIsLastCaptureFrame);

PVRSRV_ERROR PDumpGetStateKM(IMG_UINT64 *ui64State);

PVRSRV_ERROR PDumpGetCurrentBlockKM(IMG_UINT32 *pui32CurrentBlock);

PVRSRV_ERROR PDumpForceCaptureStopKM(void);

PVRSRV_ERROR PDumpIsCaptureFrameKM(IMG_BOOL *bIsCaptureRange);

PVRSRV_ERROR PDumpRegRead32(IMG_CHAR *pszPDumpRegName,
				const IMG_UINT32 dwRegOffset,
				IMG_UINT32	ui32Flags);
PVRSRV_ERROR PDumpRegRead64(IMG_CHAR *pszPDumpRegName,
				const IMG_UINT32 dwRegOffset,
				IMG_UINT32	ui32Flags);
PVRSRV_ERROR PDumpRegRead64ToInternalVar(IMG_CHAR	*pszPDumpRegName,
						IMG_CHAR *pszInternalVar,
						const IMG_UINT32 dwRegOffset,
						IMG_UINT32	ui32Flags);

PVRSRV_ERROR PDumpIDLWithFlags(IMG_UINT32 ui32Clocks, IMG_UINT32 ui32Flags);
PVRSRV_ERROR PDumpIDL(IMG_UINT32 ui32Clocks);

PVRSRV_ERROR PDumpRegBasedCBP(IMG_CHAR		*pszPDumpRegName,
				IMG_UINT32	ui32RegOffset,
				IMG_UINT32	ui32WPosVal,
				IMG_UINT32	ui32PacketSize,
				IMG_UINT32	ui32BufferSize,
				IMG_UINT32	ui32Flags);

PVRSRV_ERROR PDumpTRG(IMG_CHAR *pszMemSpace,
				IMG_UINT32 ui32MMUCtxID,
				IMG_UINT32 ui32RegionID,
				IMG_BOOL bEnable,
				IMG_UINT64 ui64VAddr,
				IMG_UINT64 ui64LenBytes,
				IMG_UINT32 ui32XStride,
				IMG_UINT32 ui32Flags);

void PDumpLock(void);
void PDumpUnlock(void);
PVRSRV_ERROR PDumpIfKM(IMG_CHAR *pszPDumpCond, IMG_UINT32 ui32PDumpFlags);
PVRSRV_ERROR PDumpElseKM(IMG_CHAR *pszPDumpCond, IMG_UINT32 ui32PDumpFlags);
PVRSRV_ERROR PDumpFiKM(IMG_CHAR *pszPDumpCond, IMG_UINT32 ui32PDumpFlags);

void PDumpPowerTransitionStart(void);
void PDumpPowerTransitionEnd(void);
IMG_BOOL PDumpInPowerTransition(void);
IMG_BOOL PDumpIsContCaptureOn(void);

/*!
 * @name	PDumpWriteParameter
 * @brief	General function for writing to PDump stream. Used
 *          mainly for memory dumps to parameter stream.
 *			Usually more convenient to use PDumpWriteScript below
 *			for the script stream.
 * @param	psui8Data - data to write
 * @param	ui32Size - size of write
 * @param	ui32Flags - PDump flags
 * @param   pui32FileOffset - on return contains the file offset to
 *                            the start of the parameter data
 * @param   aszFilenameStr - pointer to at least a 20 char buffer to
 *                           return the parameter filename
 * @return	error
 */
PVRSRV_ERROR PDumpWriteParameter(IMG_UINT8 *psui8Data, IMG_UINT32 ui32Size,
				IMG_UINT32 ui32Flags, IMG_UINT32* pui32FileOffset,
				IMG_CHAR* aszFilenameStr);

/*!
 * @name	PDumpWriteScript
 * @brief	Write an PDumpOS created string to the "script" output stream
 * @param	hString - PDump OS layer handle of string buffer to write
 * @param	ui32Flags - PDump flags
 * @return	IMG_TRUE on success.
 */
IMG_BOOL PDumpWriteScript(IMG_HANDLE hString, IMG_UINT32 ui32Flags);

/**************************************************************************/ /*!
@Function       PDumpSNPrintf
@Description    Printf to OS-specific PDump state buffer. This function is
                only called if PDUMP is defined.
@Input          hBuf               handle of buffer to write into
@Input          ui32ScriptSizeMax  maximum size of data to write (chars)
@Input          pszFormat          format string
@Return         None
*/ /**************************************************************************/
__printf(3, 4)
PVRSRV_ERROR PDumpSNPrintf(IMG_HANDLE hBuf, IMG_UINT32 ui32ScriptSizeMax, IMG_CHAR* pszFormat, ...);


/*
   PDumpWriteShiftedMaskedValue():

   loads the "reference" address into an internal PDump register,
   optionally shifts it right,
   optionally shifts it left,
   optionally masks it
   then finally writes the computed value to the given destination address

   i.e. it emits pdump language equivalent to this expression:

   dest = ((&ref) >> SHRamount << SHLamount) & MASK
*/
extern PVRSRV_ERROR
PDumpWriteShiftedMaskedValue(const IMG_CHAR *pszDestRegspaceName,
                             const IMG_CHAR *pszDestSymbolicName,
                             IMG_DEVMEM_OFFSET_T uiDestOffset,
                             const IMG_CHAR *pszRefRegspaceName,
                             const IMG_CHAR *pszRefSymbolicName,
                             IMG_DEVMEM_OFFSET_T uiRefOffset,
                             IMG_UINT32 uiSHRAmount,
                             IMG_UINT32 uiSHLAmount,
                             IMG_UINT32 uiMask,
                             IMG_DEVMEM_SIZE_T uiWordSize,
                             IMG_UINT32 uiPDumpFlags);

/*
  PDumpWriteSymbAddress():
  writes the address of the "reference" to the offset given
*/
extern PVRSRV_ERROR
PDumpWriteSymbAddress(const IMG_CHAR *pszDestSpaceName,
                      IMG_DEVMEM_OFFSET_T uiDestOffset,
                      const IMG_CHAR *pszRefSymbolicName,
                      IMG_DEVMEM_OFFSET_T uiRefOffset,
                      const IMG_CHAR *pszPDumpDevName,
                      IMG_UINT32 ui32WordSize,
                      IMG_UINT32 ui32AlignShift,
                      IMG_UINT32 ui32Shift,
                      IMG_UINT32 uiPDumpFlags);

/* Register the connection with the PDump subsystem */
extern PVRSRV_ERROR PDumpRegisterConnection(void *hSyncPrivData,
	                                         PFN_PDUMP_SYNCBLOCKS pfnPDumpSyncBlocks,
	                                         PDUMP_CONNECTION_DATA **ppsPDumpConnectionData);

/* Unregister the connection with the PDump subsystem */
extern void PDumpUnregisterConnection(PDUMP_CONNECTION_DATA *psPDumpConnectionData);

/* Register for notification of PDump Transition into/out of capture range */
extern PVRSRV_ERROR PDumpRegisterTransitionCallback(PDUMP_CONNECTION_DATA *psPDumpConnectionData,
													 PFN_PDUMP_TRANSITION pfnCallback,
													 void *hPrivData,
													 void *pvDevice,
													 void **ppvHandle);

/* Unregister notification of PDump Transition */
extern void PDumpUnregisterTransitionCallback(void *pvHandle);

/* Notify PDump of a Transition into/out of capture range */
extern PVRSRV_ERROR PDumpTransition(PDUMP_CONNECTION_DATA *psPDumpConnectionData, PDUMP_TRANSITION_EVENT eEvent, IMG_UINT32 ui32PDumpFlags);


	#define PDUMP_LOCK(_ui32PDumpFlags) do \
		{ if ((_ui32PDumpFlags & PDUMP_FLAGS_PDUMP_LOCK_HELD) == 0)\
			{\
				PDumpLock();\
			}\
		MSC_SUPPRESS_4127\
		} while (0)

	#define PDUMP_UNLOCK(_ui32PDumpFlags) do \
		{ if ((_ui32PDumpFlags & PDUMP_FLAGS_PDUMP_LOCK_HELD) == 0)\
			{\
				PDumpUnlock();\
			}\
		MSC_SUPPRESS_4127\
		} while (0)

	#define PDUMPINIT				PDumpInitCommon
	#define PDUMPDEINIT				PDumpDeInitCommon
	#define PDUMPREG32				PDumpReg32
	#define PDUMPREG64				PDumpReg64
	#define PDUMPREGREAD32			PDumpRegRead32
	#define PDUMPREGREAD64			PDumpRegRead64
	#define PDUMPCOMMENT(...)		PDumpCommentWithFlags(PDUMP_FLAGS_CONTINUOUS, __VA_ARGS__)
	#define PDUMPCOMMENTWITHFLAGS	PDumpCommentWithFlags
	#define PDUMPREGPOL				PDumpRegPolKM
	#define PDUMPPDREG				PDumpPDReg
	#define PDUMPPDREGWITHFLAGS		PDumpPDRegWithFlags
	#define PDUMPREGBASEDCBP		PDumpRegBasedCBP
	#define PDUMPENDINITPHASE		PDumpStopInitPhase
	#define PDUMPIDLWITHFLAGS		PDumpIDLWithFlags
	#define PDUMPIDL				PDumpIDL
	#define PDUMPPOWCMDSTART		PDumpPowerTransitionStart
	#define PDUMPPOWCMDEND			PDumpPowerTransitionEnd
	#define PDUMPPOWCMDINTRANS		PDumpInPowerTransition

#define PDUMP_BLKSTART(_ui32PDumpFlags) do \
		{ PDUMP_LOCK(_ui32PDumpFlags);\
		_ui32PDumpFlags |= PDUMP_FLAGS_PDUMP_LOCK_HELD;\
		MSC_SUPPRESS_4127\
		} while (0)

#define PDUMP_BLKEND(_ui32PDumpFlags) do \
		{ _ui32PDumpFlags &= ~PDUMP_FLAGS_PDUMP_LOCK_HELD;\
		 PDUMP_UNLOCK(_ui32PDumpFlags);\
		MSC_SUPPRESS_4127\
		} while (0)

#define PDUMPIF(_msg,_ui32PDumpFlags) do \
		{PDUMP_BLKSTART(_ui32PDumpFlags);\
		PDumpIfKM(_msg,_ui32PDumpFlags);\
		MSC_SUPPRESS_4127\
		} while (0)

	#define PDUMPELSE				PDumpElseKM

	#define PDUMPFI(_msg,_ui32PDumpFlags) do \
		{ PDumpFiKM(_msg,_ui32PDumpFlags);\
		PDUMP_BLKEND(_ui32PDumpFlags);\
		MSC_SUPPRESS_4127\
		} while (0)

#else
	/*
		We should be clearer about which functions can be called
		across the bridge as this looks rather unbalanced
	*/

/*! Macro used to record a panic in the PDump script stream */
#define PDUMP_PANIC(_id, _msg)  ((void)0)

/*! Macro used to record a driver error in the PDump script stream to invalidate the capture */
#define PDUMP_ERROR(_err, _msg) ((void)0)

#ifdef INLINE_IS_PRAGMA
#pragma inline(PDumpInitCommon)
#endif
static INLINE PVRSRV_ERROR
PDumpInitCommon(void)
{
	return PVRSRV_OK;
}

#ifdef INLINE_IS_PRAGMA
#pragma inline(PDumpConnectionNotify)
#endif
static INLINE void
PDumpConnectionNotify(void)
{
}

#ifdef INLINE_IS_PRAGMA
#pragma inline(PDumpDisconnectionNotify)
#endif
static INLINE void
PDumpDisconnectionNotify(void)
{
}
#ifdef INLINE_IS_PRAGMA
#pragma inline(PDumpLock)
#endif
static INLINE void
PDumpLock(void)
{
}
#ifdef INLINE_IS_PRAGMA
#pragma inline(PDumpUnlock)
#endif
static INLINE void
PDumpUnlock(void)
{
}

#ifdef INLINE_IS_PRAGMA
#pragma inline(PDumpStopInitPhase)
#endif
static INLINE void
PDumpStopInitPhase(void)
{
}

#ifdef INLINE_IS_PRAGMA
#pragma inline(PDumpSetFrameKM)
#endif
static INLINE PVRSRV_ERROR
PDumpSetFrameKM(CONNECTION_DATA *psConnection,
                PVRSRV_DEVICE_NODE *psDevNode,
                IMG_UINT32 ui32Frame)
{
	PVR_UNREFERENCED_PARAMETER(psConnection);
	PVR_UNREFERENCED_PARAMETER(ui32Frame);
	return PVRSRV_OK;
}

#ifdef INLINE_IS_PRAGMA
#pragma inline(PDumpGetFrameKM)
#endif
static INLINE PVRSRV_ERROR
PDumpGetFrameKM(CONNECTION_DATA *psConnection,
                PVRSRV_DEVICE_NODE *psDeviceNode,
                IMG_UINT32* pui32Frame)
{
	PVR_UNREFERENCED_PARAMETER(psConnection);
	PVR_UNREFERENCED_PARAMETER(pui32Frame);
	return PVRSRV_OK;
}

#ifdef INLINE_IS_PRAGMA
#pragma inline(PDumpCommentKM)
#endif
static INLINE PVRSRV_ERROR
PDumpCommentKM(IMG_CHAR *pszComment, IMG_UINT32 ui32Flags)
{
	PVR_UNREFERENCED_PARAMETER(pszComment);
	PVR_UNREFERENCED_PARAMETER(ui32Flags);
	return PVRSRV_OK;
}


#ifdef INLINE_IS_PRAGMA
#pragma inline(PDumpSetDefaultCaptureParamsKM)
#endif
static INLINE PVRSRV_ERROR
PDumpSetDefaultCaptureParamsKM(IMG_UINT32 ui32Mode,
                              IMG_UINT32 ui32Start,
                              IMG_UINT32 ui32End,
                              IMG_UINT32 ui32Interval,
                              IMG_UINT32 ui32MaxParamFileSize)
{
	PVR_UNREFERENCED_PARAMETER(ui32Mode);
	PVR_UNREFERENCED_PARAMETER(ui32Start);
	PVR_UNREFERENCED_PARAMETER(ui32End);
	PVR_UNREFERENCED_PARAMETER(ui32Interval);
	PVR_UNREFERENCED_PARAMETER(ui32MaxParamFileSize);

	return PVRSRV_OK;
}


#ifdef INLINE_IS_PRAGMA
#pragma inline(PDumpPanic)
#endif
static INLINE PVRSRV_ERROR
PDumpPanic(IMG_UINT32      ui32PanicNo,
		   IMG_CHAR*       pszPanicMsg,
		   const IMG_CHAR* pszPPFunc,
		   IMG_UINT32      ui32PPline)
{
	PVR_UNREFERENCED_PARAMETER(ui32PanicNo);
	PVR_UNREFERENCED_PARAMETER(pszPanicMsg);
	PVR_UNREFERENCED_PARAMETER(pszPPFunc);
	PVR_UNREFERENCED_PARAMETER(ui32PPline);
	return PVRSRV_OK;
}

#ifdef INLINE_IS_PRAGMA
#pragma inline(PDumpCaptureError)
#endif
static INLINE PVRSRV_ERROR
PDumpCaptureError(PVRSRV_ERROR    ui32ErrorNo,
                  IMG_CHAR*       pszErrorMsg,
                  const IMG_CHAR* pszPPFunc,
                  IMG_UINT32      ui32PPline)
{
	PVR_UNREFERENCED_PARAMETER(ui32ErrorNo);
	PVR_UNREFERENCED_PARAMETER(pszErrorMsg);
	PVR_UNREFERENCED_PARAMETER(pszPPFunc);
	PVR_UNREFERENCED_PARAMETER(ui32PPline);
	return PVRSRV_OK;
}

#ifdef INLINE_IS_PRAGMA
#pragma inline(PDumpIsLastCaptureFrameKM)
#endif
static INLINE PVRSRV_ERROR
PDumpIsLastCaptureFrameKM(IMG_BOOL *pbIsLastCaptureFrame)
{
	*pbIsLastCaptureFrame = IMG_FALSE;
	return PVRSRV_OK;
}

#ifdef INLINE_IS_PRAGMA
#pragma inline(PDumpGetStateKM)
#endif
static INLINE PVRSRV_ERROR
PDumpGetStateKM(IMG_UINT64 *ui64State)
{
	*ui64State = 0;
	return PVRSRV_OK;
}

#ifdef INLINE_IS_PRAGMA
#pragma inline(PDumpIsCaptureFrameKM)
#endif
static INLINE PVRSRV_ERROR
PDumpIsCaptureFrameKM(IMG_BOOL *bIsCapturing)
{
	*bIsCapturing = IMG_FALSE;
	return PVRSRV_OK;
}

#ifdef INLINE_IS_PRAGMA
#pragma inline(PDumpGetCurrentBlockKM)
#endif
static INLINE PVRSRV_ERROR
PDumpGetCurrentBlockKM(IMG_UINT32 *pui32BlockNum)
{
	*pui32BlockNum = PDUMP_BLOCKNUM_INVALID;
	return PVRSRV_OK;
}

#ifdef INLINE_IS_PRAGMA
#pragma inline(PDumpForceCaptureStopKM)
#endif
static INLINE PVRSRV_ERROR
PDumpForceCaptureStopKM(void)
{
	return PVRSRV_OK;
}

#ifdef INLINE_IS_PRAGMA
#pragma inline(PDumpBitmapKM)
#endif
static INLINE PVRSRV_ERROR
PDumpBitmapKM(PVRSRV_DEVICE_NODE *psDeviceNode,
										  IMG_CHAR *pszFileName,
										  IMG_UINT32 ui32FileOffset,
										  IMG_UINT32 ui32Width,
										  IMG_UINT32 ui32Height,
										  IMG_UINT32 ui32StrideInBytes,
										  IMG_DEV_VIRTADDR sDevBaseAddr,
										  IMG_UINT32 ui32MMUContextID,
										  IMG_UINT32 ui32Size,
										  PDUMP_PIXEL_FORMAT ePixelFormat,
										  IMG_UINT32 ui32AddrMode,
										  IMG_UINT32 ui32PDumpFlags)
{
	PVR_UNREFERENCED_PARAMETER(psDeviceNode);
	PVR_UNREFERENCED_PARAMETER(pszFileName);
	PVR_UNREFERENCED_PARAMETER(ui32FileOffset);
	PVR_UNREFERENCED_PARAMETER(ui32Width);
	PVR_UNREFERENCED_PARAMETER(ui32Height);
	PVR_UNREFERENCED_PARAMETER(ui32StrideInBytes);
	PVR_UNREFERENCED_PARAMETER(sDevBaseAddr);
	PVR_UNREFERENCED_PARAMETER(ui32MMUContextID);
	PVR_UNREFERENCED_PARAMETER(ui32Size);
	PVR_UNREFERENCED_PARAMETER(ePixelFormat);
	PVR_UNREFERENCED_PARAMETER(ui32AddrMode);
	PVR_UNREFERENCED_PARAMETER(ui32PDumpFlags);
	return PVRSRV_OK;
}

#ifdef INLINE_IS_PRAGMA
#pragma inline(PDumpImageDescriptor)
#endif
static INLINE PVRSRV_ERROR
PDumpImageDescriptor(PVRSRV_DEVICE_NODE *psDeviceNode,
					   IMG_UINT32 ui32MMUContextID,
					   IMG_CHAR *pszSABFileName,
					   IMG_DEV_VIRTADDR sData,
					   IMG_UINT32 ui32DataSize,
					   IMG_UINT32 ui32LogicalWidth,
					   IMG_UINT32 ui32LogicalHeight,
					   IMG_UINT32 ui32PhysicalWidth,
					   IMG_UINT32 ui32PhysicalHeight,
					   PDUMP_PIXEL_FORMAT ePixFmt,
					   IMG_MEMLAYOUT eMemLayout,
					   IMG_FB_COMPRESSION eFBCompression,
					   const IMG_UINT32 *paui32FBCClearColour,
					   PDUMP_FBC_SWIZZLE eFBCSwizzle,
					   IMG_DEV_VIRTADDR sHeader,
					   IMG_UINT32 ui32HeaderSize,
					   IMG_UINT32 ui32PDumpFlags)
{
	PVR_UNREFERENCED_PARAMETER(psDeviceNode);
	PVR_UNREFERENCED_PARAMETER(ui32MMUContextID);
	PVR_UNREFERENCED_PARAMETER(pszSABFileName);
	PVR_UNREFERENCED_PARAMETER(sData);
	PVR_UNREFERENCED_PARAMETER(ui32DataSize);
	PVR_UNREFERENCED_PARAMETER(ui32LogicalWidth);
	PVR_UNREFERENCED_PARAMETER(ui32LogicalHeight);
	PVR_UNREFERENCED_PARAMETER(ui32PhysicalWidth);
	PVR_UNREFERENCED_PARAMETER(ui32PhysicalHeight);
	PVR_UNREFERENCED_PARAMETER(ePixFmt);
	PVR_UNREFERENCED_PARAMETER(eMemLayout);
	PVR_UNREFERENCED_PARAMETER(eFBCompression);
	PVR_UNREFERENCED_PARAMETER(paui32FBCClearColour);
	PVR_UNREFERENCED_PARAMETER(eFBCSwizzle);
	PVR_UNREFERENCED_PARAMETER(sHeader);
	PVR_UNREFERENCED_PARAMETER(ui32HeaderSize);
	PVR_UNREFERENCED_PARAMETER(ui32PDumpFlags);
	return PVRSRV_OK;
}

#ifdef INLINE_IS_PRAGMA
#pragma inline(PDumpDataDescriptor)
#endif
static INLINE PVRSRV_ERROR
PDumpDataDescriptor(PVRSRV_DEVICE_NODE *psDeviceNode,
					   IMG_UINT32 ui32MMUContextID,
					   IMG_CHAR *pszSABFileName,
					   IMG_DEV_VIRTADDR sData,
					   IMG_UINT32 ui32DataSize,
					   IMG_UINT32 ui32ElementType,
					   IMG_UINT32 ui32ElementCount,
					   IMG_UINT32 ui32PDumpFlags)
{
	PVR_UNREFERENCED_PARAMETER(psDeviceNode);
	PVR_UNREFERENCED_PARAMETER(ui32MMUContextID);
	PVR_UNREFERENCED_PARAMETER(pszSABFileName);
	PVR_UNREFERENCED_PARAMETER(sData);
	PVR_UNREFERENCED_PARAMETER(ui32DataSize);
	PVR_UNREFERENCED_PARAMETER(ui32ElementType);
	PVR_UNREFERENCED_PARAMETER(ui32ElementCount);
	PVR_UNREFERENCED_PARAMETER(ui32PDumpFlags);
	return PVRSRV_OK;
}

#ifdef INLINE_IS_PRAGMA
#pragma inline(PDumpRegisterConnection)
#endif
static INLINE PVRSRV_ERROR
PDumpRegisterConnection(void *hSyncPrivData,
		                 PFN_PDUMP_SYNCBLOCKS pfnPDumpSyncBlocks,
	                     PDUMP_CONNECTION_DATA **ppsPDumpConnectionData)
{
	PVR_UNREFERENCED_PARAMETER(hSyncPrivData);
	PVR_UNREFERENCED_PARAMETER(pfnPDumpSyncBlocks);
	PVR_UNREFERENCED_PARAMETER(ppsPDumpConnectionData);

	return PVRSRV_OK;
}

#ifdef INLINE_IS_PRAGMA
#pragma inline(PDumpUnregisterConnection)
#endif
static INLINE
void PDumpUnregisterConnection(PDUMP_CONNECTION_DATA *psPDumpConnectionData)
{
	PVR_UNREFERENCED_PARAMETER(psPDumpConnectionData);
}

#ifdef INLINE_IS_PRAGMA
#pragma inline(PDumpRegisterTransitionCallback)
#endif
static INLINE
PVRSRV_ERROR PDumpRegisterTransitionCallback(PDUMP_CONNECTION_DATA *psPDumpConnectionData,
											  PFN_PDUMP_TRANSITION pfnCallback,
											  void *hPrivData,
											  void *pvDevice,
											  void **ppvHandle)
{
	PVR_UNREFERENCED_PARAMETER(psPDumpConnectionData);
	PVR_UNREFERENCED_PARAMETER(pfnCallback);
	PVR_UNREFERENCED_PARAMETER(hPrivData);
	PVR_UNREFERENCED_PARAMETER(pvDevice);
	PVR_UNREFERENCED_PARAMETER(ppvHandle);

	return PVRSRV_OK;
}

#ifdef INLINE_IS_PRAGMA
#pragma inline(PDumpUnregisterTransitionCallback)
#endif
static INLINE
void PDumpUnregisterTransitionCallback(void *pvHandle)
{
	PVR_UNREFERENCED_PARAMETER(pvHandle);
}

#ifdef INLINE_IS_PRAGMA
#pragma inline(PDumpTransition)
#endif
static INLINE
PVRSRV_ERROR PDumpTransition(PDUMP_CONNECTION_DATA *psPDumpConnectionData, PDUMP_TRANSITION_EVENT eEvent, IMG_UINT32 ui32PDumpFlags)
{
	PVR_UNREFERENCED_PARAMETER(psPDumpConnectionData);
	PVR_UNREFERENCED_PARAMETER(eEvent);
	PVR_UNREFERENCED_PARAMETER(ui32PDumpFlags);
	return PVRSRV_OK;
}

	#if defined LINUX || defined GCC_IA32 || defined GCC_ARM || defined __QNXNTO__ || defined(INTEGRITY_OS)
		#define PDUMPINIT	PDumpInitCommon
		#define PDUMPDEINIT(args...)
		#define PDUMPREG32(args...)
		#define PDUMPREG64(args...)
		#define PDUMPREGREAD32(args...)
		#define PDUMPREGREAD64(args...)
		#define PDUMPCOMMENT(args...)
		#define PDUMPREGPOL(args...)
		#define PDUMPPDREG(args...)
		#define PDUMPPDREGWITHFLAGS(args...)
		#define PDUMPSYNC(args...)
		#define PDUMPCOPYTOMEM(args...)
		#define PDUMPWRITE(args...)
		#define PDUMPREGBASEDCBP(args...)
		#define PDUMPCOMMENTWITHFLAGS(args...)
		#define PDUMPENDINITPHASE(args...)
		#define PDUMPIDLWITHFLAGS(args...)
		#define PDUMPIDL(args...)
		#define PDUMPPOWCMDSTART(args...)
		#define PDUMPPOWCMDEND(args...)
		#define PDUMP_LOCK(args...)
		#define PDUMP_UNLOCK(args...)

	#else
		#error Compiler not specified
	#endif
#endif


#endif /* PDUMP_KM_H */

/******************************************************************************
 End of file (pdump_km.h)
******************************************************************************/
