util.c 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109
  1. /*
  2. * Copyright 2008 Freescale Semiconductor, Inc.
  3. *
  4. * This program is free software; you can redistribute it and/or
  5. * modify it under the terms of the GNU General Public License
  6. * Version 2 as published by the Free Software Foundation.
  7. */
  8. #include <common.h>
  9. #include <asm/fsl_law.h>
  10. #include "ddr.h"
  11. unsigned int fsl_ddr_get_mem_data_rate(void);
  12. /*
  13. * Round mclk_ps to nearest 10 ps in memory controller code.
  14. *
  15. * If an imprecise data rate is too high due to rounding error
  16. * propagation, compute a suitably rounded mclk_ps to compute
  17. * a working memory controller configuration.
  18. */
  19. unsigned int get_memory_clk_period_ps(void)
  20. {
  21. unsigned int mclk_ps;
  22. mclk_ps = 2000000000000ULL / fsl_ddr_get_mem_data_rate();
  23. /* round to nearest 10 ps */
  24. return 10 * ((mclk_ps + 5) / 10);
  25. }
  26. /* Convert picoseconds into DRAM clock cycles (rounding up if needed). */
  27. unsigned int picos_to_mclk(unsigned int picos)
  28. {
  29. const unsigned long long ULL_2e12 = 2000000000000ULL;
  30. const unsigned long long ULL_8Fs = 0xFFFFFFFFULL;
  31. unsigned long long clks;
  32. unsigned long long clks_temp;
  33. if (!picos)
  34. return 0;
  35. clks = fsl_ddr_get_mem_data_rate() * (unsigned long long) picos;
  36. clks_temp = clks;
  37. clks = clks / ULL_2e12;
  38. if (clks_temp % ULL_2e12) {
  39. clks++;
  40. }
  41. if (clks > ULL_8Fs) {
  42. clks = ULL_8Fs;
  43. }
  44. return (unsigned int) clks;
  45. }
  46. unsigned int mclk_to_picos(unsigned int mclk)
  47. {
  48. return get_memory_clk_period_ps() * mclk;
  49. }
  50. void
  51. __fsl_ddr_set_lawbar(const common_timing_params_t *memctl_common_params,
  52. unsigned int memctl_interleaved,
  53. unsigned int ctrl_num)
  54. {
  55. unsigned long long base = memctl_common_params->base_address;
  56. unsigned long long size = memctl_common_params->total_mem;
  57. /*
  58. * If no DIMMs on this controller, do not proceed any further.
  59. */
  60. if (!memctl_common_params->ndimms_present) {
  61. return;
  62. }
  63. #if !defined(CONFIG_PHYS_64BIT)
  64. if (base >= CONFIG_MAX_MEM_MAPPED)
  65. return;
  66. if ((base + size) >= CONFIG_MAX_MEM_MAPPED)
  67. size = CONFIG_MAX_MEM_MAPPED - base;
  68. #endif
  69. if (ctrl_num == 0) {
  70. /*
  71. * Set up LAW for DDR controller 1 space.
  72. */
  73. unsigned int lawbar1_target_id = memctl_interleaved
  74. ? LAW_TRGT_IF_DDR_INTRLV : LAW_TRGT_IF_DDR_1;
  75. if (set_ddr_laws(base, size, lawbar1_target_id) < 0) {
  76. printf("ERROR\n");
  77. return ;
  78. }
  79. } else if (ctrl_num == 1) {
  80. if (set_ddr_laws(base, size, LAW_TRGT_IF_DDR_2) < 0) {
  81. printf("ERROR\n");
  82. return ;
  83. }
  84. } else {
  85. printf("unexpected controller number %u in %s\n",
  86. ctrl_num, __FUNCTION__);
  87. }
  88. }
  89. __attribute__((weak, alias("__fsl_ddr_set_lawbar"))) void
  90. fsl_ddr_set_lawbar(const common_timing_params_t *memctl_common_params,
  91. unsigned int memctl_interleaved,
  92. unsigned int ctrl_num);