This patch flips the default of CONFIG_NO_CBFS_MCACHE so the feature is enabled by default. Some older chipsets with insufficient SRAM/CAR space still have it explicitly disabled. All others get the new section added to their memlayout... 8K seems like a sane default to start with. Change-Id: I0abd1c813aece6e78fb883f292ce6c9319545c44 Signed-off-by: Julius Werner <jwerner@chromium.org> Reviewed-on: https://review.coreboot.org/c/coreboot/+/38424 Tested-by: build bot (Jenkins) <no-reply@coreboot.org> Reviewed-by: Furquan Shaikh <furquan@google.com>
127 lines
4.3 KiB
Plaintext
127 lines
4.3 KiB
Plaintext
/* SPDX-License-Identifier: GPL-2.0-only */
|
|
|
|
/* CACHE_ROM_SIZE defined here. */
|
|
#include <cpu/x86/mtrr.h>
|
|
|
|
/* This file is included inside a SECTIONS block */
|
|
. = CONFIG_DCACHE_RAM_BASE;
|
|
.car.data . (NOLOAD) : {
|
|
_car_region_start = . ;
|
|
#if CONFIG(PAGING_IN_CACHE_AS_RAM)
|
|
/* Page table pre-allocation. CONFIG_DCACHE_RAM_BASE should be 4KiB
|
|
* aligned when using this option. */
|
|
_pagetables = . ;
|
|
. += 4096 * CONFIG_NUM_CAR_PAGE_TABLE_PAGES;
|
|
_epagetables = . ;
|
|
#endif
|
|
#if CONFIG(VBOOT_STARTS_IN_BOOTBLOCK)
|
|
/* Vboot work buffer only needs to be available when verified boot
|
|
* starts in bootblock. */
|
|
VBOOT2_WORK(., 12K)
|
|
#endif
|
|
#if CONFIG(TPM_MEASURED_BOOT)
|
|
/* Vboot measured boot TCPA log measurements.
|
|
* Needs to be transferred until CBMEM is available */
|
|
TPM_TCPA_LOG(., 2K)
|
|
#endif
|
|
/* Stack for CAR stages. Since it persists across all stages that
|
|
* use CAR it can be reused. The chipset/SoC is expected to provide
|
|
* the stack size. */
|
|
_car_stack = .;
|
|
. += CONFIG_DCACHE_BSP_STACK_SIZE;
|
|
_ecar_stack = .;
|
|
/* The pre-ram cbmem console as well as the timestamp region are fixed
|
|
* in size. Therefore place them above the car global section so that
|
|
* multiple stages (romstage and verstage) have a consistent
|
|
* link address of these shared objects. */
|
|
PRERAM_CBMEM_CONSOLE(., CONFIG_PRERAM_CBMEM_CONSOLE_SIZE)
|
|
#if CONFIG(PAGING_IN_CACHE_AS_RAM)
|
|
. = ALIGN(32);
|
|
/* Page directory pointer table resides here. There are 4 8-byte entries
|
|
* totalling 32 bytes that need to be 32-byte aligned. The reason the
|
|
* pdpt are not colocated with the rest of the page tables is to reduce
|
|
* fragmentation of the CAR space that persists across stages. */
|
|
_pdpt = .;
|
|
. += 32;
|
|
_epdpt = .;
|
|
#endif
|
|
|
|
TIMESTAMP(., 0x200)
|
|
|
|
#if !CONFIG(NO_CBFS_MCACHE)
|
|
CBFS_MCACHE(., CONFIG_CBFS_MCACHE_SIZE)
|
|
#endif
|
|
#if !CONFIG(NO_FMAP_CACHE)
|
|
FMAP_CACHE(., FMAP_SIZE)
|
|
#endif
|
|
|
|
_car_ehci_dbg_info = .;
|
|
/* Reserve sizeof(struct ehci_dbg_info). */
|
|
. += 80;
|
|
_ecar_ehci_dbg_info = .;
|
|
|
|
/* _bss and _ebss provide symbols to per-stage
|
|
* variables that are not shared like the timestamp and the pre-ram
|
|
* cbmem console. This is useful for clearing this area on a per-stage
|
|
* basis when more than one stage uses cache-as-ram. */
|
|
|
|
. = ALIGN(ARCH_POINTER_ALIGN_SIZE);
|
|
_bss = .;
|
|
/* Allow global uninitialized variables for stages without CAR teardown. */
|
|
*(.bss)
|
|
*(.bss.*)
|
|
*(.sbss)
|
|
*(.sbss.*)
|
|
. = ALIGN(ARCH_POINTER_ALIGN_SIZE);
|
|
_ebss = .;
|
|
|
|
#if ENV_ROMSTAGE && CONFIG(ASAN_IN_ROMSTAGE)
|
|
_shadow_size = (_ebss - _car_region_start) >> 3;
|
|
REGION(asan_shadow, ., _shadow_size, ARCH_POINTER_ALIGN_SIZE)
|
|
#endif
|
|
_car_unallocated_start = .;
|
|
_car_region_end = . + CONFIG_DCACHE_RAM_SIZE - (. - _car_region_start);
|
|
}
|
|
. = _car_region_end;
|
|
.car.mrc_var . (NOLOAD) : {
|
|
. += CONFIG_DCACHE_RAM_MRC_VAR_SIZE;
|
|
}
|
|
|
|
#if ENV_BOOTBLOCK
|
|
_car_mtrr_end = .;
|
|
_car_mtrr_start = _car_region_start;
|
|
|
|
_car_mtrr_size = _car_mtrr_end - _car_mtrr_start;
|
|
_car_mtrr_sz_log2 = 1 << LOG2CEIL(_car_mtrr_size);
|
|
_car_mtrr_mask = ~(MAX(4096, _car_mtrr_sz_log2) - 1);
|
|
|
|
#if !CONFIG(NO_XIP_EARLY_STAGES)
|
|
_xip_program_sz_log2 = 1 << LOG2CEIL(_ebootblock - _bootblock);
|
|
_xip_mtrr_mask = ~(MAX(4096, _xip_program_sz_log2) - 1);
|
|
#endif
|
|
|
|
_rom_mtrr_mask = ~(CACHE_ROM_SIZE - 1);
|
|
_rom_mtrr_base = _rom_mtrr_mask;
|
|
#endif
|
|
|
|
/* Global variables are not allowed in romstage
|
|
* This section is checked during stage creation to ensure
|
|
* that there are no global variables present
|
|
*/
|
|
|
|
. = 0xffffff00;
|
|
.illegal_globals . : {
|
|
*(EXCLUDE_FILE ("*/libagesa.*.a:" "*/romstage*/buildOpts.o" "*/romstage*/agesawrapper.o" "*/vendorcode/amd/agesa/*" "*/vendorcode/amd/cimx/*") .data)
|
|
*(EXCLUDE_FILE ("*/libagesa.*.a:" "*/romstage*/buildOpts.o" "*/romstage*/agesawrapper.o" "*/vendorcode/amd/agesa/*" "*/vendorcode/amd/cimx/*") .data.*)
|
|
}
|
|
|
|
_bogus = ASSERT((CONFIG_DCACHE_RAM_SIZE == 0) || (SIZEOF(.car.data) <= CONFIG_DCACHE_RAM_SIZE), "Cache as RAM area is too full");
|
|
#if CONFIG(PAGING_IN_CACHE_AS_RAM)
|
|
_bogus2 = ASSERT(_pagetables == ALIGN(_pagetables, 4096), "_pagetables aren't 4KiB aligned");
|
|
#endif
|
|
_bogus3 = ASSERT(CONFIG_DCACHE_BSP_STACK_SIZE > 0x0, "BSP stack size not configured");
|
|
#if CONFIG(NO_XIP_EARLY_STAGES) && (ENV_ROMSTAGE || ENV_VERSTAGE)
|
|
_bogus4 = ASSERT(_eprogram <= _car_region_end, "Stage end too high !");
|
|
_bogus5 = ASSERT(_program >= _car_unallocated_start, "Stage start too low!");
|
|
#endif
|