diff options
author | andy.hu <andy.hu@starfivetech.com> | 2023-01-06 10:26:35 +0300 |
---|---|---|
committer | andy.hu <andy.hu@starfivetech.com> | 2023-01-06 10:26:35 +0300 |
commit | 9d16d3753da57c29d8744a11b66ec7f106b0f807 (patch) | |
tree | c2fb5e15b2cfdd796b0fe853cd7ad99ba20c9f23 /arch/riscv/include/asm | |
parent | ee5362922890f8191b7d5b4981cdc376442dfe60 (diff) | |
parent | 702e999f8a607f434be852b76aec5d6825a1fc4c (diff) | |
download | linux-9d16d3753da57c29d8744a11b66ec7f106b0f807.tar.xz |
Merge branch 'CR_3049_Hibernation_mason.huo' into 'jh7110-5.15.y-devel'
CR_3049 Add hibernation feature
See merge request sdk/linux!658
Diffstat (limited to 'arch/riscv/include/asm')
-rw-r--r-- | arch/riscv/include/asm/page.h | 2 | ||||
-rw-r--r-- | arch/riscv/include/asm/sections.h | 1 | ||||
-rw-r--r-- | arch/riscv/include/asm/suspend.h | 22 |
3 files changed, 25 insertions, 0 deletions
diff --git a/arch/riscv/include/asm/page.h b/arch/riscv/include/asm/page.h index 109c97e991a6..b3e5ff0125fe 100644 --- a/arch/riscv/include/asm/page.h +++ b/arch/riscv/include/asm/page.h @@ -157,6 +157,8 @@ extern phys_addr_t __phys_addr_symbol(unsigned long x); #define page_to_bus(page) (page_to_phys(page)) #define phys_to_page(paddr) (pfn_to_page(phys_to_pfn(paddr))) +#define sym_to_pfn(x) __phys_to_pfn(__pa_symbol(x)) + #ifdef CONFIG_FLATMEM #define pfn_valid(pfn) \ (((pfn) >= ARCH_PFN_OFFSET) && (((pfn) - ARCH_PFN_OFFSET) < max_mapnr)) diff --git a/arch/riscv/include/asm/sections.h b/arch/riscv/include/asm/sections.h index 32336e8a17cb..ad1588d3b2af 100644 --- a/arch/riscv/include/asm/sections.h +++ b/arch/riscv/include/asm/sections.h @@ -13,6 +13,7 @@ extern char _start_kernel[]; extern char __init_data_begin[], __init_data_end[]; extern char __init_text_begin[], __init_text_end[]; extern char __alt_start[], __alt_end[]; +extern phys_addr_t end_linear_map; static inline bool is_va_kernel_text(uintptr_t va) { diff --git a/arch/riscv/include/asm/suspend.h b/arch/riscv/include/asm/suspend.h index 8be391c2aecb..de8b4ea594e4 100644 --- a/arch/riscv/include/asm/suspend.h +++ b/arch/riscv/include/asm/suspend.h @@ -21,6 +21,11 @@ struct suspend_context { #endif }; +/* This value will be assigned to 0 during resume and will be used by + * hibernation core for the subsequent resume sequence + */ +extern int in_suspend; + /* Low-level CPU suspend entry function */ int __cpu_suspend_enter(struct suspend_context *context); @@ -33,4 +38,21 @@ int cpu_suspend(unsigned long arg, /* Low-level CPU resume entry function */ int __cpu_resume_enter(unsigned long hartid, unsigned long context); +/* Low-level API to support hibernation */ +int swsusp_arch_suspend(void); +int swsusp_arch_resume(void); +int arch_hibernation_header_save(void *addr, unsigned int max_size); +int arch_hibernation_header_restore(void *addr); +int __hibernate_cpu_resume(unsigned long context); + +/* Used to resume on the CPU we hibernated on */ +int hibernate_resume_nonboot_cpu_disable(void); + +/* Used to save and restore the csr */ +void suspend_save_csrs(struct suspend_context *context); +void suspend_restore_csrs(struct suspend_context *context); + +asmlinkage void restore_image(unsigned long resume_satp, unsigned long satp_temp, + unsigned long cpu_resume, unsigned long resume_context); +asmlinkage int core_restore_code(void); #endif |