File Index
Files and directories
Sign in
FILE

suspend.c

File preview with syntax highlighting.

linux-6.19.14/arch/loongarch/power/suspend.c C
 1// SPDX-License-Identifier: GPL-2.0
 2/*
 3 * loongson-specific suspend support
 4 *
 5 * Author: Huacai Chen <chenhuacai@loongson.cn>
 6 * Copyright (C) 2020-2022 Loongson Technology Corporation Limited
 7 */
 8#include <linux/acpi.h>
 9#include <linux/pm.h>
10#include <linux/suspend.h>
11
12#include <asm/loongarch.h>
13#include <asm/loongson.h>
14#include <asm/setup.h>
15#include <asm/time.h>
16#include <asm/tlbflush.h>
17
18u64 loongarch_suspend_addr;
19
20struct saved_registers {
21	u32 ecfg;
22	u32 euen;
23	u32 pwctl0;
24	u32 pwctl1;
25	unsigned long pgd;
26	unsigned long kpgd;
27	unsigned long pcpu_base;
28};
29static struct saved_registers saved_regs;
30
31void loongarch_common_suspend(void)
32{
33	save_counter();
34	saved_regs.pgd = csr_read(LOONGARCH_CSR_PGDL);
35	saved_regs.kpgd = csr_read(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_read(PERCPU_BASE_KS);
41
42	loongarch_suspend_addr = loongson_sysconf.suspend_addr;
43}
44
45void loongarch_common_resume(void)
46{
47	sync_counter();
48	local_flush_tlb_all();
49	csr_write(eentry, LOONGARCH_CSR_EENTRY);
50	csr_write(eentry, LOONGARCH_CSR_MERRENTRY);
51	csr_write(tlbrentry, LOONGARCH_CSR_TLBRENTRY);
52
53	csr_write(saved_regs.pgd, LOONGARCH_CSR_PGDL);
54	csr_write(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_write(saved_regs.pcpu_base, PERCPU_BASE_KS);
60}
61
62int loongarch_acpi_suspend(void)
63{
64	enable_gpe_wakeup();
65	enable_pci_wakeup();
66
67	loongarch_common_suspend();
68
69	/* processor specific suspend */
70	loongarch_suspend_enter();
71
72	loongarch_common_resume();
73
74	return 0;
75}
~/ Read-only file preview.