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; | } BIOS_BUFFER_NODE; | ||||||
|  |  | ||||||
| AGESA_STATUS agesa_GetTempHeapBase(UINT32 Func, UINTN Data, VOID *ConfigPtr); | 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_AllocateBuffer(UINT32 Func, UINTN Data, VOID *ConfigPtr); | ||||||
| AGESA_STATUS agesa_DeallocateBuffer(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 | 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 | config PI_AGESA_TEMP_RAM_BASE | ||||||
| 	hex | 	hex | ||||||
| 	default 0x100000 | 	default 0x100000 | ||||||
|   | |||||||
| @@ -31,6 +31,7 @@ const BIOS_CALLOUT_STRUCT BiosCallouts[] = { | |||||||
| 	{ AGESA_DO_RESET,                 agesa_Reset }, | 	{ AGESA_DO_RESET,                 agesa_Reset }, | ||||||
| 	{ AGESA_FCH_OEM_CALLOUT,          agesa_fch_initreset }, | 	{ AGESA_FCH_OEM_CALLOUT,          agesa_fch_initreset }, | ||||||
| 	{ AGESA_HALT_THIS_AP,             agesa_HaltThisAp }, | 	{ AGESA_HALT_THIS_AP,             agesa_HaltThisAp }, | ||||||
|  | 	{ AGESA_HEAP_REBASE,              agesa_HeapRebase }, | ||||||
| 	{ AGESA_GNB_PCIE_SLOT_RESET,      agesa_PcieSlotResetControl } | 	{ AGESA_GNB_PCIE_SLOT_RESET,      agesa_PcieSlotResetControl } | ||||||
| }; | }; | ||||||
| #else | #else | ||||||
| @@ -46,6 +47,7 @@ const BIOS_CALLOUT_STRUCT BiosCallouts[] = { | |||||||
| 	{ AGESA_READ_SPD,                 agesa_ReadSpd }, | 	{ AGESA_READ_SPD,                 agesa_ReadSpd }, | ||||||
| 	{ AGESA_GNB_PCIE_SLOT_RESET,      agesa_PcieSlotResetControl }, | 	{ AGESA_GNB_PCIE_SLOT_RESET,      agesa_PcieSlotResetControl }, | ||||||
| 	{ AGESA_GET_TEMP_HEAP_BASE,       agesa_GetTempHeapBase }, | 	{ AGESA_GET_TEMP_HEAP_BASE,       agesa_GetTempHeapBase }, | ||||||
|  | 	{ AGESA_HEAP_REBASE,              agesa_HeapRebase }, | ||||||
| #if ENV_RAMSTAGE | #if ENV_RAMSTAGE | ||||||
| 	{ AGESA_RUNFUNC_ONAP,             agesa_RunFuncOnAp }, | 	{ AGESA_RUNFUNC_ONAP,             agesa_RunFuncOnAp }, | ||||||
| 	{ AGESA_RUNFUNC_ON_ALL_APS,       agesa_RunFcnOnAllAps }, | 	{ AGESA_RUNFUNC_ON_ALL_APS,       agesa_RunFcnOnAllAps }, | ||||||
|   | |||||||
| @@ -55,6 +55,39 @@ AGESA_STATUS agesa_GetTempHeapBase(UINT32 Func, UINTN Data, VOID *ConfigPtr) | |||||||
| 	return AGESA_SUCCESS; | 	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 |  * Name			FindAllocatedNode | ||||||
|  * Brief description	Find an allocated node that matches the handle. |  * Brief description	Find an allocated node that matches the handle. | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user