emif4.c 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132
  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. /* dram_init must store complete ramsize in gd->ram_size */
  22. gd->ram_size = get_ram_size(
  23. (void *)CONFIG_SYS_SDRAM_BASE,
  24. CONFIG_MAX_RAM_BANK_SIZE);
  25. return 0;
  26. }
  27. void dram_init_banksize(void)
  28. {
  29. gd->bd->bi_dram[0].start = CONFIG_SYS_SDRAM_BASE;
  30. gd->bd->bi_dram[0].size = gd->ram_size;
  31. }
  32. #if defined(CONFIG_SPL_BUILD) || defined(CONFIG_NOR_BOOT)
  33. #ifdef CONFIG_TI81XX
  34. static struct dmm_lisa_map_regs *hw_lisa_map_regs =
  35. (struct dmm_lisa_map_regs *)DMM_BASE;
  36. #endif
  37. #ifndef CONFIG_TI816X
  38. static struct vtp_reg *vtpreg[2] = {
  39. (struct vtp_reg *)VTP0_CTRL_ADDR,
  40. (struct vtp_reg *)VTP1_CTRL_ADDR};
  41. #endif
  42. #ifdef CONFIG_AM33XX
  43. static struct ddr_ctrl *ddrctrl = (struct ddr_ctrl *)DDR_CTRL_ADDR;
  44. #endif
  45. #ifdef CONFIG_AM43XX
  46. static struct ddr_ctrl *ddrctrl = (struct ddr_ctrl *)DDR_CTRL_ADDR;
  47. static struct cm_device_inst *cm_device =
  48. (struct cm_device_inst *)CM_DEVICE_INST;
  49. #endif
  50. #ifdef CONFIG_TI81XX
  51. void config_dmm(const struct dmm_lisa_map_regs *regs)
  52. {
  53. enable_dmm_clocks();
  54. writel(0, &hw_lisa_map_regs->dmm_lisa_map_3);
  55. writel(0, &hw_lisa_map_regs->dmm_lisa_map_2);
  56. writel(0, &hw_lisa_map_regs->dmm_lisa_map_1);
  57. writel(0, &hw_lisa_map_regs->dmm_lisa_map_0);
  58. writel(regs->dmm_lisa_map_3, &hw_lisa_map_regs->dmm_lisa_map_3);
  59. writel(regs->dmm_lisa_map_2, &hw_lisa_map_regs->dmm_lisa_map_2);
  60. writel(regs->dmm_lisa_map_1, &hw_lisa_map_regs->dmm_lisa_map_1);
  61. writel(regs->dmm_lisa_map_0, &hw_lisa_map_regs->dmm_lisa_map_0);
  62. }
  63. #endif
  64. #ifndef CONFIG_TI816X
  65. static void config_vtp(int nr)
  66. {
  67. writel(readl(&vtpreg[nr]->vtp0ctrlreg) | VTP_CTRL_ENABLE,
  68. &vtpreg[nr]->vtp0ctrlreg);
  69. writel(readl(&vtpreg[nr]->vtp0ctrlreg) & (~VTP_CTRL_START_EN),
  70. &vtpreg[nr]->vtp0ctrlreg);
  71. writel(readl(&vtpreg[nr]->vtp0ctrlreg) | VTP_CTRL_START_EN,
  72. &vtpreg[nr]->vtp0ctrlreg);
  73. /* Poll for READY */
  74. while ((readl(&vtpreg[nr]->vtp0ctrlreg) & VTP_CTRL_READY) !=
  75. VTP_CTRL_READY)
  76. ;
  77. }
  78. #endif
  79. void __weak ddr_pll_config(unsigned int ddrpll_m)
  80. {
  81. }
  82. void config_ddr(unsigned int pll, const struct ctrl_ioregs *ioregs,
  83. const struct ddr_data *data, const struct cmd_control *ctrl,
  84. const struct emif_regs *regs, int nr)
  85. {
  86. ddr_pll_config(pll);
  87. #ifndef CONFIG_TI816X
  88. config_vtp(nr);
  89. #endif
  90. config_cmd_ctrl(ctrl, nr);
  91. config_ddr_data(data, nr);
  92. #ifdef CONFIG_AM33XX
  93. config_io_ctrl(ioregs);
  94. /* Set CKE to be controlled by EMIF/DDR PHY */
  95. writel(DDR_CKE_CTRL_NORMAL, &ddrctrl->ddrckectrl);
  96. #endif
  97. #ifdef CONFIG_AM43XX
  98. writel(readl(&cm_device->cm_dll_ctrl) & ~0x1, &cm_device->cm_dll_ctrl);
  99. while ((readl(&cm_device->cm_dll_ctrl) && CM_DLL_READYST) == 0)
  100. ;
  101. writel(0x0, &ddrctrl->ddrioctrl);
  102. config_io_ctrl(ioregs);
  103. /* Set CKE to be controlled by EMIF/DDR PHY */
  104. writel(DDR_CKE_CTRL_NORMAL, &ddrctrl->ddrckectrl);
  105. #endif
  106. /* Program EMIF instance */
  107. config_ddr_phy(regs, nr);
  108. set_sdram_timings(regs, nr);
  109. if (get_emif_rev(EMIF1_BASE) == EMIF_4D5)
  110. config_sdram_emif4d5(regs, nr);
  111. else
  112. config_sdram(regs, nr);
  113. }
  114. #endif