]> git.proxmox.com Git - mirror_edk2.git/blobdiff - QuarkPlatformPkg/Platform/Pei/PlatformInit/MrcWrapper.c
QuarkPlatformPkg/PlatformInit: Clear memory based on TCG MOR request
[mirror_edk2.git] / QuarkPlatformPkg / Platform / Pei / PlatformInit / MrcWrapper.c
index eee696e0e7f000dc617b11606ebfd82215f54670..70c9cf98a0b976606a09d15e71c01b13e95134b2 100644 (file)
@@ -1,7 +1,7 @@
 /** @file\r
 Framework PEIM to initialize memory on a Quark Memory Controller.\r
 \r
-Copyright (c) 2013 Intel Corporation.\r
+Copyright (c) 2013 - 2016, Intel Corporation.\r
 \r
 This program and the accompanying materials\r
 are licensed and made available under the terms and conditions of the BSD License\r
@@ -563,6 +563,8 @@ InstallEfiMemory (
   PEI_CAPSULE_PPI                       *Capsule;\r
   VOID                                  *LargeMemRangeBuf;\r
   UINTN                                 LargeMemRangeBufLen;\r
+  UINT8                                 MorControl;\r
+  UINTN                                 DataSize;\r
 \r
   //\r
   // Test the memory from 1M->TOM\r
@@ -617,6 +619,20 @@ InstallEfiMemory (
   RequiredMemSize = 0;\r
   RetriveRequiredMemorySize (PeiServices, &RequiredMemSize);\r
 \r
+  //\r
+  // Detect MOR request by the OS.\r
+  //\r
+  MorControl = 0;\r
+  DataSize = sizeof (MorControl);\r
+  Status = VariableServices->GetVariable (\r
+                               VariableServices,\r
+                               MEMORY_OVERWRITE_REQUEST_VARIABLE_NAME,\r
+                               &gEfiMemoryOverwriteControlDataGuid,\r
+                               NULL,\r
+                               &DataSize,\r
+                               &MorControl\r
+                               );\r
+\r
   PeiMemoryIndex = 0;\r
 \r
   for (Index = 0; Index < NumRanges; Index++)\r
@@ -624,6 +640,29 @@ InstallEfiMemory (
     DEBUG ((EFI_D_INFO, "Found 0x%x bytes at ", MemoryMap[Index].RangeLength));\r
     DEBUG ((EFI_D_INFO, "0x%x.\n", MemoryMap[Index].PhysicalAddress));\r
 \r
+    //\r
+    // If OS requested a memory overwrite perform it now.  Only do it for memory\r
+    // used by the OS.\r
+    //\r
+    if (MOR_CLEAR_MEMORY_VALUE (MorControl) && MemoryMap[Index].Type == DualChannelDdrMainMemory) {\r
+      DEBUG ((EFI_D_INFO, "Clear memory per MOR request.\n"));\r
+      if ((UINTN)MemoryMap[Index].RangeLength > 0) {\r
+        if ((UINTN)MemoryMap[Index].PhysicalAddress == 0) {\r
+          //\r
+          // ZeroMem() generates an ASSERT() if Buffer parameter is NULL.\r
+          // Clear byte at 0 and start clear operation at address 1.\r
+          //\r
+          *(UINT8 *)(0) = 0;\r
+          ZeroMem ((VOID *)1, (UINTN)MemoryMap[Index].RangeLength - 1);\r
+        } else {\r
+          ZeroMem (\r
+            (VOID *)(UINTN)MemoryMap[Index].PhysicalAddress,\r
+            (UINTN)MemoryMap[Index].RangeLength\r
+            );\r
+        }\r
+      }\r
+    }\r
+\r
     if ((MemoryMap[Index].Type == DualChannelDdrMainMemory) &&\r
         (MemoryMap[Index].PhysicalAddress + MemoryMap[Index].RangeLength < MAX_ADDRESS) &&\r
         (MemoryMap[Index].PhysicalAddress >= PeiMemoryBaseAddress) &&\r