1*4882a593Smuzhiyun /* SPDX-License-Identifier: GPL-2.0 */ 2*4882a593Smuzhiyun /* 3*4882a593Smuzhiyun * Intel IOMMU trace support 4*4882a593Smuzhiyun * 5*4882a593Smuzhiyun * Copyright (C) 2019 Intel Corporation 6*4882a593Smuzhiyun * 7*4882a593Smuzhiyun * Author: Lu Baolu <baolu.lu@linux.intel.com> 8*4882a593Smuzhiyun */ 9*4882a593Smuzhiyun #ifdef CONFIG_INTEL_IOMMU 10*4882a593Smuzhiyun #undef TRACE_SYSTEM 11*4882a593Smuzhiyun #define TRACE_SYSTEM intel_iommu 12*4882a593Smuzhiyun 13*4882a593Smuzhiyun #if !defined(_TRACE_INTEL_IOMMU_H) || defined(TRACE_HEADER_MULTI_READ) 14*4882a593Smuzhiyun #define _TRACE_INTEL_IOMMU_H 15*4882a593Smuzhiyun 16*4882a593Smuzhiyun #include <linux/tracepoint.h> 17*4882a593Smuzhiyun #include <linux/intel-iommu.h> 18*4882a593Smuzhiyun 19*4882a593Smuzhiyun DECLARE_EVENT_CLASS(dma_map, 20*4882a593Smuzhiyun TP_PROTO(struct device *dev, dma_addr_t dev_addr, phys_addr_t phys_addr, 21*4882a593Smuzhiyun size_t size), 22*4882a593Smuzhiyun 23*4882a593Smuzhiyun TP_ARGS(dev, dev_addr, phys_addr, size), 24*4882a593Smuzhiyun 25*4882a593Smuzhiyun TP_STRUCT__entry( 26*4882a593Smuzhiyun __string(dev_name, dev_name(dev)) 27*4882a593Smuzhiyun __field(dma_addr_t, dev_addr) 28*4882a593Smuzhiyun __field(phys_addr_t, phys_addr) 29*4882a593Smuzhiyun __field(size_t, size) 30*4882a593Smuzhiyun ), 31*4882a593Smuzhiyun 32*4882a593Smuzhiyun TP_fast_assign( 33*4882a593Smuzhiyun __assign_str(dev_name, dev_name(dev)); 34*4882a593Smuzhiyun __entry->dev_addr = dev_addr; 35*4882a593Smuzhiyun __entry->phys_addr = phys_addr; 36*4882a593Smuzhiyun __entry->size = size; 37*4882a593Smuzhiyun ), 38*4882a593Smuzhiyun 39*4882a593Smuzhiyun TP_printk("dev=%s dev_addr=0x%llx phys_addr=0x%llx size=%zu", 40*4882a593Smuzhiyun __get_str(dev_name), 41*4882a593Smuzhiyun (unsigned long long)__entry->dev_addr, 42*4882a593Smuzhiyun (unsigned long long)__entry->phys_addr, 43*4882a593Smuzhiyun __entry->size) 44*4882a593Smuzhiyun ); 45*4882a593Smuzhiyun 46*4882a593Smuzhiyun DEFINE_EVENT(dma_map, map_single, 47*4882a593Smuzhiyun TP_PROTO(struct device *dev, dma_addr_t dev_addr, phys_addr_t phys_addr, 48*4882a593Smuzhiyun size_t size), 49*4882a593Smuzhiyun TP_ARGS(dev, dev_addr, phys_addr, size) 50*4882a593Smuzhiyun ); 51*4882a593Smuzhiyun 52*4882a593Smuzhiyun DEFINE_EVENT(dma_map, bounce_map_single, 53*4882a593Smuzhiyun TP_PROTO(struct device *dev, dma_addr_t dev_addr, phys_addr_t phys_addr, 54*4882a593Smuzhiyun size_t size), 55*4882a593Smuzhiyun TP_ARGS(dev, dev_addr, phys_addr, size) 56*4882a593Smuzhiyun ); 57*4882a593Smuzhiyun 58*4882a593Smuzhiyun DECLARE_EVENT_CLASS(dma_unmap, 59*4882a593Smuzhiyun TP_PROTO(struct device *dev, dma_addr_t dev_addr, size_t size), 60*4882a593Smuzhiyun 61*4882a593Smuzhiyun TP_ARGS(dev, dev_addr, size), 62*4882a593Smuzhiyun 63*4882a593Smuzhiyun TP_STRUCT__entry( 64*4882a593Smuzhiyun __string(dev_name, dev_name(dev)) 65*4882a593Smuzhiyun __field(dma_addr_t, dev_addr) 66*4882a593Smuzhiyun __field(size_t, size) 67*4882a593Smuzhiyun ), 68*4882a593Smuzhiyun 69*4882a593Smuzhiyun TP_fast_assign( 70*4882a593Smuzhiyun __assign_str(dev_name, dev_name(dev)); 71*4882a593Smuzhiyun __entry->dev_addr = dev_addr; 72*4882a593Smuzhiyun __entry->size = size; 73*4882a593Smuzhiyun ), 74*4882a593Smuzhiyun 75*4882a593Smuzhiyun TP_printk("dev=%s dev_addr=0x%llx size=%zu", 76*4882a593Smuzhiyun __get_str(dev_name), 77*4882a593Smuzhiyun (unsigned long long)__entry->dev_addr, 78*4882a593Smuzhiyun __entry->size) 79*4882a593Smuzhiyun ); 80*4882a593Smuzhiyun 81*4882a593Smuzhiyun DEFINE_EVENT(dma_unmap, unmap_single, 82*4882a593Smuzhiyun TP_PROTO(struct device *dev, dma_addr_t dev_addr, size_t size), 83*4882a593Smuzhiyun TP_ARGS(dev, dev_addr, size) 84*4882a593Smuzhiyun ); 85*4882a593Smuzhiyun 86*4882a593Smuzhiyun DEFINE_EVENT(dma_unmap, unmap_sg, 87*4882a593Smuzhiyun TP_PROTO(struct device *dev, dma_addr_t dev_addr, size_t size), 88*4882a593Smuzhiyun TP_ARGS(dev, dev_addr, size) 89*4882a593Smuzhiyun ); 90*4882a593Smuzhiyun 91*4882a593Smuzhiyun DEFINE_EVENT(dma_unmap, bounce_unmap_single, 92*4882a593Smuzhiyun TP_PROTO(struct device *dev, dma_addr_t dev_addr, size_t size), 93*4882a593Smuzhiyun TP_ARGS(dev, dev_addr, size) 94*4882a593Smuzhiyun ); 95*4882a593Smuzhiyun 96*4882a593Smuzhiyun DECLARE_EVENT_CLASS(dma_map_sg, 97*4882a593Smuzhiyun TP_PROTO(struct device *dev, int index, int total, 98*4882a593Smuzhiyun struct scatterlist *sg), 99*4882a593Smuzhiyun 100*4882a593Smuzhiyun TP_ARGS(dev, index, total, sg), 101*4882a593Smuzhiyun 102*4882a593Smuzhiyun TP_STRUCT__entry( 103*4882a593Smuzhiyun __string(dev_name, dev_name(dev)) 104*4882a593Smuzhiyun __field(dma_addr_t, dev_addr) 105*4882a593Smuzhiyun __field(phys_addr_t, phys_addr) 106*4882a593Smuzhiyun __field(size_t, size) 107*4882a593Smuzhiyun __field(int, index) 108*4882a593Smuzhiyun __field(int, total) 109*4882a593Smuzhiyun ), 110*4882a593Smuzhiyun 111*4882a593Smuzhiyun TP_fast_assign( 112*4882a593Smuzhiyun __assign_str(dev_name, dev_name(dev)); 113*4882a593Smuzhiyun __entry->dev_addr = sg->dma_address; 114*4882a593Smuzhiyun __entry->phys_addr = sg_phys(sg); 115*4882a593Smuzhiyun __entry->size = sg->dma_length; 116*4882a593Smuzhiyun __entry->index = index; 117*4882a593Smuzhiyun __entry->total = total; 118*4882a593Smuzhiyun ), 119*4882a593Smuzhiyun 120*4882a593Smuzhiyun TP_printk("dev=%s [%d/%d] dev_addr=0x%llx phys_addr=0x%llx size=%zu", 121*4882a593Smuzhiyun __get_str(dev_name), __entry->index, __entry->total, 122*4882a593Smuzhiyun (unsigned long long)__entry->dev_addr, 123*4882a593Smuzhiyun (unsigned long long)__entry->phys_addr, 124*4882a593Smuzhiyun __entry->size) 125*4882a593Smuzhiyun ); 126*4882a593Smuzhiyun 127*4882a593Smuzhiyun DEFINE_EVENT(dma_map_sg, map_sg, 128*4882a593Smuzhiyun TP_PROTO(struct device *dev, int index, int total, 129*4882a593Smuzhiyun struct scatterlist *sg), 130*4882a593Smuzhiyun TP_ARGS(dev, index, total, sg) 131*4882a593Smuzhiyun ); 132*4882a593Smuzhiyun 133*4882a593Smuzhiyun DEFINE_EVENT(dma_map_sg, bounce_map_sg, 134*4882a593Smuzhiyun TP_PROTO(struct device *dev, int index, int total, 135*4882a593Smuzhiyun struct scatterlist *sg), 136*4882a593Smuzhiyun TP_ARGS(dev, index, total, sg) 137*4882a593Smuzhiyun ); 138*4882a593Smuzhiyun #endif /* _TRACE_INTEL_IOMMU_H */ 139*4882a593Smuzhiyun 140*4882a593Smuzhiyun /* This part must be outside protection */ 141*4882a593Smuzhiyun #include <trace/define_trace.h> 142*4882a593Smuzhiyun #endif /* CONFIG_INTEL_IOMMU */ 143