blob: 94adfa134d4bdf50aff3ad4010ad2a562eb82980 [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
Angel Ponse4c8dc82021-02-07 23:40:41 +01003#include <cbmem.h>
Aaron Durbinae5d83e2013-10-24 10:21:43 -05004#include <console/console.h>
Aaron Durbin43b7db72015-03-27 20:53:30 -05005#include <console/streams.h>
Aaron Durbin8fa62832013-10-28 09:54:22 -05006#include <cpu/x86/tsc.h>
Aaron Durbin460703b2015-03-27 21:17:22 -05007#include <program_loading.h>
Aaron Durbinae5d83e2013-10-24 10:21:43 -05008#include <rmodule.h>
Aaron Durbinbd74a4b2015-03-06 23:17:33 -06009#include <stage_cache.h>
Aaron Durbinae5d83e2013-10-24 10:21:43 -050010
Julius Werner18ea2d32014-10-07 16:42:17 -070011#include <soc/ramstage.h>
12#include <soc/efi_wrapper.h>
Aaron Durbinae5d83e2013-10-24 10:21:43 -050013
14static void ABI_X86 send_to_console(unsigned char b)
15{
16 console_tx_byte(b);
17}
18
Aaron Durbin7f177592013-12-13 13:05:24 -080019static efi_wrapper_entry_t load_reference_code(void)
20{
Angel Pons67df3ff2021-01-29 18:20:11 +010021 if (resume_from_stage_cache()) {
22 struct prog prog;
23 stage_cache_load_stage(STAGE_REFCODE, &prog);
24 return prog_entry(&prog);
25 }
26
Aaron Durbinac12c66c2015-05-20 12:08:55 -050027 struct prog prog =
Aaron Durbin7e7a4df2015-12-08 14:34:35 -060028 PROG_INIT(PROG_REFCODE, CONFIG_CBFS_PREFIX "/refcode");
Aaron Durbin63fcb4a2013-12-12 10:29:48 -080029 struct rmod_stage_load refcode = {
30 .cbmem_id = CBMEM_ID_REFCODE,
Aaron Durbin460703b2015-03-27 21:17:22 -050031 .prog = &prog,
Aaron Durbin63fcb4a2013-12-12 10:29:48 -080032 };
33
Aaron Durbin899d13d2015-05-15 23:39:23 -050034 if (rmodule_stage_load(&refcode)) {
35 printk(BIOS_DEBUG, "Error loading reference code.\n");
36 return NULL;
37 }
Aaron Durbin7f177592013-12-13 13:05:24 -080038
39 /* Cache loaded reference code. */
Aaron Durbin899d13d2015-05-15 23:39:23 -050040 stage_cache_add(STAGE_REFCODE, &prog);
Aaron Durbin63fcb4a2013-12-12 10:29:48 -080041
Aaron Durbin460703b2015-03-27 21:17:22 -050042 return prog_entry(&prog);
Aaron Durbin63fcb4a2013-12-12 10:29:48 -080043}
44
Aaron Durbinae5d83e2013-10-24 10:21:43 -050045void baytrail_run_reference_code(void)
46{
47 int ret;
48 efi_wrapper_entry_t entry;
49 struct efi_wrapper_params wrp = {
50 .version = EFI_WRAPPER_VER,
51 .console_out = send_to_console,
52 };
Aaron Durbinae5d83e2013-10-24 10:21:43 -050053
Aaron Durbin7f177592013-12-13 13:05:24 -080054 entry = load_reference_code();
Aaron Durbinae5d83e2013-10-24 10:21:43 -050055
Aaron Durbin63fcb4a2013-12-12 10:29:48 -080056 if (entry == NULL)
57 return;
58
Aaron Durbin8fa62832013-10-28 09:54:22 -050059 wrp.tsc_ticks_per_microsecond = tsc_freq_mhz();
Aaron Durbinae5d83e2013-10-24 10:21:43 -050060
61 /* Call into reference code. */
62 ret = entry(&wrp);
63
64 if (ret != 0) {
65 printk(BIOS_DEBUG, "Reference code returned %d\n", ret);
66 return;
67 }
68}