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"
63 #include "devicemem_pdump.h"
68 #if defined(PVRSRV_ENABLE_FW_TRACE_DEBUGFS)
69 #include "rgx_fwif_sf.h"
70 #include "rgxfw_log_helper.h"
74 #include "rgxcompute.h"
75 #include "rgxtransfer.h"
76 #if defined(RGX_FEATURE_RAY_TRACING)
81 #define RGX_DEBUG_STR_SIZE (150)
83 #define RGX_CR_BIF_CAT_BASE0 (0x1200U)
84 #define RGX_CR_BIF_CAT_BASE1 (0x1208U)
86 #define RGX_CR_BIF_CAT_BASEN(n) \
87 RGX_CR_BIF_CAT_BASE0 + \
88 ((RGX_CR_BIF_CAT_BASE1 - RGX_CR_BIF_CAT_BASE0) * n)
91 #define RGXDBG_BIF_IDS \
96 #define RGXDBG_SIDEBAND_TYPES \
118 #define X(NAME) RGXDBG_##NAME,
125 #define X(NAME) RGXDBG_##NAME,
126 RGXDBG_SIDEBAND_TYPES
128 } RGXDBG_SIDEBAND_TYPE;
131 IMG_CHAR* pszPowStateName [] = {
132 #define X(NAME) #NAME,
137 IMG_CHAR* pszBIFNames [] = {
138 #define X(NAME) #NAME,
143 extern IMG_UINT32 g_ui32HostSampleIRQCount;
146 #if !defined(RGX_FEATURE_S7_TOP_INFRASTRUCTURE)
148 *******************************************************************************
150 @Function _RGXDecodePMPC
154 Return the name for the PM managed Page Catalogues
156 @Input ui32PC - Page Catalogue number
160 ******************************************************************************/
161 static IMG_CHAR* _RGXDecodePMPC(IMG_UINT32 ui32PC)
163 IMG_CHAR* pszPMPC = " (-)";
167 case 0x8: pszPMPC = " (PM-VCE0)"; break;
168 case 0x9: pszPMPC = " (PM-TE0)"; break;
169 case 0xA: pszPMPC = " (PM-ZLS0)"; break;
170 case 0xB: pszPMPC = " (PM-ALIST0)"; break;
171 case 0xC: pszPMPC = " (PM-VCE1)"; break;
172 case 0xD: pszPMPC = " (PM-TE1)"; break;
173 case 0xE: pszPMPC = " (PM-ZLS1)"; break;
174 case 0xF: pszPMPC = " (PM-ALIST1)"; break;
181 *******************************************************************************
183 @Function _RGXDecodeBIFReqTags
187 Decode the BIF Tag ID and sideband data fields from BIF_FAULT_BANK_REQ_STATUS regs
189 @Input eBankID - BIF identifier
190 @Input ui32TagID - Tag ID value
191 @Input ui32TagSB - Tag Sideband data
192 @Output ppszTagID - Decoded string from the Tag ID
193 @Output ppszTagSB - Decoded string from the Tag SB
194 @Output pszScratchBuf - Buffer provided to the function to generate the debug strings
195 @Input ui32ScratchBufSize - Size of the provided buffer
199 ******************************************************************************/
200 static IMG_VOID _RGXDecodeBIFReqTags(RGXDBG_BIF_ID eBankID,
201 IMG_UINT32 ui32TagID,
202 IMG_UINT32 ui32TagSB,
203 IMG_CHAR **ppszTagID,
204 IMG_CHAR **ppszTagSB,
205 IMG_CHAR *pszScratchBuf,
206 IMG_UINT32 ui32ScratchBufSize)
208 /* default to unknown */
209 IMG_CHAR *pszTagID = "-";
210 IMG_CHAR *pszTagSB = "-";
212 PVR_ASSERT(ppszTagID != IMG_NULL);
213 PVR_ASSERT(ppszTagSB != IMG_NULL);
222 case 0x0: pszTagSB = "Table"; break;
223 case 0x1: pszTagSB = "Directory"; break;
224 case 0x2: pszTagSB = "Catalogue"; break;
233 case 0x0: pszTagSB = "Pixel data"; break;
234 case 0x1: pszTagSB = "Command stream data"; break;
235 case 0x2: pszTagSB = "Fence or flush"; break;
249 case 0x0: pszTagSB = "DCache - Thread 0"; break;
250 case 0x1: pszTagSB = "ICache - Thread 0"; break;
251 case 0x2: pszTagSB = "JTag - Thread 0"; break;
252 case 0x3: pszTagSB = "Slave bus - Thread 0"; break;
253 case 0x4: pszTagSB = "DCache - Thread "; break;
254 case 0x5: pszTagSB = "ICache - Thread 1"; break;
255 case 0x6: pszTagSB = "JTag - Thread 1"; break;
256 case 0x7: pszTagSB = "Slave bus - Thread 1"; break;
263 OSSNPrintf(pszScratchBuf, ui32ScratchBufSize,
264 "Cache line %d", (ui32TagSB & 0x3f));
265 pszTagSB = pszScratchBuf;
278 case 0x00: pszTagSB = "ZLS"; break;
279 case 0x20: pszTagSB = "Occlusion Query"; break;
285 #if defined(RGX_FEATURE_XT_TOP_INFRASTRUCTURE)
286 if (eBankID == RGXDBG_TEXAS_BIF)
291 case 0x0: pszTagSB = "CPF"; break;
292 case 0x1: pszTagSB = "DBSC"; break;
296 case 0x8: pszTagSB = "Control Stream"; break;
300 case 0x9: pszTagSB = "Primitive Block"; break;
308 case 0x0: pszTagSB = "Macrotile Header"; break;
309 case 0x1: pszTagSB = "Region Header"; break;
316 case 0x0: pszTagSB = "Macrotile Header"; break;
317 case 0x1: pszTagSB = "Region Header"; break;
318 case 0x2: pszTagSB = "DBSC"; break;
319 case 0x3: pszTagSB = "CPF"; break;
322 case 0x8: pszTagSB = "Control Stream"; break;
325 case 0x9: pszTagSB = "Primitive Block"; break;
335 case 0x0: pszTagSB = "Control Stream"; break;
336 case 0x1: pszTagSB = "Indirect Data"; break;
337 case 0x2: pszTagSB = "Event Write"; break;
338 case 0x3: pszTagSB = "Context State"; break;
347 case 0x0: pszTagSB = "Control Stream"; break;
348 case 0x1: pszTagSB = "PPP State"; break;
349 case 0x2: pszTagSB = "Index Data"; break;
350 case 0x4: pszTagSB = "Call Stack"; break;
351 case 0x8: pszTagSB = "Context State"; break;
360 case 0x0: pszTagSB = "PMA_TAFSTACK"; break;
361 case 0x1: pszTagSB = "PMA_TAMLIST"; break;
362 case 0x2: pszTagSB = "PMA_3DFSTACK"; break;
363 case 0x3: pszTagSB = "PMA_3DMLIST"; break;
364 case 0x4: pszTagSB = "PMA_PMCTX0"; break;
365 case 0x5: pszTagSB = "PMA_PMCTX1"; break;
366 case 0x6: pszTagSB = "PMA_MAVP"; break;
367 case 0x7: pszTagSB = "PMA_UFSTACK"; break;
368 case 0x8: pszTagSB = "PMD_TAFSTACK"; break;
369 case 0x9: pszTagSB = "PMD_TAMLIST"; break;
370 case 0xA: pszTagSB = "PMD_3DFSTACK"; break;
371 case 0xB: pszTagSB = "PMD_3DMLIST"; break;
372 case 0xC: pszTagSB = "PMD_PMCTX0"; break;
373 case 0xD: pszTagSB = "PMD_PMCTX1"; break;
374 case 0xF: pszTagSB = "PMD_UFSTACK"; break;
375 case 0x10: pszTagSB = "PMA_TAMMUSTACK"; break;
376 case 0x11: pszTagSB = "PMA_3DMMUSTACK"; break;
377 case 0x12: pszTagSB = "PMD_TAMMUSTACK"; break;
378 case 0x13: pszTagSB = "PMD_3DMMUSTACK"; break;
379 case 0x14: pszTagSB = "PMA_TAUFSTACK"; break;
380 case 0x15: pszTagSB = "PMA_3DUFSTACK"; break;
381 case 0x16: pszTagSB = "PMD_TAUFSTACK"; break;
382 case 0x17: pszTagSB = "PMD_3DUFSTACK"; break;
383 case 0x18: pszTagSB = "PMA_TAVFP"; break;
384 case 0x19: pszTagSB = "PMD_3DVFP"; break;
385 case 0x1A: pszTagSB = "PMD_TAVFP"; break;
394 case 0x1: pszTagSB = "VCE"; break;
395 case 0x2: pszTagSB = "TPC"; break;
396 case 0x3: pszTagSB = "TE Control Stream"; break;
397 case 0x4: pszTagSB = "TE Region Header"; break;
398 case 0x5: pszTagSB = "TE Render Target Cache"; break;
399 case 0x6: pszTagSB = "TEAC Render Target Cache"; break;
400 case 0x7: pszTagSB = "VCE Render Target Cache"; break;
401 case 0x8: pszTagSB = "PPP Context State"; break;
410 case 0x0: pszTagSB = "TPF0: Primitive Block"; break;
411 case 0x1: pszTagSB = "TPF0: Depth Bias"; break;
412 case 0x2: pszTagSB = "TPF0: Per Primitive IDs"; break;
413 case 0x3: pszTagSB = "CPF - Tables"; break;
414 case 0x4: pszTagSB = "TPF1: Primitive Block"; break;
415 case 0x5: pszTagSB = "TPF1: Depth Bias"; break;
416 case 0x6: pszTagSB = "TPF1: Per Primitive IDs"; break;
417 case 0x7: pszTagSB = "CPF - Data: Pipe 0"; break;
418 case 0x8: pszTagSB = "TPF2: Primitive Block"; break;
419 case 0x9: pszTagSB = "TPF2: Depth Bias"; break;
420 case 0xA: pszTagSB = "TPF2: Per Primitive IDs"; break;
421 case 0xB: pszTagSB = "CPF - Data: Pipe 1"; break;
422 case 0xC: pszTagSB = "TPF3: Primitive Block"; break;
423 case 0xD: pszTagSB = "TPF3: Depth Bias"; break;
424 case 0xE: pszTagSB = "TPF3: Per Primitive IDs"; break;
425 case 0xF: pszTagSB = "CPF - Data: Pipe 2"; break;
438 IMG_UINT32 ui32Burst = (ui32TagSB >> 5) & 0x7;
439 IMG_UINT32 ui32GroupEnc = (ui32TagSB >> 2) & 0x7;
440 IMG_UINT32 ui32Group = ui32TagSB & 0x3;
442 IMG_CHAR* pszBurst = "";
443 IMG_CHAR* pszGroupEnc = "";
444 IMG_CHAR* pszGroup = "";
449 case 0x1: pszBurst = "128bit word within the Lower 256bits"; break;
451 case 0x3: pszBurst = "128bit word within the Upper 256bits"; break;
452 case 0x4: pszBurst = "Lower 256bits"; break;
453 case 0x5: pszBurst = "Upper 256bits"; break;
454 case 0x6: pszBurst = "512 bits"; break;
456 switch (ui32GroupEnc)
458 #if defined(RGX_FEATURE_XT_TOP_INFRASTRUCTURE)
459 case 0x0: pszGroupEnc = "PDS_REQ"; break;
460 case 0x1: pszGroupEnc = "USC_REQ"; break;
461 case 0x2: pszGroupEnc = "MADD_REQ"; break;
462 case 0x3: pszGroupEnc = "USCB_USC"; break;
464 case 0x0: pszGroupEnc = "TPUA_USC"; break;
465 case 0x1: pszGroupEnc = "TPUB_USC"; break;
466 case 0x2: pszGroupEnc = "USCA_USC"; break;
467 case 0x3: pszGroupEnc = "USCB_USC"; break;
468 case 0x4: pszGroupEnc = "PDS_USC"; break;
469 #if (RGX_FEATURE_NUM_CLUSTERS < 6)
470 case 0x5: pszGroupEnc = "PDSRW"; break;
471 #elif (RGX_FEATURE_NUM_CLUSTERS == 6)
472 case 0x5: pszGroupEnc = "UPUC_USC"; break;
473 case 0x6: pszGroupEnc = "TPUC_USC"; break;
474 case 0x7: pszGroupEnc = "PDSRW"; break;
480 case 0x0: pszGroup = "Banks 0-3"; break;
481 case 0x1: pszGroup = "Banks 4-7"; break;
482 case 0x2: pszGroup = "Banks 8-11"; break;
483 case 0x3: pszGroup = "Banks 12-15"; break;
486 OSSNPrintf(pszScratchBuf, ui32ScratchBufSize,
487 "%s, %s, %s", pszBurst, pszGroupEnc, pszGroup);
488 pszTagSB = pszScratchBuf;
495 #if defined(RGX_FEATURE_XT_TOP_INFRASTRUCTURE)
497 IMG_UINT32 ui32Req = (ui32TagSB >> 0) & 0xf;
498 IMG_UINT32 ui32MCUSB = (ui32TagSB >> 4) & 0x3;
499 IMG_CHAR* pszReqOrig = "";
503 case 0x0: pszReqOrig = "FBC Request, originator ZLS"; break;
504 case 0x1: pszReqOrig = "FBC Request, originator PBE"; break;
505 case 0x2: pszReqOrig = "FBC Request, originator Host"; break;
506 case 0x3: pszReqOrig = "FBC Request, originator TLA"; break;
507 case 0x4: pszReqOrig = "FBDC Request, originator ZLS"; break;
508 case 0x5: pszReqOrig = "FBDC Request, originator MCU"; break;
509 case 0x6: pszReqOrig = "FBDC Request, originator Host"; break;
510 case 0x7: pszReqOrig = "FBDC Request, originator TLA"; break;
511 case 0x8: pszReqOrig = "FBC Request, originator ZLS Requester Fence"; break;
512 case 0x9: pszReqOrig = "FBC Request, originator PBE Requester Fence"; break;
513 case 0xa: pszReqOrig = "FBC Request, originator Host Requester Fence"; break;
514 case 0xb: pszReqOrig = "FBC Request, originator TLA Requester Fence"; break;
515 case 0xc: pszReqOrig = "Reserved"; break;
516 case 0xd: pszReqOrig = "Reserved"; break;
517 case 0xe: pszReqOrig = "FBDC Request, originator FBCDC(Host) Memory Fence"; break;
518 case 0xf: pszReqOrig = "FBDC Request, originator FBCDC(TLA) Memory Fence"; break;
520 OSSNPrintf(pszScratchBuf, ui32ScratchBufSize,
521 "%s, MCU sideband 0x%X", pszReqOrig, ui32MCUSB);
522 pszTagSB = pszScratchBuf;
526 IMG_UINT32 ui32Req = (ui32TagSB >> 2) & 0x7;
527 IMG_UINT32 ui32MCUSB = (ui32TagSB >> 0) & 0x3;
528 IMG_CHAR* pszReqOrig = "";
532 case 0x0: pszReqOrig = "FBC Request, originator ZLS"; break;
533 case 0x1: pszReqOrig = "FBC Request, originator PBE"; break;
534 case 0x2: pszReqOrig = "FBC Request, originator Host"; break;
535 case 0x3: pszReqOrig = "FBC Request, originator TLA"; break;
536 case 0x4: pszReqOrig = "FBDC Request, originator ZLS"; break;
537 case 0x5: pszReqOrig = "FBDC Request, originator MCU"; break;
538 case 0x6: pszReqOrig = "FBDC Request, originator Host"; break;
539 case 0x7: pszReqOrig = "FBDC Request, originator TLA"; break;
541 OSSNPrintf(pszScratchBuf, ui32ScratchBufSize,
542 "%s, MCU sideband 0x%X", pszReqOrig, ui32MCUSB);
543 pszTagSB = pszScratchBuf;
548 } /* switch(TagID) */
550 *ppszTagID = pszTagID;
551 *ppszTagSB = pszTagSB;
556 #if defined(RGX_FEATURE_S7_TOP_INFRASTRUCTURE)
558 *******************************************************************************
560 @Function _RGXDecodeMMULevel
564 Return the name for the MMU level that faulted.
566 @Input ui32MMULevel - MMU level
568 @Return IMG_CHAR* to the sting describing the MMU level that faulted.
570 ******************************************************************************/
571 static IMG_CHAR* _RGXDecodeMMULevel(IMG_UINT32 ui32MMULevel)
573 IMG_CHAR* pszMMULevel = "";
575 switch (ui32MMULevel)
577 case 0x0: pszMMULevel = " (Page Table)"; break;
578 case 0x1: pszMMULevel = " (Page Directory)"; break;
579 case 0x2: pszMMULevel = " (Page Catalog)"; break;
580 case 0x3: pszMMULevel = " (Cat Base)"; break;
588 *******************************************************************************
590 @Function _RGXDecodeMMUReqTags
594 Decodes the MMU Tag ID and Sideband data fields from RGX_CR_MMU_FAULT_META_STATUS and
595 RGX_CR_MMU_FAULT_STATUS regs.
597 @Input ui32TagID - Tag ID value
598 @Input ui32TagSB - Tag Sideband data
599 @Output ppszTagID - Decoded string from the Tag ID
600 @Output ppszTagSB - Decoded string from the Tag SB
601 @Output pszScratchBuf - Buffer provided to the function to generate the debug strings
602 @Input ui32ScratchBufSize - Size of the provided buffer
606 ******************************************************************************/
607 static IMG_VOID _RGXDecodeMMUReqTags(IMG_UINT32 ui32TagID,
608 IMG_UINT32 ui32TagSB,
609 IMG_CHAR **ppszTagID,
610 IMG_CHAR **ppszTagSB,
611 IMG_CHAR *pszScratchBuf,
612 IMG_UINT32 ui32ScratchBufSize)
614 IMG_INT32 i32SideBandType = -1;
615 IMG_CHAR *pszTagID = "-";
616 IMG_CHAR *pszTagSB = "-";
618 PVR_ASSERT(ppszTagID != IMG_NULL);
619 PVR_ASSERT(ppszTagSB != IMG_NULL);
623 case 0: pszTagID = "META (Jones)"; i32SideBandType = RGXDBG_META; break;
624 case 1: pszTagID = "TLA (Jones)"; i32SideBandType = RGXDBG_TLA; break;
625 case 3: pszTagID = "VDMM (Jones)"; i32SideBandType = RGXDBG_VDMM; break;
626 case 4: pszTagID = "CDM (Jones)"; i32SideBandType = RGXDBG_CDM; break;
627 case 5: pszTagID = "IPP (Jones)"; i32SideBandType = RGXDBG_IPP; break;
628 case 6: pszTagID = "PM (Jones)"; i32SideBandType = RGXDBG_PM; break;
629 case 7: pszTagID = "Tiling (Jones)"; i32SideBandType = RGXDBG_TILING; break;
630 case 8: pszTagID = "MCU (Texas 0)"; i32SideBandType = RGXDBG_MCU; break;
631 case 9: pszTagID = "PDS (Texas 0)"; i32SideBandType = RGXDBG_PDS; break;
632 case 10: pszTagID = "PBE0 (Texas 0)"; i32SideBandType = RGXDBG_PBE; break;
633 case 11: pszTagID = "PBE1 (Texas 0)"; i32SideBandType = RGXDBG_PBE; break;
634 case 12: pszTagID = "VDMS (Black Pearl 0)"; i32SideBandType = RGXDBG_VDMS; break;
635 case 13: pszTagID = "IPF (Black Pearl 0)"; i32SideBandType = RGXDBG_IPF; break;
636 case 14: pszTagID = "ISP (Black Pearl 0)"; i32SideBandType = RGXDBG_ISP; break;
637 case 15: pszTagID = "TPF (Black Pearl 0)"; i32SideBandType = RGXDBG_TPF; break;
638 case 16: pszTagID = "USCS (Black Pearl 0)"; i32SideBandType = RGXDBG_USCS; break;
639 case 17: pszTagID = "PPP (Black Pearl 0)"; i32SideBandType = RGXDBG_PPP; break;
640 case 18: pszTagID = "VCE (Black Pearl 0)"; i32SideBandType = RGXDBG_VCE; break;
641 case 19: pszTagID = "FBCDC (Black Pearl 0)"; i32SideBandType = RGXDBG_FBCDC; break;
642 case 20: pszTagID = "MCU (Texas 1)"; i32SideBandType = RGXDBG_MCU; break;
643 case 21: pszTagID = "PDS (Texas 1)"; i32SideBandType = RGXDBG_PDS; break;
644 case 22: pszTagID = "PBE0 (Texas 1)"; i32SideBandType = RGXDBG_PBE; break;
645 case 23: pszTagID = "PBE1 (Texas 1)"; i32SideBandType = RGXDBG_PBE; break;
646 case 24: pszTagID = "MCU (Texas 2)"; i32SideBandType = RGXDBG_MCU; break;
647 case 25: pszTagID = "PDS (Texas 2)"; i32SideBandType = RGXDBG_PDS; break;
648 case 26: pszTagID = "PBE0 (Texas 2)"; i32SideBandType = RGXDBG_PBE; break;
649 case 27: pszTagID = "PBE1 (Texas 2)"; i32SideBandType = RGXDBG_PBE; break;
650 case 28: pszTagID = "VDMS (Black Pearl 1)"; i32SideBandType = RGXDBG_VDMS; break;
651 case 29: pszTagID = "IPF (Black Pearl 1)"; i32SideBandType = RGXDBG_IPF; break;
652 case 30: pszTagID = "ISP (Black Pearl 1)"; i32SideBandType = RGXDBG_ISP; break;
653 case 31: pszTagID = "TPF (Black Pearl 1)"; i32SideBandType = RGXDBG_TPF; break;
654 case 32: pszTagID = "USCS (Black Pearl 1)"; i32SideBandType = RGXDBG_USCS; break;
655 case 33: pszTagID = "PPP (Black Pearl 1)"; i32SideBandType = RGXDBG_PPP; break;
656 case 34: pszTagID = "VCE (Black Pearl 1)"; i32SideBandType = RGXDBG_VCE; break;
657 case 35: pszTagID = "FBCDC (Black Pearl 1)"; i32SideBandType = RGXDBG_FBCDC; break;
658 case 36: pszTagID = "MCU (Texas 3)"; i32SideBandType = RGXDBG_MCU; break;
659 case 37: pszTagID = "PDS (Texas 3)"; i32SideBandType = RGXDBG_PDS; break;
660 case 38: pszTagID = "PBE0 (Texas 3)"; i32SideBandType = RGXDBG_PBE; break;
661 case 39: pszTagID = "PBE1 (Texas 3)"; i32SideBandType = RGXDBG_PBE; break;
664 switch (i32SideBandType)
670 case 0x0: pszTagSB = "DCache - Thread 0"; break;
671 case 0x1: pszTagSB = "ICache - Thread 0"; break;
672 case 0x2: pszTagSB = "JTag - Thread 0"; break;
673 case 0x3: pszTagSB = "Slave bus - Thread 0"; break;
674 case 0x4: pszTagSB = "DCache - Thread 1"; break;
675 case 0x5: pszTagSB = "ICache - Thread 1"; break;
676 case 0x6: pszTagSB = "JTag - Thread 1"; break;
677 case 0x7: pszTagSB = "Slave bus - Thread 1"; break;
686 case 0x0: pszTagSB = "Pixel data"; break;
687 case 0x1: pszTagSB = "Command stream data"; break;
688 case 0x2: pszTagSB = "Fence or flush"; break;
697 case 0x0: pszTagSB = "Control Stream - Read Only"; break;
698 case 0x1: pszTagSB = "PPP State - Read Only"; break;
699 case 0x2: pszTagSB = "Indices - Read Only"; break;
700 case 0x4: pszTagSB = "Call Stack - Read/Write"; break;
701 case 0x6: pszTagSB = "DrawIndirect - Read Only"; break;
702 case 0xA: pszTagSB = "Context State - Write Only"; break;
711 case 0x0: pszTagSB = "Control Stream"; break;
712 case 0x1: pszTagSB = "Indirect Data"; break;
713 case 0x2: pszTagSB = "Event Write"; break;
714 case 0x3: pszTagSB = "Context State"; break;
723 case 0x0: pszTagSB = "Macrotile Header"; break;
724 case 0x1: pszTagSB = "Region Header"; break;
733 case 0x0: pszTagSB = "PMA_TAFSTACK"; break;
734 case 0x1: pszTagSB = "PMA_TAMLIST"; break;
735 case 0x2: pszTagSB = "PMA_3DFSTACK"; break;
736 case 0x3: pszTagSB = "PMA_3DMLIST"; break;
737 case 0x4: pszTagSB = "PMA_PMCTX0"; break;
738 case 0x5: pszTagSB = "PMA_PMCTX1"; break;
739 case 0x6: pszTagSB = "PMA_MAVP"; break;
740 case 0x7: pszTagSB = "PMA_UFSTACK"; break;
741 case 0x8: pszTagSB = "PMD_TAFSTACK"; break;
742 case 0x9: pszTagSB = "PMD_TAMLIST"; break;
743 case 0xA: pszTagSB = "PMD_3DFSTACK"; break;
744 case 0xB: pszTagSB = "PMD_3DMLIST"; break;
745 case 0xC: pszTagSB = "PMD_PMCTX0"; break;
746 case 0xD: pszTagSB = "PMD_PMCTX1"; break;
747 case 0xF: pszTagSB = "PMD_UFSTACK"; break;
748 case 0x10: pszTagSB = "PMA_TAMMUSTACK"; break;
749 case 0x11: pszTagSB = "PMA_3DMMUSTACK"; break;
750 case 0x12: pszTagSB = "PMD_TAMMUSTACK"; break;
751 case 0x13: pszTagSB = "PMD_3DMMUSTACK"; break;
752 case 0x14: pszTagSB = "PMA_TAUFSTACK"; break;
753 case 0x15: pszTagSB = "PMA_3DUFSTACK"; break;
754 case 0x16: pszTagSB = "PMD_TAUFSTACK"; break;
755 case 0x17: pszTagSB = "PMD_3DUFSTACK"; break;
756 case 0x18: pszTagSB = "PMA_TAVFP"; break;
757 case 0x19: pszTagSB = "PMD_3DVFP"; break;
758 case 0x1A: pszTagSB = "PMD_TAVFP"; break;
767 case 0x0: pszTagSB = "PSG Control Stream TP0"; break;
768 case 0x1: pszTagSB = "TPC TP0"; break;
769 case 0x2: pszTagSB = "VCE0"; break;
770 case 0x3: pszTagSB = "VCE1"; break;
771 case 0x4: pszTagSB = "PSG Control Stream TP1"; break;
772 case 0x5: pszTagSB = "TPC TP1"; break;
773 case 0x8: pszTagSB = "PSG Region Header TP0"; break;
774 case 0xC: pszTagSB = "PSG Region Header TP1"; break;
783 case 0x0: pszTagSB = "Context State - Write Only"; break;
793 case 0x20: pszTagSB = "CPF"; break;
794 case 0x01: pszTagSB = "DBSC"; break;
802 case 0x10: pszTagSB = "Control Stream"; break;
810 case 0x11: pszTagSB = "Primitive Block"; break;
819 case 0x00: pszTagSB = "ZLS read/write"; break;
820 case 0x20: pszTagSB = "Occlusion query read/write"; break;
829 case 0x0: pszTagSB = "TPF0: Primitive Block"; break;
830 case 0x1: pszTagSB = "TPF0: Depth Bias"; break;
831 case 0x2: pszTagSB = "TPF0: Per Primitive IDs"; break;
832 case 0x3: pszTagSB = "CPF - Tables"; break;
833 case 0x4: pszTagSB = "TPF1: Primitive Block"; break;
834 case 0x5: pszTagSB = "TPF1: Depth Bias"; break;
835 case 0x6: pszTagSB = "TPF1: Per Primitive IDs"; break;
836 case 0x7: pszTagSB = "CPF - Data: Pipe 0"; break;
837 case 0x8: pszTagSB = "TPF2: Primitive Block"; break;
838 case 0x9: pszTagSB = "TPF2: Depth Bias"; break;
839 case 0xA: pszTagSB = "TPF2: Per Primitive IDs"; break;
840 case 0xB: pszTagSB = "CPF - Data: Pipe 1"; break;
841 case 0xC: pszTagSB = "TPF3: Primitive Block"; break;
842 case 0xD: pszTagSB = "TPF3: Depth Bias"; break;
843 case 0xE: pszTagSB = "TPF3: Per Primitive IDs"; break;
844 case 0xF: pszTagSB = "CPF - Data: Pipe 2"; break;
851 IMG_UINT32 ui32Req = (ui32TagSB >> 0) & 0xf;
852 IMG_UINT32 ui32MCUSB = (ui32TagSB >> 4) & 0x3;
853 IMG_CHAR* pszReqOrig = "";
857 case 0x0: pszReqOrig = "FBC Request, originator ZLS"; break;
858 case 0x1: pszReqOrig = "FBC Request, originator PBE"; break;
859 case 0x2: pszReqOrig = "FBC Request, originator Host"; break;
860 case 0x3: pszReqOrig = "FBC Request, originator TLA"; break;
861 case 0x4: pszReqOrig = "FBDC Request, originator ZLS"; break;
862 case 0x5: pszReqOrig = "FBDC Request, originator MCU"; break;
863 case 0x6: pszReqOrig = "FBDC Request, originator Host"; break;
864 case 0x7: pszReqOrig = "FBDC Request, originator TLA"; break;
865 case 0x8: pszReqOrig = "FBC Request, originator ZLS Requester Fence"; break;
866 case 0x9: pszReqOrig = "FBC Request, originator PBE Requester Fence"; break;
867 case 0xa: pszReqOrig = "FBC Request, originator Host Requester Fence"; break;
868 case 0xb: pszReqOrig = "FBC Request, originator TLA Requester Fence"; break;
869 case 0xc: pszReqOrig = "Reserved"; break;
870 case 0xd: pszReqOrig = "Reserved"; break;
871 case 0xe: pszReqOrig = "FBDC Request, originator FBCDC(Host) Memory Fence"; break;
872 case 0xf: pszReqOrig = "FBDC Request, originator FBCDC(TLA) Memory Fence"; break;
874 OSSNPrintf(pszScratchBuf, ui32ScratchBufSize,
875 "%s, MCU sideband 0x%X", pszReqOrig, ui32MCUSB);
876 pszTagSB = pszScratchBuf;
882 IMG_UINT32 ui32SetNumber = (ui32TagSB >> 5) & 0x7;
883 IMG_UINT32 ui32WayNumber = (ui32TagSB >> 2) & 0x7;
884 IMG_UINT32 ui32Group = ui32TagSB & 0x3;
886 IMG_CHAR* pszGroup = "";
890 case 0x0: pszGroup = "Banks 0-1"; break;
891 case 0x1: pszGroup = "Banks 2-3"; break;
892 case 0x2: pszGroup = "Banks 4-5"; break;
893 case 0x3: pszGroup = "Banks 6-7"; break;
896 OSSNPrintf(pszScratchBuf, ui32ScratchBufSize,
897 "Set=%d, Way=%d, %s", ui32SetNumber, ui32WayNumber, pszGroup);
898 pszTagSB = pszScratchBuf;
904 OSSNPrintf(pszScratchBuf, ui32ScratchBufSize, "SB=0x%02x", ui32TagSB);
905 pszTagSB = pszScratchBuf;
910 *ppszTagID = pszTagID;
911 *ppszTagSB = pszTagSB;
916 #if !defined(RGX_FEATURE_S7_TOP_INFRASTRUCTURE)
918 *******************************************************************************
920 @Function _RGXDumpRGXBIFBank
924 Dump BIF Bank state in human readable form.
926 @Input psDevInfo - RGX device info
927 @Input eBankID - BIF identifier
928 @Input ui64MMUStatus - MMU Status register value
929 @Input ui64ReqStatus - BIF request Status register value
930 @Input bBIFSummary - Flag to check whether the function is called
931 as a part of the debug dump summary or
932 as a part of a HWR log
935 ******************************************************************************/
936 static IMG_VOID _RGXDumpRGXBIFBank(DUMPDEBUG_PRINTF_FUNC *pfnDumpDebugPrintf,
937 PVRSRV_RGXDEV_INFO *psDevInfo,
938 RGXDBG_BIF_ID eBankID,
939 IMG_UINT64 ui64MMUStatus,
940 IMG_UINT64 ui64ReqStatus,
941 IMG_BOOL bBIFSummary)
944 if (ui64MMUStatus == 0x0)
946 PVR_DUMPDEBUG_LOG(("%s - OK", pszBIFNames[eBankID]));
950 /* Bank 0 & 1 share the same fields */
951 PVR_DUMPDEBUG_LOG(("%s%s - FAULT:",
952 (bBIFSummary)?"":" ",
953 pszBIFNames[eBankID]));
958 (ui64MMUStatus & ~RGX_CR_BIF_FAULT_BANK0_MMU_STATUS_CAT_BASE_CLRMSK) >>
959 RGX_CR_BIF_FAULT_BANK0_MMU_STATUS_CAT_BASE_SHIFT;
961 IMG_UINT32 ui32PageSize =
962 (ui64MMUStatus & ~RGX_CR_BIF_FAULT_BANK0_MMU_STATUS_PAGE_SIZE_CLRMSK) >>
963 RGX_CR_BIF_FAULT_BANK0_MMU_STATUS_PAGE_SIZE_SHIFT;
965 IMG_UINT32 ui32MMUDataType =
966 (ui64MMUStatus & ~RGX_CR_BIF_FAULT_BANK0_MMU_STATUS_DATA_TYPE_CLRMSK) >>
967 RGX_CR_BIF_FAULT_BANK0_MMU_STATUS_DATA_TYPE_SHIFT;
969 IMG_BOOL bROFault = (ui64MMUStatus & RGX_CR_BIF_FAULT_BANK0_MMU_STATUS_FAULT_RO_EN) != 0;
970 IMG_BOOL bProtFault = (ui64MMUStatus & RGX_CR_BIF_FAULT_BANK0_MMU_STATUS_FAULT_PM_META_RO_EN) != 0;
972 PVR_DUMPDEBUG_LOG(("%s * MMU status (0x%016llX): PC = %d%s, Page Size = %d, MMU data type = %d%s%s.",
973 (bBIFSummary)?"":" ",
976 (ui32PC < 0x8)?"":_RGXDecodePMPC(ui32PC),
979 (bROFault)?", Read Only fault":"",
980 (bProtFault)?", PM/META protection fault":""));
987 IMG_CHAR aszScratch[RGX_DEBUG_STR_SIZE];
989 IMG_BOOL bRead = (ui64ReqStatus & RGX_CR_BIF_FAULT_BANK0_REQ_STATUS_RNW_EN) != 0;
990 IMG_UINT32 ui32TagSB =
991 (ui64ReqStatus & ~RGX_CR_BIF_FAULT_BANK0_REQ_STATUS_TAG_SB_CLRMSK) >>
992 RGX_CR_BIF_FAULT_BANK0_REQ_STATUS_TAG_SB_SHIFT;
993 IMG_UINT32 ui32TagID =
994 (ui64ReqStatus & ~RGX_CR_BIF_FAULT_BANK0_REQ_STATUS_TAG_ID_CLRMSK) >>
995 RGX_CR_BIF_FAULT_BANK0_REQ_STATUS_TAG_ID_SHIFT;
996 IMG_UINT64 ui64Addr = (ui64ReqStatus & ~RGX_CR_BIF_FAULT_BANK0_REQ_STATUS_ADDRESS_CLRMSK);
998 _RGXDecodeBIFReqTags(eBankID, ui32TagID, ui32TagSB, &pszTagID, &pszTagSB, &aszScratch[0], RGX_DEBUG_STR_SIZE);
1000 PVR_DUMPDEBUG_LOG(("%s * Request (0x%016llX): %s (%s), %s 0x%010llX.",
1001 (bBIFSummary)?"":" ",
1005 (bRead)?"Reading from":"Writing to",
1009 /* Check if the host thinks this fault is valid */
1013 (ui64MMUStatus & ~RGX_CR_BIF_FAULT_BANK0_MMU_STATUS_CAT_BASE_CLRMSK) >>
1014 RGX_CR_BIF_FAULT_BANK0_MMU_STATUS_CAT_BASE_SHIFT;
1015 IMG_DEV_VIRTADDR sFaultDevVAddr;
1016 IMG_DEV_PHYADDR sPCDevPAddr;
1018 sPCDevPAddr.uiAddr = OSReadHWReg64(psDevInfo->pvRegsBaseKM, RGX_CR_BIF_CAT_BASEN(ui32PC));
1019 sFaultDevVAddr.uiAddr = (ui64ReqStatus & ~RGX_CR_BIF_FAULT_BANK0_REQ_STATUS_ADDRESS_CLRMSK);
1020 RGXCheckFaultAddress(psDevInfo, &sFaultDevVAddr, &sPCDevPAddr);
1029 #if defined(RGX_FEATURE_S7_TOP_INFRASTRUCTURE)
1031 *******************************************************************************
1033 @Function _RGXDumpRGXMMUFaultStatus
1037 Dump MMU Fault status in human readable form.
1039 @Input psDevInfo - RGX device info
1040 @Input ui64MMUStatus - MMU Status register value
1041 @Input bSummary - Flag to check whether the function is called
1042 as a part of the debug dump summary or
1043 as a part of a HWR log
1046 ******************************************************************************/
1047 static IMG_VOID _RGXDumpRGXMMUFaultStatus(DUMPDEBUG_PRINTF_FUNC *pfnDumpDebugPrintf,
1048 PVRSRV_RGXDEV_INFO *psDevInfo,
1049 IMG_UINT64 ui64MMUStatus,
1052 if (ui64MMUStatus == 0x0)
1054 PVR_DUMPDEBUG_LOG(("MMU (Core) - OK"));
1058 IMG_UINT32 ui32PC = (ui64MMUStatus & ~RGX_CR_MMU_FAULT_STATUS_CONTEXT_CLRMSK) >>
1059 RGX_CR_MMU_FAULT_STATUS_CONTEXT_SHIFT;
1060 IMG_UINT64 ui64Addr = (ui64MMUStatus & ~RGX_CR_MMU_FAULT_STATUS_ADDRESS_CLRMSK) >>
1061 RGX_CR_MMU_FAULT_STATUS_ADDRESS_SHIFT;
1062 IMG_UINT32 ui32Requester = (ui64MMUStatus & ~RGX_CR_MMU_FAULT_STATUS_REQ_ID_CLRMSK) >>
1063 RGX_CR_MMU_FAULT_STATUS_REQ_ID_SHIFT;
1064 IMG_UINT32 ui32SideBand = (ui64MMUStatus & ~RGX_CR_MMU_FAULT_STATUS_TAG_SB_CLRMSK) >>
1065 RGX_CR_MMU_FAULT_STATUS_TAG_SB_SHIFT;
1066 IMG_UINT32 ui32MMULevel = (ui64MMUStatus & ~RGX_CR_MMU_FAULT_STATUS_LEVEL_CLRMSK) >>
1067 RGX_CR_MMU_FAULT_STATUS_LEVEL_SHIFT;
1068 IMG_BOOL bRead = (ui64MMUStatus & RGX_CR_MMU_FAULT_STATUS_RNW_EN) != 0;
1069 IMG_BOOL bFault = (ui64MMUStatus & RGX_CR_MMU_FAULT_STATUS_FAULT_EN) != 0;
1070 IMG_BOOL bROFault = ((ui64MMUStatus & ~RGX_CR_MMU_FAULT_STATUS_TYPE_CLRMSK) >>
1071 RGX_CR_MMU_FAULT_STATUS_TYPE_SHIFT) == 0x2;
1072 IMG_BOOL bProtFault = ((ui64MMUStatus & ~RGX_CR_MMU_FAULT_STATUS_TYPE_CLRMSK) >>
1073 RGX_CR_MMU_FAULT_STATUS_TYPE_SHIFT) == 0x3;
1074 IMG_CHAR aszScratch[RGX_DEBUG_STR_SIZE];
1078 _RGXDecodeMMUReqTags(ui32Requester, ui32SideBand, &pszTagID, &pszTagSB, aszScratch, RGX_DEBUG_STR_SIZE);
1080 PVR_DUMPDEBUG_LOG(("%sMMU (Core) - FAULT:", (bSummary)?"":" "));
1081 PVR_DUMPDEBUG_LOG(("%s * MMU status (0x%016llX): PC = %d, %s 0x%010llX, %s (%s)%s%s%s%s.",
1085 (bRead)?"Reading from":"Writing to",
1089 (bFault)?", Fault":"",
1090 (bROFault)?", Read Only fault":"",
1091 (bProtFault)?", PM/META protection fault":"",
1092 _RGXDecodeMMULevel(ui32MMULevel)));
1098 *******************************************************************************
1100 @Function _RGXDumpRGXMMUMetaFaultStatus
1104 Dump MMU Meta Fault state in human readable form.
1106 @Input psDevInfo - RGX device info
1107 @Input ui64MMUStatus - MMU Status register value
1108 @Input bSummary - Flag to check whether the function is called
1109 as a part of the debug dump summary or
1110 as a part of a HWR log
1113 ******************************************************************************/
1114 static IMG_VOID _RGXDumpRGXMMUMetaFaultStatus(DUMPDEBUG_PRINTF_FUNC *pfnDumpDebugPrintf,
1115 PVRSRV_RGXDEV_INFO *psDevInfo,
1116 IMG_UINT64 ui64MMUStatus,
1119 if (ui64MMUStatus == 0x0)
1121 PVR_DUMPDEBUG_LOG(("MMU (Meta) - OK"));
1125 IMG_UINT32 ui32PC = (ui64MMUStatus & ~RGX_CR_MMU_FAULT_STATUS_META_CONTEXT_CLRMSK) >>
1126 RGX_CR_MMU_FAULT_STATUS_META_CONTEXT_SHIFT;
1127 IMG_UINT64 ui64Addr = (ui64MMUStatus & ~RGX_CR_MMU_FAULT_STATUS_META_ADDRESS_CLRMSK) >>
1128 RGX_CR_MMU_FAULT_STATUS_META_ADDRESS_SHIFT;
1129 IMG_UINT32 ui32SideBand = (ui64MMUStatus & ~RGX_CR_MMU_FAULT_STATUS_META_TAG_SB_CLRMSK) >>
1130 RGX_CR_MMU_FAULT_STATUS_META_TAG_SB_SHIFT;
1131 IMG_UINT32 ui32Requester = (ui64MMUStatus & ~RGX_CR_MMU_FAULT_STATUS_META_REQ_ID_CLRMSK) >>
1132 RGX_CR_MMU_FAULT_STATUS_META_REQ_ID_SHIFT;
1133 IMG_UINT32 ui32MMULevel = (ui64MMUStatus & ~RGX_CR_MMU_FAULT_STATUS_META_LEVEL_CLRMSK) >>
1134 RGX_CR_MMU_FAULT_STATUS_META_LEVEL_SHIFT;
1135 IMG_BOOL bRead = (ui64MMUStatus & RGX_CR_MMU_FAULT_STATUS_META_RNW_EN) != 0;
1136 IMG_BOOL bFault = (ui64MMUStatus & RGX_CR_MMU_FAULT_STATUS_META_FAULT_EN) != 0;
1137 IMG_BOOL bROFault = ((ui64MMUStatus & ~RGX_CR_MMU_FAULT_STATUS_META_TYPE_CLRMSK) >>
1138 RGX_CR_MMU_FAULT_STATUS_META_TYPE_SHIFT) == 0x2;
1139 IMG_BOOL bProtFault = ((ui64MMUStatus & ~RGX_CR_MMU_FAULT_STATUS_META_TYPE_CLRMSK) >>
1140 RGX_CR_MMU_FAULT_STATUS_META_TYPE_SHIFT) == 0x3;
1141 IMG_CHAR aszScratch[RGX_DEBUG_STR_SIZE];
1145 _RGXDecodeMMUReqTags(ui32Requester, ui32SideBand, &pszTagID, &pszTagSB, aszScratch, RGX_DEBUG_STR_SIZE);
1147 PVR_DUMPDEBUG_LOG(("%sMMU (Meta) - FAULT:", (bSummary)?"":" "));
1148 PVR_DUMPDEBUG_LOG(("%s * MMU status (0x%016llX): PC = %d, %s 0x%010llX, %s (%s)%s%s%s%s.",
1152 (bRead)?"Reading from":"Writing to",
1156 (bFault)?", Fault":"",
1157 (bROFault)?", Read Only fault":"",
1158 (bProtFault)?", PM/META protection fault":"",
1159 _RGXDecodeMMULevel(ui32MMULevel)));
1166 *******************************************************************************
1168 @Function _RGXDumpFWAssert
1172 Dump FW assert strings when a thread asserts.
1174 @Input psRGXFWIfTraceBufCtl - RGX FW trace buffer
1178 ******************************************************************************/
1179 static IMG_VOID _RGXDumpFWAssert(DUMPDEBUG_PRINTF_FUNC *pfnDumpDebugPrintf,
1180 RGXFWIF_TRACEBUF *psRGXFWIfTraceBufCtl)
1182 IMG_CHAR *pszTraceAssertPath;
1183 IMG_CHAR *pszTraceAssertInfo;
1184 IMG_INT32 ui32TraceAssertLine;
1187 for (i = 0; i < RGXFW_THREAD_NUM; i++)
1189 pszTraceAssertPath = psRGXFWIfTraceBufCtl->sTraceBuf[i].sAssertBuf.szPath;
1190 pszTraceAssertInfo = psRGXFWIfTraceBufCtl->sTraceBuf[i].sAssertBuf.szInfo;
1191 ui32TraceAssertLine = psRGXFWIfTraceBufCtl->sTraceBuf[i].sAssertBuf.ui32LineNum;
1193 /* print non null assert strings */
1194 if (*pszTraceAssertInfo)
1196 PVR_DUMPDEBUG_LOG(("FW-T%d Assert: %s (%s:%d)",
1197 i, pszTraceAssertInfo, pszTraceAssertPath, ui32TraceAssertLine));
1202 static IMG_VOID _RGXDumpFWPoll(DUMPDEBUG_PRINTF_FUNC *pfnDumpDebugPrintf,
1203 RGXFWIF_TRACEBUF *psRGXFWIfTraceBufCtl)
1206 for (i = 0; i < RGXFW_THREAD_NUM; i++)
1208 if (psRGXFWIfTraceBufCtl->aui32CrPollAddr[i])
1210 PVR_DUMPDEBUG_LOG(("T%u polling %s (reg:0x%08X mask:0x%08X)",
1212 ((psRGXFWIfTraceBufCtl->aui32CrPollAddr[i] & RGXFW_POLL_TYPE_SET)?("set"):("unset")),
1213 psRGXFWIfTraceBufCtl->aui32CrPollAddr[i] & ~RGXFW_POLL_TYPE_SET,
1214 psRGXFWIfTraceBufCtl->aui32CrPollMask[i]));
1220 static IMG_VOID _RGXDumpFWHWRInfo(DUMPDEBUG_PRINTF_FUNC *pfnDumpDebugPrintf,
1221 RGXFWIF_TRACEBUF *psRGXFWIfTraceBufCtl, PVRSRV_RGXDEV_INFO *psDevInfo)
1223 IMG_BOOL bAnyLocked = IMG_FALSE;
1225 IMG_UINT32 ui32LineSize;
1226 IMG_CHAR *pszLine, *pszTemp;
1227 const IMG_CHAR *apszDmNames[RGXFWIF_DM_MAX + 1] = { "GP(", "2D(", "TA(", "3D(", "CDM(",
1228 #if defined(RGX_FEATURE_RAY_TRACING)
1230 #endif /* RGX_FEATURE_RAY_TRACING */
1233 const IMG_CHAR *pszMsgHeader = "Number of HWR: ";
1234 IMG_CHAR *pszLockupType = "";
1235 RGXFWIF_HWRINFOBUF *psHWInfoBuf = psDevInfo->psRGXFWIfHWRInfoBuf;
1236 RGX_HWRINFO *psHWRInfo;
1237 IMG_UINT32 ui32MsgHeaderSize = OSStringLength(pszMsgHeader);
1238 IMG_UINT32 ui32HWRRecoveryFlags;
1239 IMG_UINT32 ui32ReadIndex;
1241 for (dm = 0; dm < RGXFWIF_DM_MAX; dm++)
1243 if (psRGXFWIfTraceBufCtl->aui16HwrDmLockedUpCount[dm] ||
1244 psRGXFWIfTraceBufCtl->aui16HwrDmOverranCount[dm])
1246 bAnyLocked = IMG_TRUE;
1251 if (!bAnyLocked && (psRGXFWIfTraceBufCtl->ui32HWRStateFlags & RGXFWIF_HWR_HARDWARE_OK))
1253 /* No HWR situation, print nothing */
1257 ui32LineSize = sizeof(IMG_CHAR) * ( ui32MsgHeaderSize +
1258 (RGXFWIF_DM_MAX*( 4/*DM name + left parenthesis*/ +
1259 5/*UINT16 max num of digits*/ +
1261 5/*UINT16 max num of digits*/ +
1262 3/*right parenthesis + comma + space*/)) +
1263 7 + (RGXFWIF_DM_MAX*6)/* FALSE() + (UINT16 max num + comma) per DM */ +
1266 pszLine = OSAllocMem(ui32LineSize);
1267 if (pszLine == IMG_NULL)
1269 PVR_DPF((PVR_DBG_ERROR,"_RGXDumpRGXDebugSummary: Out of mem allocating line string (size: %d)", ui32LineSize));
1273 OSStringCopy(pszLine,pszMsgHeader);
1274 pszTemp = pszLine + ui32MsgHeaderSize;
1276 for (dm = 0; (dm < RGXFWIF_DM_MAX) && (apszDmNames[dm] != IMG_NULL); dm++)
1278 OSStringCopy(pszTemp,apszDmNames[dm]);
1279 pszTemp += OSStringLength(apszDmNames[dm]);
1280 pszTemp += OSSNPrintf(pszTemp,
1281 5 + 1 + 5 + 1 + 5 + 1 + 1 + 1 + 1 /* UINT16 + slash + UINT16 + plus + UINT16 + right parenthesis + comma + space + \0 */,
1283 psRGXFWIfTraceBufCtl->aui16HwrDmRecoveredCount[dm],
1284 psRGXFWIfTraceBufCtl->aui16HwrDmLockedUpCount[dm],
1285 psRGXFWIfTraceBufCtl->aui16HwrDmOverranCount[dm]);
1288 OSStringCopy(pszTemp, "FALSE(");
1291 for (dm = 0; (dm < RGXFWIF_DM_MAX) && (apszDmNames[dm] != IMG_NULL); dm++)
1293 pszTemp += OSSNPrintf(pszTemp,
1294 5 + 1 + 1 /* UINT16 max num + comma + \0 */,
1295 (dm < RGXFWIF_DM_MAX-1 ? "%u," : "%u)"),
1296 psRGXFWIfTraceBufCtl->aui16HwrDmFalseDetectCount[dm]);
1299 PVR_DUMPDEBUG_LOG((pszLine));
1303 /* Print out per HWR info */
1304 for (dm = 0; (dm < RGXFWIF_DM_MAX) && (apszDmNames[dm] != IMG_NULL); dm++)
1306 if (dm == RGXFWIF_DM_GP)
1308 PVR_DUMPDEBUG_LOG(("DM %d (GP)", dm));
1312 PVR_DUMPDEBUG_LOG(("DM %d (HWRflags 0x%08x)", dm, psRGXFWIfTraceBufCtl->aui32HWRRecoveryFlags[dm]));
1316 for(i = 0 ; i < RGXFWIF_HWINFO_MAX ; i++)
1318 psHWRInfo = &psHWInfoBuf->sHWRInfo[ui32ReadIndex];
1320 if((psHWRInfo->eDM == dm) && (psHWRInfo->ui32HWRNumber != 0))
1322 ui32HWRRecoveryFlags = psHWRInfo->ui32HWRRecoveryFlags;
1323 if(ui32HWRRecoveryFlags & RGXFWIF_DM_STATE_GUILTY_LOCKUP) { pszLockupType = ", Guilty Lockup"; }
1324 else if (ui32HWRRecoveryFlags & RGXFWIF_DM_STATE_INNOCENT_LOCKUP) { pszLockupType = ", Innocent Lockup"; }
1325 else if (ui32HWRRecoveryFlags & RGXFWIF_DM_STATE_GUILTY_OVERRUNING) { pszLockupType = ", Guilty Overrun"; }
1326 else if (ui32HWRRecoveryFlags & RGXFWIF_DM_STATE_GUILTY_LOCKUP) { pszLockupType = ", Innocent Overrun"; }
1328 PVR_DUMPDEBUG_LOG((" Recovery %d: PID = %d, frame = %d, HWRTData = 0x%08X, EventStatus = 0x%08X, CRTimer = 0x%012llX%s",
1329 psHWRInfo->ui32HWRNumber,
1331 psHWRInfo->ui32FrameNum,
1332 psHWRInfo->ui32ActiveHWRTData,
1333 psHWRInfo->ui32EventStatus,
1334 psHWRInfo->ui64CRTimer,
1337 switch(psHWRInfo->eHWRType)
1339 #if !defined(RGX_FEATURE_S7_TOP_INFRASTRUCTURE)
1340 case RGX_HWRTYPE_BIF0FAULT:
1341 case RGX_HWRTYPE_BIF1FAULT:
1343 _RGXDumpRGXBIFBank(pfnDumpDebugPrintf, psDevInfo, RGXFWIF_HWRTYPE_BIF_BANK_GET(psHWRInfo->eHWRType),
1344 psHWRInfo->uHWRData.sBIFInfo.ui64BIFMMUStatus,
1345 psHWRInfo->uHWRData.sBIFInfo.ui64BIFReqStatus,
1349 #if defined(RGX_FEATURE_CLUSTER_GROUPING)
1350 case RGX_HWRTYPE_TEXASBIF0FAULT:
1352 _RGXDumpRGXBIFBank(pfnDumpDebugPrintf, psDevInfo, RGXDBG_TEXAS_BIF,
1353 psHWRInfo->uHWRData.sBIFInfo.ui64BIFMMUStatus,
1354 psHWRInfo->uHWRData.sBIFInfo.ui64BIFReqStatus,
1360 case RGX_HWRTYPE_MMUFAULT:
1362 _RGXDumpRGXMMUFaultStatus(pfnDumpDebugPrintf, psDevInfo,
1363 psHWRInfo->uHWRData.sMMUInfo.ui64MMUStatus,
1368 case RGX_HWRTYPE_MMUMETAFAULT:
1370 _RGXDumpRGXMMUMetaFaultStatus(pfnDumpDebugPrintf, psDevInfo,
1371 psHWRInfo->uHWRData.sMMUInfo.ui64MMUStatus,
1377 case RGX_HWRTYPE_POLLFAILURE:
1379 PVR_DUMPDEBUG_LOG((" T%u polling %s (reg:0x%08X mask:0x%08X)",
1380 psHWRInfo->uHWRData.sPollInfo.ui32ThreadNum,
1381 ((psHWRInfo->uHWRData.sPollInfo.ui32CrPollAddr & RGXFW_POLL_TYPE_SET)?("set"):("unset")),
1382 psHWRInfo->uHWRData.sPollInfo.ui32CrPollAddr & ~RGXFW_POLL_TYPE_SET,
1383 psHWRInfo->uHWRData.sPollInfo.ui32CrPollMask));
1387 case RGX_HWRTYPE_OVERRUN:
1388 case RGX_HWRTYPE_UNKNOWNFAILURE:
1390 /* Nothing to dump */
1396 PVR_ASSERT(IMG_FALSE);
1402 if(ui32ReadIndex == RGXFWIF_HWINFO_MAX_FIRST - 1)
1403 ui32ReadIndex = psHWInfoBuf->ui32WriteIndex;
1405 ui32ReadIndex = (ui32ReadIndex + 1) - (ui32ReadIndex / RGXFWIF_HWINFO_LAST_INDEX) * RGXFWIF_HWINFO_MAX_LAST;
1410 #if !defined(NO_HARDWARE)
1413 *******************************************************************************
1415 @Function _CheckForPendingPage
1419 Check if the MMU indicates it is blocked on a pending page
1421 @Input psDevInfo - RGX device info
1423 @Return IMG_BOOL - IMG_TRUE if there is a pending page
1425 ******************************************************************************/
1426 static INLINE IMG_BOOL _CheckForPendingPage(PVRSRV_RGXDEV_INFO *psDevInfo)
1428 IMG_UINT32 ui32BIFMMUEntry;
1430 ui32BIFMMUEntry = OSReadHWReg32(psDevInfo->pvRegsBaseKM, RGX_CR_BIF_MMU_ENTRY);
1432 if(ui32BIFMMUEntry & RGX_CR_BIF_MMU_ENTRY_PENDING_EN)
1443 *******************************************************************************
1445 @Function _GetPendingPageInfo
1449 Get information about the pending page from the MMU status registers
1451 @Input psDevInfo - RGX device info
1452 @Output psDevVAddr - The device virtual address of the pending MMU address translation
1453 @Output pui32CatBase - The page catalog base
1454 @Output pui32DataType - The MMU entry data type
1458 ******************************************************************************/
1459 static void _GetPendingPageInfo(PVRSRV_RGXDEV_INFO *psDevInfo, IMG_DEV_VIRTADDR *psDevVAddr,
1460 IMG_UINT32 *pui32CatBase,
1461 IMG_UINT32 *pui32DataType)
1463 IMG_UINT64 ui64BIFMMUEntryStatus;
1465 ui64BIFMMUEntryStatus = OSReadHWReg64(psDevInfo->pvRegsBaseKM, RGX_CR_BIF_MMU_ENTRY_STATUS);
1467 psDevVAddr->uiAddr = (ui64BIFMMUEntryStatus & ~RGX_CR_BIF_MMU_ENTRY_STATUS_ADDRESS_CLRMSK);
1469 *pui32CatBase = (ui64BIFMMUEntryStatus & ~RGX_CR_BIF_MMU_ENTRY_STATUS_CAT_BASE_CLRMSK) >>
1470 RGX_CR_BIF_MMU_ENTRY_STATUS_CAT_BASE_SHIFT;
1472 *pui32DataType = (ui64BIFMMUEntryStatus & ~RGX_CR_BIF_MMU_ENTRY_STATUS_DATA_TYPE_CLRMSK) >>
1473 RGX_CR_BIF_MMU_ENTRY_STATUS_DATA_TYPE_SHIFT;
1479 *******************************************************************************
1481 @Function _RGXDumpRGXDebugSummary
1485 Dump a summary in human readable form with the RGX state
1487 @Input psDevInfo - RGX device info
1491 ******************************************************************************/
1492 static IMG_VOID _RGXDumpRGXDebugSummary(DUMPDEBUG_PRINTF_FUNC *pfnDumpDebugPrintf,
1493 PVRSRV_RGXDEV_INFO *psDevInfo, IMG_BOOL bRGXPoweredON)
1496 RGXFWIF_TRACEBUF *psRGXFWIfTraceBuf = psDevInfo->psRGXFWIfTraceBuf;
1500 #if defined(RGX_FEATURE_S7_TOP_INFRASTRUCTURE)
1501 IMG_UINT64 ui64RegValMMUStatus;
1503 ui64RegValMMUStatus = OSReadHWReg64(psDevInfo->pvRegsBaseKM, RGX_CR_MMU_FAULT_STATUS);
1504 _RGXDumpRGXMMUFaultStatus(pfnDumpDebugPrintf, psDevInfo, ui64RegValMMUStatus, IMG_TRUE);
1506 ui64RegValMMUStatus = OSReadHWReg64(psDevInfo->pvRegsBaseKM, RGX_CR_MMU_FAULT_STATUS_META);
1507 _RGXDumpRGXMMUMetaFaultStatus(pfnDumpDebugPrintf, psDevInfo, ui64RegValMMUStatus, IMG_TRUE);
1509 IMG_UINT64 ui64RegValMMUStatus, ui64RegValREQStatus;
1511 ui64RegValMMUStatus = OSReadHWReg64(psDevInfo->pvRegsBaseKM, RGX_CR_BIF_FAULT_BANK0_MMU_STATUS);
1512 ui64RegValREQStatus = OSReadHWReg64(psDevInfo->pvRegsBaseKM, RGX_CR_BIF_FAULT_BANK0_REQ_STATUS);
1514 _RGXDumpRGXBIFBank(pfnDumpDebugPrintf, psDevInfo, RGXDBG_BIF0, ui64RegValMMUStatus, ui64RegValREQStatus, IMG_TRUE);
1516 ui64RegValMMUStatus = OSReadHWReg64(psDevInfo->pvRegsBaseKM, RGX_CR_BIF_FAULT_BANK1_MMU_STATUS);
1517 ui64RegValREQStatus = OSReadHWReg64(psDevInfo->pvRegsBaseKM, RGX_CR_BIF_FAULT_BANK1_REQ_STATUS);
1519 _RGXDumpRGXBIFBank(pfnDumpDebugPrintf, psDevInfo, RGXDBG_BIF1, ui64RegValMMUStatus, ui64RegValREQStatus, IMG_TRUE);
1521 #if defined(RGX_FEATURE_CLUSTER_GROUPING)
1522 #if defined(RGX_NUM_PHANTOMS)
1524 IMG_UINT32 ui32Phantom;
1526 for (ui32Phantom = 0; ui32Phantom < RGX_NUM_PHANTOMS; ui32Phantom++)
1528 /* This can't be done as it may interfere with the FW... */
1529 /*OSWriteHWReg64(RGX_CR_TEXAS_INDIRECT, ui32Phantom);*/
1531 ui64RegValMMUStatus = OSReadHWReg64(psDevInfo->pvRegsBaseKM, RGX_CR_TEXAS_BIF_FAULT_BANK0_MMU_STATUS);
1532 ui64RegValREQStatus = OSReadHWReg64(psDevInfo->pvRegsBaseKM, RGX_CR_TEXAS_BIF_FAULT_BANK0_REQ_STATUS);
1534 _RGXDumpRGXBIFBank(pfnDumpDebugPrintf, psDevInfo, RGXDBG_TEXAS, ui64RegValMMUStatus, ui64RegValREQStatus, IMG_TRUE);
1538 ui64RegValMMUStatus = OSReadHWReg64(psDevInfo->pvRegsBaseKM, RGX_CR_TEXAS_BIF_FAULT_BANK0_MMU_STATUS);
1539 ui64RegValREQStatus = OSReadHWReg64(psDevInfo->pvRegsBaseKM, RGX_CR_TEXAS_BIF_FAULT_BANK0_REQ_STATUS);
1541 _RGXDumpRGXBIFBank(pfnDumpDebugPrintf, psDevInfo, RGXDBG_TEXAS_BIF, ui64RegValMMUStatus, ui64RegValREQStatus, IMG_TRUE);
1546 #if !defined(NO_HARDWARE)
1547 if(_CheckForPendingPage(psDevInfo))
1549 IMG_UINT32 ui32CatBase;
1550 IMG_UINT32 ui32DataType;
1551 IMG_DEV_VIRTADDR sDevVAddr;
1553 PVR_DUMPDEBUG_LOG(("MMU Pending page: Yes"));
1555 _GetPendingPageInfo(psDevInfo, &sDevVAddr, &ui32CatBase, &ui32DataType);
1557 if(ui32CatBase >= 8)
1559 PVR_DUMPDEBUG_LOG(("Cannot check address on PM cat base %u", ui32CatBase));
1563 IMG_DEV_PHYADDR sPCDevPAddr;
1565 sPCDevPAddr.uiAddr = OSReadHWReg64(psDevInfo->pvRegsBaseKM, RGX_CR_BIF_CAT_BASEN(ui32CatBase));
1567 PVR_DUMPDEBUG_LOG(("Checking device virtual address " IMG_DEV_VIRTADDR_FMTSPEC
1568 " on cat base %u. PC Addr = 0x%llX",
1569 (unsigned long long) sDevVAddr.uiAddr,
1571 (unsigned long long) sPCDevPAddr.uiAddr));
1572 RGXCheckFaultAddress(psDevInfo, &sDevVAddr, &sPCDevPAddr);
1575 #endif /* NO_HARDWARE */
1578 /* Firmware state */
1579 switch (psDevInfo->psDeviceNode->eHealthStatus)
1581 case PVRSRV_DEVICE_HEALTH_STATUS_OK:
1587 case PVRSRV_DEVICE_HEALTH_STATUS_NOT_RESPONDING:
1589 pszState = "NOT RESPONDING";
1593 case PVRSRV_DEVICE_HEALTH_STATUS_DEAD:
1601 pszState = "UNKNOWN";
1606 if (psRGXFWIfTraceBuf == IMG_NULL)
1608 PVR_DUMPDEBUG_LOG(("RGX FW State: %s", pszState));
1610 /* can't dump any more information */
1614 PVR_DUMPDEBUG_LOG(("RGX FW State: %s (HWRState 0x%08x)", pszState, psRGXFWIfTraceBuf->ui32HWRStateFlags));
1615 PVR_DUMPDEBUG_LOG(("RGX FW Power State: %s (APM %s: %d ok, %d denied, %d other, %d total)",
1616 pszPowStateName[psRGXFWIfTraceBuf->ePowState],
1617 (psDevInfo->pvAPMISRData)?"enabled":"disabled",
1618 psDevInfo->ui32ActivePMReqOk,
1619 psDevInfo->ui32ActivePMReqDenied,
1620 psDevInfo->ui32ActivePMReqTotal - psDevInfo->ui32ActivePMReqOk - psDevInfo->ui32ActivePMReqDenied,
1621 psDevInfo->ui32ActivePMReqTotal));
1624 _RGXDumpFWAssert(pfnDumpDebugPrintf, psRGXFWIfTraceBuf);
1626 _RGXDumpFWPoll(pfnDumpDebugPrintf, psRGXFWIfTraceBuf);
1628 _RGXDumpFWHWRInfo(pfnDumpDebugPrintf, psRGXFWIfTraceBuf, psDevInfo);
1632 static IMG_VOID _RGXDumpMetaSPExtraDebugInfo(DUMPDEBUG_PRINTF_FUNC *pfnDumpDebugPrintf,
1633 PVRSRV_RGXDEV_INFO *psDevInfo)
1635 /* List of extra META Slave Port debug registers */
1636 #define RGX_META_SP_EXTRA_DEBUG \
1637 X(RGX_CR_META_SP_MSLVCTRL0) \
1638 X(RGX_CR_META_SP_MSLVCTRL1) \
1639 X(RGX_CR_META_SP_MSLVIRQSTATUS) \
1640 X(RGX_CR_META_SP_MSLVIRQENABLE) \
1641 X(RGX_CR_META_SP_MSLVIRQLEVEL)
1643 IMG_UINT32 ui32Idx, ui32RegIdx;
1644 IMG_UINT32 ui32RegVal;
1645 IMG_UINT32 ui32RegAddr;
1647 const IMG_UINT32 aui32DebugRegAddr [] = {
1649 RGX_META_SP_EXTRA_DEBUG
1653 const IMG_CHAR* apszDebugRegName [] = {
1655 RGX_META_SP_EXTRA_DEBUG
1659 const IMG_UINT32 aui32Debug2RegAddr [] = {0xA28, 0x0A30, 0x0A38};
1661 PVR_DUMPDEBUG_LOG(("META Slave Port extra debug:"));
1663 /* dump first set of Slave Port debug registers */
1664 for (ui32Idx = 0; ui32Idx < sizeof(aui32DebugRegAddr)/sizeof(IMG_UINT32); ui32Idx++)
1666 const IMG_CHAR* pszRegName = apszDebugRegName[ui32Idx];
1668 ui32RegAddr = aui32DebugRegAddr[ui32Idx];
1669 ui32RegVal = OSReadHWReg32(psDevInfo->pvRegsBaseKM, ui32RegAddr);
1670 PVR_DUMPDEBUG_LOG((" * %s: 0x%8.8X", pszRegName, ui32RegVal));
1673 /* dump second set of Slave Port debug registers */
1674 for (ui32Idx = 0; ui32Idx < 4; ui32Idx++)
1676 OSWriteHWReg32(psDevInfo->pvRegsBaseKM, 0xA20, ui32Idx);
1677 ui32RegVal = OSReadHWReg32(psDevInfo->pvRegsBaseKM, 0xA20);
1678 PVR_DUMPDEBUG_LOG((" * 0xA20[%d]: 0x%8.8X", ui32Idx, ui32RegVal));
1682 for (ui32RegIdx = 0; ui32RegIdx < sizeof(aui32Debug2RegAddr)/sizeof(IMG_UINT32); ui32RegIdx++)
1684 ui32RegAddr = aui32Debug2RegAddr[ui32RegIdx];
1685 for (ui32Idx = 0; ui32Idx < 2; ui32Idx++)
1687 OSWriteHWReg32(psDevInfo->pvRegsBaseKM, ui32RegAddr, ui32Idx);
1688 ui32RegVal = OSReadHWReg32(psDevInfo->pvRegsBaseKM, ui32RegAddr);
1689 PVR_DUMPDEBUG_LOG((" * 0x%X[%d]: 0x%8.8X", ui32RegAddr, ui32Idx, ui32RegVal));
1698 IMG_VOID RGXDumpDebugInfo(DUMPDEBUG_PRINTF_FUNC *pfnDumpDebugPrintf,
1699 PVRSRV_RGXDEV_INFO *psDevInfo)
1703 for(i=0;i<=DEBUG_REQUEST_VERBOSITY_MAX;i++)
1705 RGXDebugRequestProcess(pfnDumpDebugPrintf, psDevInfo, i);
1710 #if defined(PVRSRV_ENABLE_FW_TRACE_DEBUGFS)
1712 * Array of all the Firmware Trace log IDs used to convert the trace data.
1714 typedef struct _TRACEBUF_LOG_ {
1715 RGXFW_LOG_SFids eSFId;
1718 IMG_UINT32 ui32ArgNum;
1721 TRACEBUF_LOG aLogDefinitions[] = {
1722 #define X(a, b, c, d, e) {RGXFW_LOG_CREATESFID(a,b,e), #c, d, e},
1727 #define NARGS_MASK ~(0xF<<16)
1728 static IMG_BOOL _FirmwareTraceIntegrityCheck(DUMPDEBUG_PRINTF_FUNC *pfnDumpDebugPrintf)
1730 TRACEBUF_LOG *psLogDef = &aLogDefinitions[0];
1731 IMG_BOOL bIntegrityOk = IMG_TRUE;
1734 * For every log ID, check the format string and number of arguments is valid.
1736 while (psLogDef->eSFId != RGXFW_SF_LAST)
1738 IMG_UINT32 ui32Count;
1739 IMG_CHAR *pszString;
1740 TRACEBUF_LOG *psLogDef2;
1743 * Check the number of arguments matches the number of '%' in the string and
1744 * check that no string uses %s which is not supported as it requires a
1745 * pointer to memory that is not going to be valid.
1747 pszString = psLogDef->pszFmt;
1750 while (*pszString != '\0')
1752 if (*pszString++ == '%')
1755 if (*pszString == 's')
1757 bIntegrityOk = IMG_FALSE;
1758 PVR_DUMPDEBUG_LOG(("Integrity Check FAIL: %s has an unsupported type not recognized (fmt: %%%c). Please fix.",
1759 psLogDef->pszName, *pszString));
1761 else if (*pszString == '%')
1763 /* Double % is a printable % sign and not a format string... */
1769 if (ui32Count != psLogDef->ui32ArgNum)
1771 bIntegrityOk = IMG_FALSE;
1772 PVR_DUMPDEBUG_LOG(("Integrity Check FAIL: %s has %d arguments but only %d are specified. Please fix.",
1773 psLogDef->pszName, ui32Count, psLogDef->ui32ArgNum));
1776 /* RGXDumpFirmwareTrace() has a hardcoded limit of supporting up to 20 arguments... */
1779 bIntegrityOk = IMG_FALSE;
1780 PVR_DUMPDEBUG_LOG(("Integrity Check FAIL: %s has %d arguments but a maximum of 20 are supported. Please fix.",
1781 psLogDef->pszName, ui32Count));
1784 /* Check the id number is unique (don't take into account the number of arguments) */
1786 psLogDef2 = &aLogDefinitions[0];
1788 while (psLogDef2->eSFId != RGXFW_SF_LAST)
1790 if ((psLogDef->eSFId & NARGS_MASK) == (psLogDef2->eSFId & NARGS_MASK))
1799 bIntegrityOk = IMG_FALSE;
1800 PVR_DUMPDEBUG_LOG(("Integrity Check FAIL: %s id %x is not unique, there are %d more. Please fix.",
1801 psLogDef->pszName, psLogDef->eSFId, ui32Count - 1));
1804 /* Move to the next log ID... */
1808 return bIntegrityOk;
1811 IMG_VOID RGXDumpFirmwareTrace(DUMPDEBUG_PRINTF_FUNC *pfnDumpDebugPrintf,
1812 PVRSRV_RGXDEV_INFO *psDevInfo)
1814 RGXFWIF_TRACEBUF *psRGXFWIfTraceBufCtl = psDevInfo->psRGXFWIfTraceBuf;
1815 static IMG_BOOL bIntegrityCheckPassed = IMG_FALSE;
1817 /* Check that the firmware trace is correctly defined... */
1818 if (!bIntegrityCheckPassed)
1820 bIntegrityCheckPassed = _FirmwareTraceIntegrityCheck(pfnDumpDebugPrintf);
1821 if (!bIntegrityCheckPassed)
1827 /* Dump FW trace information... */
1828 if (psRGXFWIfTraceBufCtl != IMG_NULL)
1830 IMG_CHAR szBuffer[PVR_MAX_DEBUG_MESSAGE_LEN];
1833 /* Print the log type settings... */
1834 if (psRGXFWIfTraceBufCtl->ui32LogType & RGXFWIF_LOG_TYPE_GROUP_MASK)
1836 PVR_DUMPDEBUG_LOG(("Debug log type: %s ( " RGXFWIF_LOG_ENABLED_GROUPS_LIST_PFSPEC ")",
1837 ((psRGXFWIfTraceBufCtl->ui32LogType & RGXFWIF_LOG_TYPE_TRACE)?("trace"):("tbi")),
1838 RGXFWIF_LOG_ENABLED_GROUPS_LIST(psRGXFWIfTraceBufCtl->ui32LogType)
1843 PVR_DUMPDEBUG_LOG(("Debug log type: none"));
1846 /* Print the decoded log for each thread... */
1847 for (tid = 0; tid < RGXFW_THREAD_NUM; tid++)
1849 IMG_UINT32 *ui32TraceBuf = psRGXFWIfTraceBufCtl->sTraceBuf[tid].aui32TraceBuffer;
1850 IMG_UINT32 ui32TracePtr = psRGXFWIfTraceBufCtl->sTraceBuf[tid].ui32TracePointer;
1851 IMG_UINT32 ui32Count = 0;
1853 while (ui32Count < RGXFW_TRACE_BUFFER_SIZE)
1855 IMG_UINT32 ui32Data, ui32DataToId;
1857 /* Find the first valid log ID, skipping whitespace... */
1860 ui32Data = ui32TraceBuf[ui32TracePtr];
1861 ui32DataToId = idToStringID(ui32Data);
1863 /* If an unrecognized id is found check if it is valid, if it is tracebuf needs updating. */
1864 if (ui32DataToId == RGXFW_SF_LAST && RGXFW_LOG_VALIDID(ui32Data))
1866 PVR_DUMPDEBUG_LOG(("ERROR: Unrecognized id (%x). From here on the trace might be wrong!", ui32Data));
1870 /* Update the trace pointer... */
1871 ui32TracePtr = (ui32TracePtr + 1) % RGXFW_TRACE_BUFFER_SIZE;
1873 } while ((RGXFW_SF_LAST == ui32DataToId || ui32DataToId >= RGXFW_SF_FIRST) &&
1874 ui32Count < RGXFW_TRACE_BUFFER_SIZE);
1876 if (ui32Count < RGXFW_TRACE_BUFFER_SIZE)
1878 IMG_UINT64 ui64RGXTimer;
1880 /* If we hit the ASSERT message then this is the end of the log... */
1881 if (ui32Data == RGXFW_SF_MAIN_ASSERT_FAILED)
1883 PVR_DUMPDEBUG_LOG(("ASSERTION %s failed at %s:%u",
1884 psRGXFWIfTraceBufCtl->sTraceBuf[tid].sAssertBuf.szInfo,
1885 psRGXFWIfTraceBufCtl->sTraceBuf[tid].sAssertBuf.szPath,
1886 psRGXFWIfTraceBufCtl->sTraceBuf[tid].sAssertBuf.ui32LineNum));
1891 * Print the trace string and provide up to 20 arguments which
1892 * printf function will be able to use. We have already checked
1893 * that no string uses more than this.
1895 OSStringCopy(szBuffer, "%llu:T%u-%s> ");
1896 OSStringCopy(&szBuffer[OSStringLength(szBuffer)], SFs[ui32DataToId].name);
1897 szBuffer[OSStringLength(szBuffer)-1] = '\0';
1898 ui64RGXTimer = (IMG_UINT64)(ui32TraceBuf[(ui32TracePtr + 0) % RGXFW_TRACE_BUFFER_SIZE]) << 32 |
1899 (IMG_UINT64)(ui32TraceBuf[(ui32TracePtr + 1) % RGXFW_TRACE_BUFFER_SIZE]);
1900 PVR_DUMPDEBUG_LOG((szBuffer, ui64RGXTimer, tid, groups[RGXFW_SF_GID(ui32Data)],
1901 ui32TraceBuf[(ui32TracePtr + 2) % RGXFW_TRACE_BUFFER_SIZE],
1902 ui32TraceBuf[(ui32TracePtr + 3) % RGXFW_TRACE_BUFFER_SIZE],
1903 ui32TraceBuf[(ui32TracePtr + 4) % RGXFW_TRACE_BUFFER_SIZE],
1904 ui32TraceBuf[(ui32TracePtr + 5) % RGXFW_TRACE_BUFFER_SIZE],
1905 ui32TraceBuf[(ui32TracePtr + 6) % RGXFW_TRACE_BUFFER_SIZE],
1906 ui32TraceBuf[(ui32TracePtr + 7) % RGXFW_TRACE_BUFFER_SIZE],
1907 ui32TraceBuf[(ui32TracePtr + 8) % RGXFW_TRACE_BUFFER_SIZE],
1908 ui32TraceBuf[(ui32TracePtr + 9) % RGXFW_TRACE_BUFFER_SIZE],
1909 ui32TraceBuf[(ui32TracePtr + 10) % RGXFW_TRACE_BUFFER_SIZE],
1910 ui32TraceBuf[(ui32TracePtr + 11) % RGXFW_TRACE_BUFFER_SIZE],
1911 ui32TraceBuf[(ui32TracePtr + 12) % RGXFW_TRACE_BUFFER_SIZE],
1912 ui32TraceBuf[(ui32TracePtr + 13) % RGXFW_TRACE_BUFFER_SIZE],
1913 ui32TraceBuf[(ui32TracePtr + 14) % RGXFW_TRACE_BUFFER_SIZE],
1914 ui32TraceBuf[(ui32TracePtr + 15) % RGXFW_TRACE_BUFFER_SIZE],
1915 ui32TraceBuf[(ui32TracePtr + 16) % RGXFW_TRACE_BUFFER_SIZE],
1916 ui32TraceBuf[(ui32TracePtr + 17) % RGXFW_TRACE_BUFFER_SIZE],
1917 ui32TraceBuf[(ui32TracePtr + 18) % RGXFW_TRACE_BUFFER_SIZE],
1918 ui32TraceBuf[(ui32TracePtr + 19) % RGXFW_TRACE_BUFFER_SIZE],
1919 ui32TraceBuf[(ui32TracePtr + 20) % RGXFW_TRACE_BUFFER_SIZE],
1920 ui32TraceBuf[(ui32TracePtr + 21) % RGXFW_TRACE_BUFFER_SIZE]));
1922 /* Update the trace pointer... */
1923 ui32TracePtr = (ui32TracePtr + 2 + RGXFW_SF_PARAMNUM(ui32Data)) % RGXFW_TRACE_BUFFER_SIZE;
1924 ui32Count = (ui32Count + 2 + RGXFW_SF_PARAMNUM(ui32Data));
1933 static IMG_CHAR* _RGXGetDebugDevPowerStateString(PVRSRV_DEV_POWER_STATE ePowerState)
1937 case PVRSRV_DEV_POWER_STATE_DEFAULT: return "DEFAULT";
1938 case PVRSRV_DEV_POWER_STATE_OFF: return "OFF";
1939 case PVRSRV_DEV_POWER_STATE_ON: return "ON";
1940 default: return "UNKNOWN";
1944 IMG_VOID RGXDebugRequestProcess(DUMPDEBUG_PRINTF_FUNC *pfnDumpDebugPrintf,
1945 PVRSRV_RGXDEV_INFO *psDevInfo,
1946 IMG_UINT32 ui32VerbLevel)
1948 PVRSRV_ERROR eError = PVRSRVPowerLock();
1949 if (eError != PVRSRV_OK)
1951 PVR_DPF((PVR_DBG_ERROR, "RGXDebugRequestProcess : failed to acquire lock, error:0x%x", eError));
1955 switch (ui32VerbLevel)
1957 case DEBUG_REQUEST_VERBOSITY_LOW :
1959 IMG_UINT32 ui32DeviceIndex;
1960 PVRSRV_DEV_POWER_STATE ePowerState;
1961 IMG_BOOL bRGXPoweredON;
1963 ui32DeviceIndex = psDevInfo->psDeviceNode->sDevId.ui32DeviceIndex;
1965 eError = PVRSRVGetDevicePowerState(ui32DeviceIndex, &ePowerState);
1966 if (eError != PVRSRV_OK)
1968 PVR_DPF((PVR_DBG_ERROR, "RGXDebugRequestProcess: Error retrieving RGX power state. No debug info dumped."));
1972 bRGXPoweredON = (ePowerState == PVRSRV_DEV_POWER_STATE_ON);
1974 PVR_DUMPDEBUG_LOG(("------[ RGX summary ]------"));
1975 PVR_DUMPDEBUG_LOG(("RGX BVNC: %s", RGX_BVNC_KM));
1976 PVR_DUMPDEBUG_LOG(("RGX Power State: %s", _RGXGetDebugDevPowerStateString(ePowerState)));
1978 _RGXDumpRGXDebugSummary(pfnDumpDebugPrintf, psDevInfo, bRGXPoweredON);
1983 PVR_DUMPDEBUG_LOG(("------[ RGX registers ]------"));
1984 PVR_DUMPDEBUG_LOG(("RGX Register Base Address (Linear): 0x%p", psDevInfo->pvRegsBaseKM));
1985 PVR_DUMPDEBUG_LOG(("RGX Register Base Address (Physical): 0x%08lX", (unsigned long)psDevInfo->sRegsPhysBase.uiAddr));
1987 /* Forcing bit 6 of MslvCtrl1 to 0 to avoid internal reg read going though the core */
1988 OSWriteHWReg32(psDevInfo->pvRegsBaseKM, RGX_CR_META_SP_MSLVCTRL1, 0x0);
1990 eError = RGXRunScript(psDevInfo, psDevInfo->psScripts->asDbgCommands, RGX_MAX_INIT_COMMANDS, PDUMP_FLAGS_CONTINUOUS, pfnDumpDebugPrintf);
1991 if (eError != PVRSRV_OK)
1993 PVR_DPF((PVR_DBG_WARNING,"RGXDebugRequestProcess: RGXRunScript failed (%d) - Retry", eError));
1995 /* use thread1 for slave port accesses */
1996 OSWriteHWReg32(psDevInfo->pvRegsBaseKM, RGX_CR_META_SP_MSLVCTRL1, 0x1 << RGX_CR_META_SP_MSLVCTRL1_THREAD_SHIFT);
1998 eError = RGXRunScript(psDevInfo, psDevInfo->psScripts->asDbgCommands, RGX_MAX_INIT_COMMANDS, PDUMP_FLAGS_CONTINUOUS, pfnDumpDebugPrintf);
1999 if (eError != PVRSRV_OK)
2001 PVR_DPF((PVR_DBG_ERROR,"RGXDebugRequestProcess: RGXRunScript retry failed (%d) - Dump Slave Port debug information", eError));
2002 _RGXDumpMetaSPExtraDebugInfo(pfnDumpDebugPrintf, psDevInfo);
2005 /* use thread0 again */
2006 OSWriteHWReg32(psDevInfo->pvRegsBaseKM, RGX_CR_META_SP_MSLVCTRL1, 0x0 << RGX_CR_META_SP_MSLVCTRL1_THREAD_SHIFT);
2011 PVR_DUMPDEBUG_LOG((" (!) RGX power is down. No registers dumped"));
2015 RGXFWIF_DM eKCCBType;
2018 Dump out the kernel CCBs.
2020 for (eKCCBType = 0; eKCCBType < RGXFWIF_DM_MAX; eKCCBType++)
2022 RGXFWIF_CCB_CTL *psKCCBCtl = psDevInfo->apsKernelCCBCtl[eKCCBType];
2024 if (psKCCBCtl != IMG_NULL)
2026 PVR_DUMPDEBUG_LOG(("RGX Kernel CCB %u WO:0x%X RO:0x%X",
2027 eKCCBType, psKCCBCtl->ui32WriteOffset, psKCCBCtl->ui32ReadOffset));
2032 /* Dump the KCCB commands executed */
2034 PVR_DUMPDEBUG_LOG(("RGX Kernel CCB commands executed = %d",
2035 psDevInfo->psRGXFWIfTraceBuf->ui32KCCBCmdsExecuted));
2038 /* Dump the IRQ info */
2040 PVR_DUMPDEBUG_LOG(("RGX FW IRQ count = %d, last sampled in MISR = %d",
2041 psDevInfo->psRGXFWIfTraceBuf->ui32InterruptCount,
2042 g_ui32HostSampleIRQCount));
2045 /* Dump the FW config flags */
2047 RGXFWIF_INIT *psRGXFWInit;
2049 eError = DevmemAcquireCpuVirtAddr(psDevInfo->psRGXFWIfInitMemDesc,
2050 (IMG_VOID **)&psRGXFWInit);
2052 if (eError != PVRSRV_OK)
2054 PVR_DPF((PVR_DBG_ERROR,"RGXDebugRequestProcess: Failed to acquire kernel fw if ctl (%u)",
2059 PVR_DUMPDEBUG_LOG(("RGX FW config flags = 0x%X", psRGXFWInit->ui32ConfigFlags));
2061 DevmemReleaseCpuVirtAddr(psDevInfo->psRGXFWIfInitMemDesc);
2067 case DEBUG_REQUEST_VERBOSITY_MEDIUM :
2070 /* Dump FW trace information */
2071 if (psDevInfo->psRGXFWIfTraceBuf != IMG_NULL)
2073 RGXFWIF_TRACEBUF *psRGXFWIfTraceBufCtl = psDevInfo->psRGXFWIfTraceBuf;
2075 for ( tid = 0 ; tid < RGXFW_THREAD_NUM ; tid++)
2078 IMG_BOOL bPrevLineWasZero = IMG_FALSE;
2079 IMG_BOOL bLineIsAllZeros = IMG_FALSE;
2080 IMG_UINT32 ui32CountLines = 0;
2081 IMG_UINT32 *pui32TraceBuffer;
2084 pui32TraceBuffer = &psRGXFWIfTraceBufCtl->sTraceBuf[tid].aui32TraceBuffer[0];
2086 /* each element in the line is 8 characters plus a space. The '+1' is because of the final trailing '\0'. */
2087 pszLine = OSAllocMem(9*RGXFW_TRACE_BUFFER_LINESIZE+1);
2088 if (pszLine == IMG_NULL)
2090 PVR_DPF((PVR_DBG_ERROR,"RGXDebugRequestProcess: Out of mem allocating line string (size: %d)", 9*RGXFW_TRACE_BUFFER_LINESIZE));
2094 /* Print the tracepointer */
2095 if (psRGXFWIfTraceBufCtl->ui32LogType & RGXFWIF_LOG_TYPE_GROUP_MASK)
2097 PVR_DUMPDEBUG_LOG(("Debug log type: %s ( " RGXFWIF_LOG_ENABLED_GROUPS_LIST_PFSPEC ")",
2098 ((psRGXFWIfTraceBufCtl->ui32LogType & RGXFWIF_LOG_TYPE_TRACE)?("trace"):("tbi")),
2099 RGXFWIF_LOG_ENABLED_GROUPS_LIST(psRGXFWIfTraceBufCtl->ui32LogType)
2104 PVR_DUMPDEBUG_LOG(("Debug log type: none"));
2107 PVR_DUMPDEBUG_LOG(("------[ RGX FW thread %d trace START ]------", tid));
2108 PVR_DUMPDEBUG_LOG(("FWT[traceptr]: %X", psRGXFWIfTraceBufCtl->sTraceBuf[tid].ui32TracePointer));
2109 PVR_DUMPDEBUG_LOG(("FWT[tracebufsize]: %X", RGXFW_TRACE_BUFFER_SIZE));
2111 for (i = 0; i < RGXFW_TRACE_BUFFER_SIZE; i += RGXFW_TRACE_BUFFER_LINESIZE)
2114 IMG_UINT32 ui32Line = 0x0;
2115 IMG_UINT32 ui32LineOffset = i*sizeof(IMG_UINT32);
2116 IMG_CHAR *pszBuf = pszLine;
2118 for (k = 0; k < RGXFW_TRACE_BUFFER_LINESIZE; k++)
2120 ui32Line |= pui32TraceBuffer[i + k];
2122 /* prepare the line to print it. The '+1' is because of the trailing '\0' added */
2123 OSSNPrintf(pszBuf, 9 + 1, " %08x", pui32TraceBuffer[i + k]);
2124 pszBuf += 9; /* write over the '\0' */
2127 bLineIsAllZeros = (ui32Line == 0x0);
2129 if (bLineIsAllZeros && bPrevLineWasZero)
2133 else if (bLineIsAllZeros && !bPrevLineWasZero)
2135 bPrevLineWasZero = IMG_TRUE;
2137 PVR_DUMPDEBUG_LOG(("FWT[%08x]: 00000000 ... 00000000", ui32LineOffset));
2141 if (bPrevLineWasZero)
2143 PVR_DUMPDEBUG_LOG(("FWT[%08x]: %d lines were all zero", ui32LineOffset, ui32CountLines));
2148 PVR_DUMPDEBUG_LOG(("FWT[%08x]:%s", ui32LineOffset, pszLine));
2150 bPrevLineWasZero = IMG_FALSE;
2154 if (bPrevLineWasZero)
2156 PVR_DUMPDEBUG_LOG(("FWT[END]: %d lines were all zero", ui32CountLines));
2159 PVR_DUMPDEBUG_LOG(("------[ RGX FW thread %d trace END ]------", tid));
2166 PVR_DUMPDEBUG_LOG(("------[ Stalled FWCtxs ]------"));
2168 CheckForStalledTransferCtxt(psDevInfo, pfnDumpDebugPrintf);
2169 CheckForStalledRenderCtxt(psDevInfo, pfnDumpDebugPrintf);
2170 #if !defined(UNDER_WDDM)
2171 CheckForStalledComputeCtxt(psDevInfo, pfnDumpDebugPrintf);
2173 #if defined(RGX_FEATURE_RAY_TRACING)
2174 CheckForStalledRayCtxt(psDevInfo, pfnDumpDebugPrintf);
2179 case DEBUG_REQUEST_VERBOSITY_HIGH:
2181 PVRSRV_ERROR eError;
2182 IMG_UINT32 ui32DeviceIndex;
2183 PVRSRV_DEV_POWER_STATE ePowerState;
2184 IMG_BOOL bRGXPoweredON;
2186 ui32DeviceIndex = psDevInfo->psDeviceNode->sDevId.ui32DeviceIndex;
2188 eError = PVRSRVGetDevicePowerState(ui32DeviceIndex, &ePowerState);
2189 if (eError != PVRSRV_OK)
2191 PVR_DPF((PVR_DBG_ERROR, "RGXDebugRequestProcess: Error retrieving RGX power state. No debug info dumped."));
2195 bRGXPoweredON = (ePowerState == PVRSRV_DEV_POWER_STATE_ON);
2197 PVR_DUMPDEBUG_LOG(("------[ Debug bus ]------"));
2199 _RGXDumpRGXDebugSummary(pfnDumpDebugPrintf, psDevInfo, bRGXPoweredON);
2203 eError = RGXRunScript(psDevInfo, psDevInfo->psScripts->asDbgBusCommands, RGX_MAX_DBGBUS_COMMANDS, PDUMP_FLAGS_CONTINUOUS, pfnDumpDebugPrintf);
2204 if (eError != PVRSRV_OK)
2206 PVR_DPF((PVR_DBG_WARNING,"RGXDebugRequestProcess: RGXRunScript failed (%s)", PVRSRVGetErrorStringKM(eError)));
2216 PVRSRVPowerUnlock();
2222 IMG_VOID RGXPanic(PVRSRV_RGXDEV_INFO *psDevInfo)
2224 PVR_LOG(("RGX panic"));
2225 PVRSRVDebugRequest(DEBUG_REQUEST_VERBOSITY_MAX, IMG_NULL);
2232 PVRSRV_ERROR RGXQueryDMState(PVRSRV_RGXDEV_INFO *psDevInfo, RGXFWIF_DM eDM, RGXFWIF_DM_STATE *peState, RGXFWIF_DEV_VIRTADDR *psCommonContextDevVAddr)
2234 PVRSRV_ERROR eError = PVRSRV_OK;
2235 RGXFWIF_TRACEBUF *psRGXFWIfTraceBufCtl = psDevInfo->psRGXFWIfTraceBuf;
2237 if (eDM >= RGXFWIF_DM_MAX)
2239 eError = PVRSRV_ERROR_INVALID_PARAMS;
2240 PVR_DPF((PVR_DBG_ERROR,"RGXQueryDMState: eDM parameter is out of range (%u)",eError));
2244 if (peState == IMG_NULL)
2246 eError = PVRSRV_ERROR_INVALID_PARAMS;
2247 PVR_DPF((PVR_DBG_ERROR,"RGXQueryDMState: peState is NULL (%u)",eError));
2251 if (psCommonContextDevVAddr == IMG_NULL)
2253 eError = PVRSRV_ERROR_INVALID_PARAMS;
2254 PVR_DPF((PVR_DBG_ERROR,"RGXQueryDMState: psCommonContextDevVAddr is NULL (%u)",eError));
2258 if (eError != PVRSRV_OK)
2260 PVR_DPF((PVR_DBG_ERROR,"RGXQueryDMState: Failed (%d) to acquire address for trace buffer", eError));
2264 if (psRGXFWIfTraceBufCtl->apsHwrDmFWCommonContext[eDM].ui32Addr)
2266 *peState = RGXFWIF_DM_STATE_LOCKEDUP;
2270 *peState = RGXFWIF_DM_STATE_NORMAL;
2273 *psCommonContextDevVAddr = psRGXFWIfTraceBufCtl->apsHwrDmFWCommonContext[eDM];
2279 /******************************************************************************
2280 End of file (rgxdebug.c)
2281 ******************************************************************************/