summaryrefslogtreecommitdiff
path: root/board/cr50/wp.c
diff options
context:
space:
mode:
Diffstat (limited to 'board/cr50/wp.c')
-rw-r--r--board/cr50/wp.c47
1 files changed, 36 insertions, 11 deletions
diff --git a/board/cr50/wp.c b/board/cr50/wp.c
index 0f9a650524..fe0dc2da29 100644
--- a/board/cr50/wp.c
+++ b/board/cr50/wp.c
@@ -23,6 +23,11 @@
#define CPRINTS(format, args...) cprints(CC_RBOX, format, ## args)
#define CPRINTF(format, args...) cprintf(CC_RBOX, format, ## args)
+enum fwmp_controlled_action_t {
+ CCD_UNLOCK,
+ BOOT_POLICY_UPDATE,
+};
+
uint8_t bp_connect;
uint8_t bp_forced;
/**
@@ -386,6 +391,7 @@ int board_wipe_tpm(int reset_required)
*/
#define FWMP_HASH_SIZE 32
#define FWMP_DEV_DISABLE_CCD_UNLOCK BIT(6)
+#define FWMP_DEV_DISABLE_BOOT BIT(0)
#define FIRMWARE_FLAG_DEV_MODE 0x02
struct RollbackSpaceFirmware {
@@ -418,7 +424,8 @@ struct RollbackSpaceFwmp {
} __packed;
#ifndef CR50_DEV
-static int lock_enforced(const struct RollbackSpaceFwmp *fwmp)
+static int lock_enforced(const struct RollbackSpaceFwmp *fwmp,
+ enum fwmp_controlled_action_t action)
{
uint8_t crc;
@@ -436,39 +443,57 @@ static int lock_enforced(const struct RollbackSpaceFwmp *fwmp)
return 1;
}
- return !!(fwmp->flags & FWMP_DEV_DISABLE_CCD_UNLOCK);
+ switch (action) {
+ case CCD_UNLOCK:
+ return !!(fwmp->flags & FWMP_DEV_DISABLE_CCD_UNLOCK);
+ case BOOT_POLICY_UPDATE:
+ return !!(fwmp->flags & FWMP_DEV_DISABLE_BOOT);
+ }
+ return 0;
}
#endif
-int board_fwmp_allows_unlock(void)
+static int fwmp_allows(enum fwmp_controlled_action_t action)
{
#ifdef CR50_DEV
return 1;
#else
- /* Let's see if FWMP disables console activation. */
+ /* Let's see if FWMP allows the requested action. */
struct RollbackSpaceFwmp fwmp;
- int allows_unlock;
+ int allows;
switch (read_tpm_nvmem(FWMP_NV_INDEX,
sizeof(struct RollbackSpaceFwmp), &fwmp)) {
default:
- /* Something is messed up, let's not allow console unlock. */
- allows_unlock = 0;
+ /* Something is messed up, let's not allow. */
+ allows = 0;
break;
case TPM_READ_NOT_FOUND:
- allows_unlock = 1;
+ allows = 1;
break;
case TPM_READ_SUCCESS:
- allows_unlock = !lock_enforced(&fwmp);
+ allows = !lock_enforced(&fwmp, action);
break;
}
- CPRINTS("Console unlock %sallowed", allows_unlock ? "" : "not ");
+ return allows;
+#endif
+}
- return allows_unlock;
+int board_fwmp_allows_unlock(void)
+{
+ int allows_unlock = fwmp_allows(CCD_UNLOCK);
+#ifndef CR50_DEV
+ CPRINTS("Console unlock %sallowed", allows_unlock ? "" : "not ");
#endif
+ return allows_unlock;
+}
+
+int board_fwmp_allows_boot_policy_update(void)
+{
+ return fwmp_allows(BOOT_POLICY_UPDATE);
}
int board_vboot_dev_mode_enabled(void)