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 20*28386b6dSAlexey Brodkin #include <hexdump.h> 21*28386b6dSAlexey Brodkin 22ff94bc40SHeiko Schocher #define ubi_assert(expr) do { \ 23ff94bc40SHeiko Schocher if (unlikely(!(expr))) { \ 24ff94bc40SHeiko Schocher pr_crit("UBI assert failed in %s at %u (pid %d)\n", \ 25ff94bc40SHeiko Schocher __func__, __LINE__, current->pid); \ 26ff94bc40SHeiko Schocher dump_stack(); \ 27ff94bc40SHeiko Schocher } \ 28ff94bc40SHeiko Schocher } while (0) 29961df833SKyungmin Park 30*28386b6dSAlexey Brodkin #define ubi_dbg_print_hex_dump(ps, pt, r, g, b, len, a) \ 31*28386b6dSAlexey Brodkin print_hex_dump(ps, pt, r, g, b, len, a) 32961df833SKyungmin Park 33ff94bc40SHeiko Schocher #define ubi_dbg_msg(type, fmt, ...) \ 34ff94bc40SHeiko Schocher pr_debug("UBI DBG " type " (pid %d): " fmt "\n", current->pid, \ 35ff94bc40SHeiko Schocher ##__VA_ARGS__) 36961df833SKyungmin Park 37ff94bc40SHeiko Schocher /* General debugging messages */ 38ff94bc40SHeiko Schocher #define dbg_gen(fmt, ...) ubi_dbg_msg("gen", fmt, ##__VA_ARGS__) 39ff94bc40SHeiko Schocher /* Messages from the eraseblock association sub-system */ 40ff94bc40SHeiko Schocher #define dbg_eba(fmt, ...) ubi_dbg_msg("eba", fmt, ##__VA_ARGS__) 41ff94bc40SHeiko Schocher /* Messages from the wear-leveling sub-system */ 42ff94bc40SHeiko Schocher #define dbg_wl(fmt, ...) ubi_dbg_msg("wl", fmt, ##__VA_ARGS__) 43ff94bc40SHeiko Schocher /* Messages from the input/output sub-system */ 44ff94bc40SHeiko Schocher #define dbg_io(fmt, ...) ubi_dbg_msg("io", fmt, ##__VA_ARGS__) 45961df833SKyungmin Park /* Initialization and build messages */ 46ff94bc40SHeiko Schocher #define dbg_bld(fmt, ...) ubi_dbg_msg("bld", fmt, ##__VA_ARGS__) 47961df833SKyungmin Park 48ff94bc40SHeiko Schocher void ubi_dump_vol_info(const struct ubi_volume *vol); 49ff94bc40SHeiko Schocher void ubi_dump_vtbl_record(const struct ubi_vtbl_record *r, int idx); 50ff94bc40SHeiko Schocher void ubi_dump_av(const struct ubi_ainf_volume *av); 51ff94bc40SHeiko Schocher void ubi_dump_aeb(const struct ubi_ainf_peb *aeb, int type); 52ff94bc40SHeiko Schocher void ubi_dump_mkvol_req(const struct ubi_mkvol_req *req); 53ff94bc40SHeiko Schocher int ubi_self_check_all_ff(struct ubi_device *ubi, int pnum, int offset, 54ff94bc40SHeiko Schocher int len); 55ff94bc40SHeiko Schocher int ubi_debugfs_init(void); 56ff94bc40SHeiko Schocher void ubi_debugfs_exit(void); 57ff94bc40SHeiko Schocher int ubi_debugfs_init_dev(struct ubi_device *ubi); 58ff94bc40SHeiko Schocher void ubi_debugfs_exit_dev(struct ubi_device *ubi); 59ff94bc40SHeiko Schocher 60ff94bc40SHeiko Schocher /** 61ff94bc40SHeiko Schocher * ubi_dbg_is_bgt_disabled - if the background thread is disabled. 62ff94bc40SHeiko Schocher * @ubi: UBI device description object 63ff94bc40SHeiko Schocher * 64ff94bc40SHeiko Schocher * Returns non-zero if the UBI background thread is disabled for testing 65ff94bc40SHeiko Schocher * purposes. 66ff94bc40SHeiko Schocher */ 67ff94bc40SHeiko Schocher static inline int ubi_dbg_is_bgt_disabled(const struct ubi_device *ubi) 68ff94bc40SHeiko Schocher { 69ff94bc40SHeiko Schocher return ubi->dbg.disable_bgt; 70ff94bc40SHeiko Schocher } 71ff94bc40SHeiko Schocher 72961df833SKyungmin Park /** 73961df833SKyungmin Park * ubi_dbg_is_bitflip - if it is time to emulate a bit-flip. 74ff94bc40SHeiko Schocher * @ubi: UBI device description object 75961df833SKyungmin Park * 76961df833SKyungmin Park * Returns non-zero if a bit-flip should be emulated, otherwise returns zero. 77961df833SKyungmin Park */ 78ff94bc40SHeiko Schocher static inline int ubi_dbg_is_bitflip(const struct ubi_device *ubi) 79961df833SKyungmin Park { 80ff94bc40SHeiko Schocher if (ubi->dbg.emulate_bitflips) 81ff94bc40SHeiko Schocher return !(prandom_u32() % 200); 82ff94bc40SHeiko Schocher return 0; 83961df833SKyungmin Park } 84961df833SKyungmin Park 85961df833SKyungmin Park /** 86961df833SKyungmin Park * ubi_dbg_is_write_failure - if it is time to emulate a write failure. 87ff94bc40SHeiko Schocher * @ubi: UBI device description object 88961df833SKyungmin Park * 89961df833SKyungmin Park * Returns non-zero if a write failure should be emulated, otherwise returns 90961df833SKyungmin Park * zero. 91961df833SKyungmin Park */ 92ff94bc40SHeiko Schocher static inline int ubi_dbg_is_write_failure(const struct ubi_device *ubi) 93961df833SKyungmin Park { 94ff94bc40SHeiko Schocher if (ubi->dbg.emulate_io_failures) 95ff94bc40SHeiko Schocher return !(prandom_u32() % 500); 96ff94bc40SHeiko Schocher return 0; 97961df833SKyungmin Park } 98961df833SKyungmin Park 99961df833SKyungmin Park /** 100961df833SKyungmin Park * ubi_dbg_is_erase_failure - if its time to emulate an erase failure. 101ff94bc40SHeiko Schocher * @ubi: UBI device description object 102961df833SKyungmin Park * 103961df833SKyungmin Park * Returns non-zero if an erase failure should be emulated, otherwise returns 104961df833SKyungmin Park * zero. 105961df833SKyungmin Park */ 106ff94bc40SHeiko Schocher static inline int ubi_dbg_is_erase_failure(const struct ubi_device *ubi) 107961df833SKyungmin Park { 108ff94bc40SHeiko Schocher if (ubi->dbg.emulate_io_failures) 109ff94bc40SHeiko Schocher return !(prandom_u32() % 400); 110ff94bc40SHeiko Schocher return 0; 111961df833SKyungmin Park } 112961df833SKyungmin Park 113ff94bc40SHeiko Schocher static inline int ubi_dbg_chk_io(const struct ubi_device *ubi) 114ff94bc40SHeiko Schocher { 115ff94bc40SHeiko Schocher return ubi->dbg.chk_io; 116ff94bc40SHeiko Schocher } 117ff94bc40SHeiko Schocher 118ff94bc40SHeiko Schocher static inline int ubi_dbg_chk_gen(const struct ubi_device *ubi) 119ff94bc40SHeiko Schocher { 120ff94bc40SHeiko Schocher return ubi->dbg.chk_gen; 121ff94bc40SHeiko Schocher } 1220195a7bbSHeiko Schocher 1230195a7bbSHeiko Schocher static inline int ubi_dbg_chk_fastmap(const struct ubi_device *ubi) 1240195a7bbSHeiko Schocher { 1250195a7bbSHeiko Schocher return ubi->dbg.chk_fastmap; 1260195a7bbSHeiko Schocher } 1270195a7bbSHeiko Schocher 1280195a7bbSHeiko Schocher static inline void ubi_enable_dbg_chk_fastmap(struct ubi_device *ubi) 1290195a7bbSHeiko Schocher { 1300195a7bbSHeiko Schocher ubi->dbg.chk_fastmap = 1; 1310195a7bbSHeiko Schocher } 1320195a7bbSHeiko Schocher 1330195a7bbSHeiko Schocher int ubi_dbg_power_cut(struct ubi_device *ubi, int caller); 134961df833SKyungmin Park #endif /* !__UBI_DEBUG_H__ */ 135