diff options
author | Dengcheng Zhu <dzhu@wavecomp.com> | 2018-09-11 17:49:24 -0400 |
---|---|---|
committer | Paul Burton <paul.burton@mips.com> | 2018-09-22 13:32:34 -0400 |
commit | 2fe8ea39c9a8489799cf86bb377fc80492b5b3bf (patch) | |
tree | a43f02b1275771b5cf99d1f1d784392e118bf069 /arch/mips/kernel | |
parent | a6da4d6fdf8bd512c98d3ac7f1d16bc4bb282919 (diff) |
MIPS: kexec: Use prepare method from Generic for UHI platforms
Out-of-tree platforms may not be based on Generic as shown in customer
communication. Share the prepare method with all using UHI boot protocol,
and put into machine_kexec.c.
The benefit is that, when having kexec_args related problems, developers
will naturally look into machine_kexec.c, where "CONFIG_UHI_BOOT" will be
found, prompting them to add "select UHI_BOOT" to the platform Kconfig. It
would otherwise require a lot debugging or online searching to be aware
that the solution is in Generic code.
Tested-by: Rachel Mozes <rachel.mozes@intel.com>
Reported-by: Rachel Mozes <rachel.mozes@intel.com>
Signed-off-by: Dengcheng Zhu <dzhu@wavecomp.com>
Signed-off-by: Paul Burton <paul.burton@mips.com>
Patchwork: https://patchwork.linux-mips.org/patch/20569/
Cc: pburton@wavecomp.com
Cc: ralf@linux-mips.org
Cc: linux-mips@linux-mips.org
Diffstat (limited to 'arch/mips/kernel')
-rw-r--r-- | arch/mips/kernel/machine_kexec.c | 42 |
1 files changed, 41 insertions, 1 deletions
diff --git a/arch/mips/kernel/machine_kexec.c b/arch/mips/kernel/machine_kexec.c index 14ced77c5ef6..35175eb2e8b0 100644 --- a/arch/mips/kernel/machine_kexec.c +++ b/arch/mips/kernel/machine_kexec.c | |||
@@ -9,6 +9,7 @@ | |||
9 | #include <linux/kexec.h> | 9 | #include <linux/kexec.h> |
10 | #include <linux/mm.h> | 10 | #include <linux/mm.h> |
11 | #include <linux/delay.h> | 11 | #include <linux/delay.h> |
12 | #include <linux/libfdt.h> | ||
12 | 13 | ||
13 | #include <asm/cacheflush.h> | 14 | #include <asm/cacheflush.h> |
14 | #include <asm/page.h> | 15 | #include <asm/page.h> |
@@ -28,7 +29,6 @@ atomic_t kexec_ready_to_reboot = ATOMIC_INIT(0); | |||
28 | void (*_crash_smp_send_stop)(void) = NULL; | 29 | void (*_crash_smp_send_stop)(void) = NULL; |
29 | #endif | 30 | #endif |
30 | 31 | ||
31 | int (*_machine_kexec_prepare)(struct kimage *) = NULL; | ||
32 | void (*_machine_kexec_shutdown)(void) = NULL; | 32 | void (*_machine_kexec_shutdown)(void) = NULL; |
33 | void (*_machine_crash_shutdown)(struct pt_regs *regs) = NULL; | 33 | void (*_machine_crash_shutdown)(struct pt_regs *regs) = NULL; |
34 | 34 | ||
@@ -52,6 +52,46 @@ static void kexec_image_info(const struct kimage *kimage) | |||
52 | } | 52 | } |
53 | } | 53 | } |
54 | 54 | ||
55 | #ifdef CONFIG_UHI_BOOT | ||
56 | |||
57 | static int uhi_machine_kexec_prepare(struct kimage *kimage) | ||
58 | { | ||
59 | int i; | ||
60 | |||
61 | /* | ||
62 | * In case DTB file is not passed to the new kernel, a flat device | ||
63 | * tree will be created by kexec tool. It holds modified command | ||
64 | * line for the new kernel. | ||
65 | */ | ||
66 | for (i = 0; i < kimage->nr_segments; i++) { | ||
67 | struct fdt_header fdt; | ||
68 | |||
69 | if (kimage->segment[i].memsz <= sizeof(fdt)) | ||
70 | continue; | ||
71 | |||
72 | if (copy_from_user(&fdt, kimage->segment[i].buf, sizeof(fdt))) | ||
73 | continue; | ||
74 | |||
75 | if (fdt_check_header(&fdt)) | ||
76 | continue; | ||
77 | |||
78 | kexec_args[0] = -2; | ||
79 | kexec_args[1] = (unsigned long) | ||
80 | phys_to_virt((unsigned long)kimage->segment[i].mem); | ||
81 | break; | ||
82 | } | ||
83 | |||
84 | return 0; | ||
85 | } | ||
86 | |||
87 | int (*_machine_kexec_prepare)(struct kimage *) = uhi_machine_kexec_prepare; | ||
88 | |||
89 | #else | ||
90 | |||
91 | int (*_machine_kexec_prepare)(struct kimage *) = NULL; | ||
92 | |||
93 | #endif /* CONFIG_UHI_BOOT */ | ||
94 | |||
55 | int | 95 | int |
56 | machine_kexec_prepare(struct kimage *kimage) | 96 | machine_kexec_prepare(struct kimage *kimage) |
57 | { | 97 | { |