ping? Tom On 02/08/17 07:52 AM, Tom St Denis wrote: > This helps map DMA addresses back to physical addresses. > > Signed-off-by: Tom St Denis <tom.stdenis at amd.com> > > (v2): Added tracepoints for USERPTR, SG mappings, and > SWIOTBL mappings. Reformatted trace call perform > PCI decoding internal to the trace. > > (v3): Add unmap tracepoints as well > --- > drivers/gpu/drm/amd/amdgpu/amdgpu_trace.h | 56 +++++++++++++++++++++++++++++++ > drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c | 55 ++++++++++++++++++++++++++---- > 2 files changed, 104 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..0d708e8fb391 100644 > --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_trace.h > +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_trace.h > @@ -14,6 +14,62 @@ > #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_ttm_tt_unpopulate, > + 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..d5f1b99b0ab2 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: > @@ -700,6 +710,7 @@ static void amdgpu_ttm_tt_unpin_userptr(struct ttm_tt *ttm) > struct amdgpu_device *adev = amdgpu_ttm_adev(ttm->bdev); > struct amdgpu_ttm_tt *gtt = (void *)ttm; > struct sg_page_iter sg_iter; > + unsigned i; > > int write = !(gtt->userflags & AMDGPU_GEM_USERPTR_READONLY); > enum dma_data_direction direction = write ? > @@ -721,6 +732,16 @@ static void amdgpu_ttm_tt_unpin_userptr(struct ttm_tt *ttm) > put_page(page); > } > > + if (unlikely(trace_amdgpu_ttm_tt_unpopulate_enabled())) { > + for (i = 0; i < ttm->num_pages; i++) { > + trace_amdgpu_ttm_tt_unpopulate( > + adev, > + gtt->ttm.dma_address[i], > + page_to_phys(ttm->pages[i])); > + } > + } > + > + > sg_free_table(ttm->sg); > } > > @@ -892,7 +913,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 +936,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(>t->ttm, adev->dev); > + r = ttm_dma_populate(>t->ttm, adev->dev); > + goto trace_mappings; > } > #endif > > @@ -945,7 +966,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) > @@ -966,6 +998,15 @@ static void amdgpu_ttm_tt_unpopulate(struct ttm_tt *ttm) > > adev = amdgpu_ttm_adev(ttm->bdev); > > + if (unlikely(trace_amdgpu_ttm_tt_unpopulate_enabled())) { > + for (i = 0; i < ttm->num_pages; i++) { > + trace_amdgpu_ttm_tt_unpopulate( > + adev, > + gtt->ttm.dma_address[i], > + page_to_phys(ttm->pages[i])); > + } > + } > + > #ifdef CONFIG_SWIOTLB > if (swiotlb_nr_tbl()) { > ttm_dma_unpopulate(>t->ttm, adev->dev); >