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);
 
 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())