xref: /OK3568_Linux_fs/kernel/arch/powerpc/include/asm/fadump-internal.h (revision 4882a59341e53eb6f0b4789bf948001014eff981)
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