diff options
-rw-r--r-- | board/cr50/board.c | 20 | ||||
-rw-r--r-- | board/cr50/build.mk | 1 | ||||
-rw-r--r-- | board/cr50/factory_mode.c | 77 | ||||
-rw-r--r-- | common/ccd_config.c | 3 |
4 files changed, 79 insertions, 22 deletions
diff --git a/board/cr50/board.c b/board/cr50/board.c index ab976dc29b..ffd7b818cc 100644 --- a/board/cr50/board.c +++ b/board/cr50/board.c @@ -1273,26 +1273,6 @@ void i2cs_set_pinmux(void) GWRITE_FIELD(PINMUX, EXITEN0, DIOA1, 1); /* enable powerdown exit */ } -/** - * Return non-zero if this is the first boot of a board in the factory. - * - * This is used to determine whether the default CCD configuration will be RMA - * (things are unlocked for factory) or normal (things locked down because not - * in factory). - * - * Suggested checks: - * - If the board ID exists, this is not the first boot - * - If the TPM is not blank, this is not the first boot - */ -int board_is_first_factory_boot(void) -{ - /* - * TODO(rspangler): Add checks for factory boot. For now, always - * return 0 so we're safely locked by default. - */ - return 0; -} - /* Determine key type based on the key ID. */ static const char *key_type(const struct SignedHeader *h) { diff --git a/board/cr50/build.mk b/board/cr50/build.mk index e6c3725578..58254ed8aa 100644 --- a/board/cr50/build.mk +++ b/board/cr50/build.mk @@ -35,6 +35,7 @@ board-y += ec_state.o board-y += power_button.o board-y += servo_state.o board-y += ap_uart_state.o +board-y += factory_mode.o board-${CONFIG_RDD} += rdd.o board-${CONFIG_USB_SPI} += usb_spi.o board-${CONFIG_USB_I2C} += usb_i2c.o diff --git a/board/cr50/factory_mode.c b/board/cr50/factory_mode.c new file mode 100644 index 0000000000..c8a5dd2cdd --- /dev/null +++ b/board/cr50/factory_mode.c @@ -0,0 +1,77 @@ +/* Copyright 2018 The Chromium OS Authors. All rights reserved. + * Use of this source code is governed by a BSD-style license that can be + * found in the LICENSE file. + */ + +#include "board_id.h" +#include "console.h" +#include "system.h" + +#define CPRINTS(format, args...) cprints(CC_CCD, format, ## args) +#define CPRINTF(format, args...) cprintf(CC_CCD, format, ## args) + + +static int board_id_is_erased(void) +{ + struct board_id id; + /* + * If we can't read the board id for some reason, return 0 just to be + * safe + */ + if (read_board_id(&id) != EC_SUCCESS) { + CPRINTS("%s: BID read error", __func__); + return 0; + } + + /* If all of the fields are all 0xffffffff, the board id is not set */ + if (~(id.type & id.type_inv & id.flags) == 0) { + CPRINTS("BID erased"); + return 1; + } + return 0; +} + +static int inactive_image_is_guc_image(void) +{ + enum system_image_copy_t inactive_copy; + const struct SignedHeader *other; + + if (system_get_image_copy() == SYSTEM_IMAGE_RW_A) + inactive_copy = SYSTEM_IMAGE_RW_B; + else + inactive_copy = SYSTEM_IMAGE_RW_A; + other = (struct SignedHeader *) get_program_memory_addr( + inactive_copy); + /* + * Chips from GUC are manufactured with 0.0.13 or 0.0.22. Compare the + * versions to determine if the inactive image is a GUC image. + */ + if (other->epoch_ == 0 && other->major_ == 0 && + ((other->minor_ == 13) || (other->minor_ == 22))) { + CPRINTS("GUC in inactive RW"); + return 1; + } + /* + * TODO(mruthven): Return true if factory image field of header is + * set + */ + return 0; +} + +/** + * Return non-zero if this is the first boot of a board in the factory. + * + * This is used to determine whether the default CCD configuration will be RMA + * (things are unlocked for factory) or normal (things locked down because not + * in factory). + * + * checks: + * - If the system recovered from reboot not deep sleep resume. + * - If the board ID exists, this is not the first boot + * - If the inactive image is not a GUC image, then we've left the factory + */ +int board_is_first_factory_boot(void) +{ + return (!(system_get_reset_flags() & RESET_FLAG_HIBERNATE) && + inactive_image_is_guc_image() && board_id_is_erased()); +} diff --git a/common/ccd_config.c b/common/ccd_config.c index 28f393d87d..5866da0b8f 100644 --- a/common/ccd_config.c +++ b/common/ccd_config.c @@ -340,13 +340,12 @@ static void ccd_load_config(void) if (board_is_first_factory_boot()) { /* Give factory RMA access */ CPRINTS("CCD using factory config"); - ccd_reset_config(CCD_RESET_TEST_LAB | CCD_RESET_RMA); + ccd_reset_config(CCD_RESET_RMA); } else { /* Somehow we lost our config; normal defaults */ CPRINTS("CCD using default config"); ccd_reset_config(CCD_RESET_TEST_LAB); } - ccd_config_loaded = 1; return; } |