blob: 948b63e27a0744094190dcad49dc1c2dbe0a30af [file] [log] [blame]
/* 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.
*
* High-level firmware wrapper API - user interface for RW firmware
*/
#include "2common.h"
#include "2misc.h"
#include "2sysincludes.h"
#include "vboot_api.h"
#include "vboot_kernel.h"
#include "vboot_test.h"
#include "vboot_ui_legacy_common.h"
static enum {
POWER_BUTTON_HELD_SINCE_BOOT = 0,
POWER_BUTTON_RELEASED,
POWER_BUTTON_PRESSED, /* Must have been previously released */
} power_button_state;
void vb2_reset_power_button(void) {
power_button_state = POWER_BUTTON_HELD_SINCE_BOOT;
}
void vb2_error_beep(enum vb2_beep_type beep)
{
switch (beep) {
case VB_BEEP_FAILED:
VbExBeep(250, 200);
break;
default:
case VB_BEEP_NOT_ALLOWED:
VbExBeep(120, 400);
VbExSleepMs(120);
VbExBeep(120, 400);
break;
}
}
void vb2_error_notify(const char *print_msg,
const char *log_msg,
enum vb2_beep_type beep)
{
if (print_msg)
VbExDisplayDebugInfo(print_msg, 0);
if (!log_msg)
log_msg = print_msg;
if (log_msg)
VB2_DEBUG(log_msg);
vb2_error_beep(beep);
}
void vb2_error_no_altfw(void)
{
VB2_DEBUG("Legacy boot is disabled\n");
VbExDisplayDebugInfo("WARNING: Booting legacy BIOS has not been "
"enabled. Refer to the developer-mode "
"documentation for details.\n", 0);
vb2_error_beep(VB_BEEP_NOT_ALLOWED);
}
void vb2_try_altfw(struct vb2_context *ctx, int allowed,
enum VbAltFwIndex_t altfw_num)
{
if (!allowed) {
vb2_error_no_altfw();
return;
}
if (vb2ex_commit_data(ctx)) {
vb2_error_notify("Error committing data on legacy boot.\n",
NULL, VB_BEEP_FAILED);
return;
}
/* Will not return if successful */
VbExLegacy(altfw_num);
vb2_error_notify("Legacy boot failed. Missing BIOS?\n", NULL,
VB_BEEP_FAILED);
}
int vb2_want_shutdown(struct vb2_context *ctx, uint32_t key)
{
struct vb2_gbb_header *gbb = vb2_get_gbb(ctx);
uint32_t shutdown_request = VbExIsShutdownRequested();
/*
* Ignore power button push until after we have seen it released.
* This avoids shutting down immediately if the power button is still
* being held on startup. After we've recognized a valid power button
* push then don't report the event until after the button is released.
*/
if (shutdown_request & VB_SHUTDOWN_REQUEST_POWER_BUTTON) {
shutdown_request &= ~VB_SHUTDOWN_REQUEST_POWER_BUTTON;
if (power_button_state == POWER_BUTTON_RELEASED)
power_button_state = POWER_BUTTON_PRESSED;
} else {
if (power_button_state == POWER_BUTTON_PRESSED)
shutdown_request |= VB_SHUTDOWN_REQUEST_POWER_BUTTON;
power_button_state = POWER_BUTTON_RELEASED;
}
if (key == VB_BUTTON_POWER_SHORT_PRESS)
shutdown_request |= VB_SHUTDOWN_REQUEST_POWER_BUTTON;
/* If desired, ignore shutdown request due to lid closure. */
if (gbb->flags & VB2_GBB_FLAG_DISABLE_LID_SHUTDOWN)
shutdown_request &= ~VB_SHUTDOWN_REQUEST_LID_CLOSED;
return shutdown_request;
}