From 67703a62763dfb2107bd503c5ae76414a50c50a4 Mon Sep 17 00:00:00 2001
From: Tom St Denis <tom.stdenis@amd.com>
Date: Mon, 5 Feb 2018 08:53:40 -0500
Subject: [PATCH umr] add support for new iomem debugfs entry
Signed-off-by: Tom St Denis <tom.stdenis@amd.com>
---
src/lib/close_asic.c | 1 +
src/lib/discover.c | 3 +++
src/lib/read_vram.c | 29 +++++++++++++++++++----------
src/umr.h | 3 ++-
4 files changed, 25 insertions(+), 11 deletions(-)
@@ -57,6 +57,7 @@ void umr_close_asic(struct umr_asic *asic)
cond_close(asic->fd.gpr);
cond_close(asic->fd.drm);
cond_close(asic->fd.iova);
+ cond_close(asic->fd.iomem);
umr_free_asic(asic);
}
}
@@ -232,6 +232,8 @@ struct umr_asic *umr_discover_asic(struct umr_options *options)
asic->fd.gpr = open(fname, O_RDWR);
snprintf(fname, sizeof(fname)-1, "/sys/kernel/debug/dri/%d/amdgpu_iova", asic->instance);
asic->fd.iova = open(fname, O_RDWR);
+ snprintf(fname, sizeof(fname)-1, "/sys/kernel/debug/dri/%d/amdgpu_iomem", asic->instance);
+ asic->fd.iomem = open(fname, O_RDWR);
asic->fd.drm = -1; // default to closed
// if appending to the fd list remember to update close_asic() and discover_by_did()...
} else {
@@ -246,6 +248,7 @@ struct umr_asic *umr_discover_asic(struct umr_options *options)
asic->fd.gpr = -1;
asic->fd.drm = -1;
asic->fd.iova = -1;
+ asic->fd.iomem = -1;
}
if (options->use_pci) {
@@ -73,30 +73,39 @@ static void access_vram_via_mmio(struct umr_asic *asic, uint64_t address, uint32
#define DEBUG(...)
#endif
-static int umr_access_sram(uint64_t address, uint32_t size, void *dst, int write_en)
+static int umr_access_sram(struct umr_asic *asic, uint64_t address, uint32_t size, void *dst, int write_en)
{
- int fd;
+ int fd, need_close=0;
DEBUG("Reading physical sys addr: 0x%llx\n", (unsigned long long)address);
- fd = open("/dev/fmem", O_RDWR);
- if (fd < 0)
- fd = open("/dev/mem", O_RDWR | O_DSYNC);
+ if (asic->fd.iomem >= 0) {
+ fd = asic->fd.iomem;
+ } else {
+ need_close = 1;
+
+ fd = open("/dev/fmem", O_RDWR);
+ if (fd < 0)
+ fd = open("/dev/mem", O_RDWR | O_DSYNC);
+ }
if (fd >= 0) {
lseek(fd, address, SEEK_SET);
if (write_en == 0) {
memset(dst, 0xFF, size);
if (read(fd, dst, size) != size) {
- close(fd);
+ if (need_close)
+ close(fd);
return -1;
}
} else {
if (write(fd, dst, size) != size) {
- close(fd);
+ if (need_close)
+ close(fd);
return -1;
}
}
- close(fd);
+ if (need_close)
+ close(fd);
return 0;
}
return -1;
@@ -292,7 +301,7 @@ next_page:
// allow destination to be NULL to simply use decoder
if (pdst) {
if (pte_fields.system) {
- if (umr_access_sram(start_addr, chunk_size, pdst, write_en) < 0) {
+ if (umr_access_sram(asic, start_addr, chunk_size, pdst, write_en) < 0) {
fprintf(stderr, "[ERROR]: Cannot access system ram, perhaps CONFIG_STRICT_DEVMEM is set in your kernel config?\n");
fprintf(stderr, "[ERROR]: Alternatively download and install /dev/fmem\n");
return -1;
@@ -663,7 +672,7 @@ next_page:
if (pte_fields.valid) {
if (pdst) {
if (pte_fields.system) {
- if (umr_access_sram(start_addr, chunk_size, pdst, write_en) < 0) {
+ if (umr_access_sram(asic, start_addr, chunk_size, pdst, write_en) < 0) {
fprintf(stderr, "[ERROR]: Cannot access system ram, perhaps CONFIG_STRICT_DEVMEM is set in your kernel config?\n");
fprintf(stderr, "[ERROR]: Alternatively download and install /dev/fmem\n");
return -1;
@@ -233,7 +233,8 @@ struct umr_asic {
wave,
vram,
gpr,
- iova;
+ iova,
+ iomem;
} fd;
struct {
struct pci_device *pdevice;
--
2.14.3