forked from Minki/linux
04fa2f7f83
iommu_error class event can be enabled to trigger when an iommu error occurs. This trace event is intended to be called to report the error information. Trace information includes driver name, device name, iova, and flags. iommu_error:io_page_fault Signed-off-by: Shuah Khan <shuah.kh@samsung.com> Signed-off-by: Joerg Roedel <joro@8bytes.org>
163 lines
2.9 KiB
C
163 lines
2.9 KiB
C
/*
|
|
* iommu trace points
|
|
*
|
|
* Copyright (C) 2013 Shuah Khan <shuah.kh@samsung.com>
|
|
*
|
|
*/
|
|
#undef TRACE_SYSTEM
|
|
#define TRACE_SYSTEM iommu
|
|
|
|
#if !defined(_TRACE_IOMMU_H) || defined(TRACE_HEADER_MULTI_READ)
|
|
#define _TRACE_IOMMU_H
|
|
|
|
#include <linux/tracepoint.h>
|
|
#include <linux/pci.h>
|
|
|
|
struct device;
|
|
|
|
DECLARE_EVENT_CLASS(iommu_group_event,
|
|
|
|
TP_PROTO(int group_id, struct device *dev),
|
|
|
|
TP_ARGS(group_id, dev),
|
|
|
|
TP_STRUCT__entry(
|
|
__field(int, gid)
|
|
__string(device, dev_name(dev))
|
|
),
|
|
|
|
TP_fast_assign(
|
|
__entry->gid = group_id;
|
|
__assign_str(device, dev_name(dev));
|
|
),
|
|
|
|
TP_printk("IOMMU: groupID=%d device=%s",
|
|
__entry->gid, __get_str(device)
|
|
)
|
|
);
|
|
|
|
DEFINE_EVENT(iommu_group_event, add_device_to_group,
|
|
|
|
TP_PROTO(int group_id, struct device *dev),
|
|
|
|
TP_ARGS(group_id, dev)
|
|
|
|
);
|
|
|
|
DEFINE_EVENT(iommu_group_event, remove_device_from_group,
|
|
|
|
TP_PROTO(int group_id, struct device *dev),
|
|
|
|
TP_ARGS(group_id, dev)
|
|
);
|
|
|
|
DECLARE_EVENT_CLASS(iommu_device_event,
|
|
|
|
TP_PROTO(struct device *dev),
|
|
|
|
TP_ARGS(dev),
|
|
|
|
TP_STRUCT__entry(
|
|
__string(device, dev_name(dev))
|
|
),
|
|
|
|
TP_fast_assign(
|
|
__assign_str(device, dev_name(dev));
|
|
),
|
|
|
|
TP_printk("IOMMU: device=%s", __get_str(device)
|
|
)
|
|
);
|
|
|
|
DEFINE_EVENT(iommu_device_event, attach_device_to_domain,
|
|
|
|
TP_PROTO(struct device *dev),
|
|
|
|
TP_ARGS(dev)
|
|
);
|
|
|
|
DEFINE_EVENT(iommu_device_event, detach_device_from_domain,
|
|
|
|
TP_PROTO(struct device *dev),
|
|
|
|
TP_ARGS(dev)
|
|
);
|
|
|
|
DECLARE_EVENT_CLASS(iommu_map_unmap,
|
|
|
|
TP_PROTO(unsigned long iova, phys_addr_t paddr, size_t size),
|
|
|
|
TP_ARGS(iova, paddr, size),
|
|
|
|
TP_STRUCT__entry(
|
|
__field(u64, iova)
|
|
__field(u64, paddr)
|
|
__field(int, size)
|
|
),
|
|
|
|
TP_fast_assign(
|
|
__entry->iova = iova;
|
|
__entry->paddr = paddr;
|
|
__entry->size = size;
|
|
),
|
|
|
|
TP_printk("IOMMU: iova=0x%016llx paddr=0x%016llx size=0x%x",
|
|
__entry->iova, __entry->paddr, __entry->size
|
|
)
|
|
);
|
|
|
|
DEFINE_EVENT(iommu_map_unmap, map,
|
|
|
|
TP_PROTO(unsigned long iova, phys_addr_t paddr, size_t size),
|
|
|
|
TP_ARGS(iova, paddr, size)
|
|
);
|
|
|
|
DEFINE_EVENT_PRINT(iommu_map_unmap, unmap,
|
|
|
|
TP_PROTO(unsigned long iova, phys_addr_t paddr, size_t size),
|
|
|
|
TP_ARGS(iova, paddr, size),
|
|
|
|
TP_printk("IOMMU: iova=0x%016llx size=0x%x",
|
|
__entry->iova, __entry->size
|
|
)
|
|
);
|
|
|
|
DECLARE_EVENT_CLASS(iommu_error,
|
|
|
|
TP_PROTO(struct device *dev, unsigned long iova, int flags),
|
|
|
|
TP_ARGS(dev, iova, flags),
|
|
|
|
TP_STRUCT__entry(
|
|
__string(device, dev_name(dev))
|
|
__string(driver, dev_driver_string(dev))
|
|
__field(u64, iova)
|
|
__field(int, flags)
|
|
),
|
|
|
|
TP_fast_assign(
|
|
__assign_str(device, dev_name(dev));
|
|
__assign_str(driver, dev_driver_string(dev));
|
|
__entry->iova = iova;
|
|
__entry->flags = flags;
|
|
),
|
|
|
|
TP_printk("IOMMU:%s %s iova=0x%016llx flags=0x%04x",
|
|
__get_str(driver), __get_str(device),
|
|
__entry->iova, __entry->flags
|
|
)
|
|
);
|
|
|
|
DEFINE_EVENT(iommu_error, io_page_fault,
|
|
|
|
TP_PROTO(struct device *dev, unsigned long iova, int flags),
|
|
|
|
TP_ARGS(dev, iova, flags)
|
|
);
|
|
#endif /* _TRACE_IOMMU_H */
|
|
|
|
/* This part must be outside protection */
|
|
#include <trace/define_trace.h>
|