soc/intel/apollolake: utilize postcar phase/stage

The current Apollolake flow has its code executing out of
cache-as-ram for the pre-DRAM stages. This is different from
past platforms where they were just executing-in-place against
the memory-mapped SPI flash boot media. The implication is
that when cache-as-ram needs to be torn down one needs to be
executing out of DRAM since the act of cache-as-ram going
away means the code disappears out from under the processor.
Therefore load and use the postcar infrastructure to bootstrap
this process for tearing down cache-as-ram and subsequently
loading ramstage.

Change-Id: I856f4b992dd2609b95375767bfa4fe64a267d89e
Signed-off-by: Aaron Durbin <adurbin@chromium.org>
Reviewed-on: https://review.coreboot.org/14141
Tested-by: build bot (Jenkins)
Reviewed-by: Patrick Georgi <pgeorgi@google.com>
Reviewed-by: Furquan Shaikh <furquan@google.com>
This commit is contained in:
Aaron Durbin 2016-03-18 11:19:38 -05:00
parent 7f8afe0631
commit eebe0e0db1
7 changed files with 68 additions and 9 deletions

View File

@ -28,6 +28,7 @@ config CPU_SPECIFIC_OPTIONS
select PCIEXP_COMMON_CLOCK select PCIEXP_COMMON_CLOCK
select PCIEXP_CLK_PM select PCIEXP_CLK_PM
select PCIEXP_L1_SUB_STATE select PCIEXP_L1_SUB_STATE
select POSTCAR_STAGE
select REG_SCRIPT select REG_SCRIPT
select RELOCATABLE_RAMSTAGE # Build fails if this is not selected select RELOCATABLE_RAMSTAGE # Build fails if this is not selected
select SOC_INTEL_COMMON select SOC_INTEL_COMMON

View File

@ -37,6 +37,11 @@ ramstage-y += mmap_boot.c
ramstage-y += uart.c ramstage-y += uart.c
ramstage-y += northbridge.c ramstage-y += northbridge.c
postcar-y += exit_car.S
postcar-y += memmap.c
postcar-y += mmap_boot.c
postcar-$(CONFIG_SOC_UART_DEBUG) += uart_early.c
CPPFLAGS_common += -I$(src)/soc/intel/apollolake/include CPPFLAGS_common += -I$(src)/soc/intel/apollolake/include
endif endif

View File

@ -16,8 +16,7 @@
#include <cpu/x86/cache.h> #include <cpu/x86/cache.h>
#include <cpu/x86/cr.h> #include <cpu/x86/cr.h>
#include <cpu/x86/post_code.h> #include <cpu/x86/post_code.h>
#include <soc/cpu.h>
#define EVICT_CTL_MSR 0x2e0
.global bootblock_pre_c_entry .global bootblock_pre_c_entry
bootblock_pre_c_entry: bootblock_pre_c_entry:
@ -96,7 +95,7 @@ clear_var_mtrr:
mov %eax, %cr0 mov %eax, %cr0
/* Disable cache eviction (setup stage) */ /* Disable cache eviction (setup stage) */
mov $EVICT_CTL_MSR, %ecx mov $MSR_EVICT_CTL, %ecx
rdmsr rdmsr
or $0x1, %eax or $0x1, %eax
wrmsr wrmsr
@ -112,7 +111,7 @@ clear_var_mtrr:
post_code(0x27) post_code(0x27)
/* Disable cache eviction (run stage) */ /* Disable cache eviction (run stage) */
mov $EVICT_CTL_MSR, %ecx mov $MSR_EVICT_CTL, %ecx
rdmsr rdmsr
or $0x2, %eax or $0x2, %eax
wrmsr wrmsr

View File

