IMG_EXPORT
PVRSRV_ERROR PVRSRVPDumpTraceBufferKM(PVRSRV_DEVICE_NODE	*psDeviceNode,
									  IMG_UINT32			ui32PDumpFlags)
{	
	PVRSRV_RGXDEV_INFO	*psDevInfo = psDeviceNode->pvDevice;

	/* Dump trace buffers */
	PDumpCommentWithFlags(ui32PDumpFlags, "** Dump trace buffers");
	DevmemPDumpSaveToFileVirtual(psDevInfo->psRGXFWIfTraceBufCtlMemDesc,
								offsetof(RGXFWIF_TRACEBUF, sTraceBuf),
								RGXFW_THREAD_NUM * 
								   ( 1 * sizeof(IMG_UINT32) 
								    +RGXFW_TRACE_BUFFER_SIZE * sizeof(IMG_UINT32) 
								    +RGXFW_TRACE_BUFFER_ASSERT_SIZE * sizeof(IMG_CHAR)),
								"out.trace",
								0,
								ui32PDumpFlags);

	/* Dump hwperf buffer */
	PDumpCommentWithFlags(ui32PDumpFlags, "** Dump HWPerf Buffer");
	DevmemPDumpSaveToFileVirtual(psDevInfo->psRGXFWIfHWPerfBufCtlMemDesc,
								 0,
								 psDevInfo->ui32RGXFWIfHWPerfBufSize,
								 "out.hwperf",
								 0,
								 ui32PDumpFlags);
	return PVRSRV_OK;
}
/*
 * PVRSRVPDumpSignatureBufferKM
 */
