[PATCH umr] Support user named VM hubs

Tom St Denis tom.stdenis at amd.com
Fri Jul 28 13:33:29 UTC 2017


Signed-off-by: Tom St Denis <tom.stdenis at amd.com>
---
 src/app/main.c      | 18 ++++++++++++++++++
 src/lib/read_vram.c | 22 +++++++++++++++++-----
 src/umr.h           |  7 +++++--
 3 files changed, 40 insertions(+), 7 deletions(-)

diff --git a/src/app/main.c b/src/app/main.c
index 0b46643400ba..006727ba7981 100644
--- a/src/app/main.c
+++ b/src/app/main.c
@@ -341,6 +341,14 @@ int main(int argc, char **argv)
 		} else if (!strcmp(argv[i], "--enumerate") || !strcmp(argv[i], "-e")) {
 			umr_enumerate_devices();
 			return 0;
+		} else if (!strcmp(argv[i], "-mm")) {
+			if (i + 1 < argc) {
+				strcpy(options.hub_name, argv[i+1]);
+				++i;
+			} else {
+				printf("-mm requires on parameter");
+				return EXIT_FAILURE;
+			}
 		} else if (!strcmp(argv[i], "--vm-decode") || !strcmp(argv[i], "-vm")) {
 			if (i + 2 < argc) {
 				uint64_t address;
@@ -361,6 +369,11 @@ int main(int argc, char **argv)
 						exit(EXIT_FAILURE);
 					}
 				sscanf(argv[i+2], "%"SCNx32, &size);
+
+				// imply user hub if hub name specified
+				if (options.hub_name[0])
+					vmid |= UMR_USER_HUB;
+
 				while (size--) {
 					if (umr_read_vram(asic, vmid, address, 0, NULL))
 						break;
@@ -389,6 +402,11 @@ int main(int argc, char **argv)
 						sscanf(argv[i+1], "%"SCNx64, &address);
 						vmid = UMR_LINEAR_HUB;
 					}
+
+				// imply user hub if hub name specified
+				if (options.hub_name[0])
+					vmid |= UMR_USER_HUB;
+
 				sscanf(argv[i+2], "%"SCNx32, &size);
 				do {
 					n = size > sizeof(buf) ? sizeof(buf) : size;
diff --git a/src/lib/read_vram.c b/src/lib/read_vram.c
index b58400f1f4ca..91d4e7659704 100644
--- a/src/lib/read_vram.c
+++ b/src/lib/read_vram.c
@@ -309,6 +309,7 @@ static int umr_read_vram_ai(struct umr_asic *asic, uint32_t vmid, uint64_t addre
 	char buf[64];
 	unsigned char *pdst = dst;
 	char *hub;
+	unsigned hubid;
 
 	memset(&registers, 0, sizeof registers);
 
@@ -333,13 +334,24 @@ static int umr_read_vram_ai(struct umr_asic *asic, uint32_t vmid, uint64_t addre
 	 * 0 valid
 	 */
 
-	if ((vmid & 0xFF00) == UMR_MM_HUB)
-		hub = "mmhub";
-	else
-		hub = "gfx";
-
+	hubid = vmid & 0xFF00;
 	vmid &= 0xFF;
 
+	switch (hubid) {
+		case UMR_MM_HUB:
+			hub = "mmhub";
+			break;
+		case UMR_GFX_HUB:
+			hub = "gfx";
+			break;
+		case UMR_USER_HUB:
+			hub = asic->options.hub_name;
+			break;
+		default:
+			fprintf(stderr, "[ERROR]: Invalid hub specified in umr_read_vram_ai()\n");
+			return -1;
+	}
+
 	// read vm registers
 	sprintf(buf, "mmVM_CONTEXT%d_PAGE_TABLE_START_ADDR_LO32", (int)vmid);
 		registers.mmVM_CONTEXTx_PAGE_TABLE_START_ADDR_LO32 = umr_read_reg_by_name_by_ip(asic, hub, buf);
diff --git a/src/umr.h b/src/umr.h
index dd7f80c38f0c..3cc7994fc8ad 100644
--- a/src/umr.h
+++ b/src/umr.h
@@ -44,6 +44,7 @@ enum umr_hub_space {
 	UMR_GFX_HUB = 0 << 8,        // default on everything before AI
 	UMR_MM_HUB = 1 << 8,         // available on AI and later
 
+	UMR_USER_HUB = 0xFE << 8,    // for user supplied HUB names (npi work...)
 	UMR_LINEAR_HUB = 0xFF << 8,  // this is for linear access to vram
 };
 
@@ -196,8 +197,10 @@ struct umr_options {
 	    se_bank,
 	    sh_bank;
 	long forcedid;
-	char *scanblock;
-	char dev_name[32];
+	char
+		*scanblock,
+		dev_name[32],
+		hub_name[32];
 	struct {
 		int domain,
 		    bus,
-- 
2.12.0



More information about the amd-gfx mailing list