1961df833SKyungmin Park /* 2961df833SKyungmin Park * Copyright (c) International Business Machines Corp., 2006 3961df833SKyungmin Park * 4*1a459660SWolfgang Denk * SPDX-License-Identifier: GPL-2.0+ 5961df833SKyungmin Park * 6961df833SKyungmin Park * Author: Artem Bityutskiy (Битюцкий Артём) 7961df833SKyungmin Park */ 8961df833SKyungmin Park 9961df833SKyungmin Park #ifndef __UBI_DEBUG_H__ 10961df833SKyungmin Park #define __UBI_DEBUG_H__ 11961df833SKyungmin Park 12961df833SKyungmin Park #ifdef CONFIG_MTD_UBI_DEBUG 13961df833SKyungmin Park #ifdef UBI_LINUX 14961df833SKyungmin Park #include <linux/random.h> 15961df833SKyungmin Park #endif 16961df833SKyungmin Park 17961df833SKyungmin Park #define ubi_assert(expr) BUG_ON(!(expr)) 18961df833SKyungmin Park #define dbg_err(fmt, ...) ubi_err(fmt, ##__VA_ARGS__) 19961df833SKyungmin Park #else 20961df833SKyungmin Park #define ubi_assert(expr) ({}) 21961df833SKyungmin Park #define dbg_err(fmt, ...) ({}) 22961df833SKyungmin Park #endif 23961df833SKyungmin Park 24961df833SKyungmin Park #ifdef CONFIG_MTD_UBI_DEBUG_DISABLE_BGT 25961df833SKyungmin Park #define DBG_DISABLE_BGT 1 26961df833SKyungmin Park #else 27961df833SKyungmin Park #define DBG_DISABLE_BGT 0 28961df833SKyungmin Park #endif 29961df833SKyungmin Park 30961df833SKyungmin Park #ifdef CONFIG_MTD_UBI_DEBUG_MSG 31961df833SKyungmin Park /* Generic debugging message */ 32961df833SKyungmin Park #define dbg_msg(fmt, ...) \ 33961df833SKyungmin Park printk(KERN_DEBUG "UBI DBG: %s: " fmt "\n", \ 34961df833SKyungmin Park __FUNCTION__, ##__VA_ARGS__) 35961df833SKyungmin Park 36961df833SKyungmin Park #define ubi_dbg_dump_stack() dump_stack() 37961df833SKyungmin Park 38961df833SKyungmin Park struct ubi_ec_hdr; 39961df833SKyungmin Park struct ubi_vid_hdr; 40961df833SKyungmin Park struct ubi_volume; 41961df833SKyungmin Park struct ubi_vtbl_record; 42961df833SKyungmin Park struct ubi_scan_volume; 43961df833SKyungmin Park struct ubi_scan_leb; 44961df833SKyungmin Park struct ubi_mkvol_req; 45961df833SKyungmin Park 46961df833SKyungmin Park void ubi_dbg_dump_ec_hdr(const struct ubi_ec_hdr *ec_hdr); 47961df833SKyungmin Park void ubi_dbg_dump_vid_hdr(const struct ubi_vid_hdr *vid_hdr); 48961df833SKyungmin Park void ubi_dbg_dump_vol_info(const struct ubi_volume *vol); 49961df833SKyungmin Park void ubi_dbg_dump_vtbl_record(const struct ubi_vtbl_record *r, int idx); 50961df833SKyungmin Park void ubi_dbg_dump_sv(const struct ubi_scan_volume *sv); 51961df833SKyungmin Park void ubi_dbg_dump_seb(const struct ubi_scan_leb *seb, int type); 52961df833SKyungmin Park void ubi_dbg_dump_mkvol_req(const struct ubi_mkvol_req *req); 53961df833SKyungmin Park 54961df833SKyungmin Park #else 55961df833SKyungmin Park 56961df833SKyungmin Park #define dbg_msg(fmt, ...) ({}) 57961df833SKyungmin Park #define ubi_dbg_dump_stack() ({}) 58961df833SKyungmin Park #define ubi_dbg_dump_ec_hdr(ec_hdr) ({}) 59961df833SKyungmin Park #define ubi_dbg_dump_vid_hdr(vid_hdr) ({}) 60961df833SKyungmin Park #define ubi_dbg_dump_vol_info(vol) ({}) 61961df833SKyungmin Park #define ubi_dbg_dump_vtbl_record(r, idx) ({}) 62961df833SKyungmin Park #define ubi_dbg_dump_sv(sv) ({}) 63961df833SKyungmin Park #define ubi_dbg_dump_seb(seb, type) ({}) 64961df833SKyungmin Park #define ubi_dbg_dump_mkvol_req(req) ({}) 65961df833SKyungmin Park 66961df833SKyungmin Park #endif /* CONFIG_MTD_UBI_DEBUG_MSG */ 67961df833SKyungmin Park 68961df833SKyungmin Park #ifdef CONFIG_MTD_UBI_DEBUG_MSG_EBA 69961df833SKyungmin Park /* Messages from the eraseblock association unit */ 70961df833SKyungmin Park #define dbg_eba(fmt, ...) dbg_msg(fmt, ##__VA_ARGS__) 71961df833SKyungmin Park #else 72961df833SKyungmin Park #define dbg_eba(fmt, ...) ({}) 73961df833SKyungmin Park #endif 74961df833SKyungmin Park 75961df833SKyungmin Park #ifdef CONFIG_MTD_UBI_DEBUG_MSG_WL 76961df833SKyungmin Park /* Messages from the wear-leveling unit */ 77961df833SKyungmin Park #define dbg_wl(fmt, ...) dbg_msg(fmt, ##__VA_ARGS__) 78961df833SKyungmin Park #else 79961df833SKyungmin Park #define dbg_wl(fmt, ...) ({}) 80961df833SKyungmin Park #endif 81961df833SKyungmin Park 82961df833SKyungmin Park #ifdef CONFIG_MTD_UBI_DEBUG_MSG_IO 83961df833SKyungmin Park /* Messages from the input/output unit */ 84961df833SKyungmin Park #define dbg_io(fmt, ...) dbg_msg(fmt, ##__VA_ARGS__) 85961df833SKyungmin Park #else 86961df833SKyungmin Park #define dbg_io(fmt, ...) ({}) 87961df833SKyungmin Park #endif 88961df833SKyungmin Park 89961df833SKyungmin Park #ifdef CONFIG_MTD_UBI_DEBUG_MSG_BLD 90961df833SKyungmin Park /* Initialization and build messages */ 91961df833SKyungmin Park #define dbg_bld(fmt, ...) dbg_msg(fmt, ##__VA_ARGS__) 92961df833SKyungmin Park #else 93961df833SKyungmin Park #define dbg_bld(fmt, ...) ({}) 94961df833SKyungmin Park #endif 95961df833SKyungmin Park 96961df833SKyungmin Park #ifdef CONFIG_MTD_UBI_DEBUG_EMULATE_BITFLIPS 97961df833SKyungmin Park /** 98961df833SKyungmin Park * ubi_dbg_is_bitflip - if it is time to emulate a bit-flip. 99961df833SKyungmin Park * 100961df833SKyungmin Park * Returns non-zero if a bit-flip should be emulated, otherwise returns zero. 101961df833SKyungmin Park */ 102961df833SKyungmin Park static inline int ubi_dbg_is_bitflip(void) 103961df833SKyungmin Park { 104961df833SKyungmin Park return !(random32() % 200); 105961df833SKyungmin Park } 106961df833SKyungmin Park #else 107961df833SKyungmin Park #define ubi_dbg_is_bitflip() 0 108961df833SKyungmin Park #endif 109961df833SKyungmin Park 110961df833SKyungmin Park #ifdef CONFIG_MTD_UBI_DEBUG_EMULATE_WRITE_FAILURES 111961df833SKyungmin Park /** 112961df833SKyungmin Park * ubi_dbg_is_write_failure - if it is time to emulate a write failure. 113961df833SKyungmin Park * 114961df833SKyungmin Park * Returns non-zero if a write failure should be emulated, otherwise returns 115961df833SKyungmin Park * zero. 116961df833SKyungmin Park */ 117961df833SKyungmin Park static inline int ubi_dbg_is_write_failure(void) 118961df833SKyungmin Park { 119961df833SKyungmin Park return !(random32() % 500); 120961df833SKyungmin Park } 121961df833SKyungmin Park #else 122961df833SKyungmin Park #define ubi_dbg_is_write_failure() 0 123961df833SKyungmin Park #endif 124961df833SKyungmin Park 125961df833SKyungmin Park #ifdef CONFIG_MTD_UBI_DEBUG_EMULATE_ERASE_FAILURES 126961df833SKyungmin Park /** 127961df833SKyungmin Park * ubi_dbg_is_erase_failure - if its time to emulate an erase failure. 128961df833SKyungmin Park * 129961df833SKyungmin Park * Returns non-zero if an erase failure should be emulated, otherwise returns 130961df833SKyungmin Park * zero. 131961df833SKyungmin Park */ 132961df833SKyungmin Park static inline int ubi_dbg_is_erase_failure(void) 133961df833SKyungmin Park { 134961df833SKyungmin Park return !(random32() % 400); 135961df833SKyungmin Park } 136961df833SKyungmin Park #else 137961df833SKyungmin Park #define ubi_dbg_is_erase_failure() 0 138961df833SKyungmin Park #endif 139961df833SKyungmin Park 140961df833SKyungmin Park #endif /* !__UBI_DEBUG_H__ */ 141