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