xref: /openbmc/linux/arch/riscv/include/asm/kexec.h (revision 96df59b1)
1fba8a867SNick Kossifidis /* SPDX-License-Identifier: GPL-2.0 */
2fba8a867SNick Kossifidis /*
3fba8a867SNick Kossifidis  * Copyright (C) 2019 FORTH-ICS/CARV
4fba8a867SNick Kossifidis  *  Nick Kossifidis <mick@ics.forth.gr>
5fba8a867SNick Kossifidis  */
6fba8a867SNick Kossifidis 
7fba8a867SNick Kossifidis #ifndef _RISCV_KEXEC_H
8fba8a867SNick Kossifidis #define _RISCV_KEXEC_H
9fba8a867SNick Kossifidis 
10fba8a867SNick Kossifidis #include <asm/page.h>    /* For PAGE_SIZE */
11fba8a867SNick Kossifidis 
12fba8a867SNick Kossifidis /* Maximum physical address we can use pages from */
13fba8a867SNick Kossifidis #define KEXEC_SOURCE_MEMORY_LIMIT (-1UL)
14fba8a867SNick Kossifidis 
15fba8a867SNick Kossifidis /* Maximum address we can reach in physical address mode */
16fba8a867SNick Kossifidis #define KEXEC_DESTINATION_MEMORY_LIMIT (-1UL)
17fba8a867SNick Kossifidis 
18fba8a867SNick Kossifidis /* Maximum address we can use for the control code buffer */
19fba8a867SNick Kossifidis #define KEXEC_CONTROL_MEMORY_LIMIT (-1UL)
20fba8a867SNick Kossifidis 
21fba8a867SNick Kossifidis /* Reserve a page for the control code buffer */
22fba8a867SNick Kossifidis #define KEXEC_CONTROL_PAGE_SIZE PAGE_SIZE
23fba8a867SNick Kossifidis 
24fba8a867SNick Kossifidis #define KEXEC_ARCH KEXEC_ARCH_RISCV
25fba8a867SNick Kossifidis 
26e53d2818SNick Kossifidis extern void riscv_crash_save_regs(struct pt_regs *newregs);
27e53d2818SNick Kossifidis 
28fba8a867SNick Kossifidis static inline void
crash_setup_regs(struct pt_regs * newregs,struct pt_regs * oldregs)29fba8a867SNick Kossifidis crash_setup_regs(struct pt_regs *newregs,
30fba8a867SNick Kossifidis 		 struct pt_regs *oldregs)
31fba8a867SNick Kossifidis {
32e53d2818SNick Kossifidis 	if (oldregs)
33e53d2818SNick Kossifidis 		memcpy(newregs, oldregs, sizeof(struct pt_regs));
34e53d2818SNick Kossifidis 	else
35e53d2818SNick Kossifidis 		riscv_crash_save_regs(newregs);
36fba8a867SNick Kossifidis }
37fba8a867SNick Kossifidis 
38fba8a867SNick Kossifidis 
39fba8a867SNick Kossifidis #define ARCH_HAS_KIMAGE_ARCH
40fba8a867SNick Kossifidis 
41fba8a867SNick Kossifidis struct kimage_arch {
42*96df59b1SLi Huafei 	void *fdt; /* For CONFIG_KEXEC_FILE */
43fba8a867SNick Kossifidis 	unsigned long fdt_addr;
44fba8a867SNick Kossifidis };
45fba8a867SNick Kossifidis 
46bab0d47cSJisheng Zhang extern const unsigned char riscv_kexec_relocate[];
47bab0d47cSJisheng Zhang extern const unsigned int riscv_kexec_relocate_size;
48fba8a867SNick Kossifidis 
49e53d2818SNick Kossifidis typedef void (*riscv_kexec_method)(unsigned long first_ind_entry,
50fba8a867SNick Kossifidis 				   unsigned long jump_addr,
51fba8a867SNick Kossifidis 				   unsigned long fdt_addr,
52fba8a867SNick Kossifidis 				   unsigned long hartid,
53fba8a867SNick Kossifidis 				   unsigned long va_pa_off);
54fba8a867SNick Kossifidis 
55e53d2818SNick Kossifidis extern riscv_kexec_method riscv_kexec_norelocate;
56e53d2818SNick Kossifidis 
576261586eSLiao Chang #ifdef CONFIG_KEXEC_FILE
586261586eSLiao Chang extern const struct kexec_file_ops elf_kexec_ops;
597699f7aaSUwe Kleine-König 
607699f7aaSUwe Kleine-König struct purgatory_info;
617699f7aaSUwe Kleine-König int arch_kexec_apply_relocations_add(struct purgatory_info *pi,
627699f7aaSUwe Kleine-König 				     Elf_Shdr *section,
637699f7aaSUwe Kleine-König 				     const Elf_Shdr *relsec,
647699f7aaSUwe Kleine-König 				     const Elf_Shdr *symtab);
657699f7aaSUwe Kleine-König #define arch_kexec_apply_relocations_add arch_kexec_apply_relocations_add
66*96df59b1SLi Huafei 
67*96df59b1SLi Huafei struct kimage;
68*96df59b1SLi Huafei int arch_kimage_file_post_load_cleanup(struct kimage *image);
69*96df59b1SLi Huafei #define arch_kimage_file_post_load_cleanup arch_kimage_file_post_load_cleanup
706261586eSLiao Chang #endif
716261586eSLiao Chang 
72fba8a867SNick Kossifidis #endif
73