1961df833SKyungmin Park /* 2961df833SKyungmin Park * Copyright (c) International Business Machines Corp., 2006 3961df833SKyungmin Park * 41a459660SWolfgang 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 12ff94bc40SHeiko Schocher void ubi_dump_flash(struct ubi_device *ubi, int pnum, int offset, int len); 13ff94bc40SHeiko Schocher void ubi_dump_ec_hdr(const struct ubi_ec_hdr *ec_hdr); 14ff94bc40SHeiko Schocher void ubi_dump_vid_hdr(const struct ubi_vid_hdr *vid_hdr); 15ff94bc40SHeiko Schocher 16ff94bc40SHeiko Schocher #ifndef __UBOOT__ 17961df833SKyungmin Park #include <linux/random.h> 18961df833SKyungmin Park #endif 19961df833SKyungmin Park 20ff94bc40SHeiko Schocher #define ubi_assert(expr) do { \ 21ff94bc40SHeiko Schocher if (unlikely(!(expr))) { \ 22ff94bc40SHeiko Schocher pr_crit("UBI assert failed in %s at %u (pid %d)\n", \ 23ff94bc40SHeiko Schocher __func__, __LINE__, current->pid); \ 24ff94bc40SHeiko Schocher dump_stack(); \ 25ff94bc40SHeiko Schocher } \ 26ff94bc40SHeiko Schocher } while (0) 27961df833SKyungmin Park 28ff94bc40SHeiko Schocher #define ubi_dbg_print_hex_dump(l, ps, pt, r, g, b, len, a) \ 29ff94bc40SHeiko Schocher print_hex_dump(l, ps, pt, r, g, b, len, a) 30961df833SKyungmin Park 31ff94bc40SHeiko Schocher #define ubi_dbg_msg(type, fmt, ...) \ 32ff94bc40SHeiko Schocher pr_debug("UBI DBG " type " (pid %d): " fmt "\n", current->pid, \ 33ff94bc40SHeiko Schocher ##__VA_ARGS__) 34961df833SKyungmin Park 35ff94bc40SHeiko Schocher /* General debugging messages */ 36ff94bc40SHeiko Schocher #define dbg_gen(fmt, ...) ubi_dbg_msg("gen", fmt, ##__VA_ARGS__) 37ff94bc40SHeiko Schocher /* Messages from the eraseblock association sub-system */ 38ff94bc40SHeiko Schocher #define dbg_eba(fmt, ...) ubi_dbg_msg("eba", fmt, ##__VA_ARGS__) 39ff94bc40SHeiko Schocher /* Messages from the wear-leveling sub-system */ 40ff94bc40SHeiko Schocher #define dbg_wl(fmt, ...) ubi_dbg_msg("wl", fmt, ##__VA_ARGS__) 41ff94bc40SHeiko Schocher /* Messages from the input/output sub-system */ 42ff94bc40SHeiko Schocher #define dbg_io(fmt, ...) ubi_dbg_msg("io", fmt, ##__VA_ARGS__) 43961df833SKyungmin Park /* Initialization and build messages */ 44ff94bc40SHeiko Schocher #define dbg_bld(fmt, ...) ubi_dbg_msg("bld", fmt, ##__VA_ARGS__) 45961df833SKyungmin Park 46ff94bc40SHeiko Schocher void ubi_dump_vol_info(const struct ubi_volume *vol); 47ff94bc40SHeiko Schocher void ubi_dump_vtbl_record(const struct ubi_vtbl_record *r, int idx); 48ff94bc40SHeiko Schocher void ubi_dump_av(const struct ubi_ainf_volume *av); 49ff94bc40SHeiko Schocher void ubi_dump_aeb(const struct ubi_ainf_peb *aeb, int type); 50ff94bc40SHeiko Schocher void ubi_dump_mkvol_req(const struct ubi_mkvol_req *req); 51ff94bc40SHeiko Schocher int ubi_self_check_all_ff(struct ubi_device *ubi, int pnum, int offset, 52ff94bc40SHeiko Schocher int len); 53ff94bc40SHeiko Schocher int ubi_debugfs_init(void); 54ff94bc40SHeiko Schocher void ubi_debugfs_exit(void); 55ff94bc40SHeiko Schocher int ubi_debugfs_init_dev(struct ubi_device *ubi); 56ff94bc40SHeiko Schocher void ubi_debugfs_exit_dev(struct ubi_device *ubi); 57ff94bc40SHeiko Schocher 58ff94bc40SHeiko Schocher /** 59ff94bc40SHeiko Schocher * ubi_dbg_is_bgt_disabled - if the background thread is disabled. 60ff94bc40SHeiko Schocher * @ubi: UBI device description object 61ff94bc40SHeiko Schocher * 62ff94bc40SHeiko Schocher * Returns non-zero if the UBI background thread is disabled for testing 63ff94bc40SHeiko Schocher * purposes. 64ff94bc40SHeiko Schocher */ 65ff94bc40SHeiko Schocher static inline int ubi_dbg_is_bgt_disabled(const struct ubi_device *ubi) 66ff94bc40SHeiko Schocher { 67ff94bc40SHeiko Schocher return ubi->dbg.disable_bgt; 68ff94bc40SHeiko Schocher } 69ff94bc40SHeiko Schocher 70961df833SKyungmin Park /** 71961df833SKyungmin Park * ubi_dbg_is_bitflip - if it is time to emulate a bit-flip. 72ff94bc40SHeiko Schocher * @ubi: UBI device description object 73961df833SKyungmin Park * 74961df833SKyungmin Park * Returns non-zero if a bit-flip should be emulated, otherwise returns zero. 75961df833SKyungmin Park */ 76ff94bc40SHeiko Schocher static inline int ubi_dbg_is_bitflip(const struct ubi_device *ubi) 77961df833SKyungmin Park { 78ff94bc40SHeiko Schocher if (ubi->dbg.emulate_bitflips) 79ff94bc40SHeiko Schocher return !(prandom_u32() % 200); 80ff94bc40SHeiko Schocher return 0; 81961df833SKyungmin Park } 82961df833SKyungmin Park 83961df833SKyungmin Park /** 84961df833SKyungmin Park * ubi_dbg_is_write_failure - if it is time to emulate a write failure. 85ff94bc40SHeiko Schocher * @ubi: UBI device description object 86961df833SKyungmin Park * 87961df833SKyungmin Park * Returns non-zero if a write failure should be emulated, otherwise returns 88961df833SKyungmin Park * zero. 89961df833SKyungmin Park */ 90ff94bc40SHeiko Schocher static inline int ubi_dbg_is_write_failure(const struct ubi_device *ubi) 91961df833SKyungmin Park { 92ff94bc40SHeiko Schocher if (ubi->dbg.emulate_io_failures) 93ff94bc40SHeiko Schocher return !(prandom_u32() % 500); 94ff94bc40SHeiko Schocher return 0; 95961df833SKyungmin Park } 96961df833SKyungmin Park 97961df833SKyungmin Park /** 98961df833SKyungmin Park * ubi_dbg_is_erase_failure - if its time to emulate an erase failure. 99ff94bc40SHeiko Schocher * @ubi: UBI device description object 100961df833SKyungmin Park * 101961df833SKyungmin Park * Returns non-zero if an erase failure should be emulated, otherwise returns 102961df833SKyungmin Park * zero. 103961df833SKyungmin Park */ 104ff94bc40SHeiko Schocher static inline int ubi_dbg_is_erase_failure(const struct ubi_device *ubi) 105961df833SKyungmin Park { 106ff94bc40SHeiko Schocher if (ubi->dbg.emulate_io_failures) 107ff94bc40SHeiko Schocher return !(prandom_u32() % 400); 108ff94bc40SHeiko Schocher return 0; 109961df833SKyungmin Park } 110961df833SKyungmin Park 111ff94bc40SHeiko Schocher static inline int ubi_dbg_chk_io(const struct ubi_device *ubi) 112ff94bc40SHeiko Schocher { 113ff94bc40SHeiko Schocher return ubi->dbg.chk_io; 114ff94bc40SHeiko Schocher } 115ff94bc40SHeiko Schocher 116ff94bc40SHeiko Schocher static inline int ubi_dbg_chk_gen(const struct ubi_device *ubi) 117ff94bc40SHeiko Schocher { 118ff94bc40SHeiko Schocher return ubi->dbg.chk_gen; 119ff94bc40SHeiko Schocher } 120*0195a7bbSHeiko Schocher 121*0195a7bbSHeiko Schocher static inline int ubi_dbg_chk_fastmap(const struct ubi_device *ubi) 122*0195a7bbSHeiko Schocher { 123*0195a7bbSHeiko Schocher return ubi->dbg.chk_fastmap; 124*0195a7bbSHeiko Schocher } 125*0195a7bbSHeiko Schocher 126*0195a7bbSHeiko Schocher static inline void ubi_enable_dbg_chk_fastmap(struct ubi_device *ubi) 127*0195a7bbSHeiko Schocher { 128*0195a7bbSHeiko Schocher ubi->dbg.chk_fastmap = 1; 129*0195a7bbSHeiko Schocher } 130*0195a7bbSHeiko Schocher 131*0195a7bbSHeiko Schocher int ubi_dbg_power_cut(struct ubi_device *ubi, int caller); 132961df833SKyungmin Park #endif /* !__UBI_DEBUG_H__ */ 133