cpu/amd/car: Move AP stacks below the BSP stack to free up space
Caching SPD data during startup requires additional CAR space. There was a large chunk of free space between the AP stack top and the BSP stack bottom; moving the AP stacks below the BSP stack allows this space to be utilized. TEST: Booted ASUS KGPE-D16 with dual Opteron 6129 processors (16 cores) and 120k of CAR. Change-Id: I370ff368affde7061d6547527bda058b9016e977 Signed-off-by: Timothy Pearson <tpearson@raptorengineeringinc.com> Reviewed-on: http://review.coreboot.org/10404 Reviewed-by: Aaron Durbin <adurbin@chromium.org> Tested-by: build bot (Jenkins) Tested-by: Raptor Engineering Automated Test Stand <noreply@raptorengineeringinc.com>
This commit is contained in:
parent
a97e0075a2
commit
fb39f82116
|
@ -19,6 +19,9 @@ config DCACHE_RAM_SIZE
|
||||||
config DCACHE_BSP_STACK_SIZE
|
config DCACHE_BSP_STACK_SIZE
|
||||||
hex
|
hex
|
||||||
|
|
||||||
|
config DCACHE_BSP_STACK_SLUSH
|
||||||
|
hex
|
||||||
|
|
||||||
config DCACHE_AP_STACK_SIZE
|
config DCACHE_AP_STACK_SIZE
|
||||||
hex
|
hex
|
||||||
|
|
||||||
|
|
|
@ -26,6 +26,7 @@
|
||||||
#define CacheSize CONFIG_DCACHE_RAM_SIZE
|
#define CacheSize CONFIG_DCACHE_RAM_SIZE
|
||||||
#define CacheBase (0xd0000 - CacheSize)
|
#define CacheBase (0xd0000 - CacheSize)
|
||||||
#define CacheSizeBSPStack CONFIG_DCACHE_BSP_STACK_SIZE
|
#define CacheSizeBSPStack CONFIG_DCACHE_BSP_STACK_SIZE
|
||||||
|
#define CacheSizeBSPSlush CONFIG_DCACHE_BSP_STACK_SLUSH
|
||||||
|
|
||||||
/* For CAR with Fam10h. */
|
/* For CAR with Fam10h. */
|
||||||
#define CacheSizeAPStack CONFIG_DCACHE_AP_STACK_SIZE
|
#define CacheSizeAPStack CONFIG_DCACHE_AP_STACK_SIZE
|
||||||
|
@ -377,9 +378,17 @@ CAR_FAM10_ap:
|
||||||
/*
|
/*
|
||||||
* Need to set stack pointer for AP.
|
* Need to set stack pointer for AP.
|
||||||
* It will be from:
|
* It will be from:
|
||||||
* CacheBase + CacheSize / 2
|
* CacheBase + (CacheSize - (CacheSizeBSPStack + CacheSizeBSPSlush))
|
||||||
* - (NodeID << CoreIDbits + CoreID) * CacheSizeAPStack
|
* - (NodeID << CoreIDbits + CoreID) * CacheSizeAPStack
|
||||||
* So need to get the NodeID and CoreID at first.
|
* The spacing between the BSP stack and the top of the AP
|
||||||
|
* stacks is purposefully set larger (an extra CacheSizeBSPSlush
|
||||||
|
* worth of unused space) than necessary to aid debugging when
|
||||||
|
* additional stack variables are added by future developers.
|
||||||
|
* The extra space will allow BSP overruns to be caught by
|
||||||
|
* the warning logic and easily fixed instead of crashing the
|
||||||
|
* system with no obvious clues of what went wrong.
|
||||||
|
*
|
||||||
|
* So, need to get the NodeID and CoreID at first.
|
||||||
* If NB_CFG bit 54 is set just use initial APIC ID, otherwise need
|
* If NB_CFG bit 54 is set just use initial APIC ID, otherwise need
|
||||||
* to reverse it.
|
* to reverse it.
|
||||||
*/
|
*/
|
||||||
|
@ -411,7 +420,7 @@ roll_cfg:
|
||||||
/* Calculate stack pointer. */
|
/* Calculate stack pointer. */
|
||||||
movl $CacheSizeAPStack, %eax
|
movl $CacheSizeAPStack, %eax
|
||||||
mull %ebx
|
mull %ebx
|
||||||
movl $(CacheBase + CacheSize / 2), %esp
|
movl $(CacheBase + (CacheSize - (CacheSizeBSPStack + CacheSizeBSPSlush))), %esp
|
||||||
subl %eax, %esp
|
subl %eax, %esp
|
||||||
|
|
||||||
/* Retrive init detected. */
|
/* Retrive init detected. */
|
||||||
|
|
|
@ -41,6 +41,10 @@ config DCACHE_BSP_STACK_SIZE
|
||||||
hex
|
hex
|
||||||
default 0x1000
|
default 0x1000
|
||||||
|
|
||||||
|
config DCACHE_BSP_STACK_SLUSH
|
||||||
|
hex
|
||||||
|
default 0x1000
|
||||||
|
|
||||||
config DCACHE_AP_STACK_SIZE
|
config DCACHE_AP_STACK_SIZE
|
||||||
hex
|
hex
|
||||||
default 0x400
|
default 0x400
|
||||||
|
|
|
@ -23,6 +23,10 @@ config DCACHE_BSP_STACK_SIZE
|
||||||
hex
|
hex
|
||||||
default 0x2000
|
default 0x2000
|
||||||
|
|
||||||
|
config DCACHE_BSP_STACK_SLUSH
|
||||||
|
hex
|
||||||
|
default 0x1000
|
||||||
|
|
||||||
config DCACHE_AP_STACK_SIZE
|
config DCACHE_AP_STACK_SIZE
|
||||||
hex
|
hex
|
||||||
default 0x400
|
default 0x400
|
||||||
|
|
|
@ -34,6 +34,10 @@ config DCACHE_BSP_STACK_SIZE
|
||||||
hex
|
hex
|
||||||
default 0x2000
|
default 0x2000
|
||||||
|
|
||||||
|
config DCACHE_BSP_STACK_SLUSH
|
||||||
|
hex
|
||||||
|
default 0x1000
|
||||||
|
|
||||||
config DCACHE_AP_STACK_SIZE
|
config DCACHE_AP_STACK_SIZE
|
||||||
hex
|
hex
|
||||||
default 0x400
|
default 0x400
|
||||||
|
|
|
@ -250,8 +250,11 @@ static u32 init_cpus(u32 cpu_init_detectedx, struct sys_info *sysinfo)
|
||||||
u32 apicid;
|
u32 apicid;
|
||||||
struct node_core_id id;
|
struct node_core_id id;
|
||||||
|
|
||||||
|
/* Please refer to the calculations and explaination in cache_as_ram.inc before modifying these values */
|
||||||
uint32_t max_ap_stack_region_size = CONFIG_MAX_CPUS * CONFIG_DCACHE_AP_STACK_SIZE;
|
uint32_t max_ap_stack_region_size = CONFIG_MAX_CPUS * CONFIG_DCACHE_AP_STACK_SIZE;
|
||||||
uint32_t bsp_stack_region_lower_boundary = CONFIG_DCACHE_RAM_BASE + (CONFIG_DCACHE_RAM_SIZE / 2);
|
uint32_t max_bsp_stack_region_size = CONFIG_DCACHE_BSP_STACK_SIZE + CONFIG_DCACHE_BSP_STACK_SLUSH;
|
||||||
|
uint32_t bsp_stack_region_upper_boundary = CONFIG_DCACHE_RAM_BASE + CONFIG_DCACHE_RAM_SIZE;
|
||||||
|
uint32_t bsp_stack_region_lower_boundary = bsp_stack_region_upper_boundary - max_bsp_stack_region_size;
|
||||||
void * lower_stack_region_boundary = (void*)(bsp_stack_region_lower_boundary - max_ap_stack_region_size);
|
void * lower_stack_region_boundary = (void*)(bsp_stack_region_lower_boundary - max_ap_stack_region_size);
|
||||||
if (((void*)(sysinfo + 1)) > lower_stack_region_boundary)
|
if (((void*)(sysinfo + 1)) > lower_stack_region_boundary)
|
||||||
printk(BIOS_WARNING,
|
printk(BIOS_WARNING,
|
||||||
|
|
|
@ -24,6 +24,10 @@ config DCACHE_BSP_STACK_SIZE
|
||||||
hex
|
hex
|
||||||
default 0x2000
|
default 0x2000
|
||||||
|
|
||||||
|
config DCACHE_BSP_STACK_SLUSH
|
||||||
|
hex
|
||||||
|
default 0x1000
|
||||||
|
|
||||||
config DCACHE_AP_STACK_SIZE
|
config DCACHE_AP_STACK_SIZE
|
||||||
hex
|
hex
|
||||||
default 0x400
|
default 0x400
|
||||||
|
|
|
@ -25,6 +25,10 @@ config DCACHE_BSP_STACK_SIZE
|
||||||
hex
|
hex
|
||||||
default 0x2000
|
default 0x2000
|
||||||
|
|
||||||
|
config DCACHE_BSP_STACK_SLUSH
|
||||||
|
hex
|
||||||
|
default 0x1000
|
||||||
|
|
||||||
config DCACHE_AP_STACK_SIZE
|
config DCACHE_AP_STACK_SIZE
|
||||||
hex
|
hex
|
||||||
default 0x400
|
default 0x400
|
||||||
|
|
|
@ -35,6 +35,10 @@ config DCACHE_BSP_STACK_SIZE
|
||||||
hex
|
hex
|
||||||
default 0x2000
|
default 0x2000
|
||||||
|
|
||||||
|
config DCACHE_BSP_STACK_SLUSH
|
||||||
|
hex
|
||||||
|
default 0x1000
|
||||||
|
|
||||||
config DCACHE_AP_STACK_SIZE
|
config DCACHE_AP_STACK_SIZE
|
||||||
hex
|
hex
|
||||||
default 0x400
|
default 0x400
|
||||||
|
|
Loading…
Reference in New Issue