Files
Bruno Martins dbcc8fefd9 treewide: Import Samsung changes from T725XXU2DUD1
Change-Id: I5c31dc4a8006a967910963fb9e7d1a0ab4ab9731
2022-02-23 22:14:25 +01:00

393 lines
14 KiB
C

#ifndef __SEC_DEBUG_INDIRECT
#warning "samsung/debug/sec_debug.h is included directly."
#error "please include sec_debug.h instead of this file"
#endif
#ifndef __INDIRECT__SEC_DEBUG_H__
#define __INDIRECT__SEC_DEBUG_H__
#include <linux/init.h>
#include <asm/cacheflush.h>
#define IRQ_ENTRY 0x4945
#define IRQ_EXIT 0x4958
#define SOFTIRQ_ENTRY 0x5345
#define SOFTIRQ_EXIT 0x5358
#define SCM_ENTRY 0x5555
#define SCM_EXIT 0x6666
#define SEC_DEBUG_MODEM_SEPARATE_EN 0xEAEAEAEA
#define SEC_DEBUG_MODEM_SEPARATE_DIS 0xDEADDEAD
#define RESET_EXTRA_INFO_SIZE 1024
enum sec_debug_upload_cause_t {
UPLOAD_CAUSE_INIT = 0xCAFEBABE,
/* ++ KP : 0xC8xx_xxxx ++ */
UPLOAD_CAUSE_KERNEL_PANIC = 0xC8000000,
UPLOAD_CAUSE_USER_FAULT,
UPLOAD_CAUSE_HSIC_DISCONNECTED,
UPLOAD_CAUSE_BUS_HANG,
UPLOAD_CAUSE_PF_WD_BITE,
UPLOAD_CAUSE_PF_WD_INIT_FAIL,
UPLOAD_CAUSE_PF_WD_RESTART_FAIL,
UPLOAD_CAUSE_PF_WD_KICK_FAIL,
/* ++ SubSystem : 0xC8_5353_xx ++ */
UPLOAD_CAUSE_SS_START = 0xC8535300,
UPLOAD_CAUSE_CP_ERROR_FATAL = UPLOAD_CAUSE_SS_START,
UPLOAD_CAUSE_MDM_ERROR_FATAL,
UPLOAD_CAUSE_MDM_CRITICAL_FATAL,
UPLOAD_CAUSE_MODEM_RST_ERR,
UPLOAD_CAUSE_ADSP_ERROR_FATAL,
UPLOAD_CAUSE_SLPI_ERROR_FATAL, /* 5 */
UPLOAD_CAUSE_SPSS_ERROR_FATAL,
UPLOAD_CAUSE_NPU_ERROR_FATAL,
UPLOAD_CAUSE_CDSP_ERROR_FATAL,
UPLOAD_CAUSE_SUBSYS_IF_TIMEOUT,
UPLOAD_CAUSE_RIVA_RST_ERR, /* A */
UPLOAD_CAUSE_LPASS_RST_ERR,
UPLOAD_CAUSE_DSPS_RST_ERR,
UPLOAD_CAUSE_PERIPHERAL_ERR,
UPLOAD_CAUSE_SS_END = UPLOAD_CAUSE_PERIPHERAL_ERR,
/* -- SubSystem : 0xC8_5353_xx -- */
/* ++ Quest : 0xC8_5153_xx ++ */
UPLOAD_CAUSE_QUEST_START = 0xC8515300,
UPLOAD_CAUSE_QUEST_CRYPTO = UPLOAD_CAUSE_QUEST_START,
UPLOAD_CAUSE_QUEST_ICACHE,
UPLOAD_CAUSE_QUEST_CACHECOHERENCY,
UPLOAD_CAUSE_QUEST_SUSPEND,
UPLOAD_CAUSE_QUEST_VDDMIN,
UPLOAD_CAUSE_QUEST_QMESADDR, /* 5 */
UPLOAD_CAUSE_QUEST_QMESACACHE,
UPLOAD_CAUSE_QUEST_PMIC,
UPLOAD_CAUSE_QUEST_UFS,
UPLOAD_CAUSE_QUEST_SDCARD,
UPLOAD_CAUSE_QUEST_SENSOR, /* A */
UPLOAD_CAUSE_QUEST_SENSORPROBE,
UPLOAD_CAUSE_QUEST_NATURESCENE,
UPLOAD_CAUSE_QUEST_A75G,
UPLOAD_CAUSE_QUEST_Q65G,
UPLOAD_CAUSE_QUEST_THERMAL, /* F */
UPLOAD_CAUSE_QUEST_QDAF_FAIL, /* 10 */
UPLOAD_CAUSE_QUEST_FAIL,
UPLOAD_CAUSE_QUEST_DDR_TEST_MAIN,
UPLOAD_CAUSE_QUEST_DDR_TEST_CAL,
UPLOAD_CAUSE_QUEST_DDR_TEST_SMD,
UPLOAD_CAUSE_SOD_RESULT,
UPLOAD_CAUSE_QUEST_ZIP_UNZIP,
UPLOAD_CAUSE_QUEST_AOSSTHERMALDIFF,
UPLOAD_CAUSE_QUEST_END = UPLOAD_CAUSE_QUEST_AOSSTHERMALDIFF,
/* --Quest : 0xC8_5153_xx -- */
/* -- KP : 0xC8xx_xxxx -- */
/* ++ TP ++ */
UPLOAD_CAUSE_POWER_THERMAL_RESET = 0x54500000,
/* -- TP -- */
/* ++ DP ++ */
UPLOAD_CAUSE_NON_SECURE_WDOG_BARK = 0x44500000,
/* -- DP -- */
/* ++ WP ++ */
UPLOAD_CAUSE_NON_SECURE_WDOG_BITE = 0x57500000,
UPLOAD_CAUSE_SECURE_WDOG_BITE,
/* -- WP -- */
/* ++ MP ++ */
/* Intended reset (MP) 0x4D50_xxxx */
UPLOAD_CAUSE_MP_START = 0x4D500000,
UPLOAD_CAUSE_POWER_LONG_PRESS = UPLOAD_CAUSE_MP_START,
UPLOAD_CAUSE_FORCED_UPLOAD,
UPLOAD_CAUSE_USER_FORCED_UPLOAD,
UPLOAD_CAUSE_MP_END = UPLOAD_CAUSE_USER_FORCED_UPLOAD,
/* -- MP -- */
/* ++ PP ++ */
UPLOAD_CAUSE_EDL_FORCED_UPLOAD = 0x50500000,
UPLOAD_CAUSE_PM_OCP,
/* -- PP -- */
/* ++ SP -- */
UPLOAD_CAUSE_SMPL = 0x53500000,
/* -- SP -- */
};
enum sec_restart_reason_t {
RESTART_REASON_NORMAL = 0x0,
RESTART_REASON_BOOTLOADER = 0x77665500,
RESTART_REASON_REBOOT = 0x77665501,
RESTART_REASON_RECOVERY = 0x77665502,
RESTART_REASON_RTC = 0x77665503,
RESTART_REASON_DMVERITY_CORRUPTED = 0x77665508,
RESTART_REASON_DMVERITY_ENFORCE = 0x77665509,
RESTART_REASON_KEYS_CLEAR = 0x7766550a,
RESTART_REASON_SEC_DEBUG_MODE = 0x776655ee,
RESTART_REASON_RECOVERY_UPDATE = 0x776655cc,
RESTART_REASON_END = 0xffffffff,
};
#define UPLOAD_MSG_USER_FAULT "User Fault"
#define UPLOAD_MSG_CRASH_KEY "Crash Key"
#define UPLOAD_MSG_USER_CRASH_KEY "User Crash Key"
#define UPLOAD_MSG_LONG_KEY_PRESS "Long Key Press"
#define UPLOAD_MSG_PF_WD_BITE "Software Watchdog Timer expired"
#define UPLOAD_MSG_PF_WD_INIT_FAIL "Platform Watchdog couldnot be initialized"
#define UPLOAD_MSG_PF_WD_RESTART_FAIL "Platform Watchdog couldnot be restarted"
#define UPLOAD_MSG_PF_WD_KICK_FAIL "Platform Watchdog can't update sync_cnt"
/* for sec debug level */
#define KERNEL_SEC_DEBUG_LEVEL_LOW (0x574F4C44)
#define KERNEL_SEC_DEBUG_LEVEL_MID (0x44494D44)
#define KERNEL_SEC_DEBUG_LEVEL_HIGH (0x47494844)
#define ANDROID_DEBUG_LEVEL_LOW 0x4f4c
#define ANDROID_DEBUG_LEVEL_MID 0x494d
#define ANDROID_DEBUG_LEVEL_HIGH 0x4948
#define ANDROID_CP_DEBUG_ON 0x5500
#define ANDROID_CP_DEBUG_OFF 0x55ff
#define DUMP_SINK_TO_SDCARD 0x73646364
#define DUMP_SINK_TO_BOOTDEV 0x42544456
#define DUMP_SINK_TO_USB 0x0
#define LOCAL_CONFIG_PRINT_EXTRA_INFO
typedef enum {
USER_UPLOAD_CAUSE_MIN = 1,
USER_UPLOAD_CAUSE_SMPL = USER_UPLOAD_CAUSE_MIN, /* RESET_REASON_SMPL */
USER_UPLOAD_CAUSE_WTSR, /* RESET_REASON_WTSR */
USER_UPLOAD_CAUSE_WATCHDOG, /* RESET_REASON_WATCHDOG */
USER_UPLOAD_CAUSE_PANIC, /* RESET_REASON_PANIC */
USER_UPLOAD_CAUSE_MANUAL_RESET, /* RESET_REASON_MANUAL_RESET */
USER_UPLOAD_CAUSE_POWER_RESET, /* RESET_REASON_POWER_RESET */
USER_UPLOAD_CAUSE_REBOOT, /* RESET_REASON_REBOOT */
USER_UPLOAD_CAUSE_BOOTLOADER_REBOOT, /* RESET_REASON_BOOTLOADER_REBOOT */
USER_UPLOAD_CAUSE_POWER_ON, /* RESET_REASON_POWER_ON */
USER_UPLOAD_CAUSE_THERMAL, /* RESET_REASON_THERMAL_RESET */
USER_UPLOAD_CAUSE_CP_CRASH, /* RESET_REASON_CP_CRASH_RESET */
USER_UPLOAD_CAUSE_UNKNOWN, /* RESET_REASON_UNKNOWN */
USER_UPLOAD_CAUSE_MAX = USER_UPLOAD_CAUSE_UNKNOWN,
} user_upload_cause_t;
#if IS_ENABLED(CONFIG_SEC_DEBUG)
enum pon_restart_reason {
/**********************************************/
/* Following values came from qpnp-power-on.h */
/**********************************************/
PON_RESTART_REASON_UNKNOWN = 0x00,
PON_RESTART_REASON_RECOVERY = 0x01,
PON_RESTART_REASON_BOOTLOADER = 0x02,
PON_RESTART_REASON_RTC = 0x03,
PON_RESTART_REASON_DMVERITY_CORRUPTED = 0x04,
PON_RESTART_REASON_DMVERITY_ENFORCE = 0x05,
PON_RESTART_REASON_KEYS_CLEAR = 0x06,
#if (CONFIG_SEC_QPNP_PON_SPARE_BITS == 6)
/* 32 ~ 63 for OEMs/ODMs secific features */
PON_RESTART_REASON_OEM_MIN = 0x20,
PON_RESTART_REASON_OEM_MAX = 0x3f,
#endif
/**********************************************/
/* Followings are Samsung values */
/**********************************************/
#if (CONFIG_SEC_QPNP_PON_SPARE_BITS == 6)
/* TODO: DUMP_SINK feature is not used MSM8953 families */
PON_RESTART_REASON_DUMP_SINK_BOOTDEV = 0x07,
PON_RESTART_REASON_DUMP_SINK_SDCARD = 0x08,
PON_RESTART_REASON_DUMP_SINK_USB = 0x09,
/* TODO : QUEST feature is not used MSM8953 families */
#if IS_ENABLED(CONFIG_SEC_QUEST)
PON_RESTART_REASON_QUEST_UEFI_START = 0x0A,
#endif
PON_RESTART_REASON_FORCE_UPLOAD_ON = 0x10,
PON_RESTART_REASON_FORCE_UPLOAD_OFF = 0x11,
#endif /* CONFIG_SEC_QPNP_PON_SPARE_BITS == 6 */
PON_RESTART_REASON_CP_CRASH = 0x12,
PON_RESTART_REASON_MANUAL_RESET = 0x13,
PON_RESTART_REASON_NORMALBOOT = 0x14,
PON_RESTART_REASON_DOWNLOAD = 0x15,
PON_RESTART_REASON_NVBACKUP = 0x16,
PON_RESTART_REASON_NVRESTORE = 0x17,
PON_RESTART_REASON_NVERASE = 0x18,
PON_RESTART_REASON_NVRECOVERY = 0x19,
#if IS_ENABLED(CONFIG_SEC_PERIPHERAL_SECURE_CHK)
PON_RESTART_REASON_SECURE_CHECK_FAIL = 0x1A,
#endif
PON_RESTART_REASON_WATCH_DOG = 0x1B,
PON_RESTART_REASON_KERNEL_PANIC = 0x1C,
PON_RESTART_REASON_THERMAL = 0x1D,
PON_RESTART_REASON_POWER_RESET = 0x1E,
PON_RESTART_REASON_WTSR = 0x1F,
/***********************************************/
PON_RESTART_REASON_RORY_START = 0x20,
/* here is reserved for rory download. */
/* don't use betwwen PON_RESTART_REASON_RORY_START */
/* & PON_RESTART_REASON_RORY_END */
PON_RESTART_REASON_RORY_END = 0x2A,
/***********************************************/
PON_RESTART_REASON_MULTICMD = 0x2B,
PON_RESTART_REASON_CROSS_FAIL = 0x2C,
PON_RESTART_REASON_LIMITED_DRAM_SETTING = 0x2D,
PON_RESTART_REASON_SLT_COMPLETE = 0x2F,
PON_RESTART_REASON_DBG_LOW = 0x30,
PON_RESTART_REASON_DBG_MID = 0x31,
PON_RESTART_REASON_DBG_HIGH = 0x32,
PON_RESTART_REASON_CP_DBG_ON = 0x33,
PON_RESTART_REASON_CP_DBG_OFF = 0x34,
PON_RESTART_REASON_CP_MEM_RESERVE_ON = 0x35,
PON_RESTART_REASON_CP_MEM_RESERVE_OFF = 0x36,
PON_RESTART_REASON_FIRMWAREUPDATE = 0x37,
#if IS_ENABLED(CONFIG_MUIC_SUPPORT_RUSTPROOF)
/* SWITCHSEL_MODE use 0x38 ~ 0x3D */
PON_RESTART_REASON_SWITCHSEL = 0x38, /* SET_SWITCHSEL_MODE */
PON_RESTART_REASON_RUSTPROOF = 0x3D, /* SET_RUSTPROOF_MODE */
#endif
PON_RESTART_REASON_MBS_MEM_RESERVE_ON = 0x3E,
PON_RESTART_REASON_MBS_MEM_RESERVE_OFF = 0x3F,
#if (CONFIG_SEC_QPNP_PON_SPARE_BITS == 6)
PON_RESTART_REASON_MAX = 0x40
#else
#if IS_ENABLED(CONFIG_SEC_ABC)
PON_RESTART_REASON_USER_DRAM_TEST = 0x40,
#endif
#if IS_ENABLED(CONFIG_SEC_QUEST)
PON_RESTART_REASON_QUEST_UEFI_START = 0x41,
#endif
#if IS_ENABLED(CONFIG_SEC_QUEST_UEFI_ENHANCEMENT)
PON_RESTART_REASON_QUEST_NMCHECKER_START = 0x42,
PON_RESTART_REASON_QUEST_NMCHECKER_SMD_START = 0x43,
#endif
#if IS_ENABLED(CONFIG_SEC_DDR_SKP)
PON_RESTART_REASON_QUEST_DRAM_START = 0x44,
PON_RESTART_REASON_QUEST_DRAM_FAIL = 0x45,
PON_RESTART_REASON_QUEST_DRAM_TRAINIG_FAIL = 0x46,
#endif
PON_RESTART_REASON_FORCE_UPLOAD_ON = 0x48,
PON_RESTART_REASON_FORCE_UPLOAD_OFF = 0x49,
PON_RESTART_REASON_DUMP_SINK_BOOTDEV = 0x4D,
PON_RESTART_REASON_DUMP_SINK_SDCARD = 0x4E,
PON_RESTART_REASON_DUMP_SINK_USB = 0x4F,
#if IS_ENABLED(CONFIG_SEC_QUEST)
PON_RESTART_REASON_QUEST_REWORK = 0x50,
#endif
#if IS_ENABLED(CONFIG_SEC_QUEST_UEFI_USER)
PON_RESTART_REASON_QUEST_QUEFI_USER_START = 0x51,
PON_RESTART_REASON_QUEST_SUEFI_USER_START = 0x52,
#endif
PON_RESTART_REASON_RECOVERY_UPDATE = 0x60,
PON_RESTART_REASON_BOTA_COMPLETE = 0x61,
PON_RESTART_REASON_MAX = 0x80
#endif
};
#endif /* CONFIG_SEC_DEBUG */
#if IS_ENABLED(CONFIG_SEC_DEBUG)
#include <asm/sec_debug.h>
DECLARE_PER_CPU(struct sec_debug_core_t, sec_debug_core_reg);
DECLARE_PER_CPU(struct sec_debug_mmu_reg_t, sec_debug_mmu_reg);
DECLARE_PER_CPU(enum sec_debug_upload_cause_t, sec_debug_upload_cause);
extern bool sec_debug_is_enabled(void);
extern unsigned int sec_debug_level(void);
extern void (*sec_nvmem_pon_write)(u8 pon_rr);
static __always_inline void sec_debug_strcpy_task_comm(char *dst, char *src)
{
#if (TASK_COMM_LEN == 16)
*(unsigned __int128 *)dst = *(unsigned __int128 *)src;
#else
memcpy(dst, src, TASK_COMM_LEN);
#endif
}
/* called @ arch/arm64/kernel/smp.c */
static inline void sec_debug_save_context(void)
{
unsigned long flags;
unsigned int cpu = smp_processor_id();
local_irq_save(flags);
sec_debug_save_mmu_reg(&per_cpu(sec_debug_mmu_reg, cpu));
sec_debug_save_core_reg(&per_cpu(sec_debug_core_reg, cpu));
pr_emerg("(%s) context saved(CPU:%d)\n", __func__, cpu);
local_irq_restore(flags);
flush_cache_all();
}
/* called @ drivers/power/reset/msm-poweroff.c */
extern void sec_debug_update_dload_mode(const int restart_mode, const int in_panic);
/* called @ drivers/power/reset/msm-poweroff.c */
extern void sec_debug_update_restart_reason(const char *cmd, const int in_panic, const int restart_mode);
/* called @ drivers/soc/qcom/watchdog_v2.c */
extern void sec_debug_prepare_for_wdog_bark_reset(void);
/* implemented @ drivers/soc/qcom/watchdog_v2.c */
/* called @ kernel/panic.c */
extern void emerg_pet_watchdog(void);
/* called @ init/main.c */
extern char *sec_debug_get_erased_command_line(void);
/* called @ drivers/debug/sec_debug_summary.c */
extern uint64_t get_pa_dump_sink(void);
/* FIXME: this is only for SAMSUNG internal */
/* called @ drivers/misc/samsung/sec_hw_param.c */
extern void sec_debug_upload_cause_str(enum sec_debug_upload_cause_t type, char *str, size_t len);
/* FIXME: this function is not referenced anywhere */
extern void __deprecated sec_debug_print_model(struct seq_file *m, const char *cpu_name);
/* FIXME: this function is not referenced anywhere */
extern void __deprecated sec_debug_set_thermal_upload(void);
#else /* CONFIG_SEC_DEBUG */
static inline bool sec_debug_is_enabled(void) { return false; }
static inline unsigned int sec_debug_level(void) { return 0; }
static inline void sec_debug_strcpy_task_comm(char *dst, char *src) {}
static inline void sec_debug_save_context(void) {}
static inline void sec_debug_update_dload_mode(const int restart_mode, const int in_panic) {}
static inline void sec_debug_update_restart_reason(const char *cmd, const int in_panic, const int restart_mode) {}
static inline void sec_debug_prepare_for_wdog_bark_reset(void) {}
static inline void emerg_pet_watchdog(void) {}
static inline char *sec_debug_get_erased_command_line(void) { return boot_command_line; }
static inline uint64_t get_pa_dump_sink(void) { return 0ULL; };
static inline void sec_debug_upload_cause_str(enum sec_debug_upload_cause_t type, char *str, size_t len) {}
/* FIXME: __deprected */
static inline void sec_debug_print_model(struct seq_file *m, const char *cpu_name) {}
static inline void sec_debug_set_thermal_upload(void) {}
#endif /* CONFIG_SEC_DEBUG */
#if IS_ENABLED(CONFIG_SEC_PERIPHERAL_SECURE_CHK)
/* called @ drivers/soc/qcom/peripheral-loader.c */
extern void sec_peripheral_secure_check_fail(void);
extern void sec_modem_loading_fail_to_bootloader(void);
#else
static inline void sec_peripheral_secure_check_fail(void) {}
static inline void sec_modem_loading_fail_to_bootloader(void) {}
#endif /* CONFIG_SEC_DEBUG */
#ifdef CONFIG_SEC_SSR_DEBUG_LEVEL_CHK
/* called @ drivers/soc/qcom/subsystem_restart.c */
extern int sec_debug_is_enabled_for_ssr(void);
#else
static inline int sec_debug_is_enabled_for_ssr(void) { return 0; }
#endif /* CONFIG_SEC_SSR_DEBUG_LEVEL_CHK */
#if IS_ENABLED(CONFIG_SEC_DEBUG_PWDT)
/* called @ drivers/soc/qcom/watchdog_v2.c */
extern void sec_debug_check_pwdt(void);
#else
static inline void sec_debug_check_pwdt(void) {}
#endif
#ifndef CONFIG_SAMSUNG_PRODUCT_SHIP
extern unsigned long sec_delay_check;
#endif
#endif /* __INDIRECT__SEC_DEBUG_H__ */