ac: select the GFX ring when halting waves with UMR on GFX10
authorSamuel Pitoiset <samuel.pitoiset@gmail.com>
Sun, 7 Jul 2019 17:32:29 +0000 (19:32 +0200)
committerSamuel Pitoiset <samuel.pitoiset@gmail.com>
Mon, 8 Jul 2019 07:10:57 +0000 (09:10 +0200)
GFX10 has two rings, so UMR want to know which one to halt.
Select the first one by default.

Signed-off-by: Samuel Pitoiset <samuel.pitoiset@gmail.com>
Reviewed-by: Bas Nieuwenhuizen <bas@basnieuwenhuizen.nl>
src/amd/common/ac_debug.c
src/amd/common/ac_debug.h
src/amd/vulkan/radv_debug.c
src/gallium/drivers/radeonsi/si_debug.c

index e4cb6a13a3ac48bdaba21591ac30d2fe66839ae6..1632106fdb93da2d1af57c6a4b90c4aa360d40ee 100644 (file)
@@ -769,12 +769,15 @@ static int compare_wave(const void *p1, const void *p2)
 }
 
 /* Return wave information. "waves" should be a large enough array. */
-unsigned ac_get_wave_info(struct ac_wave_info waves[AC_MAX_WAVES_PER_CHIP])
+unsigned ac_get_wave_info(enum chip_class chip_class,
+                         struct ac_wave_info waves[AC_MAX_WAVES_PER_CHIP])
 {
-       char line[2000];
+       char line[2000], cmd[128];
        unsigned num_waves = 0;
 
-       FILE *p = popen("umr -O halt_waves -wa", "r");
+       sprintf(cmd, "umr -O halt_waves -wa %s", chip_class >= GFX10 ? "gfx_0.0.0" : "gfx");
+
+       FILE *p = popen(cmd, "r");
        if (!p)
                return 0;
 
index 23343fe130468dee4fdcba32c362ec6504822203..0d5c1dd9eac0f5a055f09fc5c45dfdf6ab06ff2b 100644 (file)
@@ -64,6 +64,7 @@ void ac_parse_ib(FILE *f, uint32_t *ib, int num_dw, const int *trace_ids,
 bool ac_vm_fault_occured(enum chip_class chip_class,
                         uint64_t *old_dmesg_timestamp, uint64_t *out_addr);
 
-unsigned ac_get_wave_info(struct ac_wave_info waves[AC_MAX_WAVES_PER_CHIP]);
+unsigned ac_get_wave_info(enum chip_class chip_class,
+                         struct ac_wave_info waves[AC_MAX_WAVES_PER_CHIP]);
 
 #endif
index 2f661c0208feac20f3c6f82628577fe7c60c7a2e..42296745543704d90bc32bebbe769ecc9d40fb97 100644 (file)
@@ -445,7 +445,8 @@ radv_dump_annotated_shaders(struct radv_pipeline *pipeline,
                            VkShaderStageFlagBits active_stages, FILE *f)
 {
        struct ac_wave_info waves[AC_MAX_WAVES_PER_CHIP];
-       unsigned num_waves = ac_get_wave_info(waves);
+       enum chip_class chip_class = pipeline->device->physical_device->rad_info.chip_class;
+       unsigned num_waves = ac_get_wave_info(chip_class, waves);
 
        fprintf(f, COLOR_CYAN "The number of active waves = %u" COLOR_RESET
                "\n\n", num_waves);
index c9c78733099f0e3b14d4cddec4dcd4f7a26d1df4..8265159c0d027e20cff381bedb7c017e0f4cda0b 100644 (file)
@@ -1080,7 +1080,7 @@ static void si_print_annotated_shader(struct si_shader *shader,
 static void si_dump_annotated_shaders(struct si_context *sctx, FILE *f)
 {
        struct ac_wave_info waves[AC_MAX_WAVES_PER_CHIP];
-       unsigned num_waves = ac_get_wave_info(waves);
+       unsigned num_waves = ac_get_wave_info(sctx->chip_class, waves);
 
        fprintf(f, COLOR_CYAN "The number of active waves = %u" COLOR_RESET
                "\n\n", num_waves);