10ef1b4d5b1a3af4ce7ae42ef4259d5db320724c5Bas Nieuwenhuizen/*
20ef1b4d5b1a3af4ce7ae42ef4259d5db320724c5Bas Nieuwenhuizen * Copyright 2015 Advanced Micro Devices, Inc.
30ef1b4d5b1a3af4ce7ae42ef4259d5db320724c5Bas Nieuwenhuizen *
40ef1b4d5b1a3af4ce7ae42ef4259d5db320724c5Bas Nieuwenhuizen * Permission is hereby granted, free of charge, to any person obtaining a
50ef1b4d5b1a3af4ce7ae42ef4259d5db320724c5Bas Nieuwenhuizen * copy of this software and associated documentation files (the "Software"),
60ef1b4d5b1a3af4ce7ae42ef4259d5db320724c5Bas Nieuwenhuizen * to deal in the Software without restriction, including without limitation
70ef1b4d5b1a3af4ce7ae42ef4259d5db320724c5Bas Nieuwenhuizen * on the rights to use, copy, modify, merge, publish, distribute, sub
80ef1b4d5b1a3af4ce7ae42ef4259d5db320724c5Bas Nieuwenhuizen * license, and/or sell copies of the Software, and to permit persons to whom
90ef1b4d5b1a3af4ce7ae42ef4259d5db320724c5Bas Nieuwenhuizen * the Software is furnished to do so, subject to the following conditions:
100ef1b4d5b1a3af4ce7ae42ef4259d5db320724c5Bas Nieuwenhuizen *
110ef1b4d5b1a3af4ce7ae42ef4259d5db320724c5Bas Nieuwenhuizen * The above copyright notice and this permission notice (including the next
120ef1b4d5b1a3af4ce7ae42ef4259d5db320724c5Bas Nieuwenhuizen * paragraph) shall be included in all copies or substantial portions of the
130ef1b4d5b1a3af4ce7ae42ef4259d5db320724c5Bas Nieuwenhuizen * Software.
140ef1b4d5b1a3af4ce7ae42ef4259d5db320724c5Bas Nieuwenhuizen *
150ef1b4d5b1a3af4ce7ae42ef4259d5db320724c5Bas Nieuwenhuizen * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
160ef1b4d5b1a3af4ce7ae42ef4259d5db320724c5Bas Nieuwenhuizen * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
170ef1b4d5b1a3af4ce7ae42ef4259d5db320724c5Bas Nieuwenhuizen * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL
180ef1b4d5b1a3af4ce7ae42ef4259d5db320724c5Bas Nieuwenhuizen * THE AUTHOR(S) AND/OR THEIR SUPPLIERS BE LIABLE FOR ANY CLAIM,
190ef1b4d5b1a3af4ce7ae42ef4259d5db320724c5Bas Nieuwenhuizen * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
200ef1b4d5b1a3af4ce7ae42ef4259d5db320724c5Bas Nieuwenhuizen * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
210ef1b4d5b1a3af4ce7ae42ef4259d5db320724c5Bas Nieuwenhuizen * USE OR OTHER DEALINGS IN THE SOFTWARE.
220ef1b4d5b1a3af4ce7ae42ef4259d5db320724c5Bas Nieuwenhuizen *
230ef1b4d5b1a3af4ce7ae42ef4259d5db320724c5Bas Nieuwenhuizen * Authors:
240ef1b4d5b1a3af4ce7ae42ef4259d5db320724c5Bas Nieuwenhuizen *      Marek Olšák <maraeo@gmail.com>
250ef1b4d5b1a3af4ce7ae42ef4259d5db320724c5Bas Nieuwenhuizen */
260ef1b4d5b1a3af4ce7ae42ef4259d5db320724c5Bas Nieuwenhuizen
270ef1b4d5b1a3af4ce7ae42ef4259d5db320724c5Bas Nieuwenhuizen#include "ac_debug.h"
280ef1b4d5b1a3af4ce7ae42ef4259d5db320724c5Bas Nieuwenhuizen
290ef1b4d5b1a3af4ce7ae42ef4259d5db320724c5Bas Nieuwenhuizen#include "sid.h"
300ef1b4d5b1a3af4ce7ae42ef4259d5db320724c5Bas Nieuwenhuizen#include "sid_tables.h"
310ef1b4d5b1a3af4ce7ae42ef4259d5db320724c5Bas Nieuwenhuizen#include "util/u_math.h"
320ef1b4d5b1a3af4ce7ae42ef4259d5db320724c5Bas Nieuwenhuizen#include "util/u_memory.h"
330ef1b4d5b1a3af4ce7ae42ef4259d5db320724c5Bas Nieuwenhuizen
340ef1b4d5b1a3af4ce7ae42ef4259d5db320724c5Bas Nieuwenhuizen/* Parsed IBs are difficult to read without colors. Use "less -R file" to
350ef1b4d5b1a3af4ce7ae42ef4259d5db320724c5Bas Nieuwenhuizen * read them, or use "aha -b -f file" to convert them to html.
360ef1b4d5b1a3af4ce7ae42ef4259d5db320724c5Bas Nieuwenhuizen */
370ef1b4d5b1a3af4ce7ae42ef4259d5db320724c5Bas Nieuwenhuizen#define COLOR_RESET	"\033[0m"
380ef1b4d5b1a3af4ce7ae42ef4259d5db320724c5Bas Nieuwenhuizen#define COLOR_RED	"\033[31m"
390ef1b4d5b1a3af4ce7ae42ef4259d5db320724c5Bas Nieuwenhuizen#define COLOR_GREEN	"\033[1;32m"
400ef1b4d5b1a3af4ce7ae42ef4259d5db320724c5Bas Nieuwenhuizen#define COLOR_YELLOW	"\033[1;33m"
410ef1b4d5b1a3af4ce7ae42ef4259d5db320724c5Bas Nieuwenhuizen#define COLOR_CYAN	"\033[1;36m"
420ef1b4d5b1a3af4ce7ae42ef4259d5db320724c5Bas Nieuwenhuizen
430ef1b4d5b1a3af4ce7ae42ef4259d5db320724c5Bas Nieuwenhuizen#define INDENT_PKT 8
440ef1b4d5b1a3af4ce7ae42ef4259d5db320724c5Bas Nieuwenhuizen
450ef1b4d5b1a3af4ce7ae42ef4259d5db320724c5Bas Nieuwenhuizenstatic void print_spaces(FILE *f, unsigned num)
460ef1b4d5b1a3af4ce7ae42ef4259d5db320724c5Bas Nieuwenhuizen{
470ef1b4d5b1a3af4ce7ae42ef4259d5db320724c5Bas Nieuwenhuizen	fprintf(f, "%*s", num, "");
480ef1b4d5b1a3af4ce7ae42ef4259d5db320724c5Bas Nieuwenhuizen}
490ef1b4d5b1a3af4ce7ae42ef4259d5db320724c5Bas Nieuwenhuizen
500ef1b4d5b1a3af4ce7ae42ef4259d5db320724c5Bas Nieuwenhuizenstatic void print_value(FILE *file, uint32_t value, int bits)
510ef1b4d5b1a3af4ce7ae42ef4259d5db320724c5Bas Nieuwenhuizen{
520ef1b4d5b1a3af4ce7ae42ef4259d5db320724c5Bas Nieuwenhuizen	/* Guess if it's int or float */
530ef1b4d5b1a3af4ce7ae42ef4259d5db320724c5Bas Nieuwenhuizen	if (value <= (1 << 15)) {
540ef1b4d5b1a3af4ce7ae42ef4259d5db320724c5Bas Nieuwenhuizen		if (value <= 9)
550ef1b4d5b1a3af4ce7ae42ef4259d5db320724c5Bas Nieuwenhuizen			fprintf(file, "%u\n", value);
560ef1b4d5b1a3af4ce7ae42ef4259d5db320724c5Bas Nieuwenhuizen		else
570ef1b4d5b1a3af4ce7ae42ef4259d5db320724c5Bas Nieuwenhuizen			fprintf(file, "%u (0x%0*x)\n", value, bits / 4, value);
580ef1b4d5b1a3af4ce7ae42ef4259d5db320724c5Bas Nieuwenhuizen	} else {
590ef1b4d5b1a3af4ce7ae42ef4259d5db320724c5Bas Nieuwenhuizen		float f = uif(value);
600ef1b4d5b1a3af4ce7ae42ef4259d5db320724c5Bas Nieuwenhuizen
610ef1b4d5b1a3af4ce7ae42ef4259d5db320724c5Bas Nieuwenhuizen		if (fabs(f) < 100000 && f*10 == floor(f*10))
620ef1b4d5b1a3af4ce7ae42ef4259d5db320724c5Bas Nieuwenhuizen			fprintf(file, "%.1ff (0x%0*x)\n", f, bits / 4, value);
630ef1b4d5b1a3af4ce7ae42ef4259d5db320724c5Bas Nieuwenhuizen		else
640ef1b4d5b1a3af4ce7ae42ef4259d5db320724c5Bas Nieuwenhuizen			/* Don't print more leading zeros than there are bits. */
650ef1b4d5b1a3af4ce7ae42ef4259d5db320724c5Bas Nieuwenhuizen			fprintf(file, "0x%0*x\n", bits / 4, value);
660ef1b4d5b1a3af4ce7ae42ef4259d5db320724c5Bas Nieuwenhuizen	}
670ef1b4d5b1a3af4ce7ae42ef4259d5db320724c5Bas Nieuwenhuizen}
680ef1b4d5b1a3af4ce7ae42ef4259d5db320724c5Bas Nieuwenhuizen
690ef1b4d5b1a3af4ce7ae42ef4259d5db320724c5Bas Nieuwenhuizenstatic void print_named_value(FILE *file, const char *name, uint32_t value,
700ef1b4d5b1a3af4ce7ae42ef4259d5db320724c5Bas Nieuwenhuizen			      int bits)
710ef1b4d5b1a3af4ce7ae42ef4259d5db320724c5Bas Nieuwenhuizen{
720ef1b4d5b1a3af4ce7ae42ef4259d5db320724c5Bas Nieuwenhuizen	print_spaces(file, INDENT_PKT);
730ef1b4d5b1a3af4ce7ae42ef4259d5db320724c5Bas Nieuwenhuizen	fprintf(file, COLOR_YELLOW "%s" COLOR_RESET " <- ", name);
740ef1b4d5b1a3af4ce7ae42ef4259d5db320724c5Bas Nieuwenhuizen	print_value(file, value, bits);
750ef1b4d5b1a3af4ce7ae42ef4259d5db320724c5Bas Nieuwenhuizen}
760ef1b4d5b1a3af4ce7ae42ef4259d5db320724c5Bas Nieuwenhuizen
770ef1b4d5b1a3af4ce7ae42ef4259d5db320724c5Bas Nieuwenhuizenvoid ac_dump_reg(FILE *file, unsigned offset, uint32_t value,
780ef1b4d5b1a3af4ce7ae42ef4259d5db320724c5Bas Nieuwenhuizen		 uint32_t field_mask)
790ef1b4d5b1a3af4ce7ae42ef4259d5db320724c5Bas Nieuwenhuizen{
800ef1b4d5b1a3af4ce7ae42ef4259d5db320724c5Bas Nieuwenhuizen	int r, f;
810ef1b4d5b1a3af4ce7ae42ef4259d5db320724c5Bas Nieuwenhuizen
820ef1b4d5b1a3af4ce7ae42ef4259d5db320724c5Bas Nieuwenhuizen	for (r = 0; r < ARRAY_SIZE(sid_reg_table); r++) {
830ef1b4d5b1a3af4ce7ae42ef4259d5db320724c5Bas Nieuwenhuizen		const struct si_reg *reg = &sid_reg_table[r];
840ef1b4d5b1a3af4ce7ae42ef4259d5db320724c5Bas Nieuwenhuizen		const char *reg_name = sid_strings + reg->name_offset;
850ef1b4d5b1a3af4ce7ae42ef4259d5db320724c5Bas Nieuwenhuizen
860ef1b4d5b1a3af4ce7ae42ef4259d5db320724c5Bas Nieuwenhuizen		if (reg->offset == offset) {
870ef1b4d5b1a3af4ce7ae42ef4259d5db320724c5Bas Nieuwenhuizen			bool first_field = true;
880ef1b4d5b1a3af4ce7ae42ef4259d5db320724c5Bas Nieuwenhuizen
890ef1b4d5b1a3af4ce7ae42ef4259d5db320724c5Bas Nieuwenhuizen			print_spaces(file, INDENT_PKT);
900ef1b4d5b1a3af4ce7ae42ef4259d5db320724c5Bas Nieuwenhuizen			fprintf(file, COLOR_YELLOW "%s" COLOR_RESET " <- ",
910ef1b4d5b1a3af4ce7ae42ef4259d5db320724c5Bas Nieuwenhuizen				reg_name);
920ef1b4d5b1a3af4ce7ae42ef4259d5db320724c5Bas Nieuwenhuizen
930ef1b4d5b1a3af4ce7ae42ef4259d5db320724c5Bas Nieuwenhuizen			if (!reg->num_fields) {
940ef1b4d5b1a3af4ce7ae42ef4259d5db320724c5Bas Nieuwenhuizen				print_value(file, value, 32);
950ef1b4d5b1a3af4ce7ae42ef4259d5db320724c5Bas Nieuwenhuizen				return;
960ef1b4d5b1a3af4ce7ae42ef4259d5db320724c5Bas Nieuwenhuizen			}
970ef1b4d5b1a3af4ce7ae42ef4259d5db320724c5Bas Nieuwenhuizen
980ef1b4d5b1a3af4ce7ae42ef4259d5db320724c5Bas Nieuwenhuizen			for (f = 0; f < reg->num_fields; f++) {
990ef1b4d5b1a3af4ce7ae42ef4259d5db320724c5Bas Nieuwenhuizen				const struct si_field *field = sid_fields_table + reg->fields_offset + f;
1000ef1b4d5b1a3af4ce7ae42ef4259d5db320724c5Bas Nieuwenhuizen				const int *values_offsets = sid_strings_offsets + field->values_offset;
1010ef1b4d5b1a3af4ce7ae42ef4259d5db320724c5Bas Nieuwenhuizen				uint32_t val = (value & field->mask) >>
1020ef1b4d5b1a3af4ce7ae42ef4259d5db320724c5Bas Nieuwenhuizen					       (ffs(field->mask) - 1);
1030ef1b4d5b1a3af4ce7ae42ef4259d5db320724c5Bas Nieuwenhuizen
1040ef1b4d5b1a3af4ce7ae42ef4259d5db320724c5Bas Nieuwenhuizen				if (!(field->mask & field_mask))
1050ef1b4d5b1a3af4ce7ae42ef4259d5db320724c5Bas Nieuwenhuizen					continue;
1060ef1b4d5b1a3af4ce7ae42ef4259d5db320724c5Bas Nieuwenhuizen
1070ef1b4d5b1a3af4ce7ae42ef4259d5db320724c5Bas Nieuwenhuizen				/* Indent the field. */
1080ef1b4d5b1a3af4ce7ae42ef4259d5db320724c5Bas Nieuwenhuizen				if (!first_field)
1090ef1b4d5b1a3af4ce7ae42ef4259d5db320724c5Bas Nieuwenhuizen					print_spaces(file,
1100ef1b4d5b1a3af4ce7ae42ef4259d5db320724c5Bas Nieuwenhuizen						     INDENT_PKT + strlen(reg_name) + 4);
1110ef1b4d5b1a3af4ce7ae42ef4259d5db320724c5Bas Nieuwenhuizen
1120ef1b4d5b1a3af4ce7ae42ef4259d5db320724c5Bas Nieuwenhuizen				/* Print the field. */
1130ef1b4d5b1a3af4ce7ae42ef4259d5db320724c5Bas Nieuwenhuizen				fprintf(file, "%s = ", sid_strings + field->name_offset);
1140ef1b4d5b1a3af4ce7ae42ef4259d5db320724c5Bas Nieuwenhuizen
1150ef1b4d5b1a3af4ce7ae42ef4259d5db320724c5Bas Nieuwenhuizen				if (val < field->num_values && values_offsets[val] >= 0)
1160ef1b4d5b1a3af4ce7ae42ef4259d5db320724c5Bas Nieuwenhuizen					fprintf(file, "%s\n", sid_strings + values_offsets[val]);
1170ef1b4d5b1a3af4ce7ae42ef4259d5db320724c5Bas Nieuwenhuizen				else
1180ef1b4d5b1a3af4ce7ae42ef4259d5db320724c5Bas Nieuwenhuizen					print_value(file, val,
1190ef1b4d5b1a3af4ce7ae42ef4259d5db320724c5Bas Nieuwenhuizen						    util_bitcount(field->mask));
1200ef1b4d5b1a3af4ce7ae42ef4259d5db320724c5Bas Nieuwenhuizen
1210ef1b4d5b1a3af4ce7ae42ef4259d5db320724c5Bas Nieuwenhuizen				first_field = false;
1220ef1b4d5b1a3af4ce7ae42ef4259d5db320724c5Bas Nieuwenhuizen			}
1230ef1b4d5b1a3af4ce7ae42ef4259d5db320724c5Bas Nieuwenhuizen			return;
1240ef1b4d5b1a3af4ce7ae42ef4259d5db320724c5Bas Nieuwenhuizen		}
1250ef1b4d5b1a3af4ce7ae42ef4259d5db320724c5Bas Nieuwenhuizen	}
1260ef1b4d5b1a3af4ce7ae42ef4259d5db320724c5Bas Nieuwenhuizen
1270ef1b4d5b1a3af4ce7ae42ef4259d5db320724c5Bas Nieuwenhuizen	print_spaces(file, INDENT_PKT);
1280ef1b4d5b1a3af4ce7ae42ef4259d5db320724c5Bas Nieuwenhuizen	fprintf(file, COLOR_YELLOW "0x%05x" COLOR_RESET " <- 0x%08x\n", offset, value);
1290ef1b4d5b1a3af4ce7ae42ef4259d5db320724c5Bas Nieuwenhuizen}
1300ef1b4d5b1a3af4ce7ae42ef4259d5db320724c5Bas Nieuwenhuizen
1310ef1b4d5b1a3af4ce7ae42ef4259d5db320724c5Bas Nieuwenhuizenstatic void ac_parse_set_reg_packet(FILE *f, uint32_t *ib, unsigned count,
1320ef1b4d5b1a3af4ce7ae42ef4259d5db320724c5Bas Nieuwenhuizen				    unsigned reg_offset)
1330ef1b4d5b1a3af4ce7ae42ef4259d5db320724c5Bas Nieuwenhuizen{
1340ef1b4d5b1a3af4ce7ae42ef4259d5db320724c5Bas Nieuwenhuizen	unsigned reg = (ib[1] << 2) + reg_offset;
1350ef1b4d5b1a3af4ce7ae42ef4259d5db320724c5Bas Nieuwenhuizen	int i;
1360ef1b4d5b1a3af4ce7ae42ef4259d5db320724c5Bas Nieuwenhuizen
1370ef1b4d5b1a3af4ce7ae42ef4259d5db320724c5Bas Nieuwenhuizen	for (i = 0; i < count; i++)
1380ef1b4d5b1a3af4ce7ae42ef4259d5db320724c5Bas Nieuwenhuizen		ac_dump_reg(f, reg + i*4, ib[2+i], ~0);
1390ef1b4d5b1a3af4ce7ae42ef4259d5db320724c5Bas Nieuwenhuizen}
1400ef1b4d5b1a3af4ce7ae42ef4259d5db320724c5Bas Nieuwenhuizen
1410ef1b4d5b1a3af4ce7ae42ef4259d5db320724c5Bas Nieuwenhuizenstatic uint32_t *ac_parse_packet3(FILE *f, uint32_t *ib, int *num_dw,
1428cb60c7dd3cb608615d3e5f89ad4198c0babdb3dBas Nieuwenhuizen				  int trace_id, enum chip_class chip_class,
1438cb60c7dd3cb608615d3e5f89ad4198c0babdb3dBas Nieuwenhuizen				  ac_debug_addr_callback addr_callback,
1448cb60c7dd3cb608615d3e5f89ad4198c0babdb3dBas Nieuwenhuizen				  void *addr_callback_data)
1450ef1b4d5b1a3af4ce7ae42ef4259d5db320724c5Bas Nieuwenhuizen{
1460ef1b4d5b1a3af4ce7ae42ef4259d5db320724c5Bas Nieuwenhuizen	unsigned count = PKT_COUNT_G(ib[0]);
1470ef1b4d5b1a3af4ce7ae42ef4259d5db320724c5Bas Nieuwenhuizen	unsigned op = PKT3_IT_OPCODE_G(ib[0]);
1480ef1b4d5b1a3af4ce7ae42ef4259d5db320724c5Bas Nieuwenhuizen	const char *predicate = PKT3_PREDICATE(ib[0]) ? "(predicate)" : "";
1490ef1b4d5b1a3af4ce7ae42ef4259d5db320724c5Bas Nieuwenhuizen	int i;
1500ef1b4d5b1a3af4ce7ae42ef4259d5db320724c5Bas Nieuwenhuizen
1510ef1b4d5b1a3af4ce7ae42ef4259d5db320724c5Bas Nieuwenhuizen	/* Print the name first. */
1520ef1b4d5b1a3af4ce7ae42ef4259d5db320724c5Bas Nieuwenhuizen	for (i = 0; i < ARRAY_SIZE(packet3_table); i++)
1530ef1b4d5b1a3af4ce7ae42ef4259d5db320724c5Bas Nieuwenhuizen		if (packet3_table[i].op == op)
1540ef1b4d5b1a3af4ce7ae42ef4259d5db320724c5Bas Nieuwenhuizen			break;
1550ef1b4d5b1a3af4ce7ae42ef4259d5db320724c5Bas Nieuwenhuizen
1560ef1b4d5b1a3af4ce7ae42ef4259d5db320724c5Bas Nieuwenhuizen	if (i < ARRAY_SIZE(packet3_table)) {
1570ef1b4d5b1a3af4ce7ae42ef4259d5db320724c5Bas Nieuwenhuizen		const char *name = sid_strings + packet3_table[i].name_offset;
1580ef1b4d5b1a3af4ce7ae42ef4259d5db320724c5Bas Nieuwenhuizen
1590ef1b4d5b1a3af4ce7ae42ef4259d5db320724c5Bas Nieuwenhuizen		if (op == PKT3_SET_CONTEXT_REG ||
1600ef1b4d5b1a3af4ce7ae42ef4259d5db320724c5Bas Nieuwenhuizen		    op == PKT3_SET_CONFIG_REG ||
1610ef1b4d5b1a3af4ce7ae42ef4259d5db320724c5Bas Nieuwenhuizen		    op == PKT3_SET_UCONFIG_REG ||
1620ef1b4d5b1a3af4ce7ae42ef4259d5db320724c5Bas Nieuwenhuizen		    op == PKT3_SET_SH_REG)
1630ef1b4d5b1a3af4ce7ae42ef4259d5db320724c5Bas Nieuwenhuizen			fprintf(f, COLOR_CYAN "%s%s" COLOR_CYAN ":\n",
1640ef1b4d5b1a3af4ce7ae42ef4259d5db320724c5Bas Nieuwenhuizen				name, predicate);
1650ef1b4d5b1a3af4ce7ae42ef4259d5db320724c5Bas Nieuwenhuizen		else
1660ef1b4d5b1a3af4ce7ae42ef4259d5db320724c5Bas Nieuwenhuizen			fprintf(f, COLOR_GREEN "%s%s" COLOR_RESET ":\n",
1670ef1b4d5b1a3af4ce7ae42ef4259d5db320724c5Bas Nieuwenhuizen				name, predicate);
1680ef1b4d5b1a3af4ce7ae42ef4259d5db320724c5Bas Nieuwenhuizen	} else
1690ef1b4d5b1a3af4ce7ae42ef4259d5db320724c5Bas Nieuwenhuizen		fprintf(f, COLOR_RED "PKT3_UNKNOWN 0x%x%s" COLOR_RESET ":\n",
1700ef1b4d5b1a3af4ce7ae42ef4259d5db320724c5Bas Nieuwenhuizen			op, predicate);
1710ef1b4d5b1a3af4ce7ae42ef4259d5db320724c5Bas Nieuwenhuizen
1720ef1b4d5b1a3af4ce7ae42ef4259d5db320724c5Bas Nieuwenhuizen	/* Print the contents. */
1730ef1b4d5b1a3af4ce7ae42ef4259d5db320724c5Bas Nieuwenhuizen	switch (op) {
1740ef1b4d5b1a3af4ce7ae42ef4259d5db320724c5Bas Nieuwenhuizen	case PKT3_SET_CONTEXT_REG:
1750ef1b4d5b1a3af4ce7ae42ef4259d5db320724c5Bas Nieuwenhuizen		ac_parse_set_reg_packet(f, ib, count, SI_CONTEXT_REG_OFFSET);
1760ef1b4d5b1a3af4ce7ae42ef4259d5db320724c5Bas Nieuwenhuizen		break;
1770ef1b4d5b1a3af4ce7ae42ef4259d5db320724c5Bas Nieuwenhuizen	case PKT3_SET_CONFIG_REG:
1780ef1b4d5b1a3af4ce7ae42ef4259d5db320724c5Bas Nieuwenhuizen		ac_parse_set_reg_packet(f, ib, count, SI_CONFIG_REG_OFFSET);
1790ef1b4d5b1a3af4ce7ae42ef4259d5db320724c5Bas Nieuwenhuizen		break;
1800ef1b4d5b1a3af4ce7ae42ef4259d5db320724c5Bas Nieuwenhuizen	case PKT3_SET_UCONFIG_REG:
1810ef1b4d5b1a3af4ce7ae42ef4259d5db320724c5Bas Nieuwenhuizen		ac_parse_set_reg_packet(f, ib, count, CIK_UCONFIG_REG_OFFSET);
1820ef1b4d5b1a3af4ce7ae42ef4259d5db320724c5Bas Nieuwenhuizen		break;
1830ef1b4d5b1a3af4ce7ae42ef4259d5db320724c5Bas Nieuwenhuizen	case PKT3_SET_SH_REG:
1840ef1b4d5b1a3af4ce7ae42ef4259d5db320724c5Bas Nieuwenhuizen		ac_parse_set_reg_packet(f, ib, count, SI_SH_REG_OFFSET);
1850ef1b4d5b1a3af4ce7ae42ef4259d5db320724c5Bas Nieuwenhuizen		break;
1860ef1b4d5b1a3af4ce7ae42ef4259d5db320724c5Bas Nieuwenhuizen	case PKT3_ACQUIRE_MEM:
1870ef1b4d5b1a3af4ce7ae42ef4259d5db320724c5Bas Nieuwenhuizen		ac_dump_reg(f, R_0301F0_CP_COHER_CNTL, ib[1], ~0);
1880ef1b4d5b1a3af4ce7ae42ef4259d5db320724c5Bas Nieuwenhuizen		ac_dump_reg(f, R_0301F4_CP_COHER_SIZE, ib[2], ~0);
1890ef1b4d5b1a3af4ce7ae42ef4259d5db320724c5Bas Nieuwenhuizen		ac_dump_reg(f, R_030230_CP_COHER_SIZE_HI, ib[3], ~0);
1900ef1b4d5b1a3af4ce7ae42ef4259d5db320724c5Bas Nieuwenhuizen		ac_dump_reg(f, R_0301F8_CP_COHER_BASE, ib[4], ~0);
1910ef1b4d5b1a3af4ce7ae42ef4259d5db320724c5Bas Nieuwenhuizen		ac_dump_reg(f, R_0301E4_CP_COHER_BASE_HI, ib[5], ~0);
1920ef1b4d5b1a3af4ce7ae42ef4259d5db320724c5Bas Nieuwenhuizen		print_named_value(f, "POLL_INTERVAL", ib[6], 16);
1930ef1b4d5b1a3af4ce7ae42ef4259d5db320724c5Bas Nieuwenhuizen		break;
1940ef1b4d5b1a3af4ce7ae42ef4259d5db320724c5Bas Nieuwenhuizen	case PKT3_SURFACE_SYNC:
1950ef1b4d5b1a3af4ce7ae42ef4259d5db320724c5Bas Nieuwenhuizen		if (chip_class >= CIK) {
1960ef1b4d5b1a3af4ce7ae42ef4259d5db320724c5Bas Nieuwenhuizen			ac_dump_reg(f, R_0301F0_CP_COHER_CNTL, ib[1], ~0);
1970ef1b4d5b1a3af4ce7ae42ef4259d5db320724c5Bas Nieuwenhuizen			ac_dump_reg(f, R_0301F4_CP_COHER_SIZE, ib[2], ~0);
1980ef1b4d5b1a3af4ce7ae42ef4259d5db320724c5Bas Nieuwenhuizen			ac_dump_reg(f, R_0301F8_CP_COHER_BASE, ib[3], ~0);
1990ef1b4d5b1a3af4ce7ae42ef4259d5db320724c5Bas Nieuwenhuizen		} else {
2000ef1b4d5b1a3af4ce7ae42ef4259d5db320724c5Bas Nieuwenhuizen			ac_dump_reg(f, R_0085F0_CP_COHER_CNTL, ib[1], ~0);
2010ef1b4d5b1a3af4ce7ae42ef4259d5db320724c5Bas Nieuwenhuizen			ac_dump_reg(f, R_0085F4_CP_COHER_SIZE, ib[2], ~0);
2020ef1b4d5b1a3af4ce7ae42ef4259d5db320724c5Bas Nieuwenhuizen			ac_dump_reg(f, R_0085F8_CP_COHER_BASE, ib[3], ~0);
2030ef1b4d5b1a3af4ce7ae42ef4259d5db320724c5Bas Nieuwenhuizen		}
2040ef1b4d5b1a3af4ce7ae42ef4259d5db320724c5Bas Nieuwenhuizen		print_named_value(f, "POLL_INTERVAL", ib[4], 16);
2050ef1b4d5b1a3af4ce7ae42ef4259d5db320724c5Bas Nieuwenhuizen		break;
2060ef1b4d5b1a3af4ce7ae42ef4259d5db320724c5Bas Nieuwenhuizen	case PKT3_EVENT_WRITE:
2070ef1b4d5b1a3af4ce7ae42ef4259d5db320724c5Bas Nieuwenhuizen		ac_dump_reg(f, R_028A90_VGT_EVENT_INITIATOR, ib[1],
2080ef1b4d5b1a3af4ce7ae42ef4259d5db320724c5Bas Nieuwenhuizen			    S_028A90_EVENT_TYPE(~0));
2090ef1b4d5b1a3af4ce7ae42ef4259d5db320724c5Bas Nieuwenhuizen		print_named_value(f, "EVENT_INDEX", (ib[1] >> 8) & 0xf, 4);
2100ef1b4d5b1a3af4ce7ae42ef4259d5db320724c5Bas Nieuwenhuizen		print_named_value(f, "INV_L2", (ib[1] >> 20) & 0x1, 1);
2110ef1b4d5b1a3af4ce7ae42ef4259d5db320724c5Bas Nieuwenhuizen		if (count > 0) {
2120ef1b4d5b1a3af4ce7ae42ef4259d5db320724c5Bas Nieuwenhuizen			print_named_value(f, "ADDRESS_LO", ib[2], 32);
2130ef1b4d5b1a3af4ce7ae42ef4259d5db320724c5Bas Nieuwenhuizen			print_named_value(f, "ADDRESS_HI", ib[3], 16);
2140ef1b4d5b1a3af4ce7ae42ef4259d5db320724c5Bas Nieuwenhuizen		}
2150ef1b4d5b1a3af4ce7ae42ef4259d5db320724c5Bas Nieuwenhuizen		break;
2160ef1b4d5b1a3af4ce7ae42ef4259d5db320724c5Bas Nieuwenhuizen	case PKT3_DRAW_INDEX_AUTO:
2170ef1b4d5b1a3af4ce7ae42ef4259d5db320724c5Bas Nieuwenhuizen		ac_dump_reg(f, R_030930_VGT_NUM_INDICES, ib[1], ~0);
2180ef1b4d5b1a3af4ce7ae42ef4259d5db320724c5Bas Nieuwenhuizen		ac_dump_reg(f, R_0287F0_VGT_DRAW_INITIATOR, ib[2], ~0);
2190ef1b4d5b1a3af4ce7ae42ef4259d5db320724c5Bas Nieuwenhuizen		break;
2200ef1b4d5b1a3af4ce7ae42ef4259d5db320724c5Bas Nieuwenhuizen	case PKT3_DRAW_INDEX_2:
2210ef1b4d5b1a3af4ce7ae42ef4259d5db320724c5Bas Nieuwenhuizen		ac_dump_reg(f, R_028A78_VGT_DMA_MAX_SIZE, ib[1], ~0);
2220ef1b4d5b1a3af4ce7ae42ef4259d5db320724c5Bas Nieuwenhuizen		ac_dump_reg(f, R_0287E8_VGT_DMA_BASE, ib[2], ~0);
2230ef1b4d5b1a3af4ce7ae42ef4259d5db320724c5Bas Nieuwenhuizen		ac_dump_reg(f, R_0287E4_VGT_DMA_BASE_HI, ib[3], ~0);
2240ef1b4d5b1a3af4ce7ae42ef4259d5db320724c5Bas Nieuwenhuizen		ac_dump_reg(f, R_030930_VGT_NUM_INDICES, ib[4], ~0);
2250ef1b4d5b1a3af4ce7ae42ef4259d5db320724c5Bas Nieuwenhuizen		ac_dump_reg(f, R_0287F0_VGT_DRAW_INITIATOR, ib[5], ~0);
2260ef1b4d5b1a3af4ce7ae42ef4259d5db320724c5Bas Nieuwenhuizen		break;
2270ef1b4d5b1a3af4ce7ae42ef4259d5db320724c5Bas Nieuwenhuizen	case PKT3_INDEX_TYPE:
2280ef1b4d5b1a3af4ce7ae42ef4259d5db320724c5Bas Nieuwenhuizen		ac_dump_reg(f, R_028A7C_VGT_DMA_INDEX_TYPE, ib[1], ~0);
2290ef1b4d5b1a3af4ce7ae42ef4259d5db320724c5Bas Nieuwenhuizen		break;
2300ef1b4d5b1a3af4ce7ae42ef4259d5db320724c5Bas Nieuwenhuizen	case PKT3_NUM_INSTANCES:
2310ef1b4d5b1a3af4ce7ae42ef4259d5db320724c5Bas Nieuwenhuizen		ac_dump_reg(f, R_030934_VGT_NUM_INSTANCES, ib[1], ~0);
2320ef1b4d5b1a3af4ce7ae42ef4259d5db320724c5Bas Nieuwenhuizen		break;
2330ef1b4d5b1a3af4ce7ae42ef4259d5db320724c5Bas Nieuwenhuizen	case PKT3_WRITE_DATA:
2340ef1b4d5b1a3af4ce7ae42ef4259d5db320724c5Bas Nieuwenhuizen		ac_dump_reg(f, R_370_CONTROL, ib[1], ~0);
2350ef1b4d5b1a3af4ce7ae42ef4259d5db320724c5Bas Nieuwenhuizen		ac_dump_reg(f, R_371_DST_ADDR_LO, ib[2], ~0);
2360ef1b4d5b1a3af4ce7ae42ef4259d5db320724c5Bas Nieuwenhuizen		ac_dump_reg(f, R_372_DST_ADDR_HI, ib[3], ~0);
2370ef1b4d5b1a3af4ce7ae42ef4259d5db320724c5Bas Nieuwenhuizen		for (i = 2; i < count; i++) {
2380ef1b4d5b1a3af4ce7ae42ef4259d5db320724c5Bas Nieuwenhuizen			print_spaces(f, INDENT_PKT);
2390ef1b4d5b1a3af4ce7ae42ef4259d5db320724c5Bas Nieuwenhuizen			fprintf(f, "0x%08x\n", ib[2+i]);
2400ef1b4d5b1a3af4ce7ae42ef4259d5db320724c5Bas Nieuwenhuizen		}
2410ef1b4d5b1a3af4ce7ae42ef4259d5db320724c5Bas Nieuwenhuizen		break;
2420ef1b4d5b1a3af4ce7ae42ef4259d5db320724c5Bas Nieuwenhuizen	case PKT3_CP_DMA:
2430ef1b4d5b1a3af4ce7ae42ef4259d5db320724c5Bas Nieuwenhuizen		ac_dump_reg(f, R_410_CP_DMA_WORD0, ib[1], ~0);
2440ef1b4d5b1a3af4ce7ae42ef4259d5db320724c5Bas Nieuwenhuizen		ac_dump_reg(f, R_411_CP_DMA_WORD1, ib[2], ~0);
2450ef1b4d5b1a3af4ce7ae42ef4259d5db320724c5Bas Nieuwenhuizen		ac_dump_reg(f, R_412_CP_DMA_WORD2, ib[3], ~0);
2460ef1b4d5b1a3af4ce7ae42ef4259d5db320724c5Bas Nieuwenhuizen		ac_dump_reg(f, R_413_CP_DMA_WORD3, ib[4], ~0);
2470ef1b4d5b1a3af4ce7ae42ef4259d5db320724c5Bas Nieuwenhuizen		ac_dump_reg(f, R_414_COMMAND, ib[5], ~0);
2480ef1b4d5b1a3af4ce7ae42ef4259d5db320724c5Bas Nieuwenhuizen		break;
2490ef1b4d5b1a3af4ce7ae42ef4259d5db320724c5Bas Nieuwenhuizen	case PKT3_DMA_DATA:
2500ef1b4d5b1a3af4ce7ae42ef4259d5db320724c5Bas Nieuwenhuizen		ac_dump_reg(f, R_500_DMA_DATA_WORD0, ib[1], ~0);
2510ef1b4d5b1a3af4ce7ae42ef4259d5db320724c5Bas Nieuwenhuizen		ac_dump_reg(f, R_501_SRC_ADDR_LO, ib[2], ~0);
2520ef1b4d5b1a3af4ce7ae42ef4259d5db320724c5Bas Nieuwenhuizen		ac_dump_reg(f, R_502_SRC_ADDR_HI, ib[3], ~0);
2530ef1b4d5b1a3af4ce7ae42ef4259d5db320724c5Bas Nieuwenhuizen		ac_dump_reg(f, R_503_DST_ADDR_LO, ib[4], ~0);
2540ef1b4d5b1a3af4ce7ae42ef4259d5db320724c5Bas Nieuwenhuizen		ac_dump_reg(f, R_504_DST_ADDR_HI, ib[5], ~0);
2550ef1b4d5b1a3af4ce7ae42ef4259d5db320724c5Bas Nieuwenhuizen		ac_dump_reg(f, R_414_COMMAND, ib[6], ~0);
2560ef1b4d5b1a3af4ce7ae42ef4259d5db320724c5Bas Nieuwenhuizen		break;
2570ef1b4d5b1a3af4ce7ae42ef4259d5db320724c5Bas Nieuwenhuizen	case PKT3_INDIRECT_BUFFER_SI:
2580ef1b4d5b1a3af4ce7ae42ef4259d5db320724c5Bas Nieuwenhuizen	case PKT3_INDIRECT_BUFFER_CONST:
2590ef1b4d5b1a3af4ce7ae42ef4259d5db320724c5Bas Nieuwenhuizen	case PKT3_INDIRECT_BUFFER_CIK:
2600ef1b4d5b1a3af4ce7ae42ef4259d5db320724c5Bas Nieuwenhuizen		ac_dump_reg(f, R_3F0_IB_BASE_LO, ib[1], ~0);
2610ef1b4d5b1a3af4ce7ae42ef4259d5db320724c5Bas Nieuwenhuizen		ac_dump_reg(f, R_3F1_IB_BASE_HI, ib[2], ~0);
2620ef1b4d5b1a3af4ce7ae42ef4259d5db320724c5Bas Nieuwenhuizen		ac_dump_reg(f, R_3F2_CONTROL, ib[3], ~0);
2638cb60c7dd3cb608615d3e5f89ad4198c0babdb3dBas Nieuwenhuizen
2648cb60c7dd3cb608615d3e5f89ad4198c0babdb3dBas Nieuwenhuizen		if (addr_callback) {
2658cb60c7dd3cb608615d3e5f89ad4198c0babdb3dBas Nieuwenhuizen			uint64_t addr = ((uint64_t)ib[2] << 32) | ib[1];
2668cb60c7dd3cb608615d3e5f89ad4198c0babdb3dBas Nieuwenhuizen			void *data = addr_callback(addr_callback_data, addr);
2678cb60c7dd3cb608615d3e5f89ad4198c0babdb3dBas Nieuwenhuizen			const char *name = G_3F2_CHAIN(ib[3]) ? "chained" : "nested";
2688cb60c7dd3cb608615d3e5f89ad4198c0babdb3dBas Nieuwenhuizen
2698cb60c7dd3cb608615d3e5f89ad4198c0babdb3dBas Nieuwenhuizen			if (data)
2708cb60c7dd3cb608615d3e5f89ad4198c0babdb3dBas Nieuwenhuizen				ac_parse_ib(f, data,  G_3F2_IB_SIZE(ib[3]),
2718cb60c7dd3cb608615d3e5f89ad4198c0babdb3dBas Nieuwenhuizen					    trace_id, name, chip_class,
2728cb60c7dd3cb608615d3e5f89ad4198c0babdb3dBas Nieuwenhuizen					    addr_callback, addr_callback_data);
2738cb60c7dd3cb608615d3e5f89ad4198c0babdb3dBas Nieuwenhuizen		}
2740ef1b4d5b1a3af4ce7ae42ef4259d5db320724c5Bas Nieuwenhuizen		break;
2750ef1b4d5b1a3af4ce7ae42ef4259d5db320724c5Bas Nieuwenhuizen	case PKT3_CLEAR_STATE:
2760ef1b4d5b1a3af4ce7ae42ef4259d5db320724c5Bas Nieuwenhuizen	case PKT3_INCREMENT_DE_COUNTER:
2770ef1b4d5b1a3af4ce7ae42ef4259d5db320724c5Bas Nieuwenhuizen	case PKT3_PFP_SYNC_ME:
2780ef1b4d5b1a3af4ce7ae42ef4259d5db320724c5Bas Nieuwenhuizen		break;
2790ef1b4d5b1a3af4ce7ae42ef4259d5db320724c5Bas Nieuwenhuizen	case PKT3_NOP:
2800ef1b4d5b1a3af4ce7ae42ef4259d5db320724c5Bas Nieuwenhuizen		if (ib[0] == 0xffff1000) {
2810ef1b4d5b1a3af4ce7ae42ef4259d5db320724c5Bas Nieuwenhuizen			count = -1; /* One dword NOP. */
2820ef1b4d5b1a3af4ce7ae42ef4259d5db320724c5Bas Nieuwenhuizen			break;
2830ef1b4d5b1a3af4ce7ae42ef4259d5db320724c5Bas Nieuwenhuizen		} else if (count == 0 && AC_IS_TRACE_POINT(ib[1])) {
2840ef1b4d5b1a3af4ce7ae42ef4259d5db320724c5Bas Nieuwenhuizen			unsigned packet_id = AC_GET_TRACE_POINT_ID(ib[1]);
2850ef1b4d5b1a3af4ce7ae42ef4259d5db320724c5Bas Nieuwenhuizen
2860ef1b4d5b1a3af4ce7ae42ef4259d5db320724c5Bas Nieuwenhuizen			print_spaces(f, INDENT_PKT);
2870ef1b4d5b1a3af4ce7ae42ef4259d5db320724c5Bas Nieuwenhuizen			fprintf(f, COLOR_RED "Trace point ID: %u\n", packet_id);
2880ef1b4d5b1a3af4ce7ae42ef4259d5db320724c5Bas Nieuwenhuizen
2890ef1b4d5b1a3af4ce7ae42ef4259d5db320724c5Bas Nieuwenhuizen			if (trace_id == -1)
2900ef1b4d5b1a3af4ce7ae42ef4259d5db320724c5Bas Nieuwenhuizen				break; /* tracing was disabled */
2910ef1b4d5b1a3af4ce7ae42ef4259d5db320724c5Bas Nieuwenhuizen
2920ef1b4d5b1a3af4ce7ae42ef4259d5db320724c5Bas Nieuwenhuizen			print_spaces(f, INDENT_PKT);
2930ef1b4d5b1a3af4ce7ae42ef4259d5db320724c5Bas Nieuwenhuizen			if (packet_id < trace_id)
2940ef1b4d5b1a3af4ce7ae42ef4259d5db320724c5Bas Nieuwenhuizen				fprintf(f, COLOR_RED
2950ef1b4d5b1a3af4ce7ae42ef4259d5db320724c5Bas Nieuwenhuizen					"This trace point was reached by the CP."
2960ef1b4d5b1a3af4ce7ae42ef4259d5db320724c5Bas Nieuwenhuizen					COLOR_RESET "\n");
2970ef1b4d5b1a3af4ce7ae42ef4259d5db320724c5Bas Nieuwenhuizen			else if (packet_id == trace_id)
2980ef1b4d5b1a3af4ce7ae42ef4259d5db320724c5Bas Nieuwenhuizen				fprintf(f, COLOR_RED
2990ef1b4d5b1a3af4ce7ae42ef4259d5db320724c5Bas Nieuwenhuizen					"!!!!! This is the last trace point that "
3000ef1b4d5b1a3af4ce7ae42ef4259d5db320724c5Bas Nieuwenhuizen					"was reached by the CP !!!!!"
3010ef1b4d5b1a3af4ce7ae42ef4259d5db320724c5Bas Nieuwenhuizen					COLOR_RESET "\n");
3020ef1b4d5b1a3af4ce7ae42ef4259d5db320724c5Bas Nieuwenhuizen			else if (packet_id+1 == trace_id)
3030ef1b4d5b1a3af4ce7ae42ef4259d5db320724c5Bas Nieuwenhuizen				fprintf(f, COLOR_RED
3040ef1b4d5b1a3af4ce7ae42ef4259d5db320724c5Bas Nieuwenhuizen					"!!!!! This is the first trace point that "
3050ef1b4d5b1a3af4ce7ae42ef4259d5db320724c5Bas Nieuwenhuizen					"was NOT been reached by the CP !!!!!"
3060ef1b4d5b1a3af4ce7ae42ef4259d5db320724c5Bas Nieuwenhuizen					COLOR_RESET "\n");
3070ef1b4d5b1a3af4ce7ae42ef4259d5db320724c5Bas Nieuwenhuizen			else
3080ef1b4d5b1a3af4ce7ae42ef4259d5db320724c5Bas Nieuwenhuizen				fprintf(f, COLOR_RED
3090ef1b4d5b1a3af4ce7ae42ef4259d5db320724c5Bas Nieuwenhuizen					"!!!!! This trace point was NOT reached "
3100ef1b4d5b1a3af4ce7ae42ef4259d5db320724c5Bas Nieuwenhuizen					"by the CP !!!!!"
3110ef1b4d5b1a3af4ce7ae42ef4259d5db320724c5Bas Nieuwenhuizen					COLOR_RESET "\n");
3120ef1b4d5b1a3af4ce7ae42ef4259d5db320724c5Bas Nieuwenhuizen			break;
3130ef1b4d5b1a3af4ce7ae42ef4259d5db320724c5Bas Nieuwenhuizen		}
3140ef1b4d5b1a3af4ce7ae42ef4259d5db320724c5Bas Nieuwenhuizen		/* fall through, print all dwords */
3150ef1b4d5b1a3af4ce7ae42ef4259d5db320724c5Bas Nieuwenhuizen	default:
3160ef1b4d5b1a3af4ce7ae42ef4259d5db320724c5Bas Nieuwenhuizen		for (i = 0; i < count+1; i++) {
3170ef1b4d5b1a3af4ce7ae42ef4259d5db320724c5Bas Nieuwenhuizen			print_spaces(f, INDENT_PKT);
3180ef1b4d5b1a3af4ce7ae42ef4259d5db320724c5Bas Nieuwenhuizen			fprintf(f, "0x%08x\n", ib[1+i]);
3190ef1b4d5b1a3af4ce7ae42ef4259d5db320724c5Bas Nieuwenhuizen		}
3200ef1b4d5b1a3af4ce7ae42ef4259d5db320724c5Bas Nieuwenhuizen	}
3210ef1b4d5b1a3af4ce7ae42ef4259d5db320724c5Bas Nieuwenhuizen
3220ef1b4d5b1a3af4ce7ae42ef4259d5db320724c5Bas Nieuwenhuizen	ib += count + 2;
3230ef1b4d5b1a3af4ce7ae42ef4259d5db320724c5Bas Nieuwenhuizen	*num_dw -= count + 2;
3240ef1b4d5b1a3af4ce7ae42ef4259d5db320724c5Bas Nieuwenhuizen	return ib;
3250ef1b4d5b1a3af4ce7ae42ef4259d5db320724c5Bas Nieuwenhuizen}
3260ef1b4d5b1a3af4ce7ae42ef4259d5db320724c5Bas Nieuwenhuizen
3270ef1b4d5b1a3af4ce7ae42ef4259d5db320724c5Bas Nieuwenhuizen/**
3280ef1b4d5b1a3af4ce7ae42ef4259d5db320724c5Bas Nieuwenhuizen * Parse and print an IB into a file.
3290ef1b4d5b1a3af4ce7ae42ef4259d5db320724c5Bas Nieuwenhuizen *
3300ef1b4d5b1a3af4ce7ae42ef4259d5db320724c5Bas Nieuwenhuizen * \param f		file
3310ef1b4d5b1a3af4ce7ae42ef4259d5db320724c5Bas Nieuwenhuizen * \param ib		IB
3320ef1b4d5b1a3af4ce7ae42ef4259d5db320724c5Bas Nieuwenhuizen * \param num_dw	size of the IB
3330ef1b4d5b1a3af4ce7ae42ef4259d5db320724c5Bas Nieuwenhuizen * \param chip_class	chip class
3340ef1b4d5b1a3af4ce7ae42ef4259d5db320724c5Bas Nieuwenhuizen * \param trace_id	the last trace ID that is known to have been reached
3350ef1b4d5b1a3af4ce7ae42ef4259d5db320724c5Bas Nieuwenhuizen *			and executed by the CP, typically read from a buffer
3368cb60c7dd3cb608615d3e5f89ad4198c0babdb3dBas Nieuwenhuizen * \param addr_callback Get a mapped pointer of the IB at a given address. Can
3378cb60c7dd3cb608615d3e5f89ad4198c0babdb3dBas Nieuwenhuizen *                      be NULL.
3388cb60c7dd3cb608615d3e5f89ad4198c0babdb3dBas Nieuwenhuizen * \param addr_callback_data user data for addr_callback
3390ef1b4d5b1a3af4ce7ae42ef4259d5db320724c5Bas Nieuwenhuizen */
3400ef1b4d5b1a3af4ce7ae42ef4259d5db320724c5Bas Nieuwenhuizenvoid ac_parse_ib(FILE *f, uint32_t *ib, int num_dw, int trace_id,
3418cb60c7dd3cb608615d3e5f89ad4198c0babdb3dBas Nieuwenhuizen		 const char *name, enum chip_class chip_class,
3428cb60c7dd3cb608615d3e5f89ad4198c0babdb3dBas Nieuwenhuizen		 ac_debug_addr_callback addr_callback, void *addr_callback_data)
3430ef1b4d5b1a3af4ce7ae42ef4259d5db320724c5Bas Nieuwenhuizen{
3440ef1b4d5b1a3af4ce7ae42ef4259d5db320724c5Bas Nieuwenhuizen	fprintf(f, "------------------ %s begin ------------------\n", name);
3450ef1b4d5b1a3af4ce7ae42ef4259d5db320724c5Bas Nieuwenhuizen
3460ef1b4d5b1a3af4ce7ae42ef4259d5db320724c5Bas Nieuwenhuizen	while (num_dw > 0) {
3470ef1b4d5b1a3af4ce7ae42ef4259d5db320724c5Bas Nieuwenhuizen		unsigned type = PKT_TYPE_G(ib[0]);
3480ef1b4d5b1a3af4ce7ae42ef4259d5db320724c5Bas Nieuwenhuizen
3490ef1b4d5b1a3af4ce7ae42ef4259d5db320724c5Bas Nieuwenhuizen		switch (type) {
3500ef1b4d5b1a3af4ce7ae42ef4259d5db320724c5Bas Nieuwenhuizen		case 3:
3510ef1b4d5b1a3af4ce7ae42ef4259d5db320724c5Bas Nieuwenhuizen			ib = ac_parse_packet3(f, ib, &num_dw, trace_id,
3528cb60c7dd3cb608615d3e5f89ad4198c0babdb3dBas Nieuwenhuizen					      chip_class, addr_callback,
3538cb60c7dd3cb608615d3e5f89ad4198c0babdb3dBas Nieuwenhuizen					      addr_callback_data);
3540ef1b4d5b1a3af4ce7ae42ef4259d5db320724c5Bas Nieuwenhuizen			break;
3550ef1b4d5b1a3af4ce7ae42ef4259d5db320724c5Bas Nieuwenhuizen		case 2:
3560ef1b4d5b1a3af4ce7ae42ef4259d5db320724c5Bas Nieuwenhuizen			/* type-2 nop */
3570ef1b4d5b1a3af4ce7ae42ef4259d5db320724c5Bas Nieuwenhuizen			if (ib[0] == 0x80000000) {
3580ef1b4d5b1a3af4ce7ae42ef4259d5db320724c5Bas Nieuwenhuizen				fprintf(f, COLOR_GREEN "NOP (type 2)" COLOR_RESET "\n");
3590ef1b4d5b1a3af4ce7ae42ef4259d5db320724c5Bas Nieuwenhuizen				ib++;
3603b4bf8aa636768f4ad5fb636b8406e58d0d78f62Bas Nieuwenhuizen				num_dw--;
3610ef1b4d5b1a3af4ce7ae42ef4259d5db320724c5Bas Nieuwenhuizen				break;
3620ef1b4d5b1a3af4ce7ae42ef4259d5db320724c5Bas Nieuwenhuizen			}
3630ef1b4d5b1a3af4ce7ae42ef4259d5db320724c5Bas Nieuwenhuizen			/* fall through */
3640ef1b4d5b1a3af4ce7ae42ef4259d5db320724c5Bas Nieuwenhuizen		default:
3650ef1b4d5b1a3af4ce7ae42ef4259d5db320724c5Bas Nieuwenhuizen			fprintf(f, "Unknown packet type %i\n", type);
3660ef1b4d5b1a3af4ce7ae42ef4259d5db320724c5Bas Nieuwenhuizen			return;
3670ef1b4d5b1a3af4ce7ae42ef4259d5db320724c5Bas Nieuwenhuizen		}
3680ef1b4d5b1a3af4ce7ae42ef4259d5db320724c5Bas Nieuwenhuizen	}
3690ef1b4d5b1a3af4ce7ae42ef4259d5db320724c5Bas Nieuwenhuizen
3700ef1b4d5b1a3af4ce7ae42ef4259d5db320724c5Bas Nieuwenhuizen	fprintf(f, "------------------- %s end -------------------\n", name);
3710ef1b4d5b1a3af4ce7ae42ef4259d5db320724c5Bas Nieuwenhuizen	if (num_dw < 0) {
3720ef1b4d5b1a3af4ce7ae42ef4259d5db320724c5Bas Nieuwenhuizen		printf("Packet ends after the end of IB.\n");
3730ef1b4d5b1a3af4ce7ae42ef4259d5db320724c5Bas Nieuwenhuizen		exit(0);
3740ef1b4d5b1a3af4ce7ae42ef4259d5db320724c5Bas Nieuwenhuizen	}
3750ef1b4d5b1a3af4ce7ae42ef4259d5db320724c5Bas Nieuwenhuizen	fprintf(f, "\n");
3760ef1b4d5b1a3af4ce7ae42ef4259d5db320724c5Bas Nieuwenhuizen}
377