1#ifndef MMIOTRACE_H
2#define MMIOTRACE_H
3
4#include <linux/types.h>
5#include <linux/list.h>
6
7struct kmmio_probe;
8struct pt_regs;
9
10typedef void (*kmmio_pre_handler_t)(struct kmmio_probe *,
11 struct pt_regs *, unsigned long addr);
12typedef void (*kmmio_post_handler_t)(struct kmmio_probe *,
13 unsigned long condition, struct pt_regs *);
14
15struct kmmio_probe {
16 struct list_head list;
17 unsigned long addr;
18 unsigned long len;
19 kmmio_pre_handler_t pre_handler;
20 kmmio_post_handler_t post_handler;
21 void *private;
22};
23
24
25static inline int is_kmmio_active(void)
26{
27 extern unsigned int kmmio_count;
28 return kmmio_count;
29}
30
31extern int register_kmmio_probe(struct kmmio_probe *p);
32extern void unregister_kmmio_probe(struct kmmio_probe *p);
33
34
35extern int kmmio_handler(struct pt_regs *regs, unsigned long addr);
36
37#ifdef CONFIG_MMIOTRACE
38
39extern void mmiotrace_ioremap(resource_size_t offset, unsigned long size,
40 void __iomem *addr);
41extern void mmiotrace_iounmap(volatile void __iomem *addr);
42
43
44extern int mmiotrace_printk(const char *fmt, ...)
45 __attribute__ ((format (printf, 1, 2)));
46#else
47static inline void mmiotrace_ioremap(resource_size_t offset,
48 unsigned long size, void __iomem *addr)
49{
50}
51
52static inline void mmiotrace_iounmap(volatile void __iomem *addr)
53{
54}
55
56static inline int mmiotrace_printk(const char *fmt, ...)
57 __attribute__ ((format (printf, 1, 0)));
58
59static inline int mmiotrace_printk(const char *fmt, ...)
60{
61 return 0;
62}
63#endif
64
65enum mm_io_opcode {
66 MMIO_READ = 0x1,
67 MMIO_WRITE = 0x2,
68 MMIO_PROBE = 0x3,
69 MMIO_UNPROBE = 0x4,
70 MMIO_UNKNOWN_OP = 0x5,
71};
72
73struct mmiotrace_rw {
74 resource_size_t phys;
75 unsigned long value;
76 unsigned long pc;
77 int map_id;
78 unsigned char opcode;
79 unsigned char width;
80};
81
82struct mmiotrace_map {
83 resource_size_t phys;
84 unsigned long virt;
85 unsigned long len;
86 int map_id;
87 unsigned char opcode;
88};
89
90
91extern void enable_mmiotrace(void);
92extern void disable_mmiotrace(void);
93extern void mmio_trace_rw(struct mmiotrace_rw *rw);
94extern void mmio_trace_mapping(struct mmiotrace_map *map);
95extern int mmio_trace_printk(const char *fmt, va_list args);
96
97#endif
98