1*1a59d1b8SThomas Gleixner /* SPDX-License-Identifier: GPL-2.0-or-later */ 2801c135cSArtem B. Bityutskiy /* 3801c135cSArtem B. Bityutskiy * Copyright (c) International Business Machines Corp., 2006 4801c135cSArtem B. Bityutskiy * 5801c135cSArtem B. Bityutskiy * Author: Artem Bityutskiy (Битюцкий Артём) 6801c135cSArtem B. Bityutskiy */ 7801c135cSArtem B. Bityutskiy 8801c135cSArtem B. Bityutskiy #ifndef __UBI_DEBUG_H__ 9801c135cSArtem B. Bityutskiy #define __UBI_DEBUG_H__ 10801c135cSArtem B. Bityutskiy 11ef7088e7SArtem Bityutskiy void ubi_dump_flash(struct ubi_device *ubi, int pnum, int offset, int len); 12a904e3f1SArtem Bityutskiy void ubi_dump_ec_hdr(const struct ubi_ec_hdr *ec_hdr); 13a904e3f1SArtem Bityutskiy void ubi_dump_vid_hdr(const struct ubi_vid_hdr *vid_hdr); 14ef7088e7SArtem Bityutskiy 15801c135cSArtem B. Bityutskiy #include <linux/random.h> 16801c135cSArtem B. Bityutskiy 17c8566350SArtem Bityutskiy #define ubi_assert(expr) do { \ 18c8566350SArtem Bityutskiy if (unlikely(!(expr))) { \ 19e28453bbSArtem Bityutskiy pr_crit("UBI assert failed in %s at %u (pid %d)\n", \ 20c8566350SArtem Bityutskiy __func__, __LINE__, current->pid); \ 2125886a36SArtem Bityutskiy dump_stack(); \ 22c8566350SArtem Bityutskiy } \ 23c8566350SArtem Bityutskiy } while (0) 24801c135cSArtem B. Bityutskiy 25ab50ff68SArtem Bityutskiy #define ubi_dbg_print_hex_dump(l, ps, pt, r, g, b, len, a) \ 26ab50ff68SArtem Bityutskiy print_hex_dump(l, ps, pt, r, g, b, len, a) 27ab50ff68SArtem Bityutskiy 28ab50ff68SArtem Bityutskiy #define ubi_dbg_msg(type, fmt, ...) \ 29183ae6cfSArtem Bityutskiy pr_debug("UBI DBG " type " (pid %d): " fmt "\n", current->pid, \ 30183ae6cfSArtem Bityutskiy ##__VA_ARGS__) 31ab50ff68SArtem Bityutskiy 32ab50ff68SArtem Bityutskiy /* General debugging messages */ 33ab50ff68SArtem Bityutskiy #define dbg_gen(fmt, ...) ubi_dbg_msg("gen", fmt, ##__VA_ARGS__) 34ab50ff68SArtem Bityutskiy /* Messages from the eraseblock association sub-system */ 35ab50ff68SArtem Bityutskiy #define dbg_eba(fmt, ...) ubi_dbg_msg("eba", fmt, ##__VA_ARGS__) 36ab50ff68SArtem Bityutskiy /* Messages from the wear-leveling sub-system */ 37ab50ff68SArtem Bityutskiy #define dbg_wl(fmt, ...) ubi_dbg_msg("wl", fmt, ##__VA_ARGS__) 38ab50ff68SArtem Bityutskiy /* Messages from the input/output sub-system */ 39ab50ff68SArtem Bityutskiy #define dbg_io(fmt, ...) ubi_dbg_msg("io", fmt, ##__VA_ARGS__) 40ab50ff68SArtem Bityutskiy /* Initialization and build messages */ 41ab50ff68SArtem Bityutskiy #define dbg_bld(fmt, ...) ubi_dbg_msg("bld", fmt, ##__VA_ARGS__) 42ab50ff68SArtem Bityutskiy 43766381f0SArtem Bityutskiy void ubi_dump_vol_info(const struct ubi_volume *vol); 441f021e1dSArtem Bityutskiy void ubi_dump_vtbl_record(const struct ubi_vtbl_record *r, int idx); 45517af48cSArtem Bityutskiy void ubi_dump_av(const struct ubi_ainf_volume *av); 462c5ec5ceSArtem Bityutskiy void ubi_dump_aeb(const struct ubi_ainf_peb *aeb, int type); 47718c00bbSArtem Bityutskiy void ubi_dump_mkvol_req(const struct ubi_mkvol_req *req); 4897d6104bSArtem Bityutskiy int ubi_self_check_all_ff(struct ubi_device *ubi, int pnum, int offset, 4997d6104bSArtem Bityutskiy int len); 502a734bb8SArtem Bityutskiy int ubi_debugfs_init(void); 512a734bb8SArtem Bityutskiy void ubi_debugfs_exit(void); 522a734bb8SArtem Bityutskiy int ubi_debugfs_init_dev(struct ubi_device *ubi); 532a734bb8SArtem Bityutskiy void ubi_debugfs_exit_dev(struct ubi_device *ubi); 542a734bb8SArtem Bityutskiy 5528237e45SArtem Bityutskiy /** 5628237e45SArtem Bityutskiy * ubi_dbg_is_bgt_disabled - if the background thread is disabled. 5727a0f2a3SArtem Bityutskiy * @ubi: UBI device description object 5828237e45SArtem Bityutskiy * 5928237e45SArtem Bityutskiy * Returns non-zero if the UBI background thread is disabled for testing 6028237e45SArtem Bityutskiy * purposes. 6128237e45SArtem Bityutskiy */ 6227a0f2a3SArtem Bityutskiy static inline int ubi_dbg_is_bgt_disabled(const struct ubi_device *ubi) 6328237e45SArtem Bityutskiy { 64eab73772SEzequiel Garcia return ubi->dbg.disable_bgt; 6528237e45SArtem Bityutskiy } 6628237e45SArtem Bityutskiy 67801c135cSArtem B. Bityutskiy /** 68801c135cSArtem B. Bityutskiy * ubi_dbg_is_bitflip - if it is time to emulate a bit-flip. 6927a0f2a3SArtem Bityutskiy * @ubi: UBI device description object 70801c135cSArtem B. Bityutskiy * 71801c135cSArtem B. Bityutskiy * Returns non-zero if a bit-flip should be emulated, otherwise returns zero. 72801c135cSArtem B. Bityutskiy */ 7327a0f2a3SArtem Bityutskiy static inline int ubi_dbg_is_bitflip(const struct ubi_device *ubi) 74801c135cSArtem B. Bityutskiy { 75eab73772SEzequiel Garcia if (ubi->dbg.emulate_bitflips) 76aca662a3SAkinobu Mita return !(prandom_u32() % 200); 7728237e45SArtem Bityutskiy return 0; 78801c135cSArtem B. Bityutskiy } 79801c135cSArtem B. Bityutskiy 80801c135cSArtem B. Bityutskiy /** 81801c135cSArtem B. Bityutskiy * ubi_dbg_is_write_failure - if it is time to emulate a write failure. 8227a0f2a3SArtem Bityutskiy * @ubi: UBI device description object 83801c135cSArtem B. Bityutskiy * 84801c135cSArtem B. Bityutskiy * Returns non-zero if a write failure should be emulated, otherwise returns 85801c135cSArtem B. Bityutskiy * zero. 86801c135cSArtem B. Bityutskiy */ 8727a0f2a3SArtem Bityutskiy static inline int ubi_dbg_is_write_failure(const struct ubi_device *ubi) 88801c135cSArtem B. Bityutskiy { 89eab73772SEzequiel Garcia if (ubi->dbg.emulate_io_failures) 90aca662a3SAkinobu Mita return !(prandom_u32() % 500); 9128237e45SArtem Bityutskiy return 0; 92801c135cSArtem B. Bityutskiy } 93801c135cSArtem B. Bityutskiy 94801c135cSArtem B. Bityutskiy /** 95801c135cSArtem B. Bityutskiy * ubi_dbg_is_erase_failure - if its time to emulate an erase failure. 9627a0f2a3SArtem Bityutskiy * @ubi: UBI device description object 97801c135cSArtem B. Bityutskiy * 98801c135cSArtem B. Bityutskiy * Returns non-zero if an erase failure should be emulated, otherwise returns 99801c135cSArtem B. Bityutskiy * zero. 100801c135cSArtem B. Bityutskiy */ 10127a0f2a3SArtem Bityutskiy static inline int ubi_dbg_is_erase_failure(const struct ubi_device *ubi) 102801c135cSArtem B. Bityutskiy { 103eab73772SEzequiel Garcia if (ubi->dbg.emulate_io_failures) 104aca662a3SAkinobu Mita return !(prandom_u32() % 400); 10528237e45SArtem Bityutskiy return 0; 106801c135cSArtem B. Bityutskiy } 107801c135cSArtem B. Bityutskiy 10864575574SEzequiel Garcia static inline int ubi_dbg_chk_io(const struct ubi_device *ubi) 10964575574SEzequiel Garcia { 110eab73772SEzequiel Garcia return ubi->dbg.chk_io; 11164575574SEzequiel Garcia } 11264575574SEzequiel Garcia 11364575574SEzequiel Garcia static inline int ubi_dbg_chk_gen(const struct ubi_device *ubi) 11464575574SEzequiel Garcia { 115eab73772SEzequiel Garcia return ubi->dbg.chk_gen; 11664575574SEzequiel Garcia } 1175fa7fa5dSRichard Weinberger 1185fa7fa5dSRichard Weinberger static inline int ubi_dbg_chk_fastmap(const struct ubi_device *ubi) 1195fa7fa5dSRichard Weinberger { 1205fa7fa5dSRichard Weinberger return ubi->dbg.chk_fastmap; 1215fa7fa5dSRichard Weinberger } 122479c2c0cSRichard Weinberger 123479c2c0cSRichard Weinberger static inline void ubi_enable_dbg_chk_fastmap(struct ubi_device *ubi) 124479c2c0cSRichard Weinberger { 125479c2c0cSRichard Weinberger ubi->dbg.chk_fastmap = 1; 126479c2c0cSRichard Weinberger } 12750269067Sdavid.oberhollenzer@sigma-star.at 12850269067Sdavid.oberhollenzer@sigma-star.at int ubi_dbg_power_cut(struct ubi_device *ubi, int caller); 129801c135cSArtem B. Bityutskiy #endif /* !__UBI_DEBUG_H__ */ 130