Home | History | Annotate | Download | only in SaveMemoryConfig
      1 /**
      2   Copyright (c) 2009 - 2013, Intel Corporation. All rights reserved.<BR>
      3   This program and the accompanying materials
      4   are licensed and made available under the terms and conditions of the BSD License
      5   which accompanies this distribution.  The full text of the license may be found at
      6   http://opensource.org/licenses/bsd-license.php
      7 
      8   THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
      9   WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
     10 
     11 
     12 Module Name:
     13 
     14   SaveMemoryConfig.c
     15 
     16 Abstract:
     17   This is the driver that locates the MemoryConfigurationData HOB, if it
     18   exists, and saves the data to nvRAM.
     19 
     20 
     21 
     22 --*/
     23 
     24 #include "SaveMemoryConfig.h"
     25 
     26 CHAR16    EfiMemoryConfigVariable[] = L"MemoryConfig";
     27 
     28 
     29 EFI_STATUS
     30 EFIAPI
     31 SaveMemoryConfigEntryPoint (
     32   IN EFI_HANDLE         ImageHandle,
     33   IN EFI_SYSTEM_TABLE   *SystemTable
     34   )
     35 /*++
     36 
     37   Routine Description:
     38     This is the standard EFI driver point that detects whether there is a
     39     MemoryConfigurationData HOB and, if so, saves its data to nvRAM.
     40 
     41   Arguments:
     42     ImageHandle   - Handle for the image of this driver
     43     SystemTable   - Pointer to the EFI System Table
     44 
     45   Returns:
     46     EFI_SUCCESS   - if the data is successfully saved or there was no data
     47     EFI_NOT_FOUND - if the HOB list could not be located.
     48     EFI_UNLOAD_IMAGE - It is not success
     49 
     50 --*/
     51 {
     52   EFI_STATUS                      Status=EFI_SUCCESS;
     53   VOID                            *MemHobData;
     54   VOID                            *VariableData;
     55   UINTN                           BufferSize;
     56   BOOLEAN                         MfgMode;
     57   EFI_PLATFORM_SETUP_ID           *BootModeBuffer;
     58   EFI_PLATFORM_INFO_HOB           *PlatformInfoHobPtr;
     59   MEM_INFO_PROTOCOL               *MemInfoProtocol;
     60   EFI_HANDLE                      Handle;
     61   UINT8							              Channel, Slot;
     62   VOID                            *GuidHob;
     63 
     64   VariableData   = NULL;
     65   MfgMode        = FALSE;
     66   Handle         = NULL;
     67   BootModeBuffer = NULL;
     68   MemHobData     = NULL;
     69   PlatformInfoHobPtr = NULL;
     70   BufferSize     = 0;
     71 
     72   //
     73   // Get Platform Info HOB
     74   //
     75   GuidHob = GetFirstGuidHob (&gEfiPlatformInfoGuid);
     76   if (GuidHob == NULL) {
     77     Status = EFI_NOT_FOUND;
     78   }
     79   ASSERT_EFI_ERROR (Status);
     80 
     81   PlatformInfoHobPtr = GET_GUID_HOB_DATA (GuidHob);
     82 
     83   //
     84   // Get the BootMode guid hob
     85   //
     86   GuidHob = GetFirstGuidHob (&gEfiPlatformBootModeGuid);
     87   if (GuidHob == NULL) {
     88     Status = EFI_NOT_FOUND;
     89   }
     90   ASSERT_EFI_ERROR (Status);
     91 
     92   BootModeBuffer = GET_GUID_HOB_DATA (GuidHob);
     93 
     94 
     95   //
     96   // Check whether in Manufacturing Mode
     97   //
     98   if (BootModeBuffer) {
     99     if ( !CompareMem (   //EfiCompareMem
    100             &BootModeBuffer->SetupName,
    101             MANUFACTURE_SETUP_NAME,
    102             StrSize (MANUFACTURE_SETUP_NAME)  //EfiStrSize
    103             ) ) {
    104       MfgMode = TRUE;
    105     }
    106   }
    107 
    108   if (MfgMode) {
    109     //
    110     // Don't save Memory Configuration in Manufacturing Mode. Clear memory configuration.
    111     //
    112     Status = gRT->SetVariable (
    113               EfiMemoryConfigVariable,
    114               &gEfiVlv2VariableGuid,
    115               EFI_VARIABLE_NON_VOLATILE | EFI_VARIABLE_BOOTSERVICE_ACCESS,
    116               0,
    117               NULL
    118               );
    119   } else {
    120 
    121     MemInfoProtocol = (MEM_INFO_PROTOCOL*)AllocateZeroPool(sizeof(MEM_INFO_PROTOCOL));
    122     if (PlatformInfoHobPtr != NULL) {
    123       MemInfoProtocol->MemInfoData.memSize  = 0;
    124       for (Channel = 0; Channel < CH_NUM; Channel ++){
    125         for (Slot = 0; Slot < DIMM_NUM; Slot ++){
    126           MemInfoProtocol->MemInfoData.dimmSize[Slot + (Channel * DIMM_NUM)] = PlatformInfoHobPtr->MemData.DimmSize[Slot + (Channel * DIMM_NUM)];
    127         }
    128       }
    129   	  MemInfoProtocol->MemInfoData.memSize       = PlatformInfoHobPtr->MemData.MemSize;
    130   	  MemInfoProtocol->MemInfoData.EccSupport    = PlatformInfoHobPtr->MemData.EccSupport;
    131       MemInfoProtocol->MemInfoData.ddrFreq       = PlatformInfoHobPtr->MemData.DdrFreq;
    132       MemInfoProtocol->MemInfoData.ddrType       = PlatformInfoHobPtr->MemData.DdrType;
    133       if (MemInfoProtocol->MemInfoData.memSize == 0){
    134         //
    135         // We hardcode if MRC didn't fill these info in
    136         //
    137         MemInfoProtocol->MemInfoData.memSize     = 0x800; //per 1MB
    138         MemInfoProtocol->MemInfoData.dimmSize[0] = 0x800;
    139         MemInfoProtocol->MemInfoData.dimmSize[1] = 0;
    140         MemInfoProtocol->MemInfoData.EccSupport  = FALSE;
    141         MemInfoProtocol->MemInfoData.ddrType     = 5; //DDRType_LPDDR3
    142       }
    143 
    144       Status = gBS->InstallMultipleProtocolInterfaces (
    145              &Handle,
    146              &gMemInfoProtocolGuid,
    147              MemInfoProtocol,
    148              NULL
    149              );
    150     }
    151 
    152     Status = EFI_SUCCESS;
    153     if (BOOT_WITH_MINIMAL_CONFIGURATION != GetBootModeHob()){
    154       //
    155       // Get the Memory Config guid hob
    156       //
    157       GuidHob = GetFirstGuidHob (&gEfiMemoryConfigDataGuid);
    158       if (GuidHob == NULL) {
    159         Status = EFI_NOT_FOUND;
    160       }
    161       ASSERT_EFI_ERROR (Status);
    162 
    163       MemHobData = GET_GUID_HOB_DATA (GuidHob);
    164       BufferSize = GET_GUID_HOB_DATA_SIZE (GuidHob);
    165 
    166       Status = gRT->GetVariable (
    167                   EfiMemoryConfigVariable,
    168                   &gEfiVlv2VariableGuid,
    169                   NULL,
    170                   &BufferSize,
    171                   VariableData
    172                   );
    173       if (EFI_ERROR(Status) && (MemHobData != NULL)) {
    174         Status = gRT->SetVariable (
    175                       EfiMemoryConfigVariable,
    176                       &gEfiVlv2VariableGuid,
    177                       (EFI_VARIABLE_NON_VOLATILE | EFI_VARIABLE_BOOTSERVICE_ACCESS),
    178                       BufferSize,
    179                       MemHobData
    180                       );
    181       }
    182     }
    183 
    184   } // if-else MfgMode
    185 
    186   return EFI_SUCCESS;
    187 }
    188