Am 08.08.2017 um 13:54 schrieb Tom St Denis: > ping? Ups sorry, thought that I already send that out. One comment below. > > 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])); >> + } >> + } >> + It would still be nice to have that chunk in a separate function since it is used multiple times, but that's not a must have. Anyway patch is Reviewed-by: Christian König <christian.koenig at amd.com> Christian. >> 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); >> > > _______________________________________________ > amd-gfx mailing list > amd-gfx at lists.freedesktop.org > https://lists.freedesktop.org/mailman/listinfo/amd-gfx