This helps map DMA addresses back to physical addresses.

Signed-off-by: Tom St Denis <tom.stde...@amd.com>

(v2):  Added tracepoints for USERPTR, SG mappings, and
     SWIOTBL mappings.  Reformatted trace call perform
     PCI decoding internal to the trace.
---
 drivers/gpu/drm/amd/amdgpu/amdgpu_trace.h | 28 +++++++++++++++++++++++++
 drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c   | 35 ++++++++++++++++++++++++-------
 2 files changed, 56 insertions(+), 7 deletions(-)

diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_trace.h 
b/drivers/gpu/drm/amd/amdgpu/amdgpu_trace.h
index 509f7a63d40c..3e0f1885a379 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_trace.h
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_trace.h
@@ -14,6 +14,34 @@
 #define AMDGPU_JOB_GET_TIMELINE_NAME(job) \
         
job->base.s_fence->finished.ops->get_timeline_name(&job->base.s_fence->finished)
 
+TRACE_EVENT(amdgpu_ttm_tt_populate,
+           TP_PROTO(struct amdgpu_device *adev, uint64_t dma_address, uint64_t 
phys_address),
+           TP_ARGS(adev, dma_address, phys_address),
+           TP_STRUCT__entry(
+                               __field(uint16_t, domain)
+                               __field(uint8_t, bus)
+                               __field(uint8_t, slot)
+                               __field(uint8_t, func)
+                               __field(uint64_t, dma)
+                               __field(uint64_t, phys)
+                           ),
+           TP_fast_assign(
+                          __entry->domain = pci_domain_nr(adev->pdev->bus);
+                          __entry->bus = adev->pdev->bus->number;
+                          __entry->slot = PCI_SLOT(adev->pdev->devfn);
+                          __entry->func = PCI_FUNC(adev->pdev->devfn);
+                          __entry->dma = dma_address;
+                          __entry->phys = phys_address;
+                          ),
+           TP_printk("%04x:%02x:%02x.%x: 0x%llx => 0x%llx",
+                     (unsigned)__entry->domain,
+                     (unsigned)__entry->bus,
+                     (unsigned)__entry->slot,
+                     (unsigned)__entry->func,
+                     (unsigned long long)__entry->dma,
+                     (unsigned long long)__entry->phys)
+);
+
 TRACE_EVENT(amdgpu_mm_rreg,
            TP_PROTO(unsigned did, uint32_t reg, uint32_t value),
            TP_ARGS(did, reg, value),
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c 
b/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c
index 8da59d212b3b..7857fc581342 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c
@@ -43,6 +43,7 @@
 #include <linux/pagemap.h>
 #include <linux/debugfs.h>
 #include "amdgpu.h"
+#include "amdgpu_trace.h"
 #include "bif/bif_4_1_d.h"
 
 #define DRM_FILE_PAGE_OFFSET (0x100000000ULL >> PAGE_SHIFT)
@@ -667,7 +668,7 @@ static int amdgpu_ttm_tt_pin_userptr(struct ttm_tt *ttm)
 {
        struct amdgpu_device *adev = amdgpu_ttm_adev(ttm->bdev);
        struct amdgpu_ttm_tt *gtt = (void *)ttm;
-       unsigned nents;
+       unsigned i, nents;
        int r;
 
        int write = !(gtt->userflags & AMDGPU_GEM_USERPTR_READONLY);
@@ -688,6 +689,15 @@ static int amdgpu_ttm_tt_pin_userptr(struct ttm_tt *ttm)
        drm_prime_sg_to_page_addr_arrays(ttm->sg, ttm->pages,
                                         gtt->ttm.dma_address, ttm->num_pages);
 
+       if (unlikely(trace_amdgpu_ttm_tt_populate_enabled())) {
+               for (i = 0; i < ttm->num_pages; i++) {
+                       trace_amdgpu_ttm_tt_populate(
+                               adev,
+                               gtt->ttm.dma_address[i],
+                               page_to_phys(ttm->pages[i]));
+               }
+       }
+
        return 0;
 
 release_sg:
@@ -892,7 +902,7 @@ static struct ttm_tt *amdgpu_ttm_tt_create(struct 
ttm_bo_device *bdev,
 
 static int amdgpu_ttm_tt_populate(struct ttm_tt *ttm)
 {
-       struct amdgpu_device *adev;
+       struct amdgpu_device *adev = amdgpu_ttm_adev(ttm->bdev);
        struct amdgpu_ttm_tt *gtt = (void *)ttm;
        unsigned i;
        int r;
@@ -915,14 +925,14 @@ static int amdgpu_ttm_tt_populate(struct ttm_tt *ttm)
                drm_prime_sg_to_page_addr_arrays(ttm->sg, ttm->pages,
                                                 gtt->ttm.dma_address, 
ttm->num_pages);
                ttm->state = tt_unbound;
-               return 0;
+               r = 0;
+               goto trace_mappings;
        }
 
-       adev = amdgpu_ttm_adev(ttm->bdev);
-
 #ifdef CONFIG_SWIOTLB
        if (swiotlb_nr_tbl()) {
-               return ttm_dma_populate(&gtt->ttm, adev->dev);
+               r = ttm_dma_populate(&gtt->ttm, adev->dev);
+               goto trace_mappings;
        }
 #endif
 
@@ -945,7 +955,18 @@ static int amdgpu_ttm_tt_populate(struct ttm_tt *ttm)
                        return -EFAULT;
                }
        }
-       return 0;
+
+       r = 0;
+trace_mappings:
+       if (!r && unlikely(trace_amdgpu_ttm_tt_populate_enabled())) {
+               for (i = 0; i < ttm->num_pages; i++) {
+                       trace_amdgpu_ttm_tt_populate(
+                               adev,
+                               gtt->ttm.dma_address[i],
+                               page_to_phys(ttm->pages[i]));
+               }
+       }
+       return r;
 }
 
 static void amdgpu_ttm_tt_unpopulate(struct ttm_tt *ttm)
-- 
2.12.0

_______________________________________________
amd-gfx mailing list
amd-gfx@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/amd-gfx

Reply via email to