]> git.proxmox.com Git - mirror_edk2.git/blobdiff - QuarkSocPkg/QuarkNorthCluster/Include/DdrMemoryController.h
QuarkSocPkg: Add new package for Quark SoC X1000
[mirror_edk2.git] / QuarkSocPkg / QuarkNorthCluster / Include / DdrMemoryController.h
diff --git a/QuarkSocPkg/QuarkNorthCluster/Include/DdrMemoryController.h b/QuarkSocPkg/QuarkNorthCluster/Include/DdrMemoryController.h
new file mode 100644 (file)
index 0000000..de777c5
--- /dev/null
@@ -0,0 +1,257 @@
+/** @file\r
+Memory controller configuration.\r
+\r
+Copyright (c) 2013-2015 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
+which accompanies this distribution.  The full text of the license may be found at\r
+http://opensource.org/licenses/bsd-license.php\r
+\r
+THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
+WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
+\r
+**/\r
+#ifndef __DDR_MEMORY_CONTROLLER_H__\r
+#define __DDR_MEMORY_CONTROLLER_H__\r
+\r
+//\r
+// DDR timing data definitions.\r
+// These are used to create bitmaps of valid timing configurations.\r
+//\r
+\r
+#define DUAL_CHANNEL_DDR_TIMING_DATA_FREQUENCY_UNKNOWN    0xFF\r
+#define DUAL_CHANNEL_DDR_TIMING_DATA_REFRESH_RATE_UNKNOWN 0xFF\r
+\r
+#define DUAL_CHANNEL_DDR_TIMING_DATA_TCL_20    0x01\r
+#define DUAL_CHANNEL_DDR_TIMING_DATA_TCL_25    0x00\r
+#define DUAL_CHANNEL_DDR_TIMING_DATA_TCL_30    0x02\r
+#define DUAL_CHANNEL_DDR_TIMING_DATA_TCL_ALL   0x03\r
+\r
+\r
+#define DUAL_CHANNEL_DDR_TIMING_DATA_TRCD_02   0x02\r
+#define DUAL_CHANNEL_DDR_TIMING_DATA_TRCD_03   0x01\r
+#define DUAL_CHANNEL_DDR_TIMING_DATA_TRCD_04   0x00\r
+#define DUAL_CHANNEL_DDR_TIMING_DATA_TRCD_ALL  0x03\r
+\r
+#define DUAL_CHANNEL_DDR_TIMING_DATA_TRP_02    0x02\r
+#define DUAL_CHANNEL_DDR_TIMING_DATA_TRP_03    0x01\r
+#define DUAL_CHANNEL_DDR_TIMING_DATA_TRP_04    0x00\r
+#define DUAL_CHANNEL_DDR_TIMING_DATA_TRP_ALL   0x03\r
+\r
+#define DUAL_CHANNEL_DDR_TIMING_DATA_TRAS_05   0x05\r
+#define DUAL_CHANNEL_DDR_TIMING_DATA_TRAS_06   0x04\r
+#define DUAL_CHANNEL_DDR_TIMING_DATA_TRAS_07   0x03\r
+#define DUAL_CHANNEL_DDR_TIMING_DATA_TRAS_08   0x02\r
+#define DUAL_CHANNEL_DDR_TIMING_DATA_TRAS_09   0x01\r
+#define DUAL_CHANNEL_DDR_TIMING_DATA_TRAS_10   0x00\r
+#define DUAL_CHANNEL_DDR_TIMING_DATA_TRAS_ALL  0x07\r
+\r
+#define DUAL_CHANNEL_DDR_DATA_TYPE_REGISTERED    0x01\r
+#define DUAL_CHANNEL_DDR_DATA_TYPE_UNREGISTERED  0x02\r
+#define DUAL_CHANNEL_DDR_DATA_TYPE_BUFFERED      0x04\r
+#define DUAL_CHANNEL_DDR_DATA_TYPE_UNBUFFERED    0x08\r
+#define DUAL_CHANNEL_DDR_DATA_TYPE_SDR           0x10\r
+#define DUAL_CHANNEL_DDR_DATA_TYPE_DDR           0x20\r
+\r
+\r
+//\r
+// Maximum number of SDRAM channels supported by the memory controller\r
+//\r
+#define MAX_CHANNELS 1\r
+\r
+//\r
+// Maximum number of DIMM sockets supported by the memory controller\r
+//\r
+#define MAX_SOCKETS 1\r
+\r
+//\r
+// Maximum number of sides supported per DIMM\r
+//\r
+#define   MAX_SIDES                         2\r
+\r
+//\r
+// Maximum number of "Socket Sets", where a "Socket Set is a set of matching\r
+// DIMM's from the various channels\r
+//\r
+#define   MAX_SOCKET_SETS                   2\r
+\r
+//\r
+// Maximum number of rows supported by the memory controller\r
+//\r
+#define MAX_ROWS (MAX_SIDES * MAX_SOCKETS)\r
+\r
+//\r
+// Maximum number of memory ranges supported by the memory controller\r
+//\r
+#define MAX_RANGES (MAX_ROWS + 5)\r
+\r
+//\r
+// Maximum Number of Log entries\r
+//\r
+#define   MEMORY_LOG_MAX_INDEX          16\r
+\r
+\r
+typedef struct _MEMORY_LOG_ENTRY {\r
+  EFI_STATUS_CODE_VALUE                     Event;\r
+  EFI_STATUS_CODE_TYPE                      Severity;\r
+  UINT8                                     Data;\r
+} MEMORY_LOG_ENTRY;\r
+\r
+typedef struct _MEMORY_LOG {\r
+  UINT8                                     Index;\r
+  MEMORY_LOG_ENTRY                      Entry[MEMORY_LOG_MAX_INDEX];\r
+} MEMORY_LOG;\r
+\r
+\r
+\r
+//\r
+// Defined ECC types\r
+//\r
+#define DUAL_CHANNEL_DDR_ECC_TYPE_NONE             0x01   // No error checking\r
+#define DUAL_CHANNEL_DDR_ECC_TYPE_EC               0x02   // Error checking only\r
+#define DUAL_CHANNEL_DDR_ECC_TYPE_SECC             0x04   // Software Scrubbing ECC\r
+#define DUAL_CHANNEL_DDR_ECC_TYPE_HECC             0x08   // Hardware Scrubbing ECC\r
+#define DUAL_CHANNEL_DDR_ECC_TYPE_CKECC            0x10   // Chip Kill ECC\r
+\r
+//\r
+// Row configuration status values\r
+//\r
+#define DUAL_CHANNEL_DDR_ROW_CONFIG_SUCCESS        0x00  // No error\r
+#define DUAL_CHANNEL_DDR_ROW_CONFIG_UNKNOWN        0x01  // Pattern mismatch, no memory\r
+#define DUAL_CHANNEL_DDR_ROW_CONFIG_UNSUPPORTED    0x02  // Memory type not supported\r
+#define DUAL_CHANNEL_DDR_ROW_CONFIG_ADDRESS_ERROR  0x03  // Row/Col/Bnk mismatch\r
+#define DUAL_CHANNEL_DDR_ROW_CONFIG_ECC_ERROR      0x04  // Received ECC error\r
+#define DUAL_CHANNEL_DDR_ROW_CONFIG_NOT_PRESENT    0x05  // Row is not present\r
+#define DUAL_CHANNEL_DDR_ROW_CONFIG_DISABLED       0x06  // Row is disabled\r
+\r
+\r
+//\r
+// Memory range types\r
+//\r
+typedef enum {\r
+  DualChannelDdrMainMemory,\r
+  DualChannelDdrSmramCacheable,\r
+  DualChannelDdrSmramNonCacheable,\r
+  DualChannelDdrGraphicsMemoryCacheable,\r
+  DualChannelDdrGraphicsMemoryNonCacheable,\r
+  DualChannelDdrReservedMemory,\r
+  DualChannelDdrMaxMemoryRangeType\r
+} DUAL_CHANNEL_DDR_MEMORY_RANGE_TYPE;\r
+\r
+//\r
+// Memory map range information\r
+//\r
+typedef struct {\r
+  EFI_PHYSICAL_ADDRESS                          PhysicalAddress;\r
+  EFI_PHYSICAL_ADDRESS                          CpuAddress;\r
+  EFI_PHYSICAL_ADDRESS                          RangeLength;\r
+  DUAL_CHANNEL_DDR_MEMORY_RANGE_TYPE                 Type;\r
+} DUAL_CHANNEL_DDR_MEMORY_MAP_RANGE;\r
+typedef struct {\r
+    unsigned    dramType        :1;                 /**< Type: 0 = RESERVED; 1 = DDR2 */\r
+    unsigned    dramWidth       :1;                 /**< Width: 0 = x8; 1 = x16 */\r
+    unsigned    dramDensity     :2;                 /**< Density: 00b = 2Gb; 01b = 1Gb; 10b = 512Mb; 11b = 256Mb */\r
+    unsigned    dramSpeed       :1;                 /**< Speed Grade: 0 = RESERVED; 1 = 800MT/s;*/\r
+    unsigned    dramTimings     :3;                 /**< Timings: 4-4-4, 5-5-5, 6-6-6 */\r
+    unsigned    dramRanks       :1;                 /**< Ranks: 0 = Single Rank; 1 = Dual Rank */\r
+} DramGeometry;                                     /**< DRAM Geometry Descriptor */\r
+\r
+typedef union _RegDRP {\r
+    UINT32    raw;\r
+    struct {\r
+        unsigned rank0Enabled       :1;     /**< Rank 0 Enable */\r
+        unsigned rank0DevWidth      :2;     /**< DRAM Device Width (x8,x16) */\r
+        unsigned rank0DevDensity    :2;     /**< DRAM Device Density (256Mb,512Mb,1Gb,2Gb) */\r
+        unsigned reserved2          :1;\r
+        unsigned rank1Enabled       :1;     /**< Rank 1 Enable */\r
+        unsigned reserved3          :5;\r
+        unsigned dramType           :1;     /**< DRAM Type (0=DDR2) */\r
+        unsigned reserved4          :5;\r
+        unsigned reserved5          :14;\r
+      } field;\r
+} RegDRP;                                   /**< DRAM Rank Population and Interface Register */\r
+\r
+\r
+typedef union {\r
+    UINT32    raw;\r
+    struct {\r
+        unsigned dramFrequency      :3;     /**< DRAM Frequency (000=RESERVED,010=667,011=800) */\r
+        unsigned tRP                :2;     /**< Precharge to Activate Delay (3,4,5,6) */\r
+        unsigned reserved1          :1;\r
+        unsigned tRCD               :2;     /**< Activate to CAS Delay (3,4,5,6) */\r
+        unsigned reserved2          :1;\r
+        unsigned tCL                :2;     /**< CAS Latency (3,4,5,6) */\r
+        unsigned reserved3          :21;\r
+      } field;\r
+} RegDTR0;                                  /**< DRAM Timing Register 0 */\r
+\r
+typedef union {\r
+    UINT32    raw;\r
+    struct {\r
+        unsigned tWRRD_dly          :2;     /**< Additional Write to Read Delay (0,1,2,3) */\r
+        unsigned reserved1          :1;\r
+        unsigned tRDWR_dly          :2;     /**< Additional Read to Write Delay (0,1,2,3) */\r
+        unsigned reserved2          :1;\r
+        unsigned tRDRD_dr_dly       :1;     /**< Additional Read to Read Delay (1,2) */\r
+        unsigned reserved3          :1;\r
+        unsigned tRD_dly            :3;     /**< Additional Read Data Sampling Delay (0-7) */\r
+        unsigned reserved4          :1;\r
+        unsigned tRCVEN_halfclk_dly :4;     /**< Additional RCVEN Half Clock Delay Control */\r
+        unsigned reserved5          :1;\r
+        unsigned readDqDelay        :2;     /**< Read DQ Delay */\r
+        unsigned reserved6          :13;\r
+      } field;\r
+} RegDTR1;                                  /**< DRAM Timing Register 1 */\r
+\r
+typedef union {\r
+    UINT32    raw;\r
+    struct {\r
+        unsigned ckStaticDisable    :1;     /**< CK/CK# Static Disable */\r
+        unsigned reserved1          :3;\r
+        unsigned ckeStaticDisable   :2;     /**< CKE Static Disable */\r
+        unsigned reserved2          :8;\r
+        unsigned refreshPeriod      :2;     /**< Refresh Period (disabled,128clks,3.9us,7.8us) */\r
+        unsigned refreshQueueDepth  :2;     /**< Refresh Queue Depth (1,2,4,8) */\r
+        unsigned reserved5          :13;\r
+        unsigned initComplete       :1;     /**< Initialization Complete */\r
+      } field;\r
+} RegDCO;\r
+\r
+//\r
+// MRC Data Structure\r
+//\r
+typedef struct {\r
+    RegDRP          drp;\r
+    RegDTR0         dtr0;\r
+    RegDTR1         dtr1;\r
+    RegDCO          dco;\r
+    UINT32          reg0104;\r
+    UINT32          reg0120;\r
+    UINT32          reg0121;\r
+    UINT32          reg0123;\r
+    UINT32          reg0111;\r
+    UINT32          reg0130;\r
+    UINT8           refreshPeriod;      /**< Placeholder for the chosen refresh\r
+                                         *   period.  This value will NOT be\r
+                                         *   programmed into DCO until all\r
+                                         *   initialization is done.\r
+                                         */\r
+    UINT8           ddr2Odt;            /**< 0 = Disabled, 1 = 75 ohm, 2 = 150ohm, 3 = 50ohm */\r
+    UINT8           sku;                /**< Detected QuarkNcSocId SKU */\r
+    UINT8           capabilities;       /**< Capabilities Available on this part */\r
+    UINT8           state;              /**< NORMAL_BOOT, S3_RESUME */\r
+    UINT32          memSize;            /**< Memory size */\r
+    UINT16          pmBase;             /**< PM Base */\r
+    UINT16          mrcVersion;         /**< MRC Version */\r
+    UINT32          hecbase;            /**< HECBASE shifted left 16 bits */\r
+    DramGeometry    geometry;          /**< DRAM Geometry */\r
+} MRC_DATA_STRUCTURE;             /**< QuarkNcSocId Memory Parameters for MRC */\r
+\r
+typedef struct _EFI_MEMINIT_CONFIG_DATA {\r
+  MRC_DATA_STRUCTURE                        MrcData;\r
+} EFI_MEMINIT_CONFIG_DATA;\r
+\r
+\r
+\r
+#endif\r