uboot/arch/x86/include/asm/acpi_s3.h
<<
>>
Prefs
   1/* SPDX-License-Identifier: GPL-2.0+ */
   2/*
   3 * Copyright (C) 2017, Bin Meng <bmeng.cn@gmail.com>
   4 */
   5
   6#ifndef __ASM_ACPI_S3_H__
   7#define __ASM_ACPI_S3_H__
   8
   9#define WAKEUP_BASE     0x600
  10
  11/* PM1_STATUS register */
  12#define WAK_STS         (1 << 15)
  13#define PCIEXPWAK_STS   (1 << 14)
  14#define RTC_STS         (1 << 10)
  15#define SLPBTN_STS      (1 << 9)
  16#define PWRBTN_STS      (1 << 8)
  17#define GBL_STS         (1 << 5)
  18#define BM_STS          (1 << 4)
  19#define TMR_STS         (1 << 0)
  20
  21/* PM1_CNT register */
  22#define SLP_EN          (1 << 13)
  23#define SLP_TYP_SHIFT   10
  24#define SLP_TYP         (7 << SLP_TYP_SHIFT)
  25#define SLP_TYP_S0      0
  26#define SLP_TYP_S1      1
  27#define SLP_TYP_S3      5
  28#define SLP_TYP_S4      6
  29#define SLP_TYP_S5      7
  30
  31/* Memory size reserved for S3 resume */
  32#define S3_RESERVE_SIZE 0x1000
  33
  34#ifndef __ASSEMBLY__
  35
  36extern char __wakeup[];
  37extern int __wakeup_size;
  38
  39enum acpi_sleep_state {
  40        ACPI_S0,
  41        ACPI_S1,
  42        ACPI_S2,
  43        ACPI_S3,
  44        ACPI_S4,
  45        ACPI_S5,
  46};
  47
  48/**
  49 * acpi_ss_string() - get ACPI-defined sleep state string
  50 *
  51 * @pm1_cnt:    ACPI-defined sleep state
  52 * @return:     a pointer to the sleep state string.
  53 */
  54static inline char *acpi_ss_string(enum acpi_sleep_state state)
  55{
  56        char *ss_string[] = { "S0", "S1", "S2", "S3", "S4", "S5"};
  57
  58        return ss_string[state];
  59}
  60
  61/**
  62 * acpi_sleep_from_pm1() - get ACPI-defined sleep state from PM1_CNT register
  63 *
  64 * @pm1_cnt:    PM1_CNT register value
  65 * @return:     ACPI-defined sleep state if given valid PM1_CNT register value,
  66 *              -EINVAL otherwise.
  67 */
  68static inline enum acpi_sleep_state acpi_sleep_from_pm1(u32 pm1_cnt)
  69{
  70        switch ((pm1_cnt & SLP_TYP) >> SLP_TYP_SHIFT) {
  71        case SLP_TYP_S0:
  72                return ACPI_S0;
  73        case SLP_TYP_S1:
  74                return ACPI_S1;
  75        case SLP_TYP_S3:
  76                return ACPI_S3;
  77        case SLP_TYP_S4:
  78                return ACPI_S4;
  79        case SLP_TYP_S5:
  80                return ACPI_S5;
  81        }
  82
  83        return -EINVAL;
  84}
  85
  86/**
  87 * chipset_prev_sleep_state() - Get chipset previous sleep state
  88 *
  89 * This returns chipset previous sleep state from ACPI registers.
  90 * Platform codes must supply this routine in order to support ACPI S3.
  91 *
  92 * @return ACPI_S0/S1/S2/S3/S4/S5.
  93 */
  94enum acpi_sleep_state chipset_prev_sleep_state(void);
  95
  96/**
  97 * chipset_clear_sleep_state() - Clear chipset sleep state
  98 *
  99 * This clears chipset sleep state in ACPI registers.
 100 * Platform codes must supply this routine in order to support ACPI S3.
 101 */
 102void chipset_clear_sleep_state(void);
 103
 104struct acpi_fadt;
 105/**
 106 * acpi_resume() - Do ACPI S3 resume
 107 *
 108 * This calls U-Boot wake up assembly stub and jumps to OS's wake up vector.
 109 *
 110 * @fadt:       FADT table pointer in the ACPI table
 111 * @return:     Never returns
 112 */
 113void acpi_resume(struct acpi_fadt *fadt);
 114
 115/**
 116 * acpi_s3_reserve() - Reserve memory for ACPI S3 resume
 117 *
 118 * This copies memory where real mode interrupt handler stubs reside to the
 119 * reserved place on the stack.
 120 *
 121 * This routine should be called by reserve_arch() before U-Boot is relocated
 122 * when ACPI S3 resume is enabled.
 123 *
 124 * @return:     0 always
 125 */
 126int acpi_s3_reserve(void);
 127
 128#endif /* __ASSEMBLY__ */
 129
 130#endif /* __ASM_ACPI_S3_H__ */
 131