blob: 4ee66756a4417cb130e70ada2d58b9903a4431e4 [file] [log] [blame]
Angel Ponsc3f58f62020-04-05 15:46:41 +02001/* SPDX-License-Identifier: GPL-2.0-only */
Aaron Durbinae5d83e2013-10-24 10:21:43 -05002
Furquan Shaikh76cedd22020-05-02 10:24:23 -07003#include <acpi/acpi.h>
Angel Ponse4c8dc82021-02-07 23:40:41 +01004#include <cbmem.h>
Aaron Durbinae5d83e2013-10-24 10:21:43 -05005#include <console/console.h>
Aaron Durbin43b7db72015-03-27 20:53:30 -05006#include <console/streams.h>
Aaron Durbin8fa62832013-10-28 09:54:22 -05007#include <cpu/x86/tsc.h>
Aaron Durbin460703b2015-03-27 21:17:22 -05008#include <program_loading.h>
Aaron Durbinae5d83e2013-10-24 10:21:43 -05009#include <rmodule.h>
Aaron Durbinbd74a4b2015-03-06 23:17:33 -060010#include <stage_cache.h>
Aaron Durbinae5d83e2013-10-24 10:21:43 -050011
Julius Werner18ea2d32014-10-07 16:42:17 -070012#include <soc/ramstage.h>
13#include <soc/efi_wrapper.h>
Aaron Durbinae5d83e2013-10-24 10:21:43 -050014
15static void ABI_X86 send_to_console(unsigned char b)
16{
17 console_tx_byte(b);
18}
19
Aaron Durbin7f177592013-12-13 13:05:24 -080020static efi_wrapper_entry_t load_reference_code(void)
21{
Angel Pons67df3ff2021-01-29 18:20:11 +010022 if (resume_from_stage_cache()) {
23 struct prog prog;
24 stage_cache_load_stage(STAGE_REFCODE, &prog);
25 return prog_entry(&prog);
26 }
27
Aaron Durbinac12c66c2015-05-20 12:08:55 -050028 struct prog prog =
Aaron Durbin7e7a4df2015-12-08 14:34:35 -060029 PROG_INIT(PROG_REFCODE, CONFIG_CBFS_PREFIX "/refcode");
Aaron Durbin63fcb4a2013-12-12 10:29:48 -080030 struct rmod_stage_load refcode = {
31 .cbmem_id = CBMEM_ID_REFCODE,
Aaron Durbin460703b2015-03-27 21:17:22 -050032 .prog = &prog,
Aaron Durbin63fcb4a2013-12-12 10:29:48 -080033 };
34
Aaron Durbin899d13d2015-05-15 23:39:23 -050035 if (rmodule_stage_load(&refcode)) {
36 printk(BIOS_DEBUG, "Error loading reference code.\n");
37 return NULL;
38 }
Aaron Durbin7f177592013-12-13 13:05:24 -080039
40 /* Cache loaded reference code. */
Aaron Durbin899d13d2015-05-15 23:39:23 -050041 stage_cache_add(STAGE_REFCODE, &prog);
Aaron Durbin63fcb4a2013-12-12 10:29:48 -080042
Aaron Durbin460703b2015-03-27 21:17:22 -050043 return prog_entry(&prog);
Aaron Durbin63fcb4a2013-12-12 10:29:48 -080044}
45
Aaron Durbinae5d83e2013-10-24 10:21:43 -050046void baytrail_run_reference_code(void)
47{
48 int ret;
49 efi_wrapper_entry_t entry;
50 struct efi_wrapper_params wrp = {
51 .version = EFI_WRAPPER_VER,
52 .console_out = send_to_console,
53 };
Aaron Durbinae5d83e2013-10-24 10:21:43 -050054
Aaron Durbin7f177592013-12-13 13:05:24 -080055 entry = load_reference_code();
Aaron Durbinae5d83e2013-10-24 10:21:43 -050056
Aaron Durbin63fcb4a2013-12-12 10:29:48 -080057 if (entry == NULL)
58 return;
59
Aaron Durbin8fa62832013-10-28 09:54:22 -050060 wrp.tsc_ticks_per_microsecond = tsc_freq_mhz();
Aaron Durbinae5d83e2013-10-24 10:21:43 -050061
62 /* Call into reference code. */
63 ret = entry(&wrp);
64
65 if (ret != 0) {
66 printk(BIOS_DEBUG, "Reference code returned %d\n", ret);
67 return;
68 }
69}