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 { |
45 | __be32 ; |
46 | __be16 ; |
47 | __be16 ; |
48 | __be32 ; |
49 | |
50 | /* Fields for disk dump option. */ |
51 | __be32 ; |
52 | __be64 ; |
53 | __be64 ; |
54 | __be32 ; |
55 | |
56 | /* Maximum time allowed to prevent an automatic dump-reboot. */ |
57 | __be32 ; |
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 ; |
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 { |
92 | __be64 ; |
93 | __be32 ; |
94 | __be32 ; |
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 | |