blob: 3925e90afeef0e78dd0989b36f0faaf8ec57ec8c [file] [log] [blame]
Stefan Reinauer52db0b92012-12-07 17:15:04 -08001/*
2 * This file is part of the coreboot project.
3 *
Stefan Reinauer08dc3572013-05-14 16:57:50 -07004 * Copyright 2010 Google Inc.
Stefan Reinauer52db0b92012-12-07 17:15:04 -08005 *
6 * This program is free software; you can redistribute it and/or
7 * modify it under the terms of the GNU General Public License as
8 * published by the Free Software Foundation; version 2 of
9 * the License.
10 *
11 * This program is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 * GNU General Public License for more details.
Stefan Reinauer52db0b92012-12-07 17:15:04 -080015 */
16
Julius Werner85620db2013-11-13 18:22:15 -080017#include <arch/exception.h>
Gabe Black8b685392013-09-29 03:02:55 -070018#include <bootblock_common.h>
Hung-Te Linb868d402013-02-06 22:01:18 +080019#include <console/console.h>
Julius Werner44cf8702014-12-08 13:39:14 -080020#include <delay.h>
Aaron Durbin49342cd2017-01-05 10:07:19 -060021#include <pc80/mc146818rtc.h>
Aaron Durbinf5d7f602015-03-17 13:20:02 -050022#include <program_loading.h>
Julius Werner8c093772016-02-09 16:09:15 -080023#include <symbols.h>
Elyes HAOUASb5622442019-07-11 09:22:02 +020024#include <timestamp.h>
David Hendricks50c0a502013-01-31 17:05:50 -080025
Julius Werner8c093772016-02-09 16:09:15 -080026DECLARE_OPTIONAL_REGION(timestamp);
27
Aaron Durbin64031672018-04-21 14:45:32 -060028__weak void bootblock_mainboard_early_init(void) { /* no-op */ }
29__weak void bootblock_soc_early_init(void) { /* do nothing */ }
30__weak void bootblock_soc_init(void) { /* do nothing */ }
31__weak void bootblock_mainboard_init(void) { /* do nothing */ }
Vadim Bendebury0b341b32014-04-23 11:09:44 -070032
Julius Werner12574dd2018-05-15 17:48:30 -070033asmlinkage void bootblock_main_with_timestamp(uint64_t base_timestamp,
34 struct timestamp_entry *timestamps, size_t num_timestamps)
Stefan Reinauer52db0b92012-12-07 17:15:04 -080035{
Julius Werner8c093772016-02-09 16:09:15 -080036 /* Initialize timestamps if we have TIMESTAMP region in memlayout.ld. */
Julius Wernercd49cce2019-03-05 16:53:33 -080037 if (CONFIG(COLLECT_TIMESTAMPS) &&
Julius Werner7e0dea62019-02-20 18:39:22 -080038 REGION_SIZE(timestamp) > 0) {
Julius Werner12574dd2018-05-15 17:48:30 -070039 int i;
Alexandru Gagniucff196b62016-05-16 16:17:39 -070040 timestamp_init(base_timestamp);
Julius Werner12574dd2018-05-15 17:48:30 -070041 for (i = 0; i < num_timestamps; i++)
42 timestamp_add(timestamps[i].entry_id,
43 timestamps[i].entry_stamp);
44 }
Julius Werner44cf8702014-12-08 13:39:14 -080045
Aaron Durbinbe7cbdc2016-02-24 18:56:00 -060046 bootblock_soc_early_init();
Julius Wernerf1e32102014-11-25 13:22:20 -080047 bootblock_mainboard_early_init();
David Hendricks3d7344a2013-01-08 21:05:06 -080048
Nico Hubere0b9aea2019-01-28 18:14:13 +010049 sanitize_cmos();
50 cmos_post_init();
51
Julius Wernercd49cce2019-03-05 16:53:33 -080052 if (CONFIG(BOOTBLOCK_CONSOLE)) {
Julius Werner86fc11d2015-10-09 13:37:58 -070053 console_init();
54 exception_init();
55 }
Stefan Reinauer919c8042013-05-16 10:57:15 -070056
Julius Wernerf1e32102014-11-25 13:22:20 -080057 bootblock_soc_init();
58 bootblock_mainboard_init();
59
Aaron Durbinf5d7f602015-03-17 13:20:02 -050060 run_romstage();
Stefan Reinauer52db0b92012-12-07 17:15:04 -080061}
Alexandru Gagniucff196b62016-05-16 16:17:39 -070062
63void main(void)
64{
65 uint64_t base_timestamp = 0;
66
67 init_timer();
68
Julius Wernercd49cce2019-03-05 16:53:33 -080069 if (CONFIG(COLLECT_TIMESTAMPS))
Alexandru Gagniucff196b62016-05-16 16:17:39 -070070 base_timestamp = timestamp_get();
71
Julius Werner12574dd2018-05-15 17:48:30 -070072 bootblock_main_with_timestamp(base_timestamp, NULL, 0);
Alexandru Gagniucff196b62016-05-16 16:17:39 -070073}
Julius Werner99f46832018-05-16 14:14:04 -070074
Julius Wernercd49cce2019-03-05 16:53:33 -080075#if CONFIG(COMPRESS_BOOTBLOCK)
Julius Werner99f46832018-05-16 14:14:04 -070076/*
77 * This is the bootblock entry point when it is run after a decompressor stage.
78 * For non-decompressor builds, _start is generally defined in architecture-
79 * specific assembly code. In decompressor builds that architecture
80 * initialization code already ran in the decompressor, so the bootblock can
81 * start straight into common code with a C environment.
82 */
83void _start(struct bootblock_arg *arg);
84void _start(struct bootblock_arg *arg)
85{
86 bootblock_main_with_timestamp(arg->base_timestamp, arg->timestamps,
87 arg->num_timestamps);
88}
89
90#endif