summaryrefslogtreecommitdiff
path: root/CorebootModulePkg/Library
diff options
context:
space:
mode:
authorGuo Dong <guo.dong@intel.com>2015-05-20 08:21:18 +0000
committergdong1 <gdong1@Edk2>2015-05-20 08:21:18 +0000
commit165c00599e498f4f7de3a1a62be6c308ca9e4da0 (patch)
tree01260ef1f6a32cd0e878012feb403e056ed3eeb6 /CorebootModulePkg/Library
parenteef538572fcb961bdf8fdabcfe8c094c3fe8708c (diff)
downloadedk2-platforms-165c00599e498f4f7de3a1a62be6c308ca9e4da0.tar.xz
CorebootModulePkg/CbParseLib: Support current Coreboot IMD
The latest coreboot use IMD (In Memory Database) to report Tables. This patch adds IMD support in UEFI payload. Contributed-under: TianoCore Contribution Agreement 1.0 Signed-off-by: Guo Dong <guo.dong@intel.com> Reviewed-by: Maurice Ma <maurice.ma@intel.com> git-svn-id: https://svn.code.sf.net/p/edk2/code/trunk/edk2@17484 6f19259b-4bc3-4df7-8a09-765794883524
Diffstat (limited to 'CorebootModulePkg/Library')
-rw-r--r--CorebootModulePkg/Library/CbParseLib/CbParseLib.c52
1 files changed, 38 insertions, 14 deletions
diff --git a/CorebootModulePkg/Library/CbParseLib/CbParseLib.c b/CorebootModulePkg/Library/CbParseLib/CbParseLib.c
index c9b39b1de3..56c8472f6c 100644
--- a/CorebootModulePkg/Library/CbParseLib/CbParseLib.c
+++ b/CorebootModulePkg/Library/CbParseLib/CbParseLib.c
@@ -2,7 +2,7 @@
This library will parse the coreboot table in memory and extract those required
information.
- Copyright (c) 2014, Intel Corporation. All rights reserved.<BR>
+ Copyright (c) 2014 - 2015, Intel Corporation. All rights reserved.<BR>
This program and the accompanying materials
are licensed and made available under the terms and conditions of the BSD License
which accompanies this distribution. The full text of the license may be found at
@@ -126,24 +126,48 @@ FindCbTag (
RETURN_STATUS
FindCbMemTable (
- struct cbmem_root *root,
- IN UINT32 TableId,
- IN VOID** pMemTable,
- IN UINT32* pMemTableSize
+ IN struct cbmem_root *Root,
+ IN UINT32 TableId,
+ OUT VOID **pMemTable,
+ OUT UINT32 *pMemTableSize
)
{
- UINTN Idx;
+ UINTN Idx;
+ BOOLEAN IsImdEntry;
+ struct cbmem_entry *Entries;
- if ((!root) || (!pMemTable))
- return RETURN_INVALID_PARAMETER;
+ if ((Root == NULL) || (pMemTable == NULL)) {
+ return RETURN_INVALID_PARAMETER;
+ }
- for (Idx = 0; Idx < root->num_entries; Idx++) {
- if (root->entries[Idx].id == TableId) {
- *pMemTable = (VOID *) (UINTN)root->entries[Idx].start;
- if (pMemTableSize)
- *pMemTableSize = root->entries[Idx].size;
+ //
+ // Check if the entry is CBMEM or IMD
+ // and handle them separately
+ //
+ Entries = Root->entries;
+ if (Entries[0].magic == CBMEM_ENTRY_MAGIC) {
+ IsImdEntry = FALSE;
+ } else {
+ Entries = (struct cbmem_entry *)((struct imd_root *)Root)->entries;
+ if (Entries[0].magic == IMD_ENTRY_MAGIC) {
+ IsImdEntry = TRUE;
+ } else {
+ return RETURN_NOT_FOUND;
+ }
+ }
+
+ for (Idx = 0; Idx < Root->num_entries; Idx++) {
+ if (Entries[Idx].id == TableId) {
+ if (IsImdEntry) {
+ *pMemTable = (VOID *) ((UINTN)Entries[Idx].start + (UINTN)Root);
+ } else {
+ *pMemTable = (VOID *) (UINTN)Entries[Idx].start;
+ }
+ if (pMemTableSize != NULL) {
+ *pMemTableSize = Entries[Idx].size;
+ }
- DEBUG ((EFI_D_ERROR, "Find CbMemTable Id 0x%x, base %p, size 0x%x\n", TableId, *pMemTable, *pMemTableSize));
+ DEBUG ((EFI_D_INFO, "Find CbMemTable Id 0x%x, base %p, size 0x%x\n", TableId, *pMemTable, *pMemTableSize));
return RETURN_SUCCESS;
}
}