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; }
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; }
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]); }
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); }
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; }
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; }