10#ifndef ZEPHYR_INCLUDE_LINKER_DEVICETREE_REGIONS_H_
11#define ZEPHYR_INCLUDE_LINKER_DEVICETREE_REGIONS_H_
48#define LINKER_DT_NODE_REGION_NAME_TOKEN(node_id) \
49 DT_STRING_TOKEN(node_id, zephyr_memory_region)
82#define LINKER_DT_NODE_REGION_NAME(node_id) \
83 STRINGIFY(LINKER_DT_NODE_REGION_NAME_TOKEN(node_id))
85#define _DT_MEMORY_REGION_FLAGS_TOKEN(n) DT_STRING_TOKEN(n, zephyr_memory_region_flags)
86#define _DT_MEMORY_REGION_FLAGS_UNQUOTED(n) DT_STRING_UNQUOTED(n, zephyr_memory_region_flags)
88#define _LINKER_L_PAREN (
89#define _LINKER_R_PAREN )
90#define _LINKER_ENCLOSE_PAREN(x) _LINKER_L_PAREN x _LINKER_R_PAREN
92#define _LINKER_IS_EMPTY_TOKEN_ 1
93#define _LINKER_IS_EMPTY_TOKEN_EXPAND(x) _LINKER_IS_EMPTY_TOKEN_##x
94#define _LINKER_IS_EMPTY_TOKEN(x) _LINKER_IS_EMPTY_TOKEN_EXPAND(x)
136#define LINKER_DT_NODE_REGION_FLAGS(node_id) \
137 COND_CODE_1(DT_NODE_HAS_PROP(node_id, zephyr_memory_region_flags), \
138 (COND_CODE_1(_LINKER_IS_EMPTY_TOKEN(_DT_MEMORY_REGION_FLAGS_TOKEN(node_id)), \
140 (_LINKER_ENCLOSE_PAREN( \
141 _DT_MEMORY_REGION_FLAGS_UNQUOTED(node_id)) \
143 (_LINKER_ENCLOSE_PAREN(rw)))
147#define _DT_COMPATIBLE zephyr_memory_region
149#define _DT_SECTION_PREFIX(node_id) UTIL_CAT(__, LINKER_DT_NODE_REGION_NAME_TOKEN(node_id))
150#define _DT_SECTION_START(node_id) UTIL_CAT(_DT_SECTION_PREFIX(node_id), _start)
151#define _DT_SECTION_END(node_id) UTIL_CAT(_DT_SECTION_PREFIX(node_id), _end)
152#define _DT_SECTION_SIZE(node_id) UTIL_CAT(_DT_SECTION_PREFIX(node_id), _size)
153#define _DT_SECTION_LOAD(node_id) UTIL_CAT(_DT_SECTION_PREFIX(node_id), _load_start)
178#define _REGION_DECLARE(node_id) \
179 LINKER_DT_NODE_REGION_NAME_TOKEN(node_id) \
180 LINKER_DT_NODE_REGION_FLAGS(node_id) \
181 : ORIGIN = DT_REG_ADDR(node_id), \
182 LENGTH = DT_REG_SIZE(node_id)
214#define _SECTION_DECLARE(node_id) \
215 LINKER_DT_NODE_REGION_NAME_TOKEN(node_id) (NOLOAD) : \
217 _DT_SECTION_START(node_id) = .; \
218 KEEP(*(LINKER_DT_NODE_REGION_NAME_TOKEN(node_id))) \
219 KEEP(*(LINKER_DT_NODE_REGION_NAME_TOKEN(node_id).*)) \
220 _DT_SECTION_END(node_id) = .; \
221 } > LINKER_DT_NODE_REGION_NAME_TOKEN(node_id) \
222 _DT_SECTION_SIZE(node_id) = _DT_SECTION_END(node_id) - _DT_SECTION_START(node_id); \
223 _DT_SECTION_LOAD(node_id) = LOADADDR(LINKER_DT_NODE_REGION_NAME_TOKEN(node_id));
235#define LINKER_DT_REGIONS() \
236 DT_FOREACH_STATUS_OKAY(_DT_COMPATIBLE, _REGION_DECLARE)
242#define LINKER_DT_SECTIONS() \
243 DT_FOREACH_STATUS_OKAY(_DT_COMPATIBLE, _SECTION_DECLARE)