RISC-V: Factor out common code of __cpu_resume_enter()
authorSia Jee Heng <jeeheng.sia@starfivetech.com>
Tue, 14 Mar 2023 05:03:14 +0000 (13:03 +0800)
committerJaehoon Chung <jh80.chung@samsung.com>
Tue, 28 Mar 2023 03:23:14 +0000 (12:23 +0900)
The cpu_resume() function is very similar for the suspend to disk and
suspend to ram cases. Factor out the common code into suspend_restore_csrs
macro and suspend_restore_regs macro.

Signed-off-by: Sia Jee Heng <jeeheng.sia@starfivetech.com>
Reviewed-by: Andrew Jones <ajones@ventanamicro.com>
Reviewed-by: Conor Dooley <conor.dooley@microchip.com>
arch/riscv/include/asm/assembler.h [new file with mode: 0644]
arch/riscv/kernel/suspend_entry.S

diff --git a/arch/riscv/include/asm/assembler.h b/arch/riscv/include/asm/assembler.h
new file mode 100644 (file)
index 0000000..ba59d38
--- /dev/null
@@ -0,0 +1,62 @@
+/* SPDX-License-Identifier: GPL-2.0-only */
+/*
+ * Copyright (C) 2023 StarFive Technology Co., Ltd.
+ *
+ * Author: Jee Heng Sia <jeeheng.sia@starfivetech.com>
+ */
+
+#ifndef __ASSEMBLY__
+#error "Only include this from assembly code"
+#endif
+
+#ifndef __ASM_ASSEMBLER_H
+#define __ASM_ASSEMBLER_H
+
+#include <asm/asm.h>
+#include <asm/asm-offsets.h>
+#include <asm/csr.h>
+
+/*
+ * suspend_restore_csrs - restore CSRs
+ */
+       .macro suspend_restore_csrs
+               REG_L   t0, (SUSPEND_CONTEXT_REGS + PT_EPC)(a0)
+               csrw    CSR_EPC, t0
+               REG_L   t0, (SUSPEND_CONTEXT_REGS + PT_STATUS)(a0)
+               csrw    CSR_STATUS, t0
+               REG_L   t0, (SUSPEND_CONTEXT_REGS + PT_BADADDR)(a0)
+               csrw    CSR_TVAL, t0
+               REG_L   t0, (SUSPEND_CONTEXT_REGS + PT_CAUSE)(a0)
+               csrw    CSR_CAUSE, t0
+       .endm
+
+/*
+ * suspend_restore_regs - Restore registers (except A0 and T0-T6)
+ */
+       .macro suspend_restore_regs
+               REG_L   ra, (SUSPEND_CONTEXT_REGS + PT_RA)(a0)
+               REG_L   sp, (SUSPEND_CONTEXT_REGS + PT_SP)(a0)
+               REG_L   gp, (SUSPEND_CONTEXT_REGS + PT_GP)(a0)
+               REG_L   tp, (SUSPEND_CONTEXT_REGS + PT_TP)(a0)
+               REG_L   s0, (SUSPEND_CONTEXT_REGS + PT_S0)(a0)
+               REG_L   s1, (SUSPEND_CONTEXT_REGS + PT_S1)(a0)
+               REG_L   a1, (SUSPEND_CONTEXT_REGS + PT_A1)(a0)
+               REG_L   a2, (SUSPEND_CONTEXT_REGS + PT_A2)(a0)
+               REG_L   a3, (SUSPEND_CONTEXT_REGS + PT_A3)(a0)
+               REG_L   a4, (SUSPEND_CONTEXT_REGS + PT_A4)(a0)
+               REG_L   a5, (SUSPEND_CONTEXT_REGS + PT_A5)(a0)
+               REG_L   a6, (SUSPEND_CONTEXT_REGS + PT_A6)(a0)
+               REG_L   a7, (SUSPEND_CONTEXT_REGS + PT_A7)(a0)
+               REG_L   s2, (SUSPEND_CONTEXT_REGS + PT_S2)(a0)
+               REG_L   s3, (SUSPEND_CONTEXT_REGS + PT_S3)(a0)
+               REG_L   s4, (SUSPEND_CONTEXT_REGS + PT_S4)(a0)
+               REG_L   s5, (SUSPEND_CONTEXT_REGS + PT_S5)(a0)
+               REG_L   s6, (SUSPEND_CONTEXT_REGS + PT_S6)(a0)
+               REG_L   s7, (SUSPEND_CONTEXT_REGS + PT_S7)(a0)
+               REG_L   s8, (SUSPEND_CONTEXT_REGS + PT_S8)(a0)
+               REG_L   s9, (SUSPEND_CONTEXT_REGS + PT_S9)(a0)
+               REG_L   s10, (SUSPEND_CONTEXT_REGS + PT_S10)(a0)
+               REG_L   s11, (SUSPEND_CONTEXT_REGS + PT_S11)(a0)
+       .endm
+
+#endif /* __ASM_ASSEMBLER_H */
index aafcca5..12b52af 100644 (file)
@@ -7,6 +7,7 @@
 #include <linux/linkage.h>
 #include <asm/asm.h>
 #include <asm/asm-offsets.h>
