memconf.c 2.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105
  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/err.h>
  8. #include <linux/io.h>
  9. #include <linux/sizes.h>
  10. #include "../init.h"
  11. #include "../sg-regs.h"
  12. int memconf_init(const struct uniphier_board_data *bd)
  13. {
  14. u32 tmp = 0;
  15. unsigned long size_per_word;
  16. tmp = readl(SG_MEMCONF);
  17. tmp &= ~(SG_MEMCONF_CH0_SZ_MASK | SG_MEMCONF_CH0_NUM_MASK);
  18. switch (bd->dram_ch0_width) {
  19. case 16:
  20. tmp |= SG_MEMCONF_CH0_NUM_1;
  21. size_per_word = bd->dram_ch0_size;
  22. break;
  23. case 32:
  24. tmp |= SG_MEMCONF_CH0_NUM_2;
  25. size_per_word = bd->dram_ch0_size >> 1;
  26. break;
  27. default:
  28. pr_err("error: unsupported DRAM Ch0 width\n");
  29. return -EINVAL;
  30. }
  31. /* Set DDR size */
  32. switch (size_per_word) {
  33. case SZ_64M:
  34. tmp |= SG_MEMCONF_CH0_SZ_64M;
  35. break;
  36. case SZ_128M:
  37. tmp |= SG_MEMCONF_CH0_SZ_128M;
  38. break;
  39. case SZ_256M:
  40. tmp |= SG_MEMCONF_CH0_SZ_256M;
  41. break;
  42. case SZ_512M:
  43. tmp |= SG_MEMCONF_CH0_SZ_512M;
  44. break;
  45. case SZ_1G:
  46. tmp |= SG_MEMCONF_CH0_SZ_1G;
  47. break;
  48. default:
  49. pr_err("error: unsupported DRAM Ch0 size\n");
  50. return -EINVAL;
  51. }
  52. tmp &= ~(SG_MEMCONF_CH1_SZ_MASK | SG_MEMCONF_CH1_NUM_MASK);
  53. switch (bd->dram_ch1_width) {
  54. case 16:
  55. tmp |= SG_MEMCONF_CH1_NUM_1;
  56. size_per_word = bd->dram_ch1_size;
  57. break;
  58. case 32:
  59. tmp |= SG_MEMCONF_CH1_NUM_2;
  60. size_per_word = bd->dram_ch1_size >> 1;
  61. break;
  62. default:
  63. pr_err("error: unsupported DRAM Ch1 width\n");
  64. return -EINVAL;
  65. }
  66. switch (size_per_word) {
  67. case SZ_64M:
  68. tmp |= SG_MEMCONF_CH1_SZ_64M;
  69. break;
  70. case SZ_128M:
  71. tmp |= SG_MEMCONF_CH1_SZ_128M;
  72. break;
  73. case SZ_256M:
  74. tmp |= SG_MEMCONF_CH1_SZ_256M;
  75. break;
  76. case SZ_512M:
  77. tmp |= SG_MEMCONF_CH1_SZ_512M;
  78. break;
  79. case SZ_1G:
  80. tmp |= SG_MEMCONF_CH1_SZ_1G;
  81. break;
  82. default:
  83. pr_err("error: unsupported DRAM Ch1 size\n");
  84. return -EINVAL;
  85. }
  86. if (bd->dram_ch0_base + bd->dram_ch0_size < bd->dram_ch1_base)
  87. tmp |= SG_MEMCONF_SPARSEMEM;
  88. else
  89. tmp &= ~SG_MEMCONF_SPARSEMEM;
  90. writel(tmp, SG_MEMCONF);
  91. return 0;
  92. }