]> git.proxmox.com Git - mirror_edk2.git/blobdiff - ArmPkg/Drivers/PL34xDmc/PL341Dmc.c
EmbeddedPkg: Removed unused PCD values
[mirror_edk2.git] / ArmPkg / Drivers / PL34xDmc / PL341Dmc.c
index 4a1e1fc87c6a1fedbb108c6c962cf17b13bc6c61..ae94def7656189019ecce611cf6af1d89aa825b2 100644 (file)
 #include <Library/DebugLib.h>\r
 #include <Drivers/PL341Dmc.h>\r
 \r
-//\r
-// DMC Configuration Register Map\r
-//\r
-#define DMC_STATUS_REG              0x00\r
-#define DMC_COMMAND_REG             0x04\r
-#define DMC_DIRECT_CMD_REG          0x08\r
-#define DMC_MEMORY_CONFIG_REG       0x0C\r
-#define DMC_REFRESH_PRD_REG         0x10\r
-#define DMC_CAS_LATENCY_REG         0x14\r
-#define DMC_WRITE_LATENCY_REG       0x18\r
-#define DMC_T_MRD_REG               0x1C\r
-#define DMC_T_RAS_REG               0x20\r
-#define DMC_T_RC_REG                0x24\r
-#define DMC_T_RCD_REG               0x28\r
-#define DMC_T_RFC_REG               0x2C\r
-#define DMC_T_RP_REG                0x30\r
-#define DMC_T_RRD_REG               0x34\r
-#define DMC_T_WR_REG                0x38\r
-#define DMC_T_WTR_REG               0x3C\r
-#define DMC_T_XP_REG                0x40\r
-#define DMC_T_XSR_REG               0x44\r
-#define DMC_T_ESR_REG               0x48\r
-#define DMC_MEMORY_CFG2_REG         0x4C\r
-#define DMC_MEMORY_CFG3_REG         0x50\r
-#define DMC_T_FAW_REG               0x54\r
-\r
-// Returns the state of the memory controller:\r
-#define DMC_STATUS_CONFIG       0x0\r
-#define DMC_STATUS_READY        0x1\r
-#define DMC_STATUS_PAUSED       0x2\r
-#define DMC_STATUS_LOWPOWER     0x3\r
-\r
-// Changes the state of the memory controller:\r
-#define DMC_COMMAND_GO              0x0\r
-#define DMC_COMMAND_SLEEP           0x1\r
-#define DMC_COMMAND_WAKEUP          0x2\r
-#define DMC_COMMAND_PAUSE           0x3\r
-#define DMC_COMMAND_CONFIGURE       0x4\r
-#define DMC_COMMAND_ACTIVEPAUSE     0x7\r
-\r
-// Determines the command required\r
-#define DMC_DIRECT_CMD_MEMCMD_PRECHARGEALL      0x0\r
-#define DMC_DIRECT_CMD_MEMCMD_AUTOREFRESH       (0x1 << 18)\r
-#define DMC_DIRECT_CMD_MEMCMD_MODEREG           (0x2 << 18)\r
-#define DMC_DIRECT_CMD_MEMCMD_EXTMODEREG        (0x2 << 18)\r
-#define DMC_DIRECT_CMD_MEMCMD_NOP               (0x3 << 18)\r
-#define DMC_DIRECT_CMD_MEMCMD_DPD               (0x1 << 22)\r
-#define DMC_DIRECT_CMD_BANKADDR(n)              ((n & 0x3) << 16)\r
-#define DMC_DIRECT_CMD_CHIP_ADDR(n)    ((n & 0x3) << 20)\r
-\r
-\r
-//\r
-// AXI ID configuration register map\r
-//\r
-#define DMC_ID_0_CFG_REG            0x100\r
-#define DMC_ID_1_CFG_REG            0x104\r
-#define DMC_ID_2_CFG_REG            0x108\r
-#define DMC_ID_3_CFG_REG            0x10C\r
-#define DMC_ID_4_CFG_REG            0x110\r
-#define DMC_ID_5_CFG_REG            0x114\r
-#define DMC_ID_6_CFG_REG            0x118\r
-#define DMC_ID_7_CFG_REG            0x11C\r
-#define DMC_ID_8_CFG_REG            0x120\r
-#define DMC_ID_9_CFG_REG            0x124\r
-#define DMC_ID_10_CFG_REG           0x128\r
-#define DMC_ID_11_CFG_REG           0x12C\r
-#define DMC_ID_12_CFG_REG           0x130\r
-#define DMC_ID_13_CFG_REG           0x134\r
-#define DMC_ID_14_CFG_REG           0x138\r
-#define DMC_ID_15_CFG_REG           0x13C\r
-\r
-// Set the QoS\r
-#define DMC_ID_CFG_QOS_DISABLE      0\r
-#define DMC_ID_CFG_QOS_ENABLE       1\r
-#define DMC_ID_CFG_QOS_MIN          2\r
-\r
-\r
-//\r
-// Chip configuration register map\r
-//\r
-#define DMC_CHIP_0_CFG_REG          0x200\r
-#define DMC_CHIP_1_CFG_REG          0x204\r
-#define DMC_CHIP_2_CFG_REG          0x208\r
-#define DMC_CHIP_3_CFG_REG          0x20C\r
-\r
-//\r
-// User Defined Pins\r
-//\r
-#define DMC_USER_STATUS_REG         0x300\r
-#define DMC_USER_0_CFG_REG          0x304\r
-#define DMC_USER_1_CFG_REG          0x308\r
-#define DMC_FEATURE_CRTL_REG        0x30C\r
-#define DMC_USER_2_CFG_REG          0x310\r
-\r
-\r
-//\r
-// PHY Register Settings\r
-//\r
-#define TC_UIOLHNC_MASK                         0x000003C0\r
-#define TC_UIOLHNC_SHIFT                        0x6\r
-#define TC_UIOLHPC_MASK                         0x0000003F\r
-#define TC_UIOLHPC_SHIFT                        0x2\r
-#define TC_UIOHOCT_MASK                         0x2\r
-#define TC_UIOHOCT_SHIFT                        0x1\r
-#define TC_UIOHSTOP_SHIFT                       0x0\r
-#define TC_UIOLHXC_VALUE                        0x4                     \r
-\r
-//\r
-// Extended Mode Register settings\r
-//\r
-#define DDR_EMR_OCD_MASK                        0x0000380\r
-#define DDR_EMR_OCD_SHIFT                       0x7\r
-#define DDR_EMR_RTT_MASK                        0x00000044                  // DDR2 Device RTT (ODT) settings\r
-#define DDR_EMR_RTT_SHIFT                       0x2     \r
-#define DDR_EMR_ODS_MASK                        0x00000002                  // DDR2 Output Drive Strength\r
-#define DDR_EMR_ODS_SHIFT                       0x0001\r
-// Termination Values:\r
-#define DDR_EMR_RTT_50                          0x00000044                  // DDR2 50 Ohm termination\r
-#define DDR_EMR_RTT_75R                         0x00000004                  // DDR2 75 Ohm termination\r
-#define DDR_EMR_RTT_150                         0x00000040                  // DDR2 150 Ohm termination\r
-// Output Drive Strength Values:\r
-#define DDR_EMR_ODS_FULL                        0x0                         // DDR2 Full Drive Strength\r
-#define DDR_EMR_ODS_HALF                        0x1                         // DDR2 Half Drive Strength\r
-// OCD values\r
-#define DDR_EMR_OCD_DEFAULT                     0x7\r
-#define DDR_EMR_OCD_NS                          0x0\r
-\r
-#define DDR_EMR_ODS_VAL                         DDR_EMR_ODS_FULL\r
+// Macros for writing to DDR2 controller.\r
+#define DmcWriteReg(reg,val)                    MmioWrite32(DmcBase + reg, val)\r
+#define DmcReadReg(reg)                         MmioRead32(DmcBase + reg)\r
 \r
