Commit | Line | Data |
---|---|---|
ca986d7f HB |
1 | /* SPDX-License-Identifier: GPL-2.0-or-later */ |
2 | /* | |
3 | * Firmware-Assisted Dump internal code. | |
4 | * | |
5 | * Copyright 2011, Mahesh Salgaonkar, IBM Corporation. | |
6 | * Copyright 2019, Hari Bathini, IBM Corporation. | |
7 | */ | |
8 | ||
9 | #ifndef _ASM_POWERPC_FADUMP_INTERNAL_H | |
10 | #define _ASM_POWERPC_FADUMP_INTERNAL_H | |
11 | ||
7dee93a9 HB |
12 | /* Maximum number of memory regions kernel supports */ |
13 | #define FADUMP_MAX_MEM_REGS 128 | |
14 | ||
bec53196 | 15 | #ifndef CONFIG_PRESERVE_FA_DUMP |
ca986d7f | 16 | |
ca986d7f HB |
17 | /* The upper limit percentage for user specified boot memory size (25%) */ |
18 | #define MAX_BOOT_MEM_RATIO 4 | |
19 | ||
20 | #define memblock_num_regions(memblock_type) (memblock.memblock_type.cnt) | |
21 | ||
22 | /* Alignment per CMA requirement. */ | |
23 | #define FADUMP_CMA_ALIGNMENT (PAGE_SIZE << \ | |
24 | max_t(unsigned long, MAX_ORDER - 1, \ | |
25 | pageblock_order)) | |
26 | ||
27 | /* FAD commands */ | |
28 | #define FADUMP_REGISTER 1 | |
29 | #define FADUMP_UNREGISTER 2 | |
30 | #define FADUMP_INVALIDATE 3 | |
31 | ||
0226e552 HB |
32 | /* |
33 | * Copy the ascii values for first 8 characters from a string into u64 | |
34 | * variable at their respective indexes. | |
35 | * e.g. | |
36 | * The string "FADMPINF" will be converted into 0x4641444d50494e46 | |
37 | */ | |
38 | static inline u64 fadump_str_to_u64(const char *str) | |
39 | { | |
40 | u64 val = 0; | |
41 | int i; | |
42 | ||
43 | for (i = 0; i < sizeof(val); i++) | |
44 | val = (*str) ? (val << 8) | *str++ : val << 8; | |
45 | return val; | |
46 | } | |
47 | ||
48 | #define FADUMP_CPU_UNKNOWN (~((u32)0)) | |
49 | ||
50 | #define FADUMP_CRASH_INFO_MAGIC fadump_str_to_u64("FADMPINF") | |
ca986d7f HB |
51 | |
52 | /* fadump crash info structure */ | |
53 | struct fadump_crash_info_header { | |
54 | u64 magic_number; | |
55 | u64 elfcorehdr_addr; | |
56 | u32 crashing_cpu; | |
57 | struct pt_regs regs; | |
58 | struct cpumask online_mask; | |
59 | }; | |
60 | ||
e4fc48fb HB |
61 | struct fadump_memory_range { |
62 | u64 base; | |
63 | u64 size; | |
64 | }; | |
65 | ||
66 | /* fadump memory ranges info */ | |
67 | struct fadump_mrange_info { | |
68 | char name[16]; | |
69 | struct fadump_memory_range *mem_ranges; | |
70 | u32 mem_ranges_sz; | |
71 | u32 mem_range_cnt; | |
72 | u32 max_mem_ranges; | |
ca986d7f HB |
73 | }; |
74 | ||
d3833a70 HB |
75 | /* Platform specific callback functions */ |
76 | struct fadump_ops; | |
77 | ||
ca986d7f HB |
78 | /* Firmware-assisted dump configuration details. */ |
79 | struct fw_dump { | |
80 | unsigned long reserve_dump_area_start; | |
81 | unsigned long reserve_dump_area_size; | |
82 | /* cmd line option during boot */ | |
83 | unsigned long reserve_bootvar; | |
84 | ||
85 | unsigned long cpu_state_data_size; | |
5000a17a HB |
86 | u64 cpu_state_dest_vaddr; |
87 | u32 cpu_state_data_version; | |
88 | u32 cpu_state_entry_size; | |
89 | ||
ca986d7f | 90 | unsigned long hpte_region_size; |
41a65d16 | 91 | |
ca986d7f | 92 | unsigned long boot_memory_size; |
41a65d16 | 93 | u64 boot_mem_dest_addr; |
7dee93a9 HB |
94 | u64 boot_mem_addr[FADUMP_MAX_MEM_REGS]; |
95 | u64 boot_mem_sz[FADUMP_MAX_MEM_REGS]; | |
96 | u64 boot_mem_top; | |
97 | u64 boot_mem_regs_cnt; | |
ca986d7f HB |
98 | |
99 | unsigned long fadumphdr_addr; | |
961cf26a | 100 | unsigned long cpu_notes_buf_vaddr; |
ca986d7f HB |
101 | unsigned long cpu_notes_buf_size; |
102 | ||
7dee93a9 HB |
103 | /* |
104 | * Maximum size supported by firmware to copy from source to | |
105 | * destination address per entry. | |
106 | */ | |
107 | u64 max_copy_size; | |
742a265a HB |
108 | u64 kernel_metadata; |
109 | ||
ca986d7f HB |
110 | int ibm_configure_kernel_dump; |
111 | ||
112 | unsigned long fadump_enabled:1; | |
113 | unsigned long fadump_supported:1; | |
114 | unsigned long dump_active:1; | |
115 | unsigned long dump_registered:1; | |
116 | unsigned long nocma:1; | |
d3833a70 HB |
117 | |
118 | struct fadump_ops *ops; | |
119 | }; | |
120 | ||
121 | struct fadump_ops { | |
122 | u64 (*fadump_init_mem_struct)(struct fw_dump *fadump_conf); | |
742a265a HB |
123 | u64 (*fadump_get_metadata_size)(void); |
124 | int (*fadump_setup_metadata)(struct fw_dump *fadump_conf); | |
7b1b3b48 | 125 | u64 (*fadump_get_bootmem_min)(void); |
d3833a70 HB |
126 | int (*fadump_register)(struct fw_dump *fadump_conf); |
127 | int (*fadump_unregister)(struct fw_dump *fadump_conf); | |
128 | int (*fadump_invalidate)(struct fw_dump *fadump_conf); | |
2790d01d | 129 | void (*fadump_cleanup)(struct fw_dump *fadump_conf); |
d3833a70 HB |
130 | int (*fadump_process)(struct fw_dump *fadump_conf); |
131 | void (*fadump_region_show)(struct fw_dump *fadump_conf, | |
132 | struct seq_file *m); | |
133 | void (*fadump_trigger)(struct fadump_crash_info_header *fdh, | |
134 | const char *msg); | |
ca986d7f HB |
135 | }; |
136 | ||
7f0ad11d HB |
137 | /* Helper functions */ |
138 | s32 fadump_setup_cpu_notes_buf(u32 num_cpus); | |
139 | void fadump_free_cpu_notes_buf(void); | |
140 | u32 *fadump_regs_to_elf_notes(u32 *buf, struct pt_regs *regs); | |
141 | void fadump_update_elfcore_header(char *bufp); | |
142 | bool is_fadump_boot_mem_contiguous(void); | |
143 | bool is_fadump_reserved_mem_contiguous(void); | |
144 | ||
bec53196 HB |
145 | #else /* !CONFIG_PRESERVE_FA_DUMP */ |
146 | ||
147 | /* Firmware-assisted dump configuration details. */ | |
148 | struct fw_dump { | |
149 | u64 boot_mem_top; | |
150 | u64 dump_active; | |
151 | }; | |
152 | ||
153 | #endif /* CONFIG_PRESERVE_FA_DUMP */ | |
154 | ||
d3833a70 HB |
155 | #ifdef CONFIG_PPC_PSERIES |
156 | extern void rtas_fadump_dt_scan(struct fw_dump *fadump_conf, u64 node); | |
157 | #else | |
158 | static inline void | |
159 | rtas_fadump_dt_scan(struct fw_dump *fadump_conf, u64 node) { } | |
160 | #endif | |
161 | ||
41df5928 HB |
162 | #ifdef CONFIG_PPC_POWERNV |
163 | extern void opal_fadump_dt_scan(struct fw_dump *fadump_conf, u64 node); | |
164 | #else | |
165 | static inline void | |
166 | opal_fadump_dt_scan(struct fw_dump *fadump_conf, u64 node) { } | |
167 | #endif | |
168 | ||
ca986d7f | 169 | #endif /* _ASM_POWERPC_FADUMP_INTERNAL_H */ |