import PULS_20160108
[GitHub/mt8127/android_kernel_alcatel_ttab.git] / include / linux / mrdump.h
1 #if !defined(__MRDUMP_H__)
2 #define __MRDUMP_H__
3
4 #include <stdarg.h>
5 #include <linux/elf.h>
6 #include <linux/elfcore.h>
7 #include <asm/ptrace.h>
8 #include <linux/aee.h>
9
10 #ifdef __aarch64__
11 #define reg_pc pc
12 #define reg_lr regs[30]
13 #define reg_sp sp
14 #define reg_fp regs[29]
15 #else
16 #define reg_pc ARM_pc
17 #define reg_lr ARM_lr
18 #define reg_sp ARM_sp
19 #define reg_ip ARM_ip
20 #define reg_fp ARM_fp
21 #endif
22
23 #define MRDUMP_CPU_MAX 16
24
25 #define MRDUMP_DEV_NULL 0
26 #define MRDUMP_DEV_SDCARD 1
27 #define MRDUMP_DEV_EMMC 2
28
29 #define MRDUMP_FS_NULL 0
30 #define MRDUMP_FS_VFAT 1
31 #define MRDUMP_FS_EXT4 2
32
33 typedef uint32_t arm32_gregset_t[18];
34 typedef uint64_t aarch64_gregset_t[34];
35
36 struct mrdump_crash_record {
37 int reboot_mode;
38
39 char msg[128];
40 char backtrace[512];
41
42 uint32_t fault_cpu;
43
44 union {
45 arm32_gregset_t arm32_cpu_regs[MRDUMP_CPU_MAX];
46 aarch64_gregset_t aarch64_cpu_regs[MRDUMP_CPU_MAX];
47 };
48 };
49
50 struct mrdump_machdesc {
51 uint32_t crc;
52
53 uint32_t output_device;
54
55 uint32_t nr_cpus;
56
57 uint64_t page_offset;
58 uint64_t high_memory;
59
60 uint64_t vmalloc_start;
61 uint64_t vmalloc_end;
62
63 uint64_t modules_start;
64 uint64_t modules_end;
65
66 uint64_t phys_offset;
67 uint64_t master_page_table;
68
69 uint32_t output_fstype;
70 uint32_t output_lbaooo;
71 };
72
73 struct mrdump_cblock_result {
74 char status[128];
75
76 uint32_t log_size;
77 char log_buf[2048];
78 };
79
80 struct mrdump_control_block {
81 char sig[8];
82
83 struct mrdump_machdesc machdesc;
84 struct mrdump_crash_record crash_record;
85 struct mrdump_cblock_result result;
86 };
87
88 struct mrdump_platform {
89 void (*hw_enable) (bool enabled);
90 void (*reboot) (void);
91 };
92
93 /* NOTE!! any change to this struct should be compatible in aed */
94 struct mrdump_mini_reg_desc {
95 unsigned long reg; /* register value */
96 unsigned long kstart; /* start kernel addr of memory dump */
97 unsigned long kend; /* end kernel addr of memory dump */
98 unsigned long pos; /* next pos to dump */
99 int valid; /* 1: valid regiser, 0: invalid regiser */
100 int pad; /* reserved */
101 loff_t offset; /* offset in buffer */
102 };
103
104 /* it should always be smaller than MRDUMP_MINI_HEADER_SIZE */
105 struct mrdump_mini_header {
106 struct mrdump_mini_reg_desc reg_desc[ELF_NGREG];
107 };
108
109 #define MRDUMP_MINI_NR_SECTION 40
110 #define MRDUMP_MINI_SECTION_SIZE (32 * 1024)
111 #define NT_IPANIC_MISC 4095
112 #define MRDUMP_MINI_NR_MISC 20
113
114 struct mrdump_mini_elf_misc {
115 unsigned long vaddr;
116 unsigned long paddr;
117 unsigned long start;
118 unsigned long size;
119 };
120
121 #define NOTE_NAME_SHORT 12
122 #define NOTE_NAME_LONG 20
123
124 struct mrdump_mini_elf_psinfo {
125 struct elf_note note;
126 char name[NOTE_NAME_SHORT];
127 struct elf_prpsinfo data;
128 };
129
130 struct mrdump_mini_elf_prstatus {
131 struct elf_note note;
132 char name[NOTE_NAME_SHORT];
133 struct elf_prstatus data;
134 };
135
136 struct mrdump_mini_elf_note {
137 struct elf_note note;
138 char name[NOTE_NAME_LONG];
139 struct mrdump_mini_elf_misc data;
140 };
141
142 struct mrdump_mini_elf_header {
143 struct elfhdr ehdr;
144 struct elf_phdr phdrs[MRDUMP_MINI_NR_SECTION];
145 struct mrdump_mini_elf_psinfo psinfo;
146 struct mrdump_mini_elf_prstatus prstatus[NR_CPUS + 1];
147 struct mrdump_mini_elf_note misc[MRDUMP_MINI_NR_MISC];
148 };
149
150 #define MRDUMP_MINI_HEADER_SIZE ALIGN(sizeof(struct mrdump_mini_elf_header), PAGE_SIZE)
151 #define MRDUMP_MINI_DATA_SIZE (MRDUMP_MINI_NR_SECTION * MRDUMP_MINI_SECTION_SIZE)
152 #define MRDUMP_MINI_BUF_SIZE (MRDUMP_MINI_HEADER_SIZE + MRDUMP_MINI_DATA_SIZE)
153
154 #ifdef CONFIG_MTK_RAM_CONSOLE_DRAM_ADDR
155 #define MRDUMP_MINI_BUF_PADDR (CONFIG_MTK_RAM_CONSOLE_DRAM_ADDR + 0xf0000)
156 #else
157 #define MRDUMP_MINI_BUF_PADDR 0
158 #endif
159
160 #if defined(CONFIG_MTK_AEE_MRDUMP)
161 void mrdump_reserve_memory(void);
162
163 void mrdump_platform_init(struct mrdump_control_block *cblock,
164 const struct mrdump_platform *plafrom);
165
166 void __mrdump_create_oops_dump(AEE_REBOOT_MODE reboot_mode, struct pt_regs *regs, const char *msg,
167 ...);
168
169 void aee_kdump_reboot(AEE_REBOOT_MODE, const char *msg, ...);
170
171 #else
172 static inline void mrdump_reserve_memory(void)
173 {
174 }
175
176 static inline void mrdump_platform_init(struct mrdump_control_block *cblock,
177 void (*hw_enable) (bool enabled))
178 {
179 }
180
181 static inline void __mrdump_create_oops_dump(AEE_REBOOT_MODE reboot_mode, struct pt_regs *regs,
182 const char *msg, ...)
183 {
184 }
185
186 static inline void aee_kdump_reboot(AEE_REBOOT_MODE reboot_mode, const char *msg, ...)
187 {
188 }
189
190 #endif
191
192 typedef int (*mrdump_write)(void *buf, int off, int len, int encrypt);
193 #if defined(CONFIG_MTK_AEE_IPANIC)
194 int mrdump_mini_create_oops_dump(AEE_REBOOT_MODE reboot_mode, mrdump_write write,
195 loff_t sd_offset, const char *msg, va_list ap);
196 void mrdump_mini_reserve_memory(void);
197 #else
198 static inline int mrdump_mini_create_oops_dump(AEE_REBOOT_MODE reboot_mode, mrdump_write write,
199 loff_t sd_offset, const char *msg, va_list ap)
200 {
201 return 0;
202 }
203
204 static inline void mrdump_mini_reserve_memory(void)
205 {
206 }
207 #endif
208
209 #endif