blob: c80650f3be9c6f00a6b5311ced73f85e128c04e4 [file] [log] [blame]
Daisuke Nojiri742fc8d2014-10-10 10:51:06 -07001/*
2 * This file is part of the coreboot project.
3 *
4 * Copyright (C) 2014 The ChromiumOS Authors. All rights reserved.
5 *
6 * This program is free software; you can redistribute it and/or modify
7 * it under the terms of the GNU General Public License as published by
8 * the Free Software Foundation; version 2 of the License.
9 *
10 * This program is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 * GNU General Public License for more details.
Daisuke Nojiri742fc8d2014-10-10 10:51:06 -070014 */
15
Daisuke Nojiri742fc8d2014-10-10 10:51:06 -070016#include <boot/coreboot_tables.h>
Aaron Durbinb6981c02015-05-15 15:57:51 -050017#include <boot_device.h>
Daisuke Nojiri742fc8d2014-10-10 10:51:06 -070018#include <cbmem.h>
Patrick Georgi3e18aca2015-04-29 18:59:04 +020019#include <console/cbmem_console.h>
Aaron Durbin0424c952015-03-28 23:56:22 -050020#include <fmap.h>
Furquan Shaikh95673af2018-04-25 18:15:44 -070021#include <gbb_header.h>
Vadim Bendeburyc83687d2015-04-10 17:50:11 -070022#include <reset.h>
23#include <stddef.h>
24#include <string.h>
Furquan Shaikh95673af2018-04-25 18:15:44 -070025#include <security/vboot/gbb.h>
Philipp Deppenwiesefea24292017-10-17 17:02:29 +020026#include <security/vboot/vboot_common.h>
Furquan Shaikh95673af2018-04-25 18:15:44 -070027#include <security/vboot/vbnv.h>
Daisuke Nojiri742fc8d2014-10-10 10:51:06 -070028
Aaron Durbin4e50cdd2015-05-15 23:25:46 -050029int vboot_named_region_device(const char *name, struct region_device *rdev)
Daisuke Nojiri742fc8d2014-10-10 10:51:06 -070030{
Aaron Durbin4e50cdd2015-05-15 23:25:46 -050031 return fmap_locate_area_as_rdev(name, rdev);
Daisuke Nojiri742fc8d2014-10-10 10:51:06 -070032}
33
Aaron Durbin5bb9e932016-08-12 12:46:07 -050034int vboot_named_region_device_rw(const char *name, struct region_device *rdev)
35{
Aaron Durbina73a8032016-08-23 13:19:14 -050036 return fmap_locate_area_as_rdev_rw(name, rdev);
Aaron Durbin5bb9e932016-08-12 12:46:07 -050037}
38
Furquan Shaikh95673af2018-04-25 18:15:44 -070039/* Check if it is okay to enable USB Device Controller (UDC). */
40int vboot_can_enable_udc(void)
41{
42 /* Always disable if not in developer mode */
43 if (!vboot_developer_mode_enabled())
44 return 0;
45 /* Enable if GBB flag is set */
46 if (gbb_is_flag_set(GBB_FLAG_ENABLE_UDC))
47 return 1;
48 /* Enable if VBNV flag is set */
49 if (vbnv_udc_enable_flag())
50 return 1;
51 /* Otherwise disable */
52 return 0;
53}
54
Furquan Shaikha6c5ddd2016-07-22 06:59:40 -070055/* ========================== VBOOT HANDOFF APIs =========================== */
Daisuke Nojiri742fc8d2014-10-10 10:51:06 -070056int vboot_get_handoff_info(void **addr, uint32_t *size)
57{
Furquan Shaikha6c5ddd2016-07-22 06:59:40 -070058 /*
59 * vboot_handoff is present only after cbmem comes online. If we are in
60 * pre-ram stage, then bail out early.
61 */
62 if (ENV_BOOTBLOCK ||
63 (ENV_VERSTAGE && IS_ENABLED(CONFIG_VBOOT_STARTS_IN_BOOTBLOCK)))
Aaron Durbin5e291062016-01-25 16:39:56 -060064 return -1;
65
Furquan Shaikha6c5ddd2016-07-22 06:59:40 -070066 struct vboot_handoff *vboot_handoff;
Daisuke Nojiri742fc8d2014-10-10 10:51:06 -070067 vboot_handoff = cbmem_find(CBMEM_ID_VBOOT_HANDOFF);
68
69 if (vboot_handoff == NULL)
70 return -1;
71
72 *addr = vboot_handoff;
Furquan Shaikha6c5ddd2016-07-22 06:59:40 -070073
74 if (size)
75 *size = sizeof(*vboot_handoff);
Daisuke Nojiri742fc8d2014-10-10 10:51:06 -070076 return 0;
77}
78
Furquan Shaikha6c5ddd2016-07-22 06:59:40 -070079static int vboot_get_handoff_flag(uint32_t flag)
Paul Kocialkowski115360f2015-09-03 11:41:14 +020080{
81 struct vboot_handoff *vbho;
82
Furquan Shaikha6c5ddd2016-07-22 06:59:40 -070083 /*
84 * If vboot_handoff cannot be found, return default value of flag as 0.
85 */
86 if (vboot_get_handoff_info((void **)&vbho, NULL))
Paul Kocialkowski115360f2015-09-03 11:41:14 +020087 return 0;
88
89 return !!(vbho->init_params.out_flags & flag);
90}
91
Furquan Shaikha6c5ddd2016-07-22 06:59:40 -070092int vboot_handoff_skip_display_init(void)
Paul Kocialkowski115360f2015-09-03 11:41:14 +020093{
Furquan Shaikha6c5ddd2016-07-22 06:59:40 -070094 return !vboot_get_handoff_flag(VB_INIT_OUT_ENABLE_DISPLAY);
Paul Kocialkowski115360f2015-09-03 11:41:14 +020095}
96
Furquan Shaikha6c5ddd2016-07-22 06:59:40 -070097int vboot_handoff_check_developer_flag(void)
Paul Kocialkowski115360f2015-09-03 11:41:14 +020098{
Furquan Shaikha6c5ddd2016-07-22 06:59:40 -070099 return vboot_get_handoff_flag(VB_INIT_OUT_ENABLE_DEVELOPER);
Paul Kocialkowski115360f2015-09-03 11:41:14 +0200100}
101
Furquan Shaikha6c5ddd2016-07-22 06:59:40 -0700102int vboot_handoff_check_recovery_flag(void)
Paul Kocialkowski115360f2015-09-03 11:41:14 +0200103{
Furquan Shaikha6c5ddd2016-07-22 06:59:40 -0700104 return vboot_get_handoff_flag(VB_INIT_OUT_ENABLE_RECOVERY);
Paul Kocialkowski115360f2015-09-03 11:41:14 +0200105}
106
Furquan Shaikha6c5ddd2016-07-22 06:59:40 -0700107int vboot_handoff_get_recovery_reason(void)
Subrata Banikdf13c312015-09-28 15:12:08 +0530108{
109 struct vboot_handoff *vbho;
110 VbSharedDataHeader *sd;
111
Furquan Shaikha6c5ddd2016-07-22 06:59:40 -0700112 if (vboot_get_handoff_info((void **)&vbho, NULL))
Subrata Banikdf13c312015-09-28 15:12:08 +0530113 return 0;
114
115 sd = (VbSharedDataHeader *)vbho->shared_data;
116
117 return sd->recovery_reason;
118}
119
Furquan Shaikha6c5ddd2016-07-22 06:59:40 -0700120/* ============================ VBOOT REBOOT ============================== */
Aaron Durbin64031672018-04-21 14:45:32 -0600121void __weak vboot_platform_prepare_reboot(void)
Aaron Durbin5dbefd92016-01-22 16:33:57 -0600122{
123}
124
Vadim Bendeburyc83687d2015-04-10 17:50:11 -0700125void vboot_reboot(void)
126{
Vadim Bendebury6e20e2f2015-04-10 18:04:04 -0700127 if (IS_ENABLED(CONFIG_CONSOLE_CBMEM_DUMP_TO_UART))
128 cbmem_dump_console();
Aaron Durbin5dbefd92016-01-22 16:33:57 -0600129 vboot_platform_prepare_reboot();
Nico Huber4f32b642018-10-05 23:40:21 +0200130 board_reset();
Vadim Bendeburyc83687d2015-04-10 17:50:11 -0700131}