/* Copyright 2017 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. * * Case Closed Debugging configuration */ #ifndef __CROS_EC_CCD_CONFIG_H #define __CROS_EC_CCD_CONFIG_H #include #include /* Case-closed debugging state */ enum ccd_state { CCD_STATE_LOCKED = 0, CCD_STATE_UNLOCKED, CCD_STATE_OPENED, /* Number of CCD states */ CCD_STATE_COUNT }; /* Flags */ enum ccd_flag { /* Flags that can only be set internally; fill from bottom up */ /* * Test lab mode is enabled. This MUST be in the first byte so that * it's in a constant position across all versions of CCD config. * * Note: This is used internally by CCD config. Do NOT test this * to control other things; use capabilities for those. */ CCD_FLAG_TEST_LAB = (1 << 0), /* * What state were we in when the password was set? * (0=opened, 1=unlocked) */ CCD_FLAG_PASSWORD_SET_WHEN_UNLOCKED = (1 << 1), /* (flags in the middle are unused) */ /* Flags that can be set via ccd_set_flags(); fill from top down */ /* Override write protect at boot */ CCD_FLAG_OVERRIDE_WP_AT_BOOT = (1 << 22), /* * If overriding WP at boot, set it to what value * (0=disabled, 1=enabled) */ CCD_FLAG_OVERRIDE_WP_STATE_ENABLED = (1 << 23), }; /* Capabilities */ enum ccd_capability { /* UARTs to/from AP and EC */ CCD_CAP_GSC_RX_AP_TX = 0, CCD_CAP_GSC_TX_AP_RX = 1, CCD_CAP_GSC_RX_EC_TX = 2, CCD_CAP_GSC_TX_EC_RX = 3, /* Access to AP SPI flash */ CCD_CAP_AP_FLASH = 4, /* Access to EC flash (SPI or internal) */ CCD_CAP_EC_FLASH = 5, /* Override WP temporarily or at boot */ CCD_CAP_OVERRIDE_WP = 6, /* Reboot EC or AP */ CCD_CAP_REBOOT_EC_AP = 7, /* GSC restricted console commands */ CCD_CAP_GSC_RESTRICTED_CONSOLE = 8, /* Allow ccd-unlock or ccd-open without AP reboot */ CCD_CAP_UNLOCK_WITHOUT_AP_REBOOT = 9, /* Allow ccd-unlock or ccd-open without short physical presence */ CCD_CAP_UNLOCK_WITHOUT_SHORT_PP = 10, /* Allow ccd-open without wiping TPM data */ CCD_CAP_OPEN_WITHOUT_TPM_WIPE = 11, /* Allow ccd-open without long physical presence */ CCD_CAP_OPEN_WITHOUT_LONG_PP = 12, /* Allow removing the battery to bypass physical presence requirement */ CCD_CAP_REMOVE_BATTERY_BYPASSES_PP = 13, /* Allow GSC firmware update without wiping TPM data */ CCD_CAP_GSC_FW_UPDATE_WITHOUT_TPM_WIPE = 14, /* Access to I2C via USB */ CCD_CAP_I2C = 15, /* Read-only access to hash or dump EC or AP flash */ CCD_CAP_FLASH_READ = 16, /* Allow ccd open without dev mode enabled */ CCD_CAP_OPEN_WITHOUT_DEV_MODE = 17, /* Allow ccd open from usb */ CCD_CAP_OPEN_FROM_USB = 18, /* Number of currently defined capabilities */ CCD_CAP_COUNT }; /* Capability states */ enum ccd_capability_state { /* Default value */ CCD_CAP_STATE_DEFAULT = 0, /* Always available (state >= CCD_STATE_LOCKED) */ CCD_CAP_STATE_ALWAYS = 1, /* Unless locked (state >= CCD_STATE_UNLOCKED) */ CCD_CAP_STATE_UNLESS_LOCKED = 2, /* Only if opened (state >= CCD_STATE_OPENED) */ CCD_CAP_STATE_IF_OPENED = 3, /* Number of capability states */ CCD_CAP_STATE_COUNT }; struct ccd_capability_info { /* Capability name */ const char *name; /* Default state, if config set to CCD_CAP_STATE_DEFAULT */ enum ccd_capability_state default_state; }; #ifdef CONFIG_CCD_OPEN_PREPVT /* In prepvt images always allow ccd open from the console without dev mode */ #define CCD_CAP_STATE_OPEN_REQ CCD_CAP_STATE_ALWAYS #else /* In prod images restrict how ccd can be opened */ #define CCD_CAP_STATE_OPEN_REQ CCD_CAP_STATE_IF_OPENED #endif #define CAP_INFO_DATA { \ {"UartGscRxAPTx", CCD_CAP_STATE_ALWAYS}, \ {"UartGscTxAPRx", CCD_CAP_STATE_ALWAYS}, \ {"UartGscRxECTx", CCD_CAP_STATE_ALWAYS}, \ {"UartGscTxECRx", CCD_CAP_STATE_IF_OPENED}, \ \ {"FlashAP", CCD_CAP_STATE_IF_OPENED}, \ {"FlashEC", CCD_CAP_STATE_IF_OPENED}, \ {"OverrideWP", CCD_CAP_STATE_IF_OPENED}, \ {"RebootECAP", CCD_CAP_STATE_IF_OPENED}, \ \ {"GscFullConsole", CCD_CAP_STATE_IF_OPENED}, \ {"UnlockNoReboot", CCD_CAP_STATE_ALWAYS}, \ {"UnlockNoShortPP", CCD_CAP_STATE_ALWAYS}, \ {"OpenNoTPMWipe", CCD_CAP_STATE_IF_OPENED}, \ \ {"OpenNoLongPP", CCD_CAP_STATE_IF_OPENED}, \ {"BatteryBypassPP", CCD_CAP_STATE_ALWAYS}, \ {"UpdateNoTPMWipe", CCD_CAP_STATE_ALWAYS}, \ {"I2C", CCD_CAP_STATE_IF_OPENED}, \ {"FlashRead", CCD_CAP_STATE_ALWAYS}, \ {"OpenNoDevMode", CCD_CAP_STATE_OPEN_REQ}, \ {"OpenFromUSB", CCD_CAP_STATE_OPEN_REQ}, \ } #define CCD_STATE_NAMES { "Locked", "Unlocked", "Opened" } #define CCD_CAP_STATE_NAMES { "Default", "Always", "UnlessLocked", "IfOpened" } /* Macros regarding ccd_capabilities */ #define CCD_CAP_BITS 2 #define CCD_CAP_BITMASK ((1 << CCD_CAP_BITS) - 1) #define CCD_CAPS_PER_BYTE (8 / CCD_CAP_BITS) /* * Subcommand code, used to pass different CCD commands using the same TPM * vendor command. */ enum ccd_vendor_subcommands { CCDV_PASSWORD = 0, CCDV_OPEN = 1, CCDV_UNLOCK = 2, CCDV_LOCK = 3, CCDV_PP_POLL_UNLOCK = 4, CCDV_PP_POLL_OPEN = 5, CCDV_GET_INFO = 6 }; enum ccd_pp_state { CCD_PP_CLOSED = 0, CCD_PP_AWAITING_PRESS = 1, CCD_PP_BETWEEN_PRESSES = 2, CCD_PP_DONE = 3 }; /* Structure to communicate information about CCD state. */ #define CCD_CAPS_WORDS ((CCD_CAP_COUNT * 2 + 31)/32) struct ccd_info_response { uint32_t ccd_caps_current[CCD_CAPS_WORDS]; uint32_t ccd_caps_defaults[CCD_CAPS_WORDS]; uint32_t ccd_flags; uint8_t ccd_state; uint8_t ccd_force_disabled; /* * A bitmap indicating ccd internal state. * See "enum ccd_indicator_bits" below. */ uint8_t ccd_indicator_bitmap; } __packed; enum ccd_indicator_bits { /* has_password? */ CCD_INDICATOR_BIT_HAS_PASSWORD = (1 << 0), /* Are CCD capabilities in CCD_CAP_STATE_DEFAULT */ CCD_INDICATOR_BIT_ALL_CAPS_DEFAULT = (1 << 1), }; /** * Initialize CCD configuration at boot. * * This must be called before any command which gets/sets the configuration. * * @param state Initial case-closed debugging state. This should be * CCD_STATE_LOCKED unless this is a debug build, or if * a previous value is being restored after a low-power * resume. */ void ccd_config_init(enum ccd_state state); /** * Get a single CCD flag. * * @param flag Flag to get * @return 1 if flag is set, 0 if flag is clear */ int ccd_get_flag(enum ccd_flag flag); /** * Set a single CCD flag. * * @param flag Flag to set * @param value New value for flag (0=clear, non-zero=set) * @return EC_SUCCESS or non-zero error code. */ int ccd_set_flag(enum ccd_flag flag, int value); /** * Check if a CCD capability is enabled in the current CCD mode. * * @param cap Capability to check * @return 1 if capability is enabled, 0 if disabled */ int ccd_is_cap_enabled(enum ccd_capability cap); /** * Get the current CCD state. * * This is intended for use by the board if it needs to back up the CCD state * across low-power states and then restore it when calling ccd_config_init(). * Do NOT use this to gate debug capabilities; use ccd_is_cap_enabled() or * ccd_get_flag() instead. * * @return The current CCD state. */ enum ccd_state ccd_get_state(void); /** * Force CCD disabled. * * This should be called if security checks fail and for some reason the board * can't immediately reboot. It locks CCD and disables all CCD capabilities * until reboot. */ void ccd_disable(void); /* Flags for ccd_reset_config() */ enum ccd_reset_config_flags { /* Also reset test lab flag */ CCD_RESET_TEST_LAB = (1 << 0), /* Only reset Always/UnlessLocked settings */ CCD_RESET_UNLOCKED_ONLY = (1 << 1), /* * Do a factory reset to enable factory mode. Factory mode sets all ccd * capabilities to always and disables write protect */ CCD_RESET_FACTORY = (1 << 2) }; /** * Reset CCD config to the desired state. * * @param flags Reset flags (see enum ccd_reset_config_flags) * @return EC_SUCCESS, or non-zero if error. */ int ccd_reset_config(unsigned int flags); /** * Inform CCD about TPM reset so that the password management state machine * can be restarted. */ void ccd_tpm_reset_callback(void); /** * Return True if the ccd password is set. It is possible that a pending ccd * change would set or clear the password, but we don't think this is a big * issue or risk for now. * * @return 1 if password is set, 0 if it's not */ int ccd_has_password(void); /** * Enter CCD factory mode. This will clear the TPM, update the ccd config, and * then do a hard reboot if 'reset_required' is True. */ void enable_ccd_factory_mode(int reset_required); /* * Enable factory mode but not necessarily rebooting the device. This will * clear the TPM and disable flash write protection. Will trigger system reset * only if 'reset_required' is True. */ void factory_enable(int reset_required); #endif /* __CROS_EC_CCD_CONFIG_H */