Branch data Line data Source code
1 : : // SPDX-License-Identifier: GPL-2.0
2 : : /*
3 : : * debugfs.h - a tiny little debug file system
4 : : *
5 : : * Copyright (C) 2004 Greg Kroah-Hartman <greg@kroah.com>
6 : : * Copyright (C) 2004 IBM Inc.
7 : : *
8 : : * debugfs is for people to use instead of /proc or /sys.
9 : : * See Documentation/filesystems/ for more details.
10 : : */
11 : :
12 : : #ifndef _DEBUGFS_H_
13 : : #define _DEBUGFS_H_
14 : :
15 : : #include <linux/fs.h>
16 : : #include <linux/seq_file.h>
17 : :
18 : : #include <linux/types.h>
19 : : #include <linux/compiler.h>
20 : :
21 : : struct device;
22 : : struct file_operations;
23 : :
24 : : struct debugfs_blob_wrapper {
25 : : void *data;
26 : : unsigned long size;
27 : : };
28 : :
29 : : struct debugfs_reg32 {
30 : : char *name;
31 : : unsigned long offset;
32 : : };
33 : :
34 : : struct debugfs_regset32 {
35 : : const struct debugfs_reg32 *regs;
36 : : int nregs;
37 : : void __iomem *base;
38 : : };
39 : :
40 : : extern struct dentry *arch_debugfs_dir;
41 : :
42 : : #define DEFINE_DEBUGFS_ATTRIBUTE(__fops, __get, __set, __fmt) \
43 : : static int __fops ## _open(struct inode *inode, struct file *file) \
44 : : { \
45 : : __simple_attr_check_format(__fmt, 0ull); \
46 : : return simple_attr_open(inode, file, __get, __set, __fmt); \
47 : : } \
48 : : static const struct file_operations __fops = { \
49 : : .owner = THIS_MODULE, \
50 : : .open = __fops ## _open, \
51 : : .release = simple_attr_release, \
52 : : .read = debugfs_attr_read, \
53 : : .write = debugfs_attr_write, \
54 : : .llseek = no_llseek, \
55 : : }
56 : :
57 : : typedef struct vfsmount *(*debugfs_automount_t)(struct dentry *, void *);
58 : :
59 : : #if defined(CONFIG_DEBUG_FS)
60 : :
61 : : struct dentry *debugfs_lookup(const char *name, struct dentry *parent);
62 : :
63 : : struct dentry *debugfs_create_file(const char *name, umode_t mode,
64 : : struct dentry *parent, void *data,
65 : : const struct file_operations *fops);
66 : : struct dentry *debugfs_create_file_unsafe(const char *name, umode_t mode,
67 : : struct dentry *parent, void *data,
68 : : const struct file_operations *fops);
69 : :
70 : : struct dentry *debugfs_create_file_size(const char *name, umode_t mode,
71 : : struct dentry *parent, void *data,
72 : : const struct file_operations *fops,
73 : : loff_t file_size);
74 : :
75 : : struct dentry *debugfs_create_dir(const char *name, struct dentry *parent);
76 : :
77 : : struct dentry *debugfs_create_symlink(const char *name, struct dentry *parent,
78 : : const char *dest);
79 : :
80 : : struct dentry *debugfs_create_automount(const char *name,
81 : : struct dentry *parent,
82 : : debugfs_automount_t f,
83 : : void *data);
84 : :
85 : : void debugfs_remove(struct dentry *dentry);
86 : : #define debugfs_remove_recursive debugfs_remove
87 : :
88 : : const struct file_operations *debugfs_real_fops(const struct file *filp);
89 : :
90 : : int debugfs_file_get(struct dentry *dentry);
91 : : void debugfs_file_put(struct dentry *dentry);
92 : :
93 : : ssize_t debugfs_attr_read(struct file *file, char __user *buf,
94 : : size_t len, loff_t *ppos);
95 : : ssize_t debugfs_attr_write(struct file *file, const char __user *buf,
96 : : size_t len, loff_t *ppos);
97 : :
98 : : struct dentry *debugfs_rename(struct dentry *old_dir, struct dentry *old_dentry,
99 : : struct dentry *new_dir, const char *new_name);
100 : :
101 : : void debugfs_create_u8(const char *name, umode_t mode, struct dentry *parent,
102 : : u8 *value);
103 : : void debugfs_create_u16(const char *name, umode_t mode, struct dentry *parent,
104 : : u16 *value);
105 : : struct dentry *debugfs_create_u32(const char *name, umode_t mode,
106 : : struct dentry *parent, u32 *value);
107 : : void debugfs_create_u64(const char *name, umode_t mode, struct dentry *parent,
108 : : u64 *value);
109 : : struct dentry *debugfs_create_ulong(const char *name, umode_t mode,
110 : : struct dentry *parent, unsigned long *value);
111 : : void debugfs_create_x8(const char *name, umode_t mode, struct dentry *parent,
112 : : u8 *value);
113 : : void debugfs_create_x16(const char *name, umode_t mode, struct dentry *parent,
114 : : u16 *value);
115 : : void debugfs_create_x32(const char *name, umode_t mode, struct dentry *parent,
116 : : u32 *value);
117 : : void debugfs_create_x64(const char *name, umode_t mode, struct dentry *parent,
118 : : u64 *value);
119 : : void debugfs_create_size_t(const char *name, umode_t mode,
120 : : struct dentry *parent, size_t *value);
121 : : void debugfs_create_atomic_t(const char *name, umode_t mode,
122 : : struct dentry *parent, atomic_t *value);
123 : : struct dentry *debugfs_create_bool(const char *name, umode_t mode,
124 : : struct dentry *parent, bool *value);
125 : :
126 : : struct dentry *debugfs_create_blob(const char *name, umode_t mode,
127 : : struct dentry *parent,
128 : : struct debugfs_blob_wrapper *blob);
129 : :
130 : : void debugfs_create_regset32(const char *name, umode_t mode,
131 : : struct dentry *parent,
132 : : struct debugfs_regset32 *regset);
133 : :
134 : : void debugfs_print_regs32(struct seq_file *s, const struct debugfs_reg32 *regs,
135 : : int nregs, void __iomem *base, char *prefix);
136 : :
137 : : void debugfs_create_u32_array(const char *name, umode_t mode,
138 : : struct dentry *parent, u32 *array, u32 elements);
139 : :
140 : : struct dentry *debugfs_create_devm_seqfile(struct device *dev, const char *name,
141 : : struct dentry *parent,
142 : : int (*read_fn)(struct seq_file *s,
143 : : void *data));
144 : :
145 : : bool debugfs_initialized(void);
146 : :
147 : : ssize_t debugfs_read_file_bool(struct file *file, char __user *user_buf,
148 : : size_t count, loff_t *ppos);
149 : :
150 : : ssize_t debugfs_write_file_bool(struct file *file, const char __user *user_buf,
151 : : size_t count, loff_t *ppos);
152 : :
153 : : #else
154 : :
155 : : #include <linux/err.h>
156 : :
157 : : /*
158 : : * We do not return NULL from these functions if CONFIG_DEBUG_FS is not enabled
159 : : * so users have a chance to detect if there was a real error or not. We don't
160 : : * want to duplicate the design decision mistakes of procfs and devfs again.
161 : : */
162 : :
163 : : static inline struct dentry *debugfs_lookup(const char *name,
164 : : struct dentry *parent)
165 : : {
166 : : return ERR_PTR(-ENODEV);
167 : : }
168 : :
169 : : static inline struct dentry *debugfs_create_file(const char *name, umode_t mode,
170 : : struct dentry *parent, void *data,
171 : : const struct file_operations *fops)
172 : : {
173 : : return ERR_PTR(-ENODEV);
174 : : }
175 : :
176 : : static inline struct dentry *debugfs_create_file_unsafe(const char *name,
177 : : umode_t mode, struct dentry *parent,
178 : : void *data,
179 : : const struct file_operations *fops)
180 : : {
181 : : return ERR_PTR(-ENODEV);
182 : : }
183 : :
184 : : static inline struct dentry *debugfs_create_file_size(const char *name, umode_t mode,
185 : : struct dentry *parent, void *data,
186 : : const struct file_operations *fops,
187 : : loff_t file_size)
188 : : {
189 : : return ERR_PTR(-ENODEV);
190 : : }
191 : :
192 : : static inline struct dentry *debugfs_create_dir(const char *name,
193 : : struct dentry *parent)
194 : : {
195 : : return ERR_PTR(-ENODEV);
196 : : }
197 : :
198 : : static inline struct dentry *debugfs_create_symlink(const char *name,
199 : : struct dentry *parent,
200 : : const char *dest)
201 : : {
202 : : return ERR_PTR(-ENODEV);
203 : : }
204 : :
205 : : static inline struct dentry *debugfs_create_automount(const char *name,
206 : : struct dentry *parent,
207 : : debugfs_automount_t f,
208 : : void *data)
209 : : {
210 : : return ERR_PTR(-ENODEV);
211 : : }
212 : :
213 : : static inline void debugfs_remove(struct dentry *dentry)
214 : : { }
215 : :
216 : : static inline void debugfs_remove_recursive(struct dentry *dentry)
217 : : { }
218 : :
219 : : const struct file_operations *debugfs_real_fops(const struct file *filp);
220 : :
221 : : static inline int debugfs_file_get(struct dentry *dentry)
222 : : {
223 : : return 0;
224 : : }
225 : :
226 : : static inline void debugfs_file_put(struct dentry *dentry)
227 : : { }
228 : :
229 : : static inline ssize_t debugfs_attr_read(struct file *file, char __user *buf,
230 : : size_t len, loff_t *ppos)
231 : : {
232 : : return -ENODEV;
233 : : }
234 : :
235 : : static inline ssize_t debugfs_attr_write(struct file *file,
236 : : const char __user *buf,
237 : : size_t len, loff_t *ppos)
238 : : {
239 : : return -ENODEV;
240 : : }
241 : :
242 : : static inline struct dentry *debugfs_rename(struct dentry *old_dir, struct dentry *old_dentry,
243 : : struct dentry *new_dir, char *new_name)
244 : : {
245 : : return ERR_PTR(-ENODEV);
246 : : }
247 : :
248 : : static inline void debugfs_create_u8(const char *name, umode_t mode,
249 : : struct dentry *parent, u8 *value) { }
250 : :
251 : : static inline void debugfs_create_u16(const char *name, umode_t mode,
252 : : struct dentry *parent, u16 *value) { }
253 : :
254 : : static inline struct dentry *debugfs_create_u32(const char *name, umode_t mode,
255 : : struct dentry *parent,
256 : : u32 *value)
257 : : {
258 : : return ERR_PTR(-ENODEV);
259 : : }
260 : :
261 : : static inline void debugfs_create_u64(const char *name, umode_t mode,
262 : : struct dentry *parent, u64 *value) { }
263 : :
264 : : static inline struct dentry *debugfs_create_ulong(const char *name,
265 : : umode_t mode,
266 : : struct dentry *parent,
267 : : unsigned long *value)
268 : : {
269 : : return ERR_PTR(-ENODEV);
270 : : }
271 : :
272 : : static inline void debugfs_create_x8(const char *name, umode_t mode,
273 : : struct dentry *parent, u8 *value) { }
274 : :
275 : : static inline void debugfs_create_x16(const char *name, umode_t mode,
276 : : struct dentry *parent, u16 *value) { }
277 : :
278 : : static inline void debugfs_create_x32(const char *name, umode_t mode,
279 : : struct dentry *parent, u32 *value) { }
280 : :
281 : : static inline void debugfs_create_x64(const char *name, umode_t mode,
282 : : struct dentry *parent, u64 *value) { }
283 : :
284 : : static inline void debugfs_create_size_t(const char *name, umode_t mode,
285 : : struct dentry *parent, size_t *value)
286 : : { }
287 : :
288 : : static inline void debugfs_create_atomic_t(const char *name, umode_t mode,
289 : : struct dentry *parent,
290 : : atomic_t *value)
291 : : { }
292 : :
293 : : static inline struct dentry *debugfs_create_bool(const char *name, umode_t mode,
294 : : struct dentry *parent,
295 : : bool *value)
296 : : {
297 : : return ERR_PTR(-ENODEV);
298 : : }
299 : :
300 : : static inline struct dentry *debugfs_create_blob(const char *name, umode_t mode,
301 : : struct dentry *parent,
302 : : struct debugfs_blob_wrapper *blob)
303 : : {
304 : : return ERR_PTR(-ENODEV);
305 : : }
306 : :
307 : : static inline void debugfs_create_regset32(const char *name, umode_t mode,
308 : : struct dentry *parent,
309 : : struct debugfs_regset32 *regset)
310 : : {
311 : : }
312 : :
313 : : static inline void debugfs_print_regs32(struct seq_file *s, const struct debugfs_reg32 *regs,
314 : : int nregs, void __iomem *base, char *prefix)
315 : : {
316 : : }
317 : :
318 : : static inline bool debugfs_initialized(void)
319 : : {
320 : : return false;
321 : : }
322 : :
323 : : static inline void debugfs_create_u32_array(const char *name, umode_t mode,
324 : : struct dentry *parent, u32 *array,
325 : : u32 elements)
326 : : {
327 : : }
328 : :
329 : : static inline struct dentry *debugfs_create_devm_seqfile(struct device *dev,
330 : : const char *name,
331 : : struct dentry *parent,
332 : : int (*read_fn)(struct seq_file *s,
333 : : void *data))
334 : : {
335 : : return ERR_PTR(-ENODEV);
336 : : }
337 : :
338 : : static inline ssize_t debugfs_read_file_bool(struct file *file,
339 : : char __user *user_buf,
340 : : size_t count, loff_t *ppos)
341 : : {
342 : : return -ENODEV;
343 : : }
344 : :
345 : : static inline ssize_t debugfs_write_file_bool(struct file *file,
346 : : const char __user *user_buf,
347 : : size_t count, loff_t *ppos)
348 : : {
349 : : return -ENODEV;
350 : : }
351 : :
352 : : #endif
353 : :
354 : : /**
355 : : * debugfs_create_xul - create a debugfs file that is used to read and write an
356 : : * unsigned long value, formatted in hexadecimal
357 : : * @name: a pointer to a string containing the name of the file to create.
358 : : * @mode: the permission that the file should have
359 : : * @parent: a pointer to the parent dentry for this file. This should be a
360 : : * directory dentry if set. If this parameter is %NULL, then the
361 : : * file will be created in the root of the debugfs filesystem.
362 : : * @value: a pointer to the variable that the file should read to and write
363 : : * from.
364 : : */
365 : 0 : static inline void debugfs_create_xul(const char *name, umode_t mode,
366 : : struct dentry *parent,
367 : : unsigned long *value)
368 : : {
369 : 0 : if (sizeof(*value) == sizeof(u32))
370 : : debugfs_create_x32(name, mode, parent, (u32 *)value);
371 : : else
372 : 0 : debugfs_create_x64(name, mode, parent, (u64 *)value);
373 : : }
374 : :
375 : : #endif
|