diff options
author | Olof Johansson <olofj@chromium.org> | 2011-07-13 15:10:03 -0700 |
---|---|---|
committer | Olof Johansson <olofj@chromium.org> | 2011-07-14 01:13:27 -0700 |
commit | 3a6e2f10b279b9b285ae4b832d2df92a05dacd52 (patch) | |
tree | d19f26534480af9d6368391283424c267f5ad28b | |
parent | a712e01ae783351e921031aab59ff1b7583d683d (diff) | |
download | vboot-3a6e2f10b279b9b285ae4b832d2df92a05dacd52.tar.gz |
arm: convert to new device tree usage
This also includes reading the nonvolatile storage from disk instead of
through the device-tree, since it's not updated there.
BUG=none
TEST=read and write a few crossystem variables
Change-Id: I6836a6eb0c92a0560dd393e694690a694bdb77a6
Reviewed-on: http://gerrit.chromium.org/gerrit/4078
Tested-by: Olof Johansson <olofj@chromium.org>
Reviewed-by: Rong Chang <rongchang@chromium.org>
-rw-r--r-- | host/arch/arm/lib/crossystem_arch.c | 216 |
1 files changed, 114 insertions, 102 deletions
diff --git a/host/arch/arm/lib/crossystem_arch.c b/host/arch/arm/lib/crossystem_arch.c index 55420169..581184e3 100644 --- a/host/arch/arm/lib/crossystem_arch.c +++ b/host/arch/arm/lib/crossystem_arch.c @@ -5,9 +5,11 @@ #include <stdio.h> #include <string.h> +#include <linux/fs.h> #include <sys/types.h> #include <sys/stat.h> #include <sys/param.h> +#include <sys/ioctl.h> #include <fcntl.h> #include <unistd.h> #include <netinet/in.h> @@ -21,11 +23,6 @@ #define FDT_BASE_PATH "/proc/device-tree/firmware/chromeos" /* Device for NVCTX write */ #define NVCTX_PATH "/dev/mmcblk%d" -/* BINF */ -#define BINF_MAINFW_ACT 1 -#define BINF_ECFW_ACT 2 -#define BINF_MAINFW_TYPE 3 -#define BINF_RECOVERY_REASON 4 /* Errors */ #define E_FAIL -1 #define E_FILEOP -2 @@ -70,6 +67,20 @@ static int ReadFdtValue(const char *property, int *value) { return 0; } +static int ReadFdtBool(const char *property) { + char filename[FNAME_SIZE]; + struct stat tmp; + int err; + + snprintf(filename, sizeof(filename), FDT_BASE_PATH "/%s", property); + err = stat(filename, &tmp); + + if (err == 0) + return 1; + + return 0; +} + static int ReadFdtInt(const char *property) { int value; if (ReadFdtValue(property, &value)) @@ -139,8 +150,8 @@ static int VbGetVarGpio(const char* name) { char prop_polarity[FNAME_SIZE]; char prop_gpio_num[FNAME_SIZE]; - snprintf(prop_polarity, sizeof(prop_polarity), "polarity_%s", name); - snprintf(prop_gpio_num, sizeof(prop_gpio_num), "gpio_port_%s", name); + snprintf(prop_polarity, sizeof(prop_polarity), "%s-polarity", name); + snprintf(prop_gpio_num, sizeof(prop_gpio_num), "%s-gpio", name); polarity = ReadFdtInt(prop_polarity); gpio_num = ReadFdtInt(prop_gpio_num); @@ -152,51 +163,92 @@ static int VbGetVarGpio(const char* name) { } int VbReadNvStorage(VbNvContext* vnc) { - void *nvcxt_cache; - size_t size; + int nvctx_fd = -1; + uint8_t sector[SECTOR_SIZE]; + int rv = -1; + char nvctx_path[FNAME_SIZE]; + int emmc_dev; + int lba = ReadFdtInt("nonvolatile-context-lba"); + int offset = ReadFdtInt("nonvolatile-context-offset"); + int size = ReadFdtInt("nonvolatile-context-size"); - if (ReadFdtBlock("nvcxt_cache", &nvcxt_cache, &size)) + emmc_dev = FindEmmcDev(); + if (emmc_dev < 0) return E_FAIL; + snprintf(nvctx_path, sizeof(nvctx_path), NVCTX_PATH, emmc_dev); - Memcpy(vnc->raw, nvcxt_cache, MIN(sizeof(vnc->raw), size)); - free(nvcxt_cache); - return 0; + if (size != sizeof(vnc->raw) || (size + offset > SECTOR_SIZE)) + return E_FAIL; + + nvctx_fd = open(nvctx_path, O_RDONLY); + if (nvctx_fd == -1) { + fprintf(stderr, "%s: failed to open %s\n", __FUNCTION__, nvctx_path); + goto out; + } + lseek(nvctx_fd, lba * SECTOR_SIZE, SEEK_SET); + + rv = read(nvctx_fd, sector, SECTOR_SIZE); + if (size <= 0) { + fprintf(stderr, "%s: failed to read nvctx from device %s\n", + __FUNCTION__, nvctx_path); + goto out; + } + Memcpy(vnc->raw, sector+offset, size); + rv = 0; + +out: + if (nvctx_fd > 0) + close(nvctx_fd); + + return rv; } int VbWriteNvStorage(VbNvContext* vnc) { int nvctx_fd = -1; uint8_t sector[SECTOR_SIZE]; int rv = -1; - ssize_t size; char nvctx_path[FNAME_SIZE]; int emmc_dev; + int lba = ReadFdtInt("nonvolatile-context-lba"); + int offset = ReadFdtInt("nonvolatile-context-offset"); + int size = ReadFdtInt("nonvolatile-context-size"); emmc_dev = FindEmmcDev(); if (emmc_dev < 0) return E_FAIL; snprintf(nvctx_path, sizeof(nvctx_path), NVCTX_PATH, emmc_dev); + if (size != sizeof(vnc->raw) || (size + offset > SECTOR_SIZE)) + return E_FAIL; + do { nvctx_fd = open(nvctx_path, O_RDWR); if (nvctx_fd == -1) { fprintf(stderr, "%s: failed to open %s\n", __FUNCTION__, nvctx_path); break; } - size = read(nvctx_fd, sector, SECTOR_SIZE); - if (size <= 0) { + lseek(nvctx_fd, lba * SECTOR_SIZE, SEEK_SET); + rv = read(nvctx_fd, sector, SECTOR_SIZE); + if (rv <= 0) { fprintf(stderr, "%s: failed to read nvctx from device %s\n", __FUNCTION__, nvctx_path); break; } - size = MIN(sizeof(vnc->raw), SECTOR_SIZE); - Memcpy(sector, vnc->raw, size); - lseek(nvctx_fd, 0, SEEK_SET); - size = write(nvctx_fd, sector, SECTOR_SIZE); - if (size <= 0) { + Memcpy(sector+offset, vnc->raw, size); + lseek(nvctx_fd, lba * SECTOR_SIZE, SEEK_SET); + rv = write(nvctx_fd, sector, SECTOR_SIZE); + if (rv <= 0) { fprintf(stderr, "%s: failed to write nvctx to device %s\n", __FUNCTION__, nvctx_path); break; } + /* Must flush buffer cache here to make sure it goes to disk */ + rv = ioctl(nvctx_fd, BLKFLSBUF, 0); + if (rv < 0) { + fprintf(stderr, "%s: failed to flush nvctx to device %s\n", + __FUNCTION__, nvctx_path); + break; + } rv = 0; } while (0); @@ -209,107 +261,67 @@ int VbWriteNvStorage(VbNvContext* vnc) { VbSharedDataHeader *VbSharedDataRead(void) { void *block = NULL; size_t size = 0; - if (ReadFdtBlock("vbshared_data", &block, &size)) + if (ReadFdtBlock("vboot-shared-data", &block, &size)) return NULL; return (VbSharedDataHeader *)block; } static int VbGetRecoveryReason(void) { - int value; - size_t size; - uint8_t *binf; - if (ReadFdtBlock("binf", (void **)&binf, &size)) - return -1; - value = binf[BINF_RECOVERY_REASON]; - free(binf); - return value; + return ReadFdtInt("recovery-reason"); } int VbGetArchPropertyInt(const char* name) { - if (!strcasecmp(name, "recovery_reason")) { + if (!strcasecmp(name, "recovery_reason")) return VbGetRecoveryReason(); - } else if (!strcasecmp(name, "fmap_base")) { - return ReadFdtInt("fmap_base"); - } else if (!strcasecmp(name, "devsw_boot")) { - return ReadFdtInt("developer_sw"); - } else if (!strcasecmp(name, "recoverysw_boot")) { - return ReadFdtInt("recovery_sw"); - } else if (!strcasecmp(name, "wpsw_boot")) { - return ReadFdtInt("write_protect_sw"); - } else if (!strcasecmp(name, "devsw_cur")) { - return VbGetVarGpio("developer_sw"); - } else if (!strcasecmp(name, "recoverysw_cur")) { - return VbGetVarGpio("recovery_sw"); - } else if (!strcasecmp(name, "wpsw_cur")) { - return VbGetVarGpio("write_protect_sw"); - } else if (!strcasecmp(name, "recoverysw_ec_boot")) { + else if (!strcasecmp(name, "fmap_base")) + return ReadFdtInt("fmap-offset"); + else if (!strcasecmp(name, "devsw_boot")) + return ReadFdtBool("boot-developer-switch"); + else if (!strcasecmp(name, "recoverysw_boot")) + return ReadFdtBool("boot-recovery-switch"); + else if (!strcasecmp(name, "wpsw_boot")) + return ReadFdtBool("boot-write-protect-switch"); + else if (!strcasecmp(name, "devsw_cur")) + return VbGetVarGpio("developer-switch"); + else if (!strcasecmp(name, "recoverysw_cur")) + return VbGetVarGpio("recovery-switch"); + else if (!strcasecmp(name, "wpsw_cur")) + return VbGetVarGpio("write-protect-switch"); + else if (!strcasecmp(name, "recoverysw_ec_boot")) return 0; - } else + else return -1; } const char* VbGetArchPropertyString(const char* name, char* dest, int size) { char *str = NULL; char *rv = NULL; - size_t block_size; - uint8_t *binf, mainfw_act, mainfw_type, ecfw_act; + char *prop = NULL; + + if (!strcasecmp(name,"arch")) + return StrCopy(dest, "arm", size); /* Properties from fdt */ - if (!strcasecmp(name, "ro_fwid")) { - str = ReadFdtString("frid"); - } else if (!strcasecmp(name, "hwid")) { - str = ReadFdtString("hwid"); - } else if (!strcasecmp(name, "fwid")) { - str = ReadFdtString("fwid"); - } + if (!strcasecmp(name, "ro_fwid")) + prop = "readonly-firmware-version"; + else if (!strcasecmp(name, "hwid")) + prop = "hardware-id"; + else if (!strcasecmp(name, "fwid")) + prop = "firmware-version"; + else if (!strcasecmp(name, "mainfw_act")) + prop = "active-firmware"; + else if (!strcasecmp(name, "mainfw_type")) + prop = "firmware-type"; + else if (!strcasecmp(name, "ecfw_act")) + prop = "active-ec-firmware"; + + if (prop) + str = ReadFdtString(prop); if (str) { - rv = StrCopy(dest, str, size); - free(str); - return rv; - } - - /* Other properties */ - if (ReadFdtBlock("binf", (void**)&binf, &block_size)) - return NULL; - mainfw_act = binf[BINF_MAINFW_ACT]; - ecfw_act = binf[BINF_ECFW_ACT]; - mainfw_type = binf[BINF_MAINFW_TYPE]; - free(binf); - - if (!strcasecmp(name,"arch")) { - return StrCopy(dest, "arm", size); - } else if (!strcasecmp(name,"mainfw_act")) { - switch(mainfw_act) { - case 0: - return StrCopy(dest, "recovery", size); - case 1: - return StrCopy(dest, "A", size); - case 2: - return StrCopy(dest, "B", size); - default: - return NULL; - } - } else if (!strcasecmp(name,"mainfw_type")) { - switch(mainfw_type) { - case BINF3_RECOVERY: - return StrCopy(dest, "recovery", size); - case BINF3_NORMAL: - return StrCopy(dest, "normal", size); - case BINF3_DEVELOPER: - return StrCopy(dest, "developer", size); - default: - return NULL; - } - } else if (!strcasecmp(name,"ecfw_act")) { - switch(ecfw_act) { - case 0: - return StrCopy(dest, "RO", size); - case 1: - return StrCopy(dest, "RW", size); - default: - return NULL; - } + rv = StrCopy(dest, str, size); + free(str); + return rv; } return NULL; } |