Files
OpenCellular/firmware/lib/ec_sync_all.c
Caveh Jalali 3dd580298b call depthcharge hooks for auxiliary FW update.
this adds calls to depthcharge (using callbacks) to do auxiliary
firmware updates.  in particular, this is intended to trigger TCPC
updates, but other programmables could also be updated.

no firmware updates take place until a board file has actually
registered a firmware update "driver".  board file updates to follow.

TEST="COV=1 make" passes.
	    depthcharge boots on snappy.
	    with additional follow-on CLs, we can update the ps8751.

the companion depthcharge changes are here:

https://chromium-review.googlesource.com/c/498150/

the working design doc is here:

https://docs.google.com/a/google.com/document/d/1uzS0b3O3Us1QI2Sx7LDkjEfHmuhYB2BolrAoNwCVoc0/edit?usp=sharing

these features depend on vboot API updates:

CQ-DEPEND=CL:498150
BUG=b:35586896
BRANCH=none

Change-Id: If0d634eab08b429a8e7e80f5fe11eab3705bba0f
Signed-off-by: Caveh Jalali <caveh@google.com>
Reviewed-on: https://chromium-review.googlesource.com/505260
Reviewed-by: Stefan Reinauer <reinauer@chromium.org>
2017-06-28 03:09:49 -07:00

103 lines
2.8 KiB
C

/* Copyright (c) 2013 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.
*
* EC software sync routines for vboot
*/
#include "2sysincludes.h"
#include "2common.h"
#include "2misc.h"
#include "2nvstorage.h"
#include "sysincludes.h"
#include "ec_sync.h"
#include "vboot_api.h"
#include "vboot_common.h"
#include "vboot_display.h"
#include "vboot_kernel.h"
VbError_t ec_sync_all(struct vb2_context *ctx, struct VbCommonParams *cparams)
{
VbSharedDataHeader *shared =
(VbSharedDataHeader *)cparams->shared_data_blob;
VbAuxFwUpdateSeverity_t fw_update;
VbError_t rv;
rv = ec_sync_check_aux_fw(ctx, cparams, &fw_update);
if (rv)
return rv;
/* Do EC sync phase 1; this determines if we need an update */
VbError_t phase1_rv = ec_sync_phase1(ctx, cparams);
int need_wait_screen = ec_will_update_slowly(ctx, cparams) ||
(fw_update == VB_AUX_FW_SLOW_UPDATE);
/*
* Check if we need to reboot to load the VGA Option ROM before we can
* display the WAIT screen.
*
* Do this before we check if ec_sync_phase1() requires a reboot for
* some other reason, since there's no reason to reboot twice.
*/
int reboot_for_oprom = (need_wait_screen &&
shared->flags & VBSD_OPROM_MATTERS &&
!(shared->flags & VBSD_OPROM_LOADED));
if (reboot_for_oprom) {
VB2_DEBUG("Reboot to load VGA Option ROM\n");
vb2_nv_set(ctx, VB2_NV_OPROM_NEEDED, 1);
}
/* Reboot if phase 1 needed it, or if we need to load VGA Option ROM */
if (phase1_rv)
return VBERROR_EC_REBOOT_TO_RO_REQUIRED;
if (reboot_for_oprom)
return VBERROR_VGA_OPROM_MISMATCH;
/* Display the wait screen if we need it */
if (need_wait_screen) {
VB2_DEBUG("EC is slow. Show WAIT screen.\n");
VbDisplayScreen(ctx, cparams, VB_SCREEN_WAIT, 0);
}
/*
* Do EC sync phase 2; this applies the update and/or jumps to the
* correct EC image.
*/
rv = ec_sync_phase2(ctx, cparams);
if (rv)
return rv;
/*
* Do software sync for devices tunneled throught the EC.
*/
if (fw_update != VB_AUX_FW_NO_UPDATE) {
rv = VbExUpdateAuxFw();
if (rv)
return rv;
}
/*
* Reboot to unload VGA Option ROM if:
* - we displayed the wait screen
* - the system has slow EC update flag set
* - the VGA Option ROM was needed and loaded
* - the system is NOT in developer mode (that'll also need the ROM)
*/
if (need_wait_screen &&
(shared->flags & VBSD_OPROM_MATTERS) &&
(shared->flags & VBSD_OPROM_LOADED) &&
!(shared->flags & VBSD_BOOT_DEV_SWITCH_ON)) {
VB2_DEBUG("Reboot to unload VGA Option ROM\n");
vb2_nv_set(ctx, VB2_NV_OPROM_NEEDED, 0);
return VBERROR_VGA_OPROM_MISMATCH;
}
/* Do EC sync phase 3; this completes sync and handles battery cutoff */
rv = ec_sync_phase3(ctx, cparams);
if (rv)
return rv;
return VBERROR_SUCCESS;
}