1 // SPDX-License-Identifier: GPL-2.0
3 * loongson-specific suspend support
5 * Author: Huacai Chen <chenhuacai@loongson.cn>
6 * Copyright (C) 2020-2022 Loongson Technology Corporation Limited
8 #include <linux/acpi.h>
10 #include <linux/suspend.h>
12 #include <asm/loongarch.h>
13 #include <asm/loongson.h>
14 #include <asm/setup.h>
16 #include <asm/tlbflush.h>
18 u64 loongarch_suspend_addr;
20 struct saved_registers {
28 static struct saved_registers saved_regs;
30 void loongarch_common_suspend(void)
33 saved_regs.pgd = csr_read64(LOONGARCH_CSR_PGDL);
34 saved_regs.kpgd = csr_read64(LOONGARCH_CSR_PGDH);
35 saved_regs.pwctl0 = csr_read32(LOONGARCH_CSR_PWCTL0);
36 saved_regs.pwctl1 = csr_read32(LOONGARCH_CSR_PWCTL1);
37 saved_regs.ecfg = csr_read32(LOONGARCH_CSR_ECFG);
38 saved_regs.euen = csr_read32(LOONGARCH_CSR_EUEN);
40 loongarch_suspend_addr = loongson_sysconf.suspend_addr;
43 void loongarch_common_resume(void)
46 local_flush_tlb_all();
47 csr_write64(per_cpu_offset(0), PERCPU_BASE_KS);
48 csr_write64(eentry, LOONGARCH_CSR_EENTRY);
49 csr_write64(eentry, LOONGARCH_CSR_MERRENTRY);
50 csr_write64(tlbrentry, LOONGARCH_CSR_TLBRENTRY);
52 csr_write64(saved_regs.pgd, LOONGARCH_CSR_PGDL);
53 csr_write64(saved_regs.kpgd, LOONGARCH_CSR_PGDH);
54 csr_write32(saved_regs.pwctl0, LOONGARCH_CSR_PWCTL0);
55 csr_write32(saved_regs.pwctl1, LOONGARCH_CSR_PWCTL1);
56 csr_write32(saved_regs.ecfg, LOONGARCH_CSR_ECFG);
57 csr_write32(saved_regs.euen, LOONGARCH_CSR_EUEN);
60 int loongarch_acpi_suspend(void)
65 loongarch_common_suspend();
67 /* processor specific suspend */
68 loongarch_suspend_enter();
70 loongarch_common_resume();