postcar_loader: Support LATE_CBMEM_INIT boards

Create postcar_frame object without placing stack in CBMEM.
This way same cache_as_ram.inc code can be used unmodified.

Change-Id: Ic5ed404ce268ee881e9893dd434534231aa2bc88
Signed-off-by: Kyösti Mälkki <kyosti.malkki@gmail.com>
Reviewed-on: https://review.coreboot.org/17700
Tested-by: build bot (Jenkins)
Reviewed-by: Aaron Durbin <adurbin@chromium.org>
This commit is contained in:
Kyösti Mälkki 2016-12-02 19:47:07 +02:00
parent b84c833bfd
commit 029cebc7cd
2 changed files with 26 additions and 10 deletions

View File

@ -270,6 +270,11 @@ struct postcar_frame {
*/
int postcar_frame_init(struct postcar_frame *pcf, size_t stack_size);
/*
* Initialize postcar_frame object with a fixed stacktop in low memory.
*/
void postcar_frame_init_lowmem(struct postcar_frame *pcf);
/*
* Add variable MTRR covering the provided range with MTRR type.
*/

View File

@ -33,12 +33,19 @@ static inline void stack_push(struct postcar_frame *pcf, uint32_t val)
*ptr = val;
}
static void postcar_frame_prepare(struct postcar_frame *pcf)
{
msr_t msr;
msr = rdmsr(MTRR_CAP_MSR);
pcf->upper_mask = (1 << (cpu_phys_address_size() - 32)) - 1;
pcf->max_var_mttrs = msr.lo & MTRR_CAP_VCNT;
pcf->num_var_mttrs = 0;
}
int postcar_frame_init(struct postcar_frame *pcf, size_t stack_size)
{
void *stack;
msr_t msr;
msr = rdmsr(MTRR_CAP_MSR);
stack = cbmem_add(CBMEM_ID_ROMSTAGE_RAM_STACK, stack_size);
if (stack == NULL) {
@ -47,18 +54,22 @@ int postcar_frame_init(struct postcar_frame *pcf, size_t stack_size)
return -1;
}
postcar_frame_prepare(pcf);
pcf->stack = (uintptr_t)stack;
pcf->stack += stack_size;
pcf->upper_mask = (1 << (cpu_phys_address_size() - 32)) - 1;
pcf->max_var_mttrs = msr.lo & MTRR_CAP_VCNT;
pcf->num_var_mttrs = 0;
return 0;
}
/*
* For use with LATE_CBMEM_INIT boards only, with a fixed stacktop in
* low memory.
*/
void postcar_frame_init_lowmem(struct postcar_frame *pcf)
{
postcar_frame_prepare(pcf);
pcf->stack = CONFIG_RAMTOP;
}
void postcar_frame_add_mtrr(struct postcar_frame *pcf,
uintptr_t addr, size_t size, int type)
{