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 2028386b6dSAlexey Brodkin #include <hexdump.h> 2128386b6dSAlexey Brodkin 22*8ea74120SEran Matityahu #ifndef __UBOOT__ 23ff94bc40SHeiko Schocher #define ubi_assert(expr) do { \ 24ff94bc40SHeiko Schocher if (unlikely(!(expr))) { \ 25ff94bc40SHeiko Schocher pr_crit("UBI assert failed in %s at %u (pid %d)\n", \ 26ff94bc40SHeiko Schocher __func__, __LINE__, current->pid); \ 27ff94bc40SHeiko Schocher dump_stack(); \ 28ff94bc40SHeiko Schocher } \ 29ff94bc40SHeiko Schocher } while (0) 30*8ea74120SEran Matityahu #else 31*8ea74120SEran Matityahu #define ubi_assert(expr) do { \ 32*8ea74120SEran Matityahu if (unlikely(!(expr))) { \ 33*8ea74120SEran Matityahu pr_crit("UBI assert failed in %s at %u\n", \ 34*8ea74120SEran Matityahu __func__, __LINE__); \ 35*8ea74120SEran Matityahu dump_stack(); \ 36*8ea74120SEran Matityahu } \ 37*8ea74120SEran Matityahu } while (0) 38*8ea74120SEran Matityahu #endif 39961df833SKyungmin Park 4028386b6dSAlexey Brodkin #define ubi_dbg_print_hex_dump(ps, pt, r, g, b, len, a) \ 4128386b6dSAlexey Brodkin print_hex_dump(ps, pt, r, g, b, len, a) 42961df833SKyungmin Park 43ff94bc40SHeiko Schocher #define ubi_dbg_msg(type, fmt, ...) \ 44ff94bc40SHeiko Schocher pr_debug("UBI DBG " type " (pid %d): " fmt "\n", current->pid, \ 45ff94bc40SHeiko Schocher ##__VA_ARGS__) 46961df833SKyungmin Park 47ff94bc40SHeiko Schocher /* General debugging messages */ 48ff94bc40SHeiko Schocher #define dbg_gen(fmt, ...) ubi_dbg_msg("gen", fmt, ##__VA_ARGS__) 49ff94bc40SHeiko Schocher /* Messages from the eraseblock association sub-system */ 50ff94bc40SHeiko Schocher #define dbg_eba(fmt, ...) ubi_dbg_msg("eba", fmt, ##__VA_ARGS__) 51ff94bc40SHeiko Schocher /* Messages from the wear-leveling sub-system */ 52ff94bc40SHeiko Schocher #define dbg_wl(fmt, ...) ubi_dbg_msg("wl", fmt, ##__VA_ARGS__) 53ff94bc40SHeiko Schocher /* Messages from the input/output sub-system */ 54ff94bc40SHeiko Schocher #define dbg_io(fmt, ...) ubi_dbg_msg("io", fmt, ##__VA_ARGS__) 55961df833SKyungmin Park /* Initialization and build messages */ 56ff94bc40SHeiko Schocher #define dbg_bld(fmt, ...) ubi_dbg_msg("bld", fmt, ##__VA_ARGS__) 57961df833SKyungmin Park 58ff94bc40SHeiko Schocher void ubi_dump_vol_info(const struct ubi_volume *vol); 59ff94bc40SHeiko Schocher void ubi_dump_vtbl_record(const struct ubi_vtbl_record *r, int idx); 60ff94bc40SHeiko Schocher void ubi_dump_av(const struct ubi_ainf_volume *av); 61ff94bc40SHeiko Schocher void ubi_dump_aeb(const struct ubi_ainf_peb *aeb, int type); 62ff94bc40SHeiko Schocher void ubi_dump_mkvol_req(const struct ubi_mkvol_req *req); 63ff94bc40SHeiko Schocher int ubi_self_check_all_ff(struct ubi_device *ubi, int pnum, int offset, 64ff94bc40SHeiko Schocher int len); 65ff94bc40SHeiko Schocher int ubi_debugfs_init(void); 66ff94bc40SHeiko Schocher void ubi_debugfs_exit(void); 67ff94bc40SHeiko Schocher int ubi_debugfs_init_dev(struct ubi_device *ubi); 68ff94bc40SHeiko Schocher void ubi_debugfs_exit_dev(struct ubi_device *ubi); 69ff94bc40SHeiko Schocher 70ff94bc40SHeiko Schocher /** 71ff94bc40SHeiko Schocher * ubi_dbg_is_bgt_disabled - if the background thread is disabled. 72ff94bc40SHeiko Schocher * @ubi: UBI device description object 73ff94bc40SHeiko Schocher * 74ff94bc40SHeiko Schocher * Returns non-zero if the UBI background thread is disabled for testing 75ff94bc40SHeiko Schocher * purposes. 76ff94bc40SHeiko Schocher */ 77ff94bc40SHeiko Schocher static inline int ubi_dbg_is_bgt_disabled(const struct ubi_device *ubi) 78ff94bc40SHeiko Schocher { 79ff94bc40SHeiko Schocher return ubi->dbg.disable_bgt; 80ff94bc40SHeiko Schocher } 81ff94bc40SHeiko Schocher 82961df833SKyungmin Park /** 83961df833SKyungmin Park * ubi_dbg_is_bitflip - if it is time to emulate a bit-flip. 84ff94bc40SHeiko Schocher * @ubi: UBI device description object 85961df833SKyungmin Park * 86961df833SKyungmin Park * Returns non-zero if a bit-flip should be emulated, otherwise returns zero. 87961df833SKyungmin Park */ 88ff94bc40SHeiko Schocher static inline int ubi_dbg_is_bitflip(const struct ubi_device *ubi) 89961df833SKyungmin Park { 90ff94bc40SHeiko Schocher if (ubi->dbg.emulate_bitflips) 91ff94bc40SHeiko Schocher return !(prandom_u32() % 200); 92ff94bc40SHeiko Schocher return 0; 93961df833SKyungmin Park } 94961df833SKyungmin Park 95961df833SKyungmin Park /** 96961df833SKyungmin Park * ubi_dbg_is_write_failure - if it is time to emulate a write failure. 97ff94bc40SHeiko Schocher * @ubi: UBI device description object 98961df833SKyungmin Park * 99961df833SKyungmin Park * Returns non-zero if a write failure should be emulated, otherwise returns 100961df833SKyungmin Park * zero. 101961df833SKyungmin Park */ 102ff94bc40SHeiko Schocher static inline int ubi_dbg_is_write_failure(const struct ubi_device *ubi) 103961df833SKyungmin Park { 104ff94bc40SHeiko Schocher if (ubi->dbg.emulate_io_failures) 105ff94bc40SHeiko Schocher return !(prandom_u32() % 500); 106ff94bc40SHeiko Schocher return 0; 107961df833SKyungmin Park } 108961df833SKyungmin Park 109961df833SKyungmin Park /** 110961df833SKyungmin Park * ubi_dbg_is_erase_failure - if its time to emulate an erase failure. 111ff94bc40SHeiko Schocher * @ubi: UBI device description object 112961df833SKyungmin Park * 113961df833SKyungmin Park * Returns non-zero if an erase failure should be emulated, otherwise returns 114961df833SKyungmin Park * zero. 115961df833SKyungmin Park */ 116ff94bc40SHeiko Schocher static inline int ubi_dbg_is_erase_failure(const struct ubi_device *ubi) 117961df833SKyungmin Park { 118ff94bc40SHeiko Schocher if (ubi->dbg.emulate_io_failures) 119ff94bc40SHeiko Schocher return !(prandom_u32() % 400); 120ff94bc40SHeiko Schocher return 0; 121961df833SKyungmin Park } 122961df833SKyungmin Park 123ff94bc40SHeiko Schocher static inline int ubi_dbg_chk_io(const struct ubi_device *ubi) 124ff94bc40SHeiko Schocher { 125ff94bc40SHeiko Schocher return ubi->dbg.chk_io; 126ff94bc40SHeiko Schocher } 127ff94bc40SHeiko Schocher 128ff94bc40SHeiko Schocher static inline int ubi_dbg_chk_gen(const struct ubi_device *ubi) 129ff94bc40SHeiko Schocher { 130ff94bc40SHeiko Schocher return ubi->dbg.chk_gen; 131ff94bc40SHeiko Schocher } 1320195a7bbSHeiko Schocher 1330195a7bbSHeiko Schocher static inline int ubi_dbg_chk_fastmap(const struct ubi_device *ubi) 1340195a7bbSHeiko Schocher { 1350195a7bbSHeiko Schocher return ubi->dbg.chk_fastmap; 1360195a7bbSHeiko Schocher } 1370195a7bbSHeiko Schocher 1380195a7bbSHeiko Schocher static inline void ubi_enable_dbg_chk_fastmap(struct ubi_device *ubi) 1390195a7bbSHeiko Schocher { 1400195a7bbSHeiko Schocher ubi->dbg.chk_fastmap = 1; 1410195a7bbSHeiko Schocher } 1420195a7bbSHeiko Schocher 1430195a7bbSHeiko Schocher int ubi_dbg_power_cut(struct ubi_device *ubi, int caller); 144961df833SKyungmin Park #endif /* !__UBI_DEBUG_H__ */ 145