diff options
Diffstat (limited to 'include/linux')
-rw-r--r-- | include/linux/ftrace.h | 59 | ||||
-rw-r--r-- | include/linux/io-mapping.h | 125 |
2 files changed, 182 insertions, 2 deletions
diff --git a/include/linux/ftrace.h b/include/linux/ftrace.h index 1b340e3fa249..1f5608c11023 100644 --- a/include/linux/ftrace.h +++ b/include/linux/ftrace.h | |||
@@ -23,6 +23,34 @@ struct ftrace_ops { | |||
23 | struct ftrace_ops *next; | 23 | struct ftrace_ops *next; |
24 | }; | 24 | }; |
25 | 25 | ||
26 | extern int function_trace_stop; | ||
27 | |||
28 | /** | ||
29 | * ftrace_stop - stop function tracer. | ||
30 | * | ||
31 | * A quick way to stop the function tracer. Note this an on off switch, | ||
32 | * it is not something that is recursive like preempt_disable. | ||
33 | * This does not disable the calling of mcount, it only stops the | ||
34 | * calling of functions from mcount. | ||
35 | */ | ||
36 | static inline void ftrace_stop(void) | ||
37 | { | ||
38 | function_trace_stop = 1; | ||
39 | } | ||
40 | |||
41 | /** | ||
42 | * ftrace_start - start the function tracer. | ||
43 | * | ||
44 | * This function is the inverse of ftrace_stop. This does not enable | ||
45 | * the function tracing if the function tracer is disabled. This only | ||
46 | * sets the function tracer flag to continue calling the functions | ||
47 | * from mcount. | ||
48 | */ | ||
49 | static inline void ftrace_start(void) | ||
50 | { | ||
51 | function_trace_stop = 0; | ||
52 | } | ||
53 | |||
26 | /* | 54 | /* |
27 | * The ftrace_ops must be a static and should also | 55 | * The ftrace_ops must be a static and should also |
28 | * be read_mostly. These functions do modify read_mostly variables | 56 | * be read_mostly. These functions do modify read_mostly variables |
@@ -41,6 +69,8 @@ extern void ftrace_stub(unsigned long a0, unsigned long a1); | |||
41 | # define unregister_ftrace_function(ops) do { } while (0) | 69 | # define unregister_ftrace_function(ops) do { } while (0) |
42 | # define clear_ftrace_function(ops) do { } while (0) | 70 | # define clear_ftrace_function(ops) do { } while (0) |
43 | static inline void ftrace_kill(void) { } | 71 | static inline void ftrace_kill(void) { } |
72 | static inline void ftrace_stop(void) { } | ||
73 | static inline void ftrace_start(void) { } | ||
44 | #endif /* CONFIG_FUNCTION_TRACER */ | 74 | #endif /* CONFIG_FUNCTION_TRACER */ |
45 | 75 | ||
46 | #ifdef CONFIG_DYNAMIC_FTRACE | 76 | #ifdef CONFIG_DYNAMIC_FTRACE |
@@ -184,6 +214,9 @@ static inline void __ftrace_enabled_restore(int enabled) | |||
184 | #ifdef CONFIG_TRACING | 214 | #ifdef CONFIG_TRACING |
185 | extern int ftrace_dump_on_oops; | 215 | extern int ftrace_dump_on_oops; |
186 | 216 | ||
217 | extern void tracing_start(void); | ||
218 | extern void tracing_stop(void); | ||
219 | |||
187 | extern void | 220 | extern void |
188 | ftrace_special(unsigned long arg1, unsigned long arg2, unsigned long arg3); | 221 | ftrace_special(unsigned long arg1, unsigned long arg2, unsigned long arg3); |
189 | 222 | ||
@@ -214,6 +247,8 @@ ftrace_special(unsigned long arg1, unsigned long arg2, unsigned long arg3) { } | |||
214 | static inline int | 247 | static inline int |
215 | ftrace_printk(const char *fmt, ...) __attribute__ ((format (printf, 1, 0))); | 248 | ftrace_printk(const char *fmt, ...) __attribute__ ((format (printf, 1, 0))); |
216 | 249 | ||
250 | static inline void tracing_start(void) { } | ||
251 | static inline void tracing_stop(void) { } | ||
217 | static inline int | 252 | static inline int |
218 | ftrace_printk(const char *fmt, ...) | 253 | ftrace_printk(const char *fmt, ...) |
219 | { | 254 | { |
@@ -232,6 +267,11 @@ ftrace_init_module(unsigned long *start, unsigned long *end) { } | |||
232 | #endif | 267 | #endif |
233 | 268 | ||
234 | 269 | ||
270 | /* | ||
271 | * Structure which defines the trace of an initcall. | ||
272 | * You don't have to fill the func field since it is | ||
273 | * only used internally by the tracer. | ||
274 | */ | ||
235 | struct boot_trace { | 275 | struct boot_trace { |
236 | pid_t caller; | 276 | pid_t caller; |
237 | char func[KSYM_NAME_LEN]; | 277 | char func[KSYM_NAME_LEN]; |
@@ -242,13 +282,28 @@ struct boot_trace { | |||
242 | }; | 282 | }; |
243 | 283 | ||
244 | #ifdef CONFIG_BOOT_TRACER | 284 | #ifdef CONFIG_BOOT_TRACER |
285 | /* Append the trace on the ring-buffer */ | ||
245 | extern void trace_boot(struct boot_trace *it, initcall_t fn); | 286 | extern void trace_boot(struct boot_trace *it, initcall_t fn); |
287 | |||
288 | /* Tells the tracer that smp_pre_initcall is finished. | ||
289 | * So we can start the tracing | ||
290 | */ | ||
246 | extern void start_boot_trace(void); | 291 | extern void start_boot_trace(void); |
247 | extern void stop_boot_trace(void); | 292 | |
293 | /* Resume the tracing of other necessary events | ||
294 | * such as sched switches | ||
295 | */ | ||
296 | extern void enable_boot_trace(void); | ||
297 | |||
298 | /* Suspend this tracing. Actually, only sched_switches tracing have | ||
299 | * to be suspended. Initcalls doesn't need it.) | ||
300 | */ | ||
301 | extern void disable_boot_trace(void); | ||
248 | #else | 302 | #else |
249 | static inline void trace_boot(struct boot_trace *it, initcall_t fn) { } | 303 | static inline void trace_boot(struct boot_trace *it, initcall_t fn) { } |
250 | static inline void start_boot_trace(void) { } | 304 | static inline void start_boot_trace(void) { } |
251 | static inline void stop_boot_trace(void) { } | 305 | static inline void enable_boot_trace(void) { } |
306 | static inline void disable_boot_trace(void) { } | ||
252 | #endif | 307 | #endif |
253 | 308 | ||
254 | 309 | ||
diff --git a/include/linux/io-mapping.h b/include/linux/io-mapping.h new file mode 100644 index 000000000000..82df31726a54 --- /dev/null +++ b/include/linux/io-mapping.h | |||
@@ -0,0 +1,125 @@ | |||
1 | /* | ||
2 | * Copyright © 2008 Keith Packard <keithp@keithp.com> | ||
3 | * | ||
4 | * This file is free software; you can redistribute it and/or modify | ||
5 | * it under the terms of version 2 of the GNU General Public License | ||
6 | * as published by the Free Software Foundation. | ||
7 | * | ||
8 | * This program is distributed in the hope that it will be useful, | ||
9 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
10 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
11 | * GNU General Public License for more details. | ||
12 | * | ||
13 | * You should have received a copy of the GNU General Public License | ||
14 | * along with this program; if not, write to the Free Software Foundation, | ||
15 | * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. | ||
16 | */ | ||
17 | |||
18 | #ifndef _LINUX_IO_MAPPING_H | ||
19 | #define _LINUX_IO_MAPPING_H | ||
20 | |||
21 | #include <linux/types.h> | ||
22 | #include <asm/io.h> | ||
23 | #include <asm/page.h> | ||
24 | #include <asm/iomap.h> | ||
25 | |||
26 | /* | ||
27 | * The io_mapping mechanism provides an abstraction for mapping | ||
28 | * individual pages from an io device to the CPU in an efficient fashion. | ||
29 | * | ||
30 | * See Documentation/io_mapping.txt | ||
31 | */ | ||
32 | |||
33 | /* this struct isn't actually defined anywhere */ | ||
34 | struct io_mapping; | ||
35 | |||
36 | #ifdef CONFIG_HAVE_ATOMIC_IOMAP | ||
37 | |||
38 | /* | ||
39 | * For small address space machines, mapping large objects | ||
40 | * into the kernel virtual space isn't practical. Where | ||
41 | * available, use fixmap support to dynamically map pages | ||
42 | * of the object at run time. | ||
43 | */ | ||
44 | |||
45 | static inline struct io_mapping * | ||
46 | io_mapping_create_wc(unsigned long base, unsigned long size) | ||
47 | { | ||
48 | return (struct io_mapping *) base; | ||
49 | } | ||
50 | |||
51 | static inline void | ||
52 | io_mapping_free(struct io_mapping *mapping) | ||
53 | { | ||
54 | } | ||
55 | |||
56 | /* Atomic map/unmap */ | ||
57 | static inline void * | ||
58 | io_mapping_map_atomic_wc(struct io_mapping *mapping, unsigned long offset) | ||
59 | { | ||
60 | offset += (unsigned long) mapping; | ||
61 | return iomap_atomic_prot_pfn(offset >> PAGE_SHIFT, KM_USER0, | ||
62 | __pgprot(__PAGE_KERNEL_WC)); | ||
63 | } | ||
64 | |||
65 | static inline void | ||
66 | io_mapping_unmap_atomic(void *vaddr) | ||
67 | { | ||
68 | iounmap_atomic(vaddr, KM_USER0); | ||
69 | } | ||
70 | |||
71 | static inline void * | ||
72 | io_mapping_map_wc(struct io_mapping *mapping, unsigned long offset) | ||
73 | { | ||
74 | offset += (unsigned long) mapping; | ||
75 | return ioremap_wc(offset, PAGE_SIZE); | ||
76 | } | ||
77 | |||
78 | static inline void | ||
79 | io_mapping_unmap(void *vaddr) | ||
80 | { | ||
81 | iounmap(vaddr); | ||
82 | } | ||
83 | |||
84 | #else | ||
85 | |||
86 | /* Create the io_mapping object*/ | ||
87 | static inline struct io_mapping * | ||
88 | io_mapping_create_wc(unsigned long base, unsigned long size) | ||
89 | { | ||
90 | return (struct io_mapping *) ioremap_wc(base, size); | ||
91 | } | ||
92 | |||
93 | static inline void | ||
94 | io_mapping_free(struct io_mapping *mapping) | ||
95 | { | ||
96 | iounmap(mapping); | ||
97 | } | ||
98 | |||
99 | /* Atomic map/unmap */ | ||
100 | static inline void * | ||
101 | io_mapping_map_atomic_wc(struct io_mapping *mapping, unsigned long offset) | ||
102 | { | ||
103 | return ((char *) mapping) + offset; | ||
104 | } | ||
105 | |||
106 | static inline void | ||
107 | io_mapping_unmap_atomic(void *vaddr) | ||
108 | { | ||
109 | } | ||
110 | |||
111 | /* Non-atomic map/unmap */ | ||
112 | static inline void * | ||
113 | io_mapping_map_wc(struct io_mapping *mapping, unsigned long offset) | ||
114 | { | ||
115 | return ((char *) mapping) + offset; | ||
116 | } | ||
117 | |||
118 | static inline void | ||
119 | io_mapping_unmap(void *vaddr) | ||
120 | { | ||
121 | } | ||
122 | |||
123 | #endif /* HAVE_ATOMIC_IOMAP */ | ||
124 | |||
125 | #endif /* _LINUX_IO_MAPPING_H */ | ||