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:
Aaron Durbin
2013-02-27 22:50:12 -06:00
committed by Stefan Reinauer
parent 24d1d4b472
commit dd4a6d2357
10 changed files with 94 additions and 133 deletions

View File

@ -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);
}