/** @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
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
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
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