amd/pi: Add AgesaHeapRebase callout
Implement an optional callout for AgesaHeapRebase which allows AGESA to override any internal hardcoded heap addresses. Designate a region in CAR that may be used for pre-mem heap and return that address before DRAM is configured. After DRAM is up, the address in cbmem is returned. TEST=Boot grunt with patchstack and experimental blob BUG=b:74518368 Change-Id: Ieda202a6064302b21707bd7ddfabc132cd85ed45 Signed-off-by: Marshall Dawson <marshalldawson3rd@gmail.com> Reviewed-on: https://review.coreboot.org/25458 Tested-by: build bot (Jenkins) <no-reply@coreboot.org> Reviewed-by: Martin Roth <martinroth@google.com>
This commit is contained in:
		
				
					committed by
					
						 Martin Roth
						Martin Roth
					
				
			
			
				
	
			
			
			
						parent
						
							10b52e0f22
						
					
				
				
					commit
					c150a57d29
				
			| @@ -34,6 +34,7 @@ typedef struct _BIOS_BUFFER_NODE { | ||||
| } BIOS_BUFFER_NODE; | ||||
|  | ||||
| AGESA_STATUS agesa_GetTempHeapBase(UINT32 Func, UINTN Data, VOID *ConfigPtr); | ||||
| AGESA_STATUS agesa_HeapRebase(UINT32 Func, UINTN Data, VOID *ConfigPtr); | ||||
|  | ||||
| AGESA_STATUS agesa_AllocateBuffer(UINT32 Func, UINTN Data, VOID *ConfigPtr); | ||||
| AGESA_STATUS agesa_DeallocateBuffer(UINT32 Func, UINTN Data, VOID *ConfigPtr); | ||||
|   | ||||
| @@ -7,6 +7,14 @@ config SOC_AMD_COMMON_BLOCK_PI | ||||
|  | ||||
| if SOC_AMD_COMMON_BLOCK_PI | ||||
|  | ||||
| config PI_AGESA_CAR_HEAP_BASE | ||||
| 	hex | ||||
| 	default 0x400000 | ||||
| 	help | ||||
| 	  The AGESA PI blob may be built to allow an optional callout for | ||||
| 	  AgesaHeapRebase.  If AGESA calls AgesaHeapRebase, this option | ||||
| 	  determines the location of the heap prior to DRAM availability. | ||||
|  | ||||
| config PI_AGESA_TEMP_RAM_BASE | ||||
| 	hex | ||||
| 	default 0x100000 | ||||
|   | ||||
| @@ -31,6 +31,7 @@ const BIOS_CALLOUT_STRUCT BiosCallouts[] = { | ||||
| 	{ AGESA_DO_RESET,                 agesa_Reset }, | ||||
| 	{ AGESA_FCH_OEM_CALLOUT,          agesa_fch_initreset }, | ||||
| 	{ AGESA_HALT_THIS_AP,             agesa_HaltThisAp }, | ||||
| 	{ AGESA_HEAP_REBASE,              agesa_HeapRebase }, | ||||
| 	{ AGESA_GNB_PCIE_SLOT_RESET,      agesa_PcieSlotResetControl } | ||||
| }; | ||||
| #else | ||||
| @@ -46,6 +47,7 @@ const BIOS_CALLOUT_STRUCT BiosCallouts[] = { | ||||
| 	{ AGESA_READ_SPD,                 agesa_ReadSpd }, | ||||
| 	{ AGESA_GNB_PCIE_SLOT_RESET,      agesa_PcieSlotResetControl }, | ||||
| 	{ AGESA_GET_TEMP_HEAP_BASE,       agesa_GetTempHeapBase }, | ||||
| 	{ AGESA_HEAP_REBASE,              agesa_HeapRebase }, | ||||
| #if ENV_RAMSTAGE | ||||
| 	{ AGESA_RUNFUNC_ONAP,             agesa_RunFuncOnAp }, | ||||
| 	{ AGESA_RUNFUNC_ON_ALL_APS,       agesa_RunFcnOnAllAps }, | ||||
|   | ||||
| @@ -55,6 +55,39 @@ AGESA_STATUS agesa_GetTempHeapBase(UINT32 Func, UINTN Data, VOID *ConfigPtr) | ||||
| 	return AGESA_SUCCESS; | ||||
| } | ||||
|  | ||||
| /* | ||||
|  * Name			agesa_HeapRebase | ||||
|  * Brief description	AGESA may use internal hardcoded locations for its | ||||
|  *			heap.  Modern implementations allow the base to be | ||||
|  *			overridden by calling agesa_HeapRebase. | ||||
|  * Input parameters | ||||
|  *	Func		Unused | ||||
|  *	Data		Unused | ||||
|  *	ConfigPtr	Pointer to type AGESA_REBASE_PARAMS | ||||
|  * Output parameters | ||||
|  *	Status		Indicates whether HeapAddress was successfully | ||||
|  *			set. | ||||
|  */ | ||||
| AGESA_STATUS agesa_HeapRebase(UINT32 Func, UINTN Data, VOID *ConfigPtr) | ||||
| { | ||||
| 	AGESA_REBASE_PARAMS *Rebase; | ||||
|  | ||||
| 	Rebase = (AGESA_REBASE_PARAMS *)ConfigPtr; | ||||
| 	if (ENV_BOOTBLOCK) { | ||||
| 		Rebase->HeapAddress = CONFIG_PI_AGESA_CAR_HEAP_BASE; | ||||
| 	} else { | ||||
| 		/* | ||||
| 		 * todo: remove the if() above and keep the assignment here | ||||
| 		 * once all AGESA functions are removed from bootblock. | ||||
| 		 */ | ||||
| 		Rebase->HeapAddress = (UINTN)agesa_heap_base(); | ||||
| 		if (!Rebase->HeapAddress) | ||||
| 			Rebase->HeapAddress = CONFIG_PI_AGESA_CAR_HEAP_BASE; | ||||
| 	} | ||||
|  | ||||
| 	return AGESA_SUCCESS; | ||||
| } | ||||
|  | ||||
| /* | ||||
|  * Name			FindAllocatedNode | ||||
|  * Brief description	Find an allocated node that matches the handle. | ||||
|   | ||||
		Reference in New Issue
	
	Block a user