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 Glassint 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 Glassint checkcpu(void) 33*76d1d02fSSimon Glass { 34*76d1d02fSSimon Glass return 0; 35*76d1d02fSSimon Glass } 36*76d1d02fSSimon Glass print_cpuinfo(void)37727c1a98SSimon Glassint print_cpuinfo(void) 38727c1a98SSimon Glass { 39727c1a98SSimon Glass return default_print_cpuinfo(); 40727c1a98SSimon Glass } 41727c1a98SSimon Glass board_final_cleanup(void)421e2f7b9eSBin Mengstatic 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 Mengint 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 Glassint misc_init_r(void) 85069f5481SSimon Glass { 86069f5481SSimon Glass return 0; 87069f5481SSimon Glass } 88