1 /* SPDX-License-Identifier: GPL-2.0-or-later */
2 /*
3  * Firmware-Assisted Dump support on POWERVM platform.
4  *
5  * Copyright 2011, Mahesh Salgaonkar, IBM Corporation.
6  * Copyright 2019, Hari Bathini, IBM Corporation.
7  */
8 
9 #ifndef _PSERIES_RTAS_FADUMP_H
10 #define _PSERIES_RTAS_FADUMP_H
11 
12 /*
13  * On some Power systems where RMO is 128MB, it still requires minimum of
14  * 256MB for kernel to boot successfully. When kdump infrastructure is
15  * configured to save vmcore over network, we run into OOM issue while
16  * loading modules related to network setup. Hence we need additional 64M
17  * of memory to avoid OOM issue.
18  */
19 #define RTAS_FADUMP_MIN_BOOT_MEM	((0x1UL << 28) + (0x1UL << 26))
20 
21 /* Firmware provided dump sections */
22 #define RTAS_FADUMP_CPU_STATE_DATA	0x0001
23 #define RTAS_FADUMP_HPTE_REGION		0x0002
24 #define RTAS_FADUMP_REAL_MODE_REGION	0x0011
25 
26 /* Dump request flag */
27 #define RTAS_FADUMP_REQUEST_FLAG	0x00000001
28 
29 /* Dump status flag */
30 #define RTAS_FADUMP_ERROR_FLAG		0x2000
31 
32 /* Kernel Dump section info */
33 struct rtas_fadump_section {
34 	__be32	request_flag;
35 	__be16	source_data_type;
36 	__be16	error_flags;
37 	__be64	source_address;
38 	__be64	source_len;
39 	__be64	bytes_dumped;
40 	__be64	destination_address;
41 };
42 
43 /* ibm,configure-kernel-dump header. */
44 struct rtas_fadump_section_header {
45 	__be32	dump_format_version;
46 	__be16	dump_num_sections;
47 	__be16	dump_status_flag;
48 	__be32	offset_first_dump_section;
49 
50 	/* Fields for disk dump option. */
51 	__be32	dd_block_size;
52 	__be64	dd_block_offset;
53 	__be64	dd_num_blocks;
54 	__be32	dd_offset_disk_path;
55 
56 	/* Maximum time allowed to prevent an automatic dump-reboot. */
57 	__be32	max_time_auto;
58 };
59 
60 /*
61  * Firmware Assisted dump memory structure. This structure is required for
62  * registering future kernel dump with power firmware through rtas call.
63  *
64  * No disk dump option. Hence disk dump path string section is not included.
65  */
66 struct rtas_fadump_mem_struct {
67 	struct rtas_fadump_section_header	header;
68 
69 	/* Kernel dump sections */
70 	struct rtas_fadump_section		cpu_state_data;
71 	struct rtas_fadump_section		hpte_region;
72 
73 	/*
74 	 * TODO: Extend multiple boot memory regions support in the kernel
75 	 *       for this platform.
76 	 */
77 	struct rtas_fadump_section		rmr_region;
78 };
79 
80 /*
81  * The firmware-assisted dump format.
82  *
83  * The register save area is an area in the partition's memory used to preserve
84  * the register contents (CPU state data) for the active CPUs during a firmware
85  * assisted dump. The dump format contains register save area header followed
86  * by register entries. Each list of registers for a CPU starts with "CPUSTRT"
87  * and ends with "CPUEND".
88  */
89 
90 /* Register save area header. */
91 struct rtas_fadump_reg_save_area_header {
92 	__be64		magic_number;
93 	__be32		version;
94 	__be32		num_cpu_offset;
95 };
96 
97 /* Register entry. */
98 struct rtas_fadump_reg_entry {
99 	__be64		reg_id;
100 	__be64		reg_value;
101 };
102 
103 /* Utility macros */
104 #define RTAS_FADUMP_SKIP_TO_NEXT_CPU(reg_entry)				\
105 ({									\
106 	while (be64_to_cpu(reg_entry->reg_id) !=			\
107 	       fadump_str_to_u64("CPUEND"))				\
108 		reg_entry++;						\
109 	reg_entry++;							\
110 })
111 
112 #define RTAS_FADUMP_CPU_ID_MASK			((1UL << 32) - 1)
113 
114 #endif /* _PSERIES_RTAS_FADUMP_H */
115