+// Macros for writing/reading to DDR2 PHY controller\r
+#define DmcPhyWriteReg(reg,val)                    MmioWrite32(DmcPhyBase + reg, val)\r
+#define DmcPhyReadReg(reg)                         MmioRead32(DmcPhyBase + reg)\r
+\r
+// Initialise PL341 Dynamic Memory Controller\r
+VOID\r
+PL341DmcInit (\r
+  IN  PL341_DMC_CONFIG *DmcConfig\r
+  )\r
+{\r
+  UINTN DmcBase;\r
+  UINTN Index;\r
+  UINT32 Chip;\r
+\r
+  DmcBase = DmcConfig->base;\r
+\r
+  // Set config mode\r
+  DmcWriteReg(DMC_COMMAND_REG, DMC_COMMAND_CONFIGURE);\r
+\r
+  //\r
+  // Setup the QoS AXI ID bits\r
+  //\r
+  if (DmcConfig->HasQos) {\r
+    // CLCD AXIID = 000\r
+    DmcWriteReg(DMC_ID_0_CFG_REG, DMC_ID_CFG_QOS_ENABLE | DMC_ID_CFG_QOS_MIN);\r
+\r
+    // Default disable QoS\r
+    DmcWriteReg(DMC_ID_1_CFG_REG, DMC_ID_CFG_QOS_DISABLE);\r
+    DmcWriteReg(DMC_ID_2_CFG_REG, DMC_ID_CFG_QOS_DISABLE);\r
+    DmcWriteReg(DMC_ID_3_CFG_REG, DMC_ID_CFG_QOS_DISABLE);\r
+    DmcWriteReg(DMC_ID_4_CFG_REG, DMC_ID_CFG_QOS_DISABLE);\r
+    DmcWriteReg(DMC_ID_5_CFG_REG, DMC_ID_CFG_QOS_DISABLE);\r
+    DmcWriteReg(DMC_ID_6_CFG_REG, DMC_ID_CFG_QOS_DISABLE);\r
+    DmcWriteReg(DMC_ID_7_CFG_REG, DMC_ID_CFG_QOS_DISABLE);\r
+    DmcWriteReg(DMC_ID_8_CFG_REG, DMC_ID_CFG_QOS_DISABLE);\r
+    DmcWriteReg(DMC_ID_9_CFG_REG, DMC_ID_CFG_QOS_DISABLE);\r
+    DmcWriteReg(DMC_ID_10_CFG_REG, DMC_ID_CFG_QOS_DISABLE);\r
+    DmcWriteReg(DMC_ID_11_CFG_REG, DMC_ID_CFG_QOS_DISABLE);\r
+    DmcWriteReg(DMC_ID_12_CFG_REG, DMC_ID_CFG_QOS_DISABLE);\r
+    DmcWriteReg(DMC_ID_13_CFG_REG, DMC_ID_CFG_QOS_DISABLE);\r
+    DmcWriteReg(DMC_ID_14_CFG_REG, DMC_ID_CFG_QOS_DISABLE);\r
+    DmcWriteReg(DMC_ID_15_CFG_REG, DMC_ID_CFG_QOS_DISABLE);\r
+  }\r
 \r
+  //\r
+  // Initialise memory controlller\r
+  //\r
+  DmcWriteReg(DMC_REFRESH_PRD_REG, DmcConfig->refresh_prd);\r
+  DmcWriteReg(DMC_CAS_LATENCY_REG, DmcConfig->cas_latency);\r
+  DmcWriteReg(DMC_WRITE_LATENCY_REG, DmcConfig->write_latency);\r
+  DmcWriteReg(DMC_T_MRD_REG, DmcConfig->t_mrd);\r
+  DmcWriteReg(DMC_T_RAS_REG, DmcConfig->t_ras);\r
+  DmcWriteReg(DMC_T_RC_REG, DmcConfig->t_rc);\r
+  DmcWriteReg(DMC_T_RCD_REG, DmcConfig->t_rcd);\r
+  DmcWriteReg(DMC_T_RFC_REG, DmcConfig->t_rfc);\r
+  DmcWriteReg(DMC_T_RP_REG, DmcConfig->t_rp);\r
+  DmcWriteReg(DMC_T_RRD_REG, DmcConfig->t_rrd);\r
+  DmcWriteReg(DMC_T_WR_REG, DmcConfig->t_wr);\r
+  DmcWriteReg(DMC_T_WTR_REG, DmcConfig->t_wtr);\r
+  DmcWriteReg(DMC_T_XP_REG, DmcConfig->t_xp);\r
+  DmcWriteReg(DMC_T_XSR_REG, DmcConfig->t_xsr);\r
+  DmcWriteReg(DMC_T_ESR_REG, DmcConfig->t_esr);\r
+  DmcWriteReg(DMC_T_FAW_REG, DmcConfig->t_faw);\r
+  DmcWriteReg(DMC_T_WRLAT_DIFF, DmcConfig->t_wdata_en);\r
+  DmcWriteReg(DMC_T_RDATA_EN, DmcConfig->t_data_en);\r
+\r
+  //\r
+  // Initialise PL341 Mem Config Registers\r
+  //\r
+\r
+  // Set PL341 Memory Config\r
+  DmcWriteReg(DMC_MEMORY_CONFIG_REG, DmcConfig->MemoryCfg);\r
+\r
+  // Set PL341 Memory Config 2\r
+  DmcWriteReg(DMC_MEMORY_CFG2_REG, DmcConfig->MemoryCfg2);\r
+\r
+  // Set PL341 Chip Select <n>\r
+  DmcWriteReg(DMC_CHIP_0_CFG_REG, DmcConfig->ChipCfg0);\r
+  DmcWriteReg(DMC_CHIP_1_CFG_REG, DmcConfig->ChipCfg1);\r
+  DmcWriteReg(DMC_CHIP_2_CFG_REG, DmcConfig->ChipCfg2);\r
+  DmcWriteReg(DMC_CHIP_3_CFG_REG, DmcConfig->ChipCfg3);\r
+\r
+  // Delay\r
+  for (Index = 0; Index < 10; Index++) {\r
+    DmcReadReg(DMC_STATUS_REG);\r
+  }\r
 \r
-#define DmcWriteReg(reg,val)                    MmioWrite32(DmcBase + reg, val)\r
-#define DmcReadReg(reg)                         MmioRead32(DmcBase + reg)\r
+  // Set PL341 Memory Config 3\r
+  DmcWriteReg(DMC_MEMORY_CFG3_REG, DmcConfig->MemoryCfg3);\r
 \r
-// Initialize PL341 Dynamic Memory Controller\r
-VOID PL341DmcInit(struct pl341_dmc_config *config) {\r
-    UINTN   DmcBase = config->base;\r
-    UINT32  i, chip, val32;\r
+  if (DmcConfig->IsUserCfg) {\r
+    //\r
+    // Set Test Chip PHY Registers via PL341 User Config Reg\r
+    // Note that user_cfgX registers are Write Only\r
+    //\r
+    // DLL Freq set = 250MHz - 266MHz\r
+    //\r
+    DmcWriteReg(DMC_USER_0_CFG_REG, DmcConfig->User0Cfg);\r
 \r
-    // Set config mode\r
-    DmcWriteReg(DMC_COMMAND_REG, DMC_COMMAND_CONFIGURE);\r
+    // user_config2\r
+    // ------------\r
+    // Set defaults before calibrating the DDR2 buffer impendence\r
+    // - Disable ODT\r
+    // - Default drive strengths\r
+    DmcWriteReg(DMC_USER_2_CFG_REG, 0x40000198);\r
 \r
     //\r
-    // Setup the QoS AXI ID bits    \r
+    // Auto calibrate the DDR2 buffers impendence\r
     //\r
+    while (!(DmcReadReg(DMC_USER_STATUS_REG) & 0x100));\r
 \r
-    if (config->has_qos) {\r
-  // CLCD AXIID = 000\r
-  DmcWriteReg(DMC_ID_0_CFG_REG, DMC_ID_CFG_QOS_ENABLE | DMC_ID_CFG_QOS_MIN);\r
-\r
-  // Default disable QoS\r
-  DmcWriteReg(DMC_ID_1_CFG_REG, DMC_ID_CFG_QOS_DISABLE);\r
-  DmcWriteReg(DMC_ID_2_CFG_REG, DMC_ID_CFG_QOS_DISABLE);\r
-  DmcWriteReg(DMC_ID_3_CFG_REG, DMC_ID_CFG_QOS_DISABLE);\r
-  DmcWriteReg(DMC_ID_4_CFG_REG, DMC_ID_CFG_QOS_DISABLE);\r
-  DmcWriteReg(DMC_ID_5_CFG_REG, DMC_ID_CFG_QOS_DISABLE);\r
-  DmcWriteReg(DMC_ID_6_CFG_REG, DMC_ID_CFG_QOS_DISABLE);\r
-  DmcWriteReg(DMC_ID_7_CFG_REG, DMC_ID_CFG_QOS_DISABLE);\r
-  DmcWriteReg(DMC_ID_8_CFG_REG, DMC_ID_CFG_QOS_DISABLE);\r
-  DmcWriteReg(DMC_ID_9_CFG_REG, DMC_ID_CFG_QOS_DISABLE);\r
-  DmcWriteReg(DMC_ID_10_CFG_REG, DMC_ID_CFG_QOS_DISABLE);\r
-  DmcWriteReg(DMC_ID_11_CFG_REG, DMC_ID_CFG_QOS_DISABLE);\r
-  DmcWriteReg(DMC_ID_12_CFG_REG, DMC_ID_CFG_QOS_DISABLE);\r
-  DmcWriteReg(DMC_ID_13_CFG_REG, DMC_ID_CFG_QOS_DISABLE);\r
-  DmcWriteReg(DMC_ID_14_CFG_REG, DMC_ID_CFG_QOS_DISABLE);\r
-  DmcWriteReg(DMC_ID_15_CFG_REG, DMC_ID_CFG_QOS_DISABLE);\r
-    }\r
+    // Set the output driven strength\r
+    DmcWriteReg(DMC_USER_2_CFG_REG, 0x40800000 | DmcConfig->User2Cfg);\r
 \r
     //\r
-    // Initialise memory controlller\r
+    // Set PL341 Feature Control Register\r
     //\r
-    DmcWriteReg(DMC_REFRESH_PRD_REG, config->refresh_prd);\r
-    DmcWriteReg(DMC_CAS_LATENCY_REG, config->cas_latency);\r
-    DmcWriteReg(DMC_WRITE_LATENCY_REG, config->write_latency);\r
-    DmcWriteReg(DMC_T_MRD_REG, config->t_mrd);\r
-    DmcWriteReg(DMC_T_RAS_REG, config->t_ras);\r
-    DmcWriteReg(DMC_T_RC_REG, config->t_rc);\r
-    DmcWriteReg(DMC_T_RCD_REG, config->t_rcd);\r
-    DmcWriteReg(DMC_T_RFC_REG, config->t_rfc);\r
-    DmcWriteReg(DMC_T_RP_REG, config->t_rp);\r
-    DmcWriteReg(DMC_T_RRD_REG, config->t_rrd);\r
-    DmcWriteReg(DMC_T_WR_REG, config->t_wr);\r
-    DmcWriteReg(DMC_T_WTR_REG, config->t_wtr);\r
-    DmcWriteReg(DMC_T_XP_REG, config->t_xp);\r
-    DmcWriteReg(DMC_T_XSR_REG, config->t_xsr);\r
-    DmcWriteReg(DMC_T_ESR_REG, config->t_esr);\r
-    DmcWriteReg(DMC_T_FAW_REG, config->t_faw);\r
-\r
-    // =======================================================================\r
-    // Initialise PL341 Mem Config Registers\r
-    // =======================================================================\r
-\r
-    // |======================================\r
-    // | Set PL341 Memory Config\r
-    // |======================================\r
-    DmcWriteReg(DMC_MEMORY_CONFIG_REG, config->memory_cfg);\r
-\r
-    // |======================================\r
-    // | Set PL341 Memory Config 2\r
-    // |======================================\r
-    DmcWriteReg(DMC_MEMORY_CFG2_REG, config->memory_cfg2);\r
-\r
-    // |======================================\r
-    // | Set PL341 Chip Select <n>\r
-    // |======================================\r
-    DmcWriteReg(DMC_CHIP_0_CFG_REG, config->chip_cfg0);\r
-    DmcWriteReg(DMC_CHIP_1_CFG_REG, config->chip_cfg1);\r
-    DmcWriteReg(DMC_CHIP_2_CFG_REG, config->chip_cfg2);\r
-    DmcWriteReg(DMC_CHIP_3_CFG_REG, config->chip_cfg3);\r
-\r
-    // |======================================\r
-    // | Set PL341 Memory Config 3 \r
-    // |======================================\r
-    DmcWriteReg(DMC_MEMORY_CFG3_REG, config->memory_cfg3);\r
-\r
-  // |========================================================\r
-  // |Set Test Chip PHY Registers via PL341 User Config Reg\r
-  // |Note that user_cfgX registers are Write Only\r
-  // |\r
-  // |DLL Freq set = 250MHz - 266MHz\r
-  // |======================================================== \r
-  DmcWriteReg(DMC_USER_0_CFG_REG, 0x7C924924);\r
\r
-  // user_config2\r
-  // ------------\r
-  // Set defaults before calibrating the DDR2 buffer impendence\r
-  // -Disable ODT\r
-  // -Default drive strengths\r
-  DmcWriteReg(DMC_USER_2_CFG_REG, 0x40000198);\r
\r
-  // |=======================================================\r
-  // |Auto calibrate the DDR2 buffers impendence \r
-  // |=======================================================\r
-  val32 = DmcReadReg(DMC_USER_STATUS_REG);\r
-  while (!(val32 & 0x100)) {\r
-      val32 = DmcReadReg(DMC_USER_STATUS_REG);\r
+    // Disable early BRESP - use to optimise CLCD performance\r
+    DmcWriteReg(DMC_FEATURE_CRTL_REG, 0x00000001);\r
   }\r
 \r
-  // Set the output driven strength\r
-  DmcWriteReg(DMC_USER_2_CFG_REG, 0x40800000 | \r
-        (TC_UIOLHXC_VALUE << TC_UIOLHNC_SHIFT) | \r
-        (TC_UIOLHXC_VALUE << TC_UIOLHPC_SHIFT) |\r
-        (0x1 << TC_UIOHOCT_SHIFT) | \r
-        (0x1 << TC_UIOHSTOP_SHIFT));\r
-\r
-  // |======================================\r
-  // | Set PL341 Feature Control Register \r
-  // |======================================\r
-  // | Disable early BRESP - use to optimise CLCD performance\r
-  DmcWriteReg(DMC_FEATURE_CRTL_REG, 0x00000001);\r
\r
-    //=================\r
-    // Config memories\r
-    //=================\r
-\r
-    for (chip = 0; chip <= config-> max_chip; chip++) {\r
-  // send nop\r
-  DmcWriteReg(DMC_DIRECT_CMD_REG, DMC_DIRECT_CMD_CHIP_ADDR(chip) | DMC_DIRECT_CMD_MEMCMD_NOP);\r
-  // pre-charge all\r
-  DmcWriteReg(DMC_DIRECT_CMD_REG, DMC_DIRECT_CMD_CHIP_ADDR(chip) | DMC_DIRECT_CMD_MEMCMD_PRECHARGEALL);\r
-\r
-  // delay\r
-  for (i = 0; i < 10; i++) {\r
-      val32 = DmcReadReg(DMC_STATUS_REG);\r
-  }\r
+  //\r
+  // Config memories\r
+  //\r
+  for (Chip = 0; Chip < DmcConfig->MaxChip; Chip++) {\r
+    // Send nop\r
+    DmcWriteReg(DMC_DIRECT_CMD_REG, DMC_DIRECT_CMD_CHIP_ADDR(Chip) | DMC_DIRECT_CMD_MEMCMD_NOP);\r
 \r
-  // set (EMR2) extended mode register 2\r
-  DmcWriteReg(DMC_DIRECT_CMD_REG, \r
-        DMC_DIRECT_CMD_CHIP_ADDR(chip) | \r
-        DMC_DIRECT_CMD_BANKADDR(2) | \r
-        DMC_DIRECT_CMD_MEMCMD_EXTMODEREG);\r
-  // set (EMR3) extended mode register 3\r
-  DmcWriteReg(DMC_DIRECT_CMD_REG, \r
-        DMC_DIRECT_CMD_CHIP_ADDR(chip) | \r
-        DMC_DIRECT_CMD_BANKADDR(3) | \r
-        DMC_DIRECT_CMD_MEMCMD_EXTMODEREG);\r
-\r
-  // =================================\r
-  //  set (EMR) Extended Mode Register\r
-  // ==================================\r
-  // Put into OCD default state\r
-  DmcWriteReg(DMC_DIRECT_CMD_REG, \r
-        DMC_DIRECT_CMD_CHIP_ADDR(chip) | \r
-        DMC_DIRECT_CMD_BANKADDR(1) | \r
-        DMC_DIRECT_CMD_MEMCMD_EXTMODEREG);\r
-\r
-  // ===========================================================        \r
-  // set (MR) mode register - With DLL reset\r
-  // ===========================================================\r
-  // Burst Length = 4 (010)\r
-  // Burst Type   = Seq (0)\r
-  // Latency      = 4 (100)\r
-  // Test mode    = Off (0)\r
-  // DLL reset    = Yes (1)\r
-  // Wr Recovery  = 4  (011)      \r
-  // PD           = Normal (0)\r
-  DmcWriteReg(DMC_DIRECT_CMD_REG, DMC_DIRECT_CMD_CHIP_ADDR(chip) | 0x00080742);\r
-        \r
-  // pre-charge all \r
-  DmcWriteReg(DMC_DIRECT_CMD_REG, DMC_DIRECT_CMD_CHIP_ADDR(chip) | DMC_DIRECT_CMD_MEMCMD_PRECHARGEALL);\r
-  // auto-refresh \r
-  DmcWriteReg(DMC_DIRECT_CMD_REG, DMC_DIRECT_CMD_CHIP_ADDR(chip) | DMC_DIRECT_CMD_MEMCMD_AUTOREFRESH);\r
-  // auto-refresh \r
-  DmcWriteReg(DMC_DIRECT_CMD_REG, DMC_DIRECT_CMD_CHIP_ADDR(chip) | DMC_DIRECT_CMD_MEMCMD_AUTOREFRESH);\r
-\r
-  // delay\r
-  for (i = 0; i < 10; i++) {\r
-      val32 = DmcReadReg(DMC_STATUS_REG);\r
-  }\r
+    // Pre-charge all\r
+    DmcWriteReg(DMC_DIRECT_CMD_REG, DMC_DIRECT_CMD_CHIP_ADDR(Chip) | DMC_DIRECT_CMD_MEMCMD_PRECHARGEALL);\r
 \r
-  // ===========================================================        \r
-  // set (MR) mode register - Without DLL reset\r
-  // ===========================================================\r
-  // auto-refresh\r
-  DmcWriteReg(DMC_DIRECT_CMD_REG, DMC_DIRECT_CMD_CHIP_ADDR(chip) | DMC_DIRECT_CMD_MEMCMD_AUTOREFRESH);\r
-  DmcWriteReg(DMC_DIRECT_CMD_REG, DMC_DIRECT_CMD_CHIP_ADDR(chip) | 0x00080642);\r
+    // Delay\r
+    for (Index = 0; Index < 10; Index++) {\r
+      DmcReadReg(DMC_STATUS_REG);\r
+    }\r
 \r
-  // delay\r
-  for (i = 0; i < 10; i++) {\r
-    val32 = DmcReadReg(DMC_STATUS_REG);\r
-  }\r
+    // Set (EMR2) extended mode register 2\r
+    DmcWriteReg(DMC_DIRECT_CMD_REG,\r
+      DMC_DIRECT_CMD_CHIP_ADDR(Chip) |\r
+      DMC_DIRECT_CMD_BANKADDR(2) |\r
+      DMC_DIRECT_CMD_MEMCMD_EXTMODEREG);\r
 \r
-  // ======================================================        \r
-  // set (EMR) extended mode register - Enable OCD defaults\r
-  // ====================================================== \r
-  val32 = 0; //NOP\r
-  DmcWriteReg(DMC_DIRECT_CMD_REG, DMC_DIRECT_CMD_CHIP_ADDR(chip) | 0x00090000 |\r
-        (DDR_EMR_OCD_DEFAULT << DDR_EMR_OCD_SHIFT) | \r
-        DDR_EMR_RTT_75R | \r
-        (DDR_EMR_ODS_VAL << DDR_EMR_ODS_MASK));\r
-\r
-  // delay\r
-  for (i = 0; i < 10; i++) {\r
-      val32 = DmcReadReg(DMC_STATUS_REG);\r
-  }\r
+    // Set (EMR3) extended mode register 3\r
+    DmcWriteReg(DMC_DIRECT_CMD_REG,\r
+      DMC_DIRECT_CMD_CHIP_ADDR(Chip) |\r
+      DMC_DIRECT_CMD_BANKADDR(3) |\r
+      DMC_DIRECT_CMD_MEMCMD_EXTMODEREG);\r
 \r
-  // Set (EMR) extended mode register - OCD Exit\r
-  val32 = 0; //NOP\r
-  DmcWriteReg(DMC_DIRECT_CMD_REG, DMC_DIRECT_CMD_CHIP_ADDR(chip) | 0x00090000 | \r
-        (DDR_EMR_OCD_NS << DDR_EMR_OCD_SHIFT) | \r
-        DDR_EMR_RTT_75R |\r
-        (DDR_EMR_ODS_VAL << DDR_EMR_ODS_MASK));\r
+    //\r
+    // Set (EMR) Extended Mode Register\r
+    //\r
+    // Put into OCD default state\r
+    DmcWriteReg(DMC_DIRECT_CMD_REG,DMC_DIRECT_CMD_CHIP_ADDR(Chip) | DMC_DIRECT_CMD_BANKADDR(1) | DMC_DIRECT_CMD_MEMCMD_EXTMODEREG);\r
+\r
+    //\r
+    // Set (MR) mode register - With DLL reset\r
+    //\r
+    DmcWriteReg(DMC_DIRECT_CMD_REG, DMC_DIRECT_CMD_CHIP_ADDR(Chip) | DMC_DIRECT_CMD_MEMCMD_EXTMODEREG | DmcConfig->ModeReg | DDR2_MR_DLL_RESET);\r
+\r
+    // Pre-charge all\r
+    DmcWriteReg(DMC_DIRECT_CMD_REG, DMC_DIRECT_CMD_CHIP_ADDR(Chip) | DMC_DIRECT_CMD_MEMCMD_PRECHARGEALL);\r
+    // Auto-refresh\r
+    DmcWriteReg(DMC_DIRECT_CMD_REG, DMC_DIRECT_CMD_CHIP_ADDR(Chip) | DMC_DIRECT_CMD_MEMCMD_AUTOREFRESH);\r
+    // Auto-refresh\r
+    DmcWriteReg(DMC_DIRECT_CMD_REG, DMC_DIRECT_CMD_CHIP_ADDR(Chip) | DMC_DIRECT_CMD_MEMCMD_AUTOREFRESH);\r
+\r
+    //\r
+    // Set (MR) mode register - Without DLL reset\r
+    //\r
+    DmcWriteReg(DMC_DIRECT_CMD_REG, DMC_DIRECT_CMD_CHIP_ADDR(Chip) | DMC_DIRECT_CMD_MEMCMD_EXTMODEREG | DmcConfig->ModeReg);\r
 \r
+    // Delay\r
+    for (Index = 0; Index < 10; Index++) {\r
+      DmcReadReg(DMC_STATUS_REG);\r
     }\r
 \r
-    //----------------------------------------    \r
-    // go command\r
-    DmcWriteReg(DMC_COMMAND_REG, DMC_COMMAND_GO);\r
+    //\r
+    // Set (EMR) extended mode register - Enable OCD defaults\r
+    //\r
+    DmcWriteReg(DMC_DIRECT_CMD_REG, DMC_DIRECT_CMD_CHIP_ADDR(Chip) | (0x00090000) |\r
+        (1 << DDR_MODESET_SHFT) | (DDR_EMR_OCD_DEFAULT << DDR_EMR_OCD_SHIFT) | DmcConfig->ExtModeReg);\r
 \r
-    // wait for ready\r
-    val32 = DmcReadReg(DMC_STATUS_REG);\r
-    while (!(val32 & DMC_STATUS_READY)) {\r
-        val32 = DmcReadReg(DMC_STATUS_REG);\r
+    // Delay\r
+    for (Index = 0; Index < 10; Index++) {\r
+      DmcReadReg(DMC_STATUS_REG);\r
     }\r
+\r
+    // Set (EMR) extended mode register - OCD Exit\r
+    DmcWriteReg(DMC_DIRECT_CMD_REG, DMC_DIRECT_CMD_CHIP_ADDR(Chip) | (0x00090000) |\r
+        (1 << DDR_MODESET_SHFT) | (DDR_EMR_OCD_NS << DDR_EMR_OCD_SHIFT) | DmcConfig->ExtModeReg);\r
+  }\r
+\r
+  // Move DDR2 Controller to Ready state by issueing GO command\r
+  DmcWriteReg(DMC_COMMAND_REG, DMC_COMMAND_GO);\r
+\r
+  // wait for ready\r
+  while (!(DmcReadReg(DMC_STATUS_REG) & DMC_STATUS_READY));\r
+\r
 }\r