15 #define BIOS_HEAP_SIZE 0x30000
16 #define BIOS_HEAP_START_ADDRESS 0x010000000
18 #if CONFIG(HAVE_ACPI_RESUME) && (HIGH_MEMORY_SCRATCH < BIOS_HEAP_SIZE)
19 #error Increase HIGH_MEMORY_SCRATCH allocation
45 #if defined(HEAP_CALLOUT_RUNTIME) && ENV_RAMSTAGE
47 #define AGESA_RUNTIME_SIZE 4096
48 static AGESA_STATUS alloc_cbmem(AGESA_BUFFER_PARAMS *AllocParams)
50 static unsigned int used = 0;
53 if ((AGESA_RUNTIME_SIZE - used) < AllocParams->BufferLength) {
54 return AGESA_BOUNDS_CHK;
61 return AGESA_BOUNDS_CHK;
64 AllocParams->BufferPointer = p + used;
65 used += AllocParams->BufferLength;
82 AGESA_BUFFER_PARAMS *AllocParams)
84 UINT32 AvailableHeapSize;
85 UINT8 *BiosHeapBaseAddr = (
void *)BiosHeapBasePtr;
86 UINT32 CurrNodeOffset;
87 UINT32 PrevNodeOffset;
88 UINT32 FreedNodeOffset;
89 UINT32 BestFitNodeOffset;
90 UINT32 BestFitPrevNodeOffset;
91 UINT32 NextFreeOffset;
98 AllocParams->BufferPointer =
NULL;
106 CurrNodePtr->
BufferSize = AllocParams->BufferLength;
108 AllocParams->BufferPointer = (UINT8 *) CurrNodePtr +
sizeof(
BIOS_BUFFER_NODE);
114 - (FreedNodeOffset - CurrNodeOffset)
128 while (CurrNodeOffset != 0) {
130 if (CurrNodePtr->
BufferHandle == AllocParams->BufferHandle) {
131 return AGESA_BOUNDS_CHK;
140 PrevNodeOffset = FreedNodeOffset;
141 BestFitNodeOffset = 0;
142 BestFitPrevNodeOffset = 0;
143 while (FreedNodeOffset != 0) {
146 if (BestFitNodeOffset == 0) {
148 BestFitNodeOffset = FreedNodeOffset;
149 BestFitPrevNodeOffset = PrevNodeOffset;
152 BestFitNodePtr = (
BIOS_BUFFER_NODE *) (BiosHeapBaseAddr + BestFitNodeOffset);
154 BestFitNodeOffset = FreedNodeOffset;
155 BestFitPrevNodeOffset = PrevNodeOffset;
159 PrevNodeOffset = FreedNodeOffset;
163 if (BestFitNodeOffset == 0) {
167 return AGESA_BOUNDS_CHK;
169 BestFitNodePtr = (
BIOS_BUFFER_NODE *) (BiosHeapBaseAddr + BestFitNodeOffset);
170 BestFitPrevNodePtr = (
BIOS_BUFFER_NODE *) (BiosHeapBaseAddr + BestFitPrevNodeOffset);
174 NextFreeOffset = BestFitNodeOffset + AllocParams->BufferLength +
sizeof(
BIOS_BUFFER_NODE);
195 BestFitNodePtr->
BufferSize = AllocParams->BufferLength;
196 BestFitNodePtr->
BufferHandle = AllocParams->BufferHandle;
200 AllocParams->BufferPointer = (UINT8 *) BestFitNodePtr +
sizeof(
BIOS_BUFFER_NODE);
208 AGESA_BUFFER_PARAMS *AllocParams)
210 UINT8 *BiosHeapBaseAddr = (
void *)BiosHeapBasePtr;
211 UINT32 AllocNodeOffset;
212 UINT32 PrevNodeOffset;
213 UINT32 NextNodeOffset;
214 UINT32 FreedNodeOffset;
215 UINT32 EndNodeOffset;
226 PrevNodeOffset = AllocNodeOffset;
228 while (AllocNodePtr->
BufferHandle != AllocParams->BufferHandle) {
230 return AGESA_BOUNDS_CHK;
232 PrevNodeOffset = AllocNodeOffset;
249 EndNodeOffset = AllocNodeOffset + AllocNodePtr->
BufferSize +
252 if (AllocNodeOffset < FreedNodeOffset) {
254 if (EndNodeOffset == FreedNodeOffset) {
261 memset((UINT8 *)FreedNodePtr, 0,
276 NextNodeOffset = FreedNodeOffset;
277 NextNodePtr = FreedNodePtr;
278 while (AllocNodeOffset > NextNodeOffset) {
279 PrevNodeOffset = NextNodeOffset;
290 if (NextNodeOffset == EndNodeOffset) {
297 memset((UINT8 *)NextNodePtr, 0,
307 EndNodeOffset = PrevNodeOffset + PrevNodePtr->
BufferSize +
309 if (AllocNodeOffset == EndNodeOffset) {
315 memset((UINT8 *)AllocNodePtr, 0,
325 AGESA_BUFFER_PARAMS *AllocParams)
327 UINT32 AllocNodeOffset;
328 UINT8 *BiosHeapBaseAddr = (
void *)BiosHeapBasePtr;
334 while (AllocParams->BufferHandle != AllocNodePtr->
BufferHandle) {
336 AllocParams->BufferPointer =
NULL;
337 AllocParams->BufferLength = 0;
338 return AGESA_BOUNDS_CHK;
345 AllocParams->BufferPointer = (UINT8 *) ((UINT8 *) AllocNodePtr +
sizeof(
BIOS_BUFFER_NODE));
346 AllocParams->BufferLength = AllocNodePtr->
BufferSize;
354 AGESA_BUFFER_PARAMS *AllocParams = ConfigPtr;
356 #if defined(HEAP_CALLOUT_RUNTIME) && ENV_RAMSTAGE
357 if (Func == AGESA_ALLOCATE_BUFFER && Data == HEAP_CALLOUT_RUNTIME)
358 return alloc_cbmem(AllocParams);
362 if (Func == AGESA_LOCATE_BUFFER)
364 else if (Func == AGESA_ALLOCATE_BUFFER)
366 else if (Func == AGESA_DEALLOCATE_BUFFER)
unsigned int AGESA_STATUS
#define AGESA_UNSUPPORTED
static int acpi_is_wakeup_s3(void)
void * memset(void *dstpp, int c, size_t len)
void * cbmem_add(u32 id, u64 size)
void * cbmem_find(u32 id)
#define CBMEM_ID_RESUME_SCRATCH
#define CBMEM_ID_AGESA_RUNTIME
#define printk(level,...)
#define BIOS_HEAP_START_ADDRESS
static AGESA_STATUS agesa_DeallocateBuffer(BIOS_HEAP_MANAGER *BiosHeapBasePtr, AGESA_BUFFER_PARAMS *AllocParams)
static AGESA_STATUS agesa_AllocateBuffer(BIOS_HEAP_MANAGER *BiosHeapBasePtr, AGESA_BUFFER_PARAMS *AllocParams)
struct _BIOS_BUFFER_NODE BIOS_BUFFER_NODE
AGESA_STATUS HeapManagerCallout(UINT32 Func, UINTN Data, VOID *ConfigPtr)
struct _BIOS_HEAP_MANAGER BIOS_HEAP_MANAGER
static AGESA_STATUS agesa_LocateBuffer(BIOS_HEAP_MANAGER *BiosHeapBasePtr, AGESA_BUFFER_PARAMS *AllocParams)
#define BIOS_DEBUG
BIOS_DEBUG - Verbose output.
UINT32 StartOfAllocatedNodes