Home | History | Annotate | Download | only in PlatformInit
      1 /** @file
      2 Framework PEIM to initialize memory on an DDR2 SDRAM Memory Controller.
      3 
      4 Copyright (c) 2013 - 2016 Intel Corporation.
      5 
      6 This program and the accompanying materials
      7 are licensed and made available under the terms and conditions of the BSD License
      8 which accompanies this distribution.  The full text of the license may be found at
      9 http://opensource.org/licenses/bsd-license.php
     10 
     11 THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
     12 WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
     13 
     14 **/
     15 
     16 #ifndef _MRC_WRAPPER_H
     17 #define _MRC_WRAPPER_H
     18 
     19 #include <Ppi/QNCMemoryInit.h>
     20 #include "PlatformEarlyInit.h"
     21 
     22 //
     23 // Define the default memory areas required
     24 //
     25 #define EDKII_RESERVED_SIZE_PAGES         0x20
     26 #define ACPI_NVS_SIZE_PAGES               0x60
     27 #define RUNTIME_SERVICES_DATA_SIZE_PAGES  0x20
     28 #define RUNTIME_SERVICES_CODE_SIZE_PAGES  0x80
     29 #define ACPI_RECLAIM_SIZE_PAGES           0x20
     30 #define EDKII_DXE_MEM_SIZE_PAGES          0x20
     31 
     32 //
     33 // Maximum number of "Socket Sets", where a "Socket Set is a set of matching
     34 // DIMM's from the various channels
     35 //
     36 #define MAX_SOCKET_SETS      2
     37 
     38 //
     39 // Maximum number of memory ranges supported by the memory controller
     40 //
     41 #define MAX_RANGES (MAX_ROWS + 5)
     42 
     43 //
     44 // Min. of 48MB PEI phase
     45 //
     46 #define  PEI_MIN_MEMORY_SIZE               (6 * 0x800000)
     47 #define  PEI_RECOVERY_MIN_MEMORY_SIZE      (6 * 0x800000)
     48 
     49 #define PEI_MEMORY_RANGE_OPTION_ROM UINT32
     50 #define PEI_MR_OPTION_ROM_NONE      0x00000000
     51 
     52 //
     53 // SMRAM Memory Range
     54 //
     55 #define PEI_MEMORY_RANGE_SMRAM      UINT32
     56 #define PEI_MR_SMRAM_ALL            0xFFFFFFFF
     57 #define PEI_MR_SMRAM_NONE           0x00000000
     58 #define PEI_MR_SMRAM_CACHEABLE_MASK 0x80000000
     59 #define PEI_MR_SMRAM_SEGTYPE_MASK   0x00FF0000
     60 #define PEI_MR_SMRAM_ABSEG_MASK     0x00010000
     61 #define PEI_MR_SMRAM_HSEG_MASK      0x00020000
     62 #define PEI_MR_SMRAM_TSEG_MASK      0x00040000
     63 //
     64 // SMRAM Size is a multiple of 128KB.
     65 //
     66 #define PEI_MR_SMRAM_SIZE_MASK          0x0000FFFF
     67 
     68 //
     69 // Pci Memory Hole
     70 //
     71 #define PEI_MEMORY_RANGE_PCI_MEMORY       UINT32
     72 
     73 typedef enum {
     74   Ignore,
     75   Quick,
     76   Sparse,
     77   Extensive
     78 } PEI_MEMORY_TEST_OP;
     79 
     80 //
     81 // MRC Params Variable structure.
     82 //
     83 
     84 typedef struct {
     85   MrcTimings_t timings;              // Actual MRC config values saved in variable store.
     86   UINT8        VariableStorePad[8];  // Allow for data stored in variable is required to be multiple of 8bytes.
     87 } PLATFORM_VARIABLE_MEMORY_CONFIG_DATA;
     88 
     89 ///
     90 /// MRC Params Platform Data Flags bits
     91 ///
     92 #define PDAT_MRC_FLAG_ECC_EN            BIT0
     93 #define PDAT_MRC_FLAG_SCRAMBLE_EN       BIT1
     94 #define PDAT_MRC_FLAG_MEMTEST_EN        BIT2
     95 #define PDAT_MRC_FLAG_TOP_TREE_EN       BIT3  ///< 0b DDR "fly-by" topology else 1b DDR "tree" topology.
     96 #define PDAT_MRC_FLAG_WR_ODT_EN         BIT4  ///< If set ODR signal is asserted to DRAM devices on writes.
     97 
     98 ///
     99 /// MRC Params Platform Data.
    100 ///
    101 typedef struct {
    102   UINT32       Flags;                   ///< Bitmap of PDAT_MRC_FLAG_XXX defs above.
    103   UINT8        DramWidth;               ///< 0=x8, 1=x16, others=RESERVED.
    104   UINT8        DramSpeed;               ///< 0=DDRFREQ_800, 1=DDRFREQ_1066, others=RESERVED. Only 533MHz SKU support 1066 memory.
    105   UINT8        DramType;                ///< 0=DDR3,1=DDR3L, others=RESERVED.
    106   UINT8        RankMask;                ///< bit[0] RANK0_EN, bit[1] RANK1_EN, others=RESERVED.
    107   UINT8        ChanMask;                ///< bit[0] CHAN0_EN, others=RESERVED.
    108   UINT8        ChanWidth;               ///< 1=x16, others=RESERVED.
    109   UINT8        AddrMode;                ///< 0, 1, 2 (mode 2 forced if ecc enabled), others=RESERVED.
    110   UINT8        SrInt;                   ///< 1=1.95us, 2=3.9us, 3=7.8us, others=RESERVED. REFRESH_RATE.
    111   UINT8        SrTemp;                  ///< 0=normal, 1=extended, others=RESERVED.
    112   UINT8        DramRonVal;              ///< 0=34ohm, 1=40ohm, others=RESERVED. RON_VALUE Select MRS1.DIC driver impedance control.
    113   UINT8        DramRttNomVal;           ///< 0=40ohm, 1=60ohm, 2=120ohm, others=RESERVED.
    114   UINT8        DramRttWrVal;            ///< 0=off others=RESERVED.
    115   UINT8        SocRdOdtVal;             ///< 0=off, 1=60ohm, 2=120ohm, 3=180ohm, others=RESERVED.
    116   UINT8        SocWrRonVal;             ///< 0=27ohm, 1=32ohm, 2=40ohm, others=RESERVED.
    117   UINT8        SocWrSlewRate;           ///< 0=2.5V/ns, 1=4V/ns, others=RESERVED.
    118   UINT8        DramDensity;             ///< 0=512Mb, 1=1Gb, 2=2Gb, 3=4Gb, others=RESERVED.
    119   UINT32       tRAS;                    ///< ACT to PRE command period in picoseconds.
    120   UINT32       tWTR;                    ///< Delay from start of internal write transaction to internal read command in picoseconds.
    121   UINT32       tRRD;                    ///< ACT to ACT command period (JESD79 specific to page size 1K/2K) in picoseconds.
    122   UINT32       tFAW;                    ///< Four activate window (JESD79 specific to page size 1K/2K) in picoseconds.
    123   UINT8        tCL;                     ///< DRAM CAS Latency in clocks.
    124 } PDAT_MRC_ITEM;
    125 
    126 //
    127 // Memory range types
    128 //
    129 typedef enum {
    130   DualChannelDdrMainMemory,
    131   DualChannelDdrSmramCacheable,
    132   DualChannelDdrSmramNonCacheable,
    133   DualChannelDdrGraphicsMemoryCacheable,
    134   DualChannelDdrGraphicsMemoryNonCacheable,
    135   DualChannelDdrReservedMemory,
    136   DualChannelDdrMaxMemoryRangeType
    137 } PEI_DUAL_CHANNEL_DDR_MEMORY_RANGE_TYPE;
    138 
    139 //
    140 // Memory map range information
    141 //
    142 typedef struct {
    143   EFI_PHYSICAL_ADDRESS                          PhysicalAddress;
    144   EFI_PHYSICAL_ADDRESS                          CpuAddress;
    145   EFI_PHYSICAL_ADDRESS                          RangeLength;
    146   PEI_DUAL_CHANNEL_DDR_MEMORY_RANGE_TYPE        Type;
    147 } PEI_DUAL_CHANNEL_DDR_MEMORY_MAP_RANGE;
    148 
    149 //
    150 // Function prototypes.
    151 //
    152 
    153 EFI_STATUS
    154 InstallEfiMemory (
    155   IN      EFI_PEI_SERVICES                           **PeiServices,
    156   IN      EFI_PEI_READ_ONLY_VARIABLE2_PPI            *VariableServices,
    157   IN      EFI_BOOT_MODE                              BootMode,
    158   IN      UINT32                                     TotalMemorySize
    159   );
    160 
    161 EFI_STATUS
    162 InstallS3Memory (
    163   IN      EFI_PEI_SERVICES                      **PeiServices,
    164   IN      EFI_PEI_READ_ONLY_VARIABLE2_PPI       *VariableServices,
    165   IN      UINT32                                TotalMemorySize
    166   );
    167 
    168 EFI_STATUS
    169 MemoryInit (
    170   IN EFI_PEI_SERVICES                       **PeiServices
    171   );
    172 
    173 
    174 EFI_STATUS
    175 LoadConfig (
    176   IN      EFI_PEI_SERVICES                        **PeiServices,
    177   IN      EFI_PEI_READ_ONLY_VARIABLE2_PPI         *VariableServices,
    178   IN OUT  MRCParams_t                             *MrcData
    179   );
    180 
    181 EFI_STATUS
    182 SaveConfig (
    183   IN      MRCParams_t                      *MrcData
    184   );
    185 
    186 EFI_STATUS
    187 GetMemoryMap (
    188   IN     EFI_PEI_SERVICES                                    **PeiServices,
    189   IN     UINT32                                              TotalMemorySize,
    190   IN OUT PEI_DUAL_CHANNEL_DDR_MEMORY_MAP_RANGE               *MemoryMap,
    191   IN OUT UINT8                                               *NumRanges
    192   );
    193 
    194 EFI_STATUS
    195 ChooseRanges (
    196   IN OUT   PEI_MEMORY_RANGE_OPTION_ROM      *OptionRomMask,
    197   IN OUT   PEI_MEMORY_RANGE_SMRAM           *SmramMask,
    198   IN OUT   PEI_MEMORY_RANGE_PCI_MEMORY      *PciMemoryMask
    199   );
    200 
    201 EFI_STATUS
    202 GetPlatformMemorySize (
    203   IN      EFI_PEI_SERVICES                       **PeiServices,
    204   IN      EFI_BOOT_MODE                          BootMode,
    205   IN OUT  UINT64                                 *MemorySize
    206   );
    207 
    208 EFI_STATUS
    209 BaseMemoryTest (
    210   IN  EFI_PEI_SERVICES                   **PeiServices,
    211   IN  EFI_PHYSICAL_ADDRESS               BeginAddress,
    212   IN  UINT64                             MemoryLength,
    213   IN  PEI_MEMORY_TEST_OP                 Operation,
    214   OUT EFI_PHYSICAL_ADDRESS               *ErrorAddress
    215   );
    216 
    217 EFI_STATUS
    218 SetPlatformImrPolicy (
    219   IN      EFI_PHYSICAL_ADDRESS    PeiMemoryBaseAddress,
    220   IN      UINT64                  PeiMemoryLength
    221   );
    222 
    223 VOID
    224 EFIAPI
    225 InfoPostInstallMemory (
    226   OUT     UINT32                  *RmuBaseAddressPtr OPTIONAL,
    227   OUT     EFI_SMRAM_DESCRIPTOR    **SmramDescriptorPtr OPTIONAL,
    228   OUT     UINTN                   *NumSmramRegionsPtr OPTIONAL
    229   );
    230 
    231 #endif
    232