1 /**********************************************************************
3 * Copyright(c) 2008 Imagination Technologies Ltd. All rights reserved.
5 * This program is free software; you can redistribute it and/or modify it
6 * under the terms and conditions of the GNU General Public License,
7 * version 2, as published by the Free Software Foundation.
9 * This program is distributed in the hope it will be useful but, except
10 * as otherwise stated in writing, without any warranty; without even the
11 * implied warranty of merchantability or fitness for a particular purpose.
12 * See the GNU General Public License for more details.
14 * You should have received a copy of the GNU General Public License along with
15 * this program; if not, write to the Free Software Foundation, Inc.,
16 * 51 Franklin St - Fifth Floor, Boston, MA 02110-1301 USA.
18 * The full GNU General Public License is included in this distribution in
19 * the file called "COPYING".
21 * Contact Information:
22 * Imagination Technologies Ltd. <gpl-support@imgtec.com>
23 * Home Park Estate, Kings Langley, Herts, WD4 8LZ, UK
25 ******************************************************************************/
28 #include <asm/atomic.h>
31 #include "services_headers.h"
33 #include "pvrversion.h"
34 #include "pvr_debug.h"
41 #include <linux/tty.h>
43 static IMG_BOOL PDumpWriteString2(char *pszString, u32 ui32Flags);
44 static IMG_BOOL PDumpWriteILock(struct DBG_STREAM *psStream, u8 *pui8Data,
45 u32 ui32Count, u32 ui32Flags);
46 static void DbgSetFrame(struct DBG_STREAM *psStream, u32 ui32Frame);
47 static u32 DbgGetFrame(struct DBG_STREAM *psStream);
48 static void DbgSetMarker(struct DBG_STREAM *psStream, u32 ui32Marker);
49 static u32 DbgWrite(struct DBG_STREAM *psStream, u8 *pui8Data,
50 u32 ui32BCount, u32 ui32Flags);
52 #define PDUMP_DATAMASTER_PIXEL 1
54 #define MIN(a, b) (a > b ? b : a)
56 #define MAX_FILE_SIZE 0x40000000
58 static atomic_t gsPDumpSuspended = ATOMIC_INIT(0);
60 static struct DBGKM_SERVICE_TABLE *gpfnDbgDrv;
62 #define PDUMP_STREAM_PARAM2 0
63 #define PDUMP_STREAM_SCRIPT2 1
64 #define PDUMP_STREAM_DRIVERINFO 2
65 #define PDUMP_NUM_STREAMS 3
67 static char *pszStreamName[PDUMP_NUM_STREAMS] = { "ParamStream2",
72 #define __PDBG_PDUMP_STATE_GET_MSG_STRING(ERROR) \
73 char *pszMsg = gsDBGPdumpState.pszMsg; \
74 if ((!pszMsg) || PDumpSuspended()) \
77 #define __PDBG_PDUMP_STATE_GET_SCRIPT_STRING(ERROR) \
78 char *pszScript = gsDBGPdumpState.pszScript; \
79 if ((!pszScript) || PDumpSuspended()) \
82 #define __PDBG_PDUMP_STATE_GET_SCRIPT_AND_FILE_STRING(ERROR) \
83 char *pszScript = gsDBGPdumpState.pszScript; \
84 char *pszFile = gsDBGPdumpState.pszFile; \
85 if ((!pszScript) || (!pszFile) || PDumpSuspended()) \
88 struct PDBG_PDUMP_STATE {
89 struct DBG_STREAM *psStream[PDUMP_NUM_STREAMS];
98 static struct PDBG_PDUMP_STATE gsDBGPdumpState = {
99 {NULL}, 0, NULL, NULL, NULL
102 #define SZ_MSG_SIZE_MAX (PVRSRV_PDUMP_MAX_COMMENT_SIZE - 1)
103 #define SZ_SCRIPT_SIZE_MAX (PVRSRV_PDUMP_MAX_COMMENT_SIZE - 1)
104 #define SZ_FILENAME_SIZE_MAX (PVRSRV_PDUMP_MAX_COMMENT_SIZE - 1)
106 static inline IMG_BOOL PDumpSuspended(void)
108 return atomic_read(&gsPDumpSuspended) != 0;
116 DBGDrvGetServiceTable((void **) &gpfnDbgDrv);
118 if (gpfnDbgDrv == NULL)
121 if (!gsDBGPdumpState.pszFile)
122 if (OSAllocMem(PVRSRV_OS_PAGEABLE_HEAP,
123 SZ_FILENAME_SIZE_MAX,
124 (void **)&gsDBGPdumpState.pszFile,
128 if (!gsDBGPdumpState.pszMsg)
129 if (OSAllocMem(PVRSRV_OS_PAGEABLE_HEAP,
131 (void **)&gsDBGPdumpState.pszMsg,
135 if (!gsDBGPdumpState.pszScript)
136 if (OSAllocMem(PVRSRV_OS_PAGEABLE_HEAP,
138 (void **)&gsDBGPdumpState.pszScript,
142 for (i = 0; i < PDUMP_NUM_STREAMS; i++) {
143 gsDBGPdumpState.psStream[i] =
144 gpfnDbgDrv->pfnCreateStream(pszStreamName[i],
145 DEBUG_CAPMODE_FRAMED,
146 DEBUG_OUTMODE_STREAMENABLE,
149 gpfnDbgDrv->pfnSetCaptureMode(gsDBGPdumpState.
151 DEBUG_CAPMODE_FRAMED,
152 0xFFFFFFFF, 0xFFFFFFFF,
154 gpfnDbgDrv->pfnSetFrame(gsDBGPdumpState.psStream[i], 0);
157 PDUMPCOMMENT("Driver Product Name: %s", VS_PRODUCT_NAME);
158 PDUMPCOMMENT("Driver Product Version: %s (%s)",
159 PVRVERSION_STRING, PVRVERSION_FILE);
160 PDUMPCOMMENT("Start of Init Phase");
167 if (gsDBGPdumpState.pszFile) {
168 OSFreeMem(PVRSRV_OS_PAGEABLE_HEAP, SZ_FILENAME_SIZE_MAX,
169 (void *)gsDBGPdumpState.pszFile, NULL);
170 gsDBGPdumpState.pszFile = NULL;
173 if (gsDBGPdumpState.pszScript) {
174 OSFreeMem(PVRSRV_OS_PAGEABLE_HEAP, SZ_SCRIPT_SIZE_MAX,
175 (void *)gsDBGPdumpState.pszScript, NULL);
176 gsDBGPdumpState.pszScript = NULL;
179 if (gsDBGPdumpState.pszMsg) {
180 OSFreeMem(PVRSRV_OS_PAGEABLE_HEAP, SZ_MSG_SIZE_MAX,
181 (void *)gsDBGPdumpState.pszMsg, NULL);
182 gsDBGPdumpState.pszMsg = NULL;
188 void PDumpDeInit(void)
192 for (i = 0; i < PDUMP_NUM_STREAMS; i++)
193 gpfnDbgDrv->pfnDestroyStream(gsDBGPdumpState.psStream[i]);
195 if (gsDBGPdumpState.pszFile) {
196 OSFreeMem(PVRSRV_OS_PAGEABLE_HEAP, SZ_FILENAME_SIZE_MAX,
197 (void *)gsDBGPdumpState.pszFile, NULL);
198 gsDBGPdumpState.pszFile = NULL;
201 if (gsDBGPdumpState.pszScript) {
202 OSFreeMem(PVRSRV_OS_PAGEABLE_HEAP, SZ_SCRIPT_SIZE_MAX,
203 (void *)gsDBGPdumpState.pszScript, NULL);
204 gsDBGPdumpState.pszScript = NULL;
207 if (gsDBGPdumpState.pszMsg) {
208 OSFreeMem(PVRSRV_OS_PAGEABLE_HEAP, SZ_MSG_SIZE_MAX,
209 (void *)gsDBGPdumpState.pszMsg, NULL);
210 gsDBGPdumpState.pszMsg = NULL;
216 enum PVRSRV_ERROR PDumpStartInitPhaseKM(void)
221 PDUMPCOMMENT("Start Init Phase");
222 for (i = 0; i < PDUMP_NUM_STREAMS; i++)
223 gpfnDbgDrv->pfnStartInitPhase(gsDBGPdumpState.
229 enum PVRSRV_ERROR PDumpStopInitPhaseKM(void)
234 PDUMPCOMMENT("Stop Init Phase");
236 for (i = 0; i < PDUMP_NUM_STREAMS; i++)
237 gpfnDbgDrv->pfnStopInitPhase(gsDBGPdumpState.
243 void PDumpComment(char *pszFormat, ...)
247 __PDBG_PDUMP_STATE_GET_MSG_STRING();
249 va_start(ap, pszFormat);
250 vsnprintf(pszMsg, SZ_MSG_SIZE_MAX, pszFormat, ap);
253 PDumpCommentKM(pszMsg, PDUMP_FLAGS_CONTINUOUS);
256 void PDumpCommentWithFlags(u32 ui32Flags, char *pszFormat, ...)
260 __PDBG_PDUMP_STATE_GET_MSG_STRING();
262 va_start(ap, pszFormat);
263 vsnprintf(pszMsg, SZ_MSG_SIZE_MAX, pszFormat, ap);
266 PDumpCommentKM(pszMsg, ui32Flags);
269 IMG_BOOL PDumpIsLastCaptureFrameKM(void)
271 return gpfnDbgDrv->pfnIsLastCaptureFrame(
272 gsDBGPdumpState.psStream[PDUMP_STREAM_SCRIPT2]);
275 IMG_BOOL PDumpIsCaptureFrameKM(void)
277 if (PDumpSuspended())
279 return gpfnDbgDrv->pfnIsCaptureFrame(gsDBGPdumpState.
280 psStream[PDUMP_STREAM_SCRIPT2],
284 enum PVRSRV_ERROR PDumpRegWithFlagsKM(u32 ui32Reg, u32 ui32Data, u32 ui32Flags)
286 __PDBG_PDUMP_STATE_GET_SCRIPT_STRING(PVRSRV_ERROR_GENERIC);
288 snprintf(pszScript, SZ_SCRIPT_SIZE_MAX,
289 "WRW :SGXREG:0x%8.8X 0x%8.8X\r\n", ui32Reg, ui32Data);
290 PDumpWriteString2(pszScript, ui32Flags);
295 void PDumpReg(u32 ui32Reg, u32 ui32Data)
297 __PDBG_PDUMP_STATE_GET_SCRIPT_STRING();
299 snprintf(pszScript, SZ_SCRIPT_SIZE_MAX,
300 "WRW :SGXREG:0x%8.8X 0x%8.8X\r\n", ui32Reg, ui32Data);
301 PDumpWriteString2(pszScript, PDUMP_FLAGS_CONTINUOUS);
304 enum PVRSRV_ERROR PDumpRegPolWithFlagsKM(u32 ui32RegAddr, u32 ui32RegValue,
305 u32 ui32Mask, u32 ui32Flags)
307 #define POLL_DELAY 1000
308 #define POLL_COUNT_LONG (2000000000 / POLL_DELAY)
309 #define POLL_COUNT_SHORT (1000000 / POLL_DELAY)
312 __PDBG_PDUMP_STATE_GET_SCRIPT_STRING(PVRSRV_ERROR_GENERIC);
314 if (((ui32RegAddr == EUR_CR_EVENT_STATUS) &&
315 (ui32RegValue & ui32Mask &
316 EUR_CR_EVENT_STATUS_TA_FINISHED_MASK)) ||
317 ((ui32RegAddr == EUR_CR_EVENT_STATUS) &&
318 (ui32RegValue & ui32Mask &
319 EUR_CR_EVENT_STATUS_PIXELBE_END_RENDER_MASK)) ||
320 ((ui32RegAddr == EUR_CR_EVENT_STATUS) &&
321 (ui32RegValue & ui32Mask &
322 EUR_CR_EVENT_STATUS_DPM_3D_MEM_FREE_MASK)))
323 ui32PollCount = POLL_COUNT_LONG;
325 ui32PollCount = POLL_COUNT_SHORT;
327 snprintf(pszScript, SZ_SCRIPT_SIZE_MAX,
328 "POL :SGXREG:0x%8.8X 0x%8.8X 0x%8.8X %d %u %d\r\n",
329 ui32RegAddr, ui32RegValue, ui32Mask, 0, ui32PollCount,
331 PDumpWriteString2(pszScript, ui32Flags);
336 enum PVRSRV_ERROR PDumpRegPolKM(u32 ui32RegAddr, u32 ui32RegValue, u32 ui32Mask)
338 return PDumpRegPolWithFlagsKM(ui32RegAddr, ui32RegValue, ui32Mask,
339 PDUMP_FLAGS_CONTINUOUS);
342 void PDumpMallocPages(enum PVRSRV_DEVICE_TYPE eDeviceType, u32 ui32DevVAddr,
343 void *pvLinAddr, void *hOSMemHandle, u32 ui32NumBytes,
344 u32 ui32PageSize, void *hUniqueTag)
348 struct IMG_CPU_PHYADDR sCpuPAddr;
349 struct IMG_DEV_PHYADDR sDevPAddr;
351 __PDBG_PDUMP_STATE_GET_SCRIPT_STRING();
352 PVR_UNREFERENCED_PARAMETER(pvLinAddr);
354 PVR_ASSERT(((u32) ui32DevVAddr & (ui32PageSize - 1)) == 0);
355 PVR_ASSERT(hOSMemHandle);
356 PVR_ASSERT(((u32) ui32NumBytes & (ui32PageSize - 1)) == 0);
358 snprintf(pszScript, SZ_SCRIPT_SIZE_MAX,
359 "-- MALLOC :SGXMEM:VA_%8.8X 0x%8.8X %u\r\n", ui32DevVAddr,
360 ui32NumBytes, ui32PageSize);
361 PDumpWriteString2(pszScript, PDUMP_FLAGS_CONTINUOUS);
364 ui32NumPages = ui32NumBytes / ui32PageSize;
365 while (ui32NumPages--) {
366 sCpuPAddr = OSMemHandleToCpuPAddr(hOSMemHandle, ui32Offset);
367 PVR_ASSERT((sCpuPAddr.uiAddr & (ui32PageSize - 1)) == 0);
368 ui32Offset += ui32PageSize;
369 sDevPAddr = SysCpuPAddrToDevPAddr(eDeviceType, sCpuPAddr);
370 ui32Page = sDevPAddr.uiAddr / ui32PageSize;
372 snprintf(pszScript, SZ_SCRIPT_SIZE_MAX,
373 "MALLOC :SGXMEM:PA_%8.8X%8.8X %u %u 0x%8.8X\r\n",
374 (u32)hUniqueTag, ui32Page * ui32PageSize,
375 ui32PageSize, ui32PageSize, ui32Page * ui32PageSize);
376 PDumpWriteString2(pszScript, PDUMP_FLAGS_CONTINUOUS);
380 void PDumpMallocPageTable(enum PVRSRV_DEVICE_TYPE eDeviceType,
381 void *pvLinAddr, u32 ui32PTSize, void *hUniqueTag)
385 struct IMG_CPU_PHYADDR sCpuPAddr;
386 struct IMG_DEV_PHYADDR sDevPAddr;
388 __PDBG_PDUMP_STATE_GET_SCRIPT_STRING();
390 PVR_ASSERT(((u32) pvLinAddr & (ui32PTSize - 1)) == 0);
392 snprintf(pszScript, SZ_SCRIPT_SIZE_MAX,
393 "-- MALLOC :SGXMEM:PAGE_TABLE 0x%8.8X %lu\r\n", ui32PTSize,
395 PDumpWriteString2(pszScript, PDUMP_FLAGS_CONTINUOUS);
397 pui8LinAddr = (u8 *) pvLinAddr;
401 while (ui32NumPages--) {
402 sCpuPAddr = OSMapLinToCPUPhys(pui8LinAddr);
403 sDevPAddr = SysCpuPAddrToDevPAddr(eDeviceType, sCpuPAddr);
404 ui32Page = sDevPAddr.uiAddr >> SGX_MMU_PAGE_SHIFT;
406 snprintf(pszScript, SZ_SCRIPT_SIZE_MAX,
407 "MALLOC :SGXMEM:PA_%8.8X%8.8lX 0x%lX %lu 0x%8.8lX\r\n",
408 (u32)hUniqueTag, ui32Page * SGX_MMU_PAGE_SIZE,
409 SGX_MMU_PAGE_SIZE, SGX_MMU_PAGE_SIZE,
410 ui32Page * SGX_MMU_PAGE_SIZE);
411 PDumpWriteString2(pszScript, PDUMP_FLAGS_CONTINUOUS);
412 pui8LinAddr += SGX_MMU_PAGE_SIZE;
416 void PDumpFreePages(struct BM_HEAP *psBMHeap, struct IMG_DEV_VIRTADDR sDevVAddr,
417 u32 ui32NumBytes, u32 ui32PageSize, void *hUniqueTag,
418 IMG_BOOL bInterleaved)
420 u32 ui32NumPages, ui32PageCounter;
421 struct IMG_DEV_PHYADDR sDevPAddr;
422 struct PVRSRV_DEVICE_NODE *psDeviceNode;
423 __PDBG_PDUMP_STATE_GET_SCRIPT_STRING();
425 PVR_ASSERT(((u32) sDevVAddr.uiAddr & (ui32PageSize - 1)) == 0);
426 PVR_ASSERT(((u32) ui32NumBytes & (ui32PageSize - 1)) == 0);
428 snprintf(pszScript, SZ_SCRIPT_SIZE_MAX, "-- FREE :SGXMEM:VA_%8.8X\r\n",
430 PDumpWriteString2(pszScript, PDUMP_FLAGS_CONTINUOUS);
432 ui32NumPages = ui32NumBytes / ui32PageSize;
433 psDeviceNode = psBMHeap->pBMContext->psDeviceNode;
434 for (ui32PageCounter = 0; ui32PageCounter < ui32NumPages;
436 if (!bInterleaved || (ui32PageCounter % 2) == 0) {
438 psDeviceNode->pfnMMUGetPhysPageAddr(psBMHeap->
442 snprintf(pszScript, SZ_SCRIPT_SIZE_MAX,
443 "FREE :SGXMEM:PA_%8.8X%8.8X\r\n",
444 (u32)hUniqueTag, sDevPAddr.uiAddr);
445 PDumpWriteString2(pszScript, PDUMP_FLAGS_CONTINUOUS);
450 sDevVAddr.uiAddr += ui32PageSize;
454 void PDumpFreePageTable(enum PVRSRV_DEVICE_TYPE eDeviceType,
455 void *pvLinAddr, u32 ui32PTSize, void *hUniqueTag)
459 struct IMG_CPU_PHYADDR sCpuPAddr;
460 struct IMG_DEV_PHYADDR sDevPAddr;
462 __PDBG_PDUMP_STATE_GET_SCRIPT_STRING();
464 PVR_ASSERT(((u32) pvLinAddr & (ui32PTSize - 1)) == 0);
466 snprintf(pszScript, SZ_SCRIPT_SIZE_MAX,
467 "-- FREE :SGXMEM:PAGE_TABLE\r\n");
468 PDumpWriteString2(pszScript, PDUMP_FLAGS_CONTINUOUS);
470 pui8LinAddr = (u8 *) pvLinAddr;
474 while (ui32NumPages--) {
475 sCpuPAddr = OSMapLinToCPUPhys(pui8LinAddr);
476 sDevPAddr = SysCpuPAddrToDevPAddr(eDeviceType, sCpuPAddr);
477 ui32Page = sDevPAddr.uiAddr >> SGX_MMU_PAGE_SHIFT;
478 pui8LinAddr += SGX_MMU_PAGE_SIZE;
480 snprintf(pszScript, SZ_SCRIPT_SIZE_MAX,
481 "FREE :SGXMEM:PA_%8.8X%8.8lX\r\n", (u32)hUniqueTag,
482 ui32Page * SGX_MMU_PAGE_SIZE);
483 PDumpWriteString2(pszScript, PDUMP_FLAGS_CONTINUOUS);
487 void PDumpPDReg(u32 ui32Reg, u32 ui32Data, void *hUniqueTag)
489 __PDBG_PDUMP_STATE_GET_SCRIPT_STRING();
493 "WRW :SGXREG:0x%8.8X :SGXMEM:PA_%8.8X%8.8lX:0x%8.8lX\r\n",
494 ui32Reg, (u32)hUniqueTag, ui32Data & ~(SGX_MMU_PAGE_SIZE - 1),
495 ui32Data & (SGX_MMU_PAGE_SIZE - 1));
496 PDumpWriteString2(pszScript, PDUMP_FLAGS_CONTINUOUS);
499 void PDumpPDRegWithFlags(u32 ui32Reg, u32 ui32Data, u32 ui32Flags,
502 __PDBG_PDUMP_STATE_GET_SCRIPT_STRING();
506 "WRW :SGXREG:0x%8.8X :SGXMEM:PA_%8.8X%8.8lX:0x%8.8lX\r\n",
507 ui32Reg, (u32) hUniqueTag, ui32Data & ~(SGX_MMU_PAGE_SIZE - 1),
508 ui32Data & (SGX_MMU_PAGE_SIZE - 1));
509 PDumpWriteString2(pszScript, ui32Flags);
512 enum PVRSRV_ERROR PDumpMemPolKM(struct PVRSRV_KERNEL_MEM_INFO *psMemInfo,
513 u32 ui32Offset, u32 ui32Value, u32 ui32Mask,
514 enum PDUMP_POLL_OPERATOR eOperator,
515 IMG_BOOL bLastFrame, IMG_BOOL bOverwrite,
518 #define MEMPOLL_DELAY (1000)
519 #define MEMPOLL_COUNT (2000000000 / MEMPOLL_DELAY)
522 struct IMG_DEV_PHYADDR sDevPAddr;
523 struct IMG_DEV_VIRTADDR sDevVPageAddr;
524 struct IMG_CPU_PHYADDR CpuPAddr;
526 __PDBG_PDUMP_STATE_GET_SCRIPT_AND_FILE_STRING(PVRSRV_ERROR_GENERIC);
528 PVR_ASSERT((ui32Offset + sizeof(u32)) <=
529 psMemInfo->ui32AllocSize);
531 if (gsDBGPdumpState.ui32ParamFileNum == 0)
532 snprintf(pszFile, SZ_FILENAME_SIZE_MAX, "%%0%%.prm");
534 snprintf(pszFile, SZ_FILENAME_SIZE_MAX, "%%0%%%u.prm",
535 gsDBGPdumpState.ui32ParamFileNum);
540 ui32Flags |= PDUMP_FLAGS_LASTFRAME;
543 ui32Flags |= PDUMP_FLAGS_RESETLFBUFFER;
546 OSMemHandleToCpuPAddr(psMemInfo->sMemBlk.hOSMemHandle, ui32Offset);
547 ui32PageOffset = CpuPAddr.uiAddr & (PAGE_SIZE - 1);
549 sDevVPageAddr.uiAddr =
550 psMemInfo->sDevVAddr.uiAddr + ui32Offset - ui32PageOffset;
552 BM_GetPhysPageAddr(psMemInfo, sDevVPageAddr, &sDevPAddr);
554 sDevPAddr.uiAddr += ui32PageOffset;
557 SZ_SCRIPT_SIZE_MAX, "POL :SGXMEM:"
558 "PA_%8.8X%8.8lX:0x%8.8lX 0x%8.8X 0x%8.8X %d %d %d\r\n",
559 (u32)hUniqueTag, sDevPAddr.uiAddr & ~(SGX_MMU_PAGE_SIZE - 1),
560 sDevPAddr.uiAddr & (SGX_MMU_PAGE_SIZE - 1),
561 ui32Value, ui32Mask, eOperator, MEMPOLL_COUNT, MEMPOLL_DELAY);
562 PDumpWriteString2(pszScript, ui32Flags);
567 enum PVRSRV_ERROR PDumpMemKM(void *pvAltLinAddr,
568 struct PVRSRV_KERNEL_MEM_INFO *psMemInfo,
569 u32 ui32Offset, u32 ui32Bytes, u32 ui32Flags,
572 u32 ui32PageByteOffset;
573 u8 *pui8DataLinAddr = NULL;
574 struct IMG_DEV_VIRTADDR sDevVPageAddr;
575 struct IMG_DEV_VIRTADDR sDevVAddr;
576 struct IMG_DEV_PHYADDR sDevPAddr;
577 struct IMG_CPU_PHYADDR CpuPAddr;
579 u32 ui32CurrentOffset;
580 u32 ui32BytesRemaining;
582 __PDBG_PDUMP_STATE_GET_SCRIPT_AND_FILE_STRING(PVRSRV_ERROR_GENERIC);
584 PVR_ASSERT((ui32Offset + ui32Bytes) <= psMemInfo->ui32AllocSize);
590 pui8DataLinAddr = pvAltLinAddr;
592 if (psMemInfo->pvLinAddrKM)
594 (u8 *) psMemInfo->pvLinAddrKM + ui32Offset;
598 PVR_ASSERT(pui8DataLinAddr);
601 gpfnDbgDrv->pfnGetStreamOffset(gsDBGPdumpState.
602 psStream[PDUMP_STREAM_PARAM2]);
604 if (!PDumpWriteILock(gsDBGPdumpState.psStream[PDUMP_STREAM_PARAM2],
605 pui8DataLinAddr, ui32Bytes, ui32Flags))
606 return PVRSRV_ERROR_GENERIC;
608 if (gsDBGPdumpState.ui32ParamFileNum == 0) {
609 snprintf(pszFile, SZ_FILENAME_SIZE_MAX, "%%0%%.prm");
611 snprintf(pszFile, SZ_FILENAME_SIZE_MAX, "%%0%%%u.prm",
612 gsDBGPdumpState.ui32ParamFileNum);
617 "-- LDB :SGXMEM:VA_%8.8X:0x%8.8X 0x%8.8X 0x%8.8X %s\r\n",
618 psMemInfo->sDevVAddr.uiAddr,
619 ui32Offset, ui32Bytes, ui32ParamOutPos, pszFile);
620 PDumpWriteString2(pszScript, ui32Flags);
623 OSMemHandleToCpuPAddr(psMemInfo->sMemBlk.hOSMemHandle, ui32Offset);
624 ui32PageByteOffset = CpuPAddr.uiAddr & (PAGE_SIZE - 1);
626 sDevVAddr = psMemInfo->sDevVAddr;
627 sDevVAddr.uiAddr += ui32Offset;
629 ui32BytesRemaining = ui32Bytes;
630 ui32CurrentOffset = ui32Offset;
632 while (ui32BytesRemaining > 0) {
633 u32 ui32BlockBytes = MIN(ui32BytesRemaining, PAGE_SIZE);
635 OSMemHandleToCpuPAddr(psMemInfo->sMemBlk.hOSMemHandle,
638 sDevVPageAddr.uiAddr =
639 psMemInfo->sDevVAddr.uiAddr + ui32CurrentOffset -
642 BM_GetPhysPageAddr(psMemInfo, sDevVPageAddr, &sDevPAddr);
644 sDevPAddr.uiAddr += ui32PageByteOffset;
646 if (ui32PageByteOffset) {
648 MIN(ui32BytesRemaining,
649 PAGE_ALIGN(CpuPAddr.uiAddr) - CpuPAddr.uiAddr);
651 ui32PageByteOffset = 0;
655 SZ_SCRIPT_SIZE_MAX, "LDB :SGXMEM:"
656 "PA_%8.8X%8.8lX:0x%8.8lX 0x%8.8X 0x%8.8X %s\r\n",
658 sDevPAddr.uiAddr & ~(SGX_MMU_PAGE_SIZE - 1),
659 sDevPAddr.uiAddr & (SGX_MMU_PAGE_SIZE - 1),
660 ui32BlockBytes, ui32ParamOutPos, pszFile);
661 PDumpWriteString2(pszScript, ui32Flags);
663 ui32BytesRemaining -= ui32BlockBytes;
664 ui32CurrentOffset += ui32BlockBytes;
665 ui32ParamOutPos += ui32BlockBytes;
667 PVR_ASSERT(ui32BytesRemaining == 0);
672 enum PVRSRV_ERROR PDumpMem2KM(enum PVRSRV_DEVICE_TYPE eDeviceType,
673 void *pvLinAddr, u32 ui32Bytes, u32 ui32Flags,
674 IMG_BOOL bInitialisePages, void *hUniqueTag1,
681 struct IMG_DEV_PHYADDR sDevPAddr;
682 struct IMG_CPU_PHYADDR sCpuPAddr;
686 __PDBG_PDUMP_STATE_GET_SCRIPT_AND_FILE_STRING(PVRSRV_ERROR_GENERIC);
692 return PVRSRV_ERROR_GENERIC;
695 gpfnDbgDrv->pfnGetStreamOffset(gsDBGPdumpState.
696 psStream[PDUMP_STREAM_PARAM2]);
698 if (bInitialisePages) {
701 (gsDBGPdumpState.psStream[PDUMP_STREAM_PARAM2], pvLinAddr,
702 ui32Bytes, PDUMP_FLAGS_CONTINUOUS))
703 return PVRSRV_ERROR_GENERIC;
705 if (gsDBGPdumpState.ui32ParamFileNum == 0)
706 snprintf(pszFile, SZ_FILENAME_SIZE_MAX, "%%0%%.prm");
708 snprintf(pszFile, SZ_FILENAME_SIZE_MAX, "%%0%%%u.prm",
709 gsDBGPdumpState.ui32ParamFileNum);
712 ui32PageOffset = (u32) pvLinAddr & (HOST_PAGESIZE() - 1);
714 (ui32PageOffset + ui32Bytes + HOST_PAGESIZE() - 1) /
716 pui8LinAddr = (u8 *) pvLinAddr;
718 while (ui32NumPages--) {
719 sCpuPAddr = OSMapLinToCPUPhys(pui8LinAddr);
720 sDevPAddr = SysCpuPAddrToDevPAddr(eDeviceType, sCpuPAddr);
722 if (ui32PageOffset + ui32Bytes > HOST_PAGESIZE())
723 ui32BlockBytes = HOST_PAGESIZE() - ui32PageOffset;
725 ui32BlockBytes = ui32Bytes;
727 if (bInitialisePages) {
729 SZ_SCRIPT_SIZE_MAX, "LDB :SGXMEM:"
730 "PA_%8.8X%8.8lX:0x%8.8lX 0x%8.8X "
733 sDevPAddr.uiAddr & ~(SGX_MMU_PAGE_SIZE - 1),
734 sDevPAddr.uiAddr & (SGX_MMU_PAGE_SIZE - 1),
735 ui32BlockBytes, ui32ParamOutPos, pszFile);
736 PDumpWriteString2(pszScript, PDUMP_FLAGS_CONTINUOUS);
738 for (ui32Offset = 0; ui32Offset < ui32BlockBytes;
739 ui32Offset += sizeof(u32)) {
741 *((u32 *) (pui8LinAddr +
744 if ((ui32PTE & SGX_MMU_PDE_ADDR_MASK) != 0) {
747 "WRW :SGXMEM:PA_%8.8X%8.8lX:0x%8.8lX :SGXMEM:PA_%8.8X%8.8lX:0x%8.8lX\r\n",
751 ~(SGX_MMU_PAGE_SIZE - 1),
754 (SGX_MMU_PAGE_SIZE - 1),
757 SGX_MMU_PDE_ADDR_MASK,
759 ~SGX_MMU_PDE_ADDR_MASK);
764 snprintf(pszScript, SZ_SCRIPT_SIZE_MAX,
765 "WRW :SGXMEM:PA_%8.8X%8.8lX:0x%8.8lX 0x%8.8X%8.8X\r\n",
769 ~(SGX_MMU_PAGE_SIZE - 1),
772 (SGX_MMU_PAGE_SIZE - 1),
773 ui32PTE, (u32)hUniqueTag2);
775 PDumpWriteString2(pszScript,
776 PDUMP_FLAGS_CONTINUOUS);
781 ui32Bytes -= ui32BlockBytes;
782 pui8LinAddr += ui32BlockBytes;
783 ui32ParamOutPos += ui32BlockBytes;
789 enum PVRSRV_ERROR PDumpPDDevPAddrKM(struct PVRSRV_KERNEL_MEM_INFO *psMemInfo,
791 struct IMG_DEV_PHYADDR sPDDevPAddr,
792 void *hUniqueTag1, void *hUniqueTag2)
795 struct IMG_CPU_PHYADDR CpuPAddr;
796 u32 ui32PageByteOffset;
797 struct IMG_DEV_VIRTADDR sDevVAddr;
798 struct IMG_DEV_VIRTADDR sDevVPageAddr;
799 struct IMG_DEV_PHYADDR sDevPAddr;
801 __PDBG_PDUMP_STATE_GET_SCRIPT_AND_FILE_STRING(PVRSRV_ERROR_GENERIC);
804 gpfnDbgDrv->pfnGetStreamOffset(gsDBGPdumpState.
805 psStream[PDUMP_STREAM_PARAM2]);
807 if (!PDumpWriteILock(gsDBGPdumpState.psStream[PDUMP_STREAM_PARAM2],
808 (u8 *)&sPDDevPAddr, sizeof(struct IMG_DEV_PHYADDR),
809 PDUMP_FLAGS_CONTINUOUS))
810 return PVRSRV_ERROR_GENERIC;
812 if (gsDBGPdumpState.ui32ParamFileNum == 0)
813 snprintf(pszFile, SZ_FILENAME_SIZE_MAX, "%%0%%.prm");
815 snprintf(pszFile, SZ_FILENAME_SIZE_MAX, "%%0%%%u.prm",
816 gsDBGPdumpState.ui32ParamFileNum);
819 OSMemHandleToCpuPAddr(psMemInfo->sMemBlk.hOSMemHandle, ui32Offset);
820 ui32PageByteOffset = CpuPAddr.uiAddr & (PAGE_SIZE - 1);
822 sDevVAddr = psMemInfo->sDevVAddr;
823 sDevVAddr.uiAddr += ui32Offset;
825 sDevVPageAddr.uiAddr = sDevVAddr.uiAddr - ui32PageByteOffset;
826 BM_GetPhysPageAddr(psMemInfo, sDevVPageAddr, &sDevPAddr);
827 sDevPAddr.uiAddr += ui32PageByteOffset;
829 if ((sPDDevPAddr.uiAddr & SGX_MMU_PDE_ADDR_MASK) != 0) {
832 "WRW :SGXMEM:PA_%8.8X%8.8lX:0x%8.8lX :SGXMEM:PA_%8.8X%8.8lX:0x%8.8lX\r\n",
834 sDevPAddr.uiAddr & ~(SGX_MMU_PAGE_SIZE - 1),
835 sDevPAddr.uiAddr & (SGX_MMU_PAGE_SIZE - 1),
837 sPDDevPAddr.uiAddr & SGX_MMU_PDE_ADDR_MASK,
838 sPDDevPAddr.uiAddr & ~SGX_MMU_PDE_ADDR_MASK);
840 PVR_ASSERT(!(sDevPAddr.uiAddr & SGX_MMU_PTE_VALID));
843 "WRW :SGXMEM:PA_%8.8X%8.8lX:0x%8.8lX 0x%8.8X\r\n",
845 sDevPAddr.uiAddr & ~(SGX_MMU_PAGE_SIZE - 1),
846 sDevPAddr.uiAddr & (SGX_MMU_PAGE_SIZE - 1),
849 PDumpWriteString2(pszScript, PDUMP_FLAGS_CONTINUOUS);
854 enum PVRSRV_ERROR PDumpSetFrameKM(u32 ui32Frame)
858 for (ui32Stream = 0; ui32Stream < PDUMP_NUM_STREAMS; ui32Stream++)
859 if (gsDBGPdumpState.psStream[ui32Stream])
860 DbgSetFrame(gsDBGPdumpState.psStream[ui32Stream],
866 static enum PVRSRV_ERROR PDumpGetFrameKM(u32 *pui32Frame)
869 DbgGetFrame(gsDBGPdumpState.psStream[PDUMP_STREAM_SCRIPT2]);
874 enum PVRSRV_ERROR PDumpCommentKM(char *pszComment, u32 ui32Flags)
877 enum PVRSRV_ERROR eError;
878 __PDBG_PDUMP_STATE_GET_MSG_STRING(PVRSRV_ERROR_GENERIC);
880 if (ui32Flags & PDUMP_FLAGS_CONTINUOUS)
881 eError = PVRSRV_ERROR_GENERIC;
883 eError = PVRSRV_ERROR_CMD_NOT_PROCESSED;
885 if (!PDumpWriteString2("-- ", ui32Flags))
888 snprintf(pszMsg, SZ_MSG_SIZE_MAX, "%s", pszComment);
890 while ((pszMsg[ui32Count] != 0) && (ui32Count < SZ_MSG_SIZE_MAX))
893 if ((pszMsg[ui32Count - 1] != '\n') && (ui32Count < SZ_MSG_SIZE_MAX)) {
894 pszMsg[ui32Count] = '\n';
896 pszMsg[ui32Count] = '\0';
898 if ((pszMsg[ui32Count - 2] != '\r') && (ui32Count < SZ_MSG_SIZE_MAX)) {
899 pszMsg[ui32Count - 1] = '\r';
900 pszMsg[ui32Count] = '\n';
902 pszMsg[ui32Count] = '\0';
905 PDumpWriteString2(pszMsg, ui32Flags);
910 enum PVRSRV_ERROR PDumpDriverInfoKM(char *pszString, u32 ui32Flags)
913 __PDBG_PDUMP_STATE_GET_MSG_STRING(PVRSRV_ERROR_GENERIC);
915 snprintf(pszMsg, SZ_MSG_SIZE_MAX, "%s", pszString);
917 while ((pszMsg[ui32Count] != 0) && (ui32Count < SZ_MSG_SIZE_MAX))
920 if ((pszMsg[ui32Count - 1] != '\n') && (ui32Count < SZ_MSG_SIZE_MAX)) {
921 pszMsg[ui32Count] = '\n';
923 pszMsg[ui32Count] = '\0';
925 if ((pszMsg[ui32Count - 2] != '\r') && (ui32Count < SZ_MSG_SIZE_MAX)) {
926 pszMsg[ui32Count - 1] = '\r';
927 pszMsg[ui32Count] = '\n';
929 pszMsg[ui32Count] = '\0';
932 if (!PDumpWriteILock(gsDBGPdumpState.psStream[PDUMP_STREAM_DRIVERINFO],
933 (u8 *) pszMsg, ui32Count, ui32Flags)) {
934 if (ui32Flags & PDUMP_FLAGS_CONTINUOUS)
935 return PVRSRV_ERROR_GENERIC;
937 return PVRSRV_ERROR_CMD_NOT_PROCESSED;
943 enum PVRSRV_ERROR PDumpBitmapKM(char *pszFileName, u32 ui32FileOffset,
944 u32 ui32Width, u32 ui32Height, u32 ui32StrideInBytes,
945 struct IMG_DEV_VIRTADDR sDevBaseAddr,
946 u32 ui32Size, enum PDUMP_PIXEL_FORMAT ePixelFormat,
947 enum PDUMP_MEM_FORMAT eMemFormat, u32 ui32PDumpFlags)
949 __PDBG_PDUMP_STATE_GET_SCRIPT_STRING(PVRSRV_ERROR_GENERIC);
950 PDUMPCOMMENTWITHFLAGS(ui32PDumpFlags,
951 "\r\n-- Dump bitmap of render\r\n");
955 "SII %s %s.bin :SGXMEM:v:0x%08X 0x%08X "
956 "0x%08X 0x%08X 0x%08X 0x%08X 0x%08X 0x%08X\r\n",
957 pszFileName, pszFileName, sDevBaseAddr.uiAddr, ui32Size,
958 ui32FileOffset, ePixelFormat, ui32Width, ui32Height,
959 ui32StrideInBytes, eMemFormat);
961 PDumpWriteString2(pszScript, ui32PDumpFlags);
965 enum PVRSRV_ERROR PDumpReadRegKM(char *pszFileName, u32 ui32FileOffset,
966 u32 ui32Address, u32 ui32Size, u32 ui32PDumpFlags)
968 __PDBG_PDUMP_STATE_GET_SCRIPT_STRING(PVRSRV_ERROR_GENERIC);
972 "SAB :SGXREG:0x%08X 0x%08X %s\r\n",
973 ui32Address, ui32FileOffset, pszFileName);
975 PDumpWriteString2(pszScript, ui32PDumpFlags);
980 static IMG_BOOL PDumpWriteString2(char *pszString, u32 ui32Flags)
982 return PDumpWriteILock(gsDBGPdumpState.psStream[PDUMP_STREAM_SCRIPT2],
983 (u8 *)pszString, strlen(pszString), ui32Flags);
986 static IMG_BOOL PDumpWriteILock(struct DBG_STREAM *psStream, u8 *pui8Data,
987 u32 ui32Count, u32 ui32Flags)
992 if (!psStream || PDumpSuspended() || (ui32Flags & PDUMP_FLAGS_NEVER))
995 if (psStream == gsDBGPdumpState.psStream[PDUMP_STREAM_PARAM2]) {
996 u32 ui32ParamOutPos =
997 gpfnDbgDrv->pfnGetStreamOffset(gsDBGPdumpState.
999 [PDUMP_STREAM_PARAM2]);
1001 if (ui32ParamOutPos + ui32Count > MAX_FILE_SIZE)
1002 if ((gsDBGPdumpState.psStream[PDUMP_STREAM_SCRIPT2]
1005 ("\r\n-- Splitting pdump output file\r\n\r\n",
1007 DbgSetMarker(gsDBGPdumpState.
1008 psStream[PDUMP_STREAM_PARAM2],
1010 gsDBGPdumpState.ui32ParamFileNum++;
1014 while (((u32) ui32Count > 0) && (ui32Written != 0xFFFFFFFF)) {
1016 DbgWrite(psStream, &pui8Data[ui32Off], ui32Count,
1019 if (ui32Written == 0)
1020 OSReleaseThreadQuanta();
1022 if (ui32Written != 0xFFFFFFFF) {
1023 ui32Off += ui32Written;
1024 ui32Count -= ui32Written;
1028 if (ui32Written == 0xFFFFFFFF)
1034 static void DbgSetFrame(struct DBG_STREAM *psStream, u32 ui32Frame)
1036 gpfnDbgDrv->pfnSetFrame(psStream, ui32Frame);
1039 static u32 DbgGetFrame(struct DBG_STREAM *psStream)
1041 return gpfnDbgDrv->pfnGetFrame(psStream);
1044 static void DbgSetMarker(struct DBG_STREAM *psStream, u32 ui32Marker)
1046 gpfnDbgDrv->pfnSetMarker(psStream, ui32Marker);
1049 static u32 DbgWrite(struct DBG_STREAM *psStream, u8 *pui8Data,
1050 u32 ui32BCount, u32 ui32Flags)
1052 u32 ui32BytesWritten;
1054 if (ui32Flags & PDUMP_FLAGS_CONTINUOUS) {
1055 if ((psStream->ui32CapMode & DEBUG_CAPMODE_FRAMED) &&
1056 (psStream->ui32Start == 0xFFFFFFFF) &&
1057 (psStream->ui32End == 0xFFFFFFFF) &&
1058 psStream->bInitPhaseComplete)
1059 ui32BytesWritten = ui32BCount;
1062 gpfnDbgDrv->pfnDBGDrivWrite2(psStream, pui8Data,
1064 } else if (ui32Flags & PDUMP_FLAGS_LASTFRAME) {
1068 if (ui32Flags & PDUMP_FLAGS_RESETLFBUFFER)
1069 ui32DbgFlags |= WRITELF_FLAGS_RESETBUF;
1072 gpfnDbgDrv->pfnWriteLF(psStream, pui8Data,
1073 ui32BCount, 1, ui32DbgFlags);
1076 gpfnDbgDrv->pfnWriteBINCM(psStream, pui8Data,
1080 return ui32BytesWritten;
1083 IMG_BOOL PDumpTestNextFrame(u32 ui32CurrentFrame)
1085 IMG_BOOL bFrameDumped;
1087 bFrameDumped = IMG_FALSE;
1088 PDumpSetFrameKM(ui32CurrentFrame + 1);
1089 bFrameDumped = PDumpIsCaptureFrameKM();
1090 PDumpSetFrameKM(ui32CurrentFrame);
1092 return bFrameDumped;
1095 void PDump3DSignatureRegisters(u32 ui32DumpFrameNum, IMG_BOOL bLastFrame,
1096 u32 *pui32Registers, u32 ui32NumRegisters)
1098 u32 ui32FileOffset, ui32Flags;
1101 __PDBG_PDUMP_STATE_GET_SCRIPT_AND_FILE_STRING();
1103 ui32Flags = bLastFrame ? PDUMP_FLAGS_LASTFRAME : 0;
1106 PDUMPCOMMENTWITHFLAGS(ui32Flags,
1107 "\r\n-- Dump 3D signature registers\r\n");
1108 snprintf(pszFile, SZ_FILENAME_SIZE_MAX, "out%u_3d.sig",
1111 for (i = 0; i < ui32NumRegisters; i++) {
1112 PDumpReadRegKM(pszFile, ui32FileOffset, pui32Registers[i],
1113 sizeof(u32), ui32Flags);
1114 ui32FileOffset += sizeof(u32);
1118 static void PDumpCountRead(char *pszFileName, u32 ui32Address, u32 ui32Size,
1119 u32 *pui32FileOffset, IMG_BOOL bLastFrame)
1121 __PDBG_PDUMP_STATE_GET_SCRIPT_STRING();
1123 snprintf(pszScript, SZ_SCRIPT_SIZE_MAX,
1124 "SAB :SGXREG:0x%08X 0x%08X %s\r\n", ui32Address,
1125 *pui32FileOffset, pszFileName);
1126 PDumpWriteString2(pszScript, bLastFrame ? PDUMP_FLAGS_LASTFRAME : 0);
1128 *pui32FileOffset += ui32Size;
1131 void PDumpCounterRegisters(u32 ui32DumpFrameNum, IMG_BOOL bLastFrame,
1132 u32 *pui32Registers, u32 ui32NumRegisters)
1137 __PDBG_PDUMP_STATE_GET_SCRIPT_AND_FILE_STRING();
1139 PDUMPCOMMENTWITHFLAGS(bLastFrame ? PDUMP_FLAGS_LASTFRAME : 0,
1140 "\r\n-- Dump counter registers\r\n");
1141 snprintf(pszFile, SZ_FILENAME_SIZE_MAX, "out%u.perf",
1145 for (i = 0; i < ui32NumRegisters; i++)
1146 PDumpCountRead(pszFile, pui32Registers[i], sizeof(u32),
1147 &ui32FileOffset, bLastFrame);
1150 void PDumpTASignatureRegisters(u32 ui32DumpFrameNum, u32 ui32TAKickCount,
1151 IMG_BOOL bLastFrame, u32 *pui32Registers,
1152 u32 ui32NumRegisters)
1154 u32 ui32FileOffset, ui32Flags;
1157 __PDBG_PDUMP_STATE_GET_SCRIPT_AND_FILE_STRING();
1159 ui32Flags = bLastFrame ? PDUMP_FLAGS_LASTFRAME : 0;
1160 PDUMPCOMMENTWITHFLAGS(ui32Flags,
1161 "\r\n-- Dump TA signature registers\r\n");
1162 snprintf(pszFile, SZ_FILENAME_SIZE_MAX, "out%u_ta.sig",
1165 ui32FileOffset = ui32TAKickCount * ui32NumRegisters * sizeof(u32);
1167 for (i = 0; i < ui32NumRegisters; i++) {
1168 PDumpReadRegKM(pszFile, ui32FileOffset, pui32Registers[i],
1169 sizeof(u32), ui32Flags);
1170 ui32FileOffset += sizeof(u32);
1174 void PDumpRegRead(const u32 ui32RegOffset, u32 ui32Flags)
1176 __PDBG_PDUMP_STATE_GET_SCRIPT_STRING();
1178 snprintf(pszScript, SZ_SCRIPT_SIZE_MAX, "RDW :SGXREG:0x%X\r\n",
1180 PDumpWriteString2(pszScript, ui32Flags);
1183 void PDumpCycleCountRegRead(const u32 ui32RegOffset, IMG_BOOL bLastFrame)
1185 __PDBG_PDUMP_STATE_GET_SCRIPT_STRING();
1187 snprintf(pszScript, SZ_SCRIPT_SIZE_MAX, "RDW :SGXREG:0x%X\r\n",
1189 PDumpWriteString2(pszScript, bLastFrame ? PDUMP_FLAGS_LASTFRAME : 0);
1192 void PDumpHWPerfCBKM(char *pszFileName, u32 ui32FileOffset,
1193 struct IMG_DEV_VIRTADDR sDevBaseAddr, u32 ui32Size,
1196 __PDBG_PDUMP_STATE_GET_SCRIPT_STRING();
1197 PDUMPCOMMENTWITHFLAGS(ui32PDumpFlags,
1198 "\r\n-- Dump Hardware Performance Circular Buffer\r\n");
1202 "SAB :SGXMEM:v:0x%08X 0x%08X 0x%08X %s.bin\r\n",
1203 sDevBaseAddr.uiAddr, ui32Size, ui32FileOffset, pszFileName);
1205 PDumpWriteString2(pszScript, ui32PDumpFlags);
1208 void PDumpCBP(struct PVRSRV_KERNEL_MEM_INFO *psROffMemInfo,
1209 u32 ui32ROffOffset, u32 ui32WPosVal, u32 ui32PacketSize,
1210 u32 ui32BufferSize, u32 ui32Flags, void *hUniqueTag)
1213 struct IMG_DEV_VIRTADDR sDevVAddr;
1214 struct IMG_DEV_PHYADDR sDevPAddr;
1215 struct IMG_DEV_VIRTADDR sDevVPageAddr;
1216 struct IMG_CPU_PHYADDR CpuPAddr;
1218 __PDBG_PDUMP_STATE_GET_SCRIPT_STRING();
1220 PVR_ASSERT((ui32ROffOffset + sizeof(u32)) <=
1221 psROffMemInfo->ui32AllocSize);
1223 sDevVAddr = psROffMemInfo->sDevVAddr;
1225 sDevVAddr.uiAddr += ui32ROffOffset;
1228 OSMemHandleToCpuPAddr(psROffMemInfo->sMemBlk.hOSMemHandle,
1230 ui32PageOffset = CpuPAddr.uiAddr & (PAGE_SIZE - 1);
1232 sDevVPageAddr.uiAddr = sDevVAddr.uiAddr - ui32PageOffset;
1234 BM_GetPhysPageAddr(psROffMemInfo, sDevVPageAddr, &sDevPAddr);
1236 sDevPAddr.uiAddr += ui32PageOffset;
1240 "CBP :SGXMEM:PA_%8.8X%8.8lX:0x%8.8lX 0x%8.8X 0x%8.8X 0x%8.8X\r\n",
1242 sDevPAddr.uiAddr & ~(SGX_MMU_PAGE_SIZE - 1),
1243 sDevPAddr.uiAddr & (SGX_MMU_PAGE_SIZE - 1),
1244 ui32WPosVal, ui32PacketSize, ui32BufferSize);
1245 PDumpWriteString2(pszScript, ui32Flags);
1248 void PDumpIDLWithFlags(u32 ui32Clocks, u32 ui32Flags)
1250 __PDBG_PDUMP_STATE_GET_SCRIPT_STRING();
1252 sprintf(pszScript, "IDL %u\r\n", ui32Clocks);
1253 PDumpWriteString2(pszScript, ui32Flags);
1256 void PDumpIDL(u32 ui32Clocks)
1258 PDumpIDLWithFlags(ui32Clocks, PDUMP_FLAGS_CONTINUOUS);
1261 void PDumpSuspendKM(void)
1263 atomic_inc(&gsPDumpSuspended);
1266 void PDumpResumeKM(void)
1268 atomic_dec(&gsPDumpSuspended);