blob: 3d8fe873e1004bbd49d632662b824a9a48a30971 [file] [log] [blame]
#define __ASSEMBLY__
#include <ddrc_mem_map.h>
#include <ddr_phy_mem_map.h>
/*
* Device Configuration Data (DCD)
*
* Each entry must have the format:
* Addr-type Address Value
*
* where:
* Addr-type register length (1,2 or 4 bytes)
* Address absolute address of the register
* value value to be stored in the register
*/
#ifndef SCFW_DCD
// Set DRAM clock frequency for the following operation: 1066MHz
DATA 4 0xff190000 0x00000CB1 /* DRC0 bringup */
#else
/* Set the DRC rate to achieve a DRAM rate as close as possible to 1066MHz. */
uint32_t rate2 = 531000000;
pm_set_clock_rate(SC_PT, SC_R_DRC_0, SC_PM_CLK_MISC0, &rate2);
#endif
DATA 4 0x41C80208 0x1
DATA 4 0x41C80040 0xb // Assert uMCTL2 core reset
DATA 4 0x41C80204 0x1 // Start functional clocks.
/* DRAM 0 controller configuration begin */
DATA 4 DDRC_MSTR_0 0x81040001 // Set DDR3l, BL = 16 and active ranks
DATA 4 DDRC_RFSHTMG_0 0x0082008B // tREFI, tRFC
DATA 4 DDRC_INIT0_0 0x40030106 // pre_cke
DATA 4 DDRC_INIT1_0 0x006A0000 // dram_rstn
DATA 4 DDRC_INIT3_0 0x00240006 // MR0, MR1
DATA 4 DDRC_INIT4_0 0x00280000 // MR2, MR3
DATA 4 DDRC_INIT5_0 0x000C0000 // ZQINIT
DATA 4 DDRC_RANKCTL_0 0x0000072F // diff_rank_wr_gap, diff_rank_rd_gap, max_rank_rd
DATA 4 DDRC_DRAMTMG0_0 0x0F132412 // wr2pr, tFAW, tRASmax, tRASmin
DATA 4 DDRC_DRAMTMG1_0 0x000D0419 // tXP, rd2pre, tRC
DATA 4 DDRC_DRAMTMG2_0 0x0507060B // WL, RL, rd2wr, wr2rd
DATA 4 DDRC_DRAMTMG3_0 0x00002008 // T_MOD, T_MRD
DATA 4 DDRC_DRAMTMG4_0 0x07020408 // trcd, tccd, trrd, trp
DATA 4 DDRC_DRAMTMG5_0 0x06060403 // tCKCKEH, tCKCKEL, tckesr, tcke
DATA 4 DDRC_DRAMTMG8_0 0x03030906 // tckdpde, tckdpdx, tckcsx
DATA 4 DDRC_ZQCTL0_0 0x40AB002B // tZQCAL, tZQLAT
DATA 4 DDRC_ZQCTL1_0 0x02000083 // tZQReset, tzq_short_interval
DATA 4 DDRC_DFITMG0_0 0x048A8207
DATA 4 DDRC_DFITMG1_0 0x00060303 // dfi_t_wrdata_delay, dfi_t_dram_clk_disable, dfi_t_dram_clk_enable
DATA 4 DDRC_DFITMG2_0 0x00000805
DATA 4 DDRC_DFIMISC_0 0x00000001 // dfi_data_cs_polarity
DATA 4 DDRC_DFIUPD0_0 0xE0400018 // Disable the automatic dfi_ctrlupd_req generation
DATA 4 DDRC_DFIUPD1_0 0x001A0057 // dfi_ctrlupd_req generation interval generation (min and max)
DATA 4 DDRC_DFIUPD2_0 0x80000000 // dfi_phyupd_en
DATA 4 DDRC_ADDRMAP0_0 0x0000001F // addrmap_cs_bit0
DATA 4 DDRC_ADDRMAP3_0 0x00000000 // addrmap_col_b9, addrmap_col_b8, addrmap_col_b7, addrmap_col_b6
DATA 4 DDRC_ADDRMAP4_0 0x00001F1F // addrmap_col_b10 and addrmap_col_b11 set to de-activated
DATA 4 DDRC_ADDRMAP1_0 0x00080808 // addrmap_bank_b2, addrmap_bank_b1, addrmap_bank_b0
DATA 4 DDRC_ADDRMAP5_0 0x07070707 // addrmap_row_b11, addrmap_row_b10_b2, addrmap_row_b1, addrmap_row_b0
DATA 4 DDRC_ADDRMAP6_0 0x0F070707 // addrmap_row_b15, addrmap_row_b14, addrmap_row_b13, addrmap_row_b12
DATA 4 DDRC_ECCCFG0_0 0x044FFFC4 // ecc support (uncommented when ECC is enabled)
DATA 4 DDRC_ODTCFG_0 0x06000610
DATA 4 DDRC_ODTMAP_0 0x00000001 // rank[3:0]_wr_odt, rank[3:0]_wr_odt
DATA 4 DDRC_PCTRL_0_0 0x00000001 // Enable port 0
DATA 4 DDRC_DFITMG0_SHADOW_0 0x00808000
DATA 4 DDRC_PWRCTL_0 0x00000000
DATA 4 0x41c80208 0x1
DATA 4 0x41c80040 0xf
DATA 4 0x41c80204 0x1
//-------------------------------------------
// Configure registers for PHY initialization
// Timings are computed for 1066MHz DRAM operation
//--------------------------------------------
// Set-up DRAM Configuration Register
DATA 4 DDR_PHY_DCR_0 0x0000040B // DDR3 selection with 8 bank
// Set-up byte and bit swapping registers
DATA 4 DDR_PHY_DX0DQMAP0_0 0x00071628 // DQ bit 0/1/2/3/4 remapping
DATA 4 DDR_PHY_DX0DQMAP1_0 0x00004053 // DQ bit 5/6/7 and DM remapping
DATA 4 DDR_PHY_DX1DQMAP0_0 0x00073826 // DQ bit 0/1/2/3/4 remapping
DATA 4 DDR_PHY_DX1DQMAP1_0 0x00004150 // DQ bit 5/6/7 and DM remapping
DATA 4 DDR_PHY_DX2DQMAP0_0 0x00053608 // DQ bit 0/1/2/3/4 remapping
DATA 4 DDR_PHY_DX2DQMAP1_0 0x00004271 // DQ bit 5/6/7 and DM remapping
DATA 4 DDR_PHY_DX3DQMAP0_0 0x00053826 // DQ bit 0/1/2/3/4 remapping
DATA 4 DDR_PHY_DX3DQMAP1_0 0x00004170 // DQ bit 5/6/7 and DM remapping
DATA 4 DDR_PHY_DX4DQMAP0_0 0x00005281 // DQ bit 0/1/2/3/4 remapping
DATA 4 DDR_PHY_DX4DQMAP1_0 0x00004736 // DQ bit 5/6/7 and DM remapping
// Set-up PHY General Configuration Register
// PGCR1,4,5,6,7 are untouched
SET_BIT 4 DDR_PHY_PGCR1_0 0x00020000 // DISDIC=1 (no uMCTL2 commands can go to memory)
DATA 4 DDR_PHY_PGCR0_0 0x07001E00 // Set ADCP=1 (Address Copy)
DATA 4 DDR_PHY_PGCR2_0 0x00F1024C // Set tREFPRD
DATA 4 DDR_PHY_PGCR3_0 0x050A1080 // CKEN/CKNEN toggling and polarity
// Set-up PHY Timing Register
// PTR2 is untouched
DATA 4 DDR_PHY_PTR0_0 0x42C21550 // tPLLPD, tPLLGS, tPHYRST
DATA 4 DDR_PHY_PTR1_0 0x340F12BE // tPLLLOCK, tPLLRST
// Set-up PLL Control Register
DATA 4 DDR_PHY_PLLCR0_0 0x011C0000
DATA 4 DDR_PHY_DX8SLbPLLCR0_0 0x011C0000
// Set-up Impedance Control Register
DATA 4 DDR_PHY_ZQCR_0 0x008A2858 // Set ODT_MODE=0b10(DDR3 stype pullup)
// ZPROG_DRAM_ODT and ZPROG_HOST_ODT
DATA 4 DDR_PHY_ZQ0PR0_0 0x77BB // Optimal setting based on factory testing
DATA 4 DDR_PHY_ZQ1PR0_0 0x77BB // Optimal setting based on factory testing
// Set-up PHY Initialization Register
DATA 4 DDR_PHY_PIR_0 0x72
// Launch initialization (set bit 0)
DATA 4 DDR_PHY_PIR_0 0x73
//-------------------------------------------
// Configure registers for DRAM initialization
//-------------------------------------------
// Set-up Mode Register
// MR0, MR3, MR4, MR5 MR6 are untouched
DATA 4 DDR_PHY_MR0_0 0x00000024
DATA 4 DDR_PHY_MR1_0 0x00000006
DATA 4 DDR_PHY_MR2_0 0x00000028
DATA 4 DDR_PHY_MR3_0 0x00000000
// Set-up DRAM Timing Parameters Register
// DTPR6 is untouched
DATA 4 DDR_PHY_DTPR0_0 0x07240E08 // tRRD, tRAS, tRP, tRTP
DATA 4 DDR_PHY_DTPR1_0 0x28260400 // tWLMRD, tFAW, tODTUP, tMRD
DATA 4 DDR_PHY_DTPR2_0 0x01060200 // tRTW, tRTODT, tCMDCKE, tCKE, tVRCG, tXS
DATA 4 DDR_PHY_DTPR3_0 0x02000000 // tODX, tCCD, tDLLK, tDQSCKmax, tDQSCK (FIXME double check tDLLK)
DATA 4 DDR_PHY_DTPR4_0 0x01160C1A // tRFC, tWLO, tXP
DATA 4 DDR_PHY_DTPR5_0 0x00320E09 // tRC, tRCD, tWTR
// Set-up PHY Timing Register
DATA 4 DDR_PHY_PTR3_0 0x0008223A // tDINIT0
DATA 4 DDR_PHY_PTR4_0 0x00000116 // tDINIT1
DATA 4 DDR_PHY_PTR5_0 0x000340E4 // tDINIT2
DATA 4 DDR_PHY_PTR6_0 0x0400042C // tDINIT4, tDINIT3
// Set-up ODT Configuration Register
// DDR ODT_CA signal is tied at boundary of DDR. Thus no need to drive it dynamically.
DATA 4 DDR_PHY_RANKIDR_0 0x00000000 // Select rank 0 to write
DATA 4 DDR_PHY_ODTCR_0 0x00010000 // ODT of rank1 disabled
// Set-up AC I/O Configuration Register
// ACIOCR1-4 are untouched
DATA 4 DDR_PHY_ACIOCR0_0 0x30070400 // PNUM2 (i.e.DDR3) selection [10:11] = 0x2
DATA 4 DDR_PHY_ACIOCR5_0 0x00000000 // I/O mode = DDR3
DATA 4 DDR_PHY_IOVCR0_0 0x03000000
// Set-up DATX8 General Configuration Registers
// DXnGCR0-4 are untouched
DATA 4 DDR_PHY_PGCR5_0 0x01010004
// Set-up DATX8 General Configuration Registers
DATA 4 DDR_PHY_DX0GCR5_0 0x09090930 // Set DXREFISELR0 and DXREFISELR1 to 0x30, maintain other defaults
DATA 4 DDR_PHY_DX1GCR5_0 0x09090930 // Set DXREFISELR0 and DXREFISELR1 to 0x30, maintain other defaults
DATA 4 DDR_PHY_DX2GCR5_0 0x09090930 // Set DXREFISELR0 and DXREFISELR1 to 0x30, maintain other defaults
DATA 4 DDR_PHY_DX3GCR5_0 0x09090930 // Set DXREFISELR0 and DXREFISELR1 to 0x30, maintain other defaults
DATA 4 DDR_PHY_DX4GCR5_0 0x09090930 // Set DXREFISELR0 and DXREFISELR1 to 0x30, maintain other defaults
DATA 4 DDR_PHY_DX0GCR4_0 0x020BBF04 // Set DXREFSSEL,DXREFSSELRANGE,DXREFSEN,DXREFIEN, maintain other defaults
DATA 4 DDR_PHY_DX1GCR4_0 0x020BBF04 // Set DXREFSSEL,DXREFSSELRANGE,DXREFSEN,DXREFIEN, maintain other defaults
DATA 4 DDR_PHY_DX2GCR4_0 0x020BBF04 // Set DXREFSSEL,DXREFSSELRANGE,DXREFSEN,DXREFIEN, maintain other defaults
DATA 4 DDR_PHY_DX3GCR4_0 0x020BBF04 // Set DXREFSSEL,DXREFSSELRANGE,DXREFSEN,DXREFIEN, maintain other defaults
DATA 4 DDR_PHY_DX4GCR4_0 0x020BBF04 // Set DXREFSSEL,DXREFSSELRANGE,DXREFSEN,DXREFIEN, maintain other defaults
// Set-up DATX8 DX Control Register 2
// PREOEX=2.5tCK (0.5 more than MR1), POSOEX=1tCK (0.5 more than in MR3), LPWAKEUP_THRSH=0xA
DATA 4 DDR_PHY_DX8SLbDXCTL2_0 0x001C1400
// Set-up DATX8 IO Control Register
DATA 4 DDR_PHY_DX8SLbIOCR_0 0x00000000 // I/O mode = DDR3
#if DDR_TRAIN_IN_DCD
// Wait PHY initialization end then launch DRAM initialization
// Wait for bit 0 of PGSR0 to be '1'
CHECK_BITS_SET 4 DDR_PHY_PGSR0_0 0x1
CHECK_BITS_CLR 4 DDR_PHY_PGSR0_0 0x7FF40000 // Check that no error occured
// Launch DRAM 0 initialization (set bit 0)
DATA 4 DDR_PHY_PIR_0 0x180
DATA 4 DDR_PHY_PIR_0 0x181
// DRAM 0 initialization end
CHECK_BITS_SET 4 DDR_PHY_PGSR0_0 0x1
CHECK_BITS_CLR 4 DDR_PHY_PGSR0_0 0x7FF40000
//---------------------------------------------------------------//
// DATA training
//---------------------------------------------------------------//
// Set-up Data Training Configuration Register
// Note that DTCR0.RFSHDT are set to 0x0 as a workaround for PHY bug (Synopsys
// case 9001045655: Design limitation in DDR3 mode: REFRESH must be disabled during DQS2DQ training).
// (FYI avoiding refresh during training leads to Denali error (CUMULATIVE_REFRESH_POSTPONE_EXCEEDS_MAX_ALLOWED).
DATA 4 DDR_PHY_DTCR0_0 0x800031CF // Set DTRPTN to 0x7. RFSHDT=0
DATA 4 DDR_PHY_DTCR1_0 0x00010237 // Set RANKEN=3
// CLR_BIT 4 DDR_PHY_DX4GCR1_0 0xFF // disable byte 4 (this line is commented out when ECC is enabled)
// Launch Write leveling
DATA 4 DDR_PHY_PIR_0 0x200
DATA 4 DDR_PHY_PIR_0 0x201
// Wait Write leveling to complete
CHECK_BITS_SET 4 DDR_PHY_PGSR0_0 0x1
CHECK_BITS_CLR 4 DDR_PHY_PGSR0_0 0x00200000
// Set DQS/DQSn glitch suppression resistor for training PHY0
DATA 4 DDR_PHY_DX8SLbDQSCTL_0 0x012640F7
// Launch Read DQS training
DATA 4 DDR_PHY_PIR_0 0x400
DATA 4 DDR_PHY_PIR_0 0x401
// Wait Read DQS training to complete PHY0
CHECK_BITS_SET 4 DDR_PHY_PGSR0_0 0x1
CHECK_BITS_CLR 4 DDR_PHY_PGSR0_0 0x00400000
// Remove DQS/DQSn glitch suppression resistor PHY0
DATA 4 DDR_PHY_DX8SLbDQSCTL_0 0x01264000
// DQS2DQ training, Write leveling, Deskew and eye trainings
DATA 4 DDR_PHY_PIR_0 0x0000F800
DATA 4 DDR_PHY_PIR_0 0x0000F801
// Wait for training to complete
CHECK_BITS_SET 4 DDR_PHY_PGSR0_0 0x1
CHECK_BITS_CLR 4 DDR_PHY_PGSR0_0 0x7FF40000
//Re-allow uMCTL2 to send commands to DDR
CLR_BIT 4 DDR_PHY_PGCR1_0 0x00020000 // DISDIC=0, PUBMODE=0
//Check that controller is ready to operate
CHECK_BITS_SET 4 DDRC_STAT_0 0x1
#endif
// ECC Support (the following lines are uncommented when ECC is enabled)
DATA 4 DDRC_PCTRL_0_0 0x00000000 // Disable Port 0
DATA 4 DDRC_SBRCTL_0 0x00000014 // Scrub_mode = 1
DATA 4 DDRC_SBRWDATA0_0 0x55AA55AA // SBRWDATA0 = 55AA55AA
DATA 4 DDRC_SBRCTL_0 0x00000015 // Scrub_en = 1
CHECK_BITS_SET 4 DDRC_SBRSTAT_0 0x2 // Wait for Scrub done
CHECK_BITS_CLR 4 DDRC_SBRSTAT_0 0x1 // Wait for Scrub done
DATA 4 DDRC_SBRCTL_0 0x00000014 // Scrub_en = 0
DATA 4 DDRC_SBRCTL_0 0x000FFF10 // Scrub_interval = 1
DATA 4 DDRC_SBRCTL_0 0x000FFF11 // Scrub_en = 1
DATA 4 DDRC_PCTRL_0_0 0x00000001 // Enable Port 0