@ -0,0 +1,47 @@
/*
* This file is part of the coreboot project.
*
* Copyright 2016 Google Inc.
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License as
* published by the Free Software Foundation; version 2 of
* the License.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*/
#include <cpu/x86/mtrr.h>
#include <cpu/x86/cr.h>
#include <soc/cpu.h>
.text
.global chipset_teardown_car
chipset_teardown_car:
/*
* Retrieve return address from stack as it will get trashed below if
* execution is utilizing the cache-as-ram stack.
*/
pop %ebx
/* invalidate cache contents. */
invd
/* Disable MTRRs. */
mov $(MTRR_DEF_TYPE_MSR), %ecx
rdmsr
and $(~(MTRR_DEF_TYPE_EN | MTRR_DEF_TYPE_FIX_EN)), %eax
wrmsr
/* Knock down bit 1 then bit 0 of NEM control not combining steps. */
mov $(MSR_EVICT_CTL), %ecx
rdmsr
and $(~(1 << 1)), %eax
wrmsr
and $(~(1 << 0)), %eax
wrmsr
/* Return to caller. */
jmp *%ebx

View File

@ -13,19 +13,21 @@
#ifndef _SOC_APOLLOLAKE_CPU_H_ #ifndef _SOC_APOLLOLAKE_CPU_H_
#define _SOC_APOLLOLAKE_CPU_H_ #define _SOC_APOLLOLAKE_CPU_H_
#ifndef __ASSEMBLER__
#include <cpu/x86/msr.h> #include <cpu/x86/msr.h>
#include <device/device.h> #include <device/device.h>
void apollolake_init_cpus(struct device *dev);
#endif
#define CPUID_APOLLOLAKE_A0 0x506c8 #define CPUID_APOLLOLAKE_A0 0x506c8
#define CPUID_APOLLOLAKE_B0 0x506c9 #define CPUID_APOLLOLAKE_B0 0x506c9
#define MSR_PLATFORM_INFO 0xce #define MSR_PLATFORM_INFO 0xce
#define MSR_POWER_MISC 0x120 #define MSR_POWER_MISC 0x120
#define MSR_CORE_THREAD_COUNT 0x35 #define MSR_CORE_THREAD_COUNT 0x35
#define MSR_EVICT_CTL 0x2e0
#define BASE_CLOCK_MHZ 100 #define BASE_CLOCK_MHZ 100
void apollolake_init_cpus(struct device *dev);
#endif /* _SOC_APOLLOLAKE_CPU_H_ */ #endif /* _SOC_APOLLOLAKE_CPU_H_ */

View File

@ -7,7 +7,7 @@
#define _LPSS_PCI_DEVFN(slot, func) PCI_DEVFN(LPSS_DEV_SLOT_##slot, func) #define _LPSS_PCI_DEVFN(slot, func) PCI_DEVFN(LPSS_DEV_SLOT_##slot, func)
#if ENV_RAMSTAGE #if !defined(__SIMPLE_DEVICE__)
#include <device/device.h> #include <device/device.h>
#include <device/pci_def.h> #include <device/pci_def.h>
#define _NB_DEV(slot) dev_find_slot(0, _NB_DEVFN(slot)) #define _NB_DEV(slot) dev_find_slot(0, _NB_DEVFN(slot))

View File

@ -11,6 +11,7 @@
* (at your option) any later version. * (at your option) any later version.
*/ */
#include <arch/cpu.h>
#include <arch/io.h> #include <arch/io.h>
#include <arch/symbols.h> #include <arch/symbols.h>
#include <cbfs.h> #include <cbfs.h>
@ -80,6 +81,7 @@ asmlinkage void car_stage_entry(void)
void *hob_list_ptr; void *hob_list_ptr;
struct range_entry fsp_mem; struct range_entry fsp_mem;
struct range_entry reg_car; struct range_entry reg_car;
struct postcar_frame pcf;
printk(BIOS_DEBUG, "Starting romstage...\n"); printk(BIOS_DEBUG, "Starting romstage...\n");
@ -109,7 +111,10 @@ asmlinkage void car_stage_entry(void)
/* Now that CBMEM is up, save the list so ramstage can use it */ /* Now that CBMEM is up, save the list so ramstage can use it */
fsp_save_hob_list(hob_list_ptr); fsp_save_hob_list(hob_list_ptr);
run_ramstage(); if (postcar_frame_init(&pcf, 1*KiB))
die("Unable to initialize postcar frame.\n");
run_postcar_phase(&pcf);
} }
static void fill_console_params(struct FSPM_UPD *mupd) static void fill_console_params(struct FSPM_UPD *mupd)