[coreboot-gerrit] New patch to review for coreboot: d1b6e2e fam15tn: Add support for AGESA runtime allocation

Rudolf Marek (r.marek@assembler.cz) gerrit at coreboot.org
Mon May 27 17:05:34 CEST 2013


Rudolf Marek (r.marek at assembler.cz) just uploaded a new patch set to gerrit, which you can find at http://review.coreboot.org/3315

-gerrit

commit d1b6e2e5a373a708251ddcedc9b4ed3c2af15eb5
Author: Rudolf Marek <r.marek at assembler.cz>
Date:   Mon May 27 16:09:44 2013 +0200

    fam15tn: Add support for AGESA runtime allocation
    
    The IOMMU AGESA needs a reserved scratch space and it wants
    to allocate the stuff for runtime, provide simple
    allocator for 4KB CBMEM page.
    
    Change-Id: I53bdfcd2cd69f84fbfbc6edea53a051f516c05cc
    Signed-off-by: Rudolf Marek <r.marek at assembler.cz>
---
 src/include/cbmem.h                                |  1 +
 src/lib/cbmem_info.c                               |  1 +
 .../amd/agesa/family15tn/fam15tn_callouts.c        | 27 ++++++++++++++++++++++
 3 files changed, 29 insertions(+)

diff --git a/src/include/cbmem.h b/src/include/cbmem.h
index baec780..efb0f90 100644
--- a/src/include/cbmem.h
+++ b/src/include/cbmem.h
@@ -71,6 +71,7 @@
 #define CBMEM_ID_VBOOT_HANDOFF	0x780074f0
 #define CBMEM_ID_CAR_GLOBALS	0xcac4e6a3
 #define CBMEM_ID_NONE		0x00000000
+#define CBMEM_ID_AGESA_RUNTIME	0x41474553
 
 #ifndef __ASSEMBLER__
 #include <stdint.h>
diff --git a/src/lib/cbmem_info.c b/src/lib/cbmem_info.c
index 7031a70..65be67c 100644
--- a/src/lib/cbmem_info.c
+++ b/src/lib/cbmem_info.c
@@ -47,6 +47,7 @@ static struct cbmem_id_to_name {
 	{ CBMEM_ID_ROOT,		"CBMEM ROOT " },
 	{ CBMEM_ID_VBOOT_HANDOFF,	"VBOOT      " },
 	{ CBMEM_ID_CAR_GLOBALS,		"CAR GLOBALS" },
+	{ CBMEM_ID_AGESA_RUNTIME,	"AGESA RSVD " },
 };
 
 void cbmem_print_entry(int n, u32 id, u64 base, u64 size)
diff --git a/src/northbridge/amd/agesa/family15tn/fam15tn_callouts.c b/src/northbridge/amd/agesa/family15tn/fam15tn_callouts.c
index 59c892f..38bf975 100644
--- a/src/northbridge/amd/agesa/family15tn/fam15tn_callouts.c
+++ b/src/northbridge/amd/agesa/family15tn/fam15tn_callouts.c
@@ -26,6 +26,29 @@
 #include "cbfs.h"
 #include "dimmSpd.h"
 #include "fam15tn_callouts.h"
+#include <cbmem.h>
+
+#define AGESA_RUNTIME_SIZE 4096
+
+static AGESA_STATUS alloc_cbmem(AGESA_BUFFER_PARAMS *AllocParams) {
+	static unsigned int used = 0;
+	void *p = cbmem_find(CBMEM_ID_AGESA_RUNTIME);
+
+	if ((AGESA_RUNTIME_SIZE - used) < AllocParams->BufferLength) {
+		return AGESA_BOUNDS_CHK;
+	}
+
+	/* first time allocation */
+	if (!p) {
+		p = cbmem_add(CBMEM_ID_AGESA_RUNTIME, AGESA_RUNTIME_SIZE);
+		if (!p)
+			return AGESA_BOUNDS_CHK;
+	}
+
+	AllocParams->BufferPointer = p + used;
+	used += AllocParams->BufferLength;
+	return AGESA_SUCCESS;
+}
 
 AGESA_STATUS fam15tn_AllocateBuffer (UINT32 Func, UINT32 Data, VOID *ConfigPtr)
 {
@@ -48,6 +71,10 @@ AGESA_STATUS fam15tn_AllocateBuffer (UINT32 Func, UINT32 Data, VOID *ConfigPtr)
 	AllocParams = ((AGESA_BUFFER_PARAMS *) ConfigPtr);
 	AllocParams->BufferPointer = NULL;
 
+	/* if the allocation is for runtime use simple CBMEM data */
+	if (Data == HEAP_CALLOUT_RUNTIME)
+		return alloc_cbmem(AllocParams);
+
 	AvailableHeapSize = BIOS_HEAP_SIZE - sizeof (BIOS_HEAP_MANAGER);
 	BiosHeapBaseAddr = (UINT8 *) GetHeapBase(&(AllocParams->StdHeader));
 	BiosHeapBasePtr = (BIOS_HEAP_MANAGER *) BiosHeapBaseAddr;



More information about the coreboot-gerrit mailing list