16 #define _EC_FILENAME(select, suffix) \
17 (select == VB_SELECT_FIRMWARE_READONLY ? "ecro" suffix : "ecrw" suffix)
18 #define EC_IMAGE_FILENAME(select) _EC_FILENAME(select, "")
19 #define EC_HASH_FILENAME(select) _EC_FILENAME(select, ".hash")
22 #define CROS_EC_HASH_CHECK_DELAY_MS 10
24 #define CROS_EC_HASH_TIMEOUT_MS 2000
27 #define LIMIT_POWER_WAIT_TIMEOUT_MS 3000
29 #define LIMIT_POWER_POLL_SLEEP_MS 10
32 #define CROS_EC_SYSJUMP_TIMEOUT_MS 3000
42 vb2_error_t retval = VB2_SUCCESS;
43 struct vb2_context *ctx;
48 ctx->flags |= VB2_CONTEXT_EC_SYNC_SUPPORTED;
50 retval = vb2api_ec_sync(ctx);
57 case VB2_REQUEST_REBOOT_EC_TO_RO:
66 case VB2_REQUEST_REBOOT_EC_SWITCH_RW:
75 case VB2_REQUEST_REBOOT:
82 " rebooting\n", retval);
94 case VB_SELECT_FIRMWARE_READONLY:
96 case VB_SELECT_FIRMWARE_EC_UPDATE:
108 const uint8_t **hash,
int *hash_size)
112 int recalc_requested = 0;
120 return VB2_ERROR_UNKNOWN;
128 if (recalc_requested)
132 "%s: No valid hash (status=%d size=%d). "
133 "Computing...\n", __func__, resp.
status,
138 return VB2_ERROR_UNKNOWN;
140 recalc_requested = 1;
170 return VB2_ERROR_UNKNOWN;
174 return VB2_ERROR_UNKNOWN;
195 if (select == VB_SELECT_FIRMWARE_READONLY)
199 return VB2_ERROR_UNKNOWN;
203 if (resp.
flags & protected_region)
204 return VB2_REQUEST_REBOOT_EC_TO_RO;
223 return VB2_REQUEST_REBOOT_EC_TO_RO;
226 return VB2_ERROR_UNKNOWN;
233 case VB_SELECT_FIRMWARE_READONLY:
235 case VB_SELECT_FIRMWARE_EC_UPDATE:
262 "skipping flash write\n");
263 return VB2_ERROR_UNKNOWN;
272 "skipping flash write\n");
273 return VB2_ERROR_UNKNOWN;
281 burst = pdata_max_size -
sizeof(*params);
289 return VB2_ERROR_UNKNOWN;
300 uint32_t xfer_size = todo +
sizeof(*params);
313 return VB2_ERROR_UNKNOWN;
335 if (rv != VB2_SUCCESS)
344 return VB2_ERROR_UNKNOWN;
349 return VB2_ERROR_UNKNOWN;
351 rv = VB2_ERROR_UNKNOWN;
354 if (image_size > region_size)
387 return VB2_ERROR_UNKNOWN;
390 *hash_size = (int)
size;
423 bool message_printed =
false;
425 int in_recovery = !!(ctx->flags & VB2_CONTEXT_RECOVERY_MODE);
443 return VB2_ERROR_UNKNOWN;
449 if (!message_printed) {
451 "Waiting for EC to clear limit power flag.\n");
452 message_printed =
true;
460 "EC requests limited power usage. Request shutdown.\n");
461 return VB2_REQUEST_SHUTDOWN;
476 return VB2_ERROR_UNKNOWN;
485 const uint8_t **hash,
int *hash_size)
514 return VB2_ERROR_UNKNOWN;
535 return VB2_ERROR_UNKNOWN;
546 return VB2_ERROR_UNKNOWN;
void * memcpy(void *dest, const void *src, size_t n)
static struct sdram_info params
void cbfs_unmap(void *mapping)
static void * cbfs_map(const char *name, size_t *size_out)
#define printk(level,...)
void mdelay(unsigned int msecs)
int google_chromeec_flash_erase(uint32_t offset, uint32_t size)
Erase a region of EC flash.
int google_chromeec_get_vboot_hash(uint32_t offset, struct ec_response_vboot_hash *resp)
Return the EC's vboot image hash.
int google_chromeec_get_protocol_info(struct ec_response_get_protocol_info *resp)
Get information about the protocol that the EC speaks.
int google_chromeec_flash_info(struct ec_response_flash_info *info)
Return information about the entire flash.
int google_chromeec_hello(void)
Performs light verification of the EC<->AP communication channel.
int google_chromeec_flash_region_info(enum ec_flash_region region, uint32_t *offset, uint32_t *size)
Get offset and size of the specified EC flash region.
int google_chromeec_reboot(int dev_idx, enum ec_reboot_cmd type, uint8_t flags)
int google_chromeec_read_limit_power_request(int *limit_power)
Check if the EC is requesting the system to limit input power.
int google_chromeec_flash_protect(uint32_t mask, uint32_t flags, struct ec_response_flash_protect *resp)
Protect/un-protect EC flash regions.
int google_chromeec_flash_write_block(const uint8_t *params_data, uint32_t bufsize)
Write a block into EC flash.
int google_ec_running_ro(void)
int google_chromeec_start_vboot_hash(enum ec_vboot_hash_type hash_type, uint32_t hash_offset, struct ec_response_vboot_hash *resp)
Calculate image hash for vboot.
int google_chromeec_battery_cutoff(uint8_t flags)
Command EC to perform battery cutoff.
int google_chromeec_efs_verify(enum ec_flash_region region)
Verify flash using EFS if available.
@ EC_VBOOT_HASH_STATUS_DONE
@ EC_VBOOT_HASH_STATUS_NONE
@ EC_VBOOT_HASH_STATUS_BUSY
#define EC_FLASH_PROTECT_GPIO_ASSERTED
#define EC_FLASH_PROTECT_ALL_AT_BOOT
#define EC_FLASH_PROTECT_RO_NOW
#define EC_VBOOT_HASH_OFFSET_UPDATE
#define EC_VBOOT_HASH_OFFSET_ACTIVE
#define EC_FLASH_PROTECT_RO_AT_BOOT
#define EC_BATTERY_CUTOFF_FLAG_AT_SHUTDOWN
@ EC_VBOOT_HASH_TYPE_SHA256
#define EC_FLASH_PROTECT_ALL_NOW
#define EC_REBOOT_FLAG_SWITCH_RW_SLOT
#define EC_VBOOT_HASH_OFFSET_RO
#define CROS_EC_HASH_TIMEOUT_MS
#define LIMIT_POWER_POLL_SLEEP_MS
#define LIMIT_POWER_WAIT_TIMEOUT_MS
vb2_error_t vb2ex_commit_data(struct vb2_context *ctx)
vb2_error_t vb2ex_ec_jump_to_rw(void)
#define EC_HASH_FILENAME(select)
static vb2_error_t ec_update_image(enum vb2_firmware_selection select)
vb2_error_t vb2ex_ec_running_rw(int *in_rw)
static vb2_error_t ec_protect_flash(enum vb2_firmware_selection select, int enable)
vb2_error_t vb2ex_ec_hash_image(enum vb2_firmware_selection select, const uint8_t **hash, int *hash_size)
vb2_error_t vb2ex_ec_protect(enum vb2_firmware_selection select)
vb2_error_t vb2ex_ec_disable_jump(void)
vb2_error_t vb2ex_ec_update_image(enum vb2_firmware_selection select)
static vb2_error_t ec_hash_image(enum vb2_firmware_selection select, const uint8_t **hash, int *hash_size)
static vb2_error_t ec_flash_write(void *image, uint32_t region_offset, int image_size)
vb2_error_t vb2ex_ec_get_expected_image_hash(enum vb2_firmware_selection select, const uint8_t **hash, int *hash_size)
vb2_error_t vb2ex_ec_vboot_done(struct vb2_context *ctx)
static enum ec_flash_region vboot_to_ec_region(enum vb2_firmware_selection select)
#define CROS_EC_HASH_CHECK_DELAY_MS
#define CROS_EC_SYSJUMP_TIMEOUT_MS
static uint32_t get_vboot_hash_offset(enum vb2_firmware_selection select)
#define EC_IMAGE_FILENAME(select)
static vb2_error_t ec_get_expected_hash(enum vb2_firmware_selection select, const uint8_t **hash, int *hash_size)
vb2_error_t vb2ex_ec_battery_cutoff(void)
void __noreturn halt(void)
halt the system reliably
static int stopwatch_expired(struct stopwatch *sw)
static void stopwatch_init_msecs_expire(struct stopwatch *sw, long ms)
static long stopwatch_duration_usecs(struct stopwatch *sw)
void timestamp_add_now(enum timestamp_id id)
#define BIOS_INFO
BIOS_INFO - Expected events.
#define BIOS_EMERG
BIOS_EMERG - Emergency / Fatal.
#define BIOS_ERR
BIOS_ERR - System in incomplete state.
#define BIOS_SPEW
BIOS_SPEW - Excessively verbose output.
#define BIOS_WARNING
BIOS_WARNING - Bad configuration.
static size_t region_offset(const struct region *r)
struct vb2_context * vboot_get_context(void)
struct ec_host_request - Version 3 request from host.
struct ec_params_flash_write - Parameters for the flash write command.
struct ec_response_flash_info - Response to the flash info command.
uint32_t write_block_size
struct ec_response_flash_protect - Response to the flash protect command.
struct ec_response_get_protocol_info - Response to the get protocol info.
uint16_t max_request_packet_size
void save_vbnv(const uint8_t *vbnv_copy)
void vboot_save_data(struct vb2_context *ctx)