Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
30 changes: 15 additions & 15 deletions include/arch/arm/aarch32/cortex_m/scripts/linker.ld
Original file line number Diff line number Diff line change
Expand Up @@ -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
}
Expand Down Expand Up @@ -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);
Expand All @@ -407,23 +407,23 @@ 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))
{
__dtcm_noinit_start = .;
*(.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))
{
__dtcm_data_start = .;
*(.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 = .;

Expand Down
42 changes: 42 additions & 0 deletions include/devicetree.h
Original file line number Diff line number Diff line change
Expand Up @@ -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?
*
Expand Down
23 changes: 16 additions & 7 deletions include/linker/devicetree_regions.h
Original file line number Diff line number Diff line change
Expand Up @@ -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 \<reg\> 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)))
1 change: 1 addition & 0 deletions include/sys/util_internal.h
Original file line number Diff line number Diff line change
Expand Up @@ -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__
Expand Down
67 changes: 67 additions & 0 deletions include/sys/util_loops.h
Original file line number Diff line number Diff line change
Expand Up @@ -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_ */
7 changes: 7 additions & 0 deletions scripts/dts/gen_defines.py
Original file line number Diff line number Diff line change
Expand Up @@ -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)
Expand Down Expand Up @@ -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()))
Expand Down
8 changes: 4 additions & 4 deletions soc/arm/st_stm32/common/ccm.ld
Original file line number Diff line number Diff line change
Expand Up @@ -9,26 +9,26 @@ 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))
{
__ccm_noinit_start = .;
*(.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))
{
__ccm_data_start = .;
*(.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)
GROUP_END(CCM)
2 changes: 1 addition & 1 deletion soc/arm/st_stm32/stm32h7/sections.ld
Original file line number Diff line number Diff line change
Expand Up @@ -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
2 changes: 1 addition & 1 deletion soc/arm/ti_simplelink/cc13x2_cc26x2/ccfg.ld
Original file line number Diff line number Diff line change
Expand Up @@ -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)
7 changes: 7 additions & 0 deletions tests/lib/devicetree/api/src/main.c
Original file line number Diff line number Diff line change
Expand Up @@ -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"), "");
Expand Down
9 changes: 9 additions & 0 deletions tests/unit/util/test.inc
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -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),
Expand Down