Skip to content

Commit f633852

Browse files
MaureenHelmioannisg
authored andcommitted
linker: arm: Add cortex_m itcm section
Adds a linker section for Cortex-M instruction tightly coupled memory (ITCM), similar to the existing section for DTCM. A new executable MPU region is not added as there isn't currently a need to make this section accessible to user mode. This section can be enabled by setting a device tree chosen node zephyr,itcm. Signed-off-by: Maureen Helm <[email protected]>
1 parent 334014a commit f633852

File tree

6 files changed

+41
-0
lines changed

6 files changed

+41
-0
lines changed

doc/reference/devicetree/api.rst

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -351,6 +351,8 @@ the source code to specify a device name.
351351
- A node whose ``reg`` is used by the OpenAMP subsystem to determine the
352352
base address and size of the shared memory (SHM) usable for
353353
interprocess-communication (IPC)
354+
* - zephyr,itcm
355+
- Instruction Tightly Coupled Memory node on some Arm SoCs
354356
* - zephyr,shell-uart
355357
- Sets default :option:`CONFIG_UART_SHELL_ON_DEV_NAME`
356358
* - zephyr,sram

include/arch/arm/aarch32/cortex_m/scripts/linker.ld

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -71,6 +71,11 @@
7171
#define CCM_ADDR DT_REG_ADDR(DT_CHOSEN(zephyr_ccm))
7272
#endif
7373

74+
#if DT_NODE_HAS_STATUS(DT_CHOSEN(zephyr_itcm), okay)
75+
#define ITCM_SIZE DT_REG_SIZE(DT_CHOSEN(zephyr_itcm))
76+
#define ITCM_ADDR DT_REG_ADDR(DT_CHOSEN(zephyr_itcm))
77+
#endif
78+
7479
#if DT_NODE_HAS_STATUS(DT_CHOSEN(zephyr_dtcm), okay)
7580
#define DTCM_SIZE DT_REG_SIZE(DT_CHOSEN(zephyr_dtcm))
7681
#define DTCM_ADDR DT_REG_ADDR(DT_CHOSEN(zephyr_dtcm))
@@ -108,6 +113,9 @@ MEMORY
108113
#if DT_NODE_HAS_STATUS(DT_CHOSEN(zephyr_ccm), okay)
109114
CCM (rw) : ORIGIN = CCM_ADDR, LENGTH = CCM_SIZE
110115
#endif
116+
#if DT_NODE_HAS_STATUS(DT_CHOSEN(zephyr_itcm), okay)
117+
ITCM (rw) : ORIGIN = ITCM_ADDR, LENGTH = ITCM_SIZE
118+
#endif
111119
#if DT_NODE_HAS_STATUS(DT_CHOSEN(zephyr_dtcm), okay)
112120
DTCM (rw) : ORIGIN = DTCM_ADDR, LENGTH = DTCM_SIZE
113121
#endif
@@ -419,6 +427,23 @@ SECTIONS
419427

420428
GROUP_END(RAMABLE_REGION)
421429

430+
#if DT_NODE_HAS_STATUS(DT_CHOSEN(zephyr_itcm), okay)
431+
GROUP_START(ITCM)
432+
433+
SECTION_PROLOGUE(_ITCM_SECTION_NAME,,SUBALIGN(4))
434+
{
435+
__itcm_start = .;
436+
*(.itcm)
437+
*(".itcm.*")
438+
__itcm_end = .;
439+
} GROUP_LINK_IN(ITCM AT> ROMABLE_REGION)
440+
441+
__itcm_size = __itcm_end - __itcm_start;
442+
__itcm_rom_start = LOADADDR(_ITCM_SECTION_NAME);
443+
444+
GROUP_END(ITCM)
445+
#endif
446+
422447
#if DT_NODE_HAS_STATUS(DT_CHOSEN(zephyr_dtcm), okay)
423448
GROUP_START(DTCM)
424449

include/linker/linker-defs.h

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -230,6 +230,13 @@ extern char __ccm_noinit_end[];
230230
extern char __ccm_end[];
231231
#endif
232232

233+
#if DT_NODE_HAS_STATUS(DT_CHOSEN(zephyr_itcm), okay)
234+
extern char __itcm_start[];
235+
extern char __itcm_end[];
236+
extern char __itcm_size[];
237+
extern char __itcm_rom_start[];
238+
#endif
239+
233240
#if DT_NODE_HAS_STATUS(DT_CHOSEN(zephyr_dtcm), okay)
234241
extern char __dtcm_data_start[];
235242
extern char __dtcm_data_end[];

include/linker/section_tags.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@
2323
#define __ccm_data_section Z_GENERIC_SECTION(_CCM_DATA_SECTION_NAME)
2424
#define __ccm_bss_section Z_GENERIC_SECTION(_CCM_BSS_SECTION_NAME)
2525
#define __ccm_noinit_section Z_GENERIC_SECTION(_CCM_NOINIT_SECTION_NAME)
26+
#define __itcm_section Z_GENERIC_SECTION(_ITCM_SECTION_NAME)
2627
#define __dtcm_data_section Z_GENERIC_SECTION(_DTCM_DATA_SECTION_NAME)
2728
#define __dtcm_bss_section Z_GENERIC_SECTION(_DTCM_BSS_SECTION_NAME)
2829
#define __dtcm_noinit_section Z_GENERIC_SECTION(_DTCM_NOINIT_SECTION_NAME)

include/linker/sections.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,8 @@
4343
#define _CCM_BSS_SECTION_NAME .ccm_bss
4444
#define _CCM_NOINIT_SECTION_NAME .ccm_noinit
4545

46+
#define _ITCM_SECTION_NAME .itcm
47+
4648
#define _DTCM_DATA_SECTION_NAME .dtcm_data
4749
#define _DTCM_BSS_SECTION_NAME .dtcm_bss
4850
#define _DTCM_NOINIT_SECTION_NAME .dtcm_noinit

kernel/xip.c

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,10 @@ void z_data_copy(void)
3535
(void)memcpy(&__ccm_data_start, &__ccm_data_rom_start,
3636
__ccm_data_end - __ccm_data_start);
3737
#endif
38+
#if DT_NODE_HAS_STATUS(DT_CHOSEN(zephyr_itcm), okay)
39+
(void)memcpy(&__itcm_start, &__itcm_rom_start,
40+
(uintptr_t) &__itcm_size);
41+
#endif
3842
#if DT_NODE_HAS_STATUS(DT_CHOSEN(zephyr_dtcm), okay)
3943
(void)memcpy(&__dtcm_data_start, &__dtcm_data_rom_start,
4044
__dtcm_data_end - __dtcm_data_start);

0 commit comments

Comments
 (0)