+#include <asm/assembler.h>
 #include <asm/csr.h>
 #include <asm/xip_fixup.h>
 
@@ -83,39 +84,10 @@ ENTRY(__cpu_resume_enter)
        add     a0, a1, zero
 
        /* Restore CSRs */
-       REG_L   t0, (SUSPEND_CONTEXT_REGS + PT_EPC)(a0)
-       csrw    CSR_EPC, t0
-       REG_L   t0, (SUSPEND_CONTEXT_REGS + PT_STATUS)(a0)
-       csrw    CSR_STATUS, t0
-       REG_L   t0, (SUSPEND_CONTEXT_REGS + PT_BADADDR)(a0)
-       csrw    CSR_TVAL, t0
-       REG_L   t0, (SUSPEND_CONTEXT_REGS + PT_CAUSE)(a0)
-       csrw    CSR_CAUSE, t0
+       suspend_restore_csrs
 
        /* Restore registers (except A0 and T0-T6) */
-       REG_L   ra, (SUSPEND_CONTEXT_REGS + PT_RA)(a0)
-       REG_L   sp, (SUSPEND_CONTEXT_REGS + PT_SP)(a0)
-       REG_L   gp, (SUSPEND_CONTEXT_REGS + PT_GP)(a0)
-       REG_L   tp, (SUSPEND_CONTEXT_REGS + PT_TP)(a0)
-       REG_L   s0, (SUSPEND_CONTEXT_REGS + PT_S0)(a0)
-       REG_L   s1, (SUSPEND_CONTEXT_REGS + PT_S1)(a0)
-       REG_L   a1, (SUSPEND_CONTEXT_REGS + PT_A1)(a0)
-       REG_L   a2, (SUSPEND_CONTEXT_REGS + PT_A2)(a0)
-       REG_L   a3, (SUSPEND_CONTEXT_REGS + PT_A3)(a0)
-       REG_L   a4, (SUSPEND_CONTEXT_REGS + PT_A4)(a0)
-       REG_L   a5, (SUSPEND_CONTEXT_REGS + PT_A5)(a0)
-       REG_L   a6, (SUSPEND_CONTEXT_REGS + PT_A6)(a0)
-       REG_L   a7, (SUSPEND_CONTEXT_REGS + PT_A7)(a0)
-       REG_L   s2, (SUSPEND_CONTEXT_REGS + PT_S2)(a0)
-       REG_L   s3, (SUSPEND_CONTEXT_REGS + PT_S3)(a0)
-       REG_L   s4, (SUSPEND_CONTEXT_REGS + PT_S4)(a0)
-       REG_L   s5, (SUSPEND_CONTEXT_REGS + PT_S5)(a0)
-       REG_L   s6, (SUSPEND_CONTEXT_REGS + PT_S6)(a0)
-       REG_L   s7, (SUSPEND_CONTEXT_REGS + PT_S7)(a0)
-       REG_L   s8, (SUSPEND_CONTEXT_REGS + PT_S8)(a0)
-       REG_L   s9, (SUSPEND_CONTEXT_REGS + PT_S9)(a0)
-       REG_L   s10, (SUSPEND_CONTEXT_REGS + PT_S10)(a0)
-       REG_L   s11, (SUSPEND_CONTEXT_REGS + PT_S11)(a0)
+       suspend_restore_regs
 
        /* Return zero value */
        add     a0, zero, zero