14372c111SBin Meng /* 24372c111SBin Meng * Copyright (C) 2017, Bin Meng <bmeng.cn@gmail.com> 34372c111SBin Meng * 44372c111SBin Meng * SPDX-License-Identifier: GPL-2.0+ 54372c111SBin Meng */ 64372c111SBin Meng 74372c111SBin Meng #ifndef __ASM_ACPI_S3_H__ 84372c111SBin Meng #define __ASM_ACPI_S3_H__ 94372c111SBin Meng 102b2d666fSBin Meng #define WAKEUP_BASE 0x600 112b2d666fSBin Meng 124372c111SBin Meng /* PM1_STATUS register */ 134372c111SBin Meng #define WAK_STS (1 << 15) 144372c111SBin Meng #define PCIEXPWAK_STS (1 << 14) 154372c111SBin Meng #define RTC_STS (1 << 10) 164372c111SBin Meng #define SLPBTN_STS (1 << 9) 174372c111SBin Meng #define PWRBTN_STS (1 << 8) 184372c111SBin Meng #define GBL_STS (1 << 5) 194372c111SBin Meng #define BM_STS (1 << 4) 204372c111SBin Meng #define TMR_STS (1 << 0) 214372c111SBin Meng 224372c111SBin Meng /* PM1_CNT register */ 234372c111SBin Meng #define SLP_EN (1 << 13) 244372c111SBin Meng #define SLP_TYP_SHIFT 10 254372c111SBin Meng #define SLP_TYP (7 << SLP_TYP_SHIFT) 264372c111SBin Meng #define SLP_TYP_S0 0 274372c111SBin Meng #define SLP_TYP_S1 1 284372c111SBin Meng #define SLP_TYP_S3 5 294372c111SBin Meng #define SLP_TYP_S4 6 304372c111SBin Meng #define SLP_TYP_S5 7 314372c111SBin Meng 32*5ae5aa93SBin Meng /* Memory size reserved for S3 resume */ 33*5ae5aa93SBin Meng #define S3_RESERVE_SIZE 0x1000 34*5ae5aa93SBin Meng 352b2d666fSBin Meng #ifndef __ASSEMBLY__ 362b2d666fSBin Meng 372b2d666fSBin Meng extern char __wakeup[]; 382b2d666fSBin Meng extern int __wakeup_size; 392b2d666fSBin Meng 404372c111SBin Meng enum acpi_sleep_state { 414372c111SBin Meng ACPI_S0, 424372c111SBin Meng ACPI_S1, 434372c111SBin Meng ACPI_S2, 444372c111SBin Meng ACPI_S3, 454372c111SBin Meng ACPI_S4, 464372c111SBin Meng ACPI_S5, 474372c111SBin Meng }; 484372c111SBin Meng 494372c111SBin Meng /** 50b727961bSBin Meng * acpi_ss_string() - get ACPI-defined sleep state string 51b727961bSBin Meng * 52b727961bSBin Meng * @pm1_cnt: ACPI-defined sleep state 53b727961bSBin Meng * @return: a pointer to the sleep state string. 54b727961bSBin Meng */ 55b727961bSBin Meng static inline char *acpi_ss_string(enum acpi_sleep_state state) 56b727961bSBin Meng { 57b727961bSBin Meng char *ss_string[] = { "S0", "S1", "S2", "S3", "S4", "S5"}; 58b727961bSBin Meng 59b727961bSBin Meng return ss_string[state]; 60b727961bSBin Meng } 61b727961bSBin Meng 62b727961bSBin Meng /** 634372c111SBin Meng * acpi_sleep_from_pm1() - get ACPI-defined sleep state from PM1_CNT register 644372c111SBin Meng * 654372c111SBin Meng * @pm1_cnt: PM1_CNT register value 664372c111SBin Meng * @return: ACPI-defined sleep state if given valid PM1_CNT register value, 674372c111SBin Meng * -EINVAL otherwise. 684372c111SBin Meng */ 694372c111SBin Meng static inline enum acpi_sleep_state acpi_sleep_from_pm1(u32 pm1_cnt) 704372c111SBin Meng { 714372c111SBin Meng switch ((pm1_cnt & SLP_TYP) >> SLP_TYP_SHIFT) { 724372c111SBin Meng case SLP_TYP_S0: 734372c111SBin Meng return ACPI_S0; 744372c111SBin Meng case SLP_TYP_S1: 754372c111SBin Meng return ACPI_S1; 764372c111SBin Meng case SLP_TYP_S3: 774372c111SBin Meng return ACPI_S3; 784372c111SBin Meng case SLP_TYP_S4: 794372c111SBin Meng return ACPI_S4; 804372c111SBin Meng case SLP_TYP_S5: 814372c111SBin Meng return ACPI_S5; 824372c111SBin Meng } 834372c111SBin Meng 844372c111SBin Meng return -EINVAL; 854372c111SBin Meng } 864372c111SBin Meng 871206723bSBin Meng /** 881206723bSBin Meng * chipset_prev_sleep_state() - Get chipset previous sleep state 891206723bSBin Meng * 901206723bSBin Meng * This returns chipset previous sleep state from ACPI registers. 911206723bSBin Meng * Platform codes must supply this routine in order to support ACPI S3. 921206723bSBin Meng * 931206723bSBin Meng * @return ACPI_S0/S1/S2/S3/S4/S5. 941206723bSBin Meng */ 951206723bSBin Meng enum acpi_sleep_state chipset_prev_sleep_state(void); 961206723bSBin Meng 971206723bSBin Meng /** 981206723bSBin Meng * chipset_clear_sleep_state() - Clear chipset sleep state 991206723bSBin Meng * 1001206723bSBin Meng * This clears chipset sleep state in ACPI registers. 1011206723bSBin Meng * Platform codes must supply this routine in order to support ACPI S3. 1021206723bSBin Meng */ 1031206723bSBin Meng void chipset_clear_sleep_state(void); 1041206723bSBin Meng 1050f4e2588SBin Meng struct acpi_fadt; 1063a34cae0SBin Meng /** 1073a34cae0SBin Meng * acpi_resume() - Do ACPI S3 resume 1083a34cae0SBin Meng * 1093a34cae0SBin Meng * This calls U-Boot wake up assembly stub and jumps to OS's wake up vector. 1103a34cae0SBin Meng * 1110f4e2588SBin Meng * @fadt: FADT table pointer in the ACPI table 1123a34cae0SBin Meng * @return: Never returns 1133a34cae0SBin Meng */ 1140f4e2588SBin Meng void acpi_resume(struct acpi_fadt *fadt); 1153a34cae0SBin Meng 116*5ae5aa93SBin Meng /** 117*5ae5aa93SBin Meng * acpi_s3_reserve() - Reserve memory for ACPI S3 resume 118*5ae5aa93SBin Meng * 119*5ae5aa93SBin Meng * This copies memory where real mode interrupt handler stubs reside to the 120*5ae5aa93SBin Meng * reserved place on the stack. 121*5ae5aa93SBin Meng * 122*5ae5aa93SBin Meng * This routine should be called by reserve_arch() before U-Boot is relocated 123*5ae5aa93SBin Meng * when ACPI S3 resume is enabled. 124*5ae5aa93SBin Meng * 125*5ae5aa93SBin Meng * @return: 0 always 126*5ae5aa93SBin Meng */ 127*5ae5aa93SBin Meng int acpi_s3_reserve(void); 128*5ae5aa93SBin Meng 1292b2d666fSBin Meng #endif /* __ASSEMBLY__ */ 1302b2d666fSBin Meng 1314372c111SBin Meng #endif /* __ASM_ACPI_S3_H__ */ 132