// DDR2 timings
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,
+ .RefreshPeriod = 0x3D0,
+ .CasLatency = 0x8,
+ .WriteLatency = 0x3,
.t_mrd = 0x2,
.t_ras = 0xA,
.t_rc = 0xE,
VOID
)
{
- PL341DmcInit(&DDRTimings);
+ PL341DmcInit(ARM_VE_DMC_BASE, &DDRTimings);
PL301AxiInit(ARM_VE_FAXI_BASE);
}
*\r
**/\r
\r
+#include <Uefi.h>\r
+\r
#include <Library/IoLib.h>\r
#include <Library/DebugLib.h>\r
+\r
#include <Drivers/PL341Dmc.h>\r
\r
// Macros for writing to DDR2 controller.\r
// Initialise PL341 Dynamic Memory Controller\r
VOID\r
PL341DmcInit (\r
- IN PL341_DMC_CONFIG *DmcConfig\r
+ IN UINTN DmcBase,\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
// 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_REFRESH_PRD_REG, DmcConfig->RefreshPeriod);\r
+ DmcWriteReg(DMC_CAS_LATENCY_REG, DmcConfig->CasLatency);\r
+ DmcWriteReg(DMC_WRITE_LATENCY_REG, DmcConfig->WriteLatency);\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
// Set PL341 Memory Config 2\r
DmcWriteReg(DMC_MEMORY_CFG2_REG, DmcConfig->MemoryCfg2);\r
\r
+ // Set PL341 Memory Config 3\r
+ DmcWriteReg(DMC_MEMORY_CFG3_REG, DmcConfig->MemoryCfg3);\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
DmcReadReg(DMC_STATUS_REG);\r
}\r
\r
- // Set PL341 Memory Config 3\r
- DmcWriteReg(DMC_MEMORY_CFG3_REG, DmcConfig->MemoryCfg3);\r
-\r
if (DmcConfig->IsUserCfg) {\r
//\r
// Set Test Chip PHY Registers via PL341 User Config Reg\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
+ // Delay\r
+ for (Index = 0; Index < 10; Index++) {\r
+ DmcReadReg(DMC_STATUS_REG);\r
+ }\r
}\r
\r
// Move DDR2 Controller to Ready state by issueing GO command\r
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 RefreshPeriod;
+ UINT32 CasLatency;
+ UINT32 WriteLatency;
UINT32 t_mrd;
UINT32 t_ras;
UINT32 t_rc;
#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 DDR2_MR_WR_CYCLES_6 (5 << 9)
-VOID PL341DmcInit (
- IN PL341_DMC_CONFIG *config
+VOID
+PL341DmcInit (
+ IN UINTN DmcBase,
+ IN PL341_DMC_CONFIG* DmcConfig
);
VOID PL341DmcPhyInit (