PVRSRV_ERROR PVRSRVPDumpSignatureBufferKM(PVRSRV_DEVICE_NODE	*psDeviceNode,
										  IMG_UINT32			ui32PDumpFlags)
{	
	PVRSRV_RGXDEV_INFO	*psDevInfo = psDeviceNode->pvDevice;

	/* TA signatures */
	PDumpCommentWithFlags(ui32PDumpFlags, "** Dump TA signatures and checksums Buffer");
	 
	DevmemPDumpSaveToFileVirtual(psDevInfo->psRGXFWSigTAChecksMemDesc,
								 0,
								 psDevInfo->ui32SigTAChecksSize,
								 "out.tasig",
								 0,
								 ui32PDumpFlags);

	/* 3D signatures */
	PDumpCommentWithFlags(ui32PDumpFlags, "** Dump 3D signatures and checksums Buffer");
	DevmemPDumpSaveToFileVirtual(psDevInfo->psRGXFWSig3DChecksMemDesc,
								 0,
								 psDevInfo->ui32Sig3DChecksSize,
								 "out.3dsig",
								 0,
								 ui32PDumpFlags);

	return PVRSRV_OK;
}
示例#3
0
PVRSRV_ERROR PDumpHWPerfCBKM(char *pszFileName,
			     u32 ui32FileOffset,
			     IMG_DEV_VIRTADDR sDevBaseAddr,
			     u32 ui32Size, u32 ui32PDumpFlags)
{
	PVRSRV_ERROR eErr;
	PDUMP_GET_SCRIPT_STRING();
	PDumpCommentWithFlags(ui32PDumpFlags,
			      "\r\n-- Dump Hardware Performance Circular Buffer\r\n");

	eErr = PDumpOSBufprintf(hScript, ui32MaxLen,
#if defined(SGX_FEATURE_MULTIPLE_MEM_CONTEXTS)
				"SAB :SGXMEM:v%x:0x%08lX 0x%08lX 0x%08lX %s.bin\r\n",
				PDUMP_DATAMASTER_EDM,
#else
				"SAB :SGXMEM:v:0x%08lX 0x%08lX 0x%08lX %s.bin\r\n",
#endif
				sDevBaseAddr.uiAddr,
				ui32Size, ui32FileOffset, pszFileName);
	if (eErr != PVRSRV_OK) {
		return eErr;
	}

	PDumpOSWriteString2(hScript, ui32PDumpFlags);
	return PVRSRV_OK;
}
示例#4
0
PVRSRV_ERROR PDumpTASignatureRegisters(u32 ui32DumpFrameNum,
				       u32 ui32TAKickCount,
				       int bLastFrame,
				       u32 * pui32Registers,
				       u32 ui32NumRegisters)
{
	PVRSRV_ERROR eErr;
	u32 ui32FileOffset, ui32Flags;

	PDUMP_GET_FILE_STRING();

	ui32Flags = bLastFrame ? PDUMP_FLAGS_LASTFRAME : 0;
	ui32FileOffset = ui32TAKickCount * ui32NumRegisters * sizeof(u32);

	PDumpCommentWithFlags(ui32Flags,
			      "\r\n-- Dump TA signature registers\r\n");
	eErr =
	    PDumpOSSprintf(pszFileName, ui32MaxLen, "out%lu_ta.sig",
			   ui32DumpFrameNum);
	if (eErr != PVRSRV_OK) {
		return eErr;
	}

	PDumpRegisterRange(pszFileName, pui32Registers, ui32NumRegisters,
			   &ui32FileOffset, sizeof(u32), ui32Flags);
	return PVRSRV_OK;
}
static void
pdump_mem_print(u32 ui32Flags, struct PVRSRV_KERNEL_MEM_INFO *psMemInfo,
		u32 ui32Offset, u32 ui32Bytes, void *hUniqueTag)
{
	struct IMG_DEV_VIRTADDR sDevVPageAddr;
	struct IMG_DEV_PHYADDR sDevPAddr;
	u32 ui32PageOffset;

	PDumpCommentWithFlags(ui32Flags, "LDB :SGXMEM:VA_%8.8X:0x%8.8X "
			      "0x%8.8X\r\n",
			      psMemInfo->sDevVAddr.uiAddr, ui32Offset,
			      ui32Bytes);

	ui32PageOffset =
		(psMemInfo->sDevVAddr.uiAddr + ui32Offset) & ~PAGE_MASK;

	while (ui32Bytes) {
		u32 ui32BlockBytes =
			min(ui32Bytes, (u32)PAGE_SIZE - ui32PageOffset);

		sDevVPageAddr.uiAddr =
			psMemInfo->sDevVAddr.uiAddr + ui32Offset;
		BM_GetPhysPageAddr(psMemInfo, sDevVPageAddr, &sDevPAddr);

		pdump_print(ui32Flags, "LDB :SGXMEM:PA_%8.8X%8.8lX:0x%8.8lX"
			    " 0x%8.8X\r\n", (u32) hUniqueTag,
			    sDevPAddr.uiAddr, ui32PageOffset,
			    ui32BlockBytes);

		ui32PageOffset = 0;
		ui32Bytes -= ui32BlockBytes;
		ui32Offset += ui32BlockBytes;
	}
}
void PDumpHWPerfCBKM(char *pszFileName, u32 ui32FileOffset,
		     struct IMG_DEV_VIRTADDR sDevBaseAddr, u32 ui32Size,
		     u32 ui32PDumpFlags)
{
	PDumpCommentWithFlags(ui32PDumpFlags,
			      "Dump Hardware Performance Circular Buffer\r\n");
	pdump_print(ui32PDumpFlags,
		    "SAB :SGXMEM:v:0x%08X 0x%08X 0x%08X %s.bin\r\n",
		    sDevBaseAddr.uiAddr, ui32Size, ui32FileOffset, pszFileName);
}
void PDumpCounterRegisters(u32 ui32DumpFrameNum,
			   u32 *pui32Registers, u32 ui32NumRegisters)
{
	u32 i;

	PDumpCommentWithFlags(0, "Dump counter registers\r\n");
	snprintf(gpszFile, SZ_FILENAME_SIZE_MAX, "out%u.perf",
		 ui32DumpFrameNum);

	for (i = 0; i < ui32NumRegisters; i++)
		PDumpReadRegKM(gpszFile, i * sizeof(u32), pui32Registers[i]);
}
示例#8
0
PVRSRV_ERROR PDumpBitmapKM(char *pszFileName,
			   u32 ui32FileOffset,
			   u32 ui32Width,
			   u32 ui32Height,
			   u32 ui32StrideInBytes,
			   IMG_DEV_VIRTADDR sDevBaseAddr,
			   u32 ui32Size,
			   PDUMP_PIXEL_FORMAT ePixelFormat,
			   PDUMP_MEM_FORMAT eMemFormat, u32 ui32PDumpFlags)
{
	PVRSRV_ERROR eErr;
	PDUMP_GET_SCRIPT_STRING();
	PDumpCommentWithFlags(ui32PDumpFlags,
			      "\r\n-- Dump bitmap of render\r\n");

#if defined(SGX_FEATURE_MULTIPLE_MEM_CONTEXTS)

	eErr = PDumpOSBufprintf(hScript,
				ui32MaxLen,
				"SII %s %s.bin :SGXMEM:v%x:0x%08lX 0x%08lX 0x%08lX 0x%08X 0x%08lX 0x%08lX 0x%08lX 0x%08X\r\n",
				pszFileName,
				pszFileName,
				PDUMP_DATAMASTER_PIXEL,
				sDevBaseAddr.uiAddr,
				ui32Size,
				ui32FileOffset,
				ePixelFormat,
				ui32Width,
				ui32Height, ui32StrideInBytes, eMemFormat);
#else
	eErr = PDumpOSBufprintf(hScript,
				ui32MaxLen,
				"SII %s %s.bin :SGXMEM:v:0x%08lX 0x%08lX 0x%08lX 0x%08X 0x%08lX 0x%08lX 0x%08lX 0x%08X\r\n",
				pszFileName,
				pszFileName,
				sDevBaseAddr.uiAddr,
				ui32Size,
				ui32FileOffset,
				ePixelFormat,
				ui32Width,
				ui32Height, ui32StrideInBytes, eMemFormat);
#endif
	if (eErr != PVRSRV_OK) {
		return eErr;
	}

	PDumpOSWriteString2(hScript, ui32PDumpFlags);
	return PVRSRV_OK;
}
void PDumpTASignatureRegisters(u32 ui32DumpFrameNum, u32 ui32TAKickCount,
			       u32 *pui32Registers, u32 ui32NumRegisters)
{
	u32 i, ui32FileOffset;

	PDumpCommentWithFlags(0, "Dump TA signature registers\r\n");
	snprintf(gpszFile, SZ_FILENAME_SIZE_MAX, "out%u_ta.sig",
		 ui32DumpFrameNum);

	ui32FileOffset = ui32TAKickCount * ui32NumRegisters * sizeof(u32);

	for (i = 0; i < ui32NumRegisters; i++)
		PDumpReadRegKM(gpszFile, ui32FileOffset + i * sizeof(u32),
			       pui32Registers[i]);
}
void PDumpBitmapKM(char *pszFileName, u32 ui32FileOffset,
		   u32 ui32Width, u32 ui32Height, u32 ui32StrideInBytes,
		   struct IMG_DEV_VIRTADDR sDevBaseAddr,
		   u32 ui32Size, enum PDUMP_PIXEL_FORMAT ePixelFormat,
		   enum PDUMP_MEM_FORMAT eMemFormat, u32 ui32PDumpFlags)
{
	PDumpCommentWithFlags(ui32PDumpFlags, "Dump bitmap of render\r\n");

