From cc58e3456dce86187f42fba24658846c9965e0c2 Mon Sep 17 00:00:00 2001 From: "Michal J. Gajda" Date: Tue, 14 Apr 2026 23:12:46 +0200 Subject: [PATCH] Fix GRBM_STATUS bit positions and labels for RDNA (GFX10+) On RDNA, the GRBM_STATUS register layout changed: - Bit 10 (Event Engine): reserved/undefined - Bits 16-17 (VGT): replaced by Geometry Engine at bit 21 - Bit 21 (Sequencer Instruction Cache): now Geometry Engine Repurpose the VGT field to read GE_BUSY (bit 21) and label it "Geometry Engine" in the UI and dump output. Hide Event Engine and Sequencer Instruction Cache on RDNA since those blocks no longer exist. Other bits (TA, SX, SPI, SC, PA, DB, CB, GUI) are unchanged across all generations. --- detect.c | 8 ++++++++ dump.c | 8 +++++--- ui.c | 21 ++++++++++++++------- 3 files changed, 27 insertions(+), 10 deletions(-) diff --git a/detect.c b/detect.c index f9a1e843..d66aeef5 100644 --- a/detect.c +++ b/detect.c @@ -377,4 +377,12 @@ void initbits(int fam) { bits.vce0 = (1U << 7); } } + + // RDNA (GFX10+): VGT replaced by Geometry Engine at bit 21, + // Event Engine and Sequencer Instruction Cache bits undefined. + if (fam >= NAVI10) { + bits.ee = 0; + bits.vgt = (1U << 21); + bits.sh = 0; + } } diff --git a/dump.c b/dump.c index e0ab409c..bd526c27 100644 --- a/dump.c +++ b/dump.c @@ -108,15 +108,17 @@ void dumpdata(const unsigned int ticks, const char file[], const unsigned int li float sclk_ghz = results->sclk * k / 1000.0f; fprintf(f, "gpu %.2f%%, ", gui); - fprintf(f, "ee %.2f%%, ", ee); - fprintf(f, "vgt %.2f%%, ", vgt); + if (bits.ee) + fprintf(f, "ee %.2f%%, ", ee); + fprintf(f, "%s %.2f%%, ", bits.ee ? "vgt" : "ge", vgt); fprintf(f, "ta %.2f%%, ", ta); if (bits.tc) fprintf(f, "tc %.2f%%, ", tc); fprintf(f, "sx %.2f%%, ", sx); - fprintf(f, "sh %.2f%%, ", sh); + if (bits.sh) + fprintf(f, "sh %.2f%%, ", sh); fprintf(f, "spi %.2f%%, ", spi); if (bits.smx) diff --git a/ui.c b/ui.c index 34e815d7..df76a0a0 100644 --- a/ui.c +++ b/ui.c @@ -175,15 +175,20 @@ void present(const unsigned int ticks, const char card[], unsigned int color, unsigned int start = 4; - percentage(start, w, ee); - printright(start++, hw, _("Event Engine %6.2f%%"), ee); + if (bits.ee) { + percentage(start, w, ee); + printright(start++, hw, _("Event Engine %6.2f%%"), ee); - // Enough height? - if (h > bigh) start++; + // Enough height? + if (h > bigh) start++; + } if (color) attron(COLOR_PAIR(2)); percentage(start, w, vgt); - printright(start++, hw, _("Vertex Grouper + Tesselator %6.2f%%"), vgt); + if (bits.ee) + printright(start++, hw, _("Vertex Grouper + Tesselator %6.2f%%"), vgt); + else + printright(start++, hw, _("Geometry Engine %6.2f%%"), vgt); if (color) attroff(COLOR_PAIR(2)); // Enough height? @@ -207,8 +212,10 @@ void present(const unsigned int ticks, const char card[], unsigned int color, percentage(start, w, sx); printright(start++, hw, _("Shader Export %6.2f%%"), sx); - percentage(start, w, sh); - printright(start++, hw, _("Sequencer Instruction Cache %6.2f%%"), sh); + if (bits.sh) { + percentage(start, w, sh); + printright(start++, hw, _("Sequencer Instruction Cache %6.2f%%"), sh); + } percentage(start, w, spi); printright(start++, hw, _("Shader Interpolator %6.2f%%"), spi);