memmap-gen3.c 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149
  1. // SPDX-License-Identifier: GPL-2.0+
  2. /*
  3. * Renesas RCar Gen3 memory map tables
  4. *
  5. * Copyright (C) 2017 Marek Vasut <marek.vasut@gmail.com>
  6. */
  7. #include <common.h>
  8. #include <cpu_func.h>
  9. #include <asm/armv8/mmu.h>
  10. #include <asm/global_data.h>
  11. #define GEN3_NR_REGIONS 16
  12. static struct mm_region gen3_mem_map[GEN3_NR_REGIONS] = {
  13. {
  14. .virt = 0x0UL,
  15. .phys = 0x0UL,
  16. .size = 0x40000000UL,
  17. .attrs = PTE_BLOCK_MEMTYPE(MT_DEVICE_NGNRNE) |
  18. PTE_BLOCK_NON_SHARE |
  19. PTE_BLOCK_PXN | PTE_BLOCK_UXN
  20. }, {
  21. .virt = 0x40000000UL,
  22. .phys = 0x40000000UL,
  23. .size = 0x03F00000UL,
  24. .attrs = PTE_BLOCK_MEMTYPE(MT_NORMAL) |
  25. PTE_BLOCK_INNER_SHARE
  26. }, {
  27. .virt = 0x47E00000UL,
  28. .phys = 0x47E00000UL,
  29. .size = 0x78200000UL,
  30. .attrs = PTE_BLOCK_MEMTYPE(MT_NORMAL) |
  31. PTE_BLOCK_INNER_SHARE
  32. }, {
  33. .virt = 0xc0000000UL,
  34. .phys = 0xc0000000UL,
  35. .size = 0x40000000UL,
  36. .attrs = PTE_BLOCK_MEMTYPE(MT_DEVICE_NGNRNE) |
  37. PTE_BLOCK_NON_SHARE |
  38. PTE_BLOCK_PXN | PTE_BLOCK_UXN
  39. }, {
  40. .virt = 0x100000000UL,
  41. .phys = 0x100000000UL,
  42. .size = 0xf00000000UL,
  43. .attrs = PTE_BLOCK_MEMTYPE(MT_NORMAL) |
  44. PTE_BLOCK_INNER_SHARE
  45. }, {
  46. /* List terminator */
  47. 0,
  48. }
  49. };
  50. struct mm_region *mem_map = gen3_mem_map;
  51. DECLARE_GLOBAL_DATA_PTR;
  52. void enable_caches(void)
  53. {
  54. u64 start, size;
  55. int bank, i = 0;
  56. /* Create map for RPC access */
  57. gen3_mem_map[i].virt = 0x0ULL;
  58. gen3_mem_map[i].phys = 0x0ULL;
  59. gen3_mem_map[i].size = 0x40000000ULL;
  60. gen3_mem_map[i].attrs = PTE_BLOCK_MEMTYPE(MT_DEVICE_NGNRNE) |
  61. PTE_BLOCK_NON_SHARE |
  62. PTE_BLOCK_PXN | PTE_BLOCK_UXN;
  63. i++;
  64. /* Generate entires for DRAM in 32bit address space */
  65. for (bank = 0; bank < CONFIG_NR_DRAM_BANKS; bank++) {
  66. start = gd->bd->bi_dram[bank].start;
  67. size = gd->bd->bi_dram[bank].size;
  68. /* Skip empty DRAM banks */
  69. if (!size)
  70. continue;
  71. /* Skip DRAM above 4 GiB */
  72. if (start >> 32ULL)
  73. continue;
  74. /* Mark memory reserved by ATF as cacheable too. */
  75. if (start == 0x48000000) {
  76. /* Unmark protection area (0x43F00000 to 0x47DFFFFF) */
  77. gen3_mem_map[i].virt = 0x40000000ULL;
  78. gen3_mem_map[i].phys = 0x40000000ULL;
  79. gen3_mem_map[i].size = 0x03F00000ULL;
  80. gen3_mem_map[i].attrs = PTE_BLOCK_MEMTYPE(MT_NORMAL) |
  81. PTE_BLOCK_INNER_SHARE;
  82. i++;
  83. start = 0x47E00000ULL;
  84. size += 0x00200000ULL;
  85. }
  86. gen3_mem_map[i].virt = start;
  87. gen3_mem_map[i].phys = start;
  88. gen3_mem_map[i].size = size;
  89. gen3_mem_map[i].attrs = PTE_BLOCK_MEMTYPE(MT_NORMAL) |
  90. PTE_BLOCK_INNER_SHARE;
  91. i++;
  92. }
  93. /* Create map for register access */
  94. gen3_mem_map[i].virt = 0xc0000000ULL;
  95. gen3_mem_map[i].phys = 0xc0000000ULL;
  96. gen3_mem_map[i].size = 0x40000000ULL;
  97. gen3_mem_map[i].attrs = PTE_BLOCK_MEMTYPE(MT_DEVICE_NGNRNE) |
  98. PTE_BLOCK_NON_SHARE |
  99. PTE_BLOCK_PXN | PTE_BLOCK_UXN;
  100. i++;
  101. /* Generate entires for DRAM in 64bit address space */
  102. for (bank = 0; bank < CONFIG_NR_DRAM_BANKS; bank++) {
  103. start = gd->bd->bi_dram[bank].start;
  104. size = gd->bd->bi_dram[bank].size;
  105. /* Skip empty DRAM banks */
  106. if (!size)
  107. continue;
  108. /* Skip DRAM below 4 GiB */
  109. if (!(start >> 32ULL))
  110. continue;
  111. gen3_mem_map[i].virt = start;
  112. gen3_mem_map[i].phys = start;
  113. gen3_mem_map[i].size = size;
  114. gen3_mem_map[i].attrs = PTE_BLOCK_MEMTYPE(MT_NORMAL) |
  115. PTE_BLOCK_INNER_SHARE;
  116. i++;
  117. }
  118. /* Zero out the remaining regions. */
  119. for (; i < GEN3_NR_REGIONS; i++) {
  120. gen3_mem_map[i].virt = 0;
  121. gen3_mem_map[i].phys = 0;
  122. gen3_mem_map[i].size = 0;
  123. gen3_mem_map[i].attrs = 0;
  124. }
  125. if (!icache_status())
  126. icache_enable();
  127. dcache_enable();
  128. }