	pdump_print(ui32PDumpFlags,
		    "SII %s %s.bin :SGXMEM:v:0x%08X 0x%08X "
		    "0x%08X 0x%08X 0x%08X 0x%08X 0x%08X 0x%08X\r\n",
		    pszFileName, pszFileName, sDevBaseAddr.uiAddr, ui32Size,
		    ui32FileOffset, ePixelFormat, ui32Width, ui32Height,
		    ui32StrideInBytes, eMemFormat);
}
示例#11
0
PVRSRV_ERROR PDumpCounterRegisters(u32 ui32DumpFrameNum,
				   int bLastFrame,
				   u32 * pui32Registers, u32 ui32NumRegisters)
{
	PVRSRV_ERROR eErr;
	u32 ui32FileOffset, ui32Flags;

	PDUMP_GET_FILE_STRING();

	ui32Flags = bLastFrame ? PDUMP_FLAGS_LASTFRAME : 0UL;
	ui32FileOffset = 0UL;

	PDumpCommentWithFlags(ui32Flags, "\r\n-- Dump counter registers\r\n");
	eErr =
	    PDumpOSSprintf(pszFileName, ui32MaxLen, "out%lu.perf",
			   ui32DumpFrameNum);
	if (eErr != PVRSRV_OK) {
		return eErr;
	}

	PDumpRegisterRange(pszFileName, pui32Registers, ui32NumRegisters,
			   &ui32FileOffset, sizeof(u32), ui32Flags);
	return PVRSRV_OK;
}
示例#12
0
PVRSRV_ERROR PDumpMemUM(PVRSRV_PER_PROCESS_DATA * psPerProc,
			void *pvAltLinAddrUM,
			void *pvLinAddrUM,
			PVRSRV_KERNEL_MEM_INFO * psMemInfo,
			u32 ui32Offset,
			u32 ui32Bytes, u32 ui32Flags, void *hUniqueTag)
{
	void *pvAddrUM;
	void *pvAddrKM;
	u32 ui32BytesDumped;
	u32 ui32CurrentOffset;

	if (psMemInfo->pvLinAddrKM != NULL && pvAltLinAddrUM == NULL) {

		return PDumpMemKM(NULL,
				  psMemInfo,
				  ui32Offset, ui32Bytes, ui32Flags, hUniqueTag);
	}

	pvAddrUM =
	    (pvAltLinAddrUM !=
	     NULL) ? pvAltLinAddrUM : ((pvLinAddrUM !=
					NULL) ? VPTR_PLUS(pvLinAddrUM,
							  ui32Offset) : NULL);

	pvAddrKM = GetTempBuffer();

	PVR_ASSERT(pvAddrUM != NULL && pvAddrKM != NULL);
	if (pvAddrUM == NULL || pvAddrKM == NULL) {
		PVR_DPF((PVR_DBG_ERROR, "PDumpMemUM: Nothing to dump"));
		return PVRSRV_ERROR_GENERIC;
	}

	if (ui32Bytes > PDUMP_TEMP_BUFFER_SIZE) {
		PDumpCommentWithFlags(ui32Flags,
				      "Dumping 0x%8.8lx bytes of memory, in blocks of 0x%8.8lx bytes",
				      ui32Bytes, (u32) PDUMP_TEMP_BUFFER_SIZE);
	}

	ui32CurrentOffset = ui32Offset;
	for (ui32BytesDumped = 0; ui32BytesDumped < ui32Bytes;) {
		PVRSRV_ERROR eError;
		u32 ui32BytesToDump =
		    MIN(PDUMP_TEMP_BUFFER_SIZE, ui32Bytes - ui32BytesDumped);

		eError = OSCopyFromUser(psPerProc,
					pvAddrKM, pvAddrUM, ui32BytesToDump);
		if (eError != PVRSRV_OK) {
			PVR_DPF((PVR_DBG_ERROR,
				 "PDumpMemUM: OSCopyFromUser failed (%d), eError"));
			return PVRSRV_ERROR_GENERIC;
		}

		eError = PDumpMemKM(pvAddrKM,
				    psMemInfo,
				    ui32CurrentOffset,
				    ui32BytesToDump, ui32Flags, hUniqueTag);

		if (eError != PVRSRV_OK) {

			if (ui32BytesDumped != 0) {
				PVR_DPF((PVR_DBG_ERROR,
					 "PDumpMemUM: PDumpMemKM failed (%d)",
					 eError));
			}
			PVR_ASSERT(ui32BytesDumped == 0);
			return eError;
		}

		VPTR_INC(pvAddrUM, ui32BytesToDump);
		ui32CurrentOffset += ui32BytesToDump;
		ui32BytesDumped += ui32BytesToDump;
	}

	return PVRSRV_OK;
}