83bd46e5e5
Bounce buffers used to be used in those cases where the payload might overlap coreboot. Bounce buffers are a problem for rampayloads as they need malloc. They are also an artifact of our x86 past before we had relocatable ramstage; only x86, out of the 5 architectures we support, needs them; currently they only seem to matter on the following chipsets: src/northbridge/amd/amdfam10/Kconfig src/northbridge/amd/lx/Kconfig src/northbridge/via/vx900/Kconfig src/soc/intel/fsp_baytrail/Kconfig src/soc/intel/fsp_broadwell_de/Kconfig The first three are obsolete or at least could be changed to avoid the need to have bounce buffers. The last two should change to no longer need them. In any event they can be fixed or pegged to a release which supports them. For these five chipsets we change CONFIG_RAMBASE from 0x100000 (the value needed in 1999 for the 32-bit Linux kernel, the original ramstage) to 0xe00000 (14 Mib) which will put the non-relocatable x86 ramstage out of the way of any reasonable payload until we can get rid of it for good. 14 MiB was chosen after some discussion, but it does fit well: o Fits in the 16 MiB cacheable range coreboot sets up by default o Most small payloads are well under 14 MiB (even kernels!) o Most large payloads get loaded at 16 MiB (especially kernels!) With this change in place coreboot correctly still loads a bzImage payload. Werner reports that the 0xe00000 setting works on his broadwell systems. Change-Id: I602feb32f35e8af1d0dc4ea9f25464872c9b824c Signed-off-by: Ronald G. Minnich <rminnich@gmail.com> Reviewed-on: https://review.coreboot.org/28647 Tested-by: build bot (Jenkins) <no-reply@coreboot.org> Reviewed-by: Aaron Durbin <adurbin@chromium.org>
103 lines
3.8 KiB
C
103 lines
3.8 KiB
C
/*
|
|
* This file is part of the coreboot project.
|
|
*
|
|
* Copyright (C) 2014 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.
|
|
*/
|
|
|
|
#ifndef BOOTMEM_H
|
|
#define BOOTMEM_H
|
|
|
|
#include <memrange.h>
|
|
#include <stdint.h>
|
|
#include <boot/coreboot_tables.h>
|
|
|
|
/**
|
|
* Bootmem types match to LB_MEM tags, except for the following:
|
|
* BM_MEM_RAMSTAGE : Memory where any kind of boot firmware resides and that
|
|
* should not be touched by bootmem (by example: stack,
|
|
* TTB, program, ...).
|
|
* BM_MEM_PAYLOAD : Memory where any kind of payload resides and that should
|
|
* not be touched by bootmem.
|
|
* Start at 0x10000 to make sure that the caller doesn't provide LB_MEM tags.
|
|
*/
|
|
enum bootmem_type {
|
|
BM_MEM_FIRST = 0x10000, /* First entry in this list */
|
|
BM_MEM_RAM, /* Memory anyone can use */
|
|
BM_MEM_RESERVED, /* Don't use this memory region */
|
|
BM_MEM_ACPI, /* ACPI Tables */
|
|
BM_MEM_NVS, /* ACPI NVS Memory */
|
|
BM_MEM_UNUSABLE, /* Unusable address space */
|
|
BM_MEM_VENDOR_RSVD, /* Vendor Reserved */
|
|
BM_MEM_TABLE, /* Ram configuration tables are kept in */
|
|
/* Tags below this point are ignored for the OS table. */
|
|
BM_MEM_OS_CUTOFF = BM_MEM_TABLE,
|
|
BM_MEM_RAMSTAGE,
|
|
BM_MEM_PAYLOAD,
|
|
BM_MEM_LAST, /* Last entry in this list */
|
|
};
|
|
|
|
/**
|
|
* Write memory coreboot table. Current resource map is serialized into
|
|
* memtable (LB_MEM_* types). bootmem library is unusable until this function
|
|
* is called first in the write tables path before payload is loaded.
|
|
*
|
|
* Bootmem types match to LB_MEM tags, except for the following:
|
|
* BM_MEM_RAMSTAGE : Translates to LB_MEM_RAM.
|
|
* BM_MEM_PAYLOAD : Translates to LB_MEM_RAM.
|
|
*/
|
|
void bootmem_write_memory_table(struct lb_memory *mem);
|
|
|
|
/* Architecture hook to add bootmem areas the architecture controls when
|
|
* bootmem_write_memory_table() is called. */
|
|
void bootmem_arch_add_ranges(void);
|
|
|
|
/* Platform hook to add bootmem areas the platform / board controls. */
|
|
void bootmem_platform_add_ranges(void);
|
|
|
|
/* Add a range of a given type to the bootmem address space. */
|
|
void bootmem_add_range(uint64_t start, uint64_t size,
|
|
const enum bootmem_type tag);
|
|
|
|
/* Print current range map of boot memory. */
|
|
void bootmem_dump_ranges(void);
|
|
|
|
typedef bool (*range_action_t)(const struct range_entry *r, void *arg);
|
|
|
|
/**
|
|
* Walk memory tables from OS point of view and call the provided function,
|
|
* for every region. The caller has to return false to break out of the loop any
|
|
* time, or return true to continue.
|
|
*
|
|
* @param action The function to call for each memory range.
|
|
* @param arg Pointer passed to function @action. Set to NULL if unused.
|
|
* @return true if the function 'action' returned false.
|
|
*/
|
|
bool bootmem_walk_os_mem(range_action_t action, void *arg);
|
|
|
|
/**
|
|
* Walk memory tables and call the provided function, for every region.
|
|
* The caller has to return false to break out of the loop any time, or
|
|
* return true to continue.
|
|
*
|
|
* @param action The function to call for each memory range.
|
|
* @param arg Pointer passed to function @action. Set to NULL if unused.
|
|
* @return true if the function 'action' returned false.
|
|
*/
|
|
bool bootmem_walk(range_action_t action, void *arg);
|
|
|
|
/* Return 1 if region targets usable RAM, 0 otherwise. */
|
|
int bootmem_region_targets_usable_ram(uint64_t start, uint64_t size);
|
|
|
|
/* Allocate a temporary buffer from the unused RAM areas. */
|
|
void *bootmem_allocate_buffer(size_t size);
|
|
|
|
#endif /* BOOTMEM_H */
|