ddr3.c 4.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163
  1. /*
  2. * Keystone2: DDR3 initialization
  3. *
  4. * (C) Copyright 2012-2014
  5. * Texas Instruments Incorporated, <www.ti.com>
  6. *
  7. * SPDX-License-Identifier: GPL-2.0+
  8. */
  9. #include <asm/io.h>
  10. #include <common.h>
  11. #include <asm/arch/ddr3.h>
  12. #include <asm/arch/psc_defs.h>
  13. void ddr3_init_ddrphy(u32 base, struct ddr3_phy_config *phy_cfg)
  14. {
  15. unsigned int tmp;
  16. while ((__raw_readl(base + KS2_DDRPHY_PGSR0_OFFSET)
  17. & 0x00000001) != 0x00000001)
  18. ;
  19. __raw_writel(phy_cfg->pllcr, base + KS2_DDRPHY_PLLCR_OFFSET);
  20. tmp = __raw_readl(base + KS2_DDRPHY_PGCR1_OFFSET);
  21. tmp &= ~(phy_cfg->pgcr1_mask);
  22. tmp |= phy_cfg->pgcr1_val;
  23. __raw_writel(tmp, base + KS2_DDRPHY_PGCR1_OFFSET);
  24. __raw_writel(phy_cfg->ptr0, base + KS2_DDRPHY_PTR0_OFFSET);
  25. __raw_writel(phy_cfg->ptr1, base + KS2_DDRPHY_PTR1_OFFSET);
  26. __raw_writel(phy_cfg->ptr3, base + KS2_DDRPHY_PTR3_OFFSET);
  27. __raw_writel(phy_cfg->ptr4, base + KS2_DDRPHY_PTR4_OFFSET);
  28. tmp = __raw_readl(base + KS2_DDRPHY_DCR_OFFSET);
  29. tmp &= ~(phy_cfg->dcr_mask);
  30. tmp |= phy_cfg->dcr_val;
  31. __raw_writel(tmp, base + KS2_DDRPHY_DCR_OFFSET);
  32. __raw_writel(phy_cfg->dtpr0, base + KS2_DDRPHY_DTPR0_OFFSET);
  33. __raw_writel(phy_cfg->dtpr1, base + KS2_DDRPHY_DTPR1_OFFSET);
  34. __raw_writel(phy_cfg->dtpr2, base + KS2_DDRPHY_DTPR2_OFFSET);
  35. __raw_writel(phy_cfg->mr0, base + KS2_DDRPHY_MR0_OFFSET);
  36. __raw_writel(phy_cfg->mr1, base + KS2_DDRPHY_MR1_OFFSET);
  37. __raw_writel(phy_cfg->mr2, base + KS2_DDRPHY_MR2_OFFSET);
  38. __raw_writel(phy_cfg->dtcr, base + KS2_DDRPHY_DTCR_OFFSET);
  39. __raw_writel(phy_cfg->pgcr2, base + KS2_DDRPHY_PGCR2_OFFSET);
  40. __raw_writel(phy_cfg->zq0cr1, base + KS2_DDRPHY_ZQ0CR1_OFFSET);
  41. __raw_writel(phy_cfg->zq1cr1, base + KS2_DDRPHY_ZQ1CR1_OFFSET);
  42. __raw_writel(phy_cfg->zq2cr1, base + KS2_DDRPHY_ZQ2CR1_OFFSET);
  43. __raw_writel(phy_cfg->pir_v1, base + KS2_DDRPHY_PIR_OFFSET);
  44. while ((__raw_readl(base + KS2_DDRPHY_PGSR0_OFFSET) & 0x1) != 0x1)
  45. ;
  46. __raw_writel(phy_cfg->pir_v2, base + KS2_DDRPHY_PIR_OFFSET);
  47. while ((__raw_readl(base + KS2_DDRPHY_PGSR0_OFFSET) & 0x1) != 0x1)
  48. ;
  49. }
  50. void ddr3_init_ddremif(u32 base, struct ddr3_emif_config *emif_cfg)
  51. {
  52. __raw_writel(emif_cfg->sdcfg, base + KS2_DDR3_SDCFG_OFFSET);
  53. __raw_writel(emif_cfg->sdtim1, base + KS2_DDR3_SDTIM1_OFFSET);
  54. __raw_writel(emif_cfg->sdtim2, base + KS2_DDR3_SDTIM2_OFFSET);
  55. __raw_writel(emif_cfg->sdtim3, base + KS2_DDR3_SDTIM3_OFFSET);
  56. __raw_writel(emif_cfg->sdtim4, base + KS2_DDR3_SDTIM4_OFFSET);
  57. __raw_writel(emif_cfg->zqcfg, base + KS2_DDR3_ZQCFG_OFFSET);
  58. __raw_writel(emif_cfg->sdrfc, base + KS2_DDR3_SDRFC_OFFSET);
  59. }
  60. void ddr3_reset_ddrphy(void)
  61. {
  62. u32 tmp;
  63. /* Assert DDR3A PHY reset */
  64. tmp = readl(KS2_DDR3APLLCTL1);
  65. tmp |= KS2_DDR3_PLLCTRL_PHY_RESET;
  66. writel(tmp, KS2_DDR3APLLCTL1);
  67. /* wait 10us to catch the reset */
  68. udelay(10);
  69. /* Release DDR3A PHY reset */
  70. tmp = readl(KS2_DDR3APLLCTL1);
  71. tmp &= ~KS2_DDR3_PLLCTRL_PHY_RESET;
  72. __raw_writel(tmp, KS2_DDR3APLLCTL1);
  73. }
  74. #ifdef CONFIG_SOC_K2HK
  75. /**
  76. * ddr3_reset_workaround - reset workaround in case if leveling error
  77. * detected for PG 1.0 and 1.1 k2hk SoCs
  78. */
  79. void ddr3_err_reset_workaround(void)
  80. {
  81. unsigned int tmp;
  82. unsigned int tmp_a;
  83. unsigned int tmp_b;
  84. /*
  85. * Check for PGSR0 error bits of DDR3 PHY.
  86. * Check for WLERR, QSGERR, WLAERR,
  87. * RDERR, WDERR, REERR, WEERR error to see if they are set or not
  88. */
  89. tmp_a = __raw_readl(KS2_DDR3A_DDRPHYC + KS2_DDRPHY_PGSR0_OFFSET);
  90. tmp_b = __raw_readl(KS2_DDR3B_DDRPHYC + KS2_DDRPHY_PGSR0_OFFSET);
  91. if (((tmp_a & 0x0FE00000) != 0) || ((tmp_b & 0x0FE00000) != 0)) {
  92. printf("DDR Leveling Error Detected!\n");
  93. printf("DDR3A PGSR0 = 0x%x\n", tmp_a);
  94. printf("DDR3B PGSR0 = 0x%x\n", tmp_b);
  95. /*
  96. * Write Keys to KICK registers to enable writes to registers
  97. * in boot config space
  98. */
  99. __raw_writel(KS2_KICK0_MAGIC, KS2_KICK0);
  100. __raw_writel(KS2_KICK1_MAGIC, KS2_KICK1);
  101. /*
  102. * Move DDR3A Module out of reset isolation by setting
  103. * MDCTL23[12] = 0
  104. */
  105. tmp_a = __raw_readl(KS2_PSC_BASE +
  106. PSC_REG_MDCTL(KS2_LPSC_EMIF4F_DDR3A));
  107. tmp_a = PSC_REG_MDCTL_SET_RESET_ISO(tmp_a, 0);
  108. __raw_writel(tmp_a, KS2_PSC_BASE +
  109. PSC_REG_MDCTL(KS2_LPSC_EMIF4F_DDR3A));
  110. /*
  111. * Move DDR3B Module out of reset isolation by setting
  112. * MDCTL24[12] = 0
  113. */
  114. tmp_b = __raw_readl(KS2_PSC_BASE +
  115. PSC_REG_MDCTL(KS2_LPSC_EMIF4F_DDR3B));
  116. tmp_b = PSC_REG_MDCTL_SET_RESET_ISO(tmp_b, 0);
  117. __raw_writel(tmp_b, KS2_PSC_BASE +
  118. PSC_REG_MDCTL(KS2_LPSC_EMIF4F_DDR3B));
  119. /*
  120. * Write 0x5A69 Key to RSTCTRL[15:0] to unlock writes
  121. * to RSTCTRL and RSTCFG
  122. */
  123. tmp = __raw_readl(KS2_RSTCTRL);
  124. tmp &= KS2_RSTCTRL_MASK;
  125. tmp |= KS2_RSTCTRL_KEY;
  126. __raw_writel(tmp, KS2_RSTCTRL);
  127. /*
  128. * Set PLL Controller to drive hard reset on SW trigger by
  129. * setting RSTCFG[13] = 0
  130. */
  131. tmp = __raw_readl(KS2_RSTCTRL_RSCFG);
  132. tmp &= ~KS2_RSTYPE_PLL_SOFT;
  133. __raw_writel(tmp, KS2_RSTCTRL_RSCFG);
  134. reset_cpu(0);
  135. }
  136. }
  137. #endif