]> git.proxmox.com Git - mirror_edk2.git/commitdiff
ArmPkg/PL34xDmc: Remove magic values in PL310L2Cache and clean the code
authoroliviermartin <oliviermartin@6f19259b-4bc3-4df7-8a09-765794883524>
Fri, 3 Jun 2011 09:21:30 +0000 (09:21 +0000)
committeroliviermartin <oliviermartin@6f19259b-4bc3-4df7-8a09-765794883524>
Fri, 3 Jun 2011 09:21:30 +0000 (09:21 +0000)
git-svn-id: https://edk2.svn.sourceforge.net/svnroot/edk2/trunk/edk2@11736 6f19259b-4bc3-4df7-8a09-765794883524

ArmPkg/Drivers/PL34xDmc/PL341Dmc.c
ArmPkg/Include/Drivers/PL341Dmc.h
ArmPlatformPkg/ArmVExpressPkg/Library/ArmVExpressLibCTA9x4/CTA9x4.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
index 6ccc8482b583c5958af78b3e8dcd8eb52a656718..461ec16cc2b2a3bb4d970e7f323ecceda36fdc8b 100644 (file)
 *
 **/
 
-#ifndef PL341DMC_H_
-#define PL341DMC_H_
-
-
-struct pl341_dmc_config {
-    UINTN  base;           // base address for the controller
-    UINTN  has_qos;        // has QoS registers
-    UINTN  max_chip;       // number of memory chips accessible
-    UINT32  refresh_prd;
-    UINT32  cas_latency;
-    UINT32  write_latency;
-    UINT32  t_mrd;
-    UINT32  t_ras;
-    UINT32  t_rc;
-    UINT32  t_rcd;
-    UINT32  t_rfc;
-    UINT32  t_rp;
-    UINT32  t_rrd;
-    UINT32  t_wr;
-    UINT32  t_wtr;
-    UINT32  t_xp;
-    UINT32  t_xsr;
-    UINT32  t_esr;
-    UINT32  memory_cfg;
-    UINT32  memory_cfg2;
-    UINT32  memory_cfg3;
-    UINT32  chip_cfg0;
-    UINT32  chip_cfg1;
-    UINT32  chip_cfg2;
-    UINT32  chip_cfg3;
-    UINT32  t_faw;
-};
+#ifndef _PL341DMC_H_
+#define _PL341DMC_H_
+
+
+typedef struct  {
+    UINTN      base;           // base address for the controller
+    UINTN      phy_ctrl_base;  // DDR2 Phy control base
+    UINTN      HasQos;        // has QoS registers
+    UINTN      MaxChip;       // number of memory chips accessible
+    BOOLEAN  IsUserCfg;
+    UINT32  User0Cfg;
+    UINT32  User2Cfg;
+    UINT32     refresh_prd;
+    UINT32     cas_latency;
+    UINT32     write_latency;
+    UINT32     t_mrd;
+    UINT32     t_ras;
+    UINT32     t_rc;
+    UINT32     t_rcd;
+    UINT32     t_rfc;
+    UINT32     t_rp;
+    UINT32     t_rrd;
+    UINT32     t_wr;
+    UINT32     t_wtr;
+    UINT32     t_xp;
+    UINT32     t_xsr;
+    UINT32     t_esr;
+    UINT32     MemoryCfg;
+    UINT32     MemoryCfg2;
+    UINT32     MemoryCfg3;
+    UINT32     ChipCfg0;
+    UINT32     ChipCfg1;
+    UINT32     ChipCfg2;
+    UINT32     ChipCfg3;
+    UINT32     t_faw;
+    UINT32     t_data_en;
+    UINT32     t_wdata_en;
+    UINT32  ModeReg;
+    UINT32  ExtModeReg;
+} PL341_DMC_CONFIG;
 
 /* Memory config bit fields */
 #define DMC_MEMORY_CONFIG_COLUMN_ADDRESS_9      0x1
