intel: tools: aubmem: map gtt data to aub file
authorLionel Landwerlin <lionel.g.landwerlin@intel.com>
Thu, 2 Aug 2018 09:15:41 +0000 (10:15 +0100)
committerLionel Landwerlin <lionel.g.landwerlin@intel.com>
Wed, 22 Aug 2018 17:02:11 +0000 (18:02 +0100)
This will allow the aubinator viewer tool to modify the aub data that
was loaded at a particular gtt address.

Signed-off-by: Lionel Landwerlin <lionel.g.landwerlin@intel.com>
Reviewed-by: Rafael Antognolli <rafael.antognolli@intel.com>
src/intel/tools/aub_mem.c
src/intel/tools/aub_mem.h

index 9248427290607ea3487cacd2996419c5aea49512..27b36aaf4a7de3a0dd01bb8bf94ea2b07104ab61 100644 (file)
@@ -55,6 +55,7 @@ struct phys_mem {
    uint64_t fd_offset;
    uint64_t phys_addr;
    uint8_t *data;
+   const uint8_t *aub_data;
 };
 
 static void
@@ -220,6 +221,7 @@ aub_mem_phys_write(void *_mem, uint64_t phys_address,
       uint32_t size_this_page = MIN2(to_write, 4096 - offset);
       to_write -= size_this_page;
       memcpy(pmem->data + offset, data, size_this_page);
+      pmem->aub_data = data - offset;
       data = (const uint8_t *)data + size_this_page;
    }
 }
@@ -389,3 +391,30 @@ aub_mem_fini(struct aub_mem *mem)
    close(mem->mem_fd);
    mem->mem_fd = -1;
 }
+
+struct gen_batch_decode_bo
+aub_mem_get_phys_addr_data(struct aub_mem *mem, uint64_t phys_addr)
+{
+   struct phys_mem *page = search_phys_mem(mem, phys_addr);
+   return page ?
+      (struct gen_batch_decode_bo) { .map = page->data, .addr = page->phys_addr, .size = 4096 } :
+      (struct gen_batch_decode_bo) {};
+}
+
+struct gen_batch_decode_bo
+aub_mem_get_ppgtt_addr_data(struct aub_mem *mem, uint64_t virt_addr)
+{
+   struct phys_mem *page = ppgtt_walk(mem, mem->pml4, virt_addr);
+   return page ?
+      (struct gen_batch_decode_bo) { .map = page->data, .addr = virt_addr & ~((1ULL << 12) - 1), .size = 4096 } :
+      (struct gen_batch_decode_bo) {};
+}
+
+struct gen_batch_decode_bo
+aub_mem_get_ppgtt_addr_aub_data(struct aub_mem *mem, uint64_t virt_addr)
+{
+   struct phys_mem *page = ppgtt_walk(mem, mem->pml4, virt_addr);
+   return page ?
+      (struct gen_batch_decode_bo) { .map = page->aub_data, .addr = virt_addr & ~((1ULL << 12) - 1), .size = 4096 } :
+      (struct gen_batch_decode_bo) {};
+}
index 98e64214b987b2761d7bfede9d17ffe08a3d6046..1d73d3340f2d320e432893830738976867b5d1de 100644 (file)
@@ -65,6 +65,12 @@ void aub_mem_local_write(void *mem, uint64_t virt_address,
 struct gen_batch_decode_bo aub_mem_get_ggtt_bo(void *mem, uint64_t address);
 struct gen_batch_decode_bo aub_mem_get_ppgtt_bo(void *mem, uint64_t address);
 
+struct gen_batch_decode_bo aub_mem_get_phys_addr_data(struct aub_mem *mem, uint64_t phys_addr);
+struct gen_batch_decode_bo aub_mem_get_ppgtt_addr_data(struct aub_mem *mem, uint64_t virt_addr);
+
+struct gen_batch_decode_bo aub_mem_get_ppgtt_addr_aub_data(struct aub_mem *mem, uint64_t virt_addr);
+
+
 #ifdef __cplusplus
 }
 #endif