From 907c2397f0b898ecb0e1e7be2c61044458d690e6 Mon Sep 17 00:00:00 2001 From: Lionel Landwerlin Date: Thu, 3 Oct 2019 12:21:47 +0300 Subject: [PATCH] intel/error2aub: add support for platforms without PPGTT Not much to do to enable this, just make sure to always write to the GGTT :) Signed-off-by: Lionel Landwerlin Reviewed-by: Kenneth Graunke --- src/intel/tools/error2aub.c | 39 +++++++++++++++++++++++-------------- 1 file changed, 24 insertions(+), 15 deletions(-) diff --git a/src/intel/tools/error2aub.c b/src/intel/tools/error2aub.c index 32e41b80365..62c3fdd0f7e 100644 --- a/src/intel/tools/error2aub.c +++ b/src/intel/tools/error2aub.c @@ -292,6 +292,7 @@ main(int argc, char *argv[]) int active_engine_instance = -1; enum address_space active_gtt = PPGTT; + enum address_space default_gtt = PPGTT; struct { struct { @@ -321,8 +322,7 @@ main(int argc, char *argv[]) NULL, pci_id, "error_state"); if (verbose) aub.verbose_log_file = stdout; - fail_if(!aub_use_execlists(&aub), - "%s currently only works on gen8+\n", argv[0]); + default_gtt = active_gtt = aub_use_execlists(&aub) ? PPGTT : GGTT; continue; } @@ -350,7 +350,7 @@ main(int argc, char *argv[]) char *ring = line + strlen(active_start); engine_from_name(ring, &active_engine_class, &active_engine_instance); - active_gtt = PPGTT; + active_gtt = default_gtt; char *count = strchr(ring, '['); fail_if(!count || sscanf(count, "[%d]:", &num_ring_bos) < 1, @@ -369,7 +369,6 @@ main(int argc, char *argv[]) if (num_ring_bos > 0) { unsigned hi, lo, size; if (sscanf(line, " %x_%x %d", &hi, &lo, &size) == 3) { - assert(aub_use_execlists(&aub)); struct bo *bo_entry = find_or_create(&bo_list, ((uint64_t)hi) << 32 | lo, active_gtt, active_engine_class, @@ -408,8 +407,8 @@ main(int argc, char *argv[]) enum bo_type type; enum address_space gtt; } bo_types[] = { - { "gtt_offset", BO_TYPE_BATCH, PPGTT }, - { "user", BO_TYPE_USER, PPGTT }, + { "gtt_offset", BO_TYPE_BATCH, default_gtt }, + { "user", BO_TYPE_USER, default_gtt }, { "HW context", BO_TYPE_CONTEXT, GGTT }, { "ringbuffer", BO_TYPE_RINGBUFFER, GGTT }, { "HW Status", BO_TYPE_STATUS, GGTT }, @@ -461,18 +460,25 @@ main(int argc, char *argv[]) list_for_each_entry(struct bo, bo_entry, &bo_list, link) { switch (bo_entry->type) { case BO_TYPE_BATCH: - aub_map_ppgtt(&aub, bo_entry->addr, bo_entry->size); - aub_write_trace_block(&aub, AUB_TRACE_TYPE_BATCH, - bo_entry->data, bo_entry->size, bo_entry->addr); + if (bo_entry->gtt == PPGTT) { + aub_map_ppgtt(&aub, bo_entry->addr, bo_entry->size); + aub_write_trace_block(&aub, AUB_TRACE_TYPE_BATCH, + bo_entry->data, bo_entry->size, bo_entry->addr); + } else + aub_write_ggtt(&aub, bo_entry->addr, bo_entry->size, bo_entry->data); break; case BO_TYPE_USER: - aub_map_ppgtt(&aub, bo_entry->addr, bo_entry->size); - aub_write_trace_block(&aub, AUB_TRACE_TYPE_NOTYPE, - bo_entry->data, bo_entry->size, bo_entry->addr); + if (bo_entry->gtt == PPGTT) { + aub_map_ppgtt(&aub, bo_entry->addr, bo_entry->size); + aub_write_trace_block(&aub, AUB_TRACE_TYPE_NOTYPE, + bo_entry->data, bo_entry->size, bo_entry->addr); + } else + aub_write_ggtt(&aub, bo_entry->addr, bo_entry->size, bo_entry->data); break; case BO_TYPE_CONTEXT: if (bo_entry->engine_class == batch_bo->engine_class && - bo_entry->engine_instance == batch_bo->engine_instance) { + bo_entry->engine_instance == batch_bo->engine_instance && + aub_use_execlists(&aub)) { hwsp_bo = bo_entry; uint32_t *context = (uint32_t *) (bo_entry->data + 4096 /* GuC */ + 4096 /* HWSP */); @@ -531,8 +537,11 @@ main(int argc, char *argv[]) } } - fail_if(!hwsp_bo, "Failed to find Context buffer.\n"); - aub_write_context_execlists(&aub, hwsp_bo->addr + 4096 /* skip GuC page */, hwsp_bo->engine_class); + if (aub_use_execlists(&aub)) { + fail_if(!hwsp_bo, "Failed to find Context buffer.\n"); + aub_write_context_execlists(&aub, hwsp_bo->addr + 4096 /* skip GuC page */, hwsp_bo->engine_class); + } else + aub_write_exec(&aub, batch_bo->addr, 0, I915_ENGINE_CLASS_RENDER); /* Cleanup */ list_for_each_entry_safe(struct bo, bo_entry, &bo_list, link) { -- 2.30.2