From c8efd2b2cf34726a6182ff7a131f0faf5a3ed8f9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marek=20Ol=C5=A1=C3=A1k?= Date: Sat, 10 Jun 2023 20:45:57 -0400 Subject: [PATCH] amd: add a new helper that prints all non-shadowed regs for validating our tables against register definitions Reviewed-by: Pierre-Eric Pelloux-Prayer Part-of: --- src/amd/common/ac_debug.c | 6 +++ src/amd/common/ac_debug.h | 2 + src/amd/common/ac_shadowed_regs.c | 73 +++++++++++++++----------- src/amd/common/ac_shadowed_regs.h | 2 +- src/gallium/drivers/radeonsi/si_pipe.c | 2 +- 5 files changed, 51 insertions(+), 34 deletions(-) diff --git a/src/amd/common/ac_debug.c b/src/amd/common/ac_debug.c index 088ab09ac76..60451765ee1 100644 --- a/src/amd/common/ac_debug.c +++ b/src/amd/common/ac_debug.c @@ -174,6 +174,12 @@ const char *ac_get_register_name(enum amd_gfx_level gfx_level, enum radeon_famil return reg ? sid_strings + reg->name_offset : "(no name)"; } +bool ac_register_exists(enum amd_gfx_level gfx_level, enum radeon_family family, + unsigned offset) +{ + return find_register(gfx_level, family, offset) != NULL; +} + void ac_dump_reg(FILE *file, enum amd_gfx_level gfx_level, enum radeon_family family, unsigned offset, uint32_t value, uint32_t field_mask) { diff --git a/src/amd/common/ac_debug.h b/src/amd/common/ac_debug.h index c2af327a17f..957b06474e4 100644 --- a/src/amd/common/ac_debug.h +++ b/src/amd/common/ac_debug.h @@ -41,6 +41,8 @@ typedef void *(*ac_debug_addr_callback)(void *data, uint64_t addr); const char *ac_get_register_name(enum amd_gfx_level gfx_level, enum radeon_family family, unsigned offset); +bool ac_register_exists(enum amd_gfx_level gfx_level, enum radeon_family family, + unsigned offset); void ac_dump_reg(FILE *file, enum amd_gfx_level gfx_level, enum radeon_family family, unsigned offset, uint32_t value, uint32_t field_mask); void ac_parse_ib_chunk(FILE *f, uint32_t *ib, int num_dw, const int *trace_ids, diff --git a/src/amd/common/ac_shadowed_regs.c b/src/amd/common/ac_shadowed_regs.c index 89eaaa686f0..5f64d01bdd2 100644 --- a/src/amd/common/ac_shadowed_regs.c +++ b/src/amd/common/ac_shadowed_regs.c @@ -3706,44 +3706,53 @@ void ac_emulate_clear_state(const struct radeon_info *info, struct radeon_cmdbuf } } -/* Debug helper to print all shadowed registers and their current values read - * by umr. This can be used to verify whether register shadowing doesn't affect - * apps that don't enable it, because the shadowed register tables might contain - * registers that the driver doesn't set. - */ -void ac_print_shadowed_regs(const struct radeon_info *info) +static void ac_print_nonshadowed_reg(enum amd_gfx_level gfx_level, enum radeon_family family, + unsigned reg_offset) +{ + bool found = false; + + for (unsigned type = 0; type < SI_NUM_REG_RANGES && !found; type++) { + const struct ac_reg_range *ranges; + unsigned num_ranges; + + ac_get_reg_ranges(gfx_level, family, type, &num_ranges, &ranges); + + for (unsigned i = 0; i < num_ranges; i++) { + if (reg_offset >= ranges[i].offset && reg_offset < ranges[i].offset + ranges[i].size) { + /* Assertion: A register can be listed only once in the shadowed tables. */ + if (found) { + printf("warning: register R_%06X_%s found multiple times in tables\n", + reg_offset, ac_get_register_name(gfx_level, family, reg_offset)); + } + found = true; + } + } + } + + if (!found) { + printf("register R_%06X_%s not found in any tables\n", reg_offset, + ac_get_register_name(gfx_level, family, reg_offset)); + } +} + +void ac_print_nonshadowed_regs(enum amd_gfx_level gfx_level, enum radeon_family family) { if (!debug_get_bool_option("AMD_PRINT_SHADOW_REGS", false)) return; - for (unsigned type = 0; type < SI_NUM_REG_RANGES; type++) { - const struct ac_reg_range *ranges; - unsigned num_ranges; + for (unsigned i = 0xB000; i < 0xBFFF; i += 4) { + if (ac_register_exists(gfx_level, family, i)) + ac_print_nonshadowed_reg(gfx_level, family, i); + } - ac_get_reg_ranges(info->gfx_level, info->family, type, &num_ranges, &ranges); + for (unsigned i = 0x28000; i < 0x28FFF; i += 4) { + if (ac_register_exists(gfx_level, family, i)) + ac_print_nonshadowed_reg(gfx_level, family, i); + } - for (unsigned i = 0; i < num_ranges; i++) { - for (unsigned j = 0; j < ranges[i].size / 4; j++) { - unsigned offset = ranges[i].offset + j * 4; - - const char *name = ac_get_register_name(info->gfx_level, info->family, offset); - unsigned value = -1; - -#ifndef _WIN32 - char cmd[1024]; - snprintf(cmd, sizeof(cmd), "umr -r 0x%x", offset); - FILE *p = popen(cmd, "r"); - if (p) { - ASSERTED int r = fscanf(p, "%x", &value); - assert(r == 1); - pclose(p); - } -#endif - - printf("0x%X %s = 0x%X\n", offset, name, value); - } - printf("--------------------------------------------\n"); - } + for (unsigned i = 0x30000; i < 0x31FFF; i += 4) { + if (ac_register_exists(gfx_level, family, i)) + ac_print_nonshadowed_reg(gfx_level, family, i); } } diff --git a/src/amd/common/ac_shadowed_regs.h b/src/amd/common/ac_shadowed_regs.h index c940b26bc21..2d167550a3b 100644 --- a/src/amd/common/ac_shadowed_regs.h +++ b/src/amd/common/ac_shadowed_regs.h @@ -39,7 +39,7 @@ void ac_get_reg_ranges(enum amd_gfx_level gfx_level, enum radeon_family family, const struct ac_reg_range **ranges); void ac_emulate_clear_state(const struct radeon_info *info, struct radeon_cmdbuf *cs, set_context_reg_seq_array_fn set_context_reg_seq_array); -void ac_print_shadowed_regs(const struct radeon_info *info); +void ac_print_nonshadowed_regs(enum amd_gfx_level gfx_level, enum radeon_family family); void ac_create_shadowing_ib_preamble(const struct radeon_info *info, pm4_cmd_add_fn pm4_cmd_add, void *pm4_cmdbuf, diff --git a/src/gallium/drivers/radeonsi/si_pipe.c b/src/gallium/drivers/radeonsi/si_pipe.c index 89e306878a7..56aa3f9e9fd 100644 --- a/src/gallium/drivers/radeonsi/si_pipe.c +++ b/src/gallium/drivers/radeonsi/si_pipe.c @@ -1448,7 +1448,7 @@ static struct pipe_screen *radeonsi_screen_create_impl(struct radeon_winsys *ws, RADEON_DOMAIN_OA); } - ac_print_shadowed_regs(&sscreen->info); + ac_print_nonshadowed_regs(sscreen->info.gfx_level, sscreen->info.family); return &sscreen->b; }