Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit f4b373f4 authored by Tom St Denis's avatar Tom St Denis Committed by Alex Deucher
Browse files

drm/amdgpu/trace: Add tracepoints to MMIO read/writes



Add tracepoints to the MMIO read/write so we can log
MMIO traffic.

Signed-off-by: default avatarTom St Denis <tom.stdenis@amd.com>
Reviewed-by: default avatarChristian König <christian.koenig@amd.com>
Signed-off-by: default avatarAlex Deucher <alexander.deucher@amd.com>
parent c66875b1
Loading
Loading
Loading
Loading
+8 −4
Original line number Original line Diff line number Diff line
@@ -35,6 +35,7 @@
#include <linux/vga_switcheroo.h>
#include <linux/vga_switcheroo.h>
#include <linux/efi.h>
#include <linux/efi.h>
#include "amdgpu.h"
#include "amdgpu.h"
#include "amdgpu_trace.h"
#include "amdgpu_i2c.h"
#include "amdgpu_i2c.h"
#include "atom.h"
#include "atom.h"
#include "amdgpu_atombios.h"
#include "amdgpu_atombios.h"
@@ -79,24 +80,27 @@ bool amdgpu_device_is_px(struct drm_device *dev)
uint32_t amdgpu_mm_rreg(struct amdgpu_device *adev, uint32_t reg,
uint32_t amdgpu_mm_rreg(struct amdgpu_device *adev, uint32_t reg,
			bool always_indirect)
			bool always_indirect)
{
{
	uint32_t ret;

	if ((reg * 4) < adev->rmmio_size && !always_indirect)
	if ((reg * 4) < adev->rmmio_size && !always_indirect)
		return readl(((void __iomem *)adev->rmmio) + (reg * 4));
		ret = readl(((void __iomem *)adev->rmmio) + (reg * 4));
	else {
	else {
		unsigned long flags;
		unsigned long flags;
		uint32_t ret;


		spin_lock_irqsave(&adev->mmio_idx_lock, flags);
		spin_lock_irqsave(&adev->mmio_idx_lock, flags);
		writel((reg * 4), ((void __iomem *)adev->rmmio) + (mmMM_INDEX * 4));
		writel((reg * 4), ((void __iomem *)adev->rmmio) + (mmMM_INDEX * 4));
		ret = readl(((void __iomem *)adev->rmmio) + (mmMM_DATA * 4));
		ret = readl(((void __iomem *)adev->rmmio) + (mmMM_DATA * 4));
		spin_unlock_irqrestore(&adev->mmio_idx_lock, flags);
		spin_unlock_irqrestore(&adev->mmio_idx_lock, flags);

		return ret;
	}
	}
	trace_amdgpu_mm_rreg(adev->pdev->device, reg, ret);
	return ret;
}
}


void amdgpu_mm_wreg(struct amdgpu_device *adev, uint32_t reg, uint32_t v,
void amdgpu_mm_wreg(struct amdgpu_device *adev, uint32_t reg, uint32_t v,
		    bool always_indirect)
		    bool always_indirect)
{
{
	trace_amdgpu_mm_wreg(adev->pdev->device, reg, v);
	
	if ((reg * 4) < adev->rmmio_size && !always_indirect)
	if ((reg * 4) < adev->rmmio_size && !always_indirect)
		writel(v, ((void __iomem *)adev->rmmio) + (reg * 4));
		writel(v, ((void __iomem *)adev->rmmio) + (reg * 4));
	else {
	else {
+38 −0
Original line number Original line Diff line number Diff line
@@ -11,6 +11,44 @@
#define TRACE_SYSTEM amdgpu
#define TRACE_SYSTEM amdgpu
#define TRACE_INCLUDE_FILE amdgpu_trace
#define TRACE_INCLUDE_FILE amdgpu_trace


TRACE_EVENT(amdgpu_mm_rreg,
	    TP_PROTO(unsigned did, uint32_t reg, uint32_t value),
	    TP_ARGS(did, reg, value),
	    TP_STRUCT__entry(
				__field(unsigned, did)
				__field(uint32_t, reg)
				__field(uint32_t, value)
			    ),
	    TP_fast_assign(
			   __entry->did = did;
			   __entry->reg = reg;
			   __entry->value = value;
			   ),
	    TP_printk("0x%04lx, 0x%04lx, 0x%08lx",
		      (unsigned long)__entry->did,
		      (unsigned long)__entry->reg,
		      (unsigned long)__entry->value)
);

TRACE_EVENT(amdgpu_mm_wreg,
	    TP_PROTO(unsigned did, uint32_t reg, uint32_t value),
	    TP_ARGS(did, reg, value),
	    TP_STRUCT__entry(
				__field(unsigned, did)
				__field(uint32_t, reg)
				__field(uint32_t, value)
			    ),
	    TP_fast_assign(
			   __entry->did = did;
			   __entry->reg = reg;
			   __entry->value = value;
			   ),
	    TP_printk("0x%04lx, 0x%04lx, 0x%08lx",
		      (unsigned long)__entry->did,
		      (unsigned long)__entry->reg,
		      (unsigned long)__entry->value)
);

TRACE_EVENT(amdgpu_bo_create,
TRACE_EVENT(amdgpu_bo_create,
	    TP_PROTO(struct amdgpu_bo *bo),
	    TP_PROTO(struct amdgpu_bo *bo),
	    TP_ARGS(bo),
	    TP_ARGS(bo),