Linux kernel & device driver programming

Cross-Referenced Linux and Device Driver Code

[ source navigation ] [ diff markup ] [ identifier search ] [ freetext search ] [ file search ]
Version: [ 2.6.11.8 ] [ 2.6.25 ] [ 2.6.25.8 ] [ 2.6.31.13 ] Architecture: [ i386 ]
  1 #ifndef _LINUX_MMIOTRACE_H
  2 #define _LINUX_MMIOTRACE_H
  3 
  4 #include <linux/types.h>
  5 #include <linux/list.h>
  6 
  7 struct kmmio_probe;
  8 struct pt_regs;
  9 
 10 typedef void (*kmmio_pre_handler_t)(struct kmmio_probe *,
 11                                 struct pt_regs *, unsigned long addr);
 12 typedef void (*kmmio_post_handler_t)(struct kmmio_probe *,
 13                                 unsigned long condition, struct pt_regs *);
 14 
 15 struct kmmio_probe {
 16         /* kmmio internal list: */
 17         struct list_head        list;
 18         /* start location of the probe point: */
 19         unsigned long           addr;
 20         /* length of the probe region: */
 21         unsigned long           len;
 22         /* Called before addr is executed: */
 23         kmmio_pre_handler_t     pre_handler;
 24         /* Called after addr is executed: */
 25         kmmio_post_handler_t    post_handler;
 26         void                    *private;
 27 };
 28 
 29 extern unsigned int kmmio_count;
 30 
 31 extern int register_kmmio_probe(struct kmmio_probe *p);
 32 extern void unregister_kmmio_probe(struct kmmio_probe *p);
 33 extern int kmmio_init(void);
 34 extern void kmmio_cleanup(void);
 35 
 36 #ifdef CONFIG_MMIOTRACE
 37 /* kmmio is active by some kmmio_probes? */
 38 static inline int is_kmmio_active(void)
 39 {
 40         return kmmio_count;
 41 }
 42 
 43 /* Called from page fault handler. */
 44 extern int kmmio_handler(struct pt_regs *regs, unsigned long addr);
 45 
 46 /* Called from ioremap.c */
 47 extern void mmiotrace_ioremap(resource_size_t offset, unsigned long size,
 48                                                         void __iomem *addr);
 49 extern void mmiotrace_iounmap(volatile void __iomem *addr);
 50 
 51 /* For anyone to insert markers. Remember trailing newline. */
 52 extern int mmiotrace_printk(const char *fmt, ...)
 53                                 __attribute__ ((format (printf, 1, 2)));
 54 #else /* !CONFIG_MMIOTRACE: */
 55 static inline int is_kmmio_active(void)
 56 {
 57         return 0;
 58 }
 59 
 60 static inline int kmmio_handler(struct pt_regs *regs, unsigned long addr)
 61 {
 62         return 0;
 63 }
 64 
 65 static inline void mmiotrace_ioremap(resource_size_t offset,
 66                                         unsigned long size, void __iomem *addr)
 67 {
 68 }
 69 
 70 static inline void mmiotrace_iounmap(volatile void __iomem *addr)
 71 {
 72 }
 73 
 74 static inline int mmiotrace_printk(const char *fmt, ...)
 75                                 __attribute__ ((format (printf, 1, 0)));
 76 
 77 static inline int mmiotrace_printk(const char *fmt, ...)
 78 {
 79         return 0;
 80 }
 81 #endif /* CONFIG_MMIOTRACE */
 82 
 83 enum mm_io_opcode {
 84         MMIO_READ       = 0x1,  /* struct mmiotrace_rw */
 85         MMIO_WRITE      = 0x2,  /* struct mmiotrace_rw */
 86         MMIO_PROBE      = 0x3,  /* struct mmiotrace_map */
 87         MMIO_UNPROBE    = 0x4,  /* struct mmiotrace_map */
 88         MMIO_UNKNOWN_OP = 0x5,  /* struct mmiotrace_rw */
 89 };
 90 
 91 struct mmiotrace_rw {
 92         resource_size_t phys;   /* PCI address of register */
 93         unsigned long   value;
 94         unsigned long   pc;     /* optional program counter */
 95         int             map_id;
 96         unsigned char   opcode; /* one of MMIO_{READ,WRITE,UNKNOWN_OP} */
 97         unsigned char   width;  /* size of register access in bytes */
 98 };
 99 
100 struct mmiotrace_map {
101         resource_size_t phys;   /* base address in PCI space */
102         unsigned long   virt;   /* base virtual address */
103         unsigned long   len;    /* mapping size */
104         int             map_id;
105         unsigned char   opcode; /* MMIO_PROBE or MMIO_UNPROBE */
106 };
107 
108 /* in kernel/trace/trace_mmiotrace.c */
109 extern void enable_mmiotrace(void);
110 extern void disable_mmiotrace(void);
111 extern void mmio_trace_rw(struct mmiotrace_rw *rw);
112 extern void mmio_trace_mapping(struct mmiotrace_map *map);
113 extern int mmio_trace_printk(const char *fmt, va_list args);
114 
115 #endif /* _LINUX_MMIOTRACE_H */
116 
  This page was automatically generated by the LXR engine.