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
{
29 static struct saved_registers saved_regs
;
31 void loongarch_common_suspend(void)
34 saved_regs
.pgd
= csr_read64(LOONGARCH_CSR_PGDL
);
35 saved_regs
.kpgd
= csr_read64(LOONGARCH_CSR_PGDH
);
36 saved_regs
.pwctl0
= csr_read32(LOONGARCH_CSR_PWCTL0
);
37 saved_regs
.pwctl1
= csr_read32(LOONGARCH_CSR_PWCTL1
);
38 saved_regs
.ecfg
= csr_read32(LOONGARCH_CSR_ECFG
);
39 saved_regs
.euen
= csr_read32(LOONGARCH_CSR_EUEN
);
40 saved_regs
.pcpu_base
= csr_read64(PERCPU_BASE_KS
);
42 loongarch_suspend_addr
= loongson_sysconf
.suspend_addr
;
45 void loongarch_common_resume(void)
48 local_flush_tlb_all();
49 csr_write64(eentry
, LOONGARCH_CSR_EENTRY
);
50 csr_write64(eentry
, LOONGARCH_CSR_MERRENTRY
);
51 csr_write64(tlbrentry
, LOONGARCH_CSR_TLBRENTRY
);
53 csr_write64(saved_regs
.pgd
, LOONGARCH_CSR_PGDL
);
54 csr_write64(saved_regs
.kpgd
, LOONGARCH_CSR_PGDH
);
55 csr_write32(saved_regs
.pwctl0
, LOONGARCH_CSR_PWCTL0
);
56 csr_write32(saved_regs
.pwctl1
, LOONGARCH_CSR_PWCTL1
);
57 csr_write32(saved_regs
.ecfg
, LOONGARCH_CSR_ECFG
);
58 csr_write32(saved_regs
.euen
, LOONGARCH_CSR_EUEN
);
59 csr_write64(saved_regs
.pcpu_base
, PERCPU_BASE_KS
);
62 int loongarch_acpi_suspend(void)
67 loongarch_common_suspend();
69 /* processor specific suspend */
70 loongarch_suspend_enter();
72 loongarch_common_resume();