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