diff options
author | Duncan Laurie <dlaurie@chromium.org> | 2016-09-19 12:05:49 -0700 |
---|---|---|
committer | Duncan Laurie <dlaurie@chromium.org> | 2016-09-19 19:03:34 -0700 |
commit | 3d43a7c111d00be246160a04023fe438ae0cac57 (patch) | |
tree | ae44732afcf2f6246200bc630417ba99ecb766cb /src | |
parent | 5e3dad66227bba4be9365ee76d00231bb5577b56 (diff) | |
download | coreboot-3d43a7c111d00be246160a04023fe438ae0cac57.tar.xz |
soc/intel/apollolake: Add function to read and clear GPE status
Implement the generic acpi_get_gpe() function to read and clear
the GPE status for a specific GPE.
Tested by watching GPE status in a loop while generating interrupts
manually from the EC console.
BUG=chrome-os-partner:53336
Change-Id: Id885e98d48c2133a868da19eca3360e2dfb82e84
Signed-off-by: Duncan Laurie <dlaurie@chromium.org>
Diffstat (limited to 'src')
-rw-r--r-- | src/soc/intel/apollolake/pmutil.c | 21 |
1 files changed, 21 insertions, 0 deletions
diff --git a/src/soc/intel/apollolake/pmutil.c b/src/soc/intel/apollolake/pmutil.c index 2aef18c8e6..56bb33dc40 100644 --- a/src/soc/intel/apollolake/pmutil.c +++ b/src/soc/intel/apollolake/pmutil.c @@ -17,6 +17,7 @@ #define __SIMPLE_DEVICE__ +#include <arch/acpi.h> #include <arch/io.h> #include <console/console.h> #include <cbmem.h> @@ -301,6 +302,26 @@ uint32_t clear_gpe_status(void) return print_gpe_sts(reset_gpe_status()); } +/* Read and clear GPE status (defined in arch/acpi.h) */ +int acpi_get_gpe(int gpe) +{ + int bank; + uint32_t mask, sts; + + if (gpe < 0 || gpe > GPE0_DW3_31) + return -1; + + bank = gpe / 32; + mask = 1 << (gpe % 32); + + sts = inl(ACPI_PMIO_BASE + GPE0_STS(bank)); + if (sts & mask) { + outl(mask, ACPI_PMIO_BASE + GPE0_STS(bank)); + return 1; + } + return 0; +} + void clear_pmc_status(void) { uint32_t prsts; |