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)