drm/amd/amdgpu: Add tracepoint for DMA page mapping (v4)
This helps map DMA addresses back to physical addresses. Signed-off-by: Tom St Denis <tom.stdenis@amd.com> Reviewed-by: Christian König <christian.koenig@amd.com> Signed-off-by: Alex Deucher <alexander.deucher@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 (v4): Move traces into separate functions
This commit is contained in:
parent
dbcca4aab1
commit
aca8171812
|
@ -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),
|
||||
|
|
|
@ -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)
|
||||
|
@ -662,6 +663,38 @@ release_pages:
|
|||
return r;
|
||||
}
|
||||
|
||||
static void amdgpu_trace_dma_map(struct ttm_tt *ttm)
|
||||
{
|
||||
struct amdgpu_device *adev = amdgpu_ttm_adev(ttm->bdev);
|
||||
struct amdgpu_ttm_tt *gtt = (void *)ttm;
|
||||
unsigned i;
|
||||
|
||||
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]));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
static void amdgpu_trace_dma_unmap(struct ttm_tt *ttm)
|
||||
{
|
||||
struct amdgpu_device *adev = amdgpu_ttm_adev(ttm->bdev);
|
||||
struct amdgpu_ttm_tt *gtt = (void *)ttm;
|
||||
unsigned i;
|
||||
|
||||
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]));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/* prepare the sg table with the user pages */
|
||||
static int amdgpu_ttm_tt_pin_userptr(struct ttm_tt *ttm)
|
||||
{
|
||||
|
@ -688,6 +721,8 @@ 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);
|
||||
|
||||
amdgpu_trace_dma_map(ttm);
|
||||
|
||||
return 0;
|
||||
|
||||
release_sg:
|
||||
|
@ -721,6 +756,8 @@ static void amdgpu_ttm_tt_unpin_userptr(struct ttm_tt *ttm)
|
|||
put_page(page);
|
||||
}
|
||||
|
||||
amdgpu_trace_dma_unmap(ttm);
|
||||
|
||||
sg_free_table(ttm->sg);
|
||||
}
|
||||
|
||||
|
@ -892,7 +929,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 +952,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 +982,12 @@ static int amdgpu_ttm_tt_populate(struct ttm_tt *ttm)
|
|||
return -EFAULT;
|
||||
}
|
||||
}
|
||||
return 0;
|
||||
|
||||
r = 0;
|
||||
trace_mappings:
|
||||
if (likely(!r))
|
||||
amdgpu_trace_dma_map(ttm);
|
||||
return r;
|
||||
}
|
||||
|
||||
static void amdgpu_ttm_tt_unpopulate(struct ttm_tt *ttm)
|
||||
|
@ -966,6 +1008,8 @@ static void amdgpu_ttm_tt_unpopulate(struct ttm_tt *ttm)
|
|||
|
||||
adev = amdgpu_ttm_adev(ttm->bdev);
|
||||
|
||||
amdgpu_trace_dma_unmap(ttm);
|
||||
|
||||
#ifdef CONFIG_SWIOTLB
|
||||
if (swiotlb_nr_tbl()) {
|
||||
ttm_dma_unpopulate(>t->ttm, adev->dev);
|
||||
|
|
Loading…
Reference in New Issue