blob: 319e0dedfc2bee8ea03477848b9de98ab074e00e [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>
Daisuke Nojiri742fc8d2014-10-10 10:51:06 -070020#include <console/console.h>
Aaron Durbin0424c952015-03-28 23:56:22 -050021#include <fmap.h>
Vadim Bendeburyc83687d2015-04-10 17:50:11 -070022#include <reset.h>
Aaron Durbin5e291062016-01-25 16:39:56 -060023#include <rules.h>
Vadim Bendeburyc83687d2015-04-10 17:50:11 -070024#include <stddef.h>
25#include <string.h>
Furquan Shaikh2a12e2e2016-07-25 11:48:03 -070026#include <vboot/vboot_common.h>
Daisuke Nojiri742fc8d2014-10-10 10:51:06 -070027
Aaron Durbin4e50cdd2015-05-15 23:25:46 -050028int vboot_named_region_device(const char *name, struct region_device *rdev)
Daisuke Nojiri742fc8d2014-10-10 10:51:06 -070029{
Aaron Durbin4e50cdd2015-05-15 23:25:46 -050030 return fmap_locate_area_as_rdev(name, rdev);
Daisuke Nojiri742fc8d2014-10-10 10:51:06 -070031}
32
Furquan Shaikha6c5ddd2016-07-22 06:59:40 -070033/* ========================== VBOOT HANDOFF APIs =========================== */
Daisuke Nojiri742fc8d2014-10-10 10:51:06 -070034int vboot_get_handoff_info(void **addr, uint32_t *size)
35{
Furquan Shaikha6c5ddd2016-07-22 06:59:40 -070036 /*
37 * vboot_handoff is present only after cbmem comes online. If we are in
38 * pre-ram stage, then bail out early.
39 */
40 if (ENV_BOOTBLOCK ||
41 (ENV_VERSTAGE && IS_ENABLED(CONFIG_VBOOT_STARTS_IN_BOOTBLOCK)))
Aaron Durbin5e291062016-01-25 16:39:56 -060042 return -1;
43
Furquan Shaikha6c5ddd2016-07-22 06:59:40 -070044 struct vboot_handoff *vboot_handoff;
Daisuke Nojiri742fc8d2014-10-10 10:51:06 -070045 vboot_handoff = cbmem_find(CBMEM_ID_VBOOT_HANDOFF);
46
47 if (vboot_handoff == NULL)
48 return -1;
49
50 *addr = vboot_handoff;
Furquan Shaikha6c5ddd2016-07-22 06:59:40 -070051
52 if (size)
53 *size = sizeof(*vboot_handoff);
Daisuke Nojiri742fc8d2014-10-10 10:51:06 -070054 return 0;
55}
56
Furquan Shaikha6c5ddd2016-07-22 06:59:40 -070057static int vboot_get_handoff_flag(uint32_t flag)
Paul Kocialkowski115360f2015-09-03 11:41:14 +020058{
59 struct vboot_handoff *vbho;
60
Furquan Shaikha6c5ddd2016-07-22 06:59:40 -070061 /*
62 * If vboot_handoff cannot be found, return default value of flag as 0.
63 */
64 if (vboot_get_handoff_info((void **)&vbho, NULL))
Paul Kocialkowski115360f2015-09-03 11:41:14 +020065 return 0;
66
67 return !!(vbho->init_params.out_flags & flag);
68}
69
Furquan Shaikha6c5ddd2016-07-22 06:59:40 -070070int vboot_handoff_skip_display_init(void)
Paul Kocialkowski115360f2015-09-03 11:41:14 +020071{
Furquan Shaikha6c5ddd2016-07-22 06:59:40 -070072 return !vboot_get_handoff_flag(VB_INIT_OUT_ENABLE_DISPLAY);
Paul Kocialkowski115360f2015-09-03 11:41:14 +020073}
74
Furquan Shaikha6c5ddd2016-07-22 06:59:40 -070075int vboot_handoff_check_developer_flag(void)
Paul Kocialkowski115360f2015-09-03 11:41:14 +020076{
Furquan Shaikha6c5ddd2016-07-22 06:59:40 -070077 return vboot_get_handoff_flag(VB_INIT_OUT_ENABLE_DEVELOPER);
Paul Kocialkowski115360f2015-09-03 11:41:14 +020078}
79
Furquan Shaikha6c5ddd2016-07-22 06:59:40 -070080int vboot_handoff_check_recovery_flag(void)
Paul Kocialkowski115360f2015-09-03 11:41:14 +020081{
Furquan Shaikha6c5ddd2016-07-22 06:59:40 -070082 return vboot_get_handoff_flag(VB_INIT_OUT_ENABLE_RECOVERY);
Paul Kocialkowski115360f2015-09-03 11:41:14 +020083}
84
Furquan Shaikha6c5ddd2016-07-22 06:59:40 -070085int vboot_handoff_get_recovery_reason(void)
Subrata Banikdf13c312015-09-28 15:12:08 +053086{
87 struct vboot_handoff *vbho;
88 VbSharedDataHeader *sd;
89
Furquan Shaikha6c5ddd2016-07-22 06:59:40 -070090 if (vboot_get_handoff_info((void **)&vbho, NULL))
Subrata Banikdf13c312015-09-28 15:12:08 +053091 return 0;
92
93 sd = (VbSharedDataHeader *)vbho->shared_data;
94
95 return sd->recovery_reason;
96}
97
Furquan Shaikha6c5ddd2016-07-22 06:59:40 -070098/* ============================ VBOOT REBOOT ============================== */
Aaron Durbin5dbefd92016-01-22 16:33:57 -060099void __attribute__((weak)) vboot_platform_prepare_reboot(void)
100{
101}
102
Vadim Bendeburyc83687d2015-04-10 17:50:11 -0700103void vboot_reboot(void)
104{
Vadim Bendebury6e20e2f2015-04-10 18:04:04 -0700105 if (IS_ENABLED(CONFIG_CONSOLE_CBMEM_DUMP_TO_UART))
106 cbmem_dump_console();
Aaron Durbin5dbefd92016-01-22 16:33:57 -0600107 vboot_platform_prepare_reboot();
Vadim Bendeburyc83687d2015-04-10 17:50:11 -0700108 hard_reset();
109 die("failed to reboot");
110}