13bce94fdSGreg Kroah-Hartman // SPDX-License-Identifier: GPL-2.0 21da177e4SLinus Torvalds /* 31da177e4SLinus Torvalds * debugfs.h - a tiny little debug file system 41da177e4SLinus Torvalds * 51da177e4SLinus Torvalds * Copyright (C) 2004 Greg Kroah-Hartman <[email protected]> 61da177e4SLinus Torvalds * Copyright (C) 2004 IBM Inc. 71da177e4SLinus Torvalds * 81da177e4SLinus Torvalds * debugfs is for people to use instead of /proc or /sys. 9e1b4fc7aSMauro Carvalho Chehab * See Documentation/filesystems/ for more details. 101da177e4SLinus Torvalds */ 111da177e4SLinus Torvalds 121da177e4SLinus Torvalds #ifndef _DEBUGFS_H_ 131da177e4SLinus Torvalds #define _DEBUGFS_H_ 141da177e4SLinus Torvalds 151da177e4SLinus Torvalds #include <linux/fs.h> 161a087c6aSAlessandro Rubini #include <linux/seq_file.h> 171da177e4SLinus Torvalds 18a7a76cefSRoland Dreier #include <linux/types.h> 1949d200deSNicolai Stange #include <linux/compiler.h> 20a7a76cefSRoland Dreier 21f30d0a81SArend van Spriel struct device; 22a7a76cefSRoland Dreier struct file_operations; 23a7a76cefSRoland Dreier 24dd308bc3SMichael Ellerman struct debugfs_blob_wrapper { 25dd308bc3SMichael Ellerman void *data; 26dd308bc3SMichael Ellerman unsigned long size; 27dd308bc3SMichael Ellerman }; 28dd308bc3SMichael Ellerman 291a087c6aSAlessandro Rubini struct debugfs_reg32 { 301a087c6aSAlessandro Rubini char *name; 311a087c6aSAlessandro Rubini unsigned long offset; 321a087c6aSAlessandro Rubini }; 331a087c6aSAlessandro Rubini 341a087c6aSAlessandro Rubini struct debugfs_regset32 { 35833d6e01SFelipe Balbi const struct debugfs_reg32 *regs; 361a087c6aSAlessandro Rubini int nregs; 371a087c6aSAlessandro Rubini void __iomem *base; 381a087c6aSAlessandro Rubini }; 391a087c6aSAlessandro Rubini 40ae79cdaaS[email protected] extern struct dentry *arch_debugfs_dir; 41ae79cdaaS[email protected] 427f847dd3SArnd Bergmann #define DEFINE_DEBUGFS_ATTRIBUTE(__fops, __get, __set, __fmt) \ 437f847dd3SArnd Bergmann static int __fops ## _open(struct inode *inode, struct file *file) \ 447f847dd3SArnd Bergmann { \ 457f847dd3SArnd Bergmann __simple_attr_check_format(__fmt, 0ull); \ 467f847dd3SArnd Bergmann return simple_attr_open(inode, file, __get, __set, __fmt); \ 477f847dd3SArnd Bergmann } \ 487f847dd3SArnd Bergmann static const struct file_operations __fops = { \ 497f847dd3SArnd Bergmann .owner = THIS_MODULE, \ 507f847dd3SArnd Bergmann .open = __fops ## _open, \ 517f847dd3SArnd Bergmann .release = simple_attr_release, \ 527f847dd3SArnd Bergmann .read = debugfs_attr_read, \ 537f847dd3SArnd Bergmann .write = debugfs_attr_write, \ 54895ce6c8SGeliang Tang .llseek = no_llseek, \ 557f847dd3SArnd Bergmann } 567f847dd3SArnd Bergmann 571da177e4SLinus Torvalds #if defined(CONFIG_DEBUG_FS) 583634634eSHarvey Harrison 59a7c5437bSOmar Sandoval struct dentry *debugfs_lookup(const char *name, struct dentry *parent); 60a7c5437bSOmar Sandoval 61f4ae40a6SAl Viro struct dentry *debugfs_create_file(const char *name, umode_t mode, 621da177e4SLinus Torvalds struct dentry *parent, void *data, 6399ac48f5SArjan van de Ven const struct file_operations *fops); 64c6468808SNicolai Stange struct dentry *debugfs_create_file_unsafe(const char *name, umode_t mode, 65c6468808SNicolai Stange struct dentry *parent, void *data, 66c6468808SNicolai Stange const struct file_operations *fops); 671da177e4SLinus Torvalds 68e59b4e91SDavid Howells struct dentry *debugfs_create_file_size(const char *name, umode_t mode, 69e59b4e91SDavid Howells struct dentry *parent, void *data, 70e59b4e91SDavid Howells const struct file_operations *fops, 71e59b4e91SDavid Howells loff_t file_size); 72e59b4e91SDavid Howells 731da177e4SLinus Torvalds struct dentry *debugfs_create_dir(const char *name, struct dentry *parent); 741da177e4SLinus Torvalds 7566f54963SPeter Oberparleiter struct dentry *debugfs_create_symlink(const char *name, struct dentry *parent, 7666f54963SPeter Oberparleiter const char *dest); 7766f54963SPeter Oberparleiter 7893faccbbSEric W. Biederman typedef struct vfsmount *(*debugfs_automount_t)(struct dentry *, void *); 7977b3da6eSAl Viro struct dentry *debugfs_create_automount(const char *name, 8077b3da6eSAl Viro struct dentry *parent, 8193faccbbSEric W. Biederman debugfs_automount_t f, 8277b3da6eSAl Viro void *data); 8377b3da6eSAl Viro 841da177e4SLinus Torvalds void debugfs_remove(struct dentry *dentry); 859505e637SHaavard Skinnemoen void debugfs_remove_recursive(struct dentry *dentry); 861da177e4SLinus Torvalds 87055ab8e3SNicolai Stange const struct file_operations *debugfs_real_fops(const struct file *filp); 887c8d4698SNicolai Stange 89e9117a5aSNicolai Stange int debugfs_file_get(struct dentry *dentry); 90e9117a5aSNicolai Stange void debugfs_file_put(struct dentry *dentry); 91e9117a5aSNicolai Stange 92c6468808SNicolai Stange ssize_t debugfs_attr_read(struct file *file, char __user *buf, 93c6468808SNicolai Stange size_t len, loff_t *ppos); 94c6468808SNicolai Stange ssize_t debugfs_attr_write(struct file *file, const char __user *buf, 95c6468808SNicolai Stange size_t len, loff_t *ppos); 96c6468808SNicolai Stange 97cfc94cdfSJan Kara struct dentry *debugfs_rename(struct dentry *old_dir, struct dentry *old_dentry, 98cfc94cdfSJan Kara struct dentry *new_dir, const char *new_name); 99cfc94cdfSJan Kara 1009655ac4aSGreg Kroah-Hartman void debugfs_create_u8(const char *name, umode_t mode, struct dentry *parent, 1019655ac4aSGreg Kroah-Hartman u8 *value); 102313f5dbbSGreg Kroah-Hartman void debugfs_create_u16(const char *name, umode_t mode, struct dentry *parent, 103313f5dbbSGreg Kroah-Hartman u16 *value); 104f4ae40a6SAl Viro struct dentry *debugfs_create_u32(const char *name, umode_t mode, 1051da177e4SLinus Torvalds struct dentry *parent, u32 *value); 106ad26221fSGreg Kroah-Hartman void debugfs_create_u64(const char *name, umode_t mode, struct dentry *parent, 107ad26221fSGreg Kroah-Hartman u64 *value); 108c23fe831SViresh Kumar struct dentry *debugfs_create_ulong(const char *name, umode_t mode, 109c23fe831SViresh Kumar struct dentry *parent, unsigned long *value); 110f4ae40a6SAl Viro struct dentry *debugfs_create_x8(const char *name, umode_t mode, 1112ebefc50SRobin Getz struct dentry *parent, u8 *value); 112*e40d38f2SGreg Kroah-Hartman void debugfs_create_x16(const char *name, umode_t mode, struct dentry *parent, 113*e40d38f2SGreg Kroah-Hartman u16 *value); 114f4ae40a6SAl Viro struct dentry *debugfs_create_x32(const char *name, umode_t mode, 1152ebefc50SRobin Getz struct dentry *parent, u32 *value); 116f4ae40a6SAl Viro struct dentry *debugfs_create_x64(const char *name, umode_t mode, 11715b0beaaSHuang Ying struct dentry *parent, u64 *value); 1188e580263SGreg Kroah-Hartman void debugfs_create_size_t(const char *name, umode_t mode, 1195e078787SInaky Perez-Gonzalez struct dentry *parent, size_t *value); 1203a76e5e0SSeth Jennings struct dentry *debugfs_create_atomic_t(const char *name, umode_t mode, 1213a76e5e0SSeth Jennings struct dentry *parent, atomic_t *value); 122f4ae40a6SAl Viro struct dentry *debugfs_create_bool(const char *name, umode_t mode, 123621a5f7aSViresh Kumar struct dentry *parent, bool *value); 1241da177e4SLinus Torvalds 125f4ae40a6SAl Viro struct dentry *debugfs_create_blob(const char *name, umode_t mode, 126dd308bc3SMichael Ellerman struct dentry *parent, 127dd308bc3SMichael Ellerman struct debugfs_blob_wrapper *blob); 128c0f92ba9SFrederic Weisbecker 12988187398SAl Viro struct dentry *debugfs_create_regset32(const char *name, umode_t mode, 1301a087c6aSAlessandro Rubini struct dentry *parent, 1311a087c6aSAlessandro Rubini struct debugfs_regset32 *regset); 1321a087c6aSAlessandro Rubini 1339761536eSJoe Perches void debugfs_print_regs32(struct seq_file *s, const struct debugfs_reg32 *regs, 1341a087c6aSAlessandro Rubini int nregs, void __iomem *base, char *prefix); 1351a087c6aSAlessandro Rubini 136c9c2c27dSGreg Kroah-Hartman void debugfs_create_u32_array(const char *name, umode_t mode, 137c9c2c27dSGreg Kroah-Hartman struct dentry *parent, u32 *array, u32 elements); 1389fe2a701SSrivatsa Vaddagiri 13998210b7fSArend van Spriel struct dentry *debugfs_create_devm_seqfile(struct device *dev, const char *name, 14098210b7fSArend van Spriel struct dentry *parent, 14198210b7fSArend van Spriel int (*read_fn)(struct seq_file *s, 14298210b7fSArend van Spriel void *data)); 14398210b7fSArend van Spriel 144c0f92ba9SFrederic Weisbecker bool debugfs_initialized(void); 145c0f92ba9SFrederic Weisbecker 1460642ef6fSRichard Fitzgerald ssize_t debugfs_read_file_bool(struct file *file, char __user *user_buf, 1470642ef6fSRichard Fitzgerald size_t count, loff_t *ppos); 1480642ef6fSRichard Fitzgerald 1490642ef6fSRichard Fitzgerald ssize_t debugfs_write_file_bool(struct file *file, const char __user *user_buf, 1500642ef6fSRichard Fitzgerald size_t count, loff_t *ppos); 1510642ef6fSRichard Fitzgerald 1521da177e4SLinus Torvalds #else 153a7a76cefSRoland Dreier 154a7a76cefSRoland Dreier #include <linux/err.h> 155a7a76cefSRoland Dreier 1561da177e4SLinus Torvalds /* 1571da177e4SLinus Torvalds * We do not return NULL from these functions if CONFIG_DEBUG_FS is not enabled 1581da177e4SLinus Torvalds * so users have a chance to detect if there was a real error or not. We don't 1591da177e4SLinus Torvalds * want to duplicate the design decision mistakes of procfs and devfs again. 1601da177e4SLinus Torvalds */ 1611da177e4SLinus Torvalds 162a7c5437bSOmar Sandoval static inline struct dentry *debugfs_lookup(const char *name, 163a7c5437bSOmar Sandoval struct dentry *parent) 164a7c5437bSOmar Sandoval { 165a7c5437bSOmar Sandoval return ERR_PTR(-ENODEV); 166a7c5437bSOmar Sandoval } 167a7c5437bSOmar Sandoval 168f4ae40a6SAl Viro static inline struct dentry *debugfs_create_file(const char *name, umode_t mode, 169bde11d79SJean Delvare struct dentry *parent, void *data, 170bde11d79SJean Delvare const struct file_operations *fops) 1711da177e4SLinus Torvalds { 1721da177e4SLinus Torvalds return ERR_PTR(-ENODEV); 1731da177e4SLinus Torvalds } 1741da177e4SLinus Torvalds 175c2a737ebSViresh Kumar static inline struct dentry *debugfs_create_file_unsafe(const char *name, 176c2a737ebSViresh Kumar umode_t mode, struct dentry *parent, 177c2a737ebSViresh Kumar void *data, 178c2a737ebSViresh Kumar const struct file_operations *fops) 179c2a737ebSViresh Kumar { 180c2a737ebSViresh Kumar return ERR_PTR(-ENODEV); 181c2a737ebSViresh Kumar } 182c2a737ebSViresh Kumar 183e59b4e91SDavid Howells static inline struct dentry *debugfs_create_file_size(const char *name, umode_t mode, 184e59b4e91SDavid Howells struct dentry *parent, void *data, 185e59b4e91SDavid Howells const struct file_operations *fops, 186e59b4e91SDavid Howells loff_t file_size) 187e59b4e91SDavid Howells { 188e59b4e91SDavid Howells return ERR_PTR(-ENODEV); 189e59b4e91SDavid Howells } 190e59b4e91SDavid Howells 1911da177e4SLinus Torvalds static inline struct dentry *debugfs_create_dir(const char *name, 1921da177e4SLinus Torvalds struct dentry *parent) 1931da177e4SLinus Torvalds { 1941da177e4SLinus Torvalds return ERR_PTR(-ENODEV); 1951da177e4SLinus Torvalds } 1961da177e4SLinus Torvalds 19766f54963SPeter Oberparleiter static inline struct dentry *debugfs_create_symlink(const char *name, 19866f54963SPeter Oberparleiter struct dentry *parent, 19966f54963SPeter Oberparleiter const char *dest) 20066f54963SPeter Oberparleiter { 20166f54963SPeter Oberparleiter return ERR_PTR(-ENODEV); 20266f54963SPeter Oberparleiter } 20366f54963SPeter Oberparleiter 20494e1dec7SJiaxing Wang static inline struct dentry *debugfs_create_automount(const char *name, 20594e1dec7SJiaxing Wang struct dentry *parent, 20694e1dec7SJiaxing Wang struct vfsmount *(*f)(void *), 20794e1dec7SJiaxing Wang void *data) 20894e1dec7SJiaxing Wang { 20994e1dec7SJiaxing Wang return ERR_PTR(-ENODEV); 21094e1dec7SJiaxing Wang } 21194e1dec7SJiaxing Wang 2121da177e4SLinus Torvalds static inline void debugfs_remove(struct dentry *dentry) 2131da177e4SLinus Torvalds { } 2141da177e4SLinus Torvalds 2159505e637SHaavard Skinnemoen static inline void debugfs_remove_recursive(struct dentry *dentry) 2169505e637SHaavard Skinnemoen { } 2179505e637SHaavard Skinnemoen 218f50caa9bSArnd Bergmann const struct file_operations *debugfs_real_fops(const struct file *filp); 219f50caa9bSArnd Bergmann 220e9117a5aSNicolai Stange static inline int debugfs_file_get(struct dentry *dentry) 221e9117a5aSNicolai Stange { 222e9117a5aSNicolai Stange return 0; 223e9117a5aSNicolai Stange } 224e9117a5aSNicolai Stange 225e9117a5aSNicolai Stange static inline void debugfs_file_put(struct dentry *dentry) 226e9117a5aSNicolai Stange { } 227e9117a5aSNicolai Stange 2287f847dd3SArnd Bergmann static inline ssize_t debugfs_attr_read(struct file *file, char __user *buf, 2297f847dd3SArnd Bergmann size_t len, loff_t *ppos) 2307f847dd3SArnd Bergmann { 2317f847dd3SArnd Bergmann return -ENODEV; 2327f847dd3SArnd Bergmann } 2337f847dd3SArnd Bergmann 2347f847dd3SArnd Bergmann static inline ssize_t debugfs_attr_write(struct file *file, 2357f847dd3SArnd Bergmann const char __user *buf, 2367f847dd3SArnd Bergmann size_t len, loff_t *ppos) 2377f847dd3SArnd Bergmann { 2387f847dd3SArnd Bergmann return -ENODEV; 2397f847dd3SArnd Bergmann } 240c6468808SNicolai Stange 241cfc94cdfSJan Kara static inline struct dentry *debugfs_rename(struct dentry *old_dir, struct dentry *old_dentry, 242cfc94cdfSJan Kara struct dentry *new_dir, char *new_name) 243cfc94cdfSJan Kara { 244cfc94cdfSJan Kara return ERR_PTR(-ENODEV); 245cfc94cdfSJan Kara } 246cfc94cdfSJan Kara 2479655ac4aSGreg Kroah-Hartman static inline void debugfs_create_u8(const char *name, umode_t mode, 2489655ac4aSGreg Kroah-Hartman struct dentry *parent, u8 *value) { } 2491da177e4SLinus Torvalds 250313f5dbbSGreg Kroah-Hartman static inline void debugfs_create_u16(const char *name, umode_t mode, 251313f5dbbSGreg Kroah-Hartman struct dentry *parent, u16 *value) { } 2521da177e4SLinus Torvalds 253f4ae40a6SAl Viro static inline struct dentry *debugfs_create_u32(const char *name, umode_t mode, 2541da177e4SLinus Torvalds struct dentry *parent, 2557b558637SMichal Ostrowski u32 *value) 2561da177e4SLinus Torvalds { 2571da177e4SLinus Torvalds return ERR_PTR(-ENODEV); 2581da177e4SLinus Torvalds } 2591da177e4SLinus Torvalds 260ad26221fSGreg Kroah-Hartman static inline void debugfs_create_u64(const char *name, umode_t mode, 261ad26221fSGreg Kroah-Hartman struct dentry *parent, u64 *value) { } 2628447891fSMichael Ellerman 263c2a737ebSViresh Kumar static inline struct dentry *debugfs_create_ulong(const char *name, 264c2a737ebSViresh Kumar umode_t mode, 265c2a737ebSViresh Kumar struct dentry *parent, 266c2a737ebSViresh Kumar unsigned long *value) 267c2a737ebSViresh Kumar { 268c2a737ebSViresh Kumar return ERR_PTR(-ENODEV); 269c2a737ebSViresh Kumar } 270c2a737ebSViresh Kumar 271f4ae40a6SAl Viro static inline struct dentry *debugfs_create_x8(const char *name, umode_t mode, 2722ebefc50SRobin Getz struct dentry *parent, 2732ebefc50SRobin Getz u8 *value) 2742ebefc50SRobin Getz { 2752ebefc50SRobin Getz return ERR_PTR(-ENODEV); 2762ebefc50SRobin Getz } 2772ebefc50SRobin Getz 278*e40d38f2SGreg Kroah-Hartman static inline void debugfs_create_x16(const char *name, umode_t mode, 279*e40d38f2SGreg Kroah-Hartman struct dentry *parent, u16 *value) { } 2802ebefc50SRobin Getz 281f4ae40a6SAl Viro static inline struct dentry *debugfs_create_x32(const char *name, umode_t mode, 2822ebefc50SRobin Getz struct dentry *parent, 2832ebefc50SRobin Getz u32 *value) 2842ebefc50SRobin Getz { 2852ebefc50SRobin Getz return ERR_PTR(-ENODEV); 2862ebefc50SRobin Getz } 2872ebefc50SRobin Getz 2883159269eSJohannes Berg static inline struct dentry *debugfs_create_x64(const char *name, umode_t mode, 2893159269eSJohannes Berg struct dentry *parent, 2903159269eSJohannes Berg u64 *value) 2913159269eSJohannes Berg { 2923159269eSJohannes Berg return ERR_PTR(-ENODEV); 2933159269eSJohannes Berg } 2943159269eSJohannes Berg 2958e580263SGreg Kroah-Hartman static inline void debugfs_create_size_t(const char *name, umode_t mode, 2968e580263SGreg Kroah-Hartman struct dentry *parent, size_t *value) 2978e580263SGreg Kroah-Hartman { } 2988adb711fSInaky Perez-Gonzalez 2995b880214SWeijie Yang static inline struct dentry *debugfs_create_atomic_t(const char *name, umode_t mode, 3005b880214SWeijie Yang struct dentry *parent, atomic_t *value) 3015b880214SWeijie Yang { 3025b880214SWeijie Yang return ERR_PTR(-ENODEV); 3035b880214SWeijie Yang } 3045b880214SWeijie Yang 305f4ae40a6SAl Viro static inline struct dentry *debugfs_create_bool(const char *name, umode_t mode, 3061da177e4SLinus Torvalds struct dentry *parent, 307621a5f7aSViresh Kumar bool *value) 3081da177e4SLinus Torvalds { 3091da177e4SLinus Torvalds return ERR_PTR(-ENODEV); 3101da177e4SLinus Torvalds } 3111da177e4SLinus Torvalds 312f4ae40a6SAl Viro static inline struct dentry *debugfs_create_blob(const char *name, umode_t mode, 313dd308bc3SMichael Ellerman struct dentry *parent, 314dd308bc3SMichael Ellerman struct debugfs_blob_wrapper *blob) 315dd308bc3SMichael Ellerman { 316dd308bc3SMichael Ellerman return ERR_PTR(-ENODEV); 317dd308bc3SMichael Ellerman } 318dd308bc3SMichael Ellerman 3191a087c6aSAlessandro Rubini static inline struct dentry *debugfs_create_regset32(const char *name, 32088187398SAl Viro umode_t mode, struct dentry *parent, 3211a087c6aSAlessandro Rubini struct debugfs_regset32 *regset) 3221a087c6aSAlessandro Rubini { 3231a087c6aSAlessandro Rubini return ERR_PTR(-ENODEV); 3241a087c6aSAlessandro Rubini } 3251a087c6aSAlessandro Rubini 3269761536eSJoe Perches static inline void debugfs_print_regs32(struct seq_file *s, const struct debugfs_reg32 *regs, 3275b880214SWeijie Yang int nregs, void __iomem *base, char *prefix) 3285b880214SWeijie Yang { 3295b880214SWeijie Yang } 3305b880214SWeijie Yang 331c0f92ba9SFrederic Weisbecker static inline bool debugfs_initialized(void) 332c0f92ba9SFrederic Weisbecker { 333c0f92ba9SFrederic Weisbecker return false; 334c0f92ba9SFrederic Weisbecker } 335c0f92ba9SFrederic Weisbecker 336c9c2c27dSGreg Kroah-Hartman static inline void debugfs_create_u32_array(const char *name, umode_t mode, 337c9c2c27dSGreg Kroah-Hartman struct dentry *parent, u32 *array, 338c9c2c27dSGreg Kroah-Hartman u32 elements) 3399fe2a701SSrivatsa Vaddagiri { 3409fe2a701SSrivatsa Vaddagiri } 3419fe2a701SSrivatsa Vaddagiri 34298210b7fSArend van Spriel static inline struct dentry *debugfs_create_devm_seqfile(struct device *dev, 34398210b7fSArend van Spriel const char *name, 34498210b7fSArend van Spriel struct dentry *parent, 34598210b7fSArend van Spriel int (*read_fn)(struct seq_file *s, 34698210b7fSArend van Spriel void *data)) 34798210b7fSArend van Spriel { 34898210b7fSArend van Spriel return ERR_PTR(-ENODEV); 34998210b7fSArend van Spriel } 35098210b7fSArend van Spriel 3510642ef6fSRichard Fitzgerald static inline ssize_t debugfs_read_file_bool(struct file *file, 3520642ef6fSRichard Fitzgerald char __user *user_buf, 3530642ef6fSRichard Fitzgerald size_t count, loff_t *ppos) 3540642ef6fSRichard Fitzgerald { 3550642ef6fSRichard Fitzgerald return -ENODEV; 3560642ef6fSRichard Fitzgerald } 3570642ef6fSRichard Fitzgerald 3580642ef6fSRichard Fitzgerald static inline ssize_t debugfs_write_file_bool(struct file *file, 3590642ef6fSRichard Fitzgerald const char __user *user_buf, 3600642ef6fSRichard Fitzgerald size_t count, loff_t *ppos) 3610642ef6fSRichard Fitzgerald { 3620642ef6fSRichard Fitzgerald return -ENODEV; 3630642ef6fSRichard Fitzgerald } 3640642ef6fSRichard Fitzgerald 3651da177e4SLinus Torvalds #endif 3661da177e4SLinus Torvalds 3671da177e4SLinus Torvalds #endif 368