diff --git a/detect.c b/detect.c index f9a1e843..131b0a70 100644 --- a/detect.c +++ b/detect.c @@ -361,6 +361,7 @@ void initbits(int fam) { bits.gui = (1U << 31); bits.uvd = 0; bits.vce0 = 0; + bits.vcn = 0; // R600 has a different texture bit, and only R600 has the TC, CR, SMX bits if (fam < RV770) { @@ -377,4 +378,17 @@ void initbits(int fam) { bits.vce0 = (1U << 7); } } + + // Video Core (VCN) on RDNA: bit 1 of SRBM_STATUS2 + if (fam >= NAVI10) { + bits.vcn = (1U << 1); + } + + // 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..62fc13b5 100644 --- a/dump.c +++ b/dump.c @@ -98,6 +98,7 @@ void dumpdata(const unsigned int ticks, const char file[], const unsigned int li float cb = 100 * results->cb * k; float uvd = 100 * results->uvd * k; float vce0 = 100 * results->vce0 * k; + float vcn = 100 * results->vcn * k; float vram = 100.0f * results->vram / vramsize; float vrammb = results->vram / 1024.0f / 1024.0f; float gtt = 100.0f * results->gtt / gttsize; @@ -108,15 +109,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) @@ -133,6 +136,8 @@ void dumpdata(const unsigned int ticks, const char file[], const unsigned int li fprintf(f, ", uvd %.2f%%", uvd); if (bits.vce0) fprintf(f, ", vce0 %.2f%%", vce0); + if (bits.vcn) + fprintf(f, ", vc %.2f%%", vcn); if (bits.vram) fprintf(f, ", vram %.2f%% %.2fmb", vram, vrammb); diff --git a/include/radeontop.h b/include/radeontop.h index b1a13226..0fac933f 100644 --- a/include/radeontop.h +++ b/include/radeontop.h @@ -160,6 +160,7 @@ struct bits_t { unsigned int cr; unsigned int uvd; unsigned int vce0; + unsigned int vcn; uint64_t vram; uint64_t gtt; unsigned int sclk; diff --git a/ticks.c b/ticks.c index 90b8cab4..0716824d 100644 --- a/ticks.c +++ b/ticks.c @@ -43,8 +43,8 @@ static void *collector(void *arg) { getgrbm(&stat); unsigned int uvd; if (bits.uvd) getsrbm(&uvd); - unsigned int vce; - if (bits.vce0) getsrbm2(&vce); + unsigned int srbm2; + if (bits.vce0 || bits.vcn) getsrbm2(&srbm2); memset(&history[cur], 0, sizeof(struct bits_t)); @@ -63,7 +63,10 @@ static void *collector(void *arg) { if (stat & bits.cr) history[cur].cr = 1; if (stat & bits.cb) history[cur].cb = 1; if (uvd & bits.uvd) history[cur].uvd = 1; - if (vce & bits.vce0) history[cur].vce0 = 1; + if (bits.vce0 || bits.vcn) { + if (srbm2 & bits.vce0) history[cur].vce0 = 1; + if (srbm2 & bits.vcn) history[cur].vcn = 1; + } getsclk(&history[cur].sclk); getmclk(&history[cur].mclk); @@ -94,6 +97,7 @@ static void *collector(void *arg) { res[curres].cr += history[i].cr; res[curres].uvd += history[i].uvd; res[curres].vce0 += history[i].vce0; + res[curres].vcn += history[i].vcn; res[curres].mclk += history[i].mclk; res[curres].sclk += history[i].sclk; } diff --git a/ui.c b/ui.c index 34e815d7..c3d18743 100644 --- a/ui.c +++ b/ui.c @@ -153,6 +153,7 @@ void present(const unsigned int ticks, const char card[], unsigned int color, float cb = 100 * results->cb * k; float uvd = 100 * results->uvd * k; float vce0 = 100 * results->vce0 * k; + float vcn = 100 * results->vcn * k; float vram = 100.0f * results->vram / vramsize; float vrammb = results->vram / 1024.0f / 1024.0f; float vramsizemb = vramsize / 1024.0f / 1024.0f; @@ -175,15 +176,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 +213,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); @@ -254,6 +262,10 @@ void present(const unsigned int ticks, const char card[], unsigned int color, percentage(start, w, vce0); printright(start++, hw, _("VCE %6.2f%%"), vce0); } + if (bits.vcn) { + percentage(start, w, vcn); + printright(start++, hw, _("Video Core %6.2f%%"), vcn); + } if (bits.vram || bits.gtt) { // Enough height?