coreboot: dynamic cbmem requirement
Dynamic cbmem is now a requirement for relocatable ramstage. This patch replaces the reserve_* fields in the romstage_handoff structure by using the dynamic cbmem library. The haswell code is not moved over in this commit, but it should be safe because there is a hard requirement for DYNAMIC_CBMEM when using a reloctable ramstage. Change-Id: I59ab4552c3ae8c2c3982df458cd81a4a9b712cc2 Signed-off-by: Aaron Durbin <adurbin@chromium.org> Reviewed-on: http://review.coreboot.org/2849 Tested-by: build bot (Jenkins) Reviewed-by: Stefan Reinauer <stefan.reinauer@coreboot.org>
This commit is contained in:
committed by
Stefan Reinauer
parent
24d1d4b472
commit
dd4a6d2357
@ -16,6 +16,7 @@
|
||||
* along with this program; if not, write to the Free Software
|
||||
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
|
||||
*/
|
||||
#include <assert.h>
|
||||
#include <stdint.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
@ -254,16 +255,22 @@ int rmodule_load(void *base, struct rmodule *module)
|
||||
return 0;
|
||||
}
|
||||
|
||||
void *rmodule_find_region_below(void *addr, size_t rmodule_size,
|
||||
void **program_start, void **rmodule_start)
|
||||
int rmodule_calc_region(unsigned int region_alignment, size_t rmodule_size,
|
||||
size_t *region_size, int *load_offset)
|
||||
{
|
||||
unsigned long ceiling;
|
||||
unsigned long program_base;
|
||||
unsigned long placement_loc;
|
||||
unsigned long program_begin;
|
||||
/* region_alignment must be a power of 2. */
|
||||
if (region_alignment & (region_alignment - 1))
|
||||
BUG();
|
||||
|
||||
ceiling = (unsigned long)addr;
|
||||
/* Place the rmodule just under the ceiling. The rmodule files
|
||||
if (region_alignment < 4096)
|
||||
region_alignment = 4096;
|
||||
|
||||
/* Sanity check rmodule_header size. The code below assumes it is less
|
||||
* than the minimum alignment required. */
|
||||
if (region_alignment < sizeof(struct rmodule_header))
|
||||
BUG();
|
||||
|
||||
/* Place the rmodule according to alignment. The rmodule files
|
||||
* themselves are packed as a header and a payload, however the rmodule
|
||||
* itself is linked along with the header. The header starts at address
|
||||
* 0. Immediately following the header in the file is the program,
|
||||
@ -273,13 +280,13 @@ void *rmodule_find_region_below(void *addr, size_t rmodule_size,
|
||||
* to place the rmodule so that the program falls on the aligned
|
||||
* address with the header just before it. Therefore, we need at least
|
||||
* a page to account for the size of the header. */
|
||||
program_base = ALIGN((ceiling - (rmodule_size + 4096)), 4096);
|
||||
*region_size = ALIGN(rmodule_size + region_alignment, 4096);
|
||||
/* The program starts immediately after the header. However,
|
||||
* it needs to be aligned to a 4KiB boundary. Therefore, adjust the
|
||||
* program location so that the program lands on a page boundary. The
|
||||
* layout looks like the following:
|
||||
*
|
||||
* +--------------------------------+ ceiling
|
||||
* +--------------------------------+ region_alignment + region_size
|
||||
* | >= 0 bytes from alignment |
|
||||
* +--------------------------------+ program end (4KiB aligned)
|
||||
* | program size |
|
||||
@ -287,14 +294,9 @@ void *rmodule_find_region_below(void *addr, size_t rmodule_size,
|
||||
* | sizeof(struct rmodule_header) |
|
||||
* +--------------------------------+ rmodule header start
|
||||
* | >= 0 bytes from alignment |
|
||||
* +--------------------------------+ program_base (4KiB aligned)
|
||||
* +--------------------------------+ region_alignment
|
||||
*/
|
||||
placement_loc = ALIGN(program_base + sizeof(struct rmodule_header),
|
||||
4096) - sizeof(struct rmodule_header);
|
||||
program_begin = placement_loc + sizeof(struct rmodule_header);
|
||||
*load_offset = region_alignment;
|
||||
|
||||
*program_start = (void *)program_begin;
|
||||
*rmodule_start = (void *)placement_loc;
|
||||
|
||||
return (void *)program_base;
|
||||
return region_alignment - sizeof(struct rmodule_header);
|
||||
}
|
||||
|
Reference in New Issue
Block a user