emif4.c 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145
  1. /*
  2. * emif4.c
  3. *
  4. * AM33XX emif4 configuration file
  5. *
  6. * Copyright (C) 2011, Texas Instruments, Incorporated - http://www.ti.com/
  7. *
  8. * SPDX-License-Identifier: GPL-2.0+
  9. */
  10. #include <common.h>
  11. #include <asm/arch/cpu.h>
  12. #include <asm/arch/ddr_defs.h>
  13. #include <asm/arch/hardware.h>
  14. #include <asm/arch/clock.h>
  15. #include <asm/arch/sys_proto.h>
  16. #include <asm/io.h>
  17. #include <asm/emif.h>
  18. DECLARE_GLOBAL_DATA_PTR;
  19. int dram_init(void)
  20. {
  21. #ifndef CONFIG_SKIP_LOWLEVEL_INIT
  22. sdram_init();
  23. #endif
  24. /* dram_init must store complete ramsize in gd->ram_size */
  25. gd->ram_size = get_ram_size(
  26. (void *)CONFIG_SYS_SDRAM_BASE,
  27. CONFIG_MAX_RAM_BANK_SIZE);
  28. return 0;
  29. }
  30. void dram_init_banksize(void)
  31. {
  32. gd->bd->bi_dram[0].start = CONFIG_SYS_SDRAM_BASE;
  33. gd->bd->bi_dram[0].size = gd->ram_size;
  34. }
  35. #ifndef CONFIG_SKIP_LOWLEVEL_INIT
  36. #ifdef CONFIG_TI81XX
  37. static struct dmm_lisa_map_regs *hw_lisa_map_regs =
  38. (struct dmm_lisa_map_regs *)DMM_BASE;
  39. #endif
  40. #ifndef CONFIG_TI816X
  41. static struct vtp_reg *vtpreg[2] = {
  42. (struct vtp_reg *)VTP0_CTRL_ADDR,
  43. (struct vtp_reg *)VTP1_CTRL_ADDR};
  44. #endif
  45. #ifdef CONFIG_AM33XX
  46. static struct ddr_ctrl *ddrctrl = (struct ddr_ctrl *)DDR_CTRL_ADDR;
  47. #endif
  48. #ifdef CONFIG_AM43XX
  49. static struct ddr_ctrl *ddrctrl = (struct ddr_ctrl *)DDR_CTRL_ADDR;
  50. static struct cm_device_inst *cm_device =
  51. (struct cm_device_inst *)CM_DEVICE_INST;
  52. #endif
  53. #ifdef CONFIG_TI81XX
  54. void config_dmm(const struct dmm_lisa_map_regs *regs)
  55. {
  56. enable_dmm_clocks();
  57. writel(0, &hw_lisa_map_regs->dmm_lisa_map_3);
  58. writel(0, &hw_lisa_map_regs->dmm_lisa_map_2);
  59. writel(0, &hw_lisa_map_regs->dmm_lisa_map_1);
  60. writel(0, &hw_lisa_map_regs->dmm_lisa_map_0);
  61. writel(regs->dmm_lisa_map_3, &hw_lisa_map_regs->dmm_lisa_map_3);
  62. writel(regs->dmm_lisa_map_2, &hw_lisa_map_regs->dmm_lisa_map_2);
  63. writel(regs->dmm_lisa_map_1, &hw_lisa_map_regs->dmm_lisa_map_1);
  64. writel(regs->dmm_lisa_map_0, &hw_lisa_map_regs->dmm_lisa_map_0);
  65. }
  66. #endif
  67. #ifndef CONFIG_TI816X
  68. static void config_vtp(int nr)
  69. {
  70. writel(readl(&vtpreg[nr]->vtp0ctrlreg) | VTP_CTRL_ENABLE,
  71. &vtpreg[nr]->vtp0ctrlreg);
  72. writel(readl(&vtpreg[nr]->vtp0ctrlreg) & (~VTP_CTRL_START_EN),
  73. &vtpreg[nr]->vtp0ctrlreg);
  74. writel(readl(&vtpreg[nr]->vtp0ctrlreg) | VTP_CTRL_START_EN,
  75. &vtpreg[nr]->vtp0ctrlreg);
  76. /* Poll for READY */
  77. while ((readl(&vtpreg[nr]->vtp0ctrlreg) & VTP_CTRL_READY) !=
  78. VTP_CTRL_READY)
  79. ;
  80. }
  81. #endif
  82. void __weak ddr_pll_config(unsigned int ddrpll_m)
  83. {
  84. }
  85. void config_ddr(unsigned int pll, const struct ctrl_ioregs *ioregs,
  86. const struct ddr_data *data, const struct cmd_control *ctrl,
  87. const struct emif_regs *regs, int nr)
  88. {
  89. ddr_pll_config(pll);
  90. #ifndef CONFIG_TI816X
  91. config_vtp(nr);
  92. #endif
  93. config_cmd_ctrl(ctrl, nr);
  94. config_ddr_data(data, nr);
  95. #ifdef CONFIG_AM33XX
  96. config_io_ctrl(ioregs);
  97. /* Set CKE to be controlled by EMIF/DDR PHY */
  98. writel(DDR_CKE_CTRL_NORMAL, &ddrctrl->ddrckectrl);
  99. #endif
  100. #ifdef CONFIG_AM43XX
  101. writel(readl(&cm_device->cm_dll_ctrl) & ~0x1, &cm_device->cm_dll_ctrl);
  102. while ((readl(&cm_device->cm_dll_ctrl) & CM_DLL_READYST) == 0)
  103. ;
  104. config_io_ctrl(ioregs);
  105. /* Set CKE to be controlled by EMIF/DDR PHY */
  106. writel(DDR_CKE_CTRL_NORMAL, &ddrctrl->ddrckectrl);
  107. if (emif_sdram_type(regs->sdram_config) == EMIF_SDRAM_TYPE_DDR3)
  108. #ifndef CONFIG_SPL_RTC_ONLY_SUPPORT
  109. /* Allow EMIF to control DDR_RESET */
  110. writel(0x00000000, &ddrctrl->ddrioctrl);
  111. #else
  112. /* Override EMIF DDR_RESET control */
  113. writel(0x80000000, &ddrctrl->ddrioctrl);
  114. #endif /* CONFIG_SPL_RTC_ONLY_SUPPORT */
  115. #endif
  116. /* Program EMIF instance */
  117. config_ddr_phy(regs, nr);
  118. set_sdram_timings(regs, nr);
  119. if (get_emif_rev(EMIF1_BASE) == EMIF_4D5)
  120. config_sdram_emif4d5(regs, nr);
  121. else
  122. config_sdram(regs, nr);
  123. }
  124. #endif