stm32_sdram.c 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119
  1. /*
  2. * (C) Copyright 2017
  3. * Vikas Manocha, <vikas.manocha@st.com>
  4. *
  5. * SPDX-License-Identifier: GPL-2.0+
  6. */
  7. #include <common.h>
  8. #include <asm/io.h>
  9. #include <asm/arch/fmc.h>
  10. #include <asm/arch/stm32.h>
  11. static inline u32 _ns2clk(u32 ns, u32 freq)
  12. {
  13. u32 tmp = freq/1000000;
  14. return (tmp * ns) / 1000;
  15. }
  16. #define NS2CLK(ns) (_ns2clk(ns, freq))
  17. /*
  18. * Following are timings for IS42S16400J, from corresponding datasheet
  19. */
  20. #define SDRAM_CAS 3 /* 3 cycles */
  21. #define SDRAM_NB 1 /* Number of banks */
  22. #define SDRAM_MWID 1 /* 16 bit memory */
  23. #define SDRAM_NR 0x1 /* 12-bit row */
  24. #define SDRAM_NC 0x0 /* 8-bit col */
  25. #define SDRAM_RBURST 0x1 /* Single read requests always as bursts */
  26. #define SDRAM_RPIPE 0x0 /* No HCLK clock cycle delay */
  27. #define SDRAM_TRRD NS2CLK(12)
  28. #define SDRAM_TRCD NS2CLK(18)
  29. #define SDRAM_TRP NS2CLK(18)
  30. #define SDRAM_TRAS NS2CLK(42)
  31. #define SDRAM_TRC NS2CLK(60)
  32. #define SDRAM_TRFC NS2CLK(60)
  33. #define SDRAM_TCDL (1 - 1)
  34. #define SDRAM_TRDL NS2CLK(12)
  35. #define SDRAM_TBDL (1 - 1)
  36. #define SDRAM_TREF (NS2CLK(64000000 / 8192) - 20)
  37. #define SDRAM_TCCD (1 - 1)
  38. #define SDRAM_TXSR SDRAM_TRFC /* Row cycle time after precharge */
  39. #define SDRAM_TMRD 1 /* Page 10, Mode Register Set */
  40. /* Last data in to row precharge, need also comply ineq on page 1648 */
  41. #define SDRAM_TWR max(\
  42. (int)max((int)SDRAM_TRDL, (int)(SDRAM_TRAS - SDRAM_TRCD)), \
  43. (int)(SDRAM_TRC - SDRAM_TRCD - SDRAM_TRP)\
  44. )
  45. #define SDRAM_MODE_BL_SHIFT 0
  46. #define SDRAM_MODE_CAS_SHIFT 4
  47. #define SDRAM_MODE_BL 0
  48. #define SDRAM_MODE_CAS SDRAM_CAS
  49. int stm32_sdram_init(void)
  50. {
  51. u32 freq;
  52. /*
  53. * Get frequency for NS2CLK calculation.
  54. */
  55. freq = clock_get(CLOCK_AHB) / CONFIG_SYS_RAM_FREQ_DIV;
  56. writel(CONFIG_SYS_RAM_FREQ_DIV << FMC_SDCR_SDCLK_SHIFT
  57. | SDRAM_CAS << FMC_SDCR_CAS_SHIFT
  58. | SDRAM_NB << FMC_SDCR_NB_SHIFT
  59. | SDRAM_MWID << FMC_SDCR_MWID_SHIFT
  60. | SDRAM_NR << FMC_SDCR_NR_SHIFT
  61. | SDRAM_NC << FMC_SDCR_NC_SHIFT
  62. | SDRAM_RPIPE << FMC_SDCR_RPIPE_SHIFT
  63. | SDRAM_RBURST << FMC_SDCR_RBURST_SHIFT,
  64. &STM32_SDRAM_FMC->sdcr1);
  65. writel(SDRAM_TRCD << FMC_SDTR_TRCD_SHIFT
  66. | SDRAM_TRP << FMC_SDTR_TRP_SHIFT
  67. | SDRAM_TWR << FMC_SDTR_TWR_SHIFT
  68. | SDRAM_TRC << FMC_SDTR_TRC_SHIFT
  69. | SDRAM_TRAS << FMC_SDTR_TRAS_SHIFT
  70. | SDRAM_TXSR << FMC_SDTR_TXSR_SHIFT
  71. | SDRAM_TMRD << FMC_SDTR_TMRD_SHIFT,
  72. &STM32_SDRAM_FMC->sdtr1);
  73. writel(FMC_SDCMR_BANK_1 | FMC_SDCMR_MODE_START_CLOCK,
  74. &STM32_SDRAM_FMC->sdcmr);
  75. udelay(200); /* 200 us delay, page 10, "Power-Up" */
  76. FMC_BUSY_WAIT();
  77. writel(FMC_SDCMR_BANK_1 | FMC_SDCMR_MODE_PRECHARGE,
  78. &STM32_SDRAM_FMC->sdcmr);
  79. udelay(100);
  80. FMC_BUSY_WAIT();
  81. writel((FMC_SDCMR_BANK_1 | FMC_SDCMR_MODE_AUTOREFRESH
  82. | 7 << FMC_SDCMR_NRFS_SHIFT), &STM32_SDRAM_FMC->sdcmr);
  83. udelay(100);
  84. FMC_BUSY_WAIT();
  85. writel(FMC_SDCMR_BANK_1 | (SDRAM_MODE_BL << SDRAM_MODE_BL_SHIFT
  86. | SDRAM_MODE_CAS << SDRAM_MODE_CAS_SHIFT)
  87. << FMC_SDCMR_MODE_REGISTER_SHIFT | FMC_SDCMR_MODE_WRITE_MODE,
  88. &STM32_SDRAM_FMC->sdcmr);
  89. udelay(100);
  90. FMC_BUSY_WAIT();
  91. writel(FMC_SDCMR_BANK_1 | FMC_SDCMR_MODE_NORMAL,
  92. &STM32_SDRAM_FMC->sdcmr);
  93. FMC_BUSY_WAIT();
  94. /* Refresh timer */
  95. writel(SDRAM_TREF, &STM32_SDRAM_FMC->sdrtr);
  96. return 0;
  97. }