Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit b54290e5 authored by Nicolas Pitre's avatar Nicolas Pitre
Browse files

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
Loading
Loading
Loading
Loading
+4 −4
Original line number Diff line number Diff line
@@ -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 = .;

+4 −4
Original line number Diff line number Diff line
@@ -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 = .;

+6 −46
Original line number Diff line number Diff line
@@ -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);						\
	.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);
+0 −11
Original line number Diff line number Diff line
@@ -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())