summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorChe-Liang Chiou <clchiou@chromium.org>2012-07-02 19:17:53 +0800
committerGerrit <chrome-bot@google.com>2012-07-02 23:10:04 -0700
commit7ec59576f6f61effdc35482c8cfd4aa32b643b1a (patch)
tree1b01833a1cc9ffac3891d79ae1b01debc95d9487
parentd808a43d357371451c8ca4b4ad1a38f2251155c4 (diff)
downloadvboot-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.c26
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) {