1
/**********************************************************************
3
* Copyright (C) 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
******************************************************************************/
30
#include "services_headers.h"
34
#include "pdump_int.h"
36
#if !defined(PDUMP_TEMP_BUFFER_SIZE)
37
#define PDUMP_TEMP_BUFFER_SIZE (64 * 1024U)
41
#define PDUMP_DBG(a) PDumpOSDebugPrintf (a)
47
#define PTR_PLUS(t, p, x) ((t)(((IMG_CHAR *)(p)) + (x)))
48
#define VPTR_PLUS(p, x) PTR_PLUS(IMG_VOID *, p, x)
49
#define VPTR_INC(p, x) ((p) = VPTR_PLUS(p, x))
50
#define MAX_PDUMP_MMU_CONTEXTS (32)
51
static IMG_VOID *gpvTempBuffer = IMG_NULL;
52
static IMG_HANDLE ghTempBufferBlockAlloc;
53
static IMG_UINT16 gui16MMUContextUsage = 0;
55
#if defined(PDUMP_DEBUG_OUTFILES)
56
IMG_UINT32 g_ui32EveryLineCounter = 1U;
59
#ifdef INLINE_IS_PRAGMA
60
#pragma inline(_PDumpIsPersistent)
63
IMG_BOOL _PDumpIsPersistent(IMG_VOID)
65
PVRSRV_PER_PROCESS_DATA* psPerProc = PVRSRVFindPerProcessData();
67
if(psPerProc == IMG_NULL)
72
return psPerProc->bPDumpPersistent;
75
#if defined(SUPPORT_PDUMP_MULTI_PROCESS)
77
IMG_BOOL _PDumpIsProcessActive(IMG_VOID)
79
PVRSRV_PER_PROCESS_DATA* psPerProc = PVRSRVFindPerProcessData();
80
if(psPerProc == IMG_NULL)
85
return psPerProc->bPDumpActive;
89
#if defined(PDUMP_DEBUG_OUTFILES)
91
IMG_UINT32 _PDumpGetPID(IMG_VOID)
93
PVRSRV_PER_PROCESS_DATA* psPerProc = PVRSRVFindPerProcessData();
94
if(psPerProc == IMG_NULL)
99
return psPerProc->ui32PID;
103
static IMG_VOID *GetTempBuffer(IMG_VOID)
106
if (gpvTempBuffer == IMG_NULL)
108
PVRSRV_ERROR eError = OSAllocMem(PVRSRV_OS_PAGEABLE_HEAP,
109
PDUMP_TEMP_BUFFER_SIZE,
111
&ghTempBufferBlockAlloc,
112
"PDUMP Temporary Buffer");
113
if (eError != PVRSRV_OK)
115
PVR_DPF((PVR_DBG_ERROR, "GetTempBuffer: OSAllocMem failed: %d", eError));
119
return gpvTempBuffer;
122
static IMG_VOID FreeTempBuffer(IMG_VOID)
125
if (gpvTempBuffer != IMG_NULL)
127
PVRSRV_ERROR eError = OSFreeMem(PVRSRV_OS_PAGEABLE_HEAP,
128
PDUMP_TEMP_BUFFER_SIZE,
130
ghTempBufferBlockAlloc);
131
if (eError != PVRSRV_OK)
133
PVR_DPF((PVR_DBG_ERROR, "FreeTempBuffer: OSFreeMem failed: %d", eError));
137
gpvTempBuffer = IMG_NULL;
142
IMG_VOID PDumpInitCommon(IMG_VOID)
145
(IMG_VOID) GetTempBuffer();
151
IMG_VOID PDumpDeInitCommon(IMG_VOID)
160
IMG_BOOL PDumpIsSuspended(IMG_VOID)
162
return PDumpOSIsSuspended();
165
IMG_BOOL PDumpIsCaptureFrameKM(IMG_VOID)
167
#if defined(SUPPORT_PDUMP_MULTI_PROCESS)
168
if( _PDumpIsProcessActive() )
170
return PDumpOSIsCaptureFrameKM();
174
return PDumpOSIsCaptureFrameKM();
178
PVRSRV_ERROR PDumpSetFrameKM(IMG_UINT32 ui32Frame)
180
#if defined(SUPPORT_PDUMP_MULTI_PROCESS)
181
if( _PDumpIsProcessActive() )
183
return PDumpOSSetFrameKM(ui32Frame);
187
return PDumpOSSetFrameKM(ui32Frame);
191
PVRSRV_ERROR PDumpRegWithFlagsKM(IMG_CHAR *pszPDumpRegName,
194
IMG_UINT32 ui32Flags)
197
PDUMP_GET_SCRIPT_STRING()
198
PDUMP_DBG(("PDumpRegWithFlagsKM"));
200
eErr = PDumpOSBufprintf(hScript, ui32MaxLen, "WRW :%s:0x%08X 0x%08X\r\n",
201
pszPDumpRegName, ui32Reg, ui32Data);
202
if(eErr != PVRSRV_OK)
206
PDumpOSWriteString2(hScript, ui32Flags);
211
PVRSRV_ERROR PDumpRegKM(IMG_CHAR *pszPDumpRegName,
215
return PDumpRegWithFlagsKM(pszPDumpRegName, ui32Reg, ui32Data, PDUMP_FLAGS_CONTINUOUS);
218
PVRSRV_ERROR PDumpRegPolWithFlagsKM(IMG_CHAR *pszPDumpRegName,
219
IMG_UINT32 ui32RegAddr,
220
IMG_UINT32 ui32RegValue,
222
IMG_UINT32 ui32Flags,
223
PDUMP_POLL_OPERATOR eOperator)
226
#define POLL_DELAY 1000U
227
#define POLL_COUNT_LONG (2000000000U / POLL_DELAY)
228
#define POLL_COUNT_SHORT (1000000U / POLL_DELAY)
231
IMG_UINT32 ui32PollCount;
233
PDUMP_GET_SCRIPT_STRING();
234
PDUMP_DBG(("PDumpRegPolWithFlagsKM"));
235
if ( _PDumpIsPersistent() )
242
if (((ui32RegAddr == EUR_CR_EVENT_STATUS) &&
243
(ui32RegValue & ui32Mask & EUR_CR_EVENT_STATUS_TA_FINISHED_MASK) != 0) ||
244
((ui32RegAddr == EUR_CR_EVENT_STATUS) &&
245
(ui32RegValue & ui32Mask & EUR_CR_EVENT_STATUS_PIXELBE_END_RENDER_MASK) != 0) ||
246
((ui32RegAddr == EUR_CR_EVENT_STATUS) &&
247
(ui32RegValue & ui32Mask & EUR_CR_EVENT_STATUS_DPM_3D_MEM_FREE_MASK) != 0))
249
ui32PollCount = POLL_COUNT_LONG;
254
ui32PollCount = POLL_COUNT_LONG;
257
eErr = PDumpOSBufprintf(hScript, ui32MaxLen, "POL :%s:0x%08X 0x%08X 0x%08X %d %u %d\r\n",
258
pszPDumpRegName, ui32RegAddr, ui32RegValue,
259
ui32Mask, eOperator, ui32PollCount, POLL_DELAY);
260
if(eErr != PVRSRV_OK)
264
PDumpOSWriteString2(hScript, ui32Flags);
270
PVRSRV_ERROR PDumpRegPolKM(IMG_CHAR *pszPDumpRegName, IMG_UINT32 ui32RegAddr, IMG_UINT32 ui32RegValue, IMG_UINT32 ui32Mask, PDUMP_POLL_OPERATOR eOperator)
272
return PDumpRegPolWithFlagsKM(pszPDumpRegName, ui32RegAddr, ui32RegValue, ui32Mask, PDUMP_FLAGS_CONTINUOUS, eOperator);
275
PVRSRV_ERROR PDumpMallocPages (PVRSRV_DEVICE_IDENTIFIER *psDevID,
276
IMG_UINT32 ui32DevVAddr,
277
IMG_CPU_VIRTADDR pvLinAddr,
278
IMG_HANDLE hOSMemHandle,
279
IMG_UINT32 ui32NumBytes,
280
IMG_UINT32 ui32PageSize,
282
IMG_HANDLE hUniqueTag)
285
IMG_PUINT8 pui8LinAddr;
286
IMG_UINT32 ui32Offset;
287
IMG_UINT32 ui32NumPages;
288
IMG_DEV_PHYADDR sDevPAddr;
290
IMG_UINT32 ui32Flags = PDUMP_FLAGS_CONTINUOUS;
292
PDUMP_GET_SCRIPT_STRING();
293
#if defined(SUPPORT_PDUMP_MULTI_PROCESS)
295
ui32Flags |= ( _PDumpIsPersistent() || bShared ) ? PDUMP_FLAGS_PERSISTENT : 0;
297
PVR_UNREFERENCED_PARAMETER(bShared);
298
ui32Flags |= ( _PDumpIsPersistent() ) ? PDUMP_FLAGS_PERSISTENT : 0;
303
PVR_ASSERT(((IMG_UINTPTR_T)pvLinAddr & HOST_PAGEMASK) == 0);
306
PVR_ASSERT(((IMG_UINT32) ui32DevVAddr & HOST_PAGEMASK) == 0);
307
PVR_ASSERT(((IMG_UINT32) ui32NumBytes & HOST_PAGEMASK) == 0);
311
eErr = PDumpOSBufprintf(hScript, ui32MaxLen, "-- MALLOC :%s:VA_%08X 0x%08X %u\r\n",
312
psDevID->pszPDumpDevName, ui32DevVAddr, ui32NumBytes, ui32PageSize);
313
if(eErr != PVRSRV_OK)
317
PDumpOSWriteString2(hScript, ui32Flags);
321
pui8LinAddr = (IMG_PUINT8) pvLinAddr;
323
ui32NumPages = ui32NumBytes / ui32PageSize;
338
PDumpOSCPUVAddrToDevPAddr(psDevID->eDeviceType,
344
ui32Page = (IMG_UINT32)(sDevPAddr.uiAddr / ui32PageSize);
346
pui8LinAddr += ui32PageSize;
347
ui32Offset += ui32PageSize;
349
eErr = PDumpOSBufprintf(hScript, ui32MaxLen, "MALLOC :%s:PA_%08X%08X %u %u 0x%08X\r\n",
350
psDevID->pszPDumpDevName,
351
(IMG_UINT32)(IMG_UINTPTR_T)hUniqueTag,
352
ui32Page * ui32PageSize,
355
ui32Page * ui32PageSize);
356
if(eErr != PVRSRV_OK)
360
PDumpOSWriteString2(hScript, ui32Flags);
366
PVRSRV_ERROR PDumpMallocPageTable (PVRSRV_DEVICE_IDENTIFIER *psDevId,
367
IMG_HANDLE hOSMemHandle,
368
IMG_UINT32 ui32Offset,
369
IMG_CPU_VIRTADDR pvLinAddr,
370
IMG_UINT32 ui32PTSize,
371
IMG_UINT32 ui32Flags,
372
IMG_HANDLE hUniqueTag)
375
IMG_DEV_PHYADDR sDevPAddr;
377
PDUMP_GET_SCRIPT_STRING();
379
PVR_ASSERT(((IMG_UINTPTR_T)pvLinAddr & (ui32PTSize - 1)) == 0);
380
ui32Flags |= PDUMP_FLAGS_CONTINUOUS;
381
ui32Flags |= ( _PDumpIsPersistent() ) ? PDUMP_FLAGS_PERSISTENT : 0;
385
eErr = PDumpOSBufprintf(hScript,
387
"-- MALLOC :%s:PAGE_TABLE 0x%08X %u\r\n",
388
psDevId->pszPDumpDevName,
391
if(eErr != PVRSRV_OK)
395
PDumpOSWriteString2(hScript, ui32Flags);
404
PDumpOSCPUVAddrToDevPAddr(psDevId->eDeviceType,
407
(IMG_PUINT8) pvLinAddr,
411
eErr = PDumpOSBufprintf(hScript, ui32MaxLen, "MALLOC :%s:PA_%08X%08X 0x%X %u 0x%08X\r\n",
412
psDevId->pszPDumpDevName,
413
(IMG_UINT32)(IMG_UINTPTR_T)hUniqueTag,
418
if(eErr != PVRSRV_OK)
422
PDumpOSWriteString2(hScript, ui32Flags);
427
PVRSRV_ERROR PDumpFreePages (BM_HEAP *psBMHeap,
428
IMG_DEV_VIRTADDR sDevVAddr,
429
IMG_UINT32 ui32NumBytes,
430
IMG_UINT32 ui32PageSize,
431
IMG_HANDLE hUniqueTag,
432
IMG_BOOL bInterleaved)
435
IMG_UINT32 ui32NumPages, ui32PageCounter;
436
IMG_DEV_PHYADDR sDevPAddr;
437
IMG_UINT32 ui32Flags = PDUMP_FLAGS_CONTINUOUS;
438
PVRSRV_DEVICE_NODE *psDeviceNode;
440
PDUMP_GET_SCRIPT_STRING();
442
PVR_ASSERT(((IMG_UINT32) sDevVAddr.uiAddr & (ui32PageSize - 1)) == 0);
443
PVR_ASSERT(((IMG_UINT32) ui32NumBytes & (ui32PageSize - 1)) == 0);
445
psDeviceNode = psBMHeap->pBMContext->psDeviceNode;
446
ui32Flags |= ( _PDumpIsPersistent() ) ? PDUMP_FLAGS_PERSISTENT : 0;
450
eErr = PDumpOSBufprintf(hScript, ui32MaxLen, "-- FREE :%s:VA_%08X\r\n",
451
psDeviceNode->sDevId.pszPDumpDevName, sDevVAddr.uiAddr);
452
if(eErr != PVRSRV_OK)
457
#if defined(SUPPORT_PDUMP_MULTI_PROCESS)
460
PVRSRV_DEVICE_NODE *psDeviceNode = psBMHeap->pBMContext->psDeviceNode;
462
if( psDeviceNode->pfnMMUIsHeapShared(psBMHeap->pMMUHeap) )
464
ui32Flags |= PDUMP_FLAGS_PERSISTENT;
468
PDumpOSWriteString2(hScript, ui32Flags);
472
ui32NumPages = ui32NumBytes / ui32PageSize;
473
for (ui32PageCounter = 0; ui32PageCounter < ui32NumPages; ui32PageCounter++)
475
if (!bInterleaved || (ui32PageCounter % 2) == 0)
477
sDevPAddr = psDeviceNode->pfnMMUGetPhysPageAddr(psBMHeap->pMMUHeap, sDevVAddr);
479
PVR_ASSERT(sDevPAddr.uiAddr != 0)
481
eErr = PDumpOSBufprintf(hScript, ui32MaxLen, "FREE :%s:PA_%08X%08X\r\n",
482
psDeviceNode->sDevId.pszPDumpDevName, (IMG_UINT32)(IMG_UINTPTR_T)hUniqueTag, sDevPAddr.uiAddr);
483
if(eErr != PVRSRV_OK)
487
PDumpOSWriteString2(hScript, ui32Flags);
494
sDevVAddr.uiAddr += ui32PageSize;
499
PVRSRV_ERROR PDumpFreePageTable (PVRSRV_DEVICE_IDENTIFIER *psDevID,
500
IMG_HANDLE hOSMemHandle,
501
IMG_CPU_VIRTADDR pvLinAddr,
502
IMG_UINT32 ui32PTSize,
503
IMG_UINT32 ui32Flags,
504
IMG_HANDLE hUniqueTag)
507
IMG_DEV_PHYADDR sDevPAddr;
509
PDUMP_GET_SCRIPT_STRING();
511
PVR_UNREFERENCED_PARAMETER(ui32PTSize);
512
ui32Flags |= PDUMP_FLAGS_CONTINUOUS;
513
ui32Flags |= ( _PDumpIsPersistent() ) ? PDUMP_FLAGS_PERSISTENT : 0;
516
PVR_ASSERT(((IMG_UINTPTR_T)pvLinAddr & (ui32PTSize-1UL)) == 0);
520
eErr = PDumpOSBufprintf(hScript, ui32MaxLen, "-- FREE :%s:PAGE_TABLE\r\n", psDevID->pszPDumpDevName);
521
if(eErr != PVRSRV_OK)
525
PDumpOSWriteString2(hScript, ui32Flags);
534
PDumpOSCPUVAddrToDevPAddr(psDevID->eDeviceType,
537
(IMG_PUINT8) pvLinAddr,
542
eErr = PDumpOSBufprintf(hScript, ui32MaxLen, "FREE :%s:PA_%08X%08X\r\n",
543
psDevID->pszPDumpDevName,
544
(IMG_UINT32)(IMG_UINTPTR_T)hUniqueTag,
546
if(eErr != PVRSRV_OK)
550
PDumpOSWriteString2(hScript, ui32Flags);
556
PVRSRV_ERROR PDumpPDRegWithFlags(PDUMP_MMU_ATTRIB *psMMUAttrib,
559
IMG_UINT32 ui32Flags,
560
IMG_HANDLE hUniqueTag)
563
IMG_CHAR *pszRegString;
564
PDUMP_GET_SCRIPT_STRING()
566
if(psMMUAttrib->pszPDRegRegion != IMG_NULL)
568
pszRegString = psMMUAttrib->pszPDRegRegion;
572
pszRegString = psMMUAttrib->sDevId.pszPDumpRegName;
577
#if defined(SGX_FEATURE_36BIT_MMU)
578
eErr = PDumpOSBufprintf(hScript, ui32MaxLen,
579
"WRW :%s:$1 :%s:PA_%08X%08X:0x0\r\n",
580
psMMUAttrib->sDevId.pszPDumpDevName,
581
psMMUAttrib->sDevId.pszPDumpDevName,
582
(IMG_UINT32)hUniqueTag,
583
(ui32Data & psMMUAttrib->ui32PDEMask) << psMMUAttrib->ui32PDEAlignShift);
584
if(eErr != PVRSRV_OK)
588
PDumpOSWriteString2(hScript, ui32Flags);
589
eErr = PDumpOSBufprintf(hScript, ui32MaxLen, "SHR :%s:$1 :%s:$1 0x4\r\n",
590
psMMUAttrib->sDevId.pszPDumpDevName,
591
psMMUAttrib->sDevId.pszPDumpDevName);
592
if(eErr != PVRSRV_OK)
596
PDumpOSWriteString2(hScript, ui32Flags);
597
eErr = PDumpOSBufprintf(hScript, ui32MaxLen,
598
"WRW :%s:0x%08X: %s:$1\r\n",
601
psMMUAttrib->sDevId.pszPDumpDevName);
602
if(eErr != PVRSRV_OK)
606
PDumpOSWriteString2(hScript, ui32Flags);
608
eErr = PDumpOSBufprintf(hScript,
610
"WRW :%s:0x%08X :%s:PA_%08X%08X:0x%08X\r\n",
613
psMMUAttrib->sDevId.pszPDumpDevName,
614
(IMG_UINT32)(IMG_UINTPTR_T)hUniqueTag,
615
(ui32Data & psMMUAttrib->ui32PDEMask) << psMMUAttrib->ui32PDEAlignShift,
616
ui32Data & ~psMMUAttrib->ui32PDEMask);
617
if(eErr != PVRSRV_OK)
621
PDumpOSWriteString2(hScript, ui32Flags);
626
PVRSRV_ERROR PDumpPDReg (PDUMP_MMU_ATTRIB *psMMUAttrib,
629
IMG_HANDLE hUniqueTag)
631
return PDumpPDRegWithFlags(psMMUAttrib, ui32Reg, ui32Data, PDUMP_FLAGS_CONTINUOUS, hUniqueTag);
634
PVRSRV_ERROR PDumpMemPolKM(PVRSRV_KERNEL_MEM_INFO *psMemInfo,
635
IMG_UINT32 ui32Offset,
636
IMG_UINT32 ui32Value,
638
PDUMP_POLL_OPERATOR eOperator,
639
IMG_UINT32 ui32Flags,
640
IMG_HANDLE hUniqueTag)
642
#define MEMPOLL_DELAY (1000)
643
#define MEMPOLL_COUNT (2000000000 / MEMPOLL_DELAY)
646
IMG_UINT32 ui32PageOffset;
647
IMG_UINT8 *pui8LinAddr;
648
IMG_DEV_PHYADDR sDevPAddr;
649
IMG_DEV_VIRTADDR sDevVPageAddr;
650
PDUMP_MMU_ATTRIB *psMMUAttrib;
652
PDUMP_GET_SCRIPT_STRING();
654
if (PDumpOSIsSuspended())
659
if ( _PDumpIsPersistent() )
666
PVR_ASSERT((ui32Offset + sizeof(IMG_UINT32)) <= psMemInfo->uAllocSize);
668
psMMUAttrib = ((BM_BUF*)psMemInfo->sMemBlk.hBuffer)->pMapping->pBMHeap->psMMUAttrib;
672
eErr = PDumpOSBufprintf(hScript,
674
"-- POL :%s:VA_%08X 0x%08X 0x%08X %d %d %d\r\n",
675
psMMUAttrib->sDevId.pszPDumpDevName,
676
psMemInfo->sDevVAddr.uiAddr + ui32Offset,
682
if(eErr != PVRSRV_OK)
686
PDumpOSWriteString2(hScript, ui32Flags);
689
pui8LinAddr = psMemInfo->pvLinAddrKM;
692
pui8LinAddr += ui32Offset;
697
PDumpOSCPUVAddrToPhysPages(psMemInfo->sMemBlk.hOSMemHandle,
700
psMMUAttrib->ui32DataPageMask,
704
sDevVPageAddr.uiAddr = psMemInfo->sDevVAddr.uiAddr + ui32Offset - ui32PageOffset;
706
PVR_ASSERT((sDevVPageAddr.uiAddr & psMMUAttrib->ui32DataPageMask) == 0);
709
BM_GetPhysPageAddr(psMemInfo, sDevVPageAddr, &sDevPAddr);
712
sDevPAddr.uiAddr += ui32PageOffset;
714
eErr = PDumpOSBufprintf(hScript,
716
"POL :%s:PA_%08X%08X:0x%08X 0x%08X 0x%08X %d %d %d\r\n",
717
psMMUAttrib->sDevId.pszPDumpDevName,
718
(IMG_UINT32)(IMG_UINTPTR_T)hUniqueTag,
719
sDevPAddr.uiAddr & ~(psMMUAttrib->ui32DataPageMask),
720
sDevPAddr.uiAddr & (psMMUAttrib->ui32DataPageMask),
726
if(eErr != PVRSRV_OK)
730
PDumpOSWriteString2(hScript, ui32Flags);
735
PVRSRV_ERROR PDumpMemKM(IMG_PVOID pvAltLinAddr,
736
PVRSRV_KERNEL_MEM_INFO *psMemInfo,
737
IMG_UINT32 ui32Offset,
738
IMG_UINT32 ui32Bytes,
739
IMG_UINT32 ui32Flags,
740
IMG_HANDLE hUniqueTag)
743
IMG_UINT32 ui32NumPages;
744
IMG_UINT32 ui32PageByteOffset;
745
IMG_UINT32 ui32BlockBytes;
746
IMG_UINT8* pui8LinAddr;
747
IMG_UINT8* pui8DataLinAddr = IMG_NULL;
748
IMG_DEV_VIRTADDR sDevVPageAddr;
749
IMG_DEV_VIRTADDR sDevVAddr;
750
IMG_DEV_PHYADDR sDevPAddr;
751
IMG_UINT32 ui32ParamOutPos;
752
PDUMP_MMU_ATTRIB *psMMUAttrib;
753
IMG_UINT32 ui32DataPageSize;
755
PDUMP_GET_SCRIPT_AND_FILE_STRING();
758
if (ui32Bytes == 0 || PDumpOSIsSuspended())
763
psMMUAttrib = ((BM_BUF*)psMemInfo->sMemBlk.hBuffer)->pMapping->pBMHeap->psMMUAttrib;
767
PVR_ASSERT((ui32Offset + ui32Bytes) <= psMemInfo->uAllocSize);
769
if (!PDumpOSJTInitialised())
771
return PVRSRV_ERROR_PDUMP_NOT_AVAILABLE;
774
#if defined(SUPPORT_PDUMP_MULTI_PROCESS)
777
BM_HEAP *pHeap = ((BM_BUF*)psMemInfo->sMemBlk.hBuffer)->pMapping->pBMHeap;
778
PVRSRV_DEVICE_NODE *psDeviceNode = pHeap->pBMContext->psDeviceNode;
780
if( psDeviceNode->pfnMMUIsHeapShared(pHeap->pMMUHeap) )
782
ui32Flags |= PDUMP_FLAGS_PERSISTENT;
790
pui8DataLinAddr = pvAltLinAddr;
792
else if(psMemInfo->pvLinAddrKM)
794
pui8DataLinAddr = (IMG_UINT8 *)psMemInfo->pvLinAddrKM + ui32Offset;
796
pui8LinAddr = (IMG_UINT8 *)psMemInfo->pvLinAddrKM;
797
sDevVAddr = psMemInfo->sDevVAddr;
800
sDevVAddr.uiAddr += ui32Offset;
801
pui8LinAddr += ui32Offset;
803
PVR_ASSERT(pui8DataLinAddr);
805
PDumpOSCheckForSplitting(PDumpOSGetStream(PDUMP_STREAM_PARAM2), ui32Bytes, ui32Flags);
807
ui32ParamOutPos = PDumpOSGetStreamOffset(PDUMP_STREAM_PARAM2);
811
if(!PDumpOSWriteString(PDumpOSGetStream(PDUMP_STREAM_PARAM2),
816
return PVRSRV_ERROR_PDUMP_BUFFER_FULL;
819
if (PDumpOSGetParamFileNum() == 0)
821
eErr = PDumpOSSprintf(pszFileName, ui32MaxLenFileName, "%%0%%.prm");
825
eErr = PDumpOSSprintf(pszFileName, ui32MaxLenFileName, "%%0%%_%u.prm", PDumpOSGetParamFileNum());
827
if(eErr != PVRSRV_OK)
834
eErr = PDumpOSBufprintf(hScript,
836
"-- LDB :%s:VA_%08X%08X:0x%08X 0x%08X 0x%08X %s\r\n",
837
psMMUAttrib->sDevId.pszPDumpDevName,
838
(IMG_UINT32)(IMG_UINTPTR_T)hUniqueTag,
839
psMemInfo->sDevVAddr.uiAddr,
844
if(eErr != PVRSRV_OK)
848
PDumpOSWriteString2(hScript, ui32Flags);
853
PDumpOSCPUVAddrToPhysPages(psMemInfo->sMemBlk.hOSMemHandle,
856
psMMUAttrib->ui32DataPageMask,
857
&ui32PageByteOffset);
858
ui32DataPageSize = psMMUAttrib->ui32DataPageMask + 1;
859
ui32NumPages = (ui32PageByteOffset + ui32Bytes + psMMUAttrib->ui32DataPageMask) / ui32DataPageSize;
866
sDevVPageAddr.uiAddr = sDevVAddr.uiAddr - ui32PageByteOffset;
868
if (ui32DataPageSize <= PDUMP_TEMP_BUFFER_SIZE)
871
PVR_ASSERT((sDevVPageAddr.uiAddr & psMMUAttrib->ui32DataPageMask) == 0);
875
BM_GetPhysPageAddr(psMemInfo, sDevVPageAddr, &sDevPAddr);
878
sDevPAddr.uiAddr += ui32PageByteOffset;
881
if (ui32PageByteOffset + ui32Bytes > ui32DataPageSize)
884
ui32BlockBytes = ui32DataPageSize - ui32PageByteOffset;
889
ui32BlockBytes = ui32Bytes;
892
eErr = PDumpOSBufprintf(hScript,
894
"LDB :%s:PA_%08X%08X:0x%08X 0x%08X 0x%08X %s\r\n",
895
psMMUAttrib->sDevId.pszPDumpDevName,
896
(IMG_UINT32)(IMG_UINTPTR_T)hUniqueTag,
897
sDevPAddr.uiAddr & ~(psMMUAttrib->ui32DataPageMask),
898
sDevPAddr.uiAddr & (psMMUAttrib->ui32DataPageMask),
902
if(eErr != PVRSRV_OK)
906
PDumpOSWriteString2(hScript, ui32Flags);
910
#if defined(SGX_FEATURE_VARIABLE_MMU_PAGE_SIZE)
912
ui32PageByteOffset = (ui32PageByteOffset + ui32BlockBytes) % ui32DataPageSize;
915
ui32PageByteOffset = 0;
918
ui32Bytes -= ui32BlockBytes;
920
sDevVAddr.uiAddr += ui32BlockBytes;
922
pui8LinAddr += ui32BlockBytes;
924
ui32ParamOutPos += ui32BlockBytes;
930
PVRSRV_ERROR PDumpMemPDEntriesKM(PDUMP_MMU_ATTRIB *psMMUAttrib,
931
IMG_HANDLE hOSMemHandle,
932
IMG_CPU_VIRTADDR pvLinAddr,
933
IMG_UINT32 ui32Bytes,
934
IMG_UINT32 ui32Flags,
935
IMG_BOOL bInitialisePages,
936
IMG_HANDLE hUniqueTag1,
937
IMG_HANDLE hUniqueTag2)
939
PDUMP_MMU_ATTRIB sMMUAttrib;
942
sMMUAttrib = *psMMUAttrib;
943
sMMUAttrib.ui32PTSize = (IMG_UINT32)HOST_PAGESIZE();
944
return PDumpMemPTEntriesKM( &sMMUAttrib,
954
PVRSRV_ERROR PDumpMemPTEntriesKM(PDUMP_MMU_ATTRIB *psMMUAttrib,
955
IMG_HANDLE hOSMemHandle,
956
IMG_CPU_VIRTADDR pvLinAddr,
957
IMG_UINT32 ui32Bytes,
958
IMG_UINT32 ui32Flags,
959
IMG_BOOL bInitialisePages,
960
IMG_HANDLE hUniqueTag1,
961
IMG_HANDLE hUniqueTag2)
964
IMG_UINT32 ui32NumPages;
965
IMG_UINT32 ui32PageOffset;
966
IMG_UINT32 ui32BlockBytes;
967
IMG_UINT8* pui8LinAddr;
968
IMG_DEV_PHYADDR sDevPAddr;
969
IMG_CPU_PHYADDR sCpuPAddr;
970
IMG_UINT32 ui32Offset;
971
IMG_UINT32 ui32ParamOutPos;
972
IMG_UINT32 ui32PageMask;
974
PDUMP_GET_SCRIPT_AND_FILE_STRING();
975
ui32Flags |= ( _PDumpIsPersistent() ) ? PDUMP_FLAGS_PERSISTENT : 0;
977
if (PDumpOSIsSuspended())
982
if (!PDumpOSJTInitialised())
984
return PVRSRV_ERROR_PDUMP_NOT_AVAILABLE;
989
return PVRSRV_ERROR_INVALID_PARAMS;
992
PDumpOSCheckForSplitting(PDumpOSGetStream(PDUMP_STREAM_PARAM2), ui32Bytes, ui32Flags);
994
ui32ParamOutPos = PDumpOSGetStreamOffset(PDUMP_STREAM_PARAM2);
996
if (bInitialisePages)
1001
if (!PDumpOSWriteString(PDumpOSGetStream(PDUMP_STREAM_PARAM2),
1004
ui32Flags | PDUMP_FLAGS_CONTINUOUS))
1006
return PVRSRV_ERROR_PDUMP_BUFFER_FULL;
1009
if (PDumpOSGetParamFileNum() == 0)
1011
eErr = PDumpOSSprintf(pszFileName, ui32MaxLenFileName, "%%0%%.prm");
1015
eErr = PDumpOSSprintf(pszFileName, ui32MaxLenFileName, "%%0%%_%u.prm", PDumpOSGetParamFileNum());
1017
if(eErr != PVRSRV_OK)
1028
ui32PageMask = psMMUAttrib->ui32PTSize - 1;
1033
ui32PageOffset = (IMG_UINT32)((IMG_UINTPTR_T)pvLinAddr & (psMMUAttrib->ui32PTSize - 1));
1034
ui32NumPages = (ui32PageOffset + ui32Bytes + psMMUAttrib->ui32PTSize - 1) / psMMUAttrib->ui32PTSize;
1035
pui8LinAddr = (IMG_UINT8*) pvLinAddr;
1037
while (ui32NumPages)
1046
sCpuPAddr = OSMapLinToCPUPhys(hOSMemHandle, pui8LinAddr);
1047
sDevPAddr = SysCpuPAddrToDevPAddr(psMMUAttrib->sDevId.eDeviceType, sCpuPAddr);
1050
if (ui32PageOffset + ui32Bytes > psMMUAttrib->ui32PTSize)
1053
ui32BlockBytes = psMMUAttrib->ui32PTSize - ui32PageOffset;
1058
ui32BlockBytes = ui32Bytes;
1064
if (bInitialisePages)
1066
eErr = PDumpOSBufprintf(hScript,
1068
"LDB :%s:PA_%08X%08X:0x%08X 0x%08X 0x%08X %s\r\n",
1069
psMMUAttrib->sDevId.pszPDumpDevName,
1070
(IMG_UINT32)(IMG_UINTPTR_T)hUniqueTag1,
1071
sDevPAddr.uiAddr & ~ui32PageMask,
1072
sDevPAddr.uiAddr & ui32PageMask,
1076
if(eErr != PVRSRV_OK)
1080
PDumpOSWriteString2(hScript, ui32Flags | PDUMP_FLAGS_CONTINUOUS);
1084
for (ui32Offset = 0; ui32Offset < ui32BlockBytes; ui32Offset += sizeof(IMG_UINT32))
1086
IMG_UINT32 ui32PTE = *((IMG_UINT32 *)(IMG_UINTPTR_T)(pui8LinAddr + ui32Offset));
1088
if ((ui32PTE & psMMUAttrib->ui32PDEMask) != 0)
1091
#if defined(SGX_FEATURE_36BIT_MMU)
1092
eErr = PDumpOSBufprintf(hScript,
1094
"WRW :%s:$1 :%s:PA_%08X%08X:0x0\r\n",
1095
psMMUAttrib->sDevId.pszPDumpDevName,
1096
psMMUAttrib->sDevId.pszPDumpDevName,
1097
(IMG_UINT32)hUniqueTag2,
1098
(ui32PTE & psMMUAttrib->ui32PDEMask) << psMMUAttrib->ui32PTEAlignShift);
1099
if(eErr != PVRSRV_OK)
1103
PDumpOSWriteString2(hScript, ui32Flags | PDUMP_FLAGS_CONTINUOUS);
1104
eErr = PDumpOSBufprintf(hScript, ui32MaxLenScript, "SHR :%s:$1 :%s:$1 0x4\r\n",
1105
psMMUAttrib->sDevId.pszPDumpDevName,
1106
psMMUAttrib->sDevId.pszPDumpDevName);
1107
if(eErr != PVRSRV_OK)
1111
PDumpOSWriteString2(hScript, ui32Flags | PDUMP_FLAGS_CONTINUOUS);
1112
eErr = PDumpOSBufprintf(hScript, ui32MaxLenScript, "OR :%s:$1 :%s:$1 0x%08X\r\n",
1113
psMMUAttrib->sDevId.pszPDumpDevName,
1114
psMMUAttrib->sDevId.pszPDumpDevName,
1115
ui32PTE & ~psMMUAttrib->ui32PDEMask);
1116
if(eErr != PVRSRV_OK)
1120
PDumpOSWriteString2(hScript, ui32Flags | PDUMP_FLAGS_CONTINUOUS);
1121
eErr = PDumpOSBufprintf(hScript,
1123
"WRW :%s:PA_%08X%08X:0x%08X :%s:$1\r\n",
1124
psMMUAttrib->sDevId.pszPDumpDevName,
1125
(IMG_UINT32)hUniqueTag1,
1126
(sDevPAddr.uiAddr + ui32Offset) & ~ui32PageMask,
1127
(sDevPAddr.uiAddr + ui32Offset) & ui32PageMask,
1128
psMMUAttrib->sDevId.pszPDumpDevName);
1129
if(eErr != PVRSRV_OK)
1133
PDumpOSWriteString2(hScript, ui32Flags | PDUMP_FLAGS_CONTINUOUS);
1135
eErr = PDumpOSBufprintf(hScript,
1137
"WRW :%s:PA_%08X%08X:0x%08X :%s:PA_%08X%08X:0x%08X\r\n",
1138
psMMUAttrib->sDevId.pszPDumpDevName,
1139
(IMG_UINT32)(IMG_UINTPTR_T)hUniqueTag1,
1140
(sDevPAddr.uiAddr + ui32Offset) & ~ui32PageMask,
1141
(sDevPAddr.uiAddr + ui32Offset) & ui32PageMask,
1142
psMMUAttrib->sDevId.pszPDumpDevName,
1143
(IMG_UINT32)(IMG_UINTPTR_T)hUniqueTag2,
1144
(ui32PTE & psMMUAttrib->ui32PDEMask) << psMMUAttrib->ui32PTEAlignShift,
1145
ui32PTE & ~psMMUAttrib->ui32PDEMask);
1146
if(eErr != PVRSRV_OK)
1150
PDumpOSWriteString2(hScript, ui32Flags | PDUMP_FLAGS_CONTINUOUS);
1155
#if !defined(FIX_HW_BRN_31620)
1156
PVR_ASSERT((ui32PTE & psMMUAttrib->ui32PTEValid) == 0UL);
1158
eErr = PDumpOSBufprintf(hScript,
1160
"WRW :%s:PA_%08X%08X:0x%08X 0x%08X%08X\r\n",
1161
psMMUAttrib->sDevId.pszPDumpDevName,
1162
(IMG_UINT32)(IMG_UINTPTR_T)hUniqueTag1,
1163
(sDevPAddr.uiAddr + ui32Offset) & ~ui32PageMask,
1164
(sDevPAddr.uiAddr + ui32Offset) & ui32PageMask,
1165
(ui32PTE << psMMUAttrib->ui32PTEAlignShift),
1166
(IMG_UINT32)(IMG_UINTPTR_T)hUniqueTag2);
1167
if(eErr != PVRSRV_OK)
1171
PDumpOSWriteString2(hScript, ui32Flags | PDUMP_FLAGS_CONTINUOUS);
1181
ui32Bytes -= ui32BlockBytes;
1183
pui8LinAddr += ui32BlockBytes;
1185
ui32ParamOutPos += ui32BlockBytes;
1191
PVRSRV_ERROR PDumpPDDevPAddrKM(PVRSRV_KERNEL_MEM_INFO *psMemInfo,
1192
IMG_UINT32 ui32Offset,
1193
IMG_DEV_PHYADDR sPDDevPAddr,
1194
IMG_HANDLE hUniqueTag1,
1195
IMG_HANDLE hUniqueTag2)
1198
IMG_UINT32 ui32PageByteOffset;
1199
IMG_DEV_VIRTADDR sDevVAddr;
1200
IMG_DEV_VIRTADDR sDevVPageAddr;
1201
IMG_DEV_PHYADDR sDevPAddr;
1202
IMG_UINT32 ui32Flags = PDUMP_FLAGS_CONTINUOUS;
1203
IMG_UINT32 ui32ParamOutPos;
1204
PDUMP_MMU_ATTRIB *psMMUAttrib;
1205
IMG_UINT32 ui32PageMask;
1207
PDUMP_GET_SCRIPT_AND_FILE_STRING();
1209
if (!PDumpOSJTInitialised())
1211
return PVRSRV_ERROR_PDUMP_NOT_AVAILABLE;
1214
psMMUAttrib = ((BM_BUF*)psMemInfo->sMemBlk.hBuffer)->pMapping->pBMHeap->psMMUAttrib;
1215
ui32PageMask = psMMUAttrib->ui32PTSize - 1;
1217
ui32ParamOutPos = PDumpOSGetStreamOffset(PDUMP_STREAM_PARAM2);
1220
if(!PDumpOSWriteString(PDumpOSGetStream(PDUMP_STREAM_PARAM2),
1221
(IMG_UINT8 *)&sPDDevPAddr,
1222
sizeof(IMG_DEV_PHYADDR),
1225
return PVRSRV_ERROR_PDUMP_BUFFER_FULL;
1228
if (PDumpOSGetParamFileNum() == 0)
1230
eErr = PDumpOSSprintf(pszFileName, ui32MaxLenFileName, "%%0%%.prm");
1234
eErr = PDumpOSSprintf(pszFileName, ui32MaxLenFileName, "%%0%%_%u.prm", PDumpOSGetParamFileNum());
1236
if(eErr != PVRSRV_OK)
1242
eErr = PDumpOSBufprintf(hScript,
1244
"-- LDB :%s:PA_0x%08X%08X:0x%08X 0x%08X 0x%08X %s\r\n",
1245
psMMUAttrib->sDevId.pszPDumpDevName,
1246
(IMG_UINT32)(IMG_UINTPTR_T)hUniqueTag1,
1247
sPDDevPAddr.uiAddr & ~ui32PageMask,
1248
sPDDevPAddr.uiAddr & ui32PageMask,
1249
sizeof(IMG_DEV_PHYADDR),
1252
if(eErr != PVRSRV_OK)
1256
PDumpOSWriteString2(hScript, ui32Flags);
1259
sDevVAddr = psMemInfo->sDevVAddr;
1260
ui32PageByteOffset = sDevVAddr.uiAddr & ui32PageMask;
1262
sDevVPageAddr.uiAddr = sDevVAddr.uiAddr - ui32PageByteOffset;
1263
PVR_ASSERT((sDevVPageAddr.uiAddr & 0xFFF) == 0);
1265
BM_GetPhysPageAddr(psMemInfo, sDevVPageAddr, &sDevPAddr);
1266
sDevPAddr.uiAddr += ui32PageByteOffset + ui32Offset;
1268
if ((sPDDevPAddr.uiAddr & psMMUAttrib->ui32PDEMask) != 0UL)
1270
#if defined(SGX_FEATURE_36BIT_MMU)
1271
eErr = PDumpOSBufprintf(hScript,
1273
"WRW :%s:$1 :%s:PA_%08X%08X:0x0\r\n",
1274
psMMUAttrib->sDevId.pszPDumpDevName,
1275
psMMUAttrib->sDevId.pszPDumpDevName,
1276
(IMG_UINT32)hUniqueTag2,
1277
sPDDevPAddr.uiAddr);
1278
if(eErr != PVRSRV_OK)
1282
PDumpOSWriteString2(hScript, ui32Flags);
1284
eErr = PDumpOSBufprintf(hScript, ui32MaxLenScript, "AND :%s:$2 :%s:$1 0xFFFFFFFF\r\n",
1285
psMMUAttrib->sDevId.pszPDumpDevName,
1286
psMMUAttrib->sDevId.pszPDumpDevName);
1287
if(eErr != PVRSRV_OK)
1291
PDumpOSWriteString2(hScript, ui32Flags);
1293
eErr = PDumpOSBufprintf(hScript,
1295
"WRW :%s:PA_%08X%08X:0x%08X :%s:$2\r\n",
1296
psMMUAttrib->sDevId.pszPDumpDevName,
1297
(IMG_UINT32)hUniqueTag1,
1298
(sDevPAddr.uiAddr) & ~(psMMUAttrib->ui32DataPageMask),
1299
(sDevPAddr.uiAddr) & (psMMUAttrib->ui32DataPageMask),
1300
psMMUAttrib->sDevId.pszPDumpDevName);
1301
if(eErr != PVRSRV_OK)
1305
PDumpOSWriteString2(hScript, ui32Flags);
1307
eErr = PDumpOSBufprintf(hScript, ui32MaxLenScript, "SHR :%s:$2 :%s:$1 0x20\r\n",
1308
psMMUAttrib->sDevId.pszPDumpDevName,
1309
psMMUAttrib->sDevId.pszPDumpDevName);
1310
if(eErr != PVRSRV_OK)
1314
PDumpOSWriteString2(hScript, ui32Flags);
1316
eErr = PDumpOSBufprintf(hScript,
1318
"WRW :%s:PA_%08X%08X:0x%08X :%s:$2\r\n",
1319
psMMUAttrib->sDevId.pszPDumpDevName,
1320
(IMG_UINT32)hUniqueTag1,
1321
(sDevPAddr.uiAddr + 4) & ~(psMMUAttrib->ui32DataPageMask),
1322
(sDevPAddr.uiAddr + 4) & (psMMUAttrib->ui32DataPageMask),
1323
psMMUAttrib->sDevId.pszPDumpDevName);
1324
if(eErr != PVRSRV_OK)
1328
PDumpOSWriteString2(hScript, ui32Flags);
1330
eErr = PDumpOSBufprintf(hScript,
1332
"WRW :%s:PA_%08X%08X:0x%08X :%s:PA_%08X%08X:0x%08X\r\n",
1333
psMMUAttrib->sDevId.pszPDumpDevName,
1334
(IMG_UINT32)(IMG_UINTPTR_T)hUniqueTag1,
1335
sDevPAddr.uiAddr & ~ui32PageMask,
1336
sDevPAddr.uiAddr & ui32PageMask,
1337
psMMUAttrib->sDevId.pszPDumpDevName,
1338
(IMG_UINT32)(IMG_UINTPTR_T)hUniqueTag2,
1339
sPDDevPAddr.uiAddr & psMMUAttrib->ui32PDEMask,
1340
sPDDevPAddr.uiAddr & ~psMMUAttrib->ui32PDEMask);
1341
if(eErr != PVRSRV_OK)
1349
PVR_ASSERT(!(sDevPAddr.uiAddr & psMMUAttrib->ui32PTEValid));
1350
eErr = PDumpOSBufprintf(hScript,
1352
"WRW :%s:PA_%08X%08X:0x%08X 0x%08X\r\n",
1353
psMMUAttrib->sDevId.pszPDumpDevName,
1354
(IMG_UINT32)(IMG_UINTPTR_T)hUniqueTag1,
1355
sDevPAddr.uiAddr & ~ui32PageMask,
1356
sDevPAddr.uiAddr & ui32PageMask,
1357
sPDDevPAddr.uiAddr);
1358
if(eErr != PVRSRV_OK)
1363
PDumpOSWriteString2(hScript, ui32Flags);
1368
PVRSRV_ERROR PDumpCommentKM(IMG_CHAR *pszComment, IMG_UINT32 ui32Flags)
1371
IMG_CHAR pszCommentPrefix[] = "-- ";
1372
#if defined(PDUMP_DEBUG_OUTFILES)
1373
IMG_CHAR pszTemp[256];
1375
IMG_UINT32 ui32LenCommentPrefix;
1376
PDUMP_GET_SCRIPT_STRING();
1377
PDUMP_DBG(("PDumpCommentKM"));
1378
#if defined(PDUMP_DEBUG_OUTFILES)
1380
ui32Flags |= ( _PDumpIsPersistent() ) ? PDUMP_FLAGS_PERSISTENT : 0;
1383
PDumpOSVerifyLineEnding(pszComment, ui32MaxLen);
1386
ui32LenCommentPrefix = PDumpOSBuflen(pszCommentPrefix, sizeof(pszCommentPrefix));
1390
if (!PDumpOSWriteString(PDumpOSGetStream(PDUMP_STREAM_SCRIPT2),
1391
(IMG_UINT8*)pszCommentPrefix,
1392
ui32LenCommentPrefix,
1395
#if defined(PDUMP_DEBUG_OUTFILES)
1396
if(ui32Flags & PDUMP_FLAGS_CONTINUOUS)
1398
PVR_DPF((PVR_DBG_WARNING, "Incomplete comment, %d: %s (continuous set)",
1399
g_ui32EveryLineCounter, pszComment));
1400
return PVRSRV_ERROR_PDUMP_BUFFER_FULL;
1402
else if(ui32Flags & PDUMP_FLAGS_PERSISTENT)
1404
PVR_DPF((PVR_DBG_WARNING, "Incomplete comment, %d: %s (persistent set)",
1405
g_ui32EveryLineCounter, pszComment));
1406
return PVRSRV_ERROR_CMD_NOT_PROCESSED;
1410
PVR_DPF((PVR_DBG_WARNING, "Incomplete comment, %d: %s",
1411
g_ui32EveryLineCounter, pszComment));
1412
return PVRSRV_ERROR_CMD_NOT_PROCESSED;
1415
PVR_DPF((PVR_DBG_WARNING, "Incomplete comment, %s",
1417
return PVRSRV_ERROR_CMD_NOT_PROCESSED;
1421
#if defined(PDUMP_DEBUG_OUTFILES)
1423
eErr = PDumpOSSprintf(pszTemp, 256, "%d-%d %s",
1425
g_ui32EveryLineCounter,
1429
eErr = PDumpOSBufprintf(hScript, ui32MaxLen, "%s",
1432
eErr = PDumpOSBufprintf(hScript, ui32MaxLen, "%s",
1435
if( (eErr != PVRSRV_OK) &&
1436
(eErr != PVRSRV_ERROR_PDUMP_BUF_OVERFLOW))
1440
PDumpOSWriteString2(hScript, ui32Flags);
1444
PVRSRV_ERROR PDumpCommentWithFlags(IMG_UINT32 ui32Flags, IMG_CHAR * pszFormat, ...)
1448
PDUMP_GET_MSG_STRING();
1451
PDUMP_va_start(ap, pszFormat);
1452
eErr = PDumpOSVSprintf(pszMsg, ui32MaxLen, pszFormat, ap);
1455
if(eErr != PVRSRV_OK)
1459
return PDumpCommentKM(pszMsg, ui32Flags);
1462
PVRSRV_ERROR PDumpComment(IMG_CHAR *pszFormat, ...)
1466
PDUMP_GET_MSG_STRING();
1469
PDUMP_va_start(ap, pszFormat);
1470
eErr = PDumpOSVSprintf(pszMsg, ui32MaxLen, pszFormat, ap);
1473
if(eErr != PVRSRV_OK)
1477
return PDumpCommentKM(pszMsg, PDUMP_FLAGS_CONTINUOUS);
1480
PVRSRV_ERROR PDumpDriverInfoKM(IMG_CHAR *pszString, IMG_UINT32 ui32Flags)
1483
IMG_UINT32 ui32MsgLen;
1484
PDUMP_GET_MSG_STRING();
1487
eErr = PDumpOSSprintf(pszMsg, ui32MaxLen, "%s", pszString);
1488
if(eErr != PVRSRV_OK)
1494
PDumpOSVerifyLineEnding(pszMsg, ui32MaxLen);
1495
ui32MsgLen = PDumpOSBuflen(pszMsg, ui32MaxLen);
1497
if (!PDumpOSWriteString(PDumpOSGetStream(PDUMP_STREAM_DRIVERINFO),
1502
if (ui32Flags & PDUMP_FLAGS_CONTINUOUS)
1504
return PVRSRV_ERROR_PDUMP_BUFFER_FULL;
1508
return PVRSRV_ERROR_CMD_NOT_PROCESSED;
1514
PVRSRV_ERROR PDumpBitmapKM( PVRSRV_DEVICE_NODE *psDeviceNode,
1515
IMG_CHAR *pszFileName,
1516
IMG_UINT32 ui32FileOffset,
1517
IMG_UINT32 ui32Width,
1518
IMG_UINT32 ui32Height,
1519
IMG_UINT32 ui32StrideInBytes,
1520
IMG_DEV_VIRTADDR sDevBaseAddr,
1521
IMG_HANDLE hDevMemContext,
1522
IMG_UINT32 ui32Size,
1523
PDUMP_PIXEL_FORMAT ePixelFormat,
1524
PDUMP_MEM_FORMAT eMemFormat,
1525
IMG_UINT32 ui32PDumpFlags)
1527
PVRSRV_DEVICE_IDENTIFIER *psDevId = &psDeviceNode->sDevId;
1528
IMG_UINT32 ui32MMUContextID;
1530
PDUMP_GET_SCRIPT_STRING();
1532
if ( _PDumpIsPersistent() )
1537
PDumpCommentWithFlags(ui32PDumpFlags, "\r\n-- Dump bitmap of render\r\n");
1540
ui32MMUContextID = psDeviceNode->pfnMMUGetContextID( hDevMemContext );
1542
eErr = PDumpOSBufprintf(hScript,
1544
"SII %s %s.bin :%s:v%x:0x%08X 0x%08X 0x%08X 0x%08X 0x%08X 0x%08X 0x%08X 0x%08X\r\n",
1547
psDevId->pszPDumpDevName,
1549
sDevBaseAddr.uiAddr,
1557
if(eErr != PVRSRV_OK)
1562
PDumpOSWriteString2( hScript, ui32PDumpFlags);
1566
PVRSRV_ERROR PDumpReadRegKM ( IMG_CHAR *pszPDumpRegName,
1567
IMG_CHAR *pszFileName,
1568
IMG_UINT32 ui32FileOffset,
1569
IMG_UINT32 ui32Address,
1570
IMG_UINT32 ui32Size,
1571
IMG_UINT32 ui32PDumpFlags)
1574
PDUMP_GET_SCRIPT_STRING();
1576
PVR_UNREFERENCED_PARAMETER(ui32Size);
1578
eErr = PDumpOSBufprintf(hScript,
1580
"SAB :%s:0x%08X 0x%08X %s\r\n",
1585
if(eErr != PVRSRV_OK)
1590
PDumpOSWriteString2( hScript, ui32PDumpFlags);
1595
IMG_BOOL PDumpTestNextFrame(IMG_UINT32 ui32CurrentFrame)
1597
IMG_BOOL bFrameDumped;
1601
(IMG_VOID) PDumpSetFrameKM(ui32CurrentFrame + 1);
1602
bFrameDumped = PDumpIsCaptureFrameKM();
1603
(IMG_VOID) PDumpSetFrameKM(ui32CurrentFrame);
1605
return bFrameDumped;
1608
static PVRSRV_ERROR PDumpSignatureRegister (PVRSRV_DEVICE_IDENTIFIER *psDevId,
1609
IMG_CHAR *pszFileName,
1610
IMG_UINT32 ui32Address,
1611
IMG_UINT32 ui32Size,
1612
IMG_UINT32 *pui32FileOffset,
1613
IMG_UINT32 ui32Flags)
1616
PDUMP_GET_SCRIPT_STRING();
1618
eErr = PDumpOSBufprintf(hScript,
1620
"SAB :%s:0x%08X 0x%08X %s\r\n",
1621
psDevId->pszPDumpRegName,
1625
if(eErr != PVRSRV_OK)
1630
PDumpOSWriteString2(hScript, ui32Flags);
1631
*pui32FileOffset += ui32Size;
1635
static IMG_VOID PDumpRegisterRange(PVRSRV_DEVICE_IDENTIFIER *psDevId,
1636
IMG_CHAR *pszFileName,
1637
IMG_UINT32 *pui32Registers,
1638
IMG_UINT32 ui32NumRegisters,
1639
IMG_UINT32 *pui32FileOffset,
1640
IMG_UINT32 ui32Size,
1641
IMG_UINT32 ui32Flags)
1644
for (i = 0; i < ui32NumRegisters; i++)
1646
PDumpSignatureRegister(psDevId, pszFileName, pui32Registers[i], ui32Size, pui32FileOffset, ui32Flags);
1650
PVRSRV_ERROR PDump3DSignatureRegisters(PVRSRV_DEVICE_IDENTIFIER *psDevId,
1651
IMG_UINT32 ui32DumpFrameNum,
1652
IMG_BOOL bLastFrame,
1653
IMG_UINT32 *pui32Registers,
1654
IMG_UINT32 ui32NumRegisters)
1657
IMG_UINT32 ui32FileOffset, ui32Flags;
1659
PDUMP_GET_FILE_STRING();
1661
ui32Flags = bLastFrame ? PDUMP_FLAGS_LASTFRAME : 0;
1664
PDumpCommentWithFlags(ui32Flags, "\r\n-- Dump 3D signature registers\r\n");
1665
eErr = PDumpOSSprintf(pszFileName, ui32MaxLen, "out%u_3d.sig", ui32DumpFrameNum);
1666
if(eErr != PVRSRV_OK)
1671
PDumpRegisterRange(psDevId,
1682
PVRSRV_ERROR PDumpTASignatureRegisters (PVRSRV_DEVICE_IDENTIFIER *psDevId,
1683
IMG_UINT32 ui32DumpFrameNum,
1684
IMG_UINT32 ui32TAKickCount,
1685
IMG_BOOL bLastFrame,
1686
IMG_UINT32 *pui32Registers,
1687
IMG_UINT32 ui32NumRegisters)
1690
IMG_UINT32 ui32FileOffset, ui32Flags;
1692
PDUMP_GET_FILE_STRING();
1694
ui32Flags = bLastFrame ? PDUMP_FLAGS_LASTFRAME : 0;
1695
ui32FileOffset = ui32TAKickCount * ui32NumRegisters * sizeof(IMG_UINT32);
1697
PDumpCommentWithFlags(ui32Flags, "\r\n-- Dump TA signature registers\r\n");
1698
eErr = PDumpOSSprintf(pszFileName, ui32MaxLen, "out%u_ta.sig", ui32DumpFrameNum);
1699
if(eErr != PVRSRV_OK)
1704
PDumpRegisterRange(psDevId,
1714
PVRSRV_ERROR PDumpCounterRegisters (PVRSRV_DEVICE_IDENTIFIER *psDevId,
1715
IMG_UINT32 ui32DumpFrameNum,
1716
IMG_BOOL bLastFrame,
1717
IMG_UINT32 *pui32Registers,
1718
IMG_UINT32 ui32NumRegisters)
1721
IMG_UINT32 ui32FileOffset, ui32Flags;
1723
PDUMP_GET_FILE_STRING();
1725
ui32Flags = bLastFrame ? PDUMP_FLAGS_LASTFRAME : 0UL;
1726
ui32FileOffset = 0UL;
1728
PDumpCommentWithFlags(ui32Flags, "\r\n-- Dump counter registers\r\n");
1729
eErr = PDumpOSSprintf(pszFileName, ui32MaxLen, "out%u.perf", ui32DumpFrameNum);
1730
if(eErr != PVRSRV_OK)
1735
PDumpRegisterRange(psDevId,
1746
PVRSRV_ERROR PDumpRegRead(IMG_CHAR *pszPDumpRegName,
1747
const IMG_UINT32 ui32RegOffset,
1748
IMG_UINT32 ui32Flags)
1751
PDUMP_GET_SCRIPT_STRING();
1753
eErr = PDumpOSBufprintf(hScript, ui32MaxLen, "RDW :%s:0x%X\r\n",
1756
if(eErr != PVRSRV_OK)
1760
PDumpOSWriteString2(hScript, ui32Flags);
1764
PVRSRV_ERROR PDumpSaveMemKM (PVRSRV_DEVICE_IDENTIFIER *psDevId,
1765
IMG_CHAR *pszFileName,
1766
IMG_UINT32 ui32FileOffset,
1767
IMG_DEV_VIRTADDR sDevBaseAddr,
1768
IMG_UINT32 ui32Size,
1769
IMG_UINT32 ui32MMUContextID,
1770
IMG_UINT32 ui32PDumpFlags)
1773
PDUMP_GET_SCRIPT_STRING();
1775
eErr = PDumpOSBufprintf(hScript,
1777
"SAB :%s:v%x:0x%08X 0x%08X 0x%08X %s.bin\r\n",
1778
psDevId->pszPDumpDevName,
1780
sDevBaseAddr.uiAddr,
1784
if(eErr != PVRSRV_OK)
1789
PDumpOSWriteString2(hScript, ui32PDumpFlags);
1793
PVRSRV_ERROR PDumpCycleCountRegRead(PVRSRV_DEVICE_IDENTIFIER *psDevId,
1794
const IMG_UINT32 ui32RegOffset,
1795
IMG_BOOL bLastFrame)
1798
PDUMP_GET_SCRIPT_STRING();
1800
eErr = PDumpOSBufprintf(hScript, ui32MaxLen, "RDW :%s:0x%X\r\n",
1801
psDevId->pszPDumpRegName,
1803
if(eErr != PVRSRV_OK)
1807
PDumpOSWriteString2(hScript, bLastFrame ? PDUMP_FLAGS_LASTFRAME : 0);
1812
PVRSRV_ERROR PDumpSignatureBuffer (PVRSRV_DEVICE_IDENTIFIER *psDevId,
1813
IMG_CHAR *pszFileName,
1814
IMG_CHAR *pszBufferType,
1815
IMG_UINT32 ui32FileOffset,
1816
IMG_DEV_VIRTADDR sDevBaseAddr,
1817
IMG_UINT32 ui32Size,
1818
IMG_UINT32 ui32MMUContextID,
1819
IMG_UINT32 ui32PDumpFlags)
1821
PDumpCommentWithFlags(ui32PDumpFlags, "\r\n-- Dump microkernel %s signature Buffer\r\n",
1823
PDumpCommentWithFlags(ui32PDumpFlags, "Buffer format (sizes in 32-bit words):\r\n");
1824
PDumpCommentWithFlags(ui32PDumpFlags, "\tNumber of signatures per sample (1)\r\n");
1825
PDumpCommentWithFlags(ui32PDumpFlags, "\tNumber of samples (1)\r\n");
1826
PDumpCommentWithFlags(ui32PDumpFlags, "\tSignature register offsets (1 * number of signatures)\r\n");
1827
PDumpCommentWithFlags(ui32PDumpFlags, "\tSignature sample values (number of samples * number of signatures)\r\n");
1828
PDumpCommentWithFlags(ui32PDumpFlags, "Note: If buffer is full, last sample is final state after test completed\r\n");
1829
return PDumpSaveMemKM(psDevId, pszFileName, ui32FileOffset, sDevBaseAddr, ui32Size,
1830
ui32MMUContextID, ui32PDumpFlags);
1834
PVRSRV_ERROR PDumpHWPerfCBKM (PVRSRV_DEVICE_IDENTIFIER *psDevId,
1835
IMG_CHAR *pszFileName,
1836
IMG_UINT32 ui32FileOffset,
1837
IMG_DEV_VIRTADDR sDevBaseAddr,
1838
IMG_UINT32 ui32Size,
1839
IMG_UINT32 ui32MMUContextID,
1840
IMG_UINT32 ui32PDumpFlags)
1842
PDumpCommentWithFlags(ui32PDumpFlags, "\r\n-- Dump Hardware Performance Circular Buffer\r\n");
1843
return PDumpSaveMemKM(psDevId, pszFileName, ui32FileOffset, sDevBaseAddr, ui32Size,
1844
ui32MMUContextID, ui32PDumpFlags);
1848
PVRSRV_ERROR PDumpCBP(PPVRSRV_KERNEL_MEM_INFO psROffMemInfo,
1849
IMG_UINT32 ui32ROffOffset,
1850
IMG_UINT32 ui32WPosVal,
1851
IMG_UINT32 ui32PacketSize,
1852
IMG_UINT32 ui32BufferSize,
1853
IMG_UINT32 ui32Flags,
1854
IMG_HANDLE hUniqueTag)
1857
IMG_UINT32 ui32PageOffset;
1858
IMG_UINT8 *pui8LinAddr;
1859
IMG_DEV_VIRTADDR sDevVAddr;
1860
IMG_DEV_PHYADDR sDevPAddr;
1861
IMG_DEV_VIRTADDR sDevVPageAddr;
1863
PDUMP_MMU_ATTRIB *psMMUAttrib;
1865
PDUMP_GET_SCRIPT_STRING();
1867
psMMUAttrib = ((BM_BUF*)psROffMemInfo->sMemBlk.hBuffer)->pMapping->pBMHeap->psMMUAttrib;
1870
PVR_ASSERT((ui32ROffOffset + sizeof(IMG_UINT32)) <= psROffMemInfo->uAllocSize);
1872
pui8LinAddr = psROffMemInfo->pvLinAddrKM;
1873
sDevVAddr = psROffMemInfo->sDevVAddr;
1876
pui8LinAddr += ui32ROffOffset;
1877
sDevVAddr.uiAddr += ui32ROffOffset;
1882
PDumpOSCPUVAddrToPhysPages(psROffMemInfo->sMemBlk.hOSMemHandle,
1885
psMMUAttrib->ui32DataPageMask,
1889
sDevVPageAddr.uiAddr = sDevVAddr.uiAddr - ui32PageOffset;
1891
PVR_ASSERT((sDevVPageAddr.uiAddr & 0xFFF) == 0);
1894
BM_GetPhysPageAddr(psROffMemInfo, sDevVPageAddr, &sDevPAddr);
1897
sDevPAddr.uiAddr += ui32PageOffset;
1899
eErr = PDumpOSBufprintf(hScript,
1901
"CBP :%s:PA_%08X%08X:0x%08X 0x%08X 0x%08X 0x%08X\r\n",
1902
psMMUAttrib->sDevId.pszPDumpDevName,
1903
(IMG_UINT32)(IMG_UINTPTR_T)hUniqueTag,
1904
sDevPAddr.uiAddr & ~(psMMUAttrib->ui32DataPageMask),
1905
sDevPAddr.uiAddr & (psMMUAttrib->ui32DataPageMask),
1909
if(eErr != PVRSRV_OK)
1913
PDumpOSWriteString2(hScript, ui32Flags);
1918
PVRSRV_ERROR PDumpIDLWithFlags(IMG_UINT32 ui32Clocks, IMG_UINT32 ui32Flags)
1921
PDUMP_GET_SCRIPT_STRING();
1922
PDUMP_DBG(("PDumpIDLWithFlags"));
1924
eErr = PDumpOSBufprintf(hScript, ui32MaxLen, "IDL %u\r\n", ui32Clocks);
1925
if(eErr != PVRSRV_OK)
1929
PDumpOSWriteString2(hScript, ui32Flags);
1934
PVRSRV_ERROR PDumpIDL(IMG_UINT32 ui32Clocks)
1936
return PDumpIDLWithFlags(ui32Clocks, PDUMP_FLAGS_CONTINUOUS);
1939
PVRSRV_ERROR PDumpMemUM(PVRSRV_PER_PROCESS_DATA *psPerProc,
1940
IMG_PVOID pvAltLinAddrUM,
1941
IMG_PVOID pvLinAddrUM,
1942
PVRSRV_KERNEL_MEM_INFO *psMemInfo,
1943
IMG_UINT32 ui32Offset,
1944
IMG_UINT32 ui32Bytes,
1945
IMG_UINT32 ui32Flags,
1946
IMG_HANDLE hUniqueTag)
1950
IMG_UINT32 ui32BytesDumped;
1951
IMG_UINT32 ui32CurrentOffset;
1953
if (psMemInfo->pvLinAddrKM != IMG_NULL && pvAltLinAddrUM == IMG_NULL)
1956
return PDumpMemKM(IMG_NULL,
1964
pvAddrUM = (pvAltLinAddrUM != IMG_NULL) ? pvAltLinAddrUM : ((pvLinAddrUM != IMG_NULL) ? VPTR_PLUS(pvLinAddrUM, ui32Offset) : IMG_NULL);
1966
pvAddrKM = GetTempBuffer();
1969
PVR_ASSERT(pvAddrUM != IMG_NULL && pvAddrKM != IMG_NULL);
1970
if (pvAddrUM == IMG_NULL || pvAddrKM == IMG_NULL)
1972
PVR_DPF((PVR_DBG_ERROR, "PDumpMemUM: Nothing to dump"));
1973
return PVRSRV_ERROR_INVALID_PARAMS;
1976
if (ui32Bytes > PDUMP_TEMP_BUFFER_SIZE)
1978
PDumpCommentWithFlags(ui32Flags, "Dumping 0x%08x bytes of memory, in blocks of 0x%08x bytes", ui32Bytes, (IMG_UINT32)PDUMP_TEMP_BUFFER_SIZE);
1981
ui32CurrentOffset = ui32Offset;
1982
for (ui32BytesDumped = 0; ui32BytesDumped < ui32Bytes;)
1984
PVRSRV_ERROR eError;
1985
IMG_UINT32 ui32BytesToDump = MIN(PDUMP_TEMP_BUFFER_SIZE, ui32Bytes - ui32BytesDumped);
1987
eError = OSCopyFromUser(psPerProc,
1991
if (eError != PVRSRV_OK)
1993
PVR_DPF((PVR_DBG_ERROR, "PDumpMemUM: OSCopyFromUser failed (%d)", eError));
1997
eError = PDumpMemKM(pvAddrKM,
2004
if (eError != PVRSRV_OK)
2007
if (ui32BytesDumped != 0)
2009
PVR_DPF((PVR_DBG_ERROR, "PDumpMemUM: PDumpMemKM failed (%d)", eError));
2011
PVR_ASSERT(ui32BytesDumped == 0);
2015
VPTR_INC(pvAddrUM, ui32BytesToDump);
2016
ui32CurrentOffset += ui32BytesToDump;
2017
ui32BytesDumped += ui32BytesToDump;
2024
static PVRSRV_ERROR _PdumpAllocMMUContext(IMG_UINT32 *pui32MMUContextID)
2029
for(i=0; i<MAX_PDUMP_MMU_CONTEXTS; i++)
2031
if((gui16MMUContextUsage & (1U << i)) == 0)
2034
gui16MMUContextUsage |= 1U << i;
2035
*pui32MMUContextID = i;
2040
PVR_DPF((PVR_DBG_ERROR, "_PdumpAllocMMUContext: no free MMU context ids"));
2042
return PVRSRV_ERROR_MMU_CONTEXT_NOT_FOUND;
2046
static PVRSRV_ERROR _PdumpFreeMMUContext(IMG_UINT32 ui32MMUContextID)
2048
if(ui32MMUContextID < MAX_PDUMP_MMU_CONTEXTS)
2051
gui16MMUContextUsage &= ~(1U << ui32MMUContextID);
2055
PVR_DPF((PVR_DBG_ERROR, "_PdumpFreeMMUContext: MMU context ids invalid"));
2057
return PVRSRV_ERROR_MMU_CONTEXT_NOT_FOUND;
2061
PVRSRV_ERROR PDumpSetMMUContext(PVRSRV_DEVICE_TYPE eDeviceType,
2062
IMG_CHAR *pszMemSpace,
2063
IMG_UINT32 *pui32MMUContextID,
2064
IMG_UINT32 ui32MMUType,
2065
IMG_HANDLE hUniqueTag1,
2066
IMG_HANDLE hOSMemHandle,
2067
IMG_VOID *pvPDCPUAddr)
2069
IMG_UINT8 *pui8LinAddr = (IMG_UINT8 *)pvPDCPUAddr;
2070
IMG_CPU_PHYADDR sCpuPAddr;
2071
IMG_DEV_PHYADDR sDevPAddr;
2072
IMG_UINT32 ui32MMUContextID;
2074
PDUMP_GET_SCRIPT_STRING();
2076
eErr = _PdumpAllocMMUContext(&ui32MMUContextID);
2077
if(eErr != PVRSRV_OK)
2079
PVR_DPF((PVR_DBG_ERROR, "PDumpSetMMUContext: _PdumpAllocMMUContext failed: %d", eErr));
2085
sCpuPAddr = OSMapLinToCPUPhys(hOSMemHandle, pui8LinAddr);
2086
sDevPAddr = SysCpuPAddrToDevPAddr(eDeviceType, sCpuPAddr);
2088
sDevPAddr.uiAddr &= ~((PVRSRV_4K_PAGE_SIZE) -1);
2090
eErr = PDumpOSBufprintf(hScript,
2092
"MMU :%s:v%d %d :%s:PA_%08X%08X\r\n",
2097
(IMG_UINT32)(IMG_UINTPTR_T)hUniqueTag1,
2099
if(eErr != PVRSRV_OK)
2103
PDumpOSWriteString2(hScript, PDUMP_FLAGS_CONTINUOUS);
2106
*pui32MMUContextID = ui32MMUContextID;
2112
PVRSRV_ERROR PDumpClearMMUContext(PVRSRV_DEVICE_TYPE eDeviceType,
2113
IMG_CHAR *pszMemSpace,
2114
IMG_UINT32 ui32MMUContextID,
2115
IMG_UINT32 ui32MMUType)
2118
PDUMP_GET_SCRIPT_STRING();
2119
PVR_UNREFERENCED_PARAMETER(eDeviceType);
2120
PVR_UNREFERENCED_PARAMETER(ui32MMUType);
2123
PDumpComment("Clear MMU Context for memory space %s\r\n", pszMemSpace);
2124
eErr = PDumpOSBufprintf(hScript,
2129
if(eErr != PVRSRV_OK)
2133
PDumpOSWriteString2(hScript, PDUMP_FLAGS_CONTINUOUS);
2135
eErr = _PdumpFreeMMUContext(ui32MMUContextID);
2136
if(eErr != PVRSRV_OK)
2138
PVR_DPF((PVR_DBG_ERROR, "PDumpClearMMUContext: _PdumpFreeMMUContext failed: %d", eErr));
2145
PVRSRV_ERROR PDumpStoreMemToFile(PDUMP_MMU_ATTRIB *psMMUAttrib,
2146
IMG_CHAR *pszFileName,
2147
IMG_UINT32 ui32FileOffset,
2148
PVRSRV_KERNEL_MEM_INFO *psMemInfo,
2150
IMG_UINT32 ui32Size,
2151
IMG_UINT32 ui32PDumpFlags,
2152
IMG_HANDLE hUniqueTag)
2154
IMG_DEV_PHYADDR sDevPAddr;
2155
IMG_DEV_VIRTADDR sDevVPageAddr;
2156
IMG_UINT32 ui32PageOffset;
2158
PDUMP_GET_SCRIPT_STRING();
2163
ui32PageOffset = (IMG_UINT32)((IMG_UINTPTR_T)psMemInfo->pvLinAddrKM & psMMUAttrib->ui32DataPageMask);
2166
sDevVPageAddr.uiAddr = uiAddr - ui32PageOffset;
2169
BM_GetPhysPageAddr(psMemInfo, sDevVPageAddr, &sDevPAddr);
2172
sDevPAddr.uiAddr += ui32PageOffset;
2174
PDumpOSBufprintf(hScript,
2176
"SAB :%s:PA_%08X%08X:0x%08X 0x%08X 0x%08X %s\r\n",
2177
psMMUAttrib->sDevId.pszPDumpDevName,
2178
(IMG_UINT32)(IMG_UINTPTR_T)hUniqueTag,
2179
sDevPAddr.uiAddr & ~psMMUAttrib->ui32DataPageMask,
2180
sDevPAddr.uiAddr & psMMUAttrib->ui32DataPageMask,
2185
PDumpOSWriteString2(hScript, ui32PDumpFlags);
2190
PVRSRV_ERROR PDumpRegBasedCBP(IMG_CHAR *pszPDumpRegName,
2191
IMG_UINT32 ui32RegOffset,
2192
IMG_UINT32 ui32WPosVal,
2193
IMG_UINT32 ui32PacketSize,
2194
IMG_UINT32 ui32BufferSize,
2195
IMG_UINT32 ui32Flags)
2197
PDUMP_GET_SCRIPT_STRING();
2199
PDumpOSBufprintf(hScript,
2201
"CBP :%s:0x%08X 0x%08X 0x%08X 0x%08X\r\n",
2207
PDumpOSWriteString2(hScript, ui32Flags);
2214
#include "syscommon.h"
2216
IMG_EXPORT IMG_VOID PDumpConnectionNotify(IMG_VOID)
2218
SYS_DATA *psSysData;
2219
PVRSRV_DEVICE_NODE *psThis;
2220
PVR_DPF((PVR_DBG_WARNING, "PDump has connected."));
2223
SysAcquireData(&psSysData);
2225
psThis = psSysData->psDeviceNodeList;
2228
if (psThis->pfnPDumpInitDevice)
2231
psThis->pfnPDumpInitDevice(psThis);
2233
psThis = psThis->psNext;
2237
IMG_UINT32 DbgWrite(PDBG_STREAM psStream, IMG_UINT8 *pui8Data, IMG_UINT32 ui32BCount, IMG_UINT32 ui32Flags)
2239
IMG_UINT32 ui32BytesWritten = 0;
2240
IMG_UINT32 ui32Off = 0;
2241
PDBG_STREAM_CONTROL psCtrl = psStream->psCtrl;
2244
if ((ui32Flags & PDUMP_FLAGS_NEVER) != 0)
2249
#if defined(SUPPORT_PDUMP_MULTI_PROCESS)
2251
if ( (_PDumpIsProcessActive() == IMG_FALSE ) &&
2252
((ui32Flags & PDUMP_FLAGS_PERSISTENT) == 0) )
2259
if ( ((ui32Flags & PDUMP_FLAGS_PERSISTENT) != 0) && (psCtrl->bInitPhaseComplete) )
2261
while (ui32BCount > 0)
2266
ui32BytesWritten = PDumpOSDebugDriverWrite( psStream,
2267
PDUMP_WRITE_MODE_PERSISTENT,
2268
&pui8Data[ui32Off], ui32BCount, 1, 0);
2270
if (ui32BytesWritten == 0)
2272
PDumpOSReleaseExecution();
2275
if (ui32BytesWritten != 0xFFFFFFFFU)
2277
ui32Off += ui32BytesWritten;
2278
ui32BCount -= ui32BytesWritten;
2282
PVR_DPF((PVR_DBG_ERROR, "DbgWrite: Failed to send persistent data"));
2283
if( (psCtrl->ui32Flags & DEBUG_FLAGS_READONLY) != 0)
2293
ui32BCount = ui32Off; ui32Off = 0; ui32BytesWritten = 0;
2296
while (((IMG_UINT32) ui32BCount > 0) && (ui32BytesWritten != 0xFFFFFFFFU))
2298
if ((ui32Flags & PDUMP_FLAGS_CONTINUOUS) != 0)
2302
if (((psCtrl->ui32CapMode & DEBUG_CAPMODE_FRAMED) != 0) &&
2303
(psCtrl->ui32Start == 0xFFFFFFFFU) &&
2304
(psCtrl->ui32End == 0xFFFFFFFFU) &&
2305
psCtrl->bInitPhaseComplete)
2307
ui32BytesWritten = ui32BCount;
2311
ui32BytesWritten = PDumpOSDebugDriverWrite( psStream,
2312
PDUMP_WRITE_MODE_CONTINUOUS,
2313
&pui8Data[ui32Off], ui32BCount, 1, 0);
2318
if (ui32Flags & PDUMP_FLAGS_LASTFRAME)
2320
IMG_UINT32 ui32DbgFlags;
2323
if (ui32Flags & PDUMP_FLAGS_RESETLFBUFFER)
2325
ui32DbgFlags |= WRITELF_FLAGS_RESETBUF;
2328
ui32BytesWritten = PDumpOSDebugDriverWrite( psStream,
2329
PDUMP_WRITE_MODE_LASTFRAME,
2330
&pui8Data[ui32Off], ui32BCount, 1, ui32DbgFlags);
2334
ui32BytesWritten = PDumpOSDebugDriverWrite( psStream,
2335
PDUMP_WRITE_MODE_BINCM,
2336
&pui8Data[ui32Off], ui32BCount, 1, 0);
2343
if (ui32BytesWritten == 0)
2345
PDumpOSReleaseExecution();
2348
if (ui32BytesWritten != 0xFFFFFFFFU)
2350
ui32Off += ui32BytesWritten;
2351
ui32BCount -= ui32BytesWritten;
2359
return ui32BytesWritten;