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:
@ -270,6 +270,11 @@ struct postcar_frame {
|
|||||||
*/
|
*/
|
||||||
int postcar_frame_init(struct postcar_frame *pcf, size_t stack_size);
|
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.
|
* Add variable MTRR covering the provided range with MTRR type.
|
||||||
*/
|
*/
|
||||||
|
@ -33,12 +33,19 @@ static inline void stack_push(struct postcar_frame *pcf, uint32_t val)
|
|||||||
*ptr = 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)
|
int postcar_frame_init(struct postcar_frame *pcf, size_t stack_size)
|
||||||
{
|
{
|
||||||
void *stack;
|
void *stack;
|
||||||
msr_t msr;
|
|
||||||
|
|
||||||
msr = rdmsr(MTRR_CAP_MSR);
|
|
||||||
|
|
||||||
stack = cbmem_add(CBMEM_ID_ROMSTAGE_RAM_STACK, stack_size);
|
stack = cbmem_add(CBMEM_ID_ROMSTAGE_RAM_STACK, stack_size);
|
||||||
if (stack == NULL) {
|
if (stack == NULL) {
|
||||||
@ -47,18 +54,22 @@ int postcar_frame_init(struct postcar_frame *pcf, size_t stack_size)
|
|||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
postcar_frame_prepare(pcf);
|
||||||
pcf->stack = (uintptr_t)stack;
|
pcf->stack = (uintptr_t)stack;
|
||||||
pcf->stack += stack_size;
|
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;
|
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,
|
void postcar_frame_add_mtrr(struct postcar_frame *pcf,
|
||||||
uintptr_t addr, size_t size, int type)
|
uintptr_t addr, size_t size, int type)
|
||||||
{
|
{
|
||||||
|
Reference in New Issue
Block a user