summaryrefslogtreecommitdiff
path: root/lib/chromeos/crossystem_data.c
diff options
context:
space:
mode:
Diffstat (limited to 'lib/chromeos/crossystem_data.c')
-rw-r--r--lib/chromeos/crossystem_data.c220
1 files changed, 88 insertions, 132 deletions
diff --git a/lib/chromeos/crossystem_data.c b/lib/chromeos/crossystem_data.c
index 60bcf6636f..d580b6a0ab 100644
--- a/lib/chromeos/crossystem_data.c
+++ b/lib/chromeos/crossystem_data.c
@@ -10,7 +10,6 @@
#include <common.h>
#include <fdt_decode.h>
-#include <gbb_header.h> /* for GoogleBinaryBlockHeader */
#include <libfdt.h>
#include <chromeos/common.h>
#include <chromeos/crossystem_data.h>
@@ -23,65 +22,46 @@
#define PREFIX "crossystem_data: "
-enum {
- CHSW_RECOVERY_BUTTON_PRESSED = 0x002,
- CHSW_DEVELOPER_MODE_ENABLED = 0x020,
- CHSW_WRITE_PROTECT_DISABLED = 0x200
-};
-
-int crossystem_data_init(crossystem_data_t *cdata, uint8_t *frid,
- uint32_t fmap_data, void *gbb_data, void *nvcxt_raw,
- cros_gpio_t *wpsw, cros_gpio_t *recsw, cros_gpio_t *devsw)
+int crossystem_data_init(crossystem_data_t *cdata,
+ cros_gpio_t *write_protect_switch,
+ cros_gpio_t *recovery_switch,
+ cros_gpio_t *developer_switch,
+ uint32_t fmap_offset,
+ uint8_t active_ec_firmware,
+ uint8_t *hardware_id,
+ uint8_t *readonly_firmware_id)
{
- GoogleBinaryBlockHeader *gbbh = (GoogleBinaryBlockHeader *)gbb_data;
-
VBDEBUG(PREFIX "crossystem data at %p\n", cdata);
memset(cdata, '\0', sizeof(*cdata));
cdata->total_size = sizeof(*cdata);
-
+ cdata->version = CROSSYSTEM_DATA_VERSION;
memcpy(cdata->signature, CROSSYSTEM_DATA_SIGNATURE,
sizeof(CROSSYSTEM_DATA_SIGNATURE));
- cdata->version = CROSSYSTEM_DATA_VERSION;
-
- if (recsw->value)
- cdata->chsw |= CHSW_RECOVERY_BUTTON_PRESSED;
- if (devsw->value)
- cdata->chsw |= CHSW_DEVELOPER_MODE_ENABLED;
- if (!wpsw->value)
- cdata->chsw |= CHSW_WRITE_PROTECT_DISABLED;
-
- memcpy(cdata->frid, frid, ID_LEN);
- memcpy(cdata->hwid, gbb_data + gbbh->hwid_offset, gbbh->hwid_size);
- /* boot reason; always 0 */
- cdata->binf[0] = 0;
- /* ec firmware type: 0=read-only, 1=rewritable; default to 0 */
- cdata->binf[2] = 0;
- /* recovery reason is default to VBNV_RECOVERY_NOT_REQUESTED */
- cdata->binf[4] = VBNV_RECOVERY_NOT_REQUESTED;
+ cdata->nonvolatile_context_lba = CHROMEOS_VBNVCONTEXT_LBA;
+ cdata->nonvolatile_context_offset = 0;
+ cdata->nonvolatile_context_size = VBNV_BLOCK_SIZE;
- cdata->gpio_port_write_protect_sw = wpsw->port;
- cdata->gpio_port_recovery_sw = recsw->port;
- cdata->gpio_port_developer_sw = devsw->port;
+ cdata->boot_write_protect_switch = write_protect_switch->value;
+ cdata->boot_recovery_switch = recovery_switch->value;
+ cdata->boot_developer_switch = developer_switch->value;
- cdata->polarity_write_protect_sw = wpsw->polarity;
- cdata->polarity_recovery_sw = recsw->polarity;
- cdata->polarity_developer_sw = devsw->polarity;
+ cdata->polarity_write_protect_switch = write_protect_switch->polarity;
+ cdata->polarity_recovery_switch = recovery_switch->polarity;
+ cdata->polarity_developer_switch = developer_switch->polarity;
- cdata->write_protect_sw = wpsw->value;
- cdata->recovery_sw = recsw->value;
- cdata->developer_sw = devsw->value;
+ cdata->gpio_port_write_protect_switch = write_protect_switch->port;
+ cdata->gpio_port_recovery_switch = recovery_switch->port;
+ cdata->gpio_port_developer_switch = developer_switch->port;
- cdata->vbnv[0] = 0;
- cdata->vbnv[1] = VBNV_BLOCK_SIZE;
+ cdata->fmap_offset = fmap_offset;
- cdata->fmap_base = fmap_data;
-
- cdata->nvcxt_lba = CHROMEOS_VBNVCONTEXT_LBA;
-
- memcpy(cdata->nvcxt_cache, nvcxt_raw, VBNV_BLOCK_SIZE);
+ cdata->active_ec_firmware = active_ec_firmware;
+ memcpy(cdata->hardware_id, hardware_id, sizeof(cdata->hardware_id));
+ memcpy(cdata->readonly_firmware_id, readonly_firmware_id,
+ sizeof(cdata->readonly_firmware_id));
return 0;
}
@@ -110,34 +90,12 @@ int crossystem_data_check_integrity(crossystem_data_t *cdata)
return 0;
}
-int crossystem_data_set_fwid(crossystem_data_t *cdata, uint8_t *fwid)
+int crossystem_data_set_main_firmware(crossystem_data_t *cdata,
+ uint8_t firmware_type,
+ uint8_t *firmware_id)
{
- memcpy(cdata->fwid, fwid, ID_LEN);
- return 0;
-}
-
-int crossystem_data_set_active_main_firmware(crossystem_data_t *cdata,
- int which, int type)
-{
- cdata->binf[1] = which;
- cdata->binf[3] = type;
- return 0;
-}
-
-int crossystem_data_get_active_main_firmware(crossystem_data_t *cdata)
-{
- return cdata->binf[1];
-}
-
-int crossystem_data_get_active_main_firmware_type(crossystem_data_t *cdata)
-{
- return cdata->binf[3];
-}
-
-int crossystem_data_set_recovery_reason(crossystem_data_t *cdata,
- uint32_t reason)
-{
- cdata->binf[4] = reason;
+ cdata->firmware_type = firmware_type;
+ memcpy(cdata->firmware_id, firmware_id, sizeof(cdata->firmware_id));
return 0;
}
@@ -197,59 +155,65 @@ int crossystem_data_embed_into_fdt(crossystem_data_t *cdata, void *fdt,
err |= set_scalar_prop("total-size", total_size);
err |= set_array_prop("signature", signature);
err |= set_scalar_prop("version", version);
- err |= set_scalar_prop("nonvolatile-context-lba", nvcxt_lba);
- err |= set_scalar_prop("nonvolatile-context-offset", vbnv[0]);
- err |= set_scalar_prop("nonvolatile-context-size", vbnv[1]);
- err |= set_array_prop("boot-nonvolatile-cache", nvcxt_cache);
-
- err |= set_bool_prop("boot-write-protect-switch", write_protect_sw);
- err |= set_bool_prop("boot-recovery-switch", recovery_sw);
- err |= set_bool_prop("boot-developer-switch", developer_sw);
- gpio_prop[1] = cpu_to_fdt32(cdata->gpio_port_write_protect_sw);
- gpio_prop[2] = cpu_to_fdt32(cdata->polarity_write_protect_sw);
+ err |= set_scalar_prop("nonvolatile-context-lba",
+ nonvolatile_context_lba);
+ err |= set_scalar_prop("nonvolatile-context-offset",
+ nonvolatile_context_offset);
+ err |= set_scalar_prop("nonvolatile-context-size",
+ nonvolatile_context_size);
+
+ err |= set_bool_prop("boot-write-protect-switch",
+ boot_write_protect_switch);
+ err |= set_bool_prop("boot-recovery-switch",
+ boot_recovery_switch);
+ err |= set_bool_prop("boot-developer-switch",
+ boot_developer_switch);
+
+ gpio_prop[1] = cpu_to_fdt32(cdata->gpio_port_write_protect_switch);
+ gpio_prop[2] = cpu_to_fdt32(cdata->polarity_write_protect_switch);
err |= fdt_setprop(fdt, nodeoffset, "write-protect-switch",
gpio_prop, sizeof(gpio_prop));
- gpio_prop[1] = cpu_to_fdt32(cdata->gpio_port_recovery_sw);
- gpio_prop[2] = cpu_to_fdt32(cdata->polarity_recovery_sw);
+ gpio_prop[1] = cpu_to_fdt32(cdata->gpio_port_recovery_switch);
+ gpio_prop[2] = cpu_to_fdt32(cdata->polarity_recovery_switch);
err |= fdt_setprop(fdt, nodeoffset, "recovery-switch",
gpio_prop, sizeof(gpio_prop));
- gpio_prop[1] = cpu_to_fdt32(cdata->gpio_port_developer_sw);
- gpio_prop[2] = cpu_to_fdt32(cdata->polarity_developer_sw);
+ gpio_prop[1] = cpu_to_fdt32(cdata->gpio_port_developer_switch);
+ gpio_prop[2] = cpu_to_fdt32(cdata->polarity_developer_switch);
err |= fdt_setprop(fdt, nodeoffset, "developer-switch",
gpio_prop, sizeof(gpio_prop));
- err |= set_scalar_prop("boot-reason", binf[0]);
+ err |= set_scalar_prop("fmap-offset", fmap_offset);
- switch (cdata->binf[2]) {
- case 0:
+ switch (cdata->active_ec_firmware) {
+ case ACTIVE_EC_FIRMWARE_RO:
err |= set_conststring_prop("active-ec-firmware", "RO");
break;
- case 1:
+ case ACTIVE_EC_FIRMWARE_RW:
err |= set_conststring_prop("active-ec-firmware", "RW");
break;
}
- switch (cdata->binf[3]) {
- case RECOVERY_TYPE:
+ switch (cdata->firmware_type) {
+ case FIRMWARE_TYPE_RECOVERY:
err |= set_conststring_prop("firmware-type", "recovery");
break;
- case NORMAL_TYPE:
+ case FIRMWARE_TYPE_NORMAL:
err |= set_conststring_prop("firmware-type", "normal");
break;
- case DEVELOPER_TYPE:
+ case FIRMWARE_TYPE_DEVELOPER:
err |= set_conststring_prop("firmware-type", "developer");
break;
}
- err |= set_scalar_prop("recovery-reason", binf[4]);
- err |= set_array_prop("hardware-id", hwid);
- err |= set_array_prop("firmware-version", fwid);
- err |= set_array_prop("readonly-firmware-version", frid);
- err |= set_scalar_prop("fmap-offset", fmap_base);
- err |= set_array_prop("vboot-shared-data", vbshared_data);
+ err |= set_array_prop("hardware-id", hardware_id);
+ err |= set_array_prop("firmware-version", firmware_id);
+ err |= set_array_prop("readonly-firmware-version",
+ readonly_firmware_id);
+
+ err |= set_array_prop("vboot-shared-data", vb_shared_data);
#undef set_scalar_prop
#undef set_array_prop
@@ -263,40 +227,32 @@ int crossystem_data_embed_into_fdt(crossystem_data_t *cdata, void *fdt,
void crossystem_data_dump(crossystem_data_t *cdata)
{
-#ifdef VBOOT_DEBUG /* decleare inside ifdef so that compiler doesn't complain */
- int i;
-
#define _p(format, field) \
- VBDEBUG("crossystem_data_dump: %-20s: " format "\n", #field, cdata->field)
+ VBDEBUG("crossystem_data_dump: %-30s: " format "\n", #field, cdata->field)
_p("%08x", total_size);
_p("\"%s\"", signature);
_p("%d", version);
- _p("%08llx", nvcxt_lba);
- _p("%08x", vbnv[0]);
- _p("%08x", vbnv[1]);
- VBDEBUG("crossystem_data_dump: nvcxt_cache: ");
- for (i = 0; i < VBNV_BLOCK_SIZE; i++)
- VBDEBUG("%02x", cdata->nvcxt_cache[i]);
- VBDEBUG("\n");
- _p("%d", write_protect_sw);
- _p("%d", recovery_sw);
- _p("%d", developer_sw);
- _p("%d", gpio_port_write_protect_sw);
- _p("%d", gpio_port_recovery_sw);
- _p("%d", gpio_port_developer_sw);
- _p("%d", polarity_write_protect_sw);
- _p("%d", polarity_recovery_sw);
- _p("%d", polarity_developer_sw);
- _p("%08x", binf[0]);
- _p("%08x", binf[1]);
- _p("%08x", binf[2]);
- _p("%08x", binf[3]);
- _p("%08x", binf[4]);
- _p("%08x", chsw);
- _p("\"%s\"", hwid);
- _p("\"%s\"", fwid);
- _p("\"%s\"", frid);
- _p("%08x", fmap_base);
+
+ _p("%08llx", nonvolatile_context_lba);
+ _p("%08x", nonvolatile_context_offset);
+ _p("%08x", nonvolatile_context_size);
+
+ _p("%d", boot_write_protect_switch);
+ _p("%d", boot_recovery_switch);
+ _p("%d", boot_developer_switch);
+ _p("%d", polarity_write_protect_switch);
+ _p("%d", polarity_recovery_switch);
+ _p("%d", polarity_developer_switch);
+ _p("%d", gpio_port_write_protect_switch);
+ _p("%d", gpio_port_recovery_switch);
+ _p("%d", gpio_port_developer_switch);
+
+ _p("%08x", fmap_offset);
+
+ _p("%d", active_ec_firmware);
+ _p("%d", firmware_type);
+ _p("\"%s\"", hardware_id);
+ _p("\"%s\"", readonly_firmware_id);
+ _p("\"%s\"", firmware_id);
#undef _p
-#endif
}