xref: /rk3399_rockchip-uboot/arch/x86/cpu/coreboot/coreboot.c (revision 07d778382200a05a8b86cc135f79ec48e386f25a)
1badcb343SStefan Reinauer /*
2badcb343SStefan Reinauer  * Copyright (c) 2011 The Chromium OS Authors.
3badcb343SStefan Reinauer  * (C) Copyright 2008
4badcb343SStefan Reinauer  * Graeme Russ, graeme.russ@gmail.com.
5badcb343SStefan Reinauer  *
61a459660SWolfgang Denk  * SPDX-License-Identifier:	GPL-2.0+
7badcb343SStefan Reinauer  */
8badcb343SStefan Reinauer 
9badcb343SStefan Reinauer #include <common.h>
10f2653e8dSBin Meng #include <fdtdec.h>
11300081aaSStefan Reinauer #include <asm/io.h>
1265cdd9beSBin Meng #include <asm/msr.h>
13aff2523fSSimon Glass #include <asm/mtrr.h>
14378a8634SSimon Glass #include <asm/arch/sysinfo.h>
156dbe0cceSVadim Bendebury #include <asm/arch/timestamp.h>
16badcb343SStefan Reinauer 
17badcb343SStefan Reinauer DECLARE_GLOBAL_DATA_PTR;
18badcb343SStefan Reinauer 
arch_cpu_init(void)198b37c769SSimon Glass int arch_cpu_init(void)
20badcb343SStefan Reinauer {
21badcb343SStefan Reinauer 	int ret = get_coreboot_info(&lib_sysinfo);
228b37c769SSimon Glass 	if (ret != 0) {
23badcb343SStefan Reinauer 		printf("Failed to parse coreboot tables.\n");
248b37c769SSimon Glass 		return ret;
258b37c769SSimon Glass 	}
266dbe0cceSVadim Bendebury 
276dbe0cceSVadim Bendebury 	timestamp_init();
286dbe0cceSVadim Bendebury 
298b37c769SSimon Glass 	return x86_cpu_init_f();
30badcb343SStefan Reinauer }
31badcb343SStefan Reinauer 
checkcpu(void)32*76d1d02fSSimon Glass int checkcpu(void)
33*76d1d02fSSimon Glass {
34*76d1d02fSSimon Glass 	return 0;
35*76d1d02fSSimon Glass }
36*76d1d02fSSimon Glass 
print_cpuinfo(void)37727c1a98SSimon Glass int print_cpuinfo(void)
38727c1a98SSimon Glass {
39727c1a98SSimon Glass 	return default_print_cpuinfo();
40727c1a98SSimon Glass }
41727c1a98SSimon Glass 
board_final_cleanup(void)421e2f7b9eSBin Meng static void board_final_cleanup(void)
4317de114fSStefan Reinauer {
4465cdd9beSBin Meng 	/*
4565cdd9beSBin Meng 	 * Un-cache the ROM so the kernel has one
4617de114fSStefan Reinauer 	 * more MTRR available.
47488b8b24SDuncan Laurie 	 *
48488b8b24SDuncan Laurie 	 * Coreboot should have assigned this to the
49488b8b24SDuncan Laurie 	 * top available variable MTRR.
5017de114fSStefan Reinauer 	 */
51aff2523fSSimon Glass 	u8 top_mtrr = (native_read_msr(MTRR_CAP_MSR) & 0xff) - 1;
52aff2523fSSimon Glass 	u8 top_type = native_read_msr(MTRR_PHYS_BASE_MSR(top_mtrr)) & 0xff;
53488b8b24SDuncan Laurie 
54488b8b24SDuncan Laurie 	/* Make sure this MTRR is the correct Write-Protected type */
55aff2523fSSimon Glass 	if (top_type == MTRR_TYPE_WRPROT) {
56aff2523fSSimon Glass 		struct mtrr_state state;
57aff2523fSSimon Glass 
58aff2523fSSimon Glass 		mtrr_open(&state);
59aff2523fSSimon Glass 		wrmsrl(MTRR_PHYS_BASE_MSR(top_mtrr), 0);
60aff2523fSSimon Glass 		wrmsrl(MTRR_PHYS_MASK_MSR(top_mtrr), 0);
61aff2523fSSimon Glass 		mtrr_close(&state);
62488b8b24SDuncan Laurie 	}
6317de114fSStefan Reinauer 
64f2653e8dSBin Meng 	if (!fdtdec_get_config_bool(gd->fdt_blob, "u-boot,no-apm-finalize")) {
65f2653e8dSBin Meng 		/*
66f2653e8dSBin Meng 		 * Issue SMI to coreboot to lock down ME and registers
67f2653e8dSBin Meng 		 * when allowed via device tree
68f2653e8dSBin Meng 		 */
69f2653e8dSBin Meng 		printf("Finalizing coreboot\n");
70b83058cdSDuncan Laurie 		outb(0xcb, 0xb2);
7117de114fSStefan Reinauer 	}
72f2653e8dSBin Meng }
73c78a62acSSimon Glass 
last_stage_init(void)741e2f7b9eSBin Meng int last_stage_init(void)
751e2f7b9eSBin Meng {
761e2f7b9eSBin Meng 	if (gd->flags & GD_FLG_COLD_BOOT)
771e2f7b9eSBin Meng 		timestamp_add_to_bootstage();
781e2f7b9eSBin Meng 
791e2f7b9eSBin Meng 	board_final_cleanup();
801e2f7b9eSBin Meng 
811e2f7b9eSBin Meng 	return 0;
821e2f7b9eSBin Meng }
831e2f7b9eSBin Meng 
misc_init_r(void)84069f5481SSimon Glass int misc_init_r(void)
85069f5481SSimon Glass {
86069f5481SSimon Glass 	return 0;
87069f5481SSimon Glass }
88