summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNicolas Pitre <nicolas.pitre@linaro.org>2018-03-09 05:12:04 +0300
committerNicolas Pitre <nicolas.pitre@linaro.org>2018-03-10 04:20:43 +0300
commitb54290e51accea4f696f5dacef8e609d0ccbe54a (patch)
tree3d35a3674cfc8613445b0cd71faebb3a68d3bd24
parentc3146c43db4974f4571bd9d42b172ca03a9137c6 (diff)
downloadlinux-b54290e51accea4f696f5dacef8e609d0ccbe54a.tar.xz
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: Nicolas Pitre <nico@linaro.org> Tested-by: Chris Brandt <Chris.Brandt@renesas.com>
-rw-r--r--arch/arm/kernel/vmlinux-xip.lds.S8
-rw-r--r--arch/arm/kernel/vmlinux.lds.S8
-rw-r--r--arch/arm/kernel/vmlinux.lds.h52
-rw-r--r--arch/arm/mm/init.c11
4 files changed, 14 insertions, 65 deletions
diff --git a/arch/arm/kernel/vmlinux-xip.lds.S b/arch/arm/kernel/vmlinux-xip.lds.S
index c727c56f3cb2..d32f5d35f602 100644
--- a/arch/arm/kernel/vmlinux-xip.lds.S
+++ b/arch/arm/kernel/vmlinux-xip.lds.S
@@ -132,6 +132,10 @@ SECTIONS
PERCPU_SECTION(L1_CACHE_BYTES)
#endif
+#ifdef CONFIG_HAVE_TCM
+ ARM_TCM
+#endif
+
/*
* End of copied data. We need a dummy section to get its LMA.
* Also located before final ALIGN() as trailing padding is not stored
@@ -143,10 +147,6 @@ SECTIONS
. = ALIGN(PAGE_SIZE);
__init_end = .;
-#ifdef CONFIG_HAVE_TCM
- ARM_TCM
-#endif
-
BSS_SECTION(0, 0, 8)
_end = .;
diff --git a/arch/arm/kernel/vmlinux.lds.S b/arch/arm/kernel/vmlinux.lds.S
index 1e9f2a6b3d33..b77dc675ae55 100644
--- a/arch/arm/kernel/vmlinux.lds.S
+++ b/arch/arm/kernel/vmlinux.lds.S
@@ -127,6 +127,10 @@ SECTIONS
PERCPU_SECTION(L1_CACHE_BYTES)
#endif
+#ifdef CONFIG_HAVE_TCM
+ ARM_TCM
+#endif
+
#ifdef CONFIG_STRICT_KERNEL_RWX
. = ALIGN(1<<SECTION_SHIFT);
#else
@@ -138,10 +142,6 @@ SECTIONS
RW_DATA_SECTION(L1_CACHE_BYTES, PAGE_SIZE, THREAD_SIZE)
_edata = .;
-#ifdef CONFIG_HAVE_TCM
- ARM_TCM
-#endif
-
BSS_SECTION(0, 0, 0)
_end = .;
diff --git a/arch/arm/kernel/vmlinux.lds.h b/arch/arm/kernel/vmlinux.lds.h
index cf9dabbdbde4..71281e08e1d4 100644
--- a/arch/arm/kernel/vmlinux.lds.h
+++ b/arch/arm/kernel/vmlinux.lds.h
@@ -115,61 +115,21 @@
PROVIDE(vector_fiq_offset = vector_fiq - ADDR(.vectors));
#define ARM_TCM \
- /* \
- * We align everything to a page boundary so we can \
- * 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) \
- { \
+ __itcm_start = ALIGN(4); \
+ .text_itcm ITCM_OFFSET : AT(__itcm_start - LOAD_OFFSET) { \
__sitcm_text = .; \
*(.tcm.text) \
*(.tcm.rodata) \
. = ALIGN(4); \
__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 = .; \
- } \
- \
- /* \
- * TODO: add remainder of ITCM as well, \
- * that can be used for data! \
- */ \
- .data_dtcm DTCM_OFFSET : AT(__dtcm_start) \
- { \
- . = ALIGN(4); \
+ __dtcm_start = .; \
+ .data_dtcm DTCM_OFFSET : AT(__dtcm_start - LOAD_OFFSET) { \
__sdtcm_data = .; \
*(.tcm.data) \
. = ALIGN(4); \
__edtcm_data = .; \
} \
- \
- /* 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 = .; \
- }
+ . = __dtcm_start + SIZEOF(.data_dtcm);
diff --git a/arch/arm/mm/init.c b/arch/arm/mm/init.c
index bd6f4513539a..c186474422f3 100644
--- a/arch/arm/mm/init.c
+++ b/arch/arm/mm/init.c
@@ -758,20 +758,9 @@ void set_kernel_text_ro(void)
static inline void fix_kernmem_perms(void) { }
#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)
{
fix_kernmem_perms();
- free_tcmmem();
poison_init_mem(__init_begin, __init_end - __init_begin);
if (!machine_is_integrator() && !machine_is_cintegrator())