dram_port.c 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140
  1. /*
  2. * Copyright (C) 2018 Marvell International Ltd.
  3. *
  4. * SPDX-License-Identifier: BSD-3-Clause
  5. * https://spdx.org/licenses
  6. */
  7. #include <arch_helpers.h>
  8. #include <common/debug.h>
  9. #include <drivers/mentor/mi2cv.h>
  10. #include <lib/mmio.h>
  11. #include <mv_ddr_if.h>
  12. #include <mvebu_def.h>
  13. #include <plat_marvell.h>
  14. #define MVEBU_AP_MPP_CTRL0_7_REG MVEBU_AP_MPP_REGS(0)
  15. #define MVEBU_AP_MPP_CTRL4_OFFS 16
  16. #define MVEBU_AP_MPP_CTRL5_OFFS 20
  17. #define MVEBU_AP_MPP_CTRL4_I2C0_SDA_ENA 0x3
  18. #define MVEBU_AP_MPP_CTRL5_I2C0_SCK_ENA 0x3
  19. #define MVEBU_CP_MPP_CTRL37_OFFS 20
  20. #define MVEBU_CP_MPP_CTRL38_OFFS 24
  21. #define MVEBU_CP_MPP_CTRL37_I2C0_SCK_ENA 0x2
  22. #define MVEBU_CP_MPP_CTRL38_I2C0_SDA_ENA 0x2
  23. #define MVEBU_MPP_CTRL_MASK 0xf
  24. /*
  25. * This struct provides the DRAM training code with
  26. * the appropriate board DRAM configuration
  27. */
  28. static struct mv_ddr_topology_map board_topology_map = {
  29. /* Board with 1CS 8Gb x4 devices of Micron 2400T */
  30. DEBUG_LEVEL_ERROR,
  31. 0x1, /* active interfaces */
  32. /* cs_mask, mirror, dqs_swap, ck_swap X subphys */
  33. { { { {0x1, 0x0, 0, 0}, /* FIXME: change the cs mask for all 64 bit */
  34. {0x1, 0x0, 0, 0},
  35. {0x1, 0x0, 0, 0},
  36. {0x1, 0x0, 0, 0},
  37. {0x1, 0x0, 0, 0},
  38. {0x1, 0x0, 0, 0},
  39. {0x1, 0x0, 0, 0},
  40. {0x1, 0x0, 0, 0},
  41. {0x1, 0x0, 0, 0} },
  42. /* TODO: double check if the speed bin is 2400T */
  43. SPEED_BIN_DDR_2400T, /* speed_bin */
  44. MV_DDR_DEV_WIDTH_8BIT, /* sdram device width */
  45. MV_DDR_DIE_CAP_8GBIT, /* die capacity */
  46. MV_DDR_FREQ_SAR, /* frequency */
  47. 0, 0, /* cas_l, cas_wl */
  48. MV_DDR_TEMP_LOW} }, /* temperature */
  49. MV_DDR_64BIT_BUS_MASK, /* subphys mask */
  50. MV_DDR_CFG_SPD, /* ddr configuration data source */
  51. NOT_COMBINED, /* ddr twin-die combined*/
  52. { {0} }, /* raw spd data */
  53. {0}, /* timing parameters */
  54. { /* electrical configuration */
  55. { /* memory electrical configuration */
  56. MV_DDR_RTT_NOM_PARK_RZQ_DISABLE, /* rtt_nom */
  57. {
  58. MV_DDR_RTT_NOM_PARK_RZQ_DIV4, /* rtt_park 1cs */
  59. MV_DDR_RTT_NOM_PARK_RZQ_DIV1 /* rtt_park 2cs */
  60. },
  61. {
  62. MV_DDR_RTT_WR_DYN_ODT_OFF, /* rtt_wr 1cs */
  63. MV_DDR_RTT_WR_RZQ_DIV2 /* rtt_wr 2cs */
  64. },
  65. MV_DDR_DIC_RZQ_DIV7 /* dic */
  66. },
  67. { /* phy electrical configuration */
  68. MV_DDR_OHM_30, /* data_drv_p */
  69. MV_DDR_OHM_30, /* data_drv_n */
  70. MV_DDR_OHM_30, /* ctrl_drv_p */
  71. MV_DDR_OHM_30, /* ctrl_drv_n */
  72. {
  73. MV_DDR_OHM_60, /* odt_p 1cs */
  74. MV_DDR_OHM_120 /* odt_p 2cs */
  75. },
  76. {
  77. MV_DDR_OHM_60, /* odt_n 1cs */
  78. MV_DDR_OHM_120 /* odt_n 2cs */
  79. },
  80. },
  81. { /* mac electrical configuration */
  82. MV_DDR_ODT_CFG_NORMAL, /* odtcfg_pattern */
  83. MV_DDR_ODT_CFG_ALWAYS_ON, /* odtcfg_write */
  84. MV_DDR_ODT_CFG_NORMAL, /* odtcfg_read */
  85. },
  86. }
  87. };
  88. struct mv_ddr_topology_map *mv_ddr_topology_map_get(void)
  89. {
  90. /* Return the board topology as defined in the board code */
  91. return &board_topology_map;
  92. }
  93. static void mpp_config(void)
  94. {
  95. uint32_t val;
  96. uintptr_t reg;
  97. /* configure ap mmps 4, 5 to I2C */
  98. reg = MVEBU_AP_MPP_CTRL0_7_REG;
  99. val = mmio_read_32(reg);
  100. val &= ~((MVEBU_MPP_CTRL_MASK << MVEBU_AP_MPP_CTRL4_OFFS) |
  101. (MVEBU_MPP_CTRL_MASK << MVEBU_AP_MPP_CTRL5_OFFS));
  102. val |= ((MVEBU_AP_MPP_CTRL4_I2C0_SDA_ENA << MVEBU_AP_MPP_CTRL4_OFFS) |
  103. (MVEBU_AP_MPP_CTRL5_I2C0_SCK_ENA << MVEBU_AP_MPP_CTRL5_OFFS));
  104. mmio_write_32(reg, val);
  105. }
  106. /*
  107. * This function may modify the default DRAM parameters
  108. * based on information received from SPD or bootloader
  109. * configuration located on non volatile storage
  110. */
  111. void plat_marvell_dram_update_topology(void)
  112. {
  113. struct mv_ddr_topology_map *tm = mv_ddr_topology_map_get();
  114. INFO("Gathering DRAM information\n");
  115. if (tm->cfg_src == MV_DDR_CFG_SPD) {
  116. /* configure MPPs to enable i2c */
  117. mpp_config();
  118. /* initialize the MVEBU_AP_I2C_BASE I2C bus */
  119. i2c_init((void *)MVEBU_AP_I2C_BASE);
  120. /* select SPD memory page 0 to access DRAM configuration */
  121. i2c_write(I2C_SPD_P0_ADDR, 0x0, 1, tm->spd_data.all_bytes, 0);
  122. /* read data from spd */
  123. i2c_read(I2C_SPD_ADDR, 0x0, 1, tm->spd_data.all_bytes,
  124. sizeof(tm->spd_data.all_bytes));
  125. }
  126. }