memconf.c 1.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103
  1. /*
  2. * Copyright (C) 2011-2015 Masahiro Yamada <yamada.masahiro@socionext.com>
  3. *
  4. * SPDX-License-Identifier: GPL-2.0+
  5. */
  6. #include <common.h>
  7. #include <linux/sizes.h>
  8. #include <linux/io.h>
  9. #include <mach/sg-regs.h>
  10. static inline u32 sg_memconf_val_ch0(unsigned long size, int num)
  11. {
  12. int size_mb = size / num;
  13. u32 ret;
  14. switch (size_mb) {
  15. case SZ_64M:
  16. ret = SG_MEMCONF_CH0_SZ_64M;
  17. break;
  18. case SZ_128M:
  19. ret = SG_MEMCONF_CH0_SZ_128M;
  20. break;
  21. case SZ_256M:
  22. ret = SG_MEMCONF_CH0_SZ_256M;
  23. break;
  24. case SZ_512M:
  25. ret = SG_MEMCONF_CH0_SZ_512M;
  26. break;
  27. case SZ_1G:
  28. ret = SG_MEMCONF_CH0_SZ_1G;
  29. break;
  30. default:
  31. BUG();
  32. break;
  33. }
  34. switch (num) {
  35. case 1:
  36. ret |= SG_MEMCONF_CH0_NUM_1;
  37. break;
  38. case 2:
  39. ret |= SG_MEMCONF_CH0_NUM_2;
  40. break;
  41. default:
  42. BUG();
  43. break;
  44. }
  45. return ret;
  46. }
  47. static inline u32 sg_memconf_val_ch1(unsigned long size, int num)
  48. {
  49. int size_mb = size / num;
  50. u32 ret;
  51. switch (size_mb) {
  52. case SZ_64M:
  53. ret = SG_MEMCONF_CH1_SZ_64M;
  54. break;
  55. case SZ_128M:
  56. ret = SG_MEMCONF_CH1_SZ_128M;
  57. break;
  58. case SZ_256M:
  59. ret = SG_MEMCONF_CH1_SZ_256M;
  60. break;
  61. case SZ_512M:
  62. ret = SG_MEMCONF_CH1_SZ_512M;
  63. break;
  64. case SZ_1G:
  65. ret = SG_MEMCONF_CH1_SZ_1G;
  66. break;
  67. default:
  68. BUG();
  69. break;
  70. }
  71. switch (num) {
  72. case 1:
  73. ret |= SG_MEMCONF_CH1_NUM_1;
  74. break;
  75. case 2:
  76. ret |= SG_MEMCONF_CH1_NUM_2;
  77. break;
  78. default:
  79. BUG();
  80. break;
  81. }
  82. return ret;
  83. }
  84. void memconf_init(void)
  85. {
  86. u32 tmp;
  87. /* Set DDR size */
  88. tmp = sg_memconf_val_ch0(CONFIG_SDRAM0_SIZE, CONFIG_DDR_NUM_CH0);
  89. tmp |= sg_memconf_val_ch1(CONFIG_SDRAM1_SIZE, CONFIG_DDR_NUM_CH1);
  90. #if CONFIG_SDRAM0_BASE + CONFIG_SDRAM0_SIZE < CONFIG_SDRAM1_BASE
  91. tmp |= SG_MEMCONF_SPARSEMEM;
  92. #endif
  93. writel(tmp, SG_MEMCONF);
  94. }