Revision: 17484
          http://sourceforge.net/p/edk2/code/17484
Author:   gdong1
Date:     2015-05-20 08:21:18 +0000 (Wed, 20 May 2015)
Log Message:
-----------
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 <[email protected]>
Reviewed-by: Maurice Ma <[email protected]>

Modified Paths:
--------------
    trunk/edk2/CorebootModulePkg/Include/Coreboot.h
    trunk/edk2/CorebootModulePkg/Library/CbParseLib/CbParseLib.c

Modified: trunk/edk2/CorebootModulePkg/Include/Coreboot.h
===================================================================
--- trunk/edk2/CorebootModulePkg/Include/Coreboot.h     2015-05-20 07:41:01 UTC 
(rev 17483)
+++ trunk/edk2/CorebootModulePkg/Include/Coreboot.h     2015-05-20 08:21:18 UTC 
(rev 17484)
@@ -1,7 +1,7 @@
 /** @file
   Coreboot PEI module include file.
 
-  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
@@ -51,6 +51,9 @@
 
 #define DYN_CBMEM_ALIGN_SIZE (4096)
 
+#define IMD_ENTRY_MAGIC      (~0xC0389481)
+#define CBMEM_ENTRY_MAGIC    (~0xC0389479)
+
 struct cbmem_entry {
   UINT32 magic;
   UINT32 start;
@@ -66,6 +69,22 @@
   struct cbmem_entry entries[0];
 };
 
+struct imd_entry {
+  UINT32 magic;
+  UINT32 start_offset;
+  UINT32 size;
+  UINT32 id;
+};
+
+struct imd_root {
+  UINT32 max_entries;
+  UINT32 num_entries;
+  UINT32 flags;
+  UINT32 entry_align;        
+  UINT32 max_offset;
+  struct imd_entry entries[0];
+};
+
 struct cbuint64 {
   UINT32 lo;
   UINT32 hi;

Modified: trunk/edk2/CorebootModulePkg/Library/CbParseLib/CbParseLib.c
===================================================================
--- trunk/edk2/CorebootModulePkg/Library/CbParseLib/CbParseLib.c        
2015-05-20 07:41:01 UTC (rev 17483)
+++ trunk/edk2/CorebootModulePkg/Library/CbParseLib/CbParseLib.c        
2015-05-20 08:21:18 UTC (rev 17484)
@@ -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 @@
 
 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;
     }
   }


------------------------------------------------------------------------------
One dashboard for servers and applications across Physical-Virtual-Cloud 
Widest out-of-the-box monitoring support with 50+ applications
Performance metrics, stats and reports that give you Actionable Insights
Deep dive visibility with transaction tracing using APM Insight.
http://ad.doubleclick.net/ddm/clk/290420510;117567292;y
_______________________________________________
edk2-commits mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/edk2-commits

Reply via email to