/** @file Copyright (c) 2018, Intel Corporation. All rights reserved.
SPDX-License-Identifier: BSD-2-Clause-Patent **/ #ifndef _memhost_h #define _memhost_h #include "DataTypes.h" #include "PlatformHost.h" #include "SysRegs.h" #include "MemRegs.h" #include "MemDefaults.h" #include "MrcCommonTypes.h" #include "MemHostChipCommon.h" #include "KtiSi.h" #define MAX_DIMMTABLEINDEX (MAX_CH * MAX_DIMM) #define MAXFIELDVAL(bitfield) (bitfield = 0xffffffff) //EFI_GUID definition locations for different BDAT/BSSA cases #include // Debug Build code // These should be disabled for all normal builds and only enable on demand for debugging //#define DEBUG_TURNAROUNDS 1 #define DEBUG_PERFORMANCE_STATS 1 //#define DEBUG_RDRAND 1 //#define DEBUG_SENSEAMP 1 #ifdef DEBUG_PERFORMANCE_STATS #define MAX_NOZONE 20 #endif // DEBUG_PERFORMANCE_STATS #define PGT_TIMER_ENABLE 1 #define PGT_TIMER_DISABLE 0 // // DDR3 frequencies 800 - 2666 // DDR4 frequencies 1333 - 4200 // #define MAX_SUP_FREQ 28 // 26 frequencies are supported (800, 1067, 1333, 1600, 1867, 2133, 2400, 2666, 2933, // 3200, 3400, 3467, 3600, 3733, 3800, 4000, 4200, 4266, 4400) /// /// External signal names /// typedef enum { RAS_N, CAS_N, WE_N, BA0, BA1, BA2, A0, A1, A2, A3, A4, A5, A6, A7, A8, A9, A10, A11, A12, A13, A14, A15, A16, A17, CS0_N, CS1_N, CS2_N, CS3_N, CS4_N, CS5_N, CS6_N, CS7_N, CS8_N, CS9_N, CKE0, CKE1, CKE2, CKE3, CKE4, CKE5, ODT0, ODT1, ODT2, ODT3, ODT4, ODT5, PAR, ALERT_N, BG0, BG1, ACT_N, C0, C1, C2, CK0, CK1, CK2, CK3, CK4, CK5, FNV_GOOD_PARITY, DESELECT, PRECHARGE, GNT, // these are actually commands as opposed to signals gsmCsnDelim = INT32_MAX } GSM_CSN; typedef struct { INT16 left; INT16 right; } SIGNAL_EYE; #define MAX_PHASE 2 // MAX_PHASE // // Common Core dummy defines // #ifndef MAX_MC_CH #define MAX_MC_CH 2 // Max channels per MC #endif #ifndef MAX_CLUSTERS #define MAX_CLUSTERS 1 // Maximum number of clusters supported #endif #ifndef MAX_EDC #define MAX_EDC 1 // Maximum number of EDC supported #endif #define CATCHALL_TIMEOUT 100000 // 100 ms #pragma pack(push, 1) extern const UINT16 rankSize[MAX_TECH]; ///< Rank size in 64 MB units extern const UINT16 rankSizeDDR4[MAX_TECH]; ///< Rank size in 64 MB units #define ALL_DRAMS 0xFF // Indicates to write to all DRAMs when in PDA mode #define ALL_DATABUFFERS 0xFF // Indicates to write to all Buffers in PBA Mode typedef enum { INVALID_BUS, SMBUS, EMRS, CPGC, SAD, } BUS_TYPE; #ifdef SERIAL_DBG_MSG #define MemDebugPrint(dbgInfo) debugPrintMem dbgInfo #define MspDebugPrint(dbgInfo) debugPrintMsp dbgInfo #define MmrcDebugPrint(dbgInfo) #define OutputExtendedCheckpoint(dbgInfo) #else #define MemDebugPrint(dbgInfo) #define MspDebugPrint(dbgInfo) #define MmrcDebugPrint(dbgInfo) #define OutputExtendedCheckpoint(dbgInfo) OutputCheckpoint dbgInfo #endif typedef enum { MRC_PF_NULL, // All policy flags turned off. MRC_PF_COLD = BIT0, // Execute MRC function on cold reset. MRC_PF_FAST = BIT1, // Execute MRC function on cold reset when S3 data is present. MRC_PF_WARM = BIT2, // Execute MRC function on warm reset. MRC_PF_S3 = BIT3, // Execute MRC function on S3 exit. //MRC_PF_FULL_MRC = BIT4, // Execute MRC function when in Full MRC mode. //MRC_PF_MINI_MRC = BIT5, // Execute MRC function when in Mini-MRC mode. MRC_PF_ALL = 0xF // All policy flags turned off. } PFSelectorType; typedef enum { MRC_MP_NULL, // All policy flags turned off MRC_MP_SERIAL = BIT0, // Execute function when in serial mode MRC_MP_PARALLEL = BIT1, // Execute function when in parallel mode MRC_MP_LOOP = BIT2, // Execute function for each socket when in serial mode MRC_MP_BOTH = MRC_MP_SERIAL | MRC_MP_PARALLEL, // Execute function in both modes MRC_MP_BOTH_LOOP = MRC_MP_SERIAL | MRC_MP_PARALLEL | MRC_MP_LOOP, // Execute function in both modes and loop } MPSelectorType; // // TRR defines // #define PTRR_MODE BIT0 #define TRR_MODE_A BIT1 #define TRR_IMMUNE BIT2 #ifdef TRR_MODE_B_SUPPORT #define TRR_MODE_B BIT3 #endif //TRR_MODE_B_SUPPORT typedef struct { UINT8 stackPresentBitmap[MAX_SOCKET]; ///< bitmap of present stacks per socket UINT8 StackBus[MAX_SOCKET][MAX_IIO_STACK]; ///< Bus of each stack UINT8 SocketFirstBus[MAX_SOCKET]; UINT8 Socket10nmUboxBus0[MAX_SOCKET]; //10nm CPU use only UINT8 SocketLastBus[MAX_SOCKET]; UINT8 segmentSocket[MAX_SOCKET]; UINT8 cpuType; UINT8 stepping; UINT32 socketPresentBitMap; UINT32 FpgaPresentBitMap; UINT32 mmCfgBase; UINT8 maxCh; UINT8 maxIMC; UINT8 numChPerMC; UINT8 imcEnabled[MAX_SOCKET][MAX_IMC]; UINT8 mcId[MAX_SOCKET][MAX_CH]; CPU_CSR_ACCESS_VAR_CHIP ///< Chip hook to enable CPU_CSR_ACCESS_VAR fields } CPU_CSR_ACCESS_VAR; #pragma pack(pop) /// /// (MPT_MT - MemeoryPowerTraining_MarginType)param type for power training steps /// typedef enum { GetMargin = 0, TerMargin = 1, BerMargin = 2 } MPT_MT; /// /// (MPT_PT - MemeoryPowerTraining_ParamType)param type for power training steps /// typedef enum { PerChPerByte = 0, PerRank = 1, PerStrobe = 2, PerCh = 3, PerMC = 4 } MPT_PT; /// /// (MPT_P - MemeoryPowerTraining_Param)param for power training steps /// typedef enum { traindramron = 0, trainmcodt = 1, trainnontgtodt = 2, trainrttwr = 3, trainmcron = 4, traintxeq = 5, trainimode = 6, trainctle = 7, traintcocomp = 8, traindramrxeq = 9, } MPT_P; #define IMC0 0 #define IMC1 1 // // PPR Status // #define PPR_STS_SUCCESS 0x00 #define PPR_STS_ADDR_VALID 0x01 #define PPR_STS_FAILED 0x02 #define DRAM_UNKNOWN 0xFF #pragma pack(push, 1) // // ----------------------------------------------------------------------------- // // NVRAM structures for S3 state // #define MAX_CMD_CSR 16 #define MAX_SIDE 2 // // ----------------------------------------------------------------------------- // // ddrChannelSetup STRUCT 4t ; Channel setup structure declaration // // enabled BYTE ? ; Channel enable switch: // ; 0 = channel disabled // ; 1 = channel enabled // // options BYTE ? ; Bit-mapped options: // // numDimmSlots BYTE ? ; Number of Dimm slots per channel // ; Valid options are 1, 2 or 3 // ; MAX_DIMM is defined in mrcplatform.h. This option can be no larger than MAX_DIMM. // ; It overrides MAX_DIMM when it is smaller. // // ddrChannelSetup ENDS // // ----------------------------------------------------------------------------- // // // ----------------------------------------------------------------------------- // // Node bit-mapped options // // ddrSocketSetup STRUCT 4t ; Socket setup structure declaration // // enabled BYTE ? ; imc enable switch: // ; 0 = imc disabled // ; 1 = imc enabled // // options BYTE ? ; Bit-mapped options per socket: // // vrefDefaultValue BYTE ? ; Default DCP value per socket for DIMM Vref = Vddq/2 // // vrefDcp smbDevice <> ; Defines override of DCP SMBus device and address // ; compId = DCP_ISL9072X or DCP_AD5247 // ; strapAddress // ; busSegment // // ddrSocketSetup ENDS // // ----------------------------------------------------------------------------- // /// /// PPR DRAM Address /// typedef struct { UINT8 dimm; UINT8 rank; UINT8 subRank; UINT32 dramMask; UINT8 bank; UINT32 row; } PPR_ADDR; // HIGH_ADDR_EN enables extention of the MMIO hole to force memory to high address region #define HIGH_ADDR_EN BIT0 #define CR_MIXED_SKU BIT2 //used to enable(1)- halt on mixed sku discovery and disable(0) - warn on mixed sku discovery //#pragma pack(pop) /// /// Sub-boot state internal to MRC (8-15 are definable). The 2 main boot types and paths through QPIRC/MRC - NormalBoot and S3Resume. /// Within NormalBoot and S3Resume, the sub-boot type can be cold, warm, fast warm, fast cold, and ADR resume. These are populated /// at the beginning of MRC so they are not applicable for QPIRC. /// typedef enum SubBootMode { ColdBoot = 8, // Normal path through MRC with full mem detection, init, training, etc. WarmBoot = 9, // Warm boot path through MRC. Some functionality can be skipped for speed. WarmBootFast = 10, // Fast warm boot path uses the NVRAM structure to skip as much MRC // code as possible to try to get through MRC fast. Should be as close // as possible to the S3 flow. ColdBootFast = 11, // Fast cold boot path uses the NVRAM structure to skip as much MRC // code as possible on a cold boot. AdrResume = 12, // ADR flow can skip most of MRC (i.e. take the S3 path) for DIMMs that // are in self-refresh. But the DIMMs that are not in self-refresh // must go through more of MRC. Reserved13 = 13 } SubBootMode; #define MAX_ADV_MT_LOG 16 #define MEM_CHIP_POLICY_DEF(x) host->var.mem.memChipPolicy.x #define MEM_CHIP_POLICY_VALUE(host, x) host->var.mem.memChipPolicy.x #define CHIP_FUNC_CALL(host, x) x #pragma pack(pop) #endif // _memhost_h