Zephyr Project API  3.1.0
A Scalable Open Source RTOS
devicetree_regions.h
Go to the documentation of this file.
1/*
2 * Copyright (c) 2021, Commonwealth Scientific and Industrial Research
3 * Organisation (CSIRO) ABN 41 687 119 230.
4 *
5 * SPDX-License-Identifier: Apache-2.0
6 *
7 * Generate memory regions from devicetree nodes.
8 */
9
41#define LINKER_DT_NODE_REGION_NAME_TOKEN(node_id) \
42 DT_STRING_TOKEN(node_id, zephyr_memory_region)
43
75#define LINKER_DT_NODE_REGION_NAME(node_id) \
76 STRINGIFY(LINKER_DT_NODE_REGION_NAME_TOKEN(node_id))
77
80#define _DT_COMPATIBLE zephyr_memory_region
81
82#define _DT_SECTION_PREFIX(node_id) UTIL_CAT(__, LINKER_DT_NODE_REGION_NAME_TOKEN(node_id))
83#define _DT_SECTION_START(node_id) UTIL_CAT(_DT_SECTION_PREFIX(node_id), _start)
84#define _DT_SECTION_END(node_id) UTIL_CAT(_DT_SECTION_PREFIX(node_id), _end)
85#define _DT_SECTION_SIZE(node_id) UTIL_CAT(_DT_SECTION_PREFIX(node_id), _size)
86#define _DT_SECTION_LOAD(node_id) UTIL_CAT(_DT_SECTION_PREFIX(node_id), _load_start)
87
88#define _DT_ATTR(token) UTIL_CAT(UTIL_CAT(REGION_, token), _ATTR)
89
112#define _REGION_DECLARE(node_id) \
113 LINKER_DT_NODE_REGION_NAME_TOKEN(node_id) : \
114 ORIGIN = DT_REG_ADDR(node_id), \
115 LENGTH = DT_REG_SIZE(node_id)
116
147#define _SECTION_DECLARE(node_id) \
148 LINKER_DT_NODE_REGION_NAME_TOKEN(node_id) DT_REG_ADDR(node_id) (NOLOAD) : \
149 { \
150 _DT_SECTION_START(node_id) = .; \
151 KEEP(*(LINKER_DT_NODE_REGION_NAME_TOKEN(node_id))) \
152 KEEP(*(LINKER_DT_NODE_REGION_NAME_TOKEN(node_id).*)) \
153 _DT_SECTION_END(node_id) = .; \
154 } > LINKER_DT_NODE_REGION_NAME_TOKEN(node_id) \
155 _DT_SECTION_SIZE(node_id) = _DT_SECTION_END(node_id) - _DT_SECTION_START(node_id); \
156 _DT_SECTION_LOAD(node_id) = LOADADDR(LINKER_DT_NODE_REGION_NAME_TOKEN(node_id));
157
161#define _EXPAND_MPU_FN(node_id, MPU_FN, ...) \
162 MPU_FN(LINKER_DT_NODE_REGION_NAME(node_id), \
163 DT_REG_ADDR(node_id), \
164 DT_REG_SIZE(node_id), \
165 _DT_ATTR(DT_STRING_TOKEN(node_id, zephyr_memory_region_mpu))),
166
174#define _CHECK_ATTR_FN(node_id, EXPAND_MPU_FN, ...) \
175 COND_CODE_1(UTIL_AND(DT_NODE_HAS_PROP(node_id, zephyr_memory_region_mpu), \
176 DT_NODE_HAS_PROP(node_id, zephyr_memory_region)), \
177 (EXPAND_MPU_FN(node_id, __VA_ARGS__)), \
178 ())
179
184#define _CHECK_APPLY_FN(compat, EXPAND_MPU_FN, ...) \
185 DT_FOREACH_STATUS_OKAY_VARGS(compat, _CHECK_ATTR_FN, EXPAND_MPU_FN, __VA_ARGS__)
186
197#define LINKER_DT_REGIONS() \
198 DT_FOREACH_STATUS_OKAY(_DT_COMPATIBLE, _REGION_DECLARE)
199
204#define LINKER_DT_SECTIONS() \
205 DT_FOREACH_STATUS_OKAY(_DT_COMPATIBLE, _SECTION_DECLARE)
206
280#define LINKER_DT_REGION_MPU(mpu_fn) _CHECK_APPLY_FN(_DT_COMPATIBLE, _EXPAND_MPU_FN, mpu_fn)