diff --git a/include/arch/arm/aarch32/cortex_m/scripts/linker.ld b/include/arch/arm/aarch32/cortex_m/scripts/linker.ld index 8a1c233a50ac2..5cce324ceb23a 100644 --- a/include/arch/arm/aarch32/cortex_m/scripts/linker.ld +++ b/include/arch/arm/aarch32/cortex_m/scripts/linker.ld @@ -88,21 +88,21 @@ MEMORY FLASH (rx) : ORIGIN = ROM_ADDR, LENGTH = ROM_SIZE SRAM (wx) : ORIGIN = RAM_ADDR, LENGTH = RAM_SIZE /* TI CCFG Registers */ - DT_REGION_FROM_NODE_STATUS_OKAY(FLASH_CCFG, rwx, DT_NODELABEL(ti_ccfg_partition)) + DT_REGION_FROM_NODE_STATUS_OKAY(DT_NODELABEL(ti_ccfg_partition), rwx) /* Data & Instruction Tightly Coupled Memory */ - DT_REGION_FROM_NODE_STATUS_OKAY(ITCM, rw, DT_CHOSEN(zephyr_itcm)) - DT_REGION_FROM_NODE_STATUS_OKAY(DTCM, rw, DT_CHOSEN(zephyr_dtcm)) + DT_REGION_FROM_NODE_STATUS_OKAY(DT_CHOSEN(zephyr_itcm), rw) + DT_REGION_FROM_NODE_STATUS_OKAY(DT_CHOSEN(zephyr_dtcm), rw) /* STM32 Core Coupled Memory */ - DT_REGION_FROM_NODE_STATUS_OKAY(CCM, rw, DT_CHOSEN(zephyr_ccm)) + DT_REGION_FROM_NODE_STATUS_OKAY(DT_CHOSEN(zephyr_ccm), rw) /* STM32WB IPC RAM */ - DT_REGION_FROM_NODE_STATUS_OKAY(SRAM1, rw, DT_NODELABEL(sram1)) - DT_REGION_FROM_NODE_STATUS_OKAY(SRAM2, rw, DT_NODELABEL(sram2)) + DT_REGION_FROM_NODE_STATUS_OKAY(DT_NODELABEL(sram1), rw) + DT_REGION_FROM_NODE_STATUS_OKAY(DT_NODELABEL(sram2), rw) /* STM32 alternate RAM configurations */ - DT_REGION_FROM_NODE_STATUS_OKAY(SRAM3, rw, DT_NODELABEL(sram3)) - DT_REGION_FROM_NODE_STATUS_OKAY(SRAM4, rw, DT_NODELABEL(sram4)) - DT_REGION_FROM_NODE_STATUS_OKAY(SDRAM1, rw, DT_NODELABEL(sdram1)) - DT_REGION_FROM_NODE_STATUS_OKAY(SDRAM2, rw, DT_NODELABEL(sdram2)) - DT_REGION_FROM_NODE_STATUS_OKAY(BACKUP_SRAM, rw, DT_NODELABEL(backup_sram)) + DT_REGION_FROM_NODE_STATUS_OKAY(DT_NODELABEL(sram3), rw) + DT_REGION_FROM_NODE_STATUS_OKAY(DT_NODELABEL(sram4), rw) + DT_REGION_FROM_NODE_STATUS_OKAY(DT_NODELABEL(sdram1), rw) + DT_REGION_FROM_NODE_STATUS_OKAY(DT_NODELABEL(sdram2), rw) + DT_REGION_FROM_NODE_STATUS_OKAY(DT_NODELABEL(backup_sram), rw) /* Used by and documented in include/linker/intlist.ld */ IDT_LIST (wx) : ORIGIN = (RAM_ADDR + RAM_SIZE), LENGTH = 2K } @@ -389,7 +389,7 @@ GROUP_START(ITCM) *(.itcm) *(".itcm.*") __itcm_end = .; - } GROUP_LINK_IN(ITCM AT> ROMABLE_REGION) + } GROUP_LINK_IN(DT_REGION_NAME(DT_CHOSEN(zephyr_itcm)) AT> ROMABLE_REGION) __itcm_size = __itcm_end - __itcm_start; __itcm_rom_start = LOADADDR(_ITCM_SECTION_NAME); @@ -407,7 +407,7 @@ GROUP_START(DTCM) *(.dtcm_bss) *(".dtcm_bss.*") __dtcm_bss_end = .; - } GROUP_LINK_IN(DTCM) + } GROUP_LINK_IN(DT_REGION_NAME(DT_CHOSEN(zephyr_dtcm))) SECTION_PROLOGUE(_DTCM_NOINIT_SECTION_NAME, (NOLOAD),SUBALIGN(4)) { @@ -415,7 +415,7 @@ GROUP_START(DTCM) *(.dtcm_noinit) *(".dtcm_noinit.*") __dtcm_noinit_end = .; - } GROUP_LINK_IN(DTCM) + } GROUP_LINK_IN(DT_REGION_NAME(DT_CHOSEN(zephyr_dtcm))) SECTION_PROLOGUE(_DTCM_DATA_SECTION_NAME,,SUBALIGN(4)) { @@ -423,7 +423,7 @@ GROUP_START(DTCM) *(.dtcm_data) *(".dtcm_data.*") __dtcm_data_end = .; - } GROUP_LINK_IN(DTCM AT> ROMABLE_REGION) + } GROUP_LINK_IN(DT_REGION_NAME(DT_CHOSEN(zephyr_dtcm)) AT> ROMABLE_REGION) __dtcm_end = .; diff --git a/include/devicetree.h b/include/devicetree.h index 45187a829039f..2dbeed1d56d34 100644 --- a/include/devicetree.h +++ b/include/devicetree.h @@ -467,6 +467,48 @@ */ #define DT_NODE_FULL_NAME(node_id) DT_CAT(node_id, _FULL_NAME) +/** + * @brief Get the number of node labels a node was given + * + * Example devicetree fragment: + * + * / { + * soc { + * node1: node2: node3: my-node@12345678 { ... }; + * }; + * }; + * + * Example usage: + * + * DT_NODE_NUM_NODELABELS(DT_NODELABEL(node1)) // 3 + * + * @param node_id node identifier + * @retval the number of labels given to the node + */ +#define DT_NODE_NUM_NODELABELS(node_id) DT_CAT(node_id, _NODELABEL_NUM) + +/** + * @brief Get the "idx"th node label of a node + * + * Example devicetree fragment: + * + * / { + * soc { + * node1: node2: node3: my-node@12345678 { ... }; + * }; + * }; + * + * Example usage: + * + * DT_NODE_NODELABEL_BY_IDX(DT_NODELABEL(node1), 0) // node1 + * DT_NODE_NODELABEL_BY_IDX(DT_NODELABEL(node1), 2) // node3 + * + * @param node_id node identifier + * @param idx the index to get + * @retval the idx'th node label of the node + */ +#define DT_NODE_NODELABEL_BY_IDX(node_id, idx) DT_CAT3(node_id, _NODELABEL_IDX_, idx) + /** * @brief Do node_id1 and node_id2 refer to the same node? * diff --git a/include/linker/devicetree_regions.h b/include/linker/devicetree_regions.h index d7421d966992d..4a3ef07acaf3e 100644 --- a/include/linker/devicetree_regions.h +++ b/include/linker/devicetree_regions.h @@ -8,19 +8,28 @@ */ /* Declare a memory region */ -#define _REGION_DECLARE(name, attr, node) name(attr) : \ - ORIGIN = DT_REG_ADDR(node), \ +#define _REGION_DECLARE(node, attr) DT_REGION_NAME(node)(attr) : \ + ORIGIN = DT_REG_ADDR(node), \ LENGTH = DT_REG_SIZE(node) /** * @brief Generate a linker memory region from a devicetree node * - * @param name name of the generated memory region - * @param attr region attributes to use (rx, rw, ...) * @param node devicetree node with a \ property defining region location * and size. + * @param attr region attributes to use (rx, rw, ...) */ -#define DT_REGION_FROM_NODE_STATUS_OKAY(name, attr, node) \ - COND_CODE_1(DT_NODE_HAS_STATUS(node, okay), \ - (_REGION_DECLARE(name, attr, node)), \ +#define DT_REGION_FROM_NODE_STATUS_OKAY(node, attr) \ + COND_CODE_1(DT_NODE_HAS_STATUS(node, okay), \ + (_REGION_DECLARE(node, attr)), \ ()) + +/** + * @brief Get a memory region name from a devicetree node + * + * @param node_id node identifier + * @retval unquoted node label + */ +#define DT_REGION_NAME(node_id) \ + DT_NODE_NODELABEL_BY_IDX(node_id, \ + UTIL_DECR(DT_NODE_NUM_NODELABELS(node_id))) diff --git a/include/sys/util_internal.h b/include/sys/util_internal.h index 3b70ec3deb732..a1a7cec878a25 100644 --- a/include/sys/util_internal.h +++ b/include/sys/util_internal.h @@ -91,6 +91,7 @@ #define UTIL_COMPL_0 1 #define UTIL_COMPL_1 0 #define UTIL_BOOL(x) UTIL_COMPL(UTIL_NOT(x)) +#define UTIL_DECR(n) UTIL_PRIMITIVE_CAT(Z_DECR_, n) #define UTIL_EVAL(...) __VA_ARGS__ #define UTIL_EXPAND(...) __VA_ARGS__ diff --git a/include/sys/util_loops.h b/include/sys/util_loops.h index 7b2e1281ec6a3..60ea8bde57ded 100644 --- a/include/sys/util_loops.h +++ b/include/sys/util_loops.h @@ -2105,4 +2105,71 @@ Z_UTIL_LISTIFY_255(F, __VA_ARGS__) \ F(255, __VA_ARGS__) +/* Decrement variables */ +#define Z_DECR_0 0 +#define Z_DECR_1 0 +#define Z_DECR_2 1 +#define Z_DECR_3 2 +#define Z_DECR_4 3 +#define Z_DECR_5 4 +#define Z_DECR_6 5 +#define Z_DECR_7 6 +#define Z_DECR_8 7 +#define Z_DECR_9 8 +#define Z_DECR_10 9 +#define Z_DECR_11 10 +#define Z_DECR_12 11 +#define Z_DECR_13 12 +#define Z_DECR_14 13 +#define Z_DECR_15 14 +#define Z_DECR_16 15 +#define Z_DECR_17 16 +#define Z_DECR_18 17 +#define Z_DECR_19 18 +#define Z_DECR_20 19 +#define Z_DECR_21 20 +#define Z_DECR_22 21 +#define Z_DECR_23 22 +#define Z_DECR_24 23 +#define Z_DECR_25 24 +#define Z_DECR_26 25 +#define Z_DECR_27 26 +#define Z_DECR_28 27 +#define Z_DECR_29 28 +#define Z_DECR_30 29 +#define Z_DECR_31 30 +#define Z_DECR_32 31 +#define Z_DECR_33 32 +#define Z_DECR_34 33 +#define Z_DECR_35 34 +#define Z_DECR_36 35 +#define Z_DECR_37 36 +#define Z_DECR_38 37 +#define Z_DECR_39 38 +#define Z_DECR_40 39 +#define Z_DECR_41 40 +#define Z_DECR_42 41 +#define Z_DECR_43 42 +#define Z_DECR_44 43 +#define Z_DECR_45 44 +#define Z_DECR_46 45 +#define Z_DECR_47 46 +#define Z_DECR_48 47 +#define Z_DECR_49 48 +#define Z_DECR_50 49 +#define Z_DECR_51 50 +#define Z_DECR_52 51 +#define Z_DECR_53 52 +#define Z_DECR_54 53 +#define Z_DECR_55 54 +#define Z_DECR_56 55 +#define Z_DECR_57 56 +#define Z_DECR_58 57 +#define Z_DECR_59 58 +#define Z_DECR_60 59 +#define Z_DECR_61 60 +#define Z_DECR_62 61 +#define Z_DECR_63 62 +#define Z_DECR_64 63 + #endif /* ZEPHYR_INCLUDE_SYS_UTIL_LOOPS_H_ */ diff --git a/scripts/dts/gen_defines.py b/scripts/dts/gen_defines.py index 498894907ef7a..07868452555b4 100755 --- a/scripts/dts/gen_defines.py +++ b/scripts/dts/gen_defines.py @@ -118,6 +118,12 @@ def main(): out_dt_define(f"{node.z_path_id}_PARENT", f"DT_{node.parent.z_path_id}") + out_comment("Node's node labels:") + out_dt_define(f"{node.z_path_id}_NODELABEL_NUM", len(node.labels)) + for idx, label in enumerate(node.labels): + out_dt_define(f"{node.z_path_id}_NODELABEL_IDX_{idx}_EXISTS", 1) + out_dt_define(f"{node.z_path_id}_NODELABEL_IDX_{idx}", label) + write_child_functions(node) write_child_functions_status_okay(node) write_dep_info(node) @@ -475,6 +481,7 @@ def write_child_functions(node): # Writes macro that are helpers that will call a macro/function # for each child node. + out_comment("Node's children:") out_dt_define(f"{node.z_path_id}_FOREACH_CHILD(fn)", " ".join(f"fn(DT_{child.z_path_id})" for child in node.children.values())) diff --git a/soc/arm/st_stm32/common/ccm.ld b/soc/arm/st_stm32/common/ccm.ld index 4804cc75f9b03..a3d574841a7f5 100644 --- a/soc/arm/st_stm32/common/ccm.ld +++ b/soc/arm/st_stm32/common/ccm.ld @@ -9,7 +9,7 @@ GROUP_START(CCM) *(.ccm_bss) *(".ccm_bss.*") __ccm_bss_end = .; - } GROUP_LINK_IN(CCM) + } GROUP_LINK_IN(DT_REGION_NAME(DT_CHOSEN(zephyr_ccm))) SECTION_PROLOGUE(_CCM_NOINIT_SECTION_NAME, (NOLOAD),SUBALIGN(4)) { @@ -17,7 +17,7 @@ GROUP_START(CCM) *(.ccm_noinit) *(".ccm_noinit.*") __ccm_noinit_end = .; - } GROUP_LINK_IN(CCM) + } GROUP_LINK_IN(DT_REGION_NAME(DT_CHOSEN(zephyr_ccm))) SECTION_PROLOGUE(_CCM_DATA_SECTION_NAME,,SUBALIGN(4)) { @@ -25,10 +25,10 @@ GROUP_START(CCM) *(.ccm_data) *(".ccm_data.*") __ccm_data_end = .; - } GROUP_LINK_IN(CCM AT> ROMABLE_REGION) + } GROUP_LINK_IN(DT_REGION_NAME(DT_CHOSEN(zephyr_ccm)) AT> ROMABLE_REGION) __ccm_end = .; __ccm_data_rom_start = LOADADDR(_CCM_DATA_SECTION_NAME); -GROUP_END(CCM) \ No newline at end of file +GROUP_END(CCM) diff --git a/soc/arm/st_stm32/stm32h7/sections.ld b/soc/arm/st_stm32/stm32h7/sections.ld index 45092f2284a8f..729271febaa8e 100644 --- a/soc/arm/st_stm32/stm32h7/sections.ld +++ b/soc/arm/st_stm32/stm32h7/sections.ld @@ -13,6 +13,6 @@ SECTION_DATA_PROLOGUE(eth_stm32,(NOLOAD),) . = ABSOLUTE(DT_REG_ADDR(DT_NODELABEL(sram3))) + 256; *(.eth_stm32_buf) . = ABSOLUTE(DT_REG_ADDR(DT_NODELABEL(sram3))) + 16K; -} GROUP_DATA_LINK_IN(SRAM3, SRAM3) +} GROUP_DATA_LINK_IN(DT_REGION_NAME(DT_NODELABEL(sram3)), DT_REGION_NAME(DT_NODELABEL(sram3))) #endif diff --git a/soc/arm/ti_simplelink/cc13x2_cc26x2/ccfg.ld b/soc/arm/ti_simplelink/cc13x2_cc26x2/ccfg.ld index 8821bd4947111..ae0797524b4dd 100644 --- a/soc/arm/ti_simplelink/cc13x2_cc26x2/ccfg.ld +++ b/soc/arm/ti_simplelink/cc13x2_cc26x2/ccfg.ld @@ -10,6 +10,6 @@ GROUP_START(FLASH_CCFG) SECTION_PROLOGUE(.ti_ccfg,,) { KEEP(*(_TI_CCFG_SECTION_NAME)) -} GROUP_LINK_IN(FLASH_CCFG) +} GROUP_LINK_IN(DT_REGION_NAME(DT_NODELABEL(ti_ccfg_partition))) GROUP_END(FLASH_CCFG) diff --git a/tests/lib/devicetree/api/src/main.c b/tests/lib/devicetree/api/src/main.c index 573d9ffbb772a..48ab3f56bf587 100644 --- a/tests/lib/devicetree/api/src/main.c +++ b/tests/lib/devicetree/api/src/main.c @@ -132,6 +132,13 @@ static void test_nodelabel_props(void) zassert_equal(DT_REG_ADDR(TEST_NODELABEL), 0xdeadbeef, ""); zassert_equal(DT_REG_SIZE(TEST_NODELABEL), 0x1000, ""); zassert_true(!strcmp(DT_LABEL(TEST_NODELABEL), "TEST_GPIO_1"), ""); + zassert_equal(DT_NODE_NUM_NODELABELS(TEST_NODELABEL), 3, ""); + zassert_true(!strcmp(STRINGIFY(DT_NODE_NODELABEL_BY_IDX(TEST_NODELABEL, 0)), + "test_nodelabel"), ""); + zassert_true(!strcmp(STRINGIFY(DT_NODE_NODELABEL_BY_IDX(TEST_NODELABEL, 1)), + "TEST_NODELABEL_ALLCAPS"), ""); + zassert_true(!strcmp(STRINGIFY(DT_NODE_NODELABEL_BY_IDX(TEST_NODELABEL, 2)), + "test_gpio_1"), ""); zassert_equal(DT_PROP(TEST_NODELABEL, gpio_controller), 1, ""); zassert_equal(DT_PROP(TEST_NODELABEL, ngpios), 32, ""); zassert_true(!strcmp(DT_PROP(TEST_NODELABEL, status), "okay"), ""); diff --git a/tests/unit/util/test.inc b/tests/unit/util/test.inc index b39f76f9eee11..edcf6188e32c1 100644 --- a/tests/unit/util/test.inc +++ b/tests/unit/util/test.inc @@ -143,6 +143,14 @@ void test_UTIL_AND(void) zassert_equal(UTIL_AND(SEVEN, SEVEN), 7, NULL); } +void test_UTIL_DECR(void) +{ + zassert_equal(UTIL_DECR(ZERO), 0, NULL); + zassert_equal(UTIL_DECR(1), 0, NULL); + zassert_equal(UTIL_DECR(SEVEN), 6, NULL); + zassert_equal(UTIL_DECR(15), 14, NULL); +} + void test_IF_ENABLED(void) { #define test_IF_ENABLED_FLAG_A 1 @@ -455,6 +463,7 @@ void test_cc(void) ztest_unit_test(test_COND_CODE_0), ztest_unit_test(test_UTIL_OR), ztest_unit_test(test_UTIL_AND), + ztest_unit_test(test_UTIL_DECR), ztest_unit_test(test_IF_ENABLED), ztest_unit_test(test_UTIL_LISTIFY), ztest_unit_test(test_MACRO_MAP_CAT),