#ifndef DEBUG_SNAPSHOT_LOG_H #define DEBUG_SNAPSHOT_LOG_H #include #ifdef CONFIG_DEBUG_SNAPSHOT_BINDER #include #endif #ifdef DSS_ANALYZER #define TASK_COMM_LEN 16 #define NR_CPUS 8 #undef CONFIG_DEBUG_SNAPSHOT_LINUX_BUILD #include #include #else // DSS_ANALYZER #include #include #include #endif // DSS_ANALYZER #include /* 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