memory_layout.c 8.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160
  1. // Copyright 2010-2019 Espressif Systems (Shanghai) PTE LTD
  2. //
  3. // Licensed under the Apache License, Version 2.0 (the "License");
  4. // you may not use this file except in compliance with the License.
  5. // You may obtain a copy of the License at
  6. // http://www.apache.org/licenses/LICENSE-2.0
  7. //
  8. // Unless required by applicable law or agreed to in writing, software
  9. // distributed under the License is distributed on an "AS IS" BASIS,
  10. // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  11. // See the License for the specific language governing permissions and
  12. // limitations under the License.
  13. #ifndef BOOTLOADER_BUILD
  14. #include <stdlib.h>
  15. #include <stdint.h>
  16. #include "sdkconfig.h"
  17. #include "soc/soc.h"
  18. #include "heap_memory_layout.h"
  19. #include "esp_heap_caps.h"
  20. /* Memory layout for ESP32 SoC */
  21. /*
  22. Memory type descriptors. These describe the capabilities of a type of memory in the SoC. Each type of memory
  23. map consist of one or more regions in the address space.
  24. Each type contains an array of prioritised capabilities; types with later entries are only taken if earlier
  25. ones can't fulfill the memory request.
  26. The prioritised capabilities work roughly like this:
  27. - For a normal malloc (MALLOC_CAP_DEFAULT), give away the DRAM-only memory first, then pass off any dual-use IRAM regions,
  28. finally eat into the application memory.
  29. - For a malloc where 32-bit-aligned-only access is okay, first allocate IRAM, then DRAM, finally application IRAM.
  30. - Application mallocs (PIDx) will allocate IRAM first, if possible, then DRAM.
  31. - Most other malloc caps only fit in one region anyway.
  32. */
  33. const soc_memory_type_desc_t soc_memory_types[] = {
  34. //Type 0: DRAM
  35. { "DRAM", { MALLOC_CAP_8BIT|MALLOC_CAP_DEFAULT, MALLOC_CAP_INTERNAL|MALLOC_CAP_DMA|MALLOC_CAP_32BIT, 0 }, false, false},
  36. // Type 1: DRAM used for startup stacks
  37. { "DRAM", { MALLOC_CAP_8BIT|MALLOC_CAP_DEFAULT, MALLOC_CAP_INTERNAL|MALLOC_CAP_DMA|MALLOC_CAP_32BIT, 0 }, false, true},
  38. //Type 2: DRAM which has an alias on the I-port
  39. { "D/IRAM", { 0, MALLOC_CAP_DMA|MALLOC_CAP_8BIT|MALLOC_CAP_INTERNAL|MALLOC_CAP_DEFAULT, MALLOC_CAP_32BIT|MALLOC_CAP_EXEC }, true, false},
  40. //Type 3: IRAM
  41. //In ESP32S2, All IRAM region are available by D-port (D/IRAM).
  42. { "IRAM", { MALLOC_CAP_EXEC|MALLOC_CAP_32BIT|MALLOC_CAP_INTERNAL, 0, 0 }, false, false},
  43. //Type 4: SPI SRAM data
  44. //TODO, in fact, part of them support EDMA, to be supported.
  45. { "SPIRAM", { MALLOC_CAP_SPIRAM|MALLOC_CAP_DEFAULT, 0, MALLOC_CAP_8BIT|MALLOC_CAP_32BIT}, false, false},
  46. //Type 5: RTC Fast RAM
  47. { "RTCRAM", { MALLOC_CAP_8BIT|MALLOC_CAP_DEFAULT, MALLOC_CAP_INTERNAL|MALLOC_CAP_32BIT, 0 }, false, false},
  48. };
  49. #ifdef CONFIG_ESP_SYSTEM_MEMPROT_FEATURE
  50. #define SOC_MEMORY_TYPE_DEFAULT 0
  51. #else
  52. #define SOC_MEMORY_TYPE_DEFAULT 2
  53. #endif
  54. const size_t soc_memory_type_count = sizeof(soc_memory_types)/sizeof(soc_memory_type_desc_t);
  55. /*
  56. Region descriptors. These describe all regions of memory available, and map them to a type in the above type.
  57. Because of requirements in the coalescing code which merges adjacent regions, this list should always be sorted
  58. from low to high start address.
  59. */
  60. const soc_memory_region_t soc_memory_regions[] = {
  61. #ifdef CONFIG_ESP_SYSTEM_ALLOW_RTC_FAST_MEM_AS_HEAP
  62. { SOC_RTC_DRAM_LOW, 0x2000, 5, 0}, //RTC Fast Memory
  63. #endif
  64. #ifdef CONFIG_SPIRAM
  65. { SOC_EXTRAM_DATA_LOW, SOC_EXTRAM_DATA_SIZE, 4, 0}, //SPI SRAM, if available
  66. #endif
  67. #if CONFIG_ESP32S2_INSTRUCTION_CACHE_8KB
  68. #if CONFIG_ESP32S2_DATA_CACHE_0KB
  69. { 0x3FFB2000, 0x2000, SOC_MEMORY_TYPE_DEFAULT, 0x40022000}, //Block 1, can be use as I/D cache memory
  70. { 0x3FFB4000, 0x2000, SOC_MEMORY_TYPE_DEFAULT, 0x40024000}, //Block 2, can be use as D cache memory
  71. { 0x3FFB6000, 0x2000, SOC_MEMORY_TYPE_DEFAULT, 0x40026000}, //Block 3, can be use as D cache memory
  72. #elif CONFIG_ESP32S2_DATA_CACHE_8KB
  73. { 0x3FFB4000, 0x2000, SOC_MEMORY_TYPE_DEFAULT, 0x40024000}, //Block 2, can be use as D cache memory
  74. { 0x3FFB6000, 0x2000, SOC_MEMORY_TYPE_DEFAULT, 0x40026000}, //Block 3, can be use as D cache memory
  75. #else
  76. { 0x3FFB6000, 0x2000, SOC_MEMORY_TYPE_DEFAULT, 0x40026000}, //Block 3, can be use as D cache memory
  77. #endif
  78. #else
  79. #if CONFIG_ESP32S2_DATA_CACHE_0KB
  80. { 0x3FFB4000, 0x2000, SOC_MEMORY_TYPE_DEFAULT, 0x40024000}, //Block SOC_MEMORY_TYPE_DEFAULT, can be use as D cache memory
  81. { 0x3FFB6000, 0x2000, SOC_MEMORY_TYPE_DEFAULT, 0x40026000}, //Block 3, can be use as D cache memory
  82. #elif CONFIG_ESP32S2_DATA_CACHE_8KB
  83. { 0x3FFB6000, 0x2000, SOC_MEMORY_TYPE_DEFAULT, 0x40026000}, //Block 3, can be use as D cache memory
  84. #endif
  85. #endif
  86. { 0x3FFB8000, 0x4000, SOC_MEMORY_TYPE_DEFAULT, 0x40028000}, //Block 4, can be remapped to ROM, can be used as trace memory
  87. { 0x3FFBC000, 0x4000, SOC_MEMORY_TYPE_DEFAULT, 0x4002C000}, //Block 5, can be remapped to ROM, can be used as trace memory
  88. { 0x3FFC0000, 0x4000, SOC_MEMORY_TYPE_DEFAULT, 0x40030000}, //Block 6, can be used as trace memory
  89. { 0x3FFC4000, 0x4000, SOC_MEMORY_TYPE_DEFAULT, 0x40034000}, //Block 7, can be used as trace memory
  90. { 0x3FFC8000, 0x4000, SOC_MEMORY_TYPE_DEFAULT, 0x40038000}, //Block 8, can be used as trace memory
  91. { 0x3FFCC000, 0x4000, SOC_MEMORY_TYPE_DEFAULT, 0x4003C000}, //Block 9, can be used as trace memory
  92. { 0x3FFD0000, 0x4000, SOC_MEMORY_TYPE_DEFAULT, 0x40040000}, //Block 10, can be used as trace memory
  93. { 0x3FFD4000, 0x4000, SOC_MEMORY_TYPE_DEFAULT, 0x40044000}, //Block 11, can be used as trace memory
  94. { 0x3FFD8000, 0x4000, SOC_MEMORY_TYPE_DEFAULT, 0x40048000}, //Block 12, can be used as trace memory
  95. { 0x3FFDC000, 0x4000, SOC_MEMORY_TYPE_DEFAULT, 0x4004C000}, //Block 13, can be used as trace memory
  96. { 0x3FFE0000, 0x4000, SOC_MEMORY_TYPE_DEFAULT, 0x40050000}, //Block 14, can be used as trace memory
  97. { 0x3FFE4000, 0x4000, SOC_MEMORY_TYPE_DEFAULT, 0x40054000}, //Block 15, can be used as trace memory
  98. { 0x3FFE8000, 0x4000, SOC_MEMORY_TYPE_DEFAULT, 0x40058000}, //Block 16, can be used as trace memory
  99. { 0x3FFEC000, 0x4000, SOC_MEMORY_TYPE_DEFAULT, 0x4005C000}, //Block 17, can be used as trace memory
  100. { 0x3FFF0000, 0x4000, SOC_MEMORY_TYPE_DEFAULT, 0x40060000}, //Block 18, can be used for MAC dump, can be used as trace memory
  101. { 0x3FFF4000, 0x4000, SOC_MEMORY_TYPE_DEFAULT, 0x40064000}, //Block 19, can be used for MAC dump, can be used as trace memory
  102. { 0x3FFF8000, 0x4000, SOC_MEMORY_TYPE_DEFAULT, 0x40068000}, //Block 20, can be used for MAC dump, can be used as trace memory
  103. { 0x3FFFC000, 0x4000, 1, 0x4006C000}, //Block 21, can be used for MAC dump, can be used as trace memory, used for startup stack
  104. };
  105. const size_t soc_memory_region_count = sizeof(soc_memory_regions)/sizeof(soc_memory_region_t);
  106. extern int _dram0_rtos_reserved_start;
  107. extern int _data_start, _heap_start, _iram_start, _iram_end, _rtc_force_fast_end, _rtc_noinit_end;
  108. /* Reserved memory regions
  109. These are removed from the soc_memory_regions array when heaps are created.
  110. */
  111. //ROM data region
  112. SOC_RESERVE_MEMORY_REGION((intptr_t)&_dram0_rtos_reserved_start, SOC_BYTE_ACCESSIBLE_HIGH, rom_data_region);
  113. // Static data region. DRAM used by data+bss and possibly rodata
  114. SOC_RESERVE_MEMORY_REGION((intptr_t)&_data_start, (intptr_t)&_heap_start, dram_data);
  115. // ESP32S2 has a big D/IRAM region, the part used by code is reserved
  116. // The address of the D/I bus are in the same order, directly shift IRAM address to get reserved DRAM address
  117. #define I_D_OFFSET (SOC_IRAM_LOW - SOC_DRAM_LOW)
  118. SOC_RESERVE_MEMORY_REGION((intptr_t)&_iram_start - I_D_OFFSET, (intptr_t)&_iram_end - I_D_OFFSET, iram_code);
  119. #ifdef CONFIG_SPIRAM
  120. /* Reserve the whole possible SPIRAM region here, spiram.c will add some or all of this
  121. * memory to heap depending on the actual SPIRAM chip size. */
  122. SOC_RESERVE_MEMORY_REGION( SOC_EXTRAM_DATA_LOW, SOC_EXTRAM_DATA_HIGH, extram_data_region);
  123. #endif
  124. // Blocks 19 and 20 may be reserved for the trace memory
  125. #if CONFIG_ESP32S2_TRACEMEM_RESERVE_DRAM > 0
  126. SOC_RESERVE_MEMORY_REGION(0x3fffc000 - CONFIG_ESP32S2_TRACEMEM_RESERVE_DRAM, 0x3fffc000, trace_mem);
  127. #endif
  128. // RTC Fast RAM region
  129. #ifdef CONFIG_ESP_SYSTEM_ALLOW_RTC_FAST_MEM_AS_HEAP
  130. #ifdef CONFIG_ESP32S2_RTCDATA_IN_FAST_MEM
  131. SOC_RESERVE_MEMORY_REGION(SOC_RTC_DRAM_LOW, (intptr_t)&_rtc_noinit_end, rtcram_data);
  132. #else
  133. SOC_RESERVE_MEMORY_REGION(SOC_RTC_DRAM_LOW, (intptr_t)&_rtc_force_fast_end, rtcram_data);
  134. #endif
  135. #endif
  136. #endif // BOOTLOADER_BUILD