1 /*************************************************************************/ /*!
3 @Title Rgx debug information
4 @Copyright Copyright (c) Imagination Technologies Ltd. All Rights Reserved
5 @Description RGX debugging functions
6 @License Dual MIT/GPLv2
8 The contents of this file are subject to the MIT license as set out below.
10 Permission is hereby granted, free of charge, to any person obtaining a copy
11 of this software and associated documentation files (the "Software"), to deal
12 in the Software without restriction, including without limitation the rights
13 to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
14 copies of the Software, and to permit persons to whom the Software is
15 furnished to do so, subject to the following conditions:
17 The above copyright notice and this permission notice shall be included in
18 all copies or substantial portions of the Software.
20 Alternatively, the contents of this file may be used under the terms of
21 the GNU General Public License Version 2 ("GPL") in which case the provisions
22 of GPL are applicable instead of those above.
24 If you wish to allow use of your version of this file only under the terms of
25 GPL, and not to allow others to use your version of this file under the terms
26 of the MIT license, indicate your decision by deleting the provisions above
27 and replace them with the notice and other provisions required by GPL as set
28 out in the file called "GPL-COPYING" included in this distribution. If you do
29 not delete the provisions above, a recipient may use your version of this file
30 under the terms of either the MIT license or GPL.
32 This License is also included in this distribution in the file called
35 EXCEPT AS OTHERWISE STATED IN A NEGOTIATED AGREEMENT: (A) THE SOFTWARE IS
36 PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING
37 BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR
38 PURPOSE AND NONINFRINGEMENT; AND (B) IN NO EVENT SHALL THE AUTHORS OR
39 COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
40 IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
41 CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
42 */ /**************************************************************************/
43 //#define PVR_DPF_FUNCTION_TRACE_ON 1
44 #undef PVR_DPF_FUNCTION_TRACE_ON
46 #include "rgxdefs_km.h"
47 #include "rgxdevice.h"
55 #include "pvrversion.h"
56 #include "pvr_debug.h"
60 #include "rgxfwutils.h"
64 #include "devicemem_pdump.h"
69 #if defined(PVRSRV_ENABLE_FW_TRACE_DEBUGFS)
70 #include "rgx_fwif_sf.h"
71 #include "rgxfw_log_helper.h"
75 #include "rgxcompute.h"
76 #include "rgxtransfer.h"
77 #if defined(RGX_FEATURE_RAY_TRACING)
80 #if defined(SUPPORT_PAGE_FAULT_DEBUG)
81 #include "devicemem_history_server.h"
85 #define RGX_DEBUG_STR_SIZE (150)
87 #define RGX_CR_BIF_CAT_BASE0 (0x1200U)
88 #define RGX_CR_BIF_CAT_BASE1 (0x1208U)
90 #define RGX_CR_BIF_CAT_BASEN(n) \
91 RGX_CR_BIF_CAT_BASE0 + \
92 ((RGX_CR_BIF_CAT_BASE1 - RGX_CR_BIF_CAT_BASE0) * n)
95 #define RGXDBG_BIF_IDS \
100 #define RGXDBG_SIDEBAND_TYPES \
122 #define X(NAME) RGXDBG_##NAME,
129 #define X(NAME) RGXDBG_##NAME,
130 RGXDBG_SIDEBAND_TYPES
132 } RGXDBG_SIDEBAND_TYPE;
135 IMG_CHAR* pszPowStateName [] = {
136 #define X(NAME) #NAME,
141 IMG_CHAR* pszBIFNames [] = {
142 #define X(NAME) #NAME,
147 extern IMG_UINT32 g_ui32HostSampleIRQCount;
150 #if !defined(RGX_FEATURE_S7_TOP_INFRASTRUCTURE)
152 *******************************************************************************
154 @Function _RGXDecodePMPC
158 Return the name for the PM managed Page Catalogues
160 @Input ui32PC - Page Catalogue number
164 ******************************************************************************/
165 static IMG_CHAR* _RGXDecodePMPC(IMG_UINT32 ui32PC)
167 IMG_CHAR* pszPMPC = " (-)";
171 case 0x8: pszPMPC = " (PM-VCE0)"; break;
172 case 0x9: pszPMPC = " (PM-TE0)"; break;
173 case 0xA: pszPMPC = " (PM-ZLS0)"; break;
174 case 0xB: pszPMPC = " (PM-ALIST0)"; break;
175 case 0xC: pszPMPC = " (PM-VCE1)"; break;
176 case 0xD: pszPMPC = " (PM-TE1)"; break;
177 case 0xE: pszPMPC = " (PM-ZLS1)"; break;
178 case 0xF: pszPMPC = " (PM-ALIST1)"; break;
185 *******************************************************************************
187 @Function _RGXDecodeBIFReqTags
191 Decode the BIF Tag ID and sideband data fields from BIF_FAULT_BANK_REQ_STATUS regs
193 @Input eBankID - BIF identifier
194 @Input ui32TagID - Tag ID value
195 @Input ui32TagSB - Tag Sideband data
196 @Output ppszTagID - Decoded string from the Tag ID
197 @Output ppszTagSB - Decoded string from the Tag SB
198 @Output pszScratchBuf - Buffer provided to the function to generate the debug strings
199 @Input ui32ScratchBufSize - Size of the provided buffer
203 ******************************************************************************/
204 static IMG_VOID _RGXDecodeBIFReqTags(RGXDBG_BIF_ID eBankID,
205 IMG_UINT32 ui32TagID,
206 IMG_UINT32 ui32TagSB,
207 IMG_CHAR **ppszTagID,
208 IMG_CHAR **ppszTagSB,
209 IMG_CHAR *pszScratchBuf,
210 IMG_UINT32 ui32ScratchBufSize)
212 /* default to unknown */
213 IMG_CHAR *pszTagID = "-";
214 IMG_CHAR *pszTagSB = "-";
216 PVR_ASSERT(ppszTagID != IMG_NULL);
217 PVR_ASSERT(ppszTagSB != IMG_NULL);
226 case 0x0: pszTagSB = "Table"; break;
227 case 0x1: pszTagSB = "Directory"; break;
228 case 0x2: pszTagSB = "Catalogue"; break;
237 case 0x0: pszTagSB = "Pixel data"; break;
238 case 0x1: pszTagSB = "Command stream data"; break;
239 case 0x2: pszTagSB = "Fence or flush"; break;
253 case 0x0: pszTagSB = "DCache - Thread 0"; break;
254 case 0x1: pszTagSB = "ICache - Thread 0"; break;
255 case 0x2: pszTagSB = "JTag - Thread 0"; break;
256 case 0x3: pszTagSB = "Slave bus - Thread 0"; break;
257 case 0x4: pszTagSB = "DCache - Thread "; break;
258 case 0x5: pszTagSB = "ICache - Thread 1"; break;
259 case 0x6: pszTagSB = "JTag - Thread 1"; break;
260 case 0x7: pszTagSB = "Slave bus - Thread 1"; break;
267 OSSNPrintf(pszScratchBuf, ui32ScratchBufSize,
268 "Cache line %d", (ui32TagSB & 0x3f));
269 pszTagSB = pszScratchBuf;
282 case 0x00: pszTagSB = "ZLS"; break;
283 case 0x20: pszTagSB = "Occlusion Query"; break;
289 #if defined(RGX_FEATURE_XT_TOP_INFRASTRUCTURE)
290 if (eBankID == RGXDBG_TEXAS_BIF)
295 case 0x0: pszTagSB = "CPF"; break;
296 case 0x1: pszTagSB = "DBSC"; break;
300 case 0x8: pszTagSB = "Control Stream"; break;
304 case 0x9: pszTagSB = "Primitive Block"; break;
312 case 0x0: pszTagSB = "Macrotile Header"; break;
313 case 0x1: pszTagSB = "Region Header"; break;
320 case 0x0: pszTagSB = "Macrotile Header"; break;
321 case 0x1: pszTagSB = "Region Header"; break;
322 case 0x2: pszTagSB = "DBSC"; break;
323 case 0x3: pszTagSB = "CPF"; break;
326 case 0x8: pszTagSB = "Control Stream"; break;
329 case 0x9: pszTagSB = "Primitive Block"; break;
339 case 0x0: pszTagSB = "Control Stream"; break;
340 case 0x1: pszTagSB = "Indirect Data"; break;
341 case 0x2: pszTagSB = "Event Write"; break;
342 case 0x3: pszTagSB = "Context State"; break;
351 case 0x0: pszTagSB = "Control Stream"; break;
352 case 0x1: pszTagSB = "PPP State"; break;
353 case 0x2: pszTagSB = "Index Data"; break;
354 case 0x4: pszTagSB = "Call Stack"; break;
355 case 0x8: pszTagSB = "Context State"; break;
364 case 0x0: pszTagSB = "PMA_TAFSTACK"; break;
365 case 0x1: pszTagSB = "PMA_TAMLIST"; break;
366 case 0x2: pszTagSB = "PMA_3DFSTACK"; break;
367 case 0x3: pszTagSB = "PMA_3DMLIST"; break;
368 case 0x4: pszTagSB = "PMA_PMCTX0"; break;
369 case 0x5: pszTagSB = "PMA_PMCTX1"; break;
370 case 0x6: pszTagSB = "PMA_MAVP"; break;
371 case 0x7: pszTagSB = "PMA_UFSTACK"; break;
372 case 0x8: pszTagSB = "PMD_TAFSTACK"; break;
373 case 0x9: pszTagSB = "PMD_TAMLIST"; break;
374 case 0xA: pszTagSB = "PMD_3DFSTACK"; break;
375 case 0xB: pszTagSB = "PMD_3DMLIST"; break;
376 case 0xC: pszTagSB = "PMD_PMCTX0"; break;
377 case 0xD: pszTagSB = "PMD_PMCTX1"; break;
378 case 0xF: pszTagSB = "PMD_UFSTACK"; break;
379 case 0x10: pszTagSB = "PMA_TAMMUSTACK"; break;
380 case 0x11: pszTagSB = "PMA_3DMMUSTACK"; break;
381 case 0x12: pszTagSB = "PMD_TAMMUSTACK"; break;
382 case 0x13: pszTagSB = "PMD_3DMMUSTACK"; break;
383 case 0x14: pszTagSB = "PMA_TAUFSTACK"; break;
384 case 0x15: pszTagSB = "PMA_3DUFSTACK"; break;
385 case 0x16: pszTagSB = "PMD_TAUFSTACK"; break;
386 case 0x17: pszTagSB = "PMD_3DUFSTACK"; break;
387 case 0x18: pszTagSB = "PMA_TAVFP"; break;
388 case 0x19: pszTagSB = "PMD_3DVFP"; break;
389 case 0x1A: pszTagSB = "PMD_TAVFP"; break;
398 case 0x1: pszTagSB = "VCE"; break;
399 case 0x2: pszTagSB = "TPC"; break;
400 case 0x3: pszTagSB = "TE Control Stream"; break;
401 case 0x4: pszTagSB = "TE Region Header"; break;
402 case 0x5: pszTagSB = "TE Render Target Cache"; break;
403 case 0x6: pszTagSB = "TEAC Render Target Cache"; break;
404 case 0x7: pszTagSB = "VCE Render Target Cache"; break;
405 case 0x8: pszTagSB = "PPP Context State"; break;
414 case 0x0: pszTagSB = "TPF0: Primitive Block"; break;
415 case 0x1: pszTagSB = "TPF0: Depth Bias"; break;
416 case 0x2: pszTagSB = "TPF0: Per Primitive IDs"; break;
417 case 0x3: pszTagSB = "CPF - Tables"; break;
418 case 0x4: pszTagSB = "TPF1: Primitive Block"; break;
419 case 0x5: pszTagSB = "TPF1: Depth Bias"; break;
420 case 0x6: pszTagSB = "TPF1: Per Primitive IDs"; break;
421 case 0x7: pszTagSB = "CPF - Data: Pipe 0"; break;
422 case 0x8: pszTagSB = "TPF2: Primitive Block"; break;
423 case 0x9: pszTagSB = "TPF2: Depth Bias"; break;
424 case 0xA: pszTagSB = "TPF2: Per Primitive IDs"; break;
425 case 0xB: pszTagSB = "CPF - Data: Pipe 1"; break;
426 case 0xC: pszTagSB = "TPF3: Primitive Block"; break;
427 case 0xD: pszTagSB = "TPF3: Depth Bias"; break;
428 case 0xE: pszTagSB = "TPF3: Per Primitive IDs"; break;
429 case 0xF: pszTagSB = "CPF - Data: Pipe 2"; break;
442 IMG_UINT32 ui32Burst = (ui32TagSB >> 5) & 0x7;
443 IMG_UINT32 ui32GroupEnc = (ui32TagSB >> 2) & 0x7;
444 IMG_UINT32 ui32Group = ui32TagSB & 0x3;
446 IMG_CHAR* pszBurst = "";
447 IMG_CHAR* pszGroupEnc = "";
448 IMG_CHAR* pszGroup = "";
453 case 0x1: pszBurst = "128bit word within the Lower 256bits"; break;
455 case 0x3: pszBurst = "128bit word within the Upper 256bits"; break;
456 case 0x4: pszBurst = "Lower 256bits"; break;
457 case 0x5: pszBurst = "Upper 256bits"; break;
458 case 0x6: pszBurst = "512 bits"; break;
460 switch (ui32GroupEnc)
462 #if defined(RGX_FEATURE_XT_TOP_INFRASTRUCTURE)
463 case 0x0: pszGroupEnc = "PDS_REQ"; break;
464 case 0x1: pszGroupEnc = "USC_REQ"; break;
465 case 0x2: pszGroupEnc = "MADD_REQ"; break;
466 case 0x3: pszGroupEnc = "USCB_USC"; break;
468 case 0x0: pszGroupEnc = "TPUA_USC"; break;
469 case 0x1: pszGroupEnc = "TPUB_USC"; break;
470 case 0x2: pszGroupEnc = "USCA_USC"; break;
471 case 0x3: pszGroupEnc = "USCB_USC"; break;
472 case 0x4: pszGroupEnc = "PDS_USC"; break;
473 #if (RGX_FEATURE_NUM_CLUSTERS < 6)
474 case 0x5: pszGroupEnc = "PDSRW"; break;
475 #elif (RGX_FEATURE_NUM_CLUSTERS == 6)
476 case 0x5: pszGroupEnc = "UPUC_USC"; break;
477 case 0x6: pszGroupEnc = "TPUC_USC"; break;
478 case 0x7: pszGroupEnc = "PDSRW"; break;
484 case 0x0: pszGroup = "Banks 0-3"; break;
485 case 0x1: pszGroup = "Banks 4-7"; break;
486 case 0x2: pszGroup = "Banks 8-11"; break;
487 case 0x3: pszGroup = "Banks 12-15"; break;
490 OSSNPrintf(pszScratchBuf, ui32ScratchBufSize,
491 "%s, %s, %s", pszBurst, pszGroupEnc, pszGroup);
492 pszTagSB = pszScratchBuf;
499 #if defined(RGX_FEATURE_XT_TOP_INFRASTRUCTURE)
501 IMG_UINT32 ui32Req = (ui32TagSB >> 0) & 0xf;
502 IMG_UINT32 ui32MCUSB = (ui32TagSB >> 4) & 0x3;
503 IMG_CHAR* pszReqOrig = "";
507 case 0x0: pszReqOrig = "FBC Request, originator ZLS"; break;
508 case 0x1: pszReqOrig = "FBC Request, originator PBE"; break;
509 case 0x2: pszReqOrig = "FBC Request, originator Host"; break;
510 case 0x3: pszReqOrig = "FBC Request, originator TLA"; break;
511 case 0x4: pszReqOrig = "FBDC Request, originator ZLS"; break;
512 case 0x5: pszReqOrig = "FBDC Request, originator MCU"; break;
513 case 0x6: pszReqOrig = "FBDC Request, originator Host"; break;
514 case 0x7: pszReqOrig = "FBDC Request, originator TLA"; break;
515 case 0x8: pszReqOrig = "FBC Request, originator ZLS Requester Fence"; break;
516 case 0x9: pszReqOrig = "FBC Request, originator PBE Requester Fence"; break;
517 case 0xa: pszReqOrig = "FBC Request, originator Host Requester Fence"; break;
518 case 0xb: pszReqOrig = "FBC Request, originator TLA Requester Fence"; break;
519 case 0xc: pszReqOrig = "Reserved"; break;
520 case 0xd: pszReqOrig = "Reserved"; break;
521 case 0xe: pszReqOrig = "FBDC Request, originator FBCDC(Host) Memory Fence"; break;
522 case 0xf: pszReqOrig = "FBDC Request, originator FBCDC(TLA) Memory Fence"; break;
524 OSSNPrintf(pszScratchBuf, ui32ScratchBufSize,
525 "%s, MCU sideband 0x%X", pszReqOrig, ui32MCUSB);
526 pszTagSB = pszScratchBuf;
530 IMG_UINT32 ui32Req = (ui32TagSB >> 2) & 0x7;
531 IMG_UINT32 ui32MCUSB = (ui32TagSB >> 0) & 0x3;
532 IMG_CHAR* pszReqOrig = "";
536 case 0x0: pszReqOrig = "FBC Request, originator ZLS"; break;
537 case 0x1: pszReqOrig = "FBC Request, originator PBE"; break;
538 case 0x2: pszReqOrig = "FBC Request, originator Host"; break;
539 case 0x3: pszReqOrig = "FBC Request, originator TLA"; break;
540 case 0x4: pszReqOrig = "FBDC Request, originator ZLS"; break;
541 case 0x5: pszReqOrig = "FBDC Request, originator MCU"; break;
542 case 0x6: pszReqOrig = "FBDC Request, originator Host"; break;
543 case 0x7: pszReqOrig = "FBDC Request, originator TLA"; break;
545 OSSNPrintf(pszScratchBuf, ui32ScratchBufSize,
546 "%s, MCU sideband 0x%X", pszReqOrig, ui32MCUSB);
547 pszTagSB = pszScratchBuf;
552 } /* switch(TagID) */
554 *ppszTagID = pszTagID;
555 *ppszTagSB = pszTagSB;
560 #if defined(RGX_FEATURE_S7_TOP_INFRASTRUCTURE)
562 *******************************************************************************
564 @Function _RGXDecodeMMULevel
568 Return the name for the MMU level that faulted.
570 @Input ui32MMULevel - MMU level
572 @Return IMG_CHAR* to the sting describing the MMU level that faulted.
574 ******************************************************************************/
575 static IMG_CHAR* _RGXDecodeMMULevel(IMG_UINT32 ui32MMULevel)
577 IMG_CHAR* pszMMULevel = "";
579 switch (ui32MMULevel)
581 case 0x0: pszMMULevel = " (Page Table)"; break;
582 case 0x1: pszMMULevel = " (Page Directory)"; break;
583 case 0x2: pszMMULevel = " (Page Catalog)"; break;
584 case 0x3: pszMMULevel = " (Cat Base)"; break;
592 *******************************************************************************
594 @Function _RGXDecodeMMUReqTags
598 Decodes the MMU Tag ID and Sideband data fields from RGX_CR_MMU_FAULT_META_STATUS and
599 RGX_CR_MMU_FAULT_STATUS regs.
601 @Input ui32TagID - Tag ID value
602 @Input ui32TagSB - Tag Sideband data
603 @Output ppszTagID - Decoded string from the Tag ID
604 @Output ppszTagSB - Decoded string from the Tag SB
605 @Output pszScratchBuf - Buffer provided to the function to generate the debug strings
606 @Input ui32ScratchBufSize - Size of the provided buffer
610 ******************************************************************************/
611 static IMG_VOID _RGXDecodeMMUReqTags(IMG_UINT32 ui32TagID,
612 IMG_UINT32 ui32TagSB,
613 IMG_CHAR **ppszTagID,
614 IMG_CHAR **ppszTagSB,
615 IMG_CHAR *pszScratchBuf,
616 IMG_UINT32 ui32ScratchBufSize)
618 IMG_INT32 i32SideBandType = -1;
619 IMG_CHAR *pszTagID = "-";
620 IMG_CHAR *pszTagSB = "-";
622 PVR_ASSERT(ppszTagID != IMG_NULL);
623 PVR_ASSERT(ppszTagSB != IMG_NULL);
627 case 0: pszTagID = "META (Jones)"; i32SideBandType = RGXDBG_META; break;
628 case 1: pszTagID = "TLA (Jones)"; i32SideBandType = RGXDBG_TLA; break;
629 case 3: pszTagID = "VDMM (Jones)"; i32SideBandType = RGXDBG_VDMM; break;
630 case 4: pszTagID = "CDM (Jones)"; i32SideBandType = RGXDBG_CDM; break;
631 case 5: pszTagID = "IPP (Jones)"; i32SideBandType = RGXDBG_IPP; break;
632 case 6: pszTagID = "PM (Jones)"; i32SideBandType = RGXDBG_PM; break;
633 case 7: pszTagID = "Tiling (Jones)"; i32SideBandType = RGXDBG_TILING; break;
634 case 8: pszTagID = "MCU (Texas 0)"; i32SideBandType = RGXDBG_MCU; break;
635 case 9: pszTagID = "PDS (Texas 0)"; i32SideBandType = RGXDBG_PDS; break;
636 case 10: pszTagID = "PBE0 (Texas 0)"; i32SideBandType = RGXDBG_PBE; break;
637 case 11: pszTagID = "PBE1 (Texas 0)"; i32SideBandType = RGXDBG_PBE; break;
638 case 12: pszTagID = "VDMS (Black Pearl 0)"; i32SideBandType = RGXDBG_VDMS; break;
639 case 13: pszTagID = "IPF (Black Pearl 0)"; i32SideBandType = RGXDBG_IPF; break;
640 case 14: pszTagID = "ISP (Black Pearl 0)"; i32SideBandType = RGXDBG_ISP; break;
641 case 15: pszTagID = "TPF (Black Pearl 0)"; i32SideBandType = RGXDBG_TPF; break;
642 case 16: pszTagID = "USCS (Black Pearl 0)"; i32SideBandType = RGXDBG_USCS; break;
643 case 17: pszTagID = "PPP (Black Pearl 0)"; i32SideBandType = RGXDBG_PPP; break;
644 case 18: pszTagID = "VCE (Black Pearl 0)"; i32SideBandType = RGXDBG_VCE; break;
645 case 19: pszTagID = "FBCDC (Black Pearl 0)"; i32SideBandType = RGXDBG_FBCDC; break;
646 case 20: pszTagID = "MCU (Texas 1)"; i32SideBandType = RGXDBG_MCU; break;
647 case 21: pszTagID = "PDS (Texas 1)"; i32SideBandType = RGXDBG_PDS; break;
648 case 22: pszTagID = "PBE0 (Texas 1)"; i32SideBandType = RGXDBG_PBE; break;
649 case 23: pszTagID = "PBE1 (Texas 1)"; i32SideBandType = RGXDBG_PBE; break;
650 case 24: pszTagID = "MCU (Texas 2)"; i32SideBandType = RGXDBG_MCU; break;
651 case 25: pszTagID = "PDS (Texas 2)"; i32SideBandType = RGXDBG_PDS; break;
652 case 26: pszTagID = "PBE0 (Texas 2)"; i32SideBandType = RGXDBG_PBE; break;
653 case 27: pszTagID = "PBE1 (Texas 2)"; i32SideBandType = RGXDBG_PBE; break;
654 case 28: pszTagID = "VDMS (Black Pearl 1)"; i32SideBandType = RGXDBG_VDMS; break;
655 case 29: pszTagID = "IPF (Black Pearl 1)"; i32SideBandType = RGXDBG_IPF; break;
656 case 30: pszTagID = "ISP (Black Pearl 1)"; i32SideBandType = RGXDBG_ISP; break;
657 case 31: pszTagID = "TPF (Black Pearl 1)"; i32SideBandType = RGXDBG_TPF; break;
658 case 32: pszTagID = "USCS (Black Pearl 1)"; i32SideBandType = RGXDBG_USCS; break;
659 case 33: pszTagID = "PPP (Black Pearl 1)"; i32SideBandType = RGXDBG_PPP; break;
660 case 34: pszTagID = "VCE (Black Pearl 1)"; i32SideBandType = RGXDBG_VCE; break;
661 case 35: pszTagID = "FBCDC (Black Pearl 1)"; i32SideBandType = RGXDBG_FBCDC; break;
662 case 36: pszTagID = "MCU (Texas 3)"; i32SideBandType = RGXDBG_MCU; break;
663 case 37: pszTagID = "PDS (Texas 3)"; i32SideBandType = RGXDBG_PDS; break;
664 case 38: pszTagID = "PBE0 (Texas 3)"; i32SideBandType = RGXDBG_PBE; break;
665 case 39: pszTagID = "PBE1 (Texas 3)"; i32SideBandType = RGXDBG_PBE; break;
668 switch (i32SideBandType)
674 case 0x0: pszTagSB = "DCache - Thread 0"; break;
675 case 0x1: pszTagSB = "ICache - Thread 0"; break;
676 case 0x2: pszTagSB = "JTag - Thread 0"; break;
677 case 0x3: pszTagSB = "Slave bus - Thread 0"; break;
678 case 0x4: pszTagSB = "DCache - Thread 1"; break;
679 case 0x5: pszTagSB = "ICache - Thread 1"; break;
680 case 0x6: pszTagSB = "JTag - Thread 1"; break;
681 case 0x7: pszTagSB = "Slave bus - Thread 1"; break;
690 case 0x0: pszTagSB = "Pixel data"; break;
691 case 0x1: pszTagSB = "Command stream data"; break;
692 case 0x2: pszTagSB = "Fence or flush"; break;
701 case 0x0: pszTagSB = "Control Stream - Read Only"; break;
702 case 0x1: pszTagSB = "PPP State - Read Only"; break;
703 case 0x2: pszTagSB = "Indices - Read Only"; break;
704 case 0x4: pszTagSB = "Call Stack - Read/Write"; break;
705 case 0x6: pszTagSB = "DrawIndirect - Read Only"; break;
706 case 0xA: pszTagSB = "Context State - Write Only"; break;
715 case 0x0: pszTagSB = "Control Stream"; break;
716 case 0x1: pszTagSB = "Indirect Data"; break;
717 case 0x2: pszTagSB = "Event Write"; break;
718 case 0x3: pszTagSB = "Context State"; break;
727 case 0x0: pszTagSB = "Macrotile Header"; break;
728 case 0x1: pszTagSB = "Region Header"; break;
737 case 0x0: pszTagSB = "PMA_TAFSTACK"; break;
738 case 0x1: pszTagSB = "PMA_TAMLIST"; break;
739 case 0x2: pszTagSB = "PMA_3DFSTACK"; break;
740 case 0x3: pszTagSB = "PMA_3DMLIST"; break;
741 case 0x4: pszTagSB = "PMA_PMCTX0"; break;
742 case 0x5: pszTagSB = "PMA_PMCTX1"; break;
743 case 0x6: pszTagSB = "PMA_MAVP"; break;
744 case 0x7: pszTagSB = "PMA_UFSTACK"; break;
745 case 0x8: pszTagSB = "PMD_TAFSTACK"; break;
746 case 0x9: pszTagSB = "PMD_TAMLIST"; break;
747 case 0xA: pszTagSB = "PMD_3DFSTACK"; break;
748 case 0xB: pszTagSB = "PMD_3DMLIST"; break;
749 case 0xC: pszTagSB = "PMD_PMCTX0"; break;
750 case 0xD: pszTagSB = "PMD_PMCTX1"; break;
751 case 0xF: pszTagSB = "PMD_UFSTACK"; break;
752 case 0x10: pszTagSB = "PMA_TAMMUSTACK"; break;
753 case 0x11: pszTagSB = "PMA_3DMMUSTACK"; break;
754 case 0x12: pszTagSB = "PMD_TAMMUSTACK"; break;
755 case 0x13: pszTagSB = "PMD_3DMMUSTACK"; break;
756 case 0x14: pszTagSB = "PMA_TAUFSTACK"; break;
757 case 0x15: pszTagSB = "PMA_3DUFSTACK"; break;
758 case 0x16: pszTagSB = "PMD_TAUFSTACK"; break;
759 case 0x17: pszTagSB = "PMD_3DUFSTACK"; break;
760 case 0x18: pszTagSB = "PMA_TAVFP"; break;
761 case 0x19: pszTagSB = "PMD_3DVFP"; break;
762 case 0x1A: pszTagSB = "PMD_TAVFP"; break;
771 case 0x0: pszTagSB = "PSG Control Stream TP0"; break;
772 case 0x1: pszTagSB = "TPC TP0"; break;
773 case 0x2: pszTagSB = "VCE0"; break;
774 case 0x3: pszTagSB = "VCE1"; break;
775 case 0x4: pszTagSB = "PSG Control Stream TP1"; break;
776 case 0x5: pszTagSB = "TPC TP1"; break;
777 case 0x8: pszTagSB = "PSG Region Header TP0"; break;
778 case 0xC: pszTagSB = "PSG Region Header TP1"; break;
787 case 0x0: pszTagSB = "Context State - Write Only"; break;
797 case 0x20: pszTagSB = "CPF"; break;
798 case 0x01: pszTagSB = "DBSC"; break;
806 case 0x10: pszTagSB = "Control Stream"; break;
814 case 0x11: pszTagSB = "Primitive Block"; break;
823 case 0x00: pszTagSB = "ZLS read/write"; break;
824 case 0x20: pszTagSB = "Occlusion query read/write"; break;
833 case 0x0: pszTagSB = "TPF0: Primitive Block"; break;
834 case 0x1: pszTagSB = "TPF0: Depth Bias"; break;
835 case 0x2: pszTagSB = "TPF0: Per Primitive IDs"; break;
836 case 0x3: pszTagSB = "CPF - Tables"; break;
837 case 0x4: pszTagSB = "TPF1: Primitive Block"; break;
838 case 0x5: pszTagSB = "TPF1: Depth Bias"; break;
839 case 0x6: pszTagSB = "TPF1: Per Primitive IDs"; break;
840 case 0x7: pszTagSB = "CPF - Data: Pipe 0"; break;
841 case 0x8: pszTagSB = "TPF2: Primitive Block"; break;
842 case 0x9: pszTagSB = "TPF2: Depth Bias"; break;
843 case 0xA: pszTagSB = "TPF2: Per Primitive IDs"; break;
844 case 0xB: pszTagSB = "CPF - Data: Pipe 1"; break;
845 case 0xC: pszTagSB = "TPF3: Primitive Block"; break;
846 case 0xD: pszTagSB = "TPF3: Depth Bias"; break;
847 case 0xE: pszTagSB = "TPF3: Per Primitive IDs"; break;
848 case 0xF: pszTagSB = "CPF - Data: Pipe 2"; break;
855 IMG_UINT32 ui32Req = (ui32TagSB >> 0) & 0xf;
856 IMG_UINT32 ui32MCUSB = (ui32TagSB >> 4) & 0x3;
857 IMG_CHAR* pszReqOrig = "";
861 case 0x0: pszReqOrig = "FBC Request, originator ZLS"; break;
862 case 0x1: pszReqOrig = "FBC Request, originator PBE"; break;
863 case 0x2: pszReqOrig = "FBC Request, originator Host"; break;
864 case 0x3: pszReqOrig = "FBC Request, originator TLA"; break;
865 case 0x4: pszReqOrig = "FBDC Request, originator ZLS"; break;
866 case 0x5: pszReqOrig = "FBDC Request, originator MCU"; break;
867 case 0x6: pszReqOrig = "FBDC Request, originator Host"; break;
868 case 0x7: pszReqOrig = "FBDC Request, originator TLA"; break;
869 case 0x8: pszReqOrig = "FBC Request, originator ZLS Requester Fence"; break;
870 case 0x9: pszReqOrig = "FBC Request, originator PBE Requester Fence"; break;
871 case 0xa: pszReqOrig = "FBC Request, originator Host Requester Fence"; break;
872 case 0xb: pszReqOrig = "FBC Request, originator TLA Requester Fence"; break;
873 case 0xc: pszReqOrig = "Reserved"; break;
874 case 0xd: pszReqOrig = "Reserved"; break;
875 case 0xe: pszReqOrig = "FBDC Request, originator FBCDC(Host) Memory Fence"; break;
876 case 0xf: pszReqOrig = "FBDC Request, originator FBCDC(TLA) Memory Fence"; break;
878 OSSNPrintf(pszScratchBuf, ui32ScratchBufSize,
879 "%s, MCU sideband 0x%X", pszReqOrig, ui32MCUSB);
880 pszTagSB = pszScratchBuf;
886 IMG_UINT32 ui32SetNumber = (ui32TagSB >> 5) & 0x7;
887 IMG_UINT32 ui32WayNumber = (ui32TagSB >> 2) & 0x7;
888 IMG_UINT32 ui32Group = ui32TagSB & 0x3;
890 IMG_CHAR* pszGroup = "";
894 case 0x0: pszGroup = "Banks 0-1"; break;
895 case 0x1: pszGroup = "Banks 2-3"; break;
896 case 0x2: pszGroup = "Banks 4-5"; break;
897 case 0x3: pszGroup = "Banks 6-7"; break;
900 OSSNPrintf(pszScratchBuf, ui32ScratchBufSize,
901 "Set=%d, Way=%d, %s", ui32SetNumber, ui32WayNumber, pszGroup);
902 pszTagSB = pszScratchBuf;
908 OSSNPrintf(pszScratchBuf, ui32ScratchBufSize, "SB=0x%02x", ui32TagSB);
909 pszTagSB = pszScratchBuf;
914 *ppszTagID = pszTagID;
915 *ppszTagSB = pszTagSB;
920 #if !defined(RGX_FEATURE_S7_TOP_INFRASTRUCTURE)
922 #if defined(SUPPORT_PAGE_FAULT_DEBUG)
924 typedef enum _DEVICEMEM_HISTORY_QUERY_INDEX_
926 DEVICEMEM_HISTORY_QUERY_INDEX_PRECEDING,
927 DEVICEMEM_HISTORY_QUERY_INDEX_FAULTED,
928 DEVICEMEM_HISTORY_QUERY_INDEX_NEXT,
929 DEVICEMEM_HISTORY_QUERY_INDEX_COUNT,
930 } DEVICEMEM_HISTORY_QUERY_INDEX;
933 *******************************************************************************
935 @Function _PrintDevicememHistoryQueryResult
939 Print details of a single result from a DevicememHistory query
941 @Input pfnDumpDebugPrintf - Debug printf function
942 @Input psResult - The DevicememHistory result to be printed
943 @Input psFaultProcessInfo - The process info derived from the page fault
944 @Input ui32Index - The index of the result
948 ******************************************************************************/
949 static IMG_VOID _PrintDevicememHistoryQueryResult(DUMPDEBUG_PRINTF_FUNC *pfnDumpDebugPrintf,
950 RGXMEM_PROCESS_INFO *psFaultProcessInfo,
951 DEVICEMEM_HISTORY_QUERY_OUT_RESULT *psResult,
952 IMG_UINT32 ui32Index)
954 IMG_UINT32 ui32Remainder;
956 if(psFaultProcessInfo->uiPID != RGXMEM_SERVER_PID_FIRMWARE)
958 PVR_DUMPDEBUG_LOG((" [%u] Name: %s Base address: " IMG_DEV_VIRTADDR_FMTSPEC
959 " Size: " IMG_DEVMEM_SIZE_FMTSPEC
960 " Allocated: %c Modified %llu us ago (abs time %llu us)",
963 (unsigned long long) psResult->sBaseDevVAddr.uiAddr,
964 (unsigned long long) psResult->uiSize,
965 psResult->bAllocated ? 'Y' : 'N',
966 (unsigned long long) OSDivide64r64(psResult->ui64Age, 1000, &ui32Remainder),
967 (unsigned long long) OSDivide64r64(psResult->ui64When, 1000, &ui32Remainder)));
971 PVR_DUMPDEBUG_LOG((" [%u] Name: %s Base address: " IMG_DEV_VIRTADDR_FMTSPEC
972 " Size: " IMG_DEVMEM_SIZE_FMTSPEC
973 " Allocated: %c Modified %llu us ago (abs time %llu us) PID: %u (%s)",
976 (unsigned long long) psResult->sBaseDevVAddr.uiAddr,
977 (unsigned long long) psResult->uiSize,
978 psResult->bAllocated ? 'Y' : 'N',
979 (unsigned long long) OSDivide64r64(psResult->ui64Age, 1000, &ui32Remainder),
980 (unsigned long long) OSDivide64r64(psResult->ui64When, 1000, &ui32Remainder),
981 (unsigned int) psResult->sProcessInfo.uiPID,
982 psResult->sProcessInfo.szProcessName));
987 *******************************************************************************
989 @Function _PrintDevicememHistoryQueryOut
993 Print details of all the results from a DevicememHistory query
995 @Input pfnDumpDebugPrintf - Debug printf function
996 @Input psResult - The DevicememHistory result to be printed
1000 ******************************************************************************/
1001 static IMG_VOID _PrintDevicememHistoryQueryOut(DUMPDEBUG_PRINTF_FUNC *pfnDumpDebugPrintf,
1002 RGXMEM_PROCESS_INFO *psFaultProcessInfo,
1003 DEVICEMEM_HISTORY_QUERY_OUT *psQueryOut)
1007 if(psQueryOut->ui32NumResults == 0)
1009 PVR_DUMPDEBUG_LOG((" No results"));
1013 for(i = 0; i < psQueryOut->ui32NumResults; i++)
1015 _PrintDevicememHistoryQueryResult(pfnDumpDebugPrintf,
1017 &psQueryOut->sResults[i],
1023 /* table of HW page size values and the equivalent */
1024 static const unsigned int aui32HWPageSizeTable[][2] =
1026 { 0, PVRSRV_4K_PAGE_SIZE },
1027 { 1, PVRSRV_16K_PAGE_SIZE },
1028 { 2, PVRSRV_64K_PAGE_SIZE },
1029 { 3, PVRSRV_256K_PAGE_SIZE },
1030 { 4, PVRSRV_1M_PAGE_SIZE },
1031 { 5, PVRSRV_2M_PAGE_SIZE }
1035 *******************************************************************************
1037 @Function _PageSizeHWToBytes
1041 Convert a HW page size value to its size in bytes
1043 @Input ui32PageSizeHW - The HW page size value
1045 @Return IMG_UINT32 The page size in bytes
1047 ******************************************************************************/
1048 static IMG_UINT32 _PageSizeHWToBytes(IMG_UINT32 ui32PageSizeHW)
1050 PVR_ASSERT(ui32PageSizeHW <= 5);
1052 return aui32HWPageSizeTable[ui32PageSizeHW][1];
1056 *******************************************************************************
1058 @Function _GetDevicememHistoryData
1062 Get the DevicememHistory results for the given PID and faulting device virtual address.
1063 The function will query DevicememHistory for information about the faulting page, as well
1064 as the page before and after.
1066 @Input uiPID - The process ID to search for allocations belonging to
1067 @Input sFaultDevVAddr - The device address to search for allocations at/before/after
1068 @Input asQueryOut - Storage for the query results
1069 @Input ui32PageSizeBytes - Faulted page size in bytes
1073 ******************************************************************************/
1074 static IMG_BOOL _GetDevicememHistoryData(IMG_PID uiPID, IMG_DEV_VIRTADDR sFaultDevVAddr,
1075 DEVICEMEM_HISTORY_QUERY_OUT asQueryOut[DEVICEMEM_HISTORY_QUERY_INDEX_COUNT],
1076 IMG_UINT32 ui32PageSizeBytes)
1079 DEVICEMEM_HISTORY_QUERY_IN sQueryIn;
1080 IMG_BOOL bAnyHits = IMG_FALSE;
1082 /* if the page fault originated in the firmware then the allocation may
1083 * appear to belong to any PID, because FW allocations are attributed
1084 * to the client process creating the allocation, so instruct the
1085 * devicemem_history query to search all available PIDs
1087 if(uiPID == RGXMEM_SERVER_PID_FIRMWARE)
1089 sQueryIn.uiPID = DEVICEMEM_HISTORY_PID_ANY;
1093 sQueryIn.uiPID = uiPID;
1096 /* query the DevicememHistory about the preceding / faulting / next page */
1098 for(i = DEVICEMEM_HISTORY_QUERY_INDEX_PRECEDING; i < DEVICEMEM_HISTORY_QUERY_INDEX_COUNT; i++)
1104 case DEVICEMEM_HISTORY_QUERY_INDEX_PRECEDING:
1105 sQueryIn.sDevVAddr.uiAddr = (sFaultDevVAddr.uiAddr & ~(IMG_UINT64)(ui32PageSizeBytes - 1)) - 1;
1107 case DEVICEMEM_HISTORY_QUERY_INDEX_FAULTED:
1108 sQueryIn.sDevVAddr = sFaultDevVAddr;
1110 case DEVICEMEM_HISTORY_QUERY_INDEX_NEXT:
1111 sQueryIn.sDevVAddr.uiAddr = (sFaultDevVAddr.uiAddr & ~(IMG_UINT64)(ui32PageSizeBytes - 1)) + ui32PageSizeBytes;
1115 /* return value ignored because we check each of the QUERY_OUT elements
1116 * later to see if they contain any hits
1118 bHits = DevicememHistoryQuery(&sQueryIn, &asQueryOut[i]);
1120 if(bHits == IMG_TRUE)
1122 bAnyHits = IMG_TRUE;
1129 /* stored data about one page fault */
1130 typedef struct _FAULT_INFO_
1132 /* the process info of the memory context that page faulted */
1133 RGXMEM_PROCESS_INFO sProcessInfo;
1134 IMG_DEV_VIRTADDR sFaultDevVAddr;
1135 DEVICEMEM_HISTORY_QUERY_OUT asQueryOut[DEVICEMEM_HISTORY_QUERY_INDEX_COUNT];
1136 /* the CR timer value at the time of the fault, recorded by the FW.
1137 * used to differentiate different page faults
1139 IMG_UINT64 ui64CRTimer;
1140 /* time when this FAULT_INFO entry was added. used for timing
1141 * reference against the map/unmap information
1143 IMG_UINT64 ui64When;
1146 /* history list of page faults.
1147 * Keeps the first `n` page faults and the last `n` page faults, like the FW
1150 typedef struct _FAULT_INFO_LOG_
1152 IMG_UINT32 ui32Head;
1153 IMG_UINT32 ui32NumWrites;
1154 /* the number of faults in this log need not correspond exactly to
1155 * the HWINFO number of the FW, as the FW HWINFO log may contain
1156 * non-page fault HWRs
1158 FAULT_INFO asFaults[RGXFWIF_HWINFO_MAX];
1161 static FAULT_INFO_LOG gsFaultInfoLog = { 0 };
1164 *******************************************************************************
1166 @Function _QueryFaultInfo
1170 Searches the local list of previously analysed page faults to see if the given
1171 fault has already been analysed and if so, returns a pointer to the analysis
1172 object (FAULT_INFO *), otherwise returns NULL.
1174 @Input pfnDumpDebugPrintf - The debug printf function
1175 @Input sFaultDevVAddr - The faulting device virtual address
1176 @Input ui64CRTimer - The CR timer value recorded by the FW at the time of the fault
1178 @Return FAULT_INFO* Pointer to an existing fault analysis structure if found, otherwise IMG_NULL
1180 ******************************************************************************/
1181 static FAULT_INFO *_QueryFaultInfo(DUMPDEBUG_PRINTF_FUNC *pfnDumpDebugPrintf,
1182 IMG_DEV_VIRTADDR sFaultDevVAddr,
1183 IMG_UINT64 ui64CRTimer)
1187 for(i = 0; i < MIN(gsFaultInfoLog.ui32NumWrites, RGXFWIF_HWINFO_MAX); i++)
1189 if((gsFaultInfoLog.asFaults[i].ui64CRTimer == ui64CRTimer) &&
1190 (gsFaultInfoLog.asFaults[i].sFaultDevVAddr.uiAddr == sFaultDevVAddr.uiAddr))
1192 return &gsFaultInfoLog.asFaults[i];
1200 *******************************************************************************
1202 @Function __AcquireNextFaultInfoElement
1206 Gets a pointer to the next element in the fault info log
1207 (requires the fault info lock be held)
1210 @Return FAULT_INFO* Pointer to the next record for writing
1212 ******************************************************************************/
1214 static FAULT_INFO *_AcquireNextFaultInfoElement(IMG_VOID)
1216 IMG_UINT32 ui32Head = gsFaultInfoLog.ui32Head;
1217 FAULT_INFO *psInfo = &gsFaultInfoLog.asFaults[ui32Head];
1222 static IMG_VOID _CommitFaultInfo(PVRSRV_RGXDEV_INFO *psDevInfo,
1224 RGXMEM_PROCESS_INFO *psProcessInfo,
1225 IMG_DEV_VIRTADDR sFaultDevVAddr,
1226 IMG_UINT64 ui64CRTimer)
1230 /* commit the page fault details */
1232 psInfo->sProcessInfo = *psProcessInfo;
1233 psInfo->sFaultDevVAddr = sFaultDevVAddr;
1234 psInfo->ui64CRTimer = ui64CRTimer;
1235 psInfo->ui64When = OSClockus64();
1237 /* if the page fault was caused by the firmware then get information about
1238 * which client application created the related allocations.
1240 * Fill in the process info data for each query result.
1243 if(psInfo->sProcessInfo.uiPID == RGXMEM_SERVER_PID_FIRMWARE)
1245 for(i = 0; i < DEVICEMEM_HISTORY_QUERY_INDEX_COUNT; i++)
1247 for(j = 0; j < DEVICEMEM_HISTORY_QUERY_OUT_MAX_RESULTS; j++)
1251 RGXMEM_PROCESS_INFO *psProcInfo = &psInfo->asQueryOut[i].sResults[j].sProcessInfo;
1252 bFound = RGXPCPIDToProcessInfo(psDevInfo,
1257 OSStringNCopy(psProcInfo->szProcessName,
1259 sizeof(psProcInfo->szProcessName) - 1);
1260 psProcInfo->szProcessName[sizeof(psProcInfo->szProcessName) - 1] = '\0';
1266 /* assert the faults circular buffer hasn't been moving and
1267 * move the head along
1270 PVR_ASSERT(psInfo == &gsFaultInfoLog.asFaults[gsFaultInfoLog.ui32Head]);
1272 if(gsFaultInfoLog.ui32Head < RGXFWIF_HWINFO_MAX - 1)
1274 gsFaultInfoLog.ui32Head++;
1278 /* wrap back to the first of the 'LAST' entries */
1279 gsFaultInfoLog.ui32Head = RGXFWIF_HWINFO_MAX_FIRST;
1282 gsFaultInfoLog.ui32NumWrites++;
1288 *******************************************************************************
1290 @Function _PrintFaultInfo
1294 Print all the details of a page fault from a FAULT_INFO structure
1296 @Input pfnDumpDebugPrintf - The debug printf function
1297 @Input psInfo - The page fault occurrence to print
1298 @Input pui32Index - (optional) index value to include in the print output
1302 ******************************************************************************/
1303 static IMG_VOID _PrintFaultInfo(DUMPDEBUG_PRINTF_FUNC *pfnDumpDebugPrintf,
1305 const IMG_UINT32 *pui32Index)
1311 uiPID = (psInfo->sProcessInfo.uiPID == RGXMEM_SERVER_PID_FIRMWARE) ? 0 : psInfo->sProcessInfo.uiPID;
1315 PVR_DUMPDEBUG_LOG(("(%u) Device memory history for page fault address 0x%010llX, CRTimer: 0x%016llX, "
1316 "PID: %u (%s, unregistered: %u) Abs Time: %llu us",
1318 (unsigned long long) psInfo->sFaultDevVAddr.uiAddr,
1319 psInfo->ui64CRTimer,
1320 (unsigned int) uiPID,
1321 psInfo->sProcessInfo.szProcessName,
1322 psInfo->sProcessInfo.bUnregistered,
1323 (unsigned long long) psInfo->ui64When));
1327 PVR_DUMPDEBUG_LOG(("Device memory history for page fault address 0x%010llX, PID: %u (%s, unregistered: %u) Abs Time: %llu us",
1328 (unsigned long long) psInfo->sFaultDevVAddr.uiAddr,
1329 (unsigned int) uiPID,
1330 psInfo->sProcessInfo.szProcessName,
1331 psInfo->sProcessInfo.bUnregistered,
1332 (unsigned long long) psInfo->ui64When));
1335 for(i = DEVICEMEM_HISTORY_QUERY_INDEX_PRECEDING; i < DEVICEMEM_HISTORY_QUERY_INDEX_COUNT; i++)
1337 const IMG_CHAR *pszWhich;
1341 case DEVICEMEM_HISTORY_QUERY_INDEX_PRECEDING:
1342 pszWhich = "Preceding page";
1344 case DEVICEMEM_HISTORY_QUERY_INDEX_FAULTED:
1345 pszWhich = "Faulted page";
1347 case DEVICEMEM_HISTORY_QUERY_INDEX_NEXT:
1348 pszWhich = "Next page";
1352 PVR_DUMPDEBUG_LOG(("%s:", pszWhich));
1353 _PrintDevicememHistoryQueryOut(pfnDumpDebugPrintf,
1354 &psInfo->sProcessInfo,
1355 &psInfo->asQueryOut[i]);
1362 *******************************************************************************
1364 @Function _RGXDumpRGXBIFBank
1368 Dump BIF Bank state in human readable form.
1370 @Input psDevInfo - RGX device info
1371 @Input eBankID - BIF identifier
1372 @Input ui64MMUStatus - MMU Status register value
1373 @Input ui64ReqStatus - BIF request Status register value
1374 @Input ui64PCAddress - Page catalogue base address of faulting access
1375 @Input ui64CRTimer - RGX CR timer value at time of page fault
1376 @Input bBIFSummary - Flag to check whether the function is called
1377 as a part of the debug dump summary or
1378 as a part of a HWR log
1381 ******************************************************************************/
1382 static IMG_VOID _RGXDumpRGXBIFBank(DUMPDEBUG_PRINTF_FUNC *pfnDumpDebugPrintf,
1383 PVRSRV_RGXDEV_INFO *psDevInfo,
1384 RGXDBG_BIF_ID eBankID,
1385 IMG_UINT64 ui64MMUStatus,
1386 IMG_UINT64 ui64ReqStatus,
1387 IMG_UINT64 ui64PCAddress,
1388 IMG_UINT64 ui64CRTimer,
1389 IMG_BOOL bBIFSummary)
1392 if (ui64MMUStatus == 0x0)
1394 PVR_DUMPDEBUG_LOG(("%s - OK", pszBIFNames[eBankID]));
1398 IMG_DEV_VIRTADDR sFaultDevVAddr;
1399 IMG_DEV_PHYADDR sPCDevPAddr = { 0 };
1400 #if defined(SUPPORT_PAGE_FAULT_DEBUG)
1401 IMG_BOOL bFound = IMG_FALSE;
1402 RGXMEM_PROCESS_INFO sProcessInfo;
1403 IMG_UINT32 ui32PageSizeBytes;
1406 /* Bank 0 & 1 share the same fields */
1407 PVR_DUMPDEBUG_LOG(("%s%s - FAULT:",
1408 (bBIFSummary)?"":" ",
1409 pszBIFNames[eBankID]));
1414 (ui64MMUStatus & ~RGX_CR_BIF_FAULT_BANK0_MMU_STATUS_CAT_BASE_CLRMSK) >>
1415 RGX_CR_BIF_FAULT_BANK0_MMU_STATUS_CAT_BASE_SHIFT;
1417 IMG_UINT32 ui32PageSize =
1418 (ui64MMUStatus & ~RGX_CR_BIF_FAULT_BANK0_MMU_STATUS_PAGE_SIZE_CLRMSK) >>
1419 RGX_CR_BIF_FAULT_BANK0_MMU_STATUS_PAGE_SIZE_SHIFT;
1421 IMG_UINT32 ui32MMUDataType =
1422 (ui64MMUStatus & ~RGX_CR_BIF_FAULT_BANK0_MMU_STATUS_DATA_TYPE_CLRMSK) >>
1423 RGX_CR_BIF_FAULT_BANK0_MMU_STATUS_DATA_TYPE_SHIFT;
1425 IMG_BOOL bROFault = (ui64MMUStatus & RGX_CR_BIF_FAULT_BANK0_MMU_STATUS_FAULT_RO_EN) != 0;
1426 IMG_BOOL bProtFault = (ui64MMUStatus & RGX_CR_BIF_FAULT_BANK0_MMU_STATUS_FAULT_PM_META_RO_EN) != 0;
1428 #if defined(SUPPORT_PAGE_FAULT_DEBUG)
1429 ui32PageSizeBytes = _PageSizeHWToBytes(ui32PageSize);
1432 PVR_DUMPDEBUG_LOG(("%s * MMU status (0x%016llX): PC = %d%s, Page Size = %d, MMU data type = %d%s%s.",
1433 (bBIFSummary)?"":" ",
1436 (ui32PC < 0x8)?"":_RGXDecodePMPC(ui32PC),
1439 (bROFault)?", Read Only fault":"",
1440 (bProtFault)?", PM/META protection fault":""));
1447 IMG_CHAR aszScratch[RGX_DEBUG_STR_SIZE];
1449 IMG_BOOL bRead = (ui64ReqStatus & RGX_CR_BIF_FAULT_BANK0_REQ_STATUS_RNW_EN) != 0;
1450 IMG_UINT32 ui32TagSB =
1451 (ui64ReqStatus & ~RGX_CR_BIF_FAULT_BANK0_REQ_STATUS_TAG_SB_CLRMSK) >>
1452 RGX_CR_BIF_FAULT_BANK0_REQ_STATUS_TAG_SB_SHIFT;
1453 IMG_UINT32 ui32TagID =
1454 (ui64ReqStatus & ~RGX_CR_BIF_FAULT_BANK0_REQ_STATUS_TAG_ID_CLRMSK) >>
1455 RGX_CR_BIF_FAULT_BANK0_REQ_STATUS_TAG_ID_SHIFT;
1456 IMG_UINT64 ui64Addr = ((ui64ReqStatus & ~RGX_CR_BIF_FAULT_BANK0_REQ_STATUS_ADDRESS_CLRMSK) >>
1457 RGX_CR_BIF_FAULT_BANK0_REQ_STATUS_ADDRESS_SHIFT) <<
1458 RGX_CR_BIF_FAULT_BANK0_REQ_STATUS_ADDRESS_ALIGNSHIFT;
1460 _RGXDecodeBIFReqTags(eBankID, ui32TagID, ui32TagSB, &pszTagID, &pszTagSB, &aszScratch[0], RGX_DEBUG_STR_SIZE);
1462 PVR_DUMPDEBUG_LOG(("%s * Request (0x%016llX): %s (%s), %s 0x%010llX.",
1463 (bBIFSummary)?"":" ",
1467 (bRead)?"Reading from":"Writing to",
1471 /* Check if the host thinks this fault is valid */
1473 sFaultDevVAddr.uiAddr = (ui64ReqStatus & ~RGX_CR_BIF_FAULT_BANK0_REQ_STATUS_ADDRESS_CLRMSK);
1478 (ui64MMUStatus & ~RGX_CR_BIF_FAULT_BANK0_MMU_STATUS_CAT_BASE_CLRMSK) >>
1479 RGX_CR_BIF_FAULT_BANK0_MMU_STATUS_CAT_BASE_SHIFT;
1481 /* Only the first 8 cat bases are application memory contexts which we can validate... */
1484 sPCDevPAddr.uiAddr = OSReadHWReg64(psDevInfo->pvRegsBaseKM, RGX_CR_BIF_CAT_BASEN(ui32PC));
1485 PVR_DUMPDEBUG_LOG(("Acquired live PC address: 0x%016llX", sPCDevPAddr.uiAddr));
1489 sPCDevPAddr.uiAddr = 0;
1494 PVR_DUMPDEBUG_LOG(("FW logged fault using PC Address: 0x%016llX", ui64PCAddress));
1495 sPCDevPAddr.uiAddr = ui64PCAddress;
1500 PVR_DUMPDEBUG_LOG(("Checking faulting address 0x%010llX", sFaultDevVAddr.uiAddr));
1501 RGXCheckFaultAddress(psDevInfo, &sFaultDevVAddr, &sPCDevPAddr);
1504 #if defined(SUPPORT_PAGE_FAULT_DEBUG)
1506 /* look to see if we have already processed this fault.
1507 * if so then use the previously acquired information.
1509 OSLockAcquire(psDevInfo->hDebugFaultInfoLock);
1510 psInfo = _QueryFaultInfo(pfnDumpDebugPrintf, sFaultDevVAddr, ui64CRTimer);
1512 if(psInfo == IMG_NULL)
1514 if(sPCDevPAddr.uiAddr != RGXFWIF_INVALID_PC_PHYADDR)
1516 /* look up the process details for the faulting page catalogue */
1517 bFound = RGXPCAddrToProcessInfo(psDevInfo, sPCDevPAddr, &sProcessInfo);
1523 psInfo = _AcquireNextFaultInfoElement();
1525 /* get any DevicememHistory data for the faulting address */
1526 bHits = _GetDevicememHistoryData(sProcessInfo.uiPID,
1533 _CommitFaultInfo(psDevInfo,
1542 PVR_DUMPDEBUG_LOG(("Could not find PID for PC 0x%016llX", sPCDevPAddr.uiAddr));
1547 PVR_DUMPDEBUG_LOG(("Page fault not applicable to Devmem History"));
1551 /* psInfo should always be non-NULL if the process was found */
1552 PVR_ASSERT((psInfo != IMG_NULL) || !bFound);
1554 if(psInfo != IMG_NULL)
1556 _PrintFaultInfo(pfnDumpDebugPrintf, psInfo, NULL);
1559 OSLockRelease(psDevInfo->hDebugFaultInfoLock);
1568 #if defined(RGX_FEATURE_S7_TOP_INFRASTRUCTURE)
1570 *******************************************************************************
1572 @Function _RGXDumpRGXMMUFaultStatus
1576 Dump MMU Fault status in human readable form.
1578 @Input psDevInfo - RGX device info
1579 @Input ui64MMUStatus - MMU Status register value
1580 @Input bSummary - Flag to check whether the function is called
1581 as a part of the debug dump summary or
1582 as a part of a HWR log
1585 ******************************************************************************/
1586 static IMG_VOID _RGXDumpRGXMMUFaultStatus(DUMPDEBUG_PRINTF_FUNC *pfnDumpDebugPrintf,
1587 PVRSRV_RGXDEV_INFO *psDevInfo,
1588 IMG_UINT64 ui64MMUStatus,
1591 if (ui64MMUStatus == 0x0)
1593 PVR_DUMPDEBUG_LOG(("MMU (Core) - OK"));
1597 IMG_UINT32 ui32PC = (ui64MMUStatus & ~RGX_CR_MMU_FAULT_STATUS_CONTEXT_CLRMSK) >>
1598 RGX_CR_MMU_FAULT_STATUS_CONTEXT_SHIFT;
1599 IMG_UINT64 ui64Addr = (ui64MMUStatus & ~RGX_CR_MMU_FAULT_STATUS_ADDRESS_CLRMSK) >>
1600 RGX_CR_MMU_FAULT_STATUS_ADDRESS_SHIFT;
1601 IMG_UINT32 ui32Requester = (ui64MMUStatus & ~RGX_CR_MMU_FAULT_STATUS_REQ_ID_CLRMSK) >>
1602 RGX_CR_MMU_FAULT_STATUS_REQ_ID_SHIFT;
1603 IMG_UINT32 ui32SideBand = (ui64MMUStatus & ~RGX_CR_MMU_FAULT_STATUS_TAG_SB_CLRMSK) >>
1604 RGX_CR_MMU_FAULT_STATUS_TAG_SB_SHIFT;
1605 IMG_UINT32 ui32MMULevel = (ui64MMUStatus & ~RGX_CR_MMU_FAULT_STATUS_LEVEL_CLRMSK) >>
1606 RGX_CR_MMU_FAULT_STATUS_LEVEL_SHIFT;
1607 IMG_BOOL bRead = (ui64MMUStatus & RGX_CR_MMU_FAULT_STATUS_RNW_EN) != 0;
1608 IMG_BOOL bFault = (ui64MMUStatus & RGX_CR_MMU_FAULT_STATUS_FAULT_EN) != 0;
1609 IMG_BOOL bROFault = ((ui64MMUStatus & ~RGX_CR_MMU_FAULT_STATUS_TYPE_CLRMSK) >>
1610 RGX_CR_MMU_FAULT_STATUS_TYPE_SHIFT) == 0x2;
1611 IMG_BOOL bProtFault = ((ui64MMUStatus & ~RGX_CR_MMU_FAULT_STATUS_TYPE_CLRMSK) >>
1612 RGX_CR_MMU_FAULT_STATUS_TYPE_SHIFT) == 0x3;
1613 IMG_CHAR aszScratch[RGX_DEBUG_STR_SIZE];
1617 _RGXDecodeMMUReqTags(ui32Requester, ui32SideBand, &pszTagID, &pszTagSB, aszScratch, RGX_DEBUG_STR_SIZE);
1619 PVR_DUMPDEBUG_LOG(("%sMMU (Core) - FAULT:", (bSummary)?"":" "));
1620 PVR_DUMPDEBUG_LOG(("%s * MMU status (0x%016llX): PC = %d, %s 0x%010llX, %s (%s)%s%s%s%s.",
1624 (bRead)?"Reading from":"Writing to",
1628 (bFault)?", Fault":"",
1629 (bROFault)?", Read Only fault":"",
1630 (bProtFault)?", PM/META protection fault":"",
1631 _RGXDecodeMMULevel(ui32MMULevel)));
1637 *******************************************************************************
1639 @Function _RGXDumpRGXMMUMetaFaultStatus
1643 Dump MMU Meta Fault state in human readable form.
1645 @Input psDevInfo - RGX device info
1646 @Input ui64MMUStatus - MMU Status register value
1647 @Input bSummary - Flag to check whether the function is called
1648 as a part of the debug dump summary or
1649 as a part of a HWR log
1652 ******************************************************************************/
1653 static IMG_VOID _RGXDumpRGXMMUMetaFaultStatus(DUMPDEBUG_PRINTF_FUNC *pfnDumpDebugPrintf,
1654 PVRSRV_RGXDEV_INFO *psDevInfo,
1655 IMG_UINT64 ui64MMUStatus,
1658 if (ui64MMUStatus == 0x0)
1660 PVR_DUMPDEBUG_LOG(("MMU (Meta) - OK"));
1664 IMG_UINT32 ui32PC = (ui64MMUStatus & ~RGX_CR_MMU_FAULT_STATUS_META_CONTEXT_CLRMSK) >>
1665 RGX_CR_MMU_FAULT_STATUS_META_CONTEXT_SHIFT;
1666 IMG_UINT64 ui64Addr = (ui64MMUStatus & ~RGX_CR_MMU_FAULT_STATUS_META_ADDRESS_CLRMSK) >>
1667 RGX_CR_MMU_FAULT_STATUS_META_ADDRESS_SHIFT;
1668 IMG_UINT32 ui32SideBand = (ui64MMUStatus & ~RGX_CR_MMU_FAULT_STATUS_META_TAG_SB_CLRMSK) >>
1669 RGX_CR_MMU_FAULT_STATUS_META_TAG_SB_SHIFT;
1670 IMG_UINT32 ui32Requester = (ui64MMUStatus & ~RGX_CR_MMU_FAULT_STATUS_META_REQ_ID_CLRMSK) >>
1671 RGX_CR_MMU_FAULT_STATUS_META_REQ_ID_SHIFT;
1672 IMG_UINT32 ui32MMULevel = (ui64MMUStatus & ~RGX_CR_MMU_FAULT_STATUS_META_LEVEL_CLRMSK) >>
1673 RGX_CR_MMU_FAULT_STATUS_META_LEVEL_SHIFT;
1674 IMG_BOOL bRead = (ui64MMUStatus & RGX_CR_MMU_FAULT_STATUS_META_RNW_EN) != 0;
1675 IMG_BOOL bFault = (ui64MMUStatus & RGX_CR_MMU_FAULT_STATUS_META_FAULT_EN) != 0;
1676 IMG_BOOL bROFault = ((ui64MMUStatus & ~RGX_CR_MMU_FAULT_STATUS_META_TYPE_CLRMSK) >>
1677 RGX_CR_MMU_FAULT_STATUS_META_TYPE_SHIFT) == 0x2;
1678 IMG_BOOL bProtFault = ((ui64MMUStatus & ~RGX_CR_MMU_FAULT_STATUS_META_TYPE_CLRMSK) >>
1679 RGX_CR_MMU_FAULT_STATUS_META_TYPE_SHIFT) == 0x3;
1680 IMG_CHAR aszScratch[RGX_DEBUG_STR_SIZE];
1684 _RGXDecodeMMUReqTags(ui32Requester, ui32SideBand, &pszTagID, &pszTagSB, aszScratch, RGX_DEBUG_STR_SIZE);
1686 PVR_DUMPDEBUG_LOG(("%sMMU (Meta) - FAULT:", (bSummary)?"":" "));
1687 PVR_DUMPDEBUG_LOG(("%s * MMU status (0x%016llX): PC = %d, %s 0x%010llX, %s (%s)%s%s%s%s.",
1691 (bRead)?"Reading from":"Writing to",
1695 (bFault)?", Fault":"",
1696 (bROFault)?", Read Only fault":"",
1697 (bProtFault)?", PM/META protection fault":"",
1698 _RGXDecodeMMULevel(ui32MMULevel)));
1705 *******************************************************************************
1707 @Function _RGXDumpFWAssert
1711 Dump FW assert strings when a thread asserts.
1713 @Input psRGXFWIfTraceBufCtl - RGX FW trace buffer
1717 ******************************************************************************/
1718 static IMG_VOID _RGXDumpFWAssert(DUMPDEBUG_PRINTF_FUNC *pfnDumpDebugPrintf,
1719 RGXFWIF_TRACEBUF *psRGXFWIfTraceBufCtl)
1721 IMG_CHAR *pszTraceAssertPath;
1722 IMG_CHAR *pszTraceAssertInfo;
1723 IMG_INT32 ui32TraceAssertLine;
1726 for (i = 0; i < RGXFW_THREAD_NUM; i++)
1728 pszTraceAssertPath = psRGXFWIfTraceBufCtl->sTraceBuf[i].sAssertBuf.szPath;
1729 pszTraceAssertInfo = psRGXFWIfTraceBufCtl->sTraceBuf[i].sAssertBuf.szInfo;
1730 ui32TraceAssertLine = psRGXFWIfTraceBufCtl->sTraceBuf[i].sAssertBuf.ui32LineNum;
1732 /* print non null assert strings */
1733 if (*pszTraceAssertInfo)
1735 PVR_DUMPDEBUG_LOG(("FW-T%d Assert: %s (%s:%d)",
1736 i, pszTraceAssertInfo, pszTraceAssertPath, ui32TraceAssertLine));
1741 static IMG_VOID _RGXDumpFWPoll(DUMPDEBUG_PRINTF_FUNC *pfnDumpDebugPrintf,
1742 RGXFWIF_TRACEBUF *psRGXFWIfTraceBufCtl)
1745 for (i = 0; i < RGXFW_THREAD_NUM; i++)
1747 if (psRGXFWIfTraceBufCtl->aui32CrPollAddr[i])
1749 PVR_DUMPDEBUG_LOG(("T%u polling %s (reg:0x%08X mask:0x%08X)",
1751 ((psRGXFWIfTraceBufCtl->aui32CrPollAddr[i] & RGXFW_POLL_TYPE_SET)?("set"):("unset")),
1752 psRGXFWIfTraceBufCtl->aui32CrPollAddr[i] & ~RGXFW_POLL_TYPE_SET,
1753 psRGXFWIfTraceBufCtl->aui32CrPollMask[i]));
1759 static IMG_VOID _RGXDumpFWHWRInfo(DUMPDEBUG_PRINTF_FUNC *pfnDumpDebugPrintf,
1760 RGXFWIF_TRACEBUF *psRGXFWIfTraceBufCtl, PVRSRV_RGXDEV_INFO *psDevInfo)
1762 IMG_BOOL bAnyLocked = IMG_FALSE;
1764 IMG_UINT32 ui32LineSize;
1765 IMG_CHAR *pszLine, *pszTemp;
1766 const IMG_CHAR *apszDmNames[RGXFWIF_DM_MAX + 1] = { "GP(", "2D(", "TA(", "3D(", "CDM(",
1767 #if defined(RGX_FEATURE_RAY_TRACING)
1769 #endif /* RGX_FEATURE_RAY_TRACING */
1772 const IMG_CHAR *pszMsgHeader = "Number of HWR: ";
1773 IMG_CHAR *pszLockupType = "";
1774 RGXFWIF_HWRINFOBUF *psHWInfoBuf = psDevInfo->psRGXFWIfHWRInfoBuf;
1775 RGX_HWRINFO *psHWRInfo;
1776 IMG_UINT32 ui32MsgHeaderSize = OSStringLength(pszMsgHeader);
1777 IMG_UINT32 ui32HWRRecoveryFlags;
1778 IMG_UINT32 ui32ReadIndex;
1780 for (dm = 0; dm < RGXFWIF_DM_MAX; dm++)
1782 if (psRGXFWIfTraceBufCtl->aui16HwrDmLockedUpCount[dm] ||
1783 psRGXFWIfTraceBufCtl->aui16HwrDmOverranCount[dm])
1785 bAnyLocked = IMG_TRUE;
1790 if (!bAnyLocked && (psRGXFWIfTraceBufCtl->ui32HWRStateFlags & RGXFWIF_HWR_HARDWARE_OK))
1792 /* No HWR situation, print nothing */
1796 ui32LineSize = sizeof(IMG_CHAR) * ( ui32MsgHeaderSize +
1797 (RGXFWIF_DM_MAX*( 4/*DM name + left parenthesis*/ +
1798 5/*UINT16 max num of digits*/ +
1800 5/*UINT16 max num of digits*/ +
1801 3/*right parenthesis + comma + space*/)) +
1802 7 + (RGXFWIF_DM_MAX*6)/* FALSE() + (UINT16 max num + comma) per DM */ +
1805 pszLine = OSAllocMem(ui32LineSize);
1806 if (pszLine == IMG_NULL)
1808 PVR_DPF((PVR_DBG_ERROR,"_RGXDumpRGXDebugSummary: Out of mem allocating line string (size: %d)", ui32LineSize));
1812 OSStringCopy(pszLine,pszMsgHeader);
1813 pszTemp = pszLine + ui32MsgHeaderSize;
1815 for (dm = 0; (dm < RGXFWIF_DM_MAX) && (apszDmNames[dm] != IMG_NULL); dm++)
1817 OSStringCopy(pszTemp,apszDmNames[dm]);
1818 pszTemp += OSStringLength(apszDmNames[dm]);
1819 pszTemp += OSSNPrintf(pszTemp,
1820 5 + 1 + 5 + 1 + 5 + 1 + 1 + 1 + 1 /* UINT16 + slash + UINT16 + plus + UINT16 + right parenthesis + comma + space + \0 */,
1822 psRGXFWIfTraceBufCtl->aui16HwrDmRecoveredCount[dm],
1823 psRGXFWIfTraceBufCtl->aui16HwrDmLockedUpCount[dm],
1824 psRGXFWIfTraceBufCtl->aui16HwrDmOverranCount[dm]);
1827 OSStringCopy(pszTemp, "FALSE(");
1830 for (dm = 0; (dm < RGXFWIF_DM_MAX) && (apszDmNames[dm] != IMG_NULL); dm++)
1832 pszTemp += OSSNPrintf(pszTemp,
1833 5 + 1 + 1 /* UINT16 max num + comma + \0 */,
1834 (dm < RGXFWIF_DM_MAX-1 ? "%u," : "%u)"),
1835 psRGXFWIfTraceBufCtl->aui16HwrDmFalseDetectCount[dm]);
1838 PVR_DUMPDEBUG_LOG((pszLine));
1842 /* Print out per HWR info */
1843 for (dm = 0; (dm < RGXFWIF_DM_MAX) && (apszDmNames[dm] != IMG_NULL); dm++)
1845 if (dm == RGXFWIF_DM_GP)
1847 PVR_DUMPDEBUG_LOG(("DM %d (GP)", dm));
1851 PVR_DUMPDEBUG_LOG(("DM %d (HWRflags 0x%08x)", dm, psRGXFWIfTraceBufCtl->aui32HWRRecoveryFlags[dm]));
1855 for(i = 0 ; i < RGXFWIF_HWINFO_MAX ; i++)
1857 psHWRInfo = &psHWInfoBuf->sHWRInfo[ui32ReadIndex];
1859 if((psHWRInfo->eDM == dm) && (psHWRInfo->ui32HWRNumber != 0))
1861 ui32HWRRecoveryFlags = psHWRInfo->ui32HWRRecoveryFlags;
1862 if(ui32HWRRecoveryFlags & RGXFWIF_DM_STATE_GUILTY_LOCKUP) { pszLockupType = ", Guilty Lockup"; }
1863 else if (ui32HWRRecoveryFlags & RGXFWIF_DM_STATE_INNOCENT_LOCKUP) { pszLockupType = ", Innocent Lockup"; }
1864 else if (ui32HWRRecoveryFlags & RGXFWIF_DM_STATE_GUILTY_OVERRUNING) { pszLockupType = ", Guilty Overrun"; }
1865 else if (ui32HWRRecoveryFlags & RGXFWIF_DM_STATE_GUILTY_LOCKUP) { pszLockupType = ", Innocent Overrun"; }
1867 PVR_DUMPDEBUG_LOG((" Recovery %d: PID = %d, frame = %d, HWRTData = 0x%08X, EventStatus = 0x%08X, CRTimer = 0x%012llX%s",
1868 psHWRInfo->ui32HWRNumber,
1870 psHWRInfo->ui32FrameNum,
1871 psHWRInfo->ui32ActiveHWRTData,
1872 psHWRInfo->ui32EventStatus,
1873 psHWRInfo->ui64CRTimer,
1876 switch(psHWRInfo->eHWRType)
1878 #if !defined(RGX_FEATURE_S7_TOP_INFRASTRUCTURE)
1879 case RGX_HWRTYPE_BIF0FAULT:
1880 case RGX_HWRTYPE_BIF1FAULT:
1882 _RGXDumpRGXBIFBank(pfnDumpDebugPrintf, psDevInfo, RGXFWIF_HWRTYPE_BIF_BANK_GET(psHWRInfo->eHWRType),
1883 psHWRInfo->uHWRData.sBIFInfo.ui64BIFMMUStatus,
1884 psHWRInfo->uHWRData.sBIFInfo.ui64BIFReqStatus,
1885 psHWRInfo->uHWRData.sBIFInfo.ui64PCAddress,
1886 psHWRInfo->ui64CRTimer,
1890 #if defined(RGX_FEATURE_CLUSTER_GROUPING)
1891 case RGX_HWRTYPE_TEXASBIF0FAULT:
1893 _RGXDumpRGXBIFBank(pfnDumpDebugPrintf, psDevInfo, RGXDBG_TEXAS_BIF,
1894 psHWRInfo->uHWRData.sBIFInfo.ui64BIFMMUStatus,
1895 psHWRInfo->uHWRData.sBIFInfo.ui64BIFReqStatus,
1896 psHWRInfo->uHWRData.sBIFInfo.ui64PCAddress,
1897 psHWRInfo->ui64CRTimer,
1903 case RGX_HWRTYPE_MMUFAULT:
1905 _RGXDumpRGXMMUFaultStatus(pfnDumpDebugPrintf, psDevInfo,
1906 psHWRInfo->uHWRData.sMMUInfo.ui64MMUStatus,
1911 case RGX_HWRTYPE_MMUMETAFAULT:
1913 _RGXDumpRGXMMUMetaFaultStatus(pfnDumpDebugPrintf, psDevInfo,
1914 psHWRInfo->uHWRData.sMMUInfo.ui64MMUStatus,
1920 case RGX_HWRTYPE_POLLFAILURE:
1922 PVR_DUMPDEBUG_LOG((" T%u polling %s (reg:0x%08X mask:0x%08X)",
1923 psHWRInfo->uHWRData.sPollInfo.ui32ThreadNum,
1924 ((psHWRInfo->uHWRData.sPollInfo.ui32CrPollAddr & RGXFW_POLL_TYPE_SET)?("set"):("unset")),
1925 psHWRInfo->uHWRData.sPollInfo.ui32CrPollAddr & ~RGXFW_POLL_TYPE_SET,
1926 psHWRInfo->uHWRData.sPollInfo.ui32CrPollMask));
1930 case RGX_HWRTYPE_OVERRUN:
1931 case RGX_HWRTYPE_UNKNOWNFAILURE:
1933 /* Nothing to dump */
1939 PVR_ASSERT(IMG_FALSE);
1945 if(ui32ReadIndex == RGXFWIF_HWINFO_MAX_FIRST - 1)
1946 ui32ReadIndex = psHWInfoBuf->ui32WriteIndex;
1948 ui32ReadIndex = (ui32ReadIndex + 1) - (ui32ReadIndex / RGXFWIF_HWINFO_LAST_INDEX) * RGXFWIF_HWINFO_MAX_LAST;
1953 #if !defined(NO_HARDWARE)
1956 *******************************************************************************
1958 @Function _CheckForPendingPage
1962 Check if the MMU indicates it is blocked on a pending page
1964 @Input psDevInfo - RGX device info
1966 @Return IMG_BOOL - IMG_TRUE if there is a pending page
1968 ******************************************************************************/
1969 static INLINE IMG_BOOL _CheckForPendingPage(PVRSRV_RGXDEV_INFO *psDevInfo)
1971 IMG_UINT32 ui32BIFMMUEntry;
1973 ui32BIFMMUEntry = OSReadHWReg32(psDevInfo->pvRegsBaseKM, RGX_CR_BIF_MMU_ENTRY);
1975 if(ui32BIFMMUEntry & RGX_CR_BIF_MMU_ENTRY_PENDING_EN)
1986 *******************************************************************************
1988 @Function _GetPendingPageInfo
1992 Get information about the pending page from the MMU status registers
1994 @Input psDevInfo - RGX device info
1995 @Output psDevVAddr - The device virtual address of the pending MMU address translation
1996 @Output pui32CatBase - The page catalog base
1997 @Output pui32DataType - The MMU entry data type
2001 ******************************************************************************/
2002 static void _GetPendingPageInfo(PVRSRV_RGXDEV_INFO *psDevInfo, IMG_DEV_VIRTADDR *psDevVAddr,
2003 IMG_UINT32 *pui32CatBase,
2004 IMG_UINT32 *pui32DataType)
2006 IMG_UINT64 ui64BIFMMUEntryStatus;
2008 ui64BIFMMUEntryStatus = OSReadHWReg64(psDevInfo->pvRegsBaseKM, RGX_CR_BIF_MMU_ENTRY_STATUS);
2010 psDevVAddr->uiAddr = (ui64BIFMMUEntryStatus & ~RGX_CR_BIF_MMU_ENTRY_STATUS_ADDRESS_CLRMSK);
2012 *pui32CatBase = (ui64BIFMMUEntryStatus & ~RGX_CR_BIF_MMU_ENTRY_STATUS_CAT_BASE_CLRMSK) >>
2013 RGX_CR_BIF_MMU_ENTRY_STATUS_CAT_BASE_SHIFT;
2015 *pui32DataType = (ui64BIFMMUEntryStatus & ~RGX_CR_BIF_MMU_ENTRY_STATUS_DATA_TYPE_CLRMSK) >>
2016 RGX_CR_BIF_MMU_ENTRY_STATUS_DATA_TYPE_SHIFT;
2022 *******************************************************************************
2024 @Function _RGXDumpRGXDebugSummary
2028 Dump a summary in human readable form with the RGX state
2030 @Input psDevInfo - RGX device info
2034 ******************************************************************************/
2035 static IMG_VOID _RGXDumpRGXDebugSummary(DUMPDEBUG_PRINTF_FUNC *pfnDumpDebugPrintf,
2036 PVRSRV_RGXDEV_INFO *psDevInfo, IMG_BOOL bRGXPoweredON)
2039 RGXFWIF_TRACEBUF *psRGXFWIfTraceBuf = psDevInfo->psRGXFWIfTraceBuf;
2043 #if defined(RGX_FEATURE_S7_TOP_INFRASTRUCTURE)
2044 IMG_UINT64 ui64RegValMMUStatus;
2046 ui64RegValMMUStatus = OSReadHWReg64(psDevInfo->pvRegsBaseKM, RGX_CR_MMU_FAULT_STATUS);
2047 _RGXDumpRGXMMUFaultStatus(pfnDumpDebugPrintf, psDevInfo, ui64RegValMMUStatus, IMG_TRUE);
2049 ui64RegValMMUStatus = OSReadHWReg64(psDevInfo->pvRegsBaseKM, RGX_CR_MMU_FAULT_STATUS_META);
2050 _RGXDumpRGXMMUMetaFaultStatus(pfnDumpDebugPrintf, psDevInfo, ui64RegValMMUStatus, IMG_TRUE);
2052 IMG_UINT64 ui64RegValMMUStatus, ui64RegValREQStatus;
2054 ui64RegValMMUStatus = OSReadHWReg64(psDevInfo->pvRegsBaseKM, RGX_CR_BIF_FAULT_BANK0_MMU_STATUS);
2055 ui64RegValREQStatus = OSReadHWReg64(psDevInfo->pvRegsBaseKM, RGX_CR_BIF_FAULT_BANK0_REQ_STATUS);
2057 _RGXDumpRGXBIFBank(pfnDumpDebugPrintf, psDevInfo, RGXDBG_BIF0, ui64RegValMMUStatus, ui64RegValREQStatus, 0, 0, IMG_TRUE);
2059 ui64RegValMMUStatus = OSReadHWReg64(psDevInfo->pvRegsBaseKM, RGX_CR_BIF_FAULT_BANK1_MMU_STATUS);
2060 ui64RegValREQStatus = OSReadHWReg64(psDevInfo->pvRegsBaseKM, RGX_CR_BIF_FAULT_BANK1_REQ_STATUS);
2062 _RGXDumpRGXBIFBank(pfnDumpDebugPrintf, psDevInfo, RGXDBG_BIF1, ui64RegValMMUStatus, ui64RegValREQStatus, 0, 0, IMG_TRUE);
2064 #if defined(RGX_FEATURE_CLUSTER_GROUPING)
2065 #if defined(RGX_NUM_PHANTOMS)
2067 IMG_UINT32 ui32Phantom;
2069 for (ui32Phantom = 0; ui32Phantom < RGX_NUM_PHANTOMS; ui32Phantom++)
2071 /* This can't be done as it may interfere with the FW... */
2072 /*OSWriteHWReg64(RGX_CR_TEXAS_INDIRECT, ui32Phantom);*/
2074 ui64RegValMMUStatus = OSReadHWReg64(psDevInfo->pvRegsBaseKM, RGX_CR_TEXAS_BIF_FAULT_BANK0_MMU_STATUS);
2075 ui64RegValREQStatus = OSReadHWReg64(psDevInfo->pvRegsBaseKM, RGX_CR_TEXAS_BIF_FAULT_BANK0_REQ_STATUS);
2077 _RGXDumpRGXBIFBank(pfnDumpDebugPrintf, psDevInfo, RGXDBG_TEXAS, ui64RegValMMUStatus, ui64RegValREQStatus, 0, 0, IMG_TRUE);
2081 ui64RegValMMUStatus = OSReadHWReg64(psDevInfo->pvRegsBaseKM, RGX_CR_TEXAS_BIF_FAULT_BANK0_MMU_STATUS);
2082 ui64RegValREQStatus = OSReadHWReg64(psDevInfo->pvRegsBaseKM, RGX_CR_TEXAS_BIF_FAULT_BANK0_REQ_STATUS);
2084 _RGXDumpRGXBIFBank(pfnDumpDebugPrintf, psDevInfo, RGXDBG_TEXAS_BIF, ui64RegValMMUStatus, ui64RegValREQStatus, 0, 0, IMG_TRUE);
2089 #if !defined(NO_HARDWARE)
2090 if(_CheckForPendingPage(psDevInfo))
2092 IMG_UINT32 ui32CatBase;
2093 IMG_UINT32 ui32DataType;
2094 IMG_DEV_VIRTADDR sDevVAddr;
2096 PVR_DUMPDEBUG_LOG(("MMU Pending page: Yes"));
2098 _GetPendingPageInfo(psDevInfo, &sDevVAddr, &ui32CatBase, &ui32DataType);
2100 if(ui32CatBase >= 8)
2102 PVR_DUMPDEBUG_LOG(("Cannot check address on PM cat base %u", ui32CatBase));
2106 IMG_DEV_PHYADDR sPCDevPAddr;
2108 sPCDevPAddr.uiAddr = OSReadHWReg64(psDevInfo->pvRegsBaseKM, RGX_CR_BIF_CAT_BASEN(ui32CatBase));
2110 PVR_DUMPDEBUG_LOG(("Checking device virtual address " IMG_DEV_VIRTADDR_FMTSPEC
2111 " on cat base %u. PC Addr = 0x%llX",
2112 (unsigned long long) sDevVAddr.uiAddr,
2114 (unsigned long long) sPCDevPAddr.uiAddr));
2115 RGXCheckFaultAddress(psDevInfo, &sDevVAddr, &sPCDevPAddr);
2118 #endif /* NO_HARDWARE */
2121 /* Firmware state */
2122 switch (psDevInfo->psDeviceNode->eHealthStatus)
2124 case PVRSRV_DEVICE_HEALTH_STATUS_OK:
2130 case PVRSRV_DEVICE_HEALTH_STATUS_NOT_RESPONDING:
2132 pszState = "NOT RESPONDING";
2136 case PVRSRV_DEVICE_HEALTH_STATUS_DEAD:
2144 pszState = "UNKNOWN";
2149 if (psRGXFWIfTraceBuf == IMG_NULL)
2151 PVR_DUMPDEBUG_LOG(("RGX FW State: %s", pszState));
2153 /* can't dump any more information */
2157 PVR_DUMPDEBUG_LOG(("RGX FW State: %s (HWRState 0x%08x)", pszState, psRGXFWIfTraceBuf->ui32HWRStateFlags));
2158 PVR_DUMPDEBUG_LOG(("RGX FW Power State: %s (APM %s: %d ok, %d denied, %d other, %d total)",
2159 pszPowStateName[psRGXFWIfTraceBuf->ePowState],
2160 (psDevInfo->pvAPMISRData)?"enabled":"disabled",
2161 psDevInfo->ui32ActivePMReqOk,
2162 psDevInfo->ui32ActivePMReqDenied,
2163 psDevInfo->ui32ActivePMReqTotal - psDevInfo->ui32ActivePMReqOk - psDevInfo->ui32ActivePMReqDenied,
2164 psDevInfo->ui32ActivePMReqTotal));
2167 _RGXDumpFWAssert(pfnDumpDebugPrintf, psRGXFWIfTraceBuf);
2169 _RGXDumpFWPoll(pfnDumpDebugPrintf, psRGXFWIfTraceBuf);
2171 _RGXDumpFWHWRInfo(pfnDumpDebugPrintf, psRGXFWIfTraceBuf, psDevInfo);
2175 static IMG_VOID _RGXDumpMetaSPExtraDebugInfo(DUMPDEBUG_PRINTF_FUNC *pfnDumpDebugPrintf,
2176 PVRSRV_RGXDEV_INFO *psDevInfo)
2178 /* List of extra META Slave Port debug registers */
2179 #define RGX_META_SP_EXTRA_DEBUG \
2180 X(RGX_CR_META_SP_MSLVCTRL0) \
2181 X(RGX_CR_META_SP_MSLVCTRL1) \
2182 X(RGX_CR_META_SP_MSLVIRQSTATUS) \
2183 X(RGX_CR_META_SP_MSLVIRQENABLE) \
2184 X(RGX_CR_META_SP_MSLVIRQLEVEL)
2186 IMG_UINT32 ui32Idx, ui32RegIdx;
2187 IMG_UINT32 ui32RegVal;
2188 IMG_UINT32 ui32RegAddr;
2190 const IMG_UINT32 aui32DebugRegAddr [] = {
2192 RGX_META_SP_EXTRA_DEBUG
2196 const IMG_CHAR* apszDebugRegName [] = {
2198 RGX_META_SP_EXTRA_DEBUG
2202 const IMG_UINT32 aui32Debug2RegAddr [] = {0xA28, 0x0A30, 0x0A38};
2204 PVR_DUMPDEBUG_LOG(("META Slave Port extra debug:"));
2206 /* dump first set of Slave Port debug registers */
2207 for (ui32Idx = 0; ui32Idx < sizeof(aui32DebugRegAddr)/sizeof(IMG_UINT32); ui32Idx++)
2209 const IMG_CHAR* pszRegName = apszDebugRegName[ui32Idx];
2211 ui32RegAddr = aui32DebugRegAddr[ui32Idx];
2212 ui32RegVal = OSReadHWReg32(psDevInfo->pvRegsBaseKM, ui32RegAddr);
2213 PVR_DUMPDEBUG_LOG((" * %s: 0x%8.8X", pszRegName, ui32RegVal));
2216 /* dump second set of Slave Port debug registers */
2217 for (ui32Idx = 0; ui32Idx < 4; ui32Idx++)
2219 OSWriteHWReg32(psDevInfo->pvRegsBaseKM, 0xA20, ui32Idx);
2220 ui32RegVal = OSReadHWReg32(psDevInfo->pvRegsBaseKM, 0xA20);
2221 PVR_DUMPDEBUG_LOG((" * 0xA20[%d]: 0x%8.8X", ui32Idx, ui32RegVal));
2225 for (ui32RegIdx = 0; ui32RegIdx < sizeof(aui32Debug2RegAddr)/sizeof(IMG_UINT32); ui32RegIdx++)
2227 ui32RegAddr = aui32Debug2RegAddr[ui32RegIdx];
2228 for (ui32Idx = 0; ui32Idx < 2; ui32Idx++)
2230 OSWriteHWReg32(psDevInfo->pvRegsBaseKM, ui32RegAddr, ui32Idx);
2231 ui32RegVal = OSReadHWReg32(psDevInfo->pvRegsBaseKM, ui32RegAddr);
2232 PVR_DUMPDEBUG_LOG((" * 0x%X[%d]: 0x%8.8X", ui32RegAddr, ui32Idx, ui32RegVal));
2241 IMG_VOID RGXDumpDebugInfo(DUMPDEBUG_PRINTF_FUNC *pfnDumpDebugPrintf,
2242 PVRSRV_RGXDEV_INFO *psDevInfo)
2246 for(i=0;i<=DEBUG_REQUEST_VERBOSITY_MAX;i++)
2248 RGXDebugRequestProcess(pfnDumpDebugPrintf, psDevInfo, i);
2253 #if defined(PVRSRV_ENABLE_FW_TRACE_DEBUGFS)
2255 * Array of all the Firmware Trace log IDs used to convert the trace data.
2257 typedef struct _TRACEBUF_LOG_ {
2258 RGXFW_LOG_SFids eSFId;
2261 IMG_UINT32 ui32ArgNum;
2264 TRACEBUF_LOG aLogDefinitions[] = {
2265 #define X(a, b, c, d, e) {RGXFW_LOG_CREATESFID(a,b,e), #c, d, e},
2270 #define NARGS_MASK ~(0xF<<16)
2271 static IMG_BOOL _FirmwareTraceIntegrityCheck(DUMPDEBUG_PRINTF_FUNC *pfnDumpDebugPrintf)
2273 TRACEBUF_LOG *psLogDef = &aLogDefinitions[0];
2274 IMG_BOOL bIntegrityOk = IMG_TRUE;
2277 * For every log ID, check the format string and number of arguments is valid.
2279 while (psLogDef->eSFId != RGXFW_SF_LAST)
2281 IMG_UINT32 ui32Count;
2282 IMG_CHAR *pszString;
2283 TRACEBUF_LOG *psLogDef2;
2286 * Check the number of arguments matches the number of '%' in the string and
2287 * check that no string uses %s which is not supported as it requires a
2288 * pointer to memory that is not going to be valid.
2290 pszString = psLogDef->pszFmt;
2293 while (*pszString != '\0')
2295 if (*pszString++ == '%')
2298 if (*pszString == 's')
2300 bIntegrityOk = IMG_FALSE;
2301 PVR_DUMPDEBUG_LOG(("Integrity Check FAIL: %s has an unsupported type not recognized (fmt: %%%c). Please fix.",
2302 psLogDef->pszName, *pszString));
2304 else if (*pszString == '%')
2306 /* Double % is a printable % sign and not a format string... */
2312 if (ui32Count != psLogDef->ui32ArgNum)
2314 bIntegrityOk = IMG_FALSE;
2315 PVR_DUMPDEBUG_LOG(("Integrity Check FAIL: %s has %d arguments but only %d are specified. Please fix.",
2316 psLogDef->pszName, ui32Count, psLogDef->ui32ArgNum));
2319 /* RGXDumpFirmwareTrace() has a hardcoded limit of supporting up to 20 arguments... */
2322 bIntegrityOk = IMG_FALSE;
2323 PVR_DUMPDEBUG_LOG(("Integrity Check FAIL: %s has %d arguments but a maximum of 20 are supported. Please fix.",
2324 psLogDef->pszName, ui32Count));
2327 /* Check the id number is unique (don't take into account the number of arguments) */
2329 psLogDef2 = &aLogDefinitions[0];
2331 while (psLogDef2->eSFId != RGXFW_SF_LAST)
2333 if ((psLogDef->eSFId & NARGS_MASK) == (psLogDef2->eSFId & NARGS_MASK))
2342 bIntegrityOk = IMG_FALSE;
2343 PVR_DUMPDEBUG_LOG(("Integrity Check FAIL: %s id %x is not unique, there are %d more. Please fix.",
2344 psLogDef->pszName, psLogDef->eSFId, ui32Count - 1));
2347 /* Move to the next log ID... */
2351 return bIntegrityOk;
2354 IMG_VOID RGXDumpFirmwareTrace(DUMPDEBUG_PRINTF_FUNC *pfnDumpDebugPrintf,
2355 PVRSRV_RGXDEV_INFO *psDevInfo)
2357 RGXFWIF_TRACEBUF *psRGXFWIfTraceBufCtl = psDevInfo->psRGXFWIfTraceBuf;
2358 static IMG_BOOL bIntegrityCheckPassed = IMG_FALSE;
2360 /* Check that the firmware trace is correctly defined... */
2361 if (!bIntegrityCheckPassed)
2363 bIntegrityCheckPassed = _FirmwareTraceIntegrityCheck(pfnDumpDebugPrintf);
2364 if (!bIntegrityCheckPassed)
2370 /* Dump FW trace information... */
2371 if (psRGXFWIfTraceBufCtl != IMG_NULL)
2373 IMG_CHAR szBuffer[PVR_MAX_DEBUG_MESSAGE_LEN];
2376 /* Print the log type settings... */
2377 if (psRGXFWIfTraceBufCtl->ui32LogType & RGXFWIF_LOG_TYPE_GROUP_MASK)
2379 PVR_DUMPDEBUG_LOG(("Debug log type: %s ( " RGXFWIF_LOG_ENABLED_GROUPS_LIST_PFSPEC ")",
2380 ((psRGXFWIfTraceBufCtl->ui32LogType & RGXFWIF_LOG_TYPE_TRACE)?("trace"):("tbi")),
2381 RGXFWIF_LOG_ENABLED_GROUPS_LIST(psRGXFWIfTraceBufCtl->ui32LogType)
2386 PVR_DUMPDEBUG_LOG(("Debug log type: none"));
2389 /* Print the decoded log for each thread... */
2390 for (tid = 0; tid < RGXFW_THREAD_NUM; tid++)
2392 IMG_UINT32 *ui32TraceBuf = psRGXFWIfTraceBufCtl->sTraceBuf[tid].aui32TraceBuffer;
2393 IMG_UINT32 ui32TracePtr = psRGXFWIfTraceBufCtl->sTraceBuf[tid].ui32TracePointer;
2394 IMG_UINT32 ui32Count = 0;
2396 while (ui32Count < RGXFW_TRACE_BUFFER_SIZE)
2398 IMG_UINT32 ui32Data, ui32DataToId;
2400 /* Find the first valid log ID, skipping whitespace... */
2403 ui32Data = ui32TraceBuf[ui32TracePtr];
2404 ui32DataToId = idToStringID(ui32Data);
2406 /* If an unrecognized id is found check if it is valid, if it is tracebuf needs updating. */
2407 if (ui32DataToId == RGXFW_SF_LAST && RGXFW_LOG_VALIDID(ui32Data))
2409 PVR_DUMPDEBUG_LOG(("ERROR: Unrecognized id (%x). From here on the trace might be wrong!", ui32Data));
2413 /* Update the trace pointer... */
2414 ui32TracePtr = (ui32TracePtr + 1) % RGXFW_TRACE_BUFFER_SIZE;
2416 } while ((RGXFW_SF_LAST == ui32DataToId || ui32DataToId >= RGXFW_SF_FIRST) &&
2417 ui32Count < RGXFW_TRACE_BUFFER_SIZE);
2419 if (ui32Count < RGXFW_TRACE_BUFFER_SIZE)
2421 IMG_UINT64 ui64RGXTimer;
2423 /* If we hit the ASSERT message then this is the end of the log... */
2424 if (ui32Data == RGXFW_SF_MAIN_ASSERT_FAILED)
2426 PVR_DUMPDEBUG_LOG(("ASSERTION %s failed at %s:%u",
2427 psRGXFWIfTraceBufCtl->sTraceBuf[tid].sAssertBuf.szInfo,
2428 psRGXFWIfTraceBufCtl->sTraceBuf[tid].sAssertBuf.szPath,
2429 psRGXFWIfTraceBufCtl->sTraceBuf[tid].sAssertBuf.ui32LineNum));
2434 * Print the trace string and provide up to 20 arguments which
2435 * printf function will be able to use. We have already checked
2436 * that no string uses more than this.
2438 OSStringCopy(szBuffer, "%llu:T%u-%s> ");
2439 OSStringCopy(&szBuffer[OSStringLength(szBuffer)], SFs[ui32DataToId].name);
2440 szBuffer[OSStringLength(szBuffer)-1] = '\0';
2441 ui64RGXTimer = (IMG_UINT64)(ui32TraceBuf[(ui32TracePtr + 0) % RGXFW_TRACE_BUFFER_SIZE]) << 32 |
2442 (IMG_UINT64)(ui32TraceBuf[(ui32TracePtr + 1) % RGXFW_TRACE_BUFFER_SIZE]);
2443 PVR_DUMPDEBUG_LOG((szBuffer, ui64RGXTimer, tid, groups[RGXFW_SF_GID(ui32Data)],
2444 ui32TraceBuf[(ui32TracePtr + 2) % RGXFW_TRACE_BUFFER_SIZE],
2445 ui32TraceBuf[(ui32TracePtr + 3) % RGXFW_TRACE_BUFFER_SIZE],
2446 ui32TraceBuf[(ui32TracePtr + 4) % RGXFW_TRACE_BUFFER_SIZE],
2447 ui32TraceBuf[(ui32TracePtr + 5) % RGXFW_TRACE_BUFFER_SIZE],
2448 ui32TraceBuf[(ui32TracePtr + 6) % RGXFW_TRACE_BUFFER_SIZE],
2449 ui32TraceBuf[(ui32TracePtr + 7) % RGXFW_TRACE_BUFFER_SIZE],
2450 ui32TraceBuf[(ui32TracePtr + 8) % RGXFW_TRACE_BUFFER_SIZE],
2451 ui32TraceBuf[(ui32TracePtr + 9) % RGXFW_TRACE_BUFFER_SIZE],
2452 ui32TraceBuf[(ui32TracePtr + 10) % RGXFW_TRACE_BUFFER_SIZE],
2453 ui32TraceBuf[(ui32TracePtr + 11) % RGXFW_TRACE_BUFFER_SIZE],
2454 ui32TraceBuf[(ui32TracePtr + 12) % RGXFW_TRACE_BUFFER_SIZE],
2455 ui32TraceBuf[(ui32TracePtr + 13) % RGXFW_TRACE_BUFFER_SIZE],
2456 ui32TraceBuf[(ui32TracePtr + 14) % RGXFW_TRACE_BUFFER_SIZE],
2457 ui32TraceBuf[(ui32TracePtr + 15) % RGXFW_TRACE_BUFFER_SIZE],
2458 ui32TraceBuf[(ui32TracePtr + 16) % RGXFW_TRACE_BUFFER_SIZE],
2459 ui32TraceBuf[(ui32TracePtr + 17) % RGXFW_TRACE_BUFFER_SIZE],
2460 ui32TraceBuf[(ui32TracePtr + 18) % RGXFW_TRACE_BUFFER_SIZE],
2461 ui32TraceBuf[(ui32TracePtr + 19) % RGXFW_TRACE_BUFFER_SIZE],
2462 ui32TraceBuf[(ui32TracePtr + 20) % RGXFW_TRACE_BUFFER_SIZE],
2463 ui32TraceBuf[(ui32TracePtr + 21) % RGXFW_TRACE_BUFFER_SIZE]));
2465 /* Update the trace pointer... */
2466 ui32TracePtr = (ui32TracePtr + 2 + RGXFW_SF_PARAMNUM(ui32Data)) % RGXFW_TRACE_BUFFER_SIZE;
2467 ui32Count = (ui32Count + 2 + RGXFW_SF_PARAMNUM(ui32Data));
2476 static IMG_CHAR* _RGXGetDebugDevPowerStateString(PVRSRV_DEV_POWER_STATE ePowerState)
2480 case PVRSRV_DEV_POWER_STATE_DEFAULT: return "DEFAULT";
2481 case PVRSRV_DEV_POWER_STATE_OFF: return "OFF";
2482 case PVRSRV_DEV_POWER_STATE_ON: return "ON";
2483 default: return "UNKNOWN";
2487 IMG_VOID RGXDebugRequestProcess(DUMPDEBUG_PRINTF_FUNC *pfnDumpDebugPrintf,
2488 PVRSRV_RGXDEV_INFO *psDevInfo,
2489 IMG_UINT32 ui32VerbLevel)
2491 PVRSRV_ERROR eError = PVRSRVPowerLock();
2492 if (eError != PVRSRV_OK)
2494 PVR_DPF((PVR_DBG_ERROR, "RGXDebugRequestProcess : failed to acquire lock, error:0x%x", eError));
2498 switch (ui32VerbLevel)
2500 case DEBUG_REQUEST_VERBOSITY_LOW :
2502 IMG_UINT32 ui32DeviceIndex;
2503 PVRSRV_DEV_POWER_STATE ePowerState;
2504 IMG_BOOL bRGXPoweredON;
2506 ui32DeviceIndex = psDevInfo->psDeviceNode->sDevId.ui32DeviceIndex;
2508 eError = PVRSRVGetDevicePowerState(ui32DeviceIndex, &ePowerState);
2509 if (eError != PVRSRV_OK)
2511 PVR_DPF((PVR_DBG_ERROR, "RGXDebugRequestProcess: Error retrieving RGX power state. No debug info dumped."));
2515 bRGXPoweredON = (ePowerState == PVRSRV_DEV_POWER_STATE_ON);
2517 PVR_DUMPDEBUG_LOG(("------[ RGX summary ]------"));
2518 PVR_DUMPDEBUG_LOG(("RGX BVNC: %s", RGX_BVNC_KM));
2519 PVR_DUMPDEBUG_LOG(("RGX Power State: %s", _RGXGetDebugDevPowerStateString(ePowerState)));
2521 _RGXDumpRGXDebugSummary(pfnDumpDebugPrintf, psDevInfo, bRGXPoweredON);
2526 PVR_DUMPDEBUG_LOG(("------[ RGX registers ]------"));
2527 PVR_DUMPDEBUG_LOG(("RGX Register Base Address (Linear): 0x%p", psDevInfo->pvRegsBaseKM));
2528 PVR_DUMPDEBUG_LOG(("RGX Register Base Address (Physical): 0x%08lX", (unsigned long)psDevInfo->sRegsPhysBase.uiAddr));
2530 /* Forcing bit 6 of MslvCtrl1 to 0 to avoid internal reg read going though the core */
2531 OSWriteHWReg32(psDevInfo->pvRegsBaseKM, RGX_CR_META_SP_MSLVCTRL1, 0x0);
2533 eError = RGXRunScript(psDevInfo, psDevInfo->psScripts->asDbgCommands, RGX_MAX_INIT_COMMANDS, PDUMP_FLAGS_CONTINUOUS, pfnDumpDebugPrintf);
2534 if (eError != PVRSRV_OK)
2536 PVR_DPF((PVR_DBG_WARNING,"RGXDebugRequestProcess: RGXRunScript failed (%d) - Retry", eError));
2538 /* use thread1 for slave port accesses */
2539 OSWriteHWReg32(psDevInfo->pvRegsBaseKM, RGX_CR_META_SP_MSLVCTRL1, 0x1 << RGX_CR_META_SP_MSLVCTRL1_THREAD_SHIFT);
2541 eError = RGXRunScript(psDevInfo, psDevInfo->psScripts->asDbgCommands, RGX_MAX_INIT_COMMANDS, PDUMP_FLAGS_CONTINUOUS, pfnDumpDebugPrintf);
2542 if (eError != PVRSRV_OK)
2544 PVR_DPF((PVR_DBG_ERROR,"RGXDebugRequestProcess: RGXRunScript retry failed (%d) - Dump Slave Port debug information", eError));
2545 _RGXDumpMetaSPExtraDebugInfo(pfnDumpDebugPrintf, psDevInfo);
2548 /* use thread0 again */
2549 OSWriteHWReg32(psDevInfo->pvRegsBaseKM, RGX_CR_META_SP_MSLVCTRL1, 0x0 << RGX_CR_META_SP_MSLVCTRL1_THREAD_SHIFT);
2554 PVR_DUMPDEBUG_LOG((" (!) RGX power is down. No registers dumped"));
2558 RGXFWIF_DM eKCCBType;
2561 Dump out the kernel CCBs.
2563 for (eKCCBType = 0; eKCCBType < RGXFWIF_DM_MAX; eKCCBType++)
2565 RGXFWIF_CCB_CTL *psKCCBCtl = psDevInfo->apsKernelCCBCtl[eKCCBType];
2567 if (psKCCBCtl != IMG_NULL)
2569 PVR_DUMPDEBUG_LOG(("RGX Kernel CCB %u WO:0x%X RO:0x%X",
2570 eKCCBType, psKCCBCtl->ui32WriteOffset, psKCCBCtl->ui32ReadOffset));
2575 /* Dump the KCCB commands executed */
2577 PVR_DUMPDEBUG_LOG(("RGX Kernel CCB commands executed = %d",
2578 psDevInfo->psRGXFWIfTraceBuf->ui32KCCBCmdsExecuted));
2581 /* Dump the IRQ info */
2583 PVR_DUMPDEBUG_LOG(("RGX FW IRQ count = %d, last sampled in MISR = %d",
2584 psDevInfo->psRGXFWIfTraceBuf->ui32InterruptCount,
2585 g_ui32HostSampleIRQCount));
2588 /* Dump the FW config flags */
2590 RGXFWIF_INIT *psRGXFWInit;
2592 eError = DevmemAcquireCpuVirtAddr(psDevInfo->psRGXFWIfInitMemDesc,
2593 (IMG_VOID **)&psRGXFWInit);
2595 if (eError != PVRSRV_OK)
2597 PVR_DPF((PVR_DBG_ERROR,"RGXDebugRequestProcess: Failed to acquire kernel fw if ctl (%u)",
2602 PVR_DUMPDEBUG_LOG(("RGX FW config flags = 0x%X", psRGXFWInit->ui32ConfigFlags));
2604 DevmemReleaseCpuVirtAddr(psDevInfo->psRGXFWIfInitMemDesc);
2610 case DEBUG_REQUEST_VERBOSITY_MEDIUM :
2613 /* Dump FW trace information */
2614 if (psDevInfo->psRGXFWIfTraceBuf != IMG_NULL)
2616 RGXFWIF_TRACEBUF *psRGXFWIfTraceBufCtl = psDevInfo->psRGXFWIfTraceBuf;
2618 for ( tid = 0 ; tid < RGXFW_THREAD_NUM ; tid++)
2621 IMG_BOOL bPrevLineWasZero = IMG_FALSE;
2622 IMG_BOOL bLineIsAllZeros = IMG_FALSE;
2623 IMG_UINT32 ui32CountLines = 0;
2624 IMG_UINT32 *pui32TraceBuffer;
2627 pui32TraceBuffer = &psRGXFWIfTraceBufCtl->sTraceBuf[tid].aui32TraceBuffer[0];
2629 /* each element in the line is 8 characters plus a space. The '+1' is because of the final trailing '\0'. */
2630 pszLine = OSAllocMem(9*RGXFW_TRACE_BUFFER_LINESIZE+1);
2631 if (pszLine == IMG_NULL)
2633 PVR_DPF((PVR_DBG_ERROR,"RGXDebugRequestProcess: Out of mem allocating line string (size: %d)", 9*RGXFW_TRACE_BUFFER_LINESIZE));
2637 /* Print the tracepointer */
2638 if (psRGXFWIfTraceBufCtl->ui32LogType & RGXFWIF_LOG_TYPE_GROUP_MASK)
2640 PVR_DUMPDEBUG_LOG(("Debug log type: %s ( " RGXFWIF_LOG_ENABLED_GROUPS_LIST_PFSPEC ")",
2641 ((psRGXFWIfTraceBufCtl->ui32LogType & RGXFWIF_LOG_TYPE_TRACE)?("trace"):("tbi")),
2642 RGXFWIF_LOG_ENABLED_GROUPS_LIST(psRGXFWIfTraceBufCtl->ui32LogType)
2647 PVR_DUMPDEBUG_LOG(("Debug log type: none"));
2650 PVR_DUMPDEBUG_LOG(("------[ RGX FW thread %d trace START ]------", tid));
2651 PVR_DUMPDEBUG_LOG(("FWT[traceptr]: %X", psRGXFWIfTraceBufCtl->sTraceBuf[tid].ui32TracePointer));
2652 PVR_DUMPDEBUG_LOG(("FWT[tracebufsize]: %X", RGXFW_TRACE_BUFFER_SIZE));
2654 for (i = 0; i < RGXFW_TRACE_BUFFER_SIZE; i += RGXFW_TRACE_BUFFER_LINESIZE)
2657 IMG_UINT32 ui32Line = 0x0;
2658 IMG_UINT32 ui32LineOffset = i*sizeof(IMG_UINT32);
2659 IMG_CHAR *pszBuf = pszLine;
2661 for (k = 0; k < RGXFW_TRACE_BUFFER_LINESIZE; k++)
2663 ui32Line |= pui32TraceBuffer[i + k];
2665 /* prepare the line to print it. The '+1' is because of the trailing '\0' added */
2666 OSSNPrintf(pszBuf, 9 + 1, " %08x", pui32TraceBuffer[i + k]);
2667 pszBuf += 9; /* write over the '\0' */
2670 bLineIsAllZeros = (ui32Line == 0x0);
2672 if (bLineIsAllZeros && bPrevLineWasZero)
2676 else if (bLineIsAllZeros && !bPrevLineWasZero)
2678 bPrevLineWasZero = IMG_TRUE;
2680 PVR_DUMPDEBUG_LOG(("FWT[%08x]: 00000000 ... 00000000", ui32LineOffset));
2684 if (bPrevLineWasZero)
2686 PVR_DUMPDEBUG_LOG(("FWT[%08x]: %d lines were all zero", ui32LineOffset, ui32CountLines));
2691 PVR_DUMPDEBUG_LOG(("FWT[%08x]:%s", ui32LineOffset, pszLine));
2693 bPrevLineWasZero = IMG_FALSE;
2697 if (bPrevLineWasZero)
2699 PVR_DUMPDEBUG_LOG(("FWT[END]: %d lines were all zero", ui32CountLines));
2702 PVR_DUMPDEBUG_LOG(("------[ RGX FW thread %d trace END ]------", tid));
2709 PVR_DUMPDEBUG_LOG(("------[ Stalled FWCtxs ]------"));
2711 CheckForStalledTransferCtxt(psDevInfo, pfnDumpDebugPrintf);
2712 CheckForStalledRenderCtxt(psDevInfo, pfnDumpDebugPrintf);
2713 #if !defined(UNDER_WDDM)
2714 CheckForStalledComputeCtxt(psDevInfo, pfnDumpDebugPrintf);
2716 #if defined(RGX_FEATURE_RAY_TRACING)
2717 CheckForStalledRayCtxt(psDevInfo, pfnDumpDebugPrintf);
2722 case DEBUG_REQUEST_VERBOSITY_HIGH:
2724 PVRSRV_ERROR eError;
2725 IMG_UINT32 ui32DeviceIndex;
2726 PVRSRV_DEV_POWER_STATE ePowerState;
2727 IMG_BOOL bRGXPoweredON;
2729 ui32DeviceIndex = psDevInfo->psDeviceNode->sDevId.ui32DeviceIndex;
2731 eError = PVRSRVGetDevicePowerState(ui32DeviceIndex, &ePowerState);
2732 if (eError != PVRSRV_OK)
2734 PVR_DPF((PVR_DBG_ERROR, "RGXDebugRequestProcess: Error retrieving RGX power state. No debug info dumped."));
2738 bRGXPoweredON = (ePowerState == PVRSRV_DEV_POWER_STATE_ON);
2740 PVR_DUMPDEBUG_LOG(("------[ Debug bus ]------"));
2742 _RGXDumpRGXDebugSummary(pfnDumpDebugPrintf, psDevInfo, bRGXPoweredON);
2746 eError = RGXRunScript(psDevInfo, psDevInfo->psScripts->asDbgBusCommands, RGX_MAX_DBGBUS_COMMANDS, PDUMP_FLAGS_CONTINUOUS, pfnDumpDebugPrintf);
2747 if (eError != PVRSRV_OK)
2749 PVR_DPF((PVR_DBG_WARNING,"RGXDebugRequestProcess: RGXRunScript failed (%s)", PVRSRVGetErrorStringKM(eError)));
2759 PVRSRVPowerUnlock();
2765 IMG_VOID RGXPanic(PVRSRV_RGXDEV_INFO *psDevInfo)
2767 PVR_LOG(("RGX panic"));
2768 PVRSRVDebugRequest(DEBUG_REQUEST_VERBOSITY_MAX, IMG_NULL);
2775 PVRSRV_ERROR RGXQueryDMState(PVRSRV_RGXDEV_INFO *psDevInfo, RGXFWIF_DM eDM, RGXFWIF_DM_STATE *peState, RGXFWIF_DEV_VIRTADDR *psCommonContextDevVAddr)
2777 PVRSRV_ERROR eError = PVRSRV_OK;
2778 RGXFWIF_TRACEBUF *psRGXFWIfTraceBufCtl = psDevInfo->psRGXFWIfTraceBuf;
2780 if (eDM >= RGXFWIF_DM_MAX)
2782 eError = PVRSRV_ERROR_INVALID_PARAMS;
2783 PVR_DPF((PVR_DBG_ERROR,"RGXQueryDMState: eDM parameter is out of range (%u)",eError));
2787 if (peState == IMG_NULL)
2789 eError = PVRSRV_ERROR_INVALID_PARAMS;
2790 PVR_DPF((PVR_DBG_ERROR,"RGXQueryDMState: peState is NULL (%u)",eError));
2794 if (psCommonContextDevVAddr == IMG_NULL)
2796 eError = PVRSRV_ERROR_INVALID_PARAMS;
2797 PVR_DPF((PVR_DBG_ERROR,"RGXQueryDMState: psCommonContextDevVAddr is NULL (%u)",eError));
2801 if (eError != PVRSRV_OK)
2803 PVR_DPF((PVR_DBG_ERROR,"RGXQueryDMState: Failed (%d) to acquire address for trace buffer", eError));
2807 if (psRGXFWIfTraceBufCtl->apsHwrDmFWCommonContext[eDM].ui32Addr)
2809 *peState = RGXFWIF_DM_STATE_LOCKEDUP;
2813 *peState = RGXFWIF_DM_STATE_NORMAL;
2816 *psCommonContextDevVAddr = psRGXFWIfTraceBufCtl->apsHwrDmFWCommonContext[eDM];
2822 /******************************************************************************
2823 End of file (rgxdebug.c)
2824 ******************************************************************************/