353 lines
7.8 KiB
C
Executable File
353 lines
7.8 KiB
C
Executable File
|
|
#ifndef DEBUG_SNAPSHOT_LOG_H
|
|
#define DEBUG_SNAPSHOT_LOG_H
|
|
|
|
#include <generated/autoconf.h>
|
|
|
|
#ifdef CONFIG_DEBUG_SNAPSHOT_BINDER
|
|
#include <linux/debug-snapshot-binder.h>
|
|
#endif
|
|
|
|
#ifdef DSS_ANALYZER
|
|
|
|
#define TASK_COMM_LEN 16
|
|
#define NR_CPUS 8
|
|
#undef CONFIG_DEBUG_SNAPSHOT_LINUX_BUILD
|
|
#include <stdio.h>
|
|
#include <stdlib.h>
|
|
|
|
#else // DSS_ANALYZER
|
|
|
|
#include <linux/clk-provider.h>
|
|
#include <linux/debug-snapshot.h>
|
|
#include <linux/debug-snapshot-helper.h>
|
|
|
|
#endif // DSS_ANALYZER
|
|
|
|
#include <dt-bindings/soc/samsung/debug-snapshot-table.h>
|
|
|
|
/* Size domain */
|
|
#define DSS_KEEP_HEADER_SZ (SZ_256 * 3)
|
|
#define DSS_HEADER_SZ SZ_4K
|
|
#define DSS_MMU_REG_SZ SZ_4K
|
|
#define DSS_CORE_REG_SZ SZ_4K
|
|
#define DSS_DBGC_LOG_SZ SZ_4K
|
|
#define DSS_HEADER_TOTAL_SZ (DSS_HEADER_SZ + DSS_MMU_REG_SZ + DSS_CORE_REG_SZ + DSS_DBGC_LOG_SZ)
|
|
#define DSS_SPARE_SZ (DSS_HEADER_SIZE - DSS_HEADER_TOTAL_SZ)
|
|
|
|
/* Length domain */
|
|
#define DSS_LOG_STRING_LEN SZ_128
|
|
#define DSS_LOG_GEN_LEN SZ_16
|
|
#define DSS_MMU_REG_OFFSET SZ_512
|
|
#define DSS_CORE_REG_OFFSET SZ_512
|
|
#define DSS_LOG_MAX_NUM SZ_1K
|
|
#define DSS_API_MAX_NUM SZ_2K
|
|
#define DSS_EX_MAX_NUM SZ_8
|
|
#define DSS_IN_MAX_NUM SZ_8
|
|
#define DSS_CALLSTACK_MAX_NUM 4
|
|
#define DSS_ITERATION 5
|
|
#define DSS_NR_CPUS NR_CPUS
|
|
#define DSS_ITEM_MAX_NUM 10
|
|
|
|
/* Sign domain */
|
|
#define DSS_SIGN_RESET 0x0
|
|
#define DSS_SIGN_RESERVED 0x1
|
|
#define DSS_SIGN_SCRATCH 0xD
|
|
#define DSS_SIGN_ALIVE 0xFACE
|
|
#define DSS_SIGN_DEAD 0xDEAD
|
|
#define DSS_SIGN_PANIC 0xBABA
|
|
#define DSS_SIGN_SAFE_FAULT 0xFAFA
|
|
#define DSS_SIGN_NORMAL_REBOOT 0xCAFE
|
|
#define DSS_SIGN_FORCE_REBOOT 0xDAFE
|
|
#define DSS_SIGN_LOCKUP 0xDEADBEEF
|
|
|
|
/* Specific Address Information */
|
|
#define DSS_FIXED_VIRT_BASE (VMALLOC_START + 0xEE000000)
|
|
#define DSS_OFFSET_SCRATCH (0x100)
|
|
#define DSS_OFFSET_DEBUG_LEVEL (0x180)
|
|
#define DSS_OFFSET_LAST_LOGBUF (0x200)
|
|
#define DSS_OFFSET_LAST_PLATFORM_LOGBUF (0x280)
|
|
#define DSS_OFFSET_EMERGENCY_REASON (0x300)
|
|
#define DSS_OFFSET_CORE_POWER_STAT (0x400)
|
|
#define DSS_OFFSET_PANIC_STAT (0x500)
|
|
#define DSS_OFFSET_CORE_LAST_PC (0x600)
|
|
|
|
/* S5P_VA_SS_BASE + 0x700 -- 0x8FF is reserved */
|
|
#define DSS_OFFSET_LINUX_BANNER (0x700)
|
|
|
|
#define DSS_OFFSET_KERNEL_LOG (0x900)
|
|
#define DSS_OFFSET_PLATFORM_LOG (0x904)
|
|
#define DSS_OFFSET_KERNEL_EVENT (0x908)
|
|
|
|
/* S5P_VA_SS_BASE + 0xC00 -- 0xFFF is reserved */
|
|
#define DSS_OFFSET_PANIC_STRING (0xC00)
|
|
#define DSS_OFFSET_SPARE_BASE (DSS_HEADER_TOTAL_SZ)
|
|
|
|
struct dbg_snapshot_log {
|
|
struct __task_log {
|
|
unsigned long long time;
|
|
unsigned long sp;
|
|
#ifdef CONFIG_DEBUG_SNAPSHOT_LINUX_BUILD
|
|
struct task_struct *task;
|
|
#else
|
|
void *task;
|
|
#endif
|
|
char task_comm[TASK_COMM_LEN];
|
|
int pid;
|
|
} task[DSS_NR_CPUS][DSS_LOG_MAX_NUM];
|
|
|
|
struct __work_log {
|
|
unsigned long long time;
|
|
unsigned long sp;
|
|
#ifdef CONFIG_DEBUG_SNAPSHOT_LINUX_BUILD
|
|
struct worker *worker;
|
|
work_func_t fn;
|
|
#else
|
|
void *worker;
|
|
void *fn;
|
|
#endif
|
|
char task_comm[TASK_COMM_LEN];
|
|
int en;
|
|
} work[DSS_NR_CPUS][DSS_LOG_MAX_NUM];
|
|
|
|
struct __cpuidle_log {
|
|
unsigned long long time;
|
|
unsigned long sp;
|
|
char *modes;
|
|
unsigned int state;
|
|
#ifdef CONFIG_DEBUG_SNAPSHOT_LINUX_BUILD
|
|
u32 num_online_cpus;
|
|
#else
|
|
unsigned int num_online_cpus;
|
|
#endif
|
|
int delta;
|
|
int en;
|
|
} cpuidle[DSS_NR_CPUS][DSS_LOG_MAX_NUM];
|
|
|
|
struct __suspend_log {
|
|
unsigned long long time;
|
|
unsigned long sp;
|
|
char log[DSS_LOG_GEN_LEN];
|
|
void *fn;
|
|
#ifdef CONFIG_DEBUG_SNAPSHOT_LINUX_BUILD
|
|
struct device *dev;
|
|
#else
|
|
void *dev;
|
|
#endif
|
|
int en;
|
|
int state;
|
|
int core;
|
|
} suspend[DSS_LOG_MAX_NUM * 4];
|
|
|
|
struct __irq_log {
|
|
unsigned long long time;
|
|
unsigned long sp;
|
|
int irq;
|
|
void *fn;
|
|
#ifdef CONFIG_DEBUG_SNAPSHOT_LINUX_BUILD
|
|
struct irq_desc *desc;
|
|
#else
|
|
void *desc;
|
|
#endif
|
|
unsigned long long latency;
|
|
int en;
|
|
} irq[DSS_NR_CPUS][DSS_LOG_MAX_NUM * 2];
|
|
#ifdef CONFIG_DEBUG_SNAPSHOT_SPINLOCK
|
|
struct __spinlock_log {
|
|
unsigned long long time;
|
|
unsigned long sp;
|
|
unsigned long long jiffies;
|
|
#ifdef CONFIG_DEBUG_SNAPSHOT_LINUX_BUILD
|
|
raw_spinlock_t *lock;
|
|
#ifdef CONFIG_DEBUG_SPINLOCK
|
|
u16 next;
|
|
u16 owner;
|
|
#endif
|
|
#else
|
|
void *lock;
|
|
#ifdef CONFIG_DEBUG_SPINLOCK
|
|
unsigned short next;
|
|
unsigned short owner;
|
|
#endif
|
|
#endif
|
|
int en;
|
|
void *caller[DSS_CALLSTACK_MAX_NUM];
|
|
} spinlock[DSS_NR_CPUS][DSS_LOG_MAX_NUM];
|
|
#endif
|
|
#ifdef CONFIG_DEBUG_SNAPSHOT_IRQ_DISABLED
|
|
struct __irqs_disabled_log {
|
|
unsigned long long time;
|
|
unsigned long index;
|
|
#ifdef CONFIG_DEBUG_SNAPSHOT_LINUX_BUILD
|
|
struct task_struct *task;
|
|
#else
|
|
void *task;
|
|
#endif
|
|
char *task_comm;
|
|
void *caller[DSS_CALLSTACK_MAX_NUM];
|
|
} irqs_disabled[DSS_NR_CPUS][SZ_32];
|
|
#endif
|
|
#ifdef CONFIG_DEBUG_SNAPSHOT_CLK
|
|
struct __clk_log {
|
|
unsigned long long time;
|
|
#ifdef CONFIG_DEBUG_SNAPSHOT_LINUX_BUILD
|
|
struct clk_hw *clk;
|
|
#else
|
|
void *clk;
|
|
#endif
|
|
const char *f_name;
|
|
int mode;
|
|
unsigned long arg;
|
|
} clk[DSS_LOG_MAX_NUM];
|
|
#endif
|
|
#ifdef CONFIG_DEBUG_SNAPSHOT_PMU
|
|
struct __pmu_log {
|
|
unsigned long long time;
|
|
unsigned int id;
|
|
const char *f_name;
|
|
int mode;
|
|
} pmu[DSS_LOG_MAX_NUM];
|
|
#endif
|
|
#ifdef CONFIG_DEBUG_SNAPSHOT_FREQ
|
|
struct __freq_log {
|
|
unsigned long long time;
|
|
int cpu;
|
|
int freq_type;
|
|
char *freq_name;
|
|
unsigned long old_freq;
|
|
unsigned long target_freq;
|
|
int en;
|
|
} freq[DSS_LOG_MAX_NUM];
|
|
#endif
|
|
#ifdef CONFIG_DEBUG_SNAPSHOT_DM
|
|
struct __dm_log {
|
|
unsigned long long time;
|
|
int cpu;
|
|
int dm_num;
|
|
unsigned long min_freq;
|
|
unsigned long max_freq;
|
|
#ifdef CONFIG_DEBUG_SNAPSHOT_LINUX_BUILD
|
|
s32 wait_dmt;
|
|
s32 do_dmt;
|
|
#else
|
|
int wait_dmt;
|
|
int do_dmt;
|
|
#endif
|
|
} dm[DSS_LOG_MAX_NUM];
|
|
#endif
|
|
#ifdef CONFIG_DEBUG_SNAPSHOT_REG
|
|
struct __reg_log {
|
|
unsigned long long time;
|
|
int read;
|
|
size_t val;
|
|
size_t reg;
|
|
int en;
|
|
void *caller[DSS_CALLSTACK_MAX_NUM];
|
|
} reg[DSS_NR_CPUS][DSS_LOG_MAX_NUM];
|
|
#endif
|
|
#ifdef CONFIG_DEBUG_SNAPSHOT_HRTIMER
|
|
struct __hrtimer_log {
|
|
unsigned long long time;
|
|
unsigned long long now;
|
|
#ifdef CONFIG_DEBUG_SNAPSHOT_LINUX_BUILD
|
|
struct hrtimer *timer;
|
|
#else
|
|
void *timer;
|
|
#endif
|
|
void *fn;
|
|
int en;
|
|
} hrtimers[DSS_NR_CPUS][DSS_LOG_MAX_NUM];
|
|
#endif
|
|
#ifdef CONFIG_DEBUG_SNAPSHOT_REGULATOR
|
|
struct __regulator_log {
|
|
unsigned long long time;
|
|
unsigned long long acpm_time;
|
|
int cpu;
|
|
char name[SZ_16];
|
|
unsigned int reg;
|
|
unsigned int voltage;
|
|
unsigned int raw_volt;
|
|
int en;
|
|
} regulator[DSS_LOG_MAX_NUM];
|
|
#endif
|
|
#ifdef CONFIG_DEBUG_SNAPSHOT_THERMAL
|
|
struct __thermal_log {
|
|
unsigned long long time;
|
|
int cpu;
|
|
#ifdef CONFIG_DEBUG_SNAPSHOT_LINUX_BUILD
|
|
struct exynos_tmu_platform_data *data;
|
|
#else
|
|
void *data;
|
|
#endif
|
|
unsigned int temp;
|
|
char *cooling_device;
|
|
unsigned int cooling_state;
|
|
} thermal[DSS_LOG_MAX_NUM];
|
|
#endif
|
|
#ifdef CONFIG_DEBUG_SNAPSHOT_ACPM
|
|
struct __acpm_log {
|
|
unsigned long long time;
|
|
unsigned long long acpm_time;
|
|
char log[9];
|
|
unsigned int data;
|
|
} acpm[DSS_LOG_MAX_NUM];
|
|
#endif
|
|
#ifdef CONFIG_DEBUG_SNAPSHOT_I2C
|
|
struct __i2c_log {
|
|
unsigned long long time;
|
|
int cpu;
|
|
#ifdef CONFIG_DEBUG_SNAPSHOT_LINUX_BUILD
|
|
struct i2c_adapter *adap;
|
|
struct i2c_msg *msgs;
|
|
#else
|
|
void *adp;
|
|
void *msgs;
|
|
#endif
|
|
int num;
|
|
int en;
|
|
} i2c[DSS_LOG_MAX_NUM];
|
|
#endif
|
|
#ifdef CONFIG_DEBUG_SNAPSHOT_SPI
|
|
struct __spi_log {
|
|
unsigned long long time;
|
|
int cpu;
|
|
#ifdef CONFIG_DEBUG_SNAPSHOT_LINUX_BUILD
|
|
struct spi_controller *ctlr;
|
|
struct spi_message *cur_msg;
|
|
#else
|
|
void *ctlr;
|
|
void *cur_msg;
|
|
#endif
|
|
int en;
|
|
} spi[DSS_LOG_MAX_NUM];
|
|
#endif
|
|
#ifdef CONFIG_DEBUG_SNAPSHOT_BINDER
|
|
struct __binder_log {
|
|
unsigned long long time;
|
|
int cpu;
|
|
struct trace_binder_transaction_base base;
|
|
struct trace_binder_transaction transaction;
|
|
struct trace_binder_transaction_error error;
|
|
} binder[DSS_API_MAX_NUM << 2];
|
|
#endif
|
|
|
|
#ifndef CONFIG_DEBUG_SNAPSHOT_MINIMIZED_MODE
|
|
struct __printkl_log {
|
|
unsigned long long time;
|
|
int cpu;
|
|
size_t msg;
|
|
size_t val;
|
|
void *caller[DSS_CALLSTACK_MAX_NUM];
|
|
} printkl[DSS_API_MAX_NUM];
|
|
|
|
struct __printk_log {
|
|
unsigned long long time;
|
|
int cpu;
|
|
char log[DSS_LOG_STRING_LEN];
|
|
void *caller[DSS_CALLSTACK_MAX_NUM];
|
|
} printk[DSS_API_MAX_NUM];
|
|
#endif
|
|
};
|
|
|
|
#endif
|