[PATCH umr 2/2] Simplify the ability to read multiple registers at once
Tom St Denis
tom.stdenis at amd.com
Mon Apr 2 15:44:50 UTC 2018
Previously the "many" option would be needed to read related
registers at once. This adds the ability to simply using a trailing
star on the name, for instance,
$ umr -r *.vcn10.ADDR*
vcn10.mmUVD_JPEG_ADDR_CONFIG => 0x22010010
vcn10.mmUVD_JPEG_UV_ADDR_CONFIG => 0x22010010
vcn10.mmUVD_SEMA_ADDR_LOW => 0x00000000
vcn10.mmUVD_SEMA_ADDR_HIGH => 0x00000000
vcn10.mmUVD_UDEC_DBW_UV_ADDR_CONFIG => 0x22010010
...<snip>...
Signed-off-by: Tom St Denis <tom.stdenis at amd.com>
---
doc/sphinx/source/register_access.rst | 9 +++++++++
doc/umr.1 | 7 ++++++-
src/app/main.c | 4 +++-
src/app/scan.c | 18 +++++++++++++-----
4 files changed, 31 insertions(+), 7 deletions(-)
diff --git a/doc/sphinx/source/register_access.rst b/doc/sphinx/source/register_access.rst
index 58dd783d2e19..8ea8c4596d5e 100644
--- a/doc/sphinx/source/register_access.rst
+++ b/doc/sphinx/source/register_access.rst
@@ -63,6 +63,15 @@ example:
Will read and print out any register with the word 'GATE' contained
in the register name in the uvd6 IP block.
+This can also be accomplished by using a '*' at the end of the register
+name. For example:
+
+::
+
+ umr --read *.uvd6.GATE*
+
+would accomplish the same as the previous example.
+
--------------------------
Reading an entire IP block
--------------------------
diff --git a/doc/umr.1 b/doc/umr.1
index c64855ca439f..ab6dbd51fd6e 100644
--- a/doc/umr.1
+++ b/doc/umr.1
@@ -56,7 +56,12 @@ This command uses the same syntax as the
.B --write
command but also allows
.B *
-for the regname field.
+for the regname field to read an entire block. Additionally,
+a
+.B *
+can be appended to a register name to read any register that contains
+a partial match. For instance, "*.vcn10.ADDR*" would read any register
+from the 'VCN10' block which contains 'ADDR' in the name.
.IP "--scan, -s <string>"
Scan and print an IP block by name, for example,
.B uvd6
diff --git a/src/app/main.c b/src/app/main.c
index cea6ac2e1069..6165b44d2799 100644
--- a/src/app/main.c
+++ b/src/app/main.c
@@ -512,7 +512,9 @@ int main(int argc, char **argv)
"\n\t--writebit, -wb <string> <number>\n\t\tWrite a value in hex to a register bitfield specified as in --write but"
"\n\t\tthe addition of the bitfield name. For instance: \"*.gfx80.mmRLC_PG_CNTL.PG_OVERRIDE\"\n"
"\n\t--read, -r <string>\n\t\tRead a value from a register and print it to stdout. This command"
- "\n\t\tuses the same path notation as --write. It also accepts * for regname.\n"
+ "\n\t\tuses the same path notation as --write. It also accepts * for regname."
+ "\n\t\tA trailing * on a regname will read any register that has a name that contains the"
+ "\n\t\tremainder of the name specified.\n"
"\n\t--scan, -s <string>\n\t\tScan and print an ip block by name, e.g. \"uvd6\" or \"carrizo.uvd6\"."
"\n\t\tCan be used multiple times.\n"
"\n\t--ring, -R <string>([from:to])\n\t\tRead the contents of a ring named by the string without the amdgpu_ring_ prefix. "
diff --git a/src/app/scan.c b/src/app/scan.c
index 684417704126..287c791e8ec7 100644
--- a/src/app/scan.c
+++ b/src/app/scan.c
@@ -26,10 +26,18 @@
int umr_scan_asic(struct umr_asic *asic, char *asicname, char *ipname, char *regname)
{
- int r, fd;
- int first, i, j, k;
+ int r, fd, many = asic->options.many, named = asic->options.named,
+ first, i, j, k;
uint64_t addr, scale;
- char buf[256];
+ char buf[256], regname_copy[256];
+
+ // does the register name contain a trailing star?
+ strcpy(regname_copy, regname);
+ if (strlen(regname) > 1 && strstr(regname, "*")) {
+ many = 1;
+ named = 1;
+ regname_copy[strlen(regname_copy)-1] = 0;
+ }
/* scan them all in order */
if (!asicname[0] || !strcmp(asicname, "*") || !strcmp(asicname, asic->asicname)) {
@@ -38,7 +46,7 @@ int umr_scan_asic(struct umr_asic *asic, char *asicname, char *ipname, char *reg
first = 1;
for (j = 0; j < asic->blocks[i]->no_regs; j++) {
if (!regname[0] || !strcmp(regname, "*") || !strcmp(regname, asic->blocks[i]->regs[j].regname) ||
- (asic->options.many && strstr(asic->blocks[i]->regs[j].regname, regname))) {
+ (many && strstr(asic->blocks[i]->regs[j].regname, regname_copy))) {
// only grant if any regspec matches otherwise it's a waste
if (first && asic->blocks[i]->grant) {
first = 0;
@@ -91,7 +99,7 @@ int umr_scan_asic(struct umr_asic *asic, char *asicname, char *ipname, char *reg
umr_grbm_select_index(asic, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF);
}
if (regname[0]) {
- if (asic->options.named)
+ if (named)
printf("%s%s.%s%s => ", CYAN, asic->blocks[i]->ipname, asic->blocks[i]->regs[j].regname, RST);
printf("%s0x%08lx%s\n", YELLOW, (unsigned long)asic->blocks[i]->regs[j].value, RST);
if (asic->options.bitfields)
--
2.14.3
More information about the amd-gfx
mailing list