@@ -76,9 +84,263 @@ struct pl341_dmc_config {
 #define DMC_MEMORY_CFG2_MEM_WIDTH_64    (0x2 << 6)
 #define DMC_MEMORY_CFG2_MEM_WIDTH_RESERVED  (0x3 << 6)
 
+//
+// DMC Configuration Register Map
+//
+#define DMC_STATUS_REG              0x00
+#define DMC_COMMAND_REG             0x04
+#define DMC_DIRECT_CMD_REG          0x08
+#define DMC_MEMORY_CONFIG_REG       0x0C
+#define DMC_REFRESH_PRD_REG         0x10
+#define DMC_CAS_LATENCY_REG         0x14
+#define DMC_WRITE_LATENCY_REG       0x18
+#define DMC_T_MRD_REG               0x1C
+#define DMC_T_RAS_REG               0x20
+#define DMC_T_RC_REG                0x24
+#define DMC_T_RCD_REG               0x28
+#define DMC_T_RFC_REG               0x2C
+#define DMC_T_RP_REG                0x30
+#define DMC_T_RRD_REG               0x34
+#define DMC_T_WR_REG                0x38
+#define DMC_T_WTR_REG               0x3C
+#define DMC_T_XP_REG                0x40
+#define DMC_T_XSR_REG               0x44
+#define DMC_T_ESR_REG               0x48
+#define DMC_MEMORY_CFG2_REG         0x4C
+#define DMC_MEMORY_CFG3_REG         0x50
+#define DMC_T_FAW_REG               0x54
+#define DMC_T_RDATA_EN              0x5C       /* DFI read data enable register */
+#define DMC_T_WRLAT_DIFF            0x60        /* DFI write data enable register */
+
+// Returns the state of the memory controller:
+#define DMC_STATUS_CONFIG       0x0
+#define DMC_STATUS_READY        0x1
+#define DMC_STATUS_PAUSED       0x2
+#define DMC_STATUS_LOWPOWER     0x3
+
+// Changes the state of the memory controller:
+#define DMC_COMMAND_GO              0x0
+#define DMC_COMMAND_SLEEP           0x1
+#define DMC_COMMAND_WAKEUP          0x2
+#define DMC_COMMAND_PAUSE           0x3
+#define DMC_COMMAND_CONFIGURE       0x4
+#define DMC_COMMAND_ACTIVEPAUSE     0x7
+
+// Determines the command required
+#define DMC_DIRECT_CMD_MEMCMD_PRECHARGEALL      0x0
+#define DMC_DIRECT_CMD_MEMCMD_AUTOREFRESH       (0x1 << 18)
+#define DMC_DIRECT_CMD_MEMCMD_MODEREG           (0x2 << 18)
+#define DMC_DIRECT_CMD_MEMCMD_EXTMODEREG        (0x2 << 18)
+#define DMC_DIRECT_CMD_MEMCMD_NOP               (0x3 << 18)
+#define DMC_DIRECT_CMD_MEMCMD_DPD               (0x1 << 22)
+#define DMC_DIRECT_CMD_BANKADDR(n)              ((n & 0x3) << 16)
+#define DMC_DIRECT_CMD_CHIP_ADDR(n)             ((n & 0x3) << 20)
+
+
+//
+// AXI ID configuration register map
+//
+#define DMC_ID_0_CFG_REG            0x100
+#define DMC_ID_1_CFG_REG            0x104
+#define DMC_ID_2_CFG_REG            0x108
+#define DMC_ID_3_CFG_REG            0x10C
+#define DMC_ID_4_CFG_REG            0x110
+#define DMC_ID_5_CFG_REG            0x114
+#define DMC_ID_6_CFG_REG            0x118
+#define DMC_ID_7_CFG_REG            0x11C
+#define DMC_ID_8_CFG_REG            0x120
+#define DMC_ID_9_CFG_REG            0x124
+#define DMC_ID_10_CFG_REG           0x128
+#define DMC_ID_11_CFG_REG           0x12C
+#define DMC_ID_12_CFG_REG           0x130
+#define DMC_ID_13_CFG_REG           0x134
+#define DMC_ID_14_CFG_REG           0x138
+#define DMC_ID_15_CFG_REG           0x13C
+
+// Set the QoS
+#define DMC_ID_CFG_QOS_DISABLE      0
+#define DMC_ID_CFG_QOS_ENABLE       1
+#define DMC_ID_CFG_QOS_MIN          2
+
+
+//
+// Chip configuration register map
+//
+#define DMC_CHIP_0_CFG_REG          0x200
+#define DMC_CHIP_1_CFG_REG          0x204
+#define DMC_CHIP_2_CFG_REG          0x208
+#define DMC_CHIP_3_CFG_REG          0x20C
+
+//
+// User Defined Pins
+//
+#define DMC_USER_STATUS_REG         0x300
+#define DMC_USER_0_CFG_REG          0x304
+#define DMC_USER_1_CFG_REG          0x308
+#define DMC_FEATURE_CRTL_REG        0x30C
+#define DMC_USER_2_CFG_REG          0x310
+
+
+//
+// PHY Register Settings
+//
+#define PHY_PTM_DFI_CLK_RANGE                                  0xE00           // DDR2 PHY PTM register offset
+#define PHY_PTM_IOTERM                                                 0xE04
+#define PHY_PTM_PLL_EN                                         0xe0c
+#define PHY_PTM_PLL_RANGE                                      0xe18
+#define PHY_PTM_FEEBACK_DIV                                    0xe1c
+#define PHY_PTM_RCLK_DIV                                       0xe20
+#define PHY_PTM_LOCK_STATUS                                    0xe28
+#define PHY_PTM_INIT_DONE                                      0xe34
+#define PHY_PTM_ADDCOM_IOSTR_OFF                               0xec8
+#define PHY_PTM_SQU_TRAINING                                   0xee8
+#define PHY_PTM_SQU_STAT                                       0xeec
+
+// ==============================================================================
+// PIPD 40G DDR2/DDR3 PHY Register definitions
+//
+// Offsets from APB Base Address
+// ==============================================================================
+#define PHY_BYTE0_OFFSET                                       0x000
+#define PHY_BYTE1_OFFSET                                       0x200
+#define PHY_BYTE2_OFFSET                                       0x400
+#define PHY_BYTE3_OFFSET                                       0x600
+
+#define PHY_BYTE0_COARSE_SQADJ_INIT                    0x064   ;// Coarse squelch adjust
+#define PHY_BYTE1_COARSE_SQADJ_INIT                    0x264   ;// Coarse squelch adjust
+#define PHY_BYTE2_COARSE_SQADJ_INIT                    0x464   ;// Coarse squelch adjust
+#define PHY_BYTE3_COARSE_SQADJ_INIT                    0x664   ;// Coarse squelch adjust
+
+#define PHY_BYTE0_IOSTR_OFFSET                         0x004
+#define PHY_BYTE1_IOSTR_OFFSET                         0x204
+#define PHY_BYTE2_IOSTR_OFFSET                         0x404
+#define PHY_BYTE3_IOSTR_OFFSET                         0x604
+
+
+;//--------------------------------------------------------------------------
+
+// DFI Clock ranges:
+
+#define PHY_PTM_DFI_CLK_RANGE_200MHz                   0x0
+#define PHY_PTM_DFI_CLK_RANGE_201_267MHz       0x1
+#define PHY_PTM_DFI_CLK_RANGE_268_333MHz       0x2
+#define PHY_PTM_DFI_CLK_RANGE_334_400MHz       0x3
+#define PHY_PTM_DFI_CLK_RANGE_401_533MHz       0x4
+#define PHY_PTM_DFI_CLK_RANGE_534_667MHz       0x5
+#define PHY_PTM_DFI_CLK_RANGE_668_800MHz       0x6
+
+
+
+#define  PHY_PTM_DFI_CLK_RANGE_VAL                     PHY_PTM_DFI_CLK_RANGE_334_400MHz
+
+//--------------------------------------------------------------------------
+
+
+// PLL Range
+
+#define PHY_PTM_PLL_RANGE_200_400MHz           0x0     // b0 = frequency >= 200 MHz and < 400 MHz
+#define PHY_PTM_PLL_RANGE_400_800MHz           0x1     // b1 = frequency >= 400 MHz.
+#define PHY_PTM_FEEBACK_DIV_200_400MHz         0x0     // b0 = frequency >= 200 MHz and < 400 MHz
+#define PHY_PTM_FEEBACK_DIV_400_800MHz         0x1     // b1 = frequency >= 400 MHz.
+#define PHY_PTM_REFCLK_DIV_200_400MHz          0x0
+#define PHY_PTM_REFCLK_DIV_400_800MHz          0x1
+
+
+// PHY Reset in SCC
+
+#define SCC_PHY_RST_REG_OFF                            0xA0
+#define SCC_REMAP_REG_OFF                      0x00
+#define SCC_PHY_RST0_MASK                                      1               // Active LOW PHY0 reset
+#define SCC_PHY_RST0_SHFT                                      0               // Active LOW PHY0 reset
+#define SCC_PHY_RST1_MASK                                      0x100   // Active LOW PHY1 reset
+#define SCC_PHY_RST1_SHFT                                      8               // Active LOW PHY1 reset
+
+#define TC_UIOLHNC_MASK                         0x000003C0
+#define TC_UIOLHNC_SHIFT                        0x6
+#define TC_UIOLHPC_MASK                         0x0000003F
+#define TC_UIOLHPC_SHIFT                        0x2
+#define TC_UIOHOCT_MASK                         0x2
+#define TC_UIOHOCT_SHIFT                        0x1
+#define TC_UIOHSTOP_SHIFT                       0x0
+#define TC_UIOLHXC_VALUE                        0x4
+
+#define PHY_PTM_SQU_TRAINING_ENABLE                            0x1
+#define PHY_PTM_SQU_TRAINING_DISABLE                           0x0
+
+
+//--------------------------------------
+// JEDEC DDR2 Device Register definitions and settings
+//--------------------------------------
+#define DDR_MODESET_SHFT                                               14
+#define DDR_MODESET_MR                                                 0x0             ;// Mode register
+#define DDR_MODESET_EMR                                                        0x1             ;// Extended Mode register
+#define DDR_MODESET_EMR2                                               0x2
+#define DDR_MODESET_EMR3                                               0x3
+
+//
+// Extended Mode Register settings
+//
+#define DDR_EMR_OCD_MASK                        0x0000380
+#define DDR_EMR_OCD_SHIFT                       0x7
+#define DDR_EMR_RTT_MASK                        0x00000044                  // DDR2 Device RTT (ODT) settings
+#define DDR_EMR_RTT_SHIFT                       0x2
+#define DDR_EMR_ODS_MASK                        0x00000002                  // DDR2 Output Drive Strength
+#define DDR_EMR_ODS_SHIFT                       0x0001
+
+// Termination Values:
+#define DDR_EMR_RTT_50R                         0x00000044                  // DDR2 50 Ohm termination
+#define DDR_EMR_RTT_75R                         0x00000004                  // DDR2 75 Ohm termination
+#define DDR_EMR_RTT_150                         0x00000040                  // DDR2 150 Ohm termination
+
+// Output Drive Strength Values:
+#define DDR_EMR_ODS_FULL                        0x0                         // DDR2 Full Drive Strength
+#define DDR_EMR_ODS_HALF                        0x1                         // DDR2 Half Drive Strength
+
+// OCD values
+#define DDR_EMR_OCD_DEFAULT                     0x7
+#define DDR_EMR_OCD_NS                          0x0
+
+#define DDR_EMR_ODS_VAL                         DDR_EMR_ODS_FULL
+
+#define DDR_SDRAM_START_ADDR                                   0x10000000
+
+
+// ----------------------------------------
+// PHY IOTERM values
+// ----------------------------------------
+#define PHY_PTM_IOTERM_OFF                                     0x0
+#define PHY_PTM_IOTERM_150R                                    0x1
+#define PHY_PTM_IOTERM_75R                                     0x2
+#define PHY_PTM_IOTERM_50R                                     0x3
+
+#define PHY_BYTE_IOSTR_60OHM                           0x0
+#define PHY_BYTE_IOSTR_40OHM                           0x1
+#define PHY_BYTE_IOSTR_30OHM                           0x2
+#define PHY_BYTE_IOSTR_30AOHM                          0x3
+
+#define DDR2_MR_BURST_LENGTH_4     (2)
+#define DDR2_MR_BURST_LENGTH_8     (3)
+#define DDR2_MR_DLL_RESET          (1 << 8)
+#define DDR2_MR_CAS_LATENCY_4      (4 << 4)
+#define DDR2_MR_CAS_LATENCY_5      (5 << 4)
+#define DDR2_MR_CAS_LATENCY_6      (6 << 4)
+#define DDR2_MR_WR_CYCLES_2        (1 << 9)
+#define DDR2_MR_WR_CYCLES_3        (2 << 9)
+#define DDR2_MR_WR_CYCLES_4        (3 << 9)
+#define DDR2_MR_WR_CYCLES_5        (4 << 9)
+#define DDR2_MR_WR_CYCLES_6        (5 << 9)
+
 
+VOID PL341DmcInit (
+  IN PL341_DMC_CONFIG *config
+  );
 
-VOID PL341DmcInit(struct pl341_dmc_config *config);
+VOID PL341DmcPhyInit (
+  IN UINTN   DmcPhyBase
+  );
 
+VOID PL341DmcTrainPHY (
+  IN UINTN   DmcPhyBase
+  );
 
-#endif /* PL341DMC_H_ */
+#endif /* _PL341DMC_H_ */
index b8d1ff0f722f33330c83e3b0a5ae4b1d888ff1c4..c2783bbca27a964a5e473e1557f0596030d7a2c7 100644 (file)
 #define SerialPrint(txt)  SerialPortWrite (txt, AsciiStrLen(txt)+1);
 
 // DDR2 timings
-struct pl341_dmc_config ddr_timings = {
-    .base              = ARM_VE_DMC_BASE,
-    .has_qos           = 1,
-    .refresh_prd       = 0x3D0,
-    .cas_latency       = 0x8,
-    .write_latency     = 0x3,
-    .t_mrd             = 0x2,
-    .t_ras             = 0xA,
-    .t_rc              = 0xE,
-    .t_rcd             = 0x104,
-    .t_rfc             = 0x2f32,
-    .t_rp              = 0x14,
-    .t_rrd             = 0x2,
-    .t_wr              = 0x4,
-    .t_wtr             = 0x2,
-    .t_xp              = 0x2,
-    .t_xsr             = 0xC8,
-    .t_esr             = 0x14,
-    .memory_cfg                = DMC_MEMORY_CONFIG_ACTIVE_CHIP_1 | DMC_MEMORY_CONFIG_BURST_4 |
-                          DMC_MEMORY_CONFIG_ROW_ADDRESS_15 | DMC_MEMORY_CONFIG_COLUMN_ADDRESS_10,
-    .memory_cfg2       = DMC_MEMORY_CFG2_DQM_INIT | DMC_MEMORY_CFG2_CKE_INIT |
-                                                 DMC_MEMORY_CFG2_BANK_BITS_3 | DMC_MEMORY_CFG2_MEM_WIDTH_32,
-    .memory_cfg3       = 0x00000001,
-    .chip_cfg0         = 0x00010000,
-    .t_faw             = 0x00000A0D,
+PL341_DMC_CONFIG DDRTimings = {
+  .base   = ARM_VE_DMC_BASE,
+  .phy_ctrl_base  = 0x0,  //There is no DDR2 PHY controller on CTA9 test chip
+  .MaxChip   = 1,
+  .IsUserCfg = TRUE,
+  .User0Cfg = 0x7C924924,
+  .User2Cfg = (TC_UIOLHXC_VALUE << TC_UIOLHNC_SHIFT) | (TC_UIOLHXC_VALUE << TC_UIOLHPC_SHIFT) | (0x1 << TC_UIOHOCT_SHIFT) | (0x1 << TC_UIOHSTOP_SHIFT),
+  .HasQos    = TRUE,
+  .refresh_prd  = 0x3D0,
+  .cas_latency  = 0x8,
+  .write_latency  = 0x3,
+  .t_mrd    = 0x2,
+  .t_ras    = 0xA,
+  .t_rc   = 0xE,
+  .t_rcd    = 0x104,
+  .t_rfc    = 0x2f32,
+  .t_rp   = 0x14,
+  .t_rrd    = 0x2,
+  .t_wr   = 0x4,
+  .t_wtr    = 0x2,
+  .t_xp   = 0x2,
+  .t_xsr    = 0xC8,
+  .t_esr    = 0x14,
+  .MemoryCfg   = DMC_MEMORY_CONFIG_ACTIVE_CHIP_1 | DMC_MEMORY_CONFIG_BURST_4 |
+                        DMC_MEMORY_CONFIG_ROW_ADDRESS_15 | DMC_MEMORY_CONFIG_COLUMN_ADDRESS_10,
+  .MemoryCfg2  = DMC_MEMORY_CFG2_DQM_INIT | DMC_MEMORY_CFG2_CKE_INIT |
+            DMC_MEMORY_CFG2_BANK_BITS_3 | DMC_MEMORY_CFG2_MEM_WIDTH_32,
+  .MemoryCfg3  = 0x00000001,
+  .ChipCfg0    = 0x00010000,
+  .t_faw    = 0x00000A0D,
+  .ModeReg = DDR2_MR_BURST_LENGTH_4 | DDR2_MR_CAS_LATENCY_4 | DDR2_MR_WR_CYCLES_4,
+  .ExtModeReg = DDR_EMR_RTT_50R | (DDR_EMR_ODS_VAL << DDR_EMR_ODS_MASK),
 };
 
 /**
@@ -219,6 +226,6 @@ ArmPlatformInitializeSystemMemory (
   VOID
   )
 {
-  PL341DmcInit(&ddr_timings);
+  PL341DmcInit(&DDRTimings);
   PL301AxiInit(ARM_VE_FAXI_BASE);
 }