diff options
author | Che-Liang Chiou <clchiou@chromium.org> | 2012-07-02 19:17:53 +0800 |
---|---|---|
committer | Gerrit <chrome-bot@google.com> | 2012-07-02 23:10:04 -0700 |
commit | 7ec59576f6f61effdc35482c8cfd4aa32b643b1a (patch) | |
tree | 1b01833a1cc9ffac3891d79ae1b01debc95d9487 | |
parent | d808a43d357371451c8ca4b4ad1a38f2251155c4 (diff) | |
download | vboot-7ec59576f6f61effdc35482c8cfd4aa32b643b1a.tar.gz |
Read virtual switch current values correctly
As dev switch and recovery switch may be virtual, crossystem has to
distinguish virtual switches from physical ones.
Since to a virtual switch, its current value should always equal to its
boot value, return a boot value when asked for a current value.
Signed-off-by: Che-Liang Chiou <clchiou@chromium.org>
BUG=chrome-os-partner:10007
TEST=crossystem devsw_cur|recoverysw_cur show correct value on Snow
Change-Id: Ia73147ecd5528a3cc5276aff02a632ce4f52ea8b
Reviewed-on: https://gerrit.chromium.org/gerrit/26568
Commit-Ready: Che-Liang Chiou <clchiou@chromium.org>
Tested-by: Che-Liang Chiou <clchiou@chromium.org>
Reviewed-by: Tom Wai-Hong Tam <waihong@chromium.org>
-rw-r--r-- | host/arch/arm/lib/crossystem_arch.c | 26 |
1 files changed, 21 insertions, 5 deletions
diff --git a/host/arch/arm/lib/crossystem_arch.c b/host/arch/arm/lib/crossystem_arch.c index 7895badb..c3afccf7 100644 --- a/host/arch/arm/lib/crossystem_arch.c +++ b/host/arch/arm/lib/crossystem_arch.c @@ -213,14 +213,17 @@ static int VbGetVarGpio(const char* name) { ret = ReadFdtBlock(name, &pp, &proplen); if (ret || !pp || proplen != 12) { - ret = 2; + ret = -1; goto out; } prop = pp; gpio_num = ntohl(prop[1]); polarity = ntohl(prop[2]); - ret = VbGetGpioStatus(gpio_num) ^ polarity ^ 1; + if (gpio_num) + ret = VbGetGpioStatus(gpio_num) ^ polarity ^ 1; + else + ret = -1; out: if (pp) free(pp); @@ -340,6 +343,8 @@ VbSharedDataHeader *VbSharedDataRead(void) { } int VbGetArchPropertyInt(const char* name) { + int value; + if (!strcasecmp(name, "fmap_base")) return ReadFdtInt("fmap-offset"); else if (!strcasecmp(name, "devsw_boot")) @@ -349,15 +354,26 @@ int VbGetArchPropertyInt(const char* name) { else if (!strcasecmp(name, "wpsw_boot")) return ReadFdtBool("boot-write-protect-switch"); else if (!strcasecmp(name, "devsw_cur")) - return VbGetVarGpio("developer-switch"); + value = VbGetVarGpio("developer-switch"); else if (!strcasecmp(name, "recoverysw_cur")) - return VbGetVarGpio("recovery-switch"); + value = VbGetVarGpio("recovery-switch"); else if (!strcasecmp(name, "wpsw_cur")) - return VbGetVarGpio("write-protect-switch"); + return VbGetVarGpio("write-protect-switch"); else if (!strcasecmp(name, "recoverysw_ec_boot")) return 0; else return -1; + + if (value < 0) { + if (!strcasecmp(name, "devsw_cur")) + return ReadFdtBool("boot-developer-switch"); + else if (!strcasecmp(name, "recoverysw_cur")) + return ReadFdtBool("boot-recovery-switch"); + else + return -1; + } else { + return value; + } } const char* VbGetArchPropertyString(const char* name, char* dest, int size) { |