diff options
author | Shawn Nematbakhsh <shawnn@chromium.org> | 2015-03-23 18:27:22 -0700 |
---|---|---|
committer | ChromeOS Commit Bot <chromeos-commit-bot@chromium.org> | 2015-03-25 20:09:52 +0000 |
commit | 6ee7b1e34eecd585074b4aae0347ed12f632ead0 (patch) | |
tree | ace73f958495a83b836505941318325fa71c71e7 /chip | |
parent | 0f18989ef58a77800c1b393cf8223455f793d543 (diff) | |
download | chrome-ec-6ee7b1e34eecd585074b4aae0347ed12f632ead0.tar.gz |
ACPI: Support accessing memmap data over ACPI CMD / DATA portsstabilize-6915.B
Some platforms are unable to access the 900h-9ffh region over LPC and
must instead access memmap data through the ACPI CMD / DATA ports. To
avoid racing with data updates, disallow changes to multi-byte memmap
data while in burst mode.
Linux currently enables burst mode when accessing multi-byte data and
disables it immediately afterward, though the ACPI spec defines burst mode
in a more general way.
BUG=chrome-os-partner:38224
TEST=Manual on Samus. Undefine LPC_MEMMAP and modify asl to move memmap
data to ERAM at offset 0x20. Verify system boots cleanly and battery
status is updated immediately on plug / unplug.
BRANCH=None
Change-Id: Ib848bdb491fdfece96ad0cee7a44ba85b4a1a50b
Signed-off-by: Shawn Nematbakhsh <shawnn@chromium.org>
Reviewed-on: https://chromium-review.googlesource.com/262072
Reviewed-by: Randall Spangler <rspangler@chromium.org>
Reviewed-by: Duncan Laurie <dlaurie@chromium.org>
Diffstat (limited to 'chip')
-rw-r--r-- | chip/lm4/lpc.c | 18 | ||||
-rw-r--r-- | chip/lm4/registers.h | 2 | ||||
-rw-r--r-- | chip/mec1322/lpc.c | 10 | ||||
-rw-r--r-- | chip/npcx/lpc.c | 10 |
4 files changed, 39 insertions, 1 deletions
diff --git a/chip/lm4/lpc.c b/chip/lm4/lpc.c index 0f3e9b8b1c..149145f3c0 100644 --- a/chip/lm4/lpc.c +++ b/chip/lm4/lpc.c @@ -432,6 +432,24 @@ uint32_t lpc_get_host_event_mask(enum lpc_host_event_type type) return event_mask[type]; } +void lpc_set_acpi_status_mask(uint8_t mask) +{ + uint32_t set_mask = 0; + if (mask & EC_LPC_STATUS_BURST_MODE) + set_mask |= LM4_LPC_ST_BURST; + + LM4_LPC_ST(LPC_CH_ACPI) |= set_mask; +} + +void lpc_clear_acpi_status_mask(uint8_t mask) +{ + uint32_t clear_mask = 0; + if (mask & EC_LPC_STATUS_BURST_MODE) + clear_mask |= LM4_LPC_ST_BURST; + + LM4_LPC_ST(LPC_CH_ACPI) &= ~clear_mask; +} + int lpc_get_pltrst_asserted(void) { return (LM4_LPC_LPCSTS & (1<<10)) ? 1 : 0; diff --git a/chip/lm4/registers.h b/chip/lm4/registers.h index f6e503b208..15c91d1ca3 100644 --- a/chip/lm4/registers.h +++ b/chip/lm4/registers.h @@ -118,7 +118,7 @@ static inline int lm4_lpc_addr(int ch, int offset) #define LM4_LPC_ST_TOH (1 << 0) /* TO Host bit */ #define LM4_LPC_ST_FRMH (1 << 1) /* FRoM Host bit */ #define LM4_LPC_ST_CMD (1 << 3) /* Last from-host byte was command */ -#define LM4_LPC_ST_PRESENT (1 << 8) +#define LM4_LPC_ST_BURST (1 << 8) #define LM4_LPC_ST_SCI (1 << 9) #define LM4_LPC_ST_SMI (1 << 10) #define LM4_LPC_ST_BUSY (1 << 12) diff --git a/chip/mec1322/lpc.c b/chip/mec1322/lpc.c index 07e75f2a09..cd49e4d357 100644 --- a/chip/mec1322/lpc.c +++ b/chip/mec1322/lpc.c @@ -449,6 +449,16 @@ uint32_t lpc_get_host_event_mask(enum lpc_host_event_type type) return event_mask[type]; } +void lpc_set_acpi_status_mask(uint8_t mask) +{ + MEC1322_ACPI_EC_STATUS(0) |= mask; +} + +void lpc_clear_acpi_status_mask(uint8_t mask) +{ + MEC1322_ACPI_EC_STATUS(0) &= ~mask; +} + int lpc_get_pltrst_asserted(void) { return (MEC1322_LPC_BUS_MONITOR & (1<<1)) ? 1 : 0; diff --git a/chip/npcx/lpc.c b/chip/npcx/lpc.c index 1622905299..79e0675ede 100644 --- a/chip/npcx/lpc.c +++ b/chip/npcx/lpc.c @@ -348,6 +348,16 @@ uint32_t lpc_get_host_event_mask(enum lpc_host_event_type type) return event_mask[type]; } +void lpc_set_acpi_status_mask(uint8_t mask) +{ + /* TODO (crbug.com/p/38224): Implement */ +} + +void lpc_clear_acpi_status_mask(uint8_t mask) +{ + /* TODO (crbug.com/p/38224): Implement */ +} + int lpc_get_pltrst_asserted(void) { /* Read PLTRST status*/ |