diff --git a/arch/arm/kernel/vmlinux-xip.lds.S b/arch/arm/kernel/vmlinux-xip.lds.S index c727c56f3cb2593f8077132ee8a97c3cfd496499..d32f5d35f6022cbf13faa5097fb1a22d7bbde1ed 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 1e9f2a6b3d33ce0157d78a9d3689aee5d68ee7d7..b77dc675ae55cde4311d9e46f9ce049a646e6331 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 cf9dabbdbde40e67919a67b27e70d084d11b1b1d..71281e08e1d45520cfad80890bbe07c5f49af619 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 bd6f4513539a4659968a49c43a7340a2ba537884..c186474422f3fb25cb809a6d0bff48f476ef8595 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())