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 /common/als.c | |
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 'common/als.c')
-rw-r--r-- | common/als.c | 9 |
1 files changed, 7 insertions, 2 deletions
diff --git a/common/als.c b/common/als.c index e67eb03777..0ae06566aa 100644 --- a/common/als.c +++ b/common/als.c @@ -25,10 +25,15 @@ void als_task(void) { int i, val; uint16_t *mapped = (uint16_t *)host_get_memmap(EC_MEMMAP_ALS); + uint16_t als_data; while (1) { - for (i = 0; i < EC_ALS_ENTRIES && i < ALS_COUNT; i++) - mapped[i] = als_read(i, &val) == EC_SUCCESS ? val : 0; + for (i = 0; i < EC_ALS_ENTRIES && i < ALS_COUNT; i++) { + als_data = als_read(i, &val) == EC_SUCCESS ? val : 0; + host_lock_memmap(); + mapped[i] = als_data; + host_unlock_memmap(); + } task_wait_event(SECOND); } |