Signed-off-by: Tom St Denis <tom.stdenis at amd.com> --- src/app/enum.c | 4 ++-- src/lib/create_asic_helper.c | 5 +++++ src/lib/discover.c | 9 +++++++-- src/lib/mmio.c | 8 ++++++++ 4 files changed, 22 insertions(+), 4 deletions(-) diff --git a/src/app/enum.c b/src/app/enum.c index 2c4b7695e3cb..923abf9131b0 100644 --- a/src/app/enum.c +++ b/src/app/enum.c @@ -66,10 +66,10 @@ void umr_enumerate_devices(void) asics[devices++].pcopy = *pdevice; x = 1; } - } while (pdevice && devices < MAX_DEV); + } while (x && pdevice && devices < MAX_DEV); // now try to match devices against instances - for (y = 0; y < MAX_DEV; y++) { + for (y = 0; y < devices; y++) { snprintf(path, sizeof(path)-1, "/sys/kernel/debug/dri/%d/name", y); dri = fopen(path, "r"); if (dri) { diff --git a/src/lib/create_asic_helper.c b/src/lib/create_asic_helper.c index d0ee34ac951e..ffca35d7af93 100644 --- a/src/lib/create_asic_helper.c +++ b/src/lib/create_asic_helper.c @@ -48,6 +48,11 @@ struct umr_asic *umr_create_asic_helper(char *name, int family, ...) } va_end(ap); + if (!asic->no_blocks) { + free(asic); + return NULL; + } + asic->blocks = calloc(asic->no_blocks, sizeof(struct umr_ip_block *)); if (!asic->blocks) { free(asic); diff --git a/src/lib/discover.c b/src/lib/discover.c index 0c4ee1c09ad8..0fc053712e37 100644 --- a/src/lib/discover.c +++ b/src/lib/discover.c @@ -269,20 +269,25 @@ struct umr_asic *umr_discover_asic(struct umr_options *options) goto err_pci; } pci_iterator_destroy(pci_iter); + + // enable device if kernel module isn't present + if (asic->options.no_kernel) + pci_device_enable(asic->pci.pdevice); + pci_device_probe(asic->pci.pdevice); use_region = 6; // try to detect based on ASIC family if (asic->family <= FAMILY_SI) { // try region 2 for SI - if ( asic->pci.pdevice->regions[2].is_64 == 0 && + if (asic->pci.pdevice->regions[2].is_64 == 0 && asic->pci.pdevice->regions[2].is_prefetchable == 0 && asic->pci.pdevice->regions[2].is_IO == 0) { use_region = 2; } } else if (asic->family <= FAMILY_VI) { // try region 5 for CIK..VI - if ( asic->pci.pdevice->regions[5].is_64 == 0 && + if (asic->pci.pdevice->regions[5].is_64 == 0 && asic->pci.pdevice->regions[5].is_prefetchable == 0 && asic->pci.pdevice->regions[5].is_IO == 0) { use_region = 5; diff --git a/src/lib/mmio.c b/src/lib/mmio.c index 987704cb9944..47e5150d3201 100644 --- a/src/lib/mmio.c +++ b/src/lib/mmio.c @@ -88,6 +88,10 @@ uint32_t umr_read_reg(struct umr_asic *asic, uint64_t addr, enum regclass type) if (addr == 0xFFFFFFFF) fprintf(stderr, "[BUG]: reading from addr==0xFFFFFFFF is likely a bug\n"); + // lop off top bits in no-kernel mode + if (asic->options.no_kernel) + addr &= 0xFFFFFF; + switch (type) { case REG_MMIO: if (asic->pci.mem && !(addr & ~0xFFFFFULL)) { // only use pci if enabled and not using high bits @@ -113,6 +117,10 @@ int umr_write_reg(struct umr_asic *asic, uint64_t addr, uint32_t value, enum reg if (addr == 0xFFFFFFFF) fprintf(stderr, "[BUG]: reading from addr==0xFFFFFFFF is likely a bug\n"); + // lop off top bits in no-kernel mode + if (asic->options.no_kernel) + addr &= 0xFFFFFF; + switch (type) { case REG_MMIO: if (asic->pci.mem && !(addr & ~0xFFFFFULL)) { -- 2.12.0