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))
87#define _DT_COMPATIBLE zephyr_memory_region
89#define _DT_SECTION_PREFIX(node_id) UTIL_CAT(__, LINKER_DT_NODE_REGION_NAME_TOKEN(node_id))
90#define _DT_SECTION_START(node_id) UTIL_CAT(_DT_SECTION_PREFIX(node_id), _start)
91#define _DT_SECTION_END(node_id) UTIL_CAT(_DT_SECTION_PREFIX(node_id), _end)
92#define _DT_SECTION_SIZE(node_id) UTIL_CAT(_DT_SECTION_PREFIX(node_id), _size)
93#define _DT_SECTION_LOAD(node_id) UTIL_CAT(_DT_SECTION_PREFIX(node_id), _load_start)
95#define _DT_ATTR(token) UTIL_CAT(UTIL_CAT(REGION_, token), _ATTR)
119#define _REGION_DECLARE(node_id) \
120 LINKER_DT_NODE_REGION_NAME_TOKEN(node_id) : \
121 ORIGIN = DT_REG_ADDR(node_id), \
122 LENGTH = DT_REG_SIZE(node_id)
154#define _SECTION_DECLARE(node_id) \
155 LINKER_DT_NODE_REGION_NAME_TOKEN(node_id) DT_REG_ADDR(node_id) (NOLOAD) : \
157 _DT_SECTION_START(node_id) = .; \
158 KEEP(*(LINKER_DT_NODE_REGION_NAME_TOKEN(node_id))) \
159 KEEP(*(LINKER_DT_NODE_REGION_NAME_TOKEN(node_id).*)) \
160 _DT_SECTION_END(node_id) = .; \
161 } > LINKER_DT_NODE_REGION_NAME_TOKEN(node_id) \
162 _DT_SECTION_SIZE(node_id) = _DT_SECTION_END(node_id) - _DT_SECTION_START(node_id); \
163 _DT_SECTION_LOAD(node_id) = LOADADDR(LINKER_DT_NODE_REGION_NAME_TOKEN(node_id));
168#define _EXPAND_MPU_FN(node_id, MPU_FN, ...) \
169 MPU_FN(LINKER_DT_NODE_REGION_NAME(node_id), \
170 DT_REG_ADDR(node_id), \
171 DT_REG_SIZE(node_id), \
172 _DT_ATTR(DT_STRING_TOKEN(node_id, zephyr_memory_region_mpu))),
181#define _CHECK_ATTR_FN(node_id, EXPAND_MPU_FN, ...) \
182 COND_CODE_1(UTIL_AND(DT_NODE_HAS_PROP(node_id, zephyr_memory_region_mpu), \
183 DT_NODE_HAS_PROP(node_id, zephyr_memory_region)), \
184 (EXPAND_MPU_FN(node_id, __VA_ARGS__)), \
191#define _CHECK_APPLY_FN(compat, EXPAND_MPU_FN, ...) \
192 DT_FOREACH_STATUS_OKAY_VARGS(compat, _CHECK_ATTR_FN, EXPAND_MPU_FN, __VA_ARGS__)
204#define LINKER_DT_REGIONS() \
205 DT_FOREACH_STATUS_OKAY(_DT_COMPATIBLE, _REGION_DECLARE)
211#define LINKER_DT_SECTIONS() \
212 DT_FOREACH_STATUS_OKAY(_DT_COMPATIBLE, _SECTION_DECLARE)
295#define LINKER_DT_REGION_MPU(mpu_fn) _CHECK_APPLY_FN(_DT_COMPATIBLE, _EXPAND_MPU_FN, mpu_fn)