Commit b54290e5 authored by Nicolas Pitre's avatar Nicolas Pitre

ARM: simplify and fix linker script for TCM

Let's put the TCM stuff in the __init section directly. No need for
a separately freed memory area.

Remove redundant linker sections, as well as comments that were more
confusing than no comments at all. Finally make it XIP compatible by
using LOAD_OFFSET in the section LMA specification.
Signed-off-by: default avatarNicolas Pitre <nico@linaro.org>
Tested-by: default avatarChris Brandt <Chris.Brandt@renesas.com>
parent c3146c43
...@@ -132,6 +132,10 @@ SECTIONS ...@@ -132,6 +132,10 @@ SECTIONS
PERCPU_SECTION(L1_CACHE_BYTES) PERCPU_SECTION(L1_CACHE_BYTES)
#endif #endif
#ifdef CONFIG_HAVE_TCM
ARM_TCM
#endif
/* /*
* End of copied data. We need a dummy section to get its LMA. * End of copied data. We need a dummy section to get its LMA.
* Also located before final ALIGN() as trailing padding is not stored * Also located before final ALIGN() as trailing padding is not stored
...@@ -143,10 +147,6 @@ SECTIONS ...@@ -143,10 +147,6 @@ SECTIONS
. = ALIGN(PAGE_SIZE); . = ALIGN(PAGE_SIZE);
__init_end = .; __init_end = .;
#ifdef CONFIG_HAVE_TCM
ARM_TCM
#endif
BSS_SECTION(0, 0, 8) BSS_SECTION(0, 0, 8)
_end = .; _end = .;
......
...@@ -127,6 +127,10 @@ SECTIONS ...@@ -127,6 +127,10 @@ SECTIONS
PERCPU_SECTION(L1_CACHE_BYTES) PERCPU_SECTION(L1_CACHE_BYTES)
#endif #endif
#ifdef CONFIG_HAVE_TCM
ARM_TCM
#endif
#ifdef CONFIG_STRICT_KERNEL_RWX #ifdef CONFIG_STRICT_KERNEL_RWX
. = ALIGN(1<<SECTION_SHIFT); . = ALIGN(1<<SECTION_SHIFT);
#else #else
...@@ -138,10 +142,6 @@ SECTIONS ...@@ -138,10 +142,6 @@ SECTIONS
RW_DATA_SECTION(L1_CACHE_BYTES, PAGE_SIZE, THREAD_SIZE) RW_DATA_SECTION(L1_CACHE_BYTES, PAGE_SIZE, THREAD_SIZE)
_edata = .; _edata = .;
#ifdef CONFIG_HAVE_TCM
ARM_TCM
#endif
BSS_SECTION(0, 0, 0) BSS_SECTION(0, 0, 0)
_end = .; _end = .;
......
...@@ -115,61 +115,21 @@ ...@@ -115,61 +115,21 @@
PROVIDE(vector_fiq_offset = vector_fiq - ADDR(.vectors)); PROVIDE(vector_fiq_offset = vector_fiq - ADDR(.vectors));
#define ARM_TCM \ #define ARM_TCM \
/* \ __itcm_start = ALIGN(4); \
* We align everything to a page boundary so we can \ .text_itcm ITCM_OFFSET : AT(__itcm_start - LOAD_OFFSET) { \
* free it after init has commenced and TCM contents have \
* been copied to its destination. \
*/ \
.tcm_start : { \
. = ALIGN(PAGE_SIZE); \
__tcm_start = .; \
__itcm_start = .; \
} \
\
/* \
* Link these to the ITCM RAM \
* \
* Put VMA to the TCM address and LMA to the common RAM \
* and we'll upload the contents from RAM to TCM and free \
* the used RAM after that. \
*/ \
.text_itcm ITCM_OFFSET : AT(__itcm_start) \
{ \
__sitcm_text = .; \ __sitcm_text = .; \
*(.tcm.text) \ *(.tcm.text) \
*(.tcm.rodata) \ *(.tcm.rodata) \
. = ALIGN(4); \ . = ALIGN(4); \
__eitcm_text = .; \ __eitcm_text = .; \
} \ } \
. = __itcm_start + SIZEOF(.text_itcm); \
\ \
/* \
* Reset the dot pointer, this is needed to create the \
* relative __dtcm_start below (to be used as extern in code). \
*/ \
. = ADDR(.tcm_start) + SIZEOF(.tcm_start) + SIZEOF(.text_itcm); \
\
.dtcm_start : { \
__dtcm_start = .; \ __dtcm_start = .; \
} \ .data_dtcm DTCM_OFFSET : AT(__dtcm_start - LOAD_OFFSET) { \
\
/* \
* TODO: add remainder of ITCM as well, \
* that can be used for data! \
*/ \
.data_dtcm DTCM_OFFSET : AT(__dtcm_start) \
{ \
. = ALIGN(4); \
__sdtcm_data = .; \ __sdtcm_data = .; \
*(.tcm.data) \ *(.tcm.data) \
. = ALIGN(4); \ . = ALIGN(4); \
__edtcm_data = .; \ __edtcm_data = .; \
} \ } \
\ . = __dtcm_start + SIZEOF(.data_dtcm);
/* Reset the dot pointer or the linker gets confused */ \
. = ADDR(.dtcm_start) + SIZEOF(.data_dtcm); \
\
/* End marker for freeing TCM copy in linked object */ \
.tcm_end : AT(ADDR(.dtcm_start) + SIZEOF(.data_dtcm)){ \
. = ALIGN(PAGE_SIZE); \
__tcm_end = .; \
}
...@@ -758,20 +758,9 @@ void set_kernel_text_ro(void) ...@@ -758,20 +758,9 @@ void set_kernel_text_ro(void)
static inline void fix_kernmem_perms(void) { } static inline void fix_kernmem_perms(void) { }
#endif /* CONFIG_STRICT_KERNEL_RWX */ #endif /* CONFIG_STRICT_KERNEL_RWX */
void free_tcmmem(void)
{
#ifdef CONFIG_HAVE_TCM
extern char __tcm_start, __tcm_end;
poison_init_mem(&__tcm_start, &__tcm_end - &__tcm_start);
free_reserved_area(&__tcm_start, &__tcm_end, -1, "TCM link");
#endif
}
void free_initmem(void) void free_initmem(void)
{ {
fix_kernmem_perms(); fix_kernmem_perms();
free_tcmmem();
poison_init_mem(__init_begin, __init_end - __init_begin); poison_init_mem(__init_begin, __init_end - __init_begin);
if (!machine_is_integrator() && !machine_is_cintegrator()) if (!machine_is_integrator() && !machine_is_cintegrator())
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment