[Sound-open-firmware] [PATCH v2] apl: core: enable boot loader path for Apollolake

Liam Girdwood liam.r.girdwood at linux.intel.com
Thu Jun 7 22:25:11 CEST 2018


From: Tomasz Lauda <tomasz.lauda at linux.intel.com>

This patch:
- Enables APL boot via SRAM,
- Disables L2 cache for APL,
- Reshapes linker scripts for APL and CNL.
- Adds support for using external xtensa headers for xt-xcc.

Signed-off-by: Tomasz Lauda <tomasz.lauda at linux.intel.com>
---
 Makefile.am                                   |  15 +-
 configure.ac                                  |  29 +-
 src/arch/xtensa/Makefile.am                   |  15 +-
 src/arch/xtensa/boot_entry.S                  |  49 +-
 src/arch/xtensa/boot_loader.c                 |  16 +-
 src/arch/xtensa/crt1-boards.S                 | 616 +++++++++---------
 src/arch/xtensa/reset-vector.S                |   8 +-
 src/arch/xtensa/xtos/crt1-boards.S            |   9 +-
 src/arch/xtensa/xtos/crt1-sim.S               |   5 +-
 src/arch/xtensa/xtos/crt1-tiny.S              |   6 +-
 src/include/sof/trace.h                       |   3 +
 src/platform/apollolake/Makefile.am           |  14 +-
 src/platform/apollolake/apollolake.x.in       | 133 ++--
 src/platform/apollolake/boot_ldr.x.in         | 236 +++++++
 src/platform/apollolake/boot_module.c         |  54 ++
 src/platform/apollolake/include/Makefile.am   |   2 +-
 .../apollolake/include/arch/Makefile.am       |   1 +
 .../include/{ => arch}/xtensa/Makefile.am     |   0
 .../{ => arch}/xtensa/config/Makefile.am      |   0
 .../{ => arch}/xtensa/config/core-isa.h       |  60 +-
 .../include/arch}/xtensa/config/core-matmap.h |   7 +
 .../include/arch}/xtensa/config/defs.h        |   8 +
 .../include/arch}/xtensa/config/specreg.h     |   8 +
 .../include/{ => arch}/xtensa/config/system.h |   7 +
 .../{ => arch}/xtensa/config/tie-asm.h        |   8 +
 .../include/arch}/xtensa/config/tie.h         |   8 +
 .../apollolake/include/platform/memory.h      | 116 ++--
 .../apollolake/include/platform/platcfg.h     |  38 ++
 .../apollolake/include/platform/platform.h    |   1 +
 .../apollolake/include/platform/shim.h        |  22 +-
 src/platform/baytrail/include/Makefile.am     |   2 +-
 .../baytrail/include/arch/Makefile.am         |   1 +
 .../include/{ => arch}/xtensa/Makefile.am     |   0
 .../{ => arch}/xtensa/config/Makefile.am      |   0
 .../{ => arch}/xtensa/config/core-isa-byt.h   |   0
 .../{ => arch}/xtensa/config/core-isa-cht.h   |   0
 .../{ => arch}/xtensa/config/core-isa.h       |   0
 .../{ => arch}/xtensa/config/core-matmap.h    |   0
 .../include/arch}/xtensa/config/defs.h        |   0
 .../{ => arch}/xtensa/config/specreg.h        |   0
 .../include/{ => arch}/xtensa/config/system.h |   0
 .../{ => arch}/xtensa/config/tie-asm.h        |   0
 .../include/{ => arch}/xtensa/config/tie.h    |   0
 src/platform/cannonlake/boot_ldr.x.in         | 224 +------
 src/platform/cannonlake/cannonlake.x.in       |  81 +--
 src/platform/cannonlake/include/Makefile.am   |   2 +-
 .../cannonlake/include/arch/Makefile.am       |   1 +
 .../include/{ => arch}/xtensa/Makefile.am     |   0
 .../{ => arch}/xtensa/config/Makefile.am      |   1 -
 .../xtensa/config/core-isa.h}                 |  58 +-
 .../include/arch}/xtensa/config/core-matmap.h |   7 +
 .../include/arch}/xtensa/config/defs.h        |   8 +
 .../include/arch}/xtensa/config/specreg.h     |   8 +
 .../include/{ => arch}/xtensa/config/system.h |   7 +
 .../{ => arch}/xtensa/config/tie-asm.h        |   8 +
 .../include/arch}/xtensa/config/tie.h         |   8 +
 .../cannonlake/include/platform/memory.h      |  32 +-
 .../cannonlake/include/platform/platcfg.h     |  36 +
 .../cannonlake/include/platform/platform.h    |   1 +
 .../cannonlake/include/platform/shim.h        |   6 +-
 .../include/xtensa/config/core-isa.h          | 557 ----------------
 src/platform/haswell/include/Makefile.am      |   2 +-
 src/platform/haswell/include/arch/Makefile.am |   1 +
 .../include/{ => arch}/xtensa/Makefile.am     |   0
 .../{ => arch}/xtensa/config/Makefile.am      |   0
 .../{ => arch}/xtensa/config/core-isa-bdw.h   |   0
 .../{ => arch}/xtensa/config/core-isa-hsw.h   |   0
 .../{ => arch}/xtensa/config/core-isa.h       |   0
 .../{ => arch}/xtensa/config/core-matmap.h    |   0
 .../include/arch}/xtensa/config/defs.h        |   0
 .../{ => arch}/xtensa/config/specreg.h        |   0
 .../include/{ => arch}/xtensa/config/system.h |   0
 .../{ => arch}/xtensa/config/tie-asm.h        |   0
 .../include/{ => arch}/xtensa/config/tie.h    |   0
 74 files changed, 1191 insertions(+), 1354 deletions(-)
 create mode 100644 src/platform/apollolake/boot_ldr.x.in
 create mode 100644 src/platform/apollolake/boot_module.c
 create mode 100644 src/platform/apollolake/include/arch/Makefile.am
 rename src/platform/apollolake/include/{ => arch}/xtensa/Makefile.am (100%)
 rename src/platform/apollolake/include/{ => arch}/xtensa/config/Makefile.am (100%)
 rename src/platform/apollolake/include/{ => arch}/xtensa/config/core-isa.h (95%)
 rename src/platform/{cannonlake/include => apollolake/include/arch}/xtensa/config/core-matmap.h (99%)
 rename src/platform/{cannonlake/include => apollolake/include/arch}/xtensa/config/defs.h (94%)
 rename src/platform/{cannonlake/include => apollolake/include/arch}/xtensa/config/specreg.h (96%)
 rename src/platform/apollolake/include/{ => arch}/xtensa/config/system.h (99%)
 rename src/platform/apollolake/include/{ => arch}/xtensa/config/tie-asm.h (99%)
 rename src/platform/{cannonlake/include => apollolake/include/arch}/xtensa/config/tie.h (98%)
 create mode 100644 src/platform/apollolake/include/platform/platcfg.h
 create mode 100644 src/platform/baytrail/include/arch/Makefile.am
 rename src/platform/baytrail/include/{ => arch}/xtensa/Makefile.am (100%)
 rename src/platform/baytrail/include/{ => arch}/xtensa/config/Makefile.am (100%)
 rename src/platform/baytrail/include/{ => arch}/xtensa/config/core-isa-byt.h (100%)
 rename src/platform/baytrail/include/{ => arch}/xtensa/config/core-isa-cht.h (100%)
 rename src/platform/baytrail/include/{ => arch}/xtensa/config/core-isa.h (100%)
 rename src/platform/baytrail/include/{ => arch}/xtensa/config/core-matmap.h (100%)
 rename src/platform/{apollolake/include => baytrail/include/arch}/xtensa/config/defs.h (100%)
 rename src/platform/baytrail/include/{ => arch}/xtensa/config/specreg.h (100%)
 rename src/platform/baytrail/include/{ => arch}/xtensa/config/system.h (100%)
 rename src/platform/baytrail/include/{ => arch}/xtensa/config/tie-asm.h (100%)
 rename src/platform/baytrail/include/{ => arch}/xtensa/config/tie.h (100%)
 create mode 100644 src/platform/cannonlake/include/arch/Makefile.am
 rename src/platform/cannonlake/include/{ => arch}/xtensa/Makefile.am (100%)
 rename src/platform/cannonlake/include/{ => arch}/xtensa/config/Makefile.am (84%)
 rename src/platform/cannonlake/include/{xtensa/config/core-isa-boot.h => arch/xtensa/config/core-isa.h} (95%)
 rename src/platform/{apollolake/include => cannonlake/include/arch}/xtensa/config/core-matmap.h (99%)
 rename src/platform/{haswell/include => cannonlake/include/arch}/xtensa/config/defs.h (94%)
 rename src/platform/{apollolake/include => cannonlake/include/arch}/xtensa/config/specreg.h (96%)
 rename src/platform/cannonlake/include/{ => arch}/xtensa/config/system.h (99%)
 rename src/platform/cannonlake/include/{ => arch}/xtensa/config/tie-asm.h (99%)
 rename src/platform/{apollolake/include => cannonlake/include/arch}/xtensa/config/tie.h (98%)
 create mode 100644 src/platform/cannonlake/include/platform/platcfg.h
 delete mode 100644 src/platform/cannonlake/include/xtensa/config/core-isa.h
 create mode 100644 src/platform/haswell/include/arch/Makefile.am
 rename src/platform/haswell/include/{ => arch}/xtensa/Makefile.am (100%)
 rename src/platform/haswell/include/{ => arch}/xtensa/config/Makefile.am (100%)
 rename src/platform/haswell/include/{ => arch}/xtensa/config/core-isa-bdw.h (100%)
 rename src/platform/haswell/include/{ => arch}/xtensa/config/core-isa-hsw.h (100%)
 rename src/platform/haswell/include/{ => arch}/xtensa/config/core-isa.h (100%)
 rename src/platform/haswell/include/{ => arch}/xtensa/config/core-matmap.h (100%)
 rename src/platform/{baytrail/include => haswell/include/arch}/xtensa/config/defs.h (100%)
 rename src/platform/haswell/include/{ => arch}/xtensa/config/specreg.h (100%)
 rename src/platform/haswell/include/{ => arch}/xtensa/config/system.h (100%)
 rename src/platform/haswell/include/{ => arch}/xtensa/config/tie-asm.h (100%)
 rename src/platform/haswell/include/{ => arch}/xtensa/config/tie.h (100%)

diff --git a/Makefile.am b/Makefile.am
index eeacb0b..d2c4956 100644
--- a/Makefile.am
+++ b/Makefile.am
@@ -30,8 +30,19 @@ export SOF_INCDIR = \
 export ARCH_INCDIR = \
 	-I $(SRC_DIR)/arch/$(ARCH)/include \
 	-I $(SRC_DIR)/arch/$(ARCH)/xtos
-export PLATFORM_INCDIR = \
-	-I $(SRC_DIR)/platform/$(PLATFORM)/include
+
+PLATFORM_INCDIR = -I $(SRC_DIR)/platform/$(PLATFORM)/include
+
+if XCC
+PLATFORM_INCDIR += \
+	-I $(ROOT_DIR)/arch/include
+else
+PLATFORM_INCDIR += \
+	-I $(SRC_DIR)/platform/$(PLATFORM)/include/arch
+endif
+
+export PLATFORM_INCDIR
+
 endif
 
 dist-hook:
diff --git a/configure.ac b/configure.ac
index 089218f..0f34acc 100644
--- a/configure.ac
+++ b/configure.ac
@@ -183,6 +183,7 @@ case "$with_platform" in
 	AC_SUBST(XTENSA_CORE)
 
 	AC_DEFINE([CONFIG_APOLLOLAKE], [1], [Configure for Apololake])
+	AC_DEFINE([CONFIG_BOOT_LOADER], [1], [Configure Boot Loader])
 	AC_DEFINE([CONFIG_IRQ_MAP], [1], [Configure IRQ maps])
 	AC_DEFINE([CONFIG_DMA_GW], [1], [Configure DMA Gateway])
     ;;
@@ -235,6 +236,7 @@ case "$with_platform" in
 	AC_SUBST(XTENSA_CORE)
 
 	AC_DEFINE([CONFIG_CANNONLAKE], [1], [Configure for Cannonlake])
+	AC_DEFINE([CONFIG_BOOT_LOADER], [1], [Configure Boot Loader])
 	AC_DEFINE([CONFIG_IRQ_MAP], [1], [Configure IRQ maps])
 	AC_DEFINE([CONFIG_DMA_GW], [1], [Configure DMA Gateway])
     ;;
@@ -256,7 +258,7 @@ AM_CONDITIONAL(BUILD_HASWELL,  test "$FW_NAME" = "hsw")
 AM_CONDITIONAL(BUILD_BROADWELL,  test "$FW_NAME" = "bdw")
 AM_CONDITIONAL(BUILD_APOLLOLAKE,  test "$FW_NAME" = "apl")
 AM_CONDITIONAL(BUILD_CANNONLAKE,  test "$FW_NAME" = "cnl")
-AM_CONDITIONAL(BUILD_BOOTLOADER,  test "$FW_NAME" = "cnl")
+AM_CONDITIONAL(BUILD_BOOTLOADER,  test "$FW_NAME" = "apl" -o "$FW_NAME" = "cnl")
 AM_CONDITIONAL(BUILD_MODULE,  test "$FW_NAME" = "apl" -o "$FW_NAME" = "cnl")
 AM_CONDITIONAL(BUILD_APL_SSP,  test "$FW_NAME" = "apl" -o "$FW_NAME" = "cnl")
 
@@ -370,6 +372,9 @@ if test "$have_graphviz" = "false"; then
 	AC_MSG_WARN([Need graphviz to build documentation])
 fi
 
+# Check for compiler type
+AM_CONDITIONAL(XCC, test "$CC" = "xt-xcc")
+
 AM_EXTRA_RECURSIVE_TARGETS([bin])
 
 AM_EXTRA_RECURSIVE_TARGETS([vminstall])
@@ -394,7 +399,7 @@ AC_CONFIG_FILES([
 	src/arch/host/include/Makefile
 	src/arch/host/include/arch/Makefile
 	src/audio/Makefile
-        src/math/Makefile
+	src/math/Makefile
 	src/drivers/Makefile
 	src/include/Makefile
 	src/include/sof/Makefile
@@ -412,24 +417,28 @@ AC_CONFIG_FILES([
 	src/platform/Makefile
 	src/platform/baytrail/Makefile
 	src/platform/baytrail/include/Makefile
+	src/platform/baytrail/include/arch/Makefile
+	src/platform/baytrail/include/arch/xtensa/Makefile
+	src/platform/baytrail/include/arch/xtensa/config/Makefile
 	src/platform/baytrail/include/platform/Makefile
-	src/platform/baytrail/include/xtensa/Makefile
-	src/platform/baytrail/include/xtensa/config/Makefile
 	src/platform/apollolake/Makefile
 	src/platform/apollolake/include/Makefile
+	src/platform/apollolake/include/arch/Makefile
+	src/platform/apollolake/include/arch/xtensa/Makefile
+	src/platform/apollolake/include/arch/xtensa/config/Makefile
 	src/platform/apollolake/include/platform/Makefile
-	src/platform/apollolake/include/xtensa/Makefile
-	src/platform/apollolake/include/xtensa/config/Makefile
 	src/platform/haswell/Makefile
 	src/platform/haswell/include/Makefile
+	src/platform/haswell/include/arch/Makefile
+	src/platform/haswell/include/arch/xtensa/Makefile
+	src/platform/haswell/include/arch/xtensa/config/Makefile
 	src/platform/haswell/include/platform/Makefile
-	src/platform/haswell/include/xtensa/Makefile
-	src/platform/haswell/include/xtensa/config/Makefile
 	src/platform/cannonlake/Makefile
 	src/platform/cannonlake/include/Makefile
+	src/platform/cannonlake/include/arch/Makefile
+	src/platform/cannonlake/include/arch/xtensa/Makefile
+	src/platform/cannonlake/include/arch/xtensa/config/Makefile
 	src/platform/cannonlake/include/platform/Makefile
-	src/platform/cannonlake/include/xtensa/Makefile
-	src/platform/cannonlake/include/xtensa/config/Makefile
 ])
 AC_OUTPUT
 
diff --git a/src/arch/xtensa/Makefile.am b/src/arch/xtensa/Makefile.am
index 309635c..4ffe15f 100644
--- a/src/arch/xtensa/Makefile.am
+++ b/src/arch/xtensa/Makefile.am
@@ -5,9 +5,16 @@ noinst_PROGRAMS = \
 
 # generate linker script from platform headers
 LINK_SCRIPT = ../../platform/$(PLATFORM)/$(PLATFORM_LDSCRIPT)
-LINK_DEPS = \
-	../../platform/$(PLATFORM)/include/platform/memory.h \
-	../../platform/$(PLATFORM)/include/xtensa/config/core-isa*
+
+LINK_DEPS = ../../platform/$(PLATFORM)/include/platform/memory.h
+
+if XCC
+LINK_DEPS += \
+	$(ROOT_DIR)/arch/include/xtensa/config/core-isa*
+else
+LINK_DEPS += \
+	../../platform/$(PLATFORM)/include/arch/xtensa/config/core-isa*
+endif
 
 nodist_sof_SOURCES = $(LINK_SCRIPT).in
 BUILT_SOURCES = $(LINK_SCRIPT)
@@ -35,7 +42,7 @@ sof_SOURCES = \
 	timer.c \
 	task.c
 
-if BUILD_CANNONLAKE
+if BUILD_BOOTLOADER
 sof_SOURCES += \
 	main-entry.S
 endif
diff --git a/src/arch/xtensa/boot_entry.S b/src/arch/xtensa/boot_entry.S
index cf793f5..72d0e5e 100644
--- a/src/arch/xtensa/boot_entry.S
+++ b/src/arch/xtensa/boot_entry.S
@@ -37,8 +37,9 @@
 
 #include <config.h>
 #include <platform/shim.h>
+#include <platform/platcfg.h>
 #include <xtensa/corebits.h>
-#include <xtensa/config/core-isa-boot.h>
+#include <xtensa/config/core-isa.h>
 
 	.type   boot_pri_core, @function
 	.type   boot_sec_core, @function
@@ -55,18 +56,62 @@ boot_entry:
 
 	.align 4
 	.literal_position
+#if defined(PLATFORM_RESET_MHE_AT_BOOT)
 l2_mecs:
 	.word SHIM_L2_MECS
+#endif
+
+#if defined(PLATFORM_DISABLE_L2CACHE_AT_BOOT)
+l2_cache_pref:
+	.word SHIM_L2_PREF_CFG
+#endif
+
+sof_stack_base:
+	.word SOF_STACK_BASE
+
+wnd0_base:
+	.word DMWBA(0)
+
+wnd0_size:
+	.word DMWLO(0)
+
+wnd0_base_val:
+	.word HP_SRAM_WIN0_BASE | DMWBA_READONLY | DMWBA_ENABLE
+
+wnd0_size_val:
+	.word HP_SRAM_WIN0_SIZE | 0x7
 
 boot_init:
 	.align 4
-#if defined(CONFIG_CANNONLAKE)
+#if defined(PLATFORM_DISABLE_L2CACHE_AT_BOOT)
+	l32r a3, l2_cache_pref
+	movi a5, 0
+	s32i a5, a3, 0
+	memw
+#endif
+
+#if defined(PLATFORM_RESET_MHE_AT_BOOT)
 	/* reset memory hole */
 	l32r a3, l2_mecs
 	movi a5, 0
 	s32i a5, a3, 0
 #endif
 
+	/* reprogram stack to the area defined by main FW */
+	l32r	a3, sof_stack_base
+	mov		sp, a3
+
+	/* realloc memory window0 to
+	continue reporting boot progress */
+	l32r	a3, wnd0_size
+	l32r	a5, wnd0_size_val
+	s32i	a5, a3, 0
+	memw
+	l32r	a3, wnd0_base
+	l32r	a5, wnd0_base_val
+	s32i	a5, a3, 0
+	memw
+
 #if (XCHAL_DCACHE_IS_COHERENT || XCHAL_LOOP_BUFFER_SIZE) && \
 	XCHAL_HW_MIN_VERSION >= XTENSA_HWVERSION_RE_2012_0
 	/*	Enable zero-overhead loop instr buffer,
diff --git a/src/arch/xtensa/boot_loader.c b/src/arch/xtensa/boot_loader.c
index ccf8525..4acc158 100644
--- a/src/arch/xtensa/boot_loader.c
+++ b/src/arch/xtensa/boot_loader.c
@@ -33,6 +33,7 @@
 #include <sof/trace.h>
 #include <sof/io.h>
 #include <uapi/manifest.h>
+#include <platform/platform.h>
 #include <platform/memory.h>
 
 /* entry point to main firmware */
@@ -41,7 +42,7 @@ extern void _ResetVector(void);
 void boot_pri_core(void);
 void boot_sec_core(void);
 
-#if defined(CONFIG_CANNONLAKE)
+#if defined(CONFIG_BOOT_LOADER)
 
 /* memcopy used by boot loader */
 static inline void bmemcpy(void *dest, void *src, size_t bytes)
@@ -77,6 +78,7 @@ static void parse_module(struct sof_man_fw_header *hdr,
 	/* each module has 3 segments */
 	for (i = 0; i < 3; i++) {
 
+		platform_trace_point(TRACE_BOOT_LDR_PARSE_SEGMENT + i);
 		switch (mod->segment[i].flags.r.type) {
 		case SOF_MAN_SEGMENT_TEXT:
 		case SOF_MAN_SEGMENT_DATA:
@@ -112,6 +114,7 @@ static void parse_manifest(void)
 	/* copy module to SRAM  - skip bootloader module */
 	for (i = 1; i < hdr->num_module_entries; i++) {
 
+		platform_trace_point(TRACE_BOOT_LDR_PARSE_MODULE + i);
 		mod = sof_man_get_module(desc, i);
 		parse_module(hdr, mod);
 	}
@@ -119,6 +122,7 @@ static void parse_manifest(void)
 #endif
 
 /* power on HPSRAM */
+#if defined(CONFIG_CANNONLAKE)
 static int32_t hp_sram_init(void)
 {
 	int delay_count = 256;
@@ -158,6 +162,14 @@ static int32_t hp_sram_init(void)
 
 	return 0;
 }
+#endif
+
+#if defined(CONFIG_APOLLOLAKE)
+static uint32_t hp_sram_init(void)
+{
+	return 0;
+}
+#endif
 
 /* boot secondary core - i.e core ID > 0 */
 void boot_sec_core(void)
@@ -185,7 +197,7 @@ void boot_pri_core(void)
 		return;
 	}
 
-#if defined(CONFIG_CANNONLAKE)
+#if defined(CONFIG_BOOT_LOADER)
 	/* parse manifest and copy modules */
 	platform_trace_point(TRACE_BOOT_LDR_MANIFEST);
 	parse_manifest();
diff --git a/src/arch/xtensa/crt1-boards.S b/src/arch/xtensa/crt1-boards.S
index ff24bfd..a66fe84 100644
--- a/src/arch/xtensa/crt1-boards.S
+++ b/src/arch/xtensa/crt1-boards.S
@@ -1,303 +1,313 @@
-// crt1-boards.S
-//
-// For most hardware / boards, this code sets up the C calling context
-// (setting up stack, PS, and clearing BSS) and jumps to __clibrary_start
-// which sets up the C library, calls constructors and registers destructors,
-// and calls main().
-//
-// Control arrives here at _start from the reset vector or from crt0-app.S.
-
-// Copyright (c) 1998-2010 Tensilica Inc.
-//
-// Permission is hereby granted, free of charge, to any person obtaining
-// a copy of this software and associated documentation files (the
-// "Software"), to deal in the Software without restriction, including
-// without limitation the rights to use, copy, modify, merge, publish,
-// distribute, sublicense, and/or sell copies of the Software, and to
-// permit persons to whom the Software is furnished to do so, subject to
-// the following conditions:
-//
-// The above copyright notice and this permission notice shall be included
-// in all copies or substantial portions of the Software.
-//
-// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
-// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
-// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
-// IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
-// CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
-// TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
-// SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-
-#include <xtensa/coreasm.h>
-// DF #include "xtos-internal.h"
-//#include <xtensa/../../src/xtos/xtos-internal.h>
-
-//.global	_ResetVector
-#if 0
-/*
- * Reset vector.
- * Only a trampoline to jump to _start
- * (Note that we have to mark the section writable as the section contains
- *  a relocatable literal)
- */
-
-	.section .ResetVector.text, "awx"
-	.global _ResetVector
-_ResetVector:
-
-	j	1f
-	.align 4
-2:	.long	_start
-1:	l32r	a2, 2b
-	jx	a2
-#endif
-
-// Exports
-.global _start
-
-// Imports
-//   __clibrary_init		from C library (eg. newlib or uclibc)
-//   exit			from C library
-//   main			from user application
-//   board_init			board-specific (uart/mingloss/tinygloss.c)
-//   xthal_dcache_all_writeback	from HAL library
-//   __stack			from linker script (see LSP Ref Manual)
-//   _bss_table_start		from linker script (see LSP Ref Manual)
-//   _bss_table_end		from linker script (see LSP Ref Manual)
-
-.type	main, @function
-
-// Macros to abstract away ABI differences
-
-#if __XTENSA_CALL0_ABI__
-# define CALL	call0
-# define ARG1	a2	/* 1st outgoing call argument */
-# define ARG2	a3	/* 2nd outgoing call argument */
-# define ARG3	a4	/* 3rd outgoing call argument */
-# define ARG4	a5	/* 4th outgoing call argument */
-# define ARG5	a6	/* 5th outgoing call argument */
-#else
-# define CALL	call4
-# define CALLX  callx4
-# define ARG1	a6	/* 1st outgoing call argument */
-# define ARG2	a7	/* 2nd outgoing call argument */
-# define ARG3	a8	/* 3rd outgoing call argument */
-# define ARG4	a9	/* 4th outgoing call argument */
-# define ARG5	a10	/* 5th outgoing call argument */
-#endif
-
-
-/**************************************************************************/
-
-	.text
-	.align 4
-	.literal_position
-_start:
-	//  _start is typically NOT at the beginning of the text segment --
-	//  it is always called from either the reset vector or other code
-	//  that does equivalent initialization (such as crt0-app.S).
-	//
-	//  Assumptions on entry to _start:
-	//	- low (level-one) and medium priority interrupts are disabled
-	//	  via PS.INTLEVEL and/or INTENABLE (PS.INTLEVEL is expected to
-	//	  be zeroed, to potentially enable them, before calling main)
-	//	- C calling context not initialized:
-	//	  - PS not initialized
-	//	  - SP not initialized
-	//	- the following are initialized:
-	//	  - LITBASE, cache attributes, WindowBase, WindowStart,
-	//	    CPENABLE, FP's FCR and FSR, EXCSAVE[n]
-
-	// Keep a0 zero.  It is used to initialize a few things.
-	// It is also the return address, where zero indicates
-	// that the frame used by _start is the bottommost frame.
-	//
-#if !XCHAL_HAVE_HALT || !XCHAL_HAVE_BOOTLOADER		// not needed for Xtensa TX
-	movi	a0, 0		// keep this register zero.
-#endif
-
-#if XTOS_RESET_UNNEEDED && !XCHAL_HAVE_HALT
-#include "reset-unneeded.S"
-#endif
-
-#if XCHAL_HAVE_BOOTLOADER
-	.weak	_Level2FromVector
-	.weak	_Level3FromVector
-	.weak	_Level4FromVector
-	.weak	_Level5FromVector
-
-	movi	a4, _Level2FromVector
-	wsr	a4, EXCSAVE+2
-	movi	a4, _Level3FromVector
-	wsr	a4, EXCSAVE+3
-	movi	a4, _Level4FromVector
-	wsr	a4, EXCSAVE+4
-	movi	a4, _Level5FromVector
-	wsr	a4, EXCSAVE+5
-#endif
-
-	// Initialize the stack pointer.
-	// See the "ABI and Software Conventions" chapter in the
-	// Xtensa ISA Reference manual for details.
-
-	// NOTE: Because the _start routine does not use any memory in its
-	// stack frame, and because all of its CALL instructions use a
-	// window size of 4 (or zero), the stack frame for _start can be empty.
-
-	movi	sp, __stack
-
-	/*
-	 *  Now that sp (a1) is set, we can set PS as per the application
-	 *  (user vector mode, enable interrupts, enable window exceptions if applicable).
-	 */
-#if XCHAL_HAVE_EXCEPTIONS
-# ifdef __XTENSA_CALL0_ABI__
-	movi	a3, PS_UM		// PS.WOE = 0, PS.UM = 1, PS.EXCM = 0, PS.INTLEVEL = 0
-# else  
-	movi	a3, PS_UM|PS_WOE	// PS.WOE = 1, PS.UM = 1, PS.EXCM = 0, PS.INTLEVEL = 0
-# endif
-	wsr	a3, PS
-	rsync
-#endif
-
-/*
-	 *  Do any initialization that affects the memory map, such as
-	 *  setting up TLB entries, that needs to be done before we can
-	 *  successfully clear BSS (e.g. if some BSS segments are in
-	 *  remapped areas).
-	 *
-	 *  NOTE:  This hook works where the reset vector does not unpack
-	 *  segments (see "ROM packing" in the LSP manual), or where
-	 *  unpacking of segments is not affected by memory remapping.
-	 *  If ROM unpacking is affected, TLB setup must be done in
-	 *  assembler from the reset vector.
-	 *
-	 *  The __memmap_init() routine can be a C function, however it
-	 *  does not have BSS initialized!  In particular, __memmap_init()
-	 *  cannot set BSS variables, i.e. uninitialized global variables
-	 *  (they'll be wiped out by the following BSS clear), nor can it
-	 *  assume they are yet initialized to zero.
-	 *
-	 *  The __memmap_init() function is optional.  It is marked as a
-	 *  weak symbol, so that it gets valued zero if not defined.
-	 */
-
-	.weak	__memmap_init
-	movi	a4, __memmap_init
-	beqz	a4, 1f
-	CALLX	a4
-1:
-
-#if !XCHAL_HAVE_BOOTLOADER	/* boot loader takes care of zeroing BSS */
-	/*
-	 *  Clear the BSS (uninitialized data) segments.
-	 *  This code supports multiple zeroed sections (*.bss).
-	 *
-	 *  Register allocation:
-	 *	a0 = 0
-	 *	a6 = pointer to start of table, and through table
-	 *	a7 = pointer to end of table
-	 *	a8 = start address of bytes to be zeroed
-	 *	a9 = end address of bytes to be zeroed
-	 *	a10 = length of bytes to be zeroed
-	 */
-	movi	a0, 0
-	movi 	a6, _bss_table_start
-	movi 	a7, _bss_table_end
-	bgeu  	a6, a7, .L3zte
-
-.L0zte:	l32i 	a8, a6, 0	// get start address, assumed multiple of 4
-	l32i 	a9, a6, 4	// get end address, assumed multiple of 4
-	addi   	a6, a6, 8	// next entry
-	sub	a10, a9, a8	// a10 = length, assumed a multiple of 4
-	bbci.l	a10, 2, .L1zte
-	s32i	a0, a8, 0	// clear 4 bytes to make length multiple of 8
-	addi	a8, a8, 4
-.L1zte:	bbci.l	a10, 3, .L2zte
-	s32i	a0, a8, 0	// clear 8 bytes to make length multiple of 16
-	s32i	a0, a8, 4
-	addi	a8, a8, 8
-.L2zte:	srli	a10, a10, 4	// length is now multiple of 16, divide by 16
-	floopnez	a10, clearzte
-	s32i	a0, a8,	 0	// clear 16 bytes at a time...
-	s32i	a0, a8,	 4
-	s32i	a0, a8,	 8
-	s32i	a0, a8, 12
-	addi	a8, a8, 16
-	floopend	a10, clearzte
-
-	bltu  	a6, a7, .L0zte	// loop until end of table of *.bss sections
-.L3zte:
-#endif
-
-
-	//  We can now call C code, the C calling environment has been initialized.
-	//
-	//  From this point on, we use ABI-specific macros to refer to registers a0 .. a15
-	//  (ARG#).
-
-
-#if XCHAL_HAVE_HALT
-	//  Assume minimalist environment for memory-constrained TX cores.
-	//  No C library or board initialization, no parameters passed to main
-	//  (assume declared as "void main(void)") and no call to exit().
-
-	CALL	main
-	halt
-
-#else /* !HALT */
-
-	.type	board_init, @function
-	.type	__clibrary_init, @function
-	.type	exit, @function
-
-
-	//  Initialize the board (eg. the UART on the XT2000).
-	//CALL	board_init
-
-	/* 
-	 *  Call __clibrary_init to initialize the C library:
-	 *
-	 *  void __clibrary_init(int argc, char ** argv, char ** environ, 
-	 *		void(*init_func)(void), void(*fini_func)(void));
-	 */	
-
-	//  Pass an empty argv array, with an empty string as the program name.
-#if 0
-	movi	ARG1, _start_argc	// argc address
-	movi	ARG2, _start_argv	// argv = ["", 0]
-	movi	ARG3, _start_envp	// envp = [0]
-//	movi 	ARG4, _init		// function that calls constructors
-//  	movi	ARG5, _fini		// function that calls destructors
-	l32i	ARG1, ARG1, 0		// argc = 1
-	CALL	__clibrary_init
-#endif
-	//  Call:   int main(int argc, char ** argv, char ** environ);
-	movi	ARG1, _start_argc	// argc address
-	movi	ARG2, _start_argv	// argv = ["", 0]
-	movi	ARG3, _start_envp	// envp = [0]
-	l32i	ARG1, ARG1, 0		// argc = 1
-	CALL	main
-	//  The return value is the same register as the first outgoing argument.
-//	CALL	exit			// exit with main's return value
-	// Does not return here.
-
-	.data
-	//  Mark argc/argv/envp parameters as weak so that an external
-	//  object file can override them.
-	.weak	_start_argc, _start_argv, _start_envp
-	.align	4
-_start_argv:
-	.word	_start_null	// empty program name
-_start_null:
-_start_envp:
-	.word	0		// end of argv array, empty string, empty environ
-_start_argc:
-	.word	1		// one argument (program name)
-	.text
-
-#endif /* !HALT */
-
-	.size	_start, . - _start
-
-//#endif 
+// crt1-boards.S
+//
+// For most hardware / boards, this code sets up the C calling context
+// (setting up stack, PS, and clearing BSS) and jumps to __clibrary_start
+// which sets up the C library, calls constructors and registers destructors,
+// and calls main().
+//
+// Control arrives here at _start from the reset vector or from crt0-app.S.
+
+// Copyright (c) 1998-2010 Tensilica Inc.
+//
+// Permission is hereby granted, free of charge, to any person obtaining
+// a copy of this software and associated documentation files (the
+// "Software"), to deal in the Software without restriction, including
+// without limitation the rights to use, copy, modify, merge, publish,
+// distribute, sublicense, and/or sell copies of the Software, and to
+// permit persons to whom the Software is furnished to do so, subject to
+// the following conditions:
+//
+// The above copyright notice and this permission notice shall be included
+// in all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+// IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
+// CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
+// TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
+// SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+#include <xtensa/coreasm.h>
+#include <config.h>
+// DF #include "xtos-internal.h"
+//#include <xtensa/../../src/xtos/xtos-internal.h>
+
+//.global	_ResetVector
+#if 0
+/*
+ * Reset vector.
+ * Only a trampoline to jump to _start
+ * (Note that we have to mark the section writable as the section contains
+ *  a relocatable literal)
+ */
+
+	.section .ResetVector.text, "awx"
+	.global _ResetVector
+_ResetVector:
+
+	j	1f
+	.align 4
+2:	.long	_start
+1:	l32r	a2, 2b
+	jx	a2
+#endif
+
+// Exports
+.global _start
+
+// Imports
+//   __clibrary_init		from C library (eg. newlib or uclibc)
+//   exit			from C library
+//   main			from user application
+//   board_init			board-specific (uart/mingloss/tinygloss.c)
+//   xthal_dcache_all_writeback	from HAL library
+//   __stack			from linker script (see LSP Ref Manual)
+//   _bss_table_start		from linker script (see LSP Ref Manual)
+//   _bss_table_end		from linker script (see LSP Ref Manual)
+
+.type	main, @function
+
+// Macros to abstract away ABI differences
+
+#if __XTENSA_CALL0_ABI__
+# define CALL	call0
+# define ARG1	a2	/* 1st outgoing call argument */
+# define ARG2	a3	/* 2nd outgoing call argument */
+# define ARG3	a4	/* 3rd outgoing call argument */
+# define ARG4	a5	/* 4th outgoing call argument */
+# define ARG5	a6	/* 5th outgoing call argument */
+#else
+# define CALL	call4
+# define CALLX  callx4
+# define ARG1	a6	/* 1st outgoing call argument */
+# define ARG2	a7	/* 2nd outgoing call argument */
+# define ARG3	a8	/* 3rd outgoing call argument */
+# define ARG4	a9	/* 4th outgoing call argument */
+# define ARG5	a10	/* 5th outgoing call argument */
+#endif
+
+
+/**************************************************************************/
+
+	.text
+	.align 4
+	.literal_position
+_start:
+	//  _start is typically NOT at the beginning of the text segment --
+	//  it is always called from either the reset vector or other code
+	//  that does equivalent initialization (such as crt0-app.S).
+	//
+	//  Assumptions on entry to _start:
+	//	- low (level-one) and medium priority interrupts are disabled
+	//	  via PS.INTLEVEL and/or INTENABLE (PS.INTLEVEL is expected to
+	//	  be zeroed, to potentially enable them, before calling main)
+	//	- C calling context not initialized:
+	//	  - PS not initialized
+	//	  - SP not initialized
+	//	- the following are initialized:
+	//	  - LITBASE, cache attributes, WindowBase, WindowStart,
+	//	    CPENABLE, FP's FCR and FSR, EXCSAVE[n]
+
+	// Keep a0 zero.  It is used to initialize a few things.
+	// It is also the return address, where zero indicates
+	// that the frame used by _start is the bottommost frame.
+	//
+
+// not needed for Xtensa TX
+#if !XCHAL_HAVE_HALT || !defined(CONFIG_BOOT_LOADER)
+	movi	a0, 0		// keep this register zero.
+#endif
+
+#if XTOS_RESET_UNNEEDED && !XCHAL_HAVE_HALT
+#include "reset-unneeded.S"
+#endif
+
+#if defined(CONFIG_BOOT_LOADER)
+	.weak	_Level2FromVector
+	.weak	_Level3FromVector
+	.weak	_Level4FromVector
+	.weak	_Level5FromVector
+
+	movi	a4, _Level2FromVector
+	wsr	a4, EXCSAVE+2
+	movi	a4, _Level3FromVector
+	wsr	a4, EXCSAVE+3
+	movi	a4, _Level4FromVector
+	wsr	a4, EXCSAVE+4
+	movi	a4, _Level5FromVector
+	wsr	a4, EXCSAVE+5
+#endif
+
+	// Initialize the stack pointer.
+	// See the "ABI and Software Conventions" chapter in the
+	// Xtensa ISA Reference manual for details.
+
+	// NOTE: Because the _start routine does not use any memory in its
+	// stack frame, and because all of its CALL instructions use a
+	// window size of 4 (or zero), the stack frame for _start can be empty.
+
+	movi	sp, __stack
+
+	/*
+	 *  Now that sp (a1) is set, we can set PS as per the application
+	 *  (user vector mode, enable interrupts,
+	 *  enable window exceptions if applicable).
+	 */
+#if XCHAL_HAVE_EXCEPTIONS
+# ifdef __XTENSA_CALL0_ABI__
+	// PS.WOE = 0, PS.UM = 1, PS.EXCM = 0, PS.INTLEVEL = 0
+	movi	a3, PS_UM
+# else
+	// PS.WOE = 1, PS.UM = 1, PS.EXCM = 0, PS.INTLEVEL = 0
+	movi	a3, PS_UM|PS_WOE
+# endif
+	wsr	a3, PS
+	rsync
+#endif
+
+/*
+	 *  Do any initialization that affects the memory map, such as
+	 *  setting up TLB entries, that needs to be done before we can
+	 *  successfully clear BSS (e.g. if some BSS segments are in
+	 *  remapped areas).
+	 *
+	 *  NOTE:  This hook works where the reset vector does not unpack
+	 *  segments (see "ROM packing" in the LSP manual), or where
+	 *  unpacking of segments is not affected by memory remapping.
+	 *  If ROM unpacking is affected, TLB setup must be done in
+	 *  assembler from the reset vector.
+	 *
+	 *  The __memmap_init() routine can be a C function, however it
+	 *  does not have BSS initialized!  In particular, __memmap_init()
+	 *  cannot set BSS variables, i.e. uninitialized global variables
+	 *  (they'll be wiped out by the following BSS clear), nor can it
+	 *  assume they are yet initialized to zero.
+	 *
+	 *  The __memmap_init() function is optional.  It is marked as a
+	 *  weak symbol, so that it gets valued zero if not defined.
+	 */
+
+	.weak	__memmap_init
+	movi	a4, __memmap_init
+	beqz	a4, 1f
+	CALLX	a4
+1:
+
+/* boot loader takes care of zeroing BSS */
+#if !defined(CONFIG_BOOT_LOADER)
+	/*
+	 *  Clear the BSS (uninitialized data) segments.
+	 *  This code supports multiple zeroed sections (*.bss).
+	 *
+	 *  Register allocation:
+	 *	a0 = 0
+	 *	a6 = pointer to start of table, and through table
+	 *	a7 = pointer to end of table
+	 *	a8 = start address of bytes to be zeroed
+	 *	a9 = end address of bytes to be zeroed
+	 *	a10 = length of bytes to be zeroed
+	 */
+	movi	a0, 0
+	movi 	a6, _bss_table_start
+	movi 	a7, _bss_table_end
+	bgeu  	a6, a7, .L3zte
+
+.L0zte:	l32i 	a8, a6, 0	// get start address, assumed multiple of 4
+	l32i 	a9, a6, 4	// get end address, assumed multiple of 4
+	addi   	a6, a6, 8	// next entry
+	sub	a10, a9, a8	// a10 = length, assumed a multiple of 4
+	bbci.l	a10, 2, .L1zte
+	s32i	a0, a8, 0	// clear 4 bytes to make length multiple of 8
+	addi	a8, a8, 4
+.L1zte:	bbci.l	a10, 3, .L2zte
+	s32i	a0, a8, 0	// clear 8 bytes to make length multiple of 16
+	s32i	a0, a8, 4
+	addi	a8, a8, 8
+.L2zte:	srli	a10, a10, 4	// length is now multiple of 16, divide by 16
+	floopnez	a10, clearzte
+	s32i	a0, a8,	 0	// clear 16 bytes at a time...
+	s32i	a0, a8,	 4
+	s32i	a0, a8,	 8
+	s32i	a0, a8, 12
+	addi	a8, a8, 16
+	floopend	a10, clearzte
+
+	bltu  	a6, a7, .L0zte	// loop until end of table of *.bss sections
+.L3zte:
+#endif
+
+
+	//  We can now call C code,
+	//  the C calling environment has been initialized.
+	//
+	//  From this point on, we use ABI-specific macros to refer
+	//  to registers a0 .. a15
+	//  (ARG#).
+
+
+#if XCHAL_HAVE_HALT
+	//  Assume minimalist environment for memory-constrained TX cores.
+	//  No C library or board initialization, no parameters passed to main
+	//  (assume declared as "void main(void)") and no call to exit().
+
+	CALL	main
+	halt
+
+#else /* !HALT */
+
+	.type	board_init, @function
+	.type	__clibrary_init, @function
+	.type	exit, @function
+
+
+	//  Initialize the board (eg. the UART on the XT2000).
+	//CALL	board_init
+
+	/*
+	 *  Call __clibrary_init to initialize the C library:
+	 *
+	 *  void __clibrary_init(int argc, char ** argv, char ** environ,
+	 *		void(*init_func)(void), void(*fini_func)(void));
+	 */
+
+	//  Pass an empty argv array, with an empty string as the program name.
+#if 0
+	movi	ARG1, _start_argc	// argc address
+	movi	ARG2, _start_argv	// argv = ["", 0]
+	movi	ARG3, _start_envp	// envp = [0]
+//	movi 	ARG4, _init		// function that calls constructors
+//  	movi	ARG5, _fini		// function that calls destructors
+	l32i	ARG1, ARG1, 0		// argc = 1
+	CALL	__clibrary_init
+#endif
+	//  Call:   int main(int argc, char ** argv, char ** environ);
+	movi	ARG1, _start_argc	// argc address
+	movi	ARG2, _start_argv	// argv = ["", 0]
+	movi	ARG3, _start_envp	// envp = [0]
+	l32i	ARG1, ARG1, 0		// argc = 1
+	CALL	main
+	//  The return value is the same register
+	//  as the first outgoing argument.
+//	CALL	exit			// exit with main's return value
+	// Does not return here.
+
+	.data
+	//  Mark argc/argv/envp parameters as weak so that an external
+	//  object file can override them.
+	.weak	_start_argc, _start_argv, _start_envp
+	.align	4
+_start_argv:
+	.word	_start_null	// empty program name
+_start_null:
+_start_envp:
+	.word	0	// end of argv array, empty string, empty environ
+_start_argc:
+	.word	1	// one argument (program name)
+	.text
+
+#endif /* !HALT */
+
+	.size	_start, . - _start
+
+//#endif
diff --git a/src/arch/xtensa/reset-vector.S b/src/arch/xtensa/reset-vector.S
index 397dbe2..099a578 100644
--- a/src/arch/xtensa/reset-vector.S
+++ b/src/arch/xtensa/reset-vector.S
@@ -35,7 +35,7 @@
 #include "xtos-internal.h"
 #include <config.h>
 
-#if XCHAL_HAVE_BOOTLOADER
+#if CONFIG_BOOT_LOADER
 #include <platform/memory.h>
 #endif
 
@@ -119,7 +119,7 @@ _reset_sram:
 #  endif
 # endif
 
-#if defined(CONFIG_APOLLOLAKE) || defined(CONFIG_CANNONLAKE)
+#if defined(CONFIG_BOOT_LOADER)
 	.section .ResetHandler.text, "ax"
 	j	_ResetHandler
 #endif
@@ -525,7 +525,7 @@ unpackdone:
 	 */
 #if HAVE_XSR
 
-#if !XCHAL_HAVE_BOOTLOADER
+#if !defined(CONFIG_BOOT_LOADER)
 /*  For asm macros; works for positive a,b smaller than 1000:  */
 # define GREATERTHAN(a,b)	(((b)-(a)) & ~0xFFF)
 
@@ -579,7 +579,7 @@ unpackdone:
 	 *  Note:  This needs to be call0 regardless of the selected ABI.
 	 */
 
-#if XCHAL_HAVE_BOOTLOADER
+#if CONFIG_BOOT_LOADER
 		/*ToDo refine the _start*/
 		movi a0, SOF_TEXT_START
 		callx0 a0
diff --git a/src/arch/xtensa/xtos/crt1-boards.S b/src/arch/xtensa/xtos/crt1-boards.S
index 7df5a4b..5704826 100644
--- a/src/arch/xtensa/xtos/crt1-boards.S
+++ b/src/arch/xtensa/xtos/crt1-boards.S
@@ -30,6 +30,7 @@
 
 #include <xtensa/coreasm.h>
 #include "xtos-internal.h"
+#include <config.h>
 
 
 // Exports
@@ -92,7 +93,9 @@ _start:
 	// It is also the return address, where zero indicates
 	// that the frame used by _start is the bottommost frame.
 	//
-#if !XCHAL_HAVE_HALT || !XCHAL_HAVE_BOOTLOADER		// not needed for Xtensa TX
+
+// not needed for Xtensa TX
+#if !XCHAL_HAVE_HALT || !defined(CONFIG_BOOT_LOADER)
 	movi	a0, 0		// keep this register zero.
 #endif
 
@@ -152,8 +155,8 @@ _start:
 	CALLX	a4
 1:
 
-
-#if !XCHAL_HAVE_BOOTLOADER	/* boot loader takes care of zeroing BSS */
+/* boot loader takes care of zeroing BSS */
+#if !defined(CONFIG_BOOT_LOADER)
 
 # ifdef __XTENSA_CALL0_ABI__
 	// Clear a0 again as possible CALLX to __memmap_init changed it.
diff --git a/src/arch/xtensa/xtos/crt1-sim.S b/src/arch/xtensa/xtos/crt1-sim.S
index 6d4a5f1..19f7f7d 100644
--- a/src/arch/xtensa/xtos/crt1-sim.S
+++ b/src/arch/xtensa/xtos/crt1-sim.S
@@ -28,6 +28,7 @@
 #include <xtensa/simcall.h>
 #include <xtensa/coreasm.h>
 #include "xtos-internal.h"
+#include <config.h>
 
 
 // Exports
@@ -184,7 +185,9 @@ _start:
 
 
 	/*  The new ISS simcall only appeared after RB-2007.2:  */
-#if !XCHAL_HAVE_BOOTLOADER && (XCHAL_HW_MAX_VERSION > XTENSA_HWVERSION_RB_2007_2)	/* pre-LX2 cores only */
+#if !defined(CONFIG_BOOT_LOADER) &&
+	/* pre-LX2 cores only */
+	(XCHAL_HW_MAX_VERSION > XTENSA_HWVERSION_RB_2007_2)
 	/*
 	 *  Clear the BSS (uninitialized data) segments.
 	 *  This code supports multiple zeroed sections (*.bss).
diff --git a/src/arch/xtensa/xtos/crt1-tiny.S b/src/arch/xtensa/xtos/crt1-tiny.S
index c798ad0..bc6360f 100644
--- a/src/arch/xtensa/xtos/crt1-tiny.S
+++ b/src/arch/xtensa/xtos/crt1-tiny.S
@@ -34,6 +34,7 @@
 #include <xtensa/coreasm.h>
 #include <xtensa/xtensa-versions.h>
 #include <xtensa/simcall.h>
+#include <config.h>
 
 
 // Imports
@@ -63,7 +64,8 @@ _start:
 	//  See crt1-boards.S for assumptions on entry to _start ,
 	//  and for comments on what is being done in this file.
 
-#if !XCHAL_HAVE_HALT || !XCHAL_HAVE_BOOTLOADER		// not needed for Xtensa TX
+// not needed for Xtensa TX
+#if !XCHAL_HAVE_HALT || !defined(CONFIG_BOOT_LOADER)
 	movi	a0, 0		// mark base of call stack
 #endif
 
@@ -85,7 +87,7 @@ _start:
 	// This code only supports .bss, not multiple *.bss sections.
 	// Corresponding code in crt1-boards.S does, and is faster but bigger.
 
-#if !XCHAL_HAVE_BOOTLOADER
+#if !defined(CONFIG_BOOT_LOADER)
 	movi	a6, _bss_start
 	movi	a7, _bss_end
 	bgeu	a6, a7, 2f
diff --git a/src/include/sof/trace.h b/src/include/sof/trace.h
index 2fd77fe..0e339b5 100644
--- a/src/include/sof/trace.h
+++ b/src/include/sof/trace.h
@@ -47,6 +47,9 @@
 #define TRACE_BOOT_LDR_MANIFEST	0x120
 #define TRACE_BOOT_LDR_JUMP		0x150
 
+#define TRACE_BOOT_LDR_PARSE_MODULE	0x210
+#define TRACE_BOOT_LDR_PARSE_SEGMENT	0x220
+
 /* general trace init codes - only used at boot when main trace is not available */
 #define TRACE_BOOT_START		0x1000
 #define TRACE_BOOT_ARCH		0x2000
diff --git a/src/platform/apollolake/Makefile.am b/src/platform/apollolake/Makefile.am
index fcf321e..417a13d 100644
--- a/src/platform/apollolake/Makefile.am
+++ b/src/platform/apollolake/Makefile.am
@@ -1,6 +1,8 @@
 SUBDIRS = include
 
-EXTRA_DIST = apollolake.x.in
+EXTRA_DIST = \
+	apollolake.x.in \
+	boot_ldr.x.in
 
 noinst_LIBRARIES = libplatform.a
 
@@ -19,7 +21,7 @@ libplatform_a_CFLAGS = \
 	$(SOF_INCDIR) \
 	$(PLATFORM_INCDIR)
 
-noinst_PROGRAMS = module
+noinst_PROGRAMS = module boot_module
 
 module_SOURCES = \
 	base_module.c
@@ -28,3 +30,11 @@ module_CFLAGS = \
 	$(ARCH_INCDIR) \
 	$(SOF_INCDIR) \
 	$(PLATFORM_INCDIR)
+
+boot_module_SOURCES = \
+	boot_module.c
+
+boot_module_CFLAGS = \
+	$(ARCH_INCDIR) \
+	$(SOF_INCDIR) \
+	$(PLATFORM_INCDIR)
diff --git a/src/platform/apollolake/apollolake.x.in b/src/platform/apollolake/apollolake.x.in
index 76fbeb7..5802cc5 100644
--- a/src/platform/apollolake/apollolake.x.in
+++ b/src/platform/apollolake/apollolake.x.in
@@ -14,12 +14,6 @@ OUTPUT_ARCH(xtensa)
 
 MEMORY
 {
-  vector_reset_text :
-        org = XCHAL_RESET_VECTOR0_PADDR,
-        len = SOF_MEM_RESET_TEXT_SIZE
-  vector_reset_lit :
-        org = XCHAL_RESET_VECTOR0_PADDR + SOF_MEM_RESET_TEXT_SIZE,
-        len = SOF_MEM_RESET_LIT_SIZE
   vector_memory_lit :
 	org = XCHAL_MEMERROR_VECTOR_PADDR + SOF_MEM_ERROR_LIT_SIZE,
         len = SOF_MEM_ERROR_LIT_SIZE
@@ -27,65 +21,62 @@ MEMORY
 	org = XCHAL_MEMERROR_VECTOR_PADDR,
         len = SOF_MEM_ERROR_TEXT_SIZE
   vector_base_text :
-	org = XCHAL_VECBASE_RESET_PADDR,
+	org = SOF_MEM_VECBASE,
         len = SOF_MEM_VECBASE_LIT_SIZE
   vector_int2_lit :
-	org = XCHAL_INTLEVEL2_VECTOR_PADDR - SOF_MEM_VECT_LIT_SIZE,
+        org = SOF_MEM_VECBASE + XCHAL_INTLEVEL2_VECOFS - SOF_MEM_VECT_LIT_SIZE,
         len = SOF_MEM_VECT_LIT_SIZE
   vector_int2_text :
-        org = XCHAL_INTLEVEL2_VECTOR_PADDR,
+        org = SOF_MEM_VECBASE + XCHAL_INTLEVEL2_VECOFS,
         len = SOF_MEM_VECT_TEXT_SIZE
   vector_int3_lit :
-	org = XCHAL_INTLEVEL3_VECTOR_PADDR - SOF_MEM_VECT_LIT_SIZE,
+        org = SOF_MEM_VECBASE + XCHAL_INTLEVEL3_VECOFS - SOF_MEM_VECT_LIT_SIZE,
         len = SOF_MEM_VECT_LIT_SIZE
   vector_int3_text :
-	org = XCHAL_INTLEVEL3_VECTOR_PADDR,
+        org = SOF_MEM_VECBASE + XCHAL_INTLEVEL3_VECOFS,
         len = SOF_MEM_VECT_TEXT_SIZE
   vector_int4_lit :
-	org = XCHAL_INTLEVEL4_VECTOR_PADDR - SOF_MEM_VECT_LIT_SIZE,
+        org = SOF_MEM_VECBASE + XCHAL_INTLEVEL4_VECOFS - SOF_MEM_VECT_LIT_SIZE,
         len = SOF_MEM_VECT_LIT_SIZE
   vector_int4_text :
-	org = XCHAL_INTLEVEL4_VECTOR_PADDR,
+        org = SOF_MEM_VECBASE + XCHAL_INTLEVEL4_VECOFS,
         len = SOF_MEM_VECT_TEXT_SIZE
   vector_int5_lit :
-	org = XCHAL_INTLEVEL5_VECTOR_PADDR - SOF_MEM_VECT_LIT_SIZE,
+        org = SOF_MEM_VECBASE + XCHAL_INTLEVEL5_VECOFS - SOF_MEM_VECT_LIT_SIZE,
         len = SOF_MEM_VECT_LIT_SIZE
   vector_int5_text :
-	org = XCHAL_INTLEVEL5_VECTOR_PADDR,
+        org = SOF_MEM_VECBASE + XCHAL_INTLEVEL5_VECOFS,
         len = SOF_MEM_VECT_TEXT_SIZE
   vector_int6_lit :
-	org = XCHAL_INTLEVEL6_VECTOR_PADDR - SOF_MEM_VECT_LIT_SIZE,
+        org = SOF_MEM_VECBASE + XCHAL_INTLEVEL6_VECOFS - SOF_MEM_VECT_LIT_SIZE,
         len = SOF_MEM_VECT_LIT_SIZE
   vector_int6_text :
-	org = XCHAL_INTLEVEL6_VECTOR_PADDR,
+        org = SOF_MEM_VECBASE + XCHAL_INTLEVEL6_VECOFS,
         len = SOF_MEM_VECT_TEXT_SIZE
   vector_int7_lit :
-	org = XCHAL_INTLEVEL7_VECTOR_PADDR - SOF_MEM_VECT_LIT_SIZE,
+        org = SOF_MEM_VECBASE + XCHAL_INTLEVEL7_VECOFS - SOF_MEM_VECT_LIT_SIZE,
         len = SOF_MEM_VECT_LIT_SIZE
   vector_int7_text :
-	org = XCHAL_INTLEVEL7_VECTOR_PADDR,
+        org = SOF_MEM_VECBASE + XCHAL_INTLEVEL7_VECOFS,
         len = SOF_MEM_VECT_TEXT_SIZE
   vector_kernel_lit :
-	org = XCHAL_KERNEL_VECTOR_PADDR - SOF_MEM_VECT_LIT_SIZE,
+        org = SOF_MEM_VECBASE + XCHAL_KERNEL_VECOFS - SOF_MEM_VECT_LIT_SIZE,
         len = SOF_MEM_VECT_LIT_SIZE
   vector_kernel_text :
-	org = XCHAL_KERNEL_VECTOR_PADDR,
+        org = SOF_MEM_VECBASE + XCHAL_KERNEL_VECOFS,
         len = SOF_MEM_VECT_TEXT_SIZE
   vector_user_lit :
-	org = XCHAL_USER_VECTOR_PADDR - SOF_MEM_VECT_LIT_SIZE,
+        org = SOF_MEM_VECBASE + XCHAL_USER_VECOFS - SOF_MEM_VECT_LIT_SIZE,
         len = SOF_MEM_VECT_LIT_SIZE
   vector_user_text :
-	org = XCHAL_USER_VECTOR_PADDR,
+        org = SOF_MEM_VECBASE + XCHAL_USER_VECOFS,
         len = SOF_MEM_VECT_TEXT_SIZE
   vector_double_lit :
-	org = XCHAL_DOUBLEEXC_VECTOR_PADDR - SOF_MEM_VECT_LIT_SIZE,
+        org = SOF_MEM_VECBASE + XCHAL_DOUBLEEXC_VECOFS - SOF_MEM_VECT_LIT_SIZE,
         len = SOF_MEM_VECT_LIT_SIZE
   vector_double_text :
-	org = XCHAL_DOUBLEEXC_VECTOR_PADDR,
+        org = SOF_MEM_VECBASE + XCHAL_DOUBLEEXC_VECOFS,
         len = SOF_MEM_VECT_TEXT_SIZE
-  sof_text_start :
-	org = SOF_TEXT_START,
-        len = SOF_TEXT_START_SIZE,
   sof_text :
 	org = SOF_TEXT_BASE,
         len = SOF_TEXT_SIZE,
@@ -107,6 +98,21 @@ MEMORY
   sof_stack :
         org = SOF_STACK_END,
         len = SOF_STACK_BASE - SOF_STACK_END
+  buffer_hp_heap :
+        org = HEAP_HP_BUFFER_BASE,
+        len = HEAP_HP_BUFFER_SIZE
+  wnd0 :
+        org = HP_SRAM_WIN0_BASE,
+        len = HP_SRAM_WIN0_SIZE
+  wnd1 :
+        org = HP_SRAM_WIN1_BASE,
+        len = HP_SRAM_WIN1_SIZE
+  wnd2 :
+        org = HP_SRAM_WIN2_BASE,
+        len = HP_SRAM_WIN2_SIZE
+  wnd3 :
+        org = HP_SRAM_WIN3_BASE,
+        len = HP_SRAM_WIN3_SIZE
 }
 
 PHDRS
@@ -134,7 +140,6 @@ PHDRS
   vector_user_text_phdr PT_LOAD;
   vector_double_lit_phdr PT_LOAD;
   vector_double_text_phdr PT_LOAD;
-  sof_text_start_phdr PT_LOAD;
   sof_text_phdr PT_LOAD;
   sof_data_phdr PT_LOAD;
   sof_bss_data_phdr PT_LOAD;
@@ -142,10 +147,15 @@ PHDRS
   runtime_heap_phdr PT_LOAD;
   buffer_heap_phdr PT_LOAD;
   sof_stack_phdr PT_LOAD;
+  buffer_hp_heap_phdr PT_LOAD;
+  wnd0_phdr PT_LOAD;
+  wnd1_phdr PT_LOAD;
+  wnd2_phdr PT_LOAD;
+  wnd3_phdr PT_LOAD;
 }
 
 /*  Default entry point:  */
-ENTRY(_ResetVector)
+ENTRY(_MainEntry)
 _rom_store_table = 0;
 
 /* ABI0 does not use Window base */
@@ -171,20 +181,6 @@ PROVIDE(_memmap_cacheattr_reset = _memmap_cacheattr_wbna_trapnull);
 
 SECTIONS
 {
-  .ResetVector.text : ALIGN(4)
-  {
-    _ResetVector_text_start = ABSOLUTE(.);
-    KEEP (*(.ResetVector.text))
-    _ResetVector_text_end = ABSOLUTE(.);
-  } >vector_reset_text :vector_reset_text_phdr
-
-  .ResetVector.literal : ALIGN(4)
-  {
-    _ResetVector_literal_start = ABSOLUTE(.);
-    *(.ResetVector.literal)
-    _ResetVector_literal_end = ABSOLUTE(.);
-  } >vector_reset_lit :vector_reset_lit_phdr
-
  .MemoryExceptionVector.literal : ALIGN(4)
   {
     _MemoryExceptionVector_literal_start = ABSOLUTE(.);
@@ -199,6 +195,46 @@ SECTIONS
     _MemoryExceptionVector_text_end = ABSOLUTE(.);
   } >vector_memory_text :vector_memory_text_phdr
 
+  .buffer_hp_heap (NOLOAD) : ALIGN(8)
+  {
+    . = ALIGN (32);
+    _buffer_hp_heap_start = ABSOLUTE(.);
+    . = . + HEAP_HP_BUFFER_SIZE;
+    _buffer_hp_heap_end = ABSOLUTE(.);
+  } >buffer_hp_heap :buffer_hp_heap_phdr
+
+  .wnd0 (NOLOAD) : ALIGN(8)
+  {
+    . = ALIGN (32);
+    _wnd0_start = ABSOLUTE(.);
+    . = . + HP_SRAM_WIN0_SIZE;
+    _wnd0_end = ABSOLUTE(.);
+  } >wnd0 :wnd0_phdr
+
+  .wnd1 (NOLOAD) : ALIGN(8)
+  {
+    . = ALIGN (32);
+    _wnd1_start = ABSOLUTE(.);
+    . = . + HP_SRAM_WIN1_SIZE;
+    _wnd1_end = ABSOLUTE(.);
+  } >wnd1 :wnd1_phdr
+
+  .wnd2 (NOLOAD) : ALIGN(8)
+  {
+    . = ALIGN (32);
+    _wnd2_start = ABSOLUTE(.);
+    . = . + HP_SRAM_WIN2_SIZE;
+    _wnd2_end = ABSOLUTE(.);
+  } >wnd2 :wnd2_phdr
+
+  .wnd3 (NOLOAD) : ALIGN(8)
+  {
+    . = ALIGN (32);
+    _wnd3_start = ABSOLUTE(.);
+    . = . + HP_SRAM_WIN3_SIZE;
+    _wnd3_end = ABSOLUTE(.);
+  } >wnd3 :wnd3_phdr
+
    .WindowVectors.text : ALIGN(4)
   {
     _WindowVectors_text_start = ABSOLUTE(.);
@@ -332,17 +368,11 @@ SECTIONS
     _DoubleExceptionVector_text_end = ABSOLUTE(.);
   } >vector_double_text :vector_double_text_phdr
 
-  .ResetHandler.text : ALIGN(4)
-  {
-    _ResetHandler_text_start = ABSOLUTE(.);
-    KEEP (*(.ResetHandler.text))
-    _ResetHandler_text_end = ABSOLUTE(.);
-  } >sof_text_start :sof_text_start_phdr
-
   .text : ALIGN(4)
   {
     _stext = .;
     _text_start = ABSOLUTE(.);
+    KEEP (*(.MainEntry.text))
     *(.entry.text)
     *(.init.literal)
     KEEP(*(.init))
@@ -539,4 +569,5 @@ SECTIONS
     . = . + SOF_STACK_SIZE;
     _sof_stack_end = ABSOLUTE(.);
   } >sof_stack :sof_stack_phdr
+
 }
diff --git a/src/platform/apollolake/boot_ldr.x.in b/src/platform/apollolake/boot_ldr.x.in
new file mode 100644
index 0000000..7465f9f
--- /dev/null
+++ b/src/platform/apollolake/boot_ldr.x.in
@@ -0,0 +1,236 @@
+/*
+ * Linker Script for Apollolake Bootloader.
+ *
+ * This script is run through the GNU C preprocessor to align the memory
+ * offsets with headers.
+ *
+ * Use spaces for formatting as cpp ignore tab sizes.
+ */
+
+#include <platform/memory.h>
+#include <xtensa/config/core-isa.h>
+
+OUTPUT_ARCH(xtensa)
+
+MEMORY
+{
+  boot_entry_text :
+        org = IMR_BOOT_LDR_TEXT_ENTRY_BASE,
+        len = IMR_BOOT_LDR_TEXT_ENTRY_SIZE
+  boot_entry_lit :
+        org = IMR_BOOT_LDR_LIT_BASE,
+        len = IMR_BOOT_LDR_LIT_SIZE
+  sof_text :
+        org = IMR_BOOT_LDR_TEXT_BASE,
+        len = IMR_BOOT_LDR_TEXT_SIZE,
+  sof_data :
+        org = IMR_BOOT_LDR_DATA_BASE,
+        len = IMR_BOOT_LDR_DATA_SIZE
+  sof_bss_data :
+	org = IMR_BOOT_LDR_BSS_BASE,
+        len = IMR_BOOT_LDR_BSS_SIZE
+  sof_stack :
+        org = SOF_STACK_END,
+        len = SOF_STACK_BASE - SOF_STACK_END
+  wnd0 :
+        org = HP_SRAM_WIN0_BASE,
+        len = HP_SRAM_WIN0_SIZE
+}
+
+PHDRS
+{
+  boot_entry_text_phdr PT_LOAD;
+  boot_entry_lit_phdr PT_LOAD;
+  sof_text_phdr PT_LOAD;
+  sof_data_phdr PT_LOAD;
+  sof_bss_data_phdr PT_LOAD;
+  sof_stack_phdr PT_LOAD;
+  wnd0_phdr PT_LOAD;
+}
+
+/*  Default entry point:  */
+ENTRY(boot_entry)
+EXTERN(reset_vector)
+
+SECTIONS
+{
+  .boot_entry.text : ALIGN(4)
+  {
+    _boot_entry_text_start = ABSOLUTE(.);
+    KEEP (*(.boot_entry.text))
+    _boot_entry_text_end = ABSOLUTE(.);
+  } >boot_entry_text :boot_entry_text_phdr
+
+  .boot_entry.literal : ALIGN(4)
+  {
+    _boot_entry_literal_start = ABSOLUTE(.);
+    *(.boot_entry.literal)
+    *(.literal .literal.* .stub .gnu.warning .gnu.linkonce.literal.* .gnu.linkonce.t.*.literal .gnu.linkonce.t.*)
+    _boot_entry_literal_end = ABSOLUTE(.);
+  } >boot_entry_lit :boot_entry_lit_phdr
+
+  .text : ALIGN(4)
+  {
+    _stext = .;
+    _text_start = ABSOLUTE(.);
+    *(.entry.text)
+    *(.init.literal)
+    KEEP(*(.init))
+    *( .text .text.*)
+    *(.fini.literal)
+    KEEP(*(.fini))
+    *(.gnu.version)
+    KEEP (*(.ResetVector.text))
+    KEEP (*(.ResetHandler.text))
+    _text_end = ABSOLUTE(.);
+    _etext = .;
+  } >sof_text :sof_text_phdr
+
+  .rodata : ALIGN(4)
+  {
+    _rodata_start = ABSOLUTE(.);
+    *(.rodata)
+    *(.rodata.*)
+    *(.gnu.linkonce.r.*)
+    *(.rodata1)
+    __XT_EXCEPTION_TABLE__ = ABSOLUTE(.);
+    KEEP (*(.xt_except_table))
+    KEEP (*(.gcc_except_table))
+    *(.gnu.linkonce.e.*)
+    *(.gnu.version_r)
+    KEEP (*(.eh_frame))
+    /*  C++ constructor and destructor tables, properly ordered:  */
+    KEEP (*crtbegin.o(.ctors))
+    KEEP (*(EXCLUDE_FILE (*crtend.o) .ctors))
+    KEEP (*(SORT(.ctors.*)))
+    KEEP (*(.ctors))
+    KEEP (*crtbegin.o(.dtors))
+    KEEP (*(EXCLUDE_FILE (*crtend.o) .dtors))
+    KEEP (*(SORT(.dtors.*)))
+    KEEP (*(.dtors))
+    /*  C++ exception handlers table:  */
+    __XT_EXCEPTION_DESCS__ = ABSOLUTE(.);
+    *(.xt_except_desc)
+    *(.gnu.linkonce.h.*)
+    __XT_EXCEPTION_DESCS_END__ = ABSOLUTE(.);
+    *(.xt_except_desc_end)
+    *(.dynamic)
+    *(.gnu.version_d)
+    . = ALIGN(4);		/* this table MUST be 4-byte aligned */
+    _bss_table_start = ABSOLUTE(.);
+    LONG(_bss_start)
+    LONG(_bss_end)
+    _bss_table_end = ABSOLUTE(.);
+    _rodata_end = ABSOLUTE(.);
+  } >sof_data :sof_data_phdr
+
+  .data : ALIGN(4)
+  {
+    _data_start = ABSOLUTE(.);
+    *(.data)
+    *(.data.*)
+    *(.gnu.linkonce.d.*)
+    KEEP(*(.gnu.linkonce.d.*personality*))
+    *(.data1)
+    *(.sdata)
+    *(.sdata.*)
+    *(.gnu.linkonce.s.*)
+    *(.sdata2)
+    *(.sdata2.*)
+    *(.gnu.linkonce.s2.*)
+    KEEP(*(.jcr))
+    _data_end = ABSOLUTE(.);
+  } >sof_data :sof_data_phdr
+
+  .lit4 : ALIGN(4)
+  {
+    _lit4_start = ABSOLUTE(.);
+    *(*.lit4)
+    *(.lit4.*)
+    *(.gnu.linkonce.lit4.*)
+    _lit4_end = ABSOLUTE(.);
+  } >sof_data :sof_data_phdr
+
+  .bss (NOLOAD) : ALIGN(8)
+  {
+    . = ALIGN (8);
+    _bss_start = ABSOLUTE(.);
+    *(.dynsbss)
+    *(.sbss)
+    *(.sbss.*)
+    *(.gnu.linkonce.sb.*)
+    *(.scommon)
+    *(.sbss2)
+    *(.sbss2.*)
+    *(.gnu.linkonce.sb2.*)
+    *(.dynbss)
+    *(.bss)
+    *(.bss.*)
+    *(.gnu.linkonce.b.*)
+    *(COMMON)
+    . = ALIGN (8);
+    _bss_end = ABSOLUTE(.);
+  } >sof_bss_data :sof_bss_data_phdr
+
+ _man = 0x1234567;
+
+  PROVIDE(_memmap_vecbase_reset = HP_SRAM_VECBASE_RESET);
+
+  _memmap_cacheattr_wbna_trapnull = 0xFF42FFF2;
+  PROVIDE(_memmap_cacheattr_reset = _memmap_cacheattr_wbna_trapnull);
+
+  __stack = SOF_STACK_BASE;
+  __wnd0 = HP_SRAM_WIN0_BASE;
+  __wnd0_size = HP_SRAM_WIN0_SIZE;
+
+  .debug  0 :  { *(.debug) }
+  .line  0 :  { *(.line) }
+  .debug_srcinfo  0 :  { *(.debug_srcinfo) }
+  .debug_sfnames  0 :  { *(.debug_sfnames) }
+  .debug_aranges  0 :  { *(.debug_aranges) }
+  .debug_pubnames  0 :  { *(.debug_pubnames) }
+  .debug_info  0 :  { *(.debug_info) }
+  .debug_abbrev  0 :  { *(.debug_abbrev) }
+  .debug_line  0 :  { *(.debug_line) }
+  .debug_frame  0 :  { *(.debug_frame) }
+  .debug_str  0 :  { *(.debug_str) }
+  .debug_loc  0 :  { *(.debug_loc) }
+  .debug_macinfo  0 :  { *(.debug_macinfo) }
+  .debug_weaknames  0 :  { *(.debug_weaknames) }
+  .debug_funcnames  0 :  { *(.debug_funcnames) }
+  .debug_typenames  0 :  { *(.debug_typenames) }
+  .debug_varnames  0 :  { *(.debug_varnames) }
+
+  .xt.insn 0 :
+  {
+    KEEP (*(.xt.insn))
+    KEEP (*(.gnu.linkonce.x.*))
+  }
+  .xt.prop 0 :
+  {
+    KEEP (*(.xt.prop))
+    KEEP (*(.xt.prop.*))
+    KEEP (*(.gnu.linkonce.prop.*))
+  }
+  .xt.lit 0 :
+  {
+    KEEP (*(.xt.lit))
+    KEEP (*(.xt.lit.*))
+    KEEP (*(.gnu.linkonce.p.*))
+  }
+  .xt.profile_range 0 :
+  {
+    KEEP (*(.xt.profile_range))
+    KEEP (*(.gnu.linkonce.profile_range.*))
+  }
+  .xt.profile_ranges 0 :
+  {
+    KEEP (*(.xt.profile_ranges))
+    KEEP (*(.gnu.linkonce.xt.profile_ranges.*))
+  }
+  .xt.profile_files 0 :
+  {
+    KEEP (*(.xt.profile_files))
+    KEEP (*(.gnu.linkonce.xt.profile_files.*))
+  }
+}
diff --git a/src/platform/apollolake/boot_module.c b/src/platform/apollolake/boot_module.c
new file mode 100644
index 0000000..a4dfe1e
--- /dev/null
+++ b/src/platform/apollolake/boot_module.c
@@ -0,0 +1,54 @@
+/*
+ * Copyright (c) 2018, Intel Corporation
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *   * Redistributions of source code must retain the above copyright
+ *     notice, this list of conditions and the following disclaimer.
+ *   * Redistributions in binary form must reproduce the above copyright
+ *     notice, this list of conditions and the following disclaimer in the
+ *     documentation and/or other materials provided with the distribution.
+ *   * Neither the name of the Intel Corporation nor the
+ *     names of its contributors may be used to endorse or promote products
+ *     derived from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ *
+ * Author: Marcin Maka <marcin.maka at linux.intel.com>
+ */
+
+#include <uapi/manifest.h>
+#include <platform/memory.h>
+
+/*
+ * Each module has an entry in the FW manifest header. This is NOT part of
+ * the SOF executable image but is inserted by object copy as a ELF section
+ * for parsing by rimage (to generate the manifest).
+ */
+struct sof_man_module_manifest apl_bootldr_manifest = {
+	.module = {
+		.name = "BRNGUP",
+		.uuid = {0xcc, 0x48, 0x7b, 0x0d, 0xa9, 0x1e, 0x0a, 0x47,
+				0xa8, 0xc1, 0x53, 0x34, 0x24, 0x52, 0x8a, 0x17},
+		.entry_point = IMR_BOOT_LDR_TEXT_ENTRY_BASE,
+		.type = {
+				.load_type = SOF_MAN_MOD_TYPE_MODULE,
+				.domain_ll = 1,
+		},
+		.affinity_mask = 3,
+	},
+};
+
+/* not used, but stops linker complaining */
+int _start;
diff --git a/src/platform/apollolake/include/Makefile.am b/src/platform/apollolake/include/Makefile.am
index 19f40eb..c5113a4 100644
--- a/src/platform/apollolake/include/Makefile.am
+++ b/src/platform/apollolake/include/Makefile.am
@@ -1 +1 @@
-SUBDIRS = platform xtensa
+SUBDIRS = arch platform
diff --git a/src/platform/apollolake/include/arch/Makefile.am b/src/platform/apollolake/include/arch/Makefile.am
new file mode 100644
index 0000000..63616bf
--- /dev/null
+++ b/src/platform/apollolake/include/arch/Makefile.am
@@ -0,0 +1 @@
+SUBDIRS = xtensa
diff --git a/src/platform/apollolake/include/xtensa/Makefile.am b/src/platform/apollolake/include/arch/xtensa/Makefile.am
similarity index 100%
rename from src/platform/apollolake/include/xtensa/Makefile.am
rename to src/platform/apollolake/include/arch/xtensa/Makefile.am
diff --git a/src/platform/apollolake/include/xtensa/config/Makefile.am b/src/platform/apollolake/include/arch/xtensa/config/Makefile.am
similarity index 100%
rename from src/platform/apollolake/include/xtensa/config/Makefile.am
rename to src/platform/apollolake/include/arch/xtensa/config/Makefile.am
diff --git a/src/platform/apollolake/include/xtensa/config/core-isa.h b/src/platform/apollolake/include/arch/xtensa/config/core-isa.h
similarity index 95%
rename from src/platform/apollolake/include/xtensa/config/core-isa.h
rename to src/platform/apollolake/include/arch/xtensa/config/core-isa.h
index 5768437..eedbd1c 100644
--- a/src/platform/apollolake/include/xtensa/config/core-isa.h
+++ b/src/platform/apollolake/include/arch/xtensa/config/core-isa.h
@@ -28,6 +28,8 @@
    TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
    SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.  */
 
+#if !defined __XCC__
+
 #ifndef _XTENSA_CORE_CONFIGURATION_H
 #define _XTENSA_CORE_CONFIGURATION_H
 
@@ -488,8 +490,8 @@
 #define XCHAL_HAVE_MEM_ECC_PARITY	1	/* local memory ECC/parity */
 #define XCHAL_HAVE_VECTOR_SELECT	1	/* relocatable vectors */
 #define XCHAL_HAVE_VECBASE		1	/* relocatable vectors */
-#define XCHAL_VECBASE_RESET_VADDR	0xa000a400  /* VECBASE reset value */
-#define XCHAL_VECBASE_RESET_PADDR	0xa000a400
+#define XCHAL_VECBASE_RESET_VADDR	0xBEFE0800  /* VECBASE reset value */
+#define XCHAL_VECBASE_RESET_PADDR	0xBEFE0800
 #define XCHAL_RESET_VECBASE_OVERLAP	0
 
 #define XCHAL_RESET_VECTOR0_VADDR	0xBEFE0000
@@ -498,50 +500,50 @@
 #define XCHAL_RESET_VECTOR1_PADDR	0xBE800000
 #define XCHAL_RESET_VECTOR_VADDR	0xBEFE0000
 #define XCHAL_RESET_VECTOR_PADDR	0xBEFE0000
-#define XCHAL_MEMERROR_VECTOR0_VADDR	0xbefe0270
-#define XCHAL_MEMERROR_VECTOR0_PADDR	0xbefe0270
+#define XCHAL_MEMERROR_VECTOR0_VADDR	0xBEFE0400
+#define XCHAL_MEMERROR_VECTOR0_PADDR	0xBEFE0400
 #define XCHAL_MEMERROR_VECTOR1_VADDR	0xBE800400
 #define XCHAL_MEMERROR_VECTOR1_PADDR	0xBE800400
-#define XCHAL_MEMERROR_VECTOR_VADDR	0xbefe0270
-#define XCHAL_MEMERROR_VECTOR_PADDR	0xbefe0270
+#define XCHAL_MEMERROR_VECTOR_VADDR	0xBEFE0400
+#define XCHAL_MEMERROR_VECTOR_PADDR	0xBEFE0400
 #define XCHAL_USER_VECOFS		0x00000340
-#define XCHAL_USER_VECTOR_VADDR		0xa000a740
-#define XCHAL_USER_VECTOR_PADDR		0xa000a740
+#define XCHAL_USER_VECTOR_VADDR		0xBEFE0B40
+#define XCHAL_USER_VECTOR_PADDR		0xBEFE0B40
 #define XCHAL_KERNEL_VECOFS		0x00000300
-#define XCHAL_KERNEL_VECTOR_VADDR	0xa000a700
-#define XCHAL_KERNEL_VECTOR_PADDR	0xa000a700
+#define XCHAL_KERNEL_VECTOR_VADDR	0xBEFE0B00
+#define XCHAL_KERNEL_VECTOR_PADDR	0xBEFE0B00
 #define XCHAL_DOUBLEEXC_VECOFS		0x000003C0
-#define XCHAL_DOUBLEEXC_VECTOR_VADDR	0xa000a7c0
-#define XCHAL_DOUBLEEXC_VECTOR_PADDR	0xa000a7c0
+#define XCHAL_DOUBLEEXC_VECTOR_VADDR	0xBEFE0BC0
+#define XCHAL_DOUBLEEXC_VECTOR_PADDR	0xBEFE0BC0
 #define XCHAL_WINDOW_OF4_VECOFS		0x00000000
 #define XCHAL_WINDOW_UF4_VECOFS		0x00000040
 #define XCHAL_WINDOW_OF8_VECOFS		0x00000080
 #define XCHAL_WINDOW_UF8_VECOFS		0x000000C0
 #define XCHAL_WINDOW_OF12_VECOFS	0x00000100
 #define XCHAL_WINDOW_UF12_VECOFS	0x00000140
-#define XCHAL_WINDOW_VECTORS_VADDR	0xa000a400
-#define XCHAL_WINDOW_VECTORS_PADDR	0xa000a400
+#define XCHAL_WINDOW_VECTORS_VADDR	0xBEFE0800
+#define XCHAL_WINDOW_VECTORS_PADDR	0xBEFE0800
 #define XCHAL_INTLEVEL2_VECOFS		0x00000180
-#define XCHAL_INTLEVEL2_VECTOR_VADDR	0xa000a580
-#define XCHAL_INTLEVEL2_VECTOR_PADDR	0xa000a580
+#define XCHAL_INTLEVEL2_VECTOR_VADDR	0xBEFE0980
+#define XCHAL_INTLEVEL2_VECTOR_PADDR	0xBEFE0980
 #define XCHAL_INTLEVEL3_VECOFS		0x000001C0
-#define XCHAL_INTLEVEL3_VECTOR_VADDR	0xa000a5c0
-#define XCHAL_INTLEVEL3_VECTOR_PADDR	0xa000a5c0
+#define XCHAL_INTLEVEL3_VECTOR_VADDR	0xBEFE09C0
+#define XCHAL_INTLEVEL3_VECTOR_PADDR	0xBEFE09C0
 #define XCHAL_INTLEVEL4_VECOFS		0x00000200
-#define XCHAL_INTLEVEL4_VECTOR_VADDR	0xa000a600
-#define XCHAL_INTLEVEL4_VECTOR_PADDR	0xa000a600
+#define XCHAL_INTLEVEL4_VECTOR_VADDR	0xBEFE0A00
+#define XCHAL_INTLEVEL4_VECTOR_PADDR	0xBEFE0A00
 #define XCHAL_INTLEVEL5_VECOFS		0x00000240
-#define XCHAL_INTLEVEL5_VECTOR_VADDR	0xa000a640
-#define XCHAL_INTLEVEL5_VECTOR_PADDR	0xa000a640
+#define XCHAL_INTLEVEL5_VECTOR_VADDR	0xBEFE0A40
+#define XCHAL_INTLEVEL5_VECTOR_PADDR	0xBEFE0A40
 #define XCHAL_INTLEVEL6_VECOFS		0x00000280
-#define XCHAL_INTLEVEL6_VECTOR_VADDR	0xa000a680
-#define XCHAL_INTLEVEL6_VECTOR_PADDR	0xa000a680
+#define XCHAL_INTLEVEL6_VECTOR_VADDR	0xBEFE0A80
+#define XCHAL_INTLEVEL6_VECTOR_PADDR	0xBEFE0A80
 #define XCHAL_DEBUG_VECOFS		XCHAL_INTLEVEL6_VECOFS
 #define XCHAL_DEBUG_VECTOR_VADDR	XCHAL_INTLEVEL6_VECTOR_VADDR
 #define XCHAL_DEBUG_VECTOR_PADDR	XCHAL_INTLEVEL6_VECTOR_PADDR
 #define XCHAL_NMI_VECOFS		0x000002C0
-#define XCHAL_NMI_VECTOR_VADDR		0xa000a6c0
-#define XCHAL_NMI_VECTOR_PADDR		0xa000a6c0
+#define XCHAL_NMI_VECTOR_VADDR		0xBEFE0AC0
+#define XCHAL_NMI_VECTOR_PADDR		0xBEFE0AC0
 #define XCHAL_INTLEVEL7_VECOFS		XCHAL_NMI_VECOFS
 #define XCHAL_INTLEVEL7_VECTOR_VADDR	XCHAL_NMI_VECTOR_VADDR
 #define XCHAL_INTLEVEL7_VECTOR_PADDR	XCHAL_NMI_VECTOR_PADDR
@@ -600,3 +602,9 @@
 
 
 #endif /* _XTENSA_CORE_CONFIGURATION_H */
+
+#else
+
+#error "xcc should not use this header"
+
+#endif /* __XCC__ */
diff --git a/src/platform/cannonlake/include/xtensa/config/core-matmap.h b/src/platform/apollolake/include/arch/xtensa/config/core-matmap.h
similarity index 99%
rename from src/platform/cannonlake/include/xtensa/config/core-matmap.h
rename to src/platform/apollolake/include/arch/xtensa/config/core-matmap.h
index c4f479a..ad0f0d7 100644
--- a/src/platform/cannonlake/include/xtensa/config/core-matmap.h
+++ b/src/platform/apollolake/include/arch/xtensa/config/core-matmap.h
@@ -43,6 +43,7 @@
    TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
    SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.  */
 
+#if !defined __XCC__
 
 #ifndef XTENSA_CONFIG_CORE_MATMAP_H
 #define XTENSA_CONFIG_CORE_MATMAP_H
@@ -311,3 +312,9 @@
 
 
 #endif /*XTENSA_CONFIG_CORE_MATMAP_H*/
+
+#else
+
+#error "xcc should not use this header"
+
+#endif /* __XCC__ */
diff --git a/src/platform/cannonlake/include/xtensa/config/defs.h b/src/platform/apollolake/include/arch/xtensa/config/defs.h
similarity index 94%
rename from src/platform/cannonlake/include/xtensa/config/defs.h
rename to src/platform/apollolake/include/arch/xtensa/config/defs.h
index b695e59..c2ef1d9 100644
--- a/src/platform/cannonlake/include/xtensa/config/defs.h
+++ b/src/platform/apollolake/include/arch/xtensa/config/defs.h
@@ -25,6 +25,8 @@
    and earlier Xtensa releases.  It includes only a subset of the
    available header files.  */
 
+#if !defined __XCC__
+
 #ifndef _XTENSA_BASE_HEADER
 #define _XTENSA_BASE_HEADER
 
@@ -36,3 +38,9 @@
 
 #endif /* __XTENSA__ */
 #endif /* !_XTENSA_BASE_HEADER */
+
+#else
+
+#error "xcc should not use this header"
+
+#endif /* __XCC__ */
diff --git a/src/platform/cannonlake/include/xtensa/config/specreg.h b/src/platform/apollolake/include/arch/xtensa/config/specreg.h
similarity index 96%
rename from src/platform/cannonlake/include/xtensa/config/specreg.h
rename to src/platform/apollolake/include/arch/xtensa/config/specreg.h
index 96bfa94..c99cda6 100644
--- a/src/platform/cannonlake/include/xtensa/config/specreg.h
+++ b/src/platform/apollolake/include/arch/xtensa/config/specreg.h
@@ -25,6 +25,8 @@
    TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
    SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.  */
 
+#if !defined __XCC__
+
 #ifndef XTENSA_SPECREG_H
 #define XTENSA_SPECREG_H
 
@@ -104,3 +106,9 @@
 #define INTCLEAR	227
 
 #endif /* XTENSA_SPECREG_H */
+
+#else
+
+#error "xcc should not use this header"
+
+#endif /* __XCC__ */
diff --git a/src/platform/apollolake/include/xtensa/config/system.h b/src/platform/apollolake/include/arch/xtensa/config/system.h
similarity index 99%
rename from src/platform/apollolake/include/xtensa/config/system.h
rename to src/platform/apollolake/include/arch/xtensa/config/system.h
index aad1d8c..f1fd8a0 100644
--- a/src/platform/apollolake/include/xtensa/config/system.h
+++ b/src/platform/apollolake/include/arch/xtensa/config/system.h
@@ -31,6 +31,7 @@
    TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
    SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.  */
 
+#if !defined __XCC__
 
 #ifndef XTENSA_CONFIG_SYSTEM_H
 #define XTENSA_CONFIG_SYSTEM_H
@@ -269,3 +270,9 @@
 
 
 #endif /*XTENSA_CONFIG_SYSTEM_H*/
+
+#else
+
+#error "xcc should not use this header"
+
+#endif /* __XCC__ */
diff --git a/src/platform/apollolake/include/xtensa/config/tie-asm.h b/src/platform/apollolake/include/arch/xtensa/config/tie-asm.h
similarity index 99%
rename from src/platform/apollolake/include/xtensa/config/tie-asm.h
rename to src/platform/apollolake/include/arch/xtensa/config/tie-asm.h
index 15f6e89..706545a 100644
--- a/src/platform/apollolake/include/xtensa/config/tie-asm.h
+++ b/src/platform/apollolake/include/arch/xtensa/config/tie-asm.h
@@ -29,6 +29,8 @@
    TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
    SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.  */
 
+#if !defined __XCC__
+
 #ifndef _XTENSA_CORE_TIE_ASM_H
 #define _XTENSA_CORE_TIE_ASM_H
 
@@ -237,3 +239,9 @@
 	.macro xchal_cp7_load	p a b c d continue=0 ofs=-1 select=-1 ; .endm
 
 #endif /*_XTENSA_CORE_TIE_ASM_H*/
+
+#else
+
+#error "xcc should not use this header"
+
+#endif /* __XCC__ */
diff --git a/src/platform/cannonlake/include/xtensa/config/tie.h b/src/platform/apollolake/include/arch/xtensa/config/tie.h
similarity index 98%
rename from src/platform/cannonlake/include/xtensa/config/tie.h
rename to src/platform/apollolake/include/arch/xtensa/config/tie.h
index d47e427..b5fd4c9 100644
--- a/src/platform/cannonlake/include/xtensa/config/tie.h
+++ b/src/platform/apollolake/include/arch/xtensa/config/tie.h
@@ -29,6 +29,8 @@
    TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
    SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.  */
 
+#if !defined __XCC__
+
 #ifndef _XTENSA_CORE_TIE_H
 #define _XTENSA_CORE_TIE_H
 
@@ -167,3 +169,9 @@
 	3,3,3,3,3,3,3,3,2,2,2,2,2,2,3,8, 3,3,3,3,3,3,3,3,2,2,2,2,2,2,3,8
 
 #endif /*_XTENSA_CORE_TIE_H*/
+
+#else
+
+#error "xcc should not use this header"
+
+#endif /* __XCC__ */
diff --git a/src/platform/apollolake/include/platform/memory.h b/src/platform/apollolake/include/platform/memory.h
index e7f3ee3..390b31b 100644
--- a/src/platform/apollolake/include/platform/memory.h
+++ b/src/platform/apollolake/include/platform/memory.h
@@ -127,29 +127,7 @@
 #define ROM_BASE		0xBEFE0000
 #define ROM_SIZE		0x00002000
 
-/*
- * The L2 SRAM Heap and Stack on Apololake are organised like this :-
- *
- * +--------------------------------------------------------------------------+
- * | Offset              | Region         |  Size                             |
- * +---------------------+----------------+-----------------------------------+
- * | L2_SRAM_BASE        | RO Data        |  SOF_DATA_SIZE                   |
- * |                     | Data           |                                   |
- * |                     | BSS            |                                   |
- * +---------------------+----------------+-----------------------------------+
- * | HEAP_SYSTEM_BASE    | System Heap    |  HEAP_SYSTEM_SIZE                 |
- * +---------------------+----------------+-----------------------------------+
- * | HEAP_RUNTIME_BASE   | Runtime Heap   |  HEAP_RUNTIME_SIZE                |
- * +---------------------+----------------+-----------------------------------+
- * | HEAP_BUFFER_BASE    | Module Buffers |  HEAP_BUFFER_SIZE                 |
- * +---------------------+----------------+-----------------------------------+
- * | SOF_STACK_END      | Stack          |  SOF_STACK_SIZE                  |
- * +---------------------+----------------+-----------------------------------+
- * | SOF_STACK_BASE     |                |                                   |
- * +---------------------+----------------+-----------------------------------+
- */
-
-/* L2 SRAM */
+/* IMR accessible via L2$ */
 #define L2_SRAM_BASE		0xA000A000
 #define L2_SRAM_SIZE		0x00056000
 
@@ -163,24 +141,8 @@
 #define HEAP_RT_COUNT512		8
 #define HEAP_RT_COUNT1024		4
 
-/* text and data share the same L2 SRAM on Broxton */
-#define SOF_TEXT_START			L2_SRAM_BASE
-#define SOF_TEXT_START_SIZE		0x400
 #define L2_VECTOR_SIZE			0x1000
 
-#define SOF_TEXT_BASE			(L2_SRAM_BASE + L2_VECTOR_SIZE)
-#define SOF_TEXT_SIZE			0x19000
-
-/* initialized data */
-#if defined CONFIG_DMIC
-#define SOF_DATA_SIZE			0x1a000
-#else
-#define SOF_DATA_SIZE			0x19000
-#endif
-
-/* bss data */
-#define SOF_BSS_DATA_SIZE		0x2800
-
 /* Heap configuration */
 #define HEAP_SYSTEM_BASE \
 	(SOF_TEXT_BASE + SOF_TEXT_SIZE +\
@@ -203,11 +165,6 @@
 #define HEAP_BUFFER_COUNT	(HEAP_BUFFER_SIZE / HEAP_BUFFER_BLOCK_SIZE)
 
 
-/* Stack configuration */
-#define SOF_STACK_SIZE			0x1000
-#define SOF_STACK_BASE			(L2_SRAM_BASE + L2_SRAM_SIZE)
-#define SOF_STACK_END			(SOF_STACK_BASE - SOF_STACK_SIZE)
-
 /*
  * The HP SRAM Region Apololake is organised like this :-
  * +--------------------------------------------------------------------------+
@@ -232,8 +189,17 @@
  */
 
 /* HP SRAM */
+#define SRAM_ALIAS_OFFSET	0x20000000
 #define HP_SRAM_BASE		0xBE000000
-#define HP_SRAM_SIZE		0x00020000
+#define HP_SRAM_SIZE		0x00080000
+
+/* HP SRAM Heap */
+#define HEAP_HP_BUFFER_BASE	HP_SRAM_BASE
+#define HEAP_HP_BUFFER_SIZE	0x8000
+
+#define HEAP_HP_BUFFER_BLOCK_SIZE	0x180
+#define HEAP_HP_BUFFER_COUNT \
+	(HEAP_HP_BUFFER_SIZE / HEAP_HP_BUFFER_BLOCK_SIZE)
 
 /* HP SRAM windows */
 
@@ -278,21 +244,27 @@
 #define HP_SRAM_WIN3_BASE	SRAM_TRACE_BASE
 #define HP_SRAM_WIN3_SIZE	SRAM_TRACE_SIZE
 
-/* HP SRAM Heap */
-#define HEAP_HP_BUFFER_BASE	HP_SRAM_BASE
-#define HEAP_HP_BUFFER_SIZE \
-		(HP_SRAM_SIZE - \
-		SRAM_TRACE_SIZE - \
-		SRAM_DEBUG_SIZE - \
-		SRAM_EXCEPT_SIZE - \
-		SRAM_STREAM_SIZE - \
-		SRAM_INBOX_SIZE - \
-		SRAM_OUTBOX_SIZE - \
-		SRAM_SW_REG_SIZE)
+#define HP_SRAM_VECBASE_RESET	(HP_SRAM_WIN0_BASE + HP_SRAM_WIN0_SIZE)
 
-#define HEAP_HP_BUFFER_BLOCK_SIZE	0x180
-#define HEAP_HP_BUFFER_COUNT \
-	(HEAP_HP_BUFFER_SIZE / HEAP_HP_BUFFER_BLOCK_SIZE)
+
+#define SOF_TEXT_START		(HP_SRAM_VECBASE_RESET + 0x400)
+#define SOF_TEXT_BASE		(SOF_TEXT_START)
+#define SOF_TEXT_SIZE		(0x19000 - 0x400)
+
+/* initialized data */
+#if defined CONFIG_DMIC
+#define SOF_DATA_SIZE		0x1b000
+#else
+#define SOF_DATA_SIZE		0x19000
+#endif
+
+/* bss data */
+#define SOF_BSS_DATA_SIZE	0x2800
+
+/* Stack configuration */
+#define SOF_STACK_SIZE		0x1000
+#define SOF_STACK_BASE		(HP_SRAM_BASE + HP_SRAM_SIZE)
+#define SOF_STACK_END		(SOF_STACK_BASE - SOF_STACK_SIZE)
 
 /*
  * The LP SRAM Heap and Stack on Apollolake are organised like this :-
@@ -369,9 +341,31 @@
 #define SOF_MEM_ERROR_TEXT_SIZE	0x180
 #define SOF_MEM_ERROR_LIT_SIZE		0x8
 
-#define SOF_MEM_RESET_TEXT_SIZE	0x268
-#define SOF_MEM_RESET_LIT_SIZE		0x8
+#define SOF_MEM_VECBASE			HP_SRAM_VECBASE_RESET
 #define SOF_MEM_VECBASE_LIT_SIZE	0x178
 
 #define SOF_MEM_RO_SIZE		0x8
+
+/* boot loader in IMR */
+#define IMR_BOOT_LDR_TEXT_ENTRY_BASE	0xB000A000
+#define IMR_BOOT_LDR_TEXT_ENTRY_SIZE	0x66
+#define IMR_BOOT_LDR_LIT_BASE		(IMR_BOOT_LDR_TEXT_ENTRY_BASE + \
+					IMR_BOOT_LDR_TEXT_ENTRY_SIZE)
+#define IMR_BOOT_LDR_LIT_SIZE		0x70
+#define IMR_BOOT_LDR_TEXT_BASE		(IMR_BOOT_LDR_LIT_BASE + \
+					IMR_BOOT_LDR_LIT_SIZE)
+#define IMR_BOOT_LDR_TEXT_SIZE		0x1C00
+#define IMR_BOOT_LDR_TEXT1_BASE		(IMR_BOOT_LDR_TEXT_BASE + IMR_BOOT_LDR_TEXT_SIZE)
+#define IMR_BOOT_LDR_TEXT1_SIZE		0x2000
+#define IMR_BOOT_LDR_DATA_BASE		0xB0002000
+#define IMR_BOOT_LDR_DATA_SIZE		0x1000
+#define IMR_BOOT_LDR_BSS_BASE		0xB0100000
+#define IMR_BOOT_LDR_BSS_SIZE		0x10000
+
+/** \brief Manifest base address in IMR - used by boot loader copy procedure. */
+#define IMR_BOOT_LDR_MANIFEST_BASE	0xB0004000
+
+/** \brief Manifest size (seems unused). */
+#define IMR_BOOT_LDR_MANIFEST_SIZE	0x6000
+
 #endif
diff --git a/src/platform/apollolake/include/platform/platcfg.h b/src/platform/apollolake/include/platform/platcfg.h
new file mode 100644
index 0000000..0875db3
--- /dev/null
+++ b/src/platform/apollolake/include/platform/platcfg.h
@@ -0,0 +1,38 @@
+/*
+ * Copyright (c) 2018, Intel Corporation
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *   * Redistributions of source code must retain the above copyright
+ *     notice, this list of conditions and the following disclaimer.
+ *   * Redistributions in binary form must reproduce the above copyright
+ *     notice, this list of conditions and the following disclaimer in the
+ *     documentation and/or other materials provided with the distribution.
+ *   * Neither the name of the Intel Corporation nor the
+ *     names of its contributors may be used to endorse or promote products
+ *     derived from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ *
+ * Author: Marcin Maka <marcin.maka at linux.intel.com>
+ */
+
+#ifndef __PLATFORM_PLATCFG_H__
+#define __PLATFORM_PLATCFG_H__
+
+#define PLATFORM_RESET_MHE_AT_BOOT		1
+
+#define PLATFORM_DISABLE_L2CACHE_AT_BOOT	1
+
+#endif
diff --git a/src/platform/apollolake/include/platform/platform.h b/src/platform/apollolake/include/platform/platform.h
index aefa9b2..6d51752 100644
--- a/src/platform/apollolake/include/platform/platform.h
+++ b/src/platform/apollolake/include/platform/platform.h
@@ -33,6 +33,7 @@
 #ifndef __PLATFORM_PLATFORM_H__
 #define __PLATFORM_PLATFORM_H__
 
+#include <platform/platcfg.h>
 #include <platform/shim.h>
 #include <platform/interrupt.h>
 #include <uapi/ipc.h>
diff --git a/src/platform/apollolake/include/platform/shim.h b/src/platform/apollolake/include/platform/shim.h
index daff826..92b6cf3 100644
--- a/src/platform/apollolake/include/platform/shim.h
+++ b/src/platform/apollolake/include/platform/shim.h
@@ -33,7 +33,10 @@
 #define __PLATFORM_SHIM_H__
 
 #include <platform/memory.h>
+
+#ifndef ASSEMBLY
 #include <stdint.h>
+#endif
 
 /* DSP IPC for Host Registers */
 #define IPC_DIPCT		0x00
@@ -146,9 +149,19 @@
 #define SHIM_PWRSTS		0x92
 #define SHIM_LPSCTL		0x94
 
+/* HP SRAM Power Gating */
+#define SHIM_HSPGCTL		0x80
+#define SHIM_HPGISTS		0xb0
+
 #define SHIM_LPSCTL_FDSPRUN	(0X1 << 9)
 #define SHIM_LPSCTL_FDMARUN	(0X1 << 8)
 
+#define SHIM_L2_MECS		(SHIM_BASE + 0xd0)
+
+#define SHIM_L2_CACHE_CTRL	(SHIM_BASE + 0x500)
+#define SHIM_L2_PREF_CFG	(SHIM_BASE + 0x508)
+#define SHIM_L2_CACHE_PREF	(SHIM_BASE + 0x510)
+
 
 /* host windows */
 #define DMWBA(x)		(HOST_WIN_BASE(x) + 0x0)
@@ -157,6 +170,8 @@
 #define DMWBA_ENABLE		(1 << 0)
 #define DMWBA_READONLY		(1 << 1)
 
+#ifndef ASSEMBLY
+
 static inline uint32_t shim_read(uint32_t reg)
 {
 	return *((volatile uint32_t*)(SHIM_BASE + reg));
@@ -179,12 +194,14 @@ static inline void shim_write64(uint32_t reg, uint64_t val)
 
 static inline uint32_t sw_reg_read(uint32_t reg)
 {
-	return *((volatile uint32_t*)(SRAM_SW_REG_BASE + reg));
+	return *((volatile uint32_t*)((SRAM_SW_REG_BASE -
+		SRAM_ALIAS_OFFSET) + reg));
 }
 
 static inline void sw_reg_write(uint32_t reg, uint32_t val)
 {
-	*((volatile uint32_t*)(SRAM_SW_REG_BASE + reg)) = val;
+	*((volatile uint32_t*)((SRAM_SW_REG_BASE -
+		SRAM_ALIAS_OFFSET) + reg)) = val;
 }
 
 static inline uint32_t mn_reg_read(uint32_t reg)
@@ -216,5 +233,6 @@ static inline void ipc_write(uint32_t reg, uint32_t val)
 {
 	*((volatile uint32_t*)(IPC_HOST_BASE + reg)) = val;
 }
+#endif
 
 #endif
diff --git a/src/platform/baytrail/include/Makefile.am b/src/platform/baytrail/include/Makefile.am
index 19f40eb..c5113a4 100644
--- a/src/platform/baytrail/include/Makefile.am
+++ b/src/platform/baytrail/include/Makefile.am
@@ -1 +1 @@
-SUBDIRS = platform xtensa
+SUBDIRS = arch platform
diff --git a/src/platform/baytrail/include/arch/Makefile.am b/src/platform/baytrail/include/arch/Makefile.am
new file mode 100644
index 0000000..63616bf
--- /dev/null
+++ b/src/platform/baytrail/include/arch/Makefile.am
@@ -0,0 +1 @@
+SUBDIRS = xtensa
diff --git a/src/platform/baytrail/include/xtensa/Makefile.am b/src/platform/baytrail/include/arch/xtensa/Makefile.am
similarity index 100%
rename from src/platform/baytrail/include/xtensa/Makefile.am
rename to src/platform/baytrail/include/arch/xtensa/Makefile.am
diff --git a/src/platform/baytrail/include/xtensa/config/Makefile.am b/src/platform/baytrail/include/arch/xtensa/config/Makefile.am
similarity index 100%
rename from src/platform/baytrail/include/xtensa/config/Makefile.am
rename to src/platform/baytrail/include/arch/xtensa/config/Makefile.am
diff --git a/src/platform/baytrail/include/xtensa/config/core-isa-byt.h b/src/platform/baytrail/include/arch/xtensa/config/core-isa-byt.h
similarity index 100%
rename from src/platform/baytrail/include/xtensa/config/core-isa-byt.h
rename to src/platform/baytrail/include/arch/xtensa/config/core-isa-byt.h
diff --git a/src/platform/baytrail/include/xtensa/config/core-isa-cht.h b/src/platform/baytrail/include/arch/xtensa/config/core-isa-cht.h
similarity index 100%
rename from src/platform/baytrail/include/xtensa/config/core-isa-cht.h
rename to src/platform/baytrail/include/arch/xtensa/config/core-isa-cht.h
diff --git a/src/platform/baytrail/include/xtensa/config/core-isa.h b/src/platform/baytrail/include/arch/xtensa/config/core-isa.h
similarity index 100%
rename from src/platform/baytrail/include/xtensa/config/core-isa.h
rename to src/platform/baytrail/include/arch/xtensa/config/core-isa.h
diff --git a/src/platform/baytrail/include/xtensa/config/core-matmap.h b/src/platform/baytrail/include/arch/xtensa/config/core-matmap.h
similarity index 100%
rename from src/platform/baytrail/include/xtensa/config/core-matmap.h
rename to src/platform/baytrail/include/arch/xtensa/config/core-matmap.h
diff --git a/src/platform/apollolake/include/xtensa/config/defs.h b/src/platform/baytrail/include/arch/xtensa/config/defs.h
similarity index 100%
rename from src/platform/apollolake/include/xtensa/config/defs.h
rename to src/platform/baytrail/include/arch/xtensa/config/defs.h
diff --git a/src/platform/baytrail/include/xtensa/config/specreg.h b/src/platform/baytrail/include/arch/xtensa/config/specreg.h
similarity index 100%
rename from src/platform/baytrail/include/xtensa/config/specreg.h
rename to src/platform/baytrail/include/arch/xtensa/config/specreg.h
diff --git a/src/platform/baytrail/include/xtensa/config/system.h b/src/platform/baytrail/include/arch/xtensa/config/system.h
similarity index 100%
rename from src/platform/baytrail/include/xtensa/config/system.h
rename to src/platform/baytrail/include/arch/xtensa/config/system.h
diff --git a/src/platform/baytrail/include/xtensa/config/tie-asm.h b/src/platform/baytrail/include/arch/xtensa/config/tie-asm.h
similarity index 100%
rename from src/platform/baytrail/include/xtensa/config/tie-asm.h
rename to src/platform/baytrail/include/arch/xtensa/config/tie-asm.h
diff --git a/src/platform/baytrail/include/xtensa/config/tie.h b/src/platform/baytrail/include/arch/xtensa/config/tie.h
similarity index 100%
rename from src/platform/baytrail/include/xtensa/config/tie.h
rename to src/platform/baytrail/include/arch/xtensa/config/tie.h
diff --git a/src/platform/cannonlake/boot_ldr.x.in b/src/platform/cannonlake/boot_ldr.x.in
index e15e631..a023f2e 100644
--- a/src/platform/cannonlake/boot_ldr.x.in
+++ b/src/platform/cannonlake/boot_ldr.x.in
@@ -8,7 +8,7 @@
  */
 
 #include <platform/memory.h>
-#include <xtensa/config/core-isa-boot.h>
+#include <xtensa/config/core-isa.h>
 
 OUTPUT_ARCH(xtensa)
 
@@ -23,69 +23,18 @@ MEMORY
   sof_text :
         org = IMR_BOOT_LDR_TEXT_BASE,
         len = IMR_BOOT_LDR_TEXT_SIZE,
-  vector_base_text :
-        org = XCHAL_VECBASE_RESET_PADDR,
-        len = SOF_MEM_VECBASE_LIT_SIZE
-  vector_int2_lit :
-        org = XCHAL_INTLEVEL2_VECTOR_PADDR - SOF_MEM_VECT_LIT_SIZE,
-        len = SOF_MEM_VECT_LIT_SIZE
-  vector_int2_text :
-        org = XCHAL_INTLEVEL2_VECTOR_PADDR,
-        len = SOF_MEM_VECT_TEXT_SIZE
-  vector_int3_lit :
-        org = XCHAL_INTLEVEL3_VECTOR_PADDR - SOF_MEM_VECT_LIT_SIZE,
-        len = SOF_MEM_VECT_LIT_SIZE
-  vector_int3_text :
-        org = XCHAL_INTLEVEL3_VECTOR_PADDR,
-        len = SOF_MEM_VECT_TEXT_SIZE
-  vector_int4_lit :
-        org = XCHAL_INTLEVEL4_VECTOR_PADDR - SOF_MEM_VECT_LIT_SIZE,
-        len = SOF_MEM_VECT_LIT_SIZE
-  vector_int4_text :
-        org = XCHAL_INTLEVEL4_VECTOR_PADDR,
-        len = SOF_MEM_VECT_TEXT_SIZE
-  vector_int5_lit :
-        org = XCHAL_INTLEVEL5_VECTOR_PADDR - SOF_MEM_VECT_LIT_SIZE,
-        len = SOF_MEM_VECT_LIT_SIZE
-  vector_int5_text :
-        org = XCHAL_INTLEVEL5_VECTOR_PADDR,
-        len = SOF_MEM_VECT_TEXT_SIZE
-  vector_int6_lit :
-        org = XCHAL_INTLEVEL6_VECTOR_PADDR - SOF_MEM_VECT_LIT_SIZE,
-        len = SOF_MEM_VECT_LIT_SIZE
-  vector_int6_text :
-        org = XCHAL_INTLEVEL6_VECTOR_PADDR,
-        len = SOF_MEM_VECT_TEXT_SIZE
-  vector_int7_lit :
-        org = XCHAL_INTLEVEL7_VECTOR_PADDR - SOF_MEM_VECT_LIT_SIZE,
-        len = SOF_MEM_VECT_LIT_SIZE
-  vector_int7_text :
-        org = XCHAL_INTLEVEL7_VECTOR_PADDR,
-        len = SOF_MEM_VECT_TEXT_SIZE
-  vector_kernel_lit :
-        org = XCHAL_KERNEL_VECTOR_PADDR - SOF_MEM_VECT_LIT_SIZE,
-        len = SOF_MEM_VECT_LIT_SIZE
-  vector_kernel_text :
-        org = XCHAL_KERNEL_VECTOR_PADDR,
-        len = SOF_MEM_VECT_TEXT_SIZE
-  vector_user_lit :
-        org = XCHAL_USER_VECTOR_PADDR - SOF_MEM_VECT_LIT_SIZE,
-        len = SOF_MEM_VECT_LIT_SIZE
-  vector_user_text :
-        org = XCHAL_USER_VECTOR_PADDR,
-        len = SOF_MEM_VECT_TEXT_SIZE
-  vector_double_lit :
-        org = XCHAL_DOUBLEEXC_VECTOR_PADDR - SOF_MEM_VECT_LIT_SIZE,
-        len = SOF_MEM_VECT_LIT_SIZE
-  vector_double_text :
-        org = XCHAL_DOUBLEEXC_VECTOR_PADDR,
-        len = SOF_MEM_VECT_TEXT_SIZE
   sof_data :
         org = IMR_BOOT_LDR_DATA_BASE,
         len = IMR_BOOT_LDR_DATA_SIZE
   sof_bss_data :
 	org = IMR_BOOT_LDR_BSS_BASE,
         len = IMR_BOOT_LDR_BSS_SIZE
+  sof_stack :
+        org = SOF_STACK_END,
+        len = SOF_STACK_BASE - SOF_STACK_END
+  wnd0 :
+        org = HP_SRAM_WIN0_BASE,
+        len = HP_SRAM_WIN0_SIZE
 }
 
 PHDRS
@@ -93,27 +42,10 @@ PHDRS
   boot_entry_text_phdr PT_LOAD;
   boot_entry_lit_phdr PT_LOAD;
   sof_text_phdr PT_LOAD;
-  vector_base_text_phdr PT_LOAD;
-  vector_int2_lit_phdr PT_LOAD;
-  vector_int2_text_phdr PT_LOAD;
-  vector_int3_lit_phdr PT_LOAD;
-  vector_int3_text_phdr PT_LOAD;
-  vector_int4_lit_phdr PT_LOAD;
-  vector_int4_text_phdr PT_LOAD;
-  vector_int5_lit_phdr PT_LOAD;
-  vector_int5_text_phdr PT_LOAD;
-  vector_int6_lit_phdr PT_LOAD;
-  vector_int6_text_phdr PT_LOAD;
-  vector_int7_lit_phdr PT_LOAD;
-  vector_int7_text_phdr PT_LOAD;
-  vector_kernel_lit_phdr PT_LOAD;
-  vector_kernel_text_phdr PT_LOAD;
-  vector_user_lit_phdr PT_LOAD;
-  vector_user_text_phdr PT_LOAD;
-  vector_double_lit_phdr PT_LOAD;
-  vector_double_text_phdr PT_LOAD;
   sof_data_phdr PT_LOAD;
   sof_bss_data_phdr PT_LOAD;
+  sof_stack_phdr PT_LOAD;
+  wnd0_phdr PT_LOAD;
 }
 
 /*  Default entry point:  */
@@ -150,144 +82,10 @@ SECTIONS
     *(.gnu.version)
     KEEP (*(.ResetVector.text))
     KEEP (*(.ResetHandler.text))
-    KEEP (*(.MemoryExceptionVector.text))
     _text_end = ABSOLUTE(.);
     _etext = .;
   } >sof_text :sof_text_phdr
 
-  .WindowVectors.text : ALIGN(4)
-  {
-    _WindowVectors_text_start = ABSOLUTE(.);
-    KEEP (*(.WindowVectors.text))
-    _WindowVectors_text_end = ABSOLUTE(.);
-  } >vector_base_text :vector_base_text_phdr
-
-  .Level2InterruptVector.literal : ALIGN(4)
-  {
-    _Level2InterruptVector_literal_start = ABSOLUTE(.);
-    *(.Level2InterruptVector.literal)
-    _Level2InterruptVector_literal_end = ABSOLUTE(.);
-  } >vector_int2_lit :vector_int2_lit_phdr
-
-  .Level2InterruptVector.text : ALIGN(4)
-  {
-    _Level2InterruptVector_text_start = ABSOLUTE(.);
-    KEEP (*(.Level2InterruptVector.text))
-    _Level2InterruptVector_text_end = ABSOLUTE(.);
-  } >vector_int2_text :vector_int2_text_phdr
-
-  .Level3InterruptVector.literal : ALIGN(4)
-  {
-    _Level3InterruptVector_literal_start = ABSOLUTE(.);
-    *(.Level3InterruptVector.literal)
-    _Level3InterruptVector_literal_end = ABSOLUTE(.);
-  } >vector_int3_lit :vector_int3_lit_phdr
-
-  .Level3InterruptVector.text : ALIGN(4)
-  {
-    _Level3InterruptVector_text_start = ABSOLUTE(.);
-    KEEP (*(.Level3InterruptVector.text))
-    _Level3InterruptVector_text_end = ABSOLUTE(.);
-  } >vector_int3_text :vector_int3_text_phdr
-
-  .Level4InterruptVector.literal : ALIGN(4)
-  {
-    _Level4InterruptVector_literal_start = ABSOLUTE(.);
-    *(.Level4InterruptVector.literal)
-    _Level4InterruptVector_literal_end = ABSOLUTE(.);
-  } >vector_int4_lit :vector_int4_lit_phdr
-
-  .Level4InterruptVector.text : ALIGN(4)
-  {
-    _Level4InterruptVector_text_start = ABSOLUTE(.);
-    KEEP (*(.Level4InterruptVector.text))
-    _Level4InterruptVector_text_end = ABSOLUTE(.);
-  } >vector_int4_text :vector_int4_text_phdr
-
-  .Level5InterruptVector.literal : ALIGN(4)
-  {
-    _Level5InterruptVector_literal_start = ABSOLUTE(.);
-    *(.Level5InterruptVector.literal)
-    _Level5InterruptVector_literal_end = ABSOLUTE(.);
-  } >vector_int5_lit :vector_int5_lit_phdr
-
-  .Level5InterruptVector.text : ALIGN(4)
-  {
-    _Level5InterruptVector_text_start = ABSOLUTE(.);
-    KEEP (*(.Level5InterruptVector.text))
-    _Level5InterruptVector_text_end = ABSOLUTE(.);
-  } >vector_int5_text :vector_int5_text_phdr
-
-  .DebugExceptionVector.literal : ALIGN(4)
-  {
-    _DebugExceptionVector_literal_start = ABSOLUTE(.);
-    *(.DebugExceptionVector.literal)
-    _DebugExceptionVector_literal_end = ABSOLUTE(.);
-  } >vector_int6_lit :vector_int6_lit_phdr
-
-  .DebugExceptionVector.text : ALIGN(4)
-  {
-    _DebugExceptionVector_text_start = ABSOLUTE(.);
-    KEEP (*(.DebugExceptionVector.text))
-    _DebugExceptionVector_text_end = ABSOLUTE(.);
-  } >vector_int6_text :vector_int6_text_phdr
-
-  .NMIExceptionVector.literal : ALIGN(4)
-  {
-    _NMIExceptionVector_literal_start = ABSOLUTE(.);
-    *(.NMIExceptionVector.literal)
-    _NMIExceptionVector_literal_end = ABSOLUTE(.);
-  } >vector_int7_lit :vector_int7_lit_phdr
-
-  .NMIExceptionVector.text : ALIGN(4)
-  {
-    _NMIExceptionVector_text_start = ABSOLUTE(.);
-    KEEP (*(.NMIExceptionVector.text))
-    _NMIExceptionVector_text_end = ABSOLUTE(.);
-  } >vector_int7_text :vector_int7_text_phdr
-
-  .KernelExceptionVector.literal : ALIGN(4)
-  {
-    _KernelExceptionVector_literal_start = ABSOLUTE(.);
-    *(.KernelExceptionVector.literal)
-    _KernelExceptionVector_literal_end = ABSOLUTE(.);
-  } >vector_kernel_lit :vector_kernel_lit_phdr
-
-  .KernelExceptionVector.text : ALIGN(4)
-  {
-    _KernelExceptionVector_text_start = ABSOLUTE(.);
-    KEEP (*(.KernelExceptionVector.text))
-    _KernelExceptionVector_text_end = ABSOLUTE(.);
-  } >vector_kernel_text :vector_kernel_text_phdr
-
-  .UserExceptionVector.literal : ALIGN(4)
-  {
-    _UserExceptionVector_literal_start = ABSOLUTE(.);
-    *(.UserExceptionVector.literal)
-    _UserExceptionVector_literal_end = ABSOLUTE(.);
-  } >vector_user_lit :vector_user_lit_phdr
-
-  .UserExceptionVector.text : ALIGN(4)
-  {
-    _UserExceptionVector_text_start = ABSOLUTE(.);
-    KEEP (*(.UserExceptionVector.text))
-    _UserExceptionVector_text_end = ABSOLUTE(.);
-  } >vector_user_text :vector_user_text_phdr
-
-  .DoubleExceptionVector.literal : ALIGN(4)
-  {
-    _DoubleExceptionVector_literal_start = ABSOLUTE(.);
-    *(.DoubleExceptionVector.literal)
-    _DoubleExceptionVector_literal_end = ABSOLUTE(.);
-  } >vector_double_lit :vector_double_lit_phdr
-
-  .DoubleExceptionVector.text : ALIGN(4)
-  {
-    _DoubleExceptionVector_text_start = ABSOLUTE(.);
-    KEEP (*(.DoubleExceptionVector.text))
-    _DoubleExceptionVector_text_end = ABSOLUTE(.);
-  } >vector_double_text :vector_double_text_phdr
-
   .rodata : ALIGN(4)
   {
     _rodata_start = ABSOLUTE(.);
@@ -381,6 +179,10 @@ SECTIONS
   _memmap_cacheattr_wbna_trapnull = 0xFF42FFF2;
   PROVIDE(_memmap_cacheattr_reset = _memmap_cacheattr_wbna_trapnull);
 
+  __stack = SOF_STACK_BASE;
+  __wnd0 = HP_SRAM_WIN0_BASE;
+  __wnd0_size = HP_SRAM_WIN0_SIZE;
+
   .debug  0 :  { *(.debug) }
   .line  0 :  { *(.line) }
   .debug_srcinfo  0 :  { *(.debug_srcinfo) }
diff --git a/src/platform/cannonlake/cannonlake.x.in b/src/platform/cannonlake/cannonlake.x.in
index 052d637..06f745b 100644
--- a/src/platform/cannonlake/cannonlake.x.in
+++ b/src/platform/cannonlake/cannonlake.x.in
@@ -14,12 +14,6 @@ OUTPUT_ARCH(xtensa)
 
 MEMORY
 {
-  vector_reset_text :
-        org = XCHAL_RESET_VECTOR0_PADDR,
-        len = SOF_MEM_RESET_TEXT_SIZE
-  vector_reset_lit :
-        org = XCHAL_RESET_VECTOR0_PADDR + SOF_MEM_RESET_TEXT_SIZE,
-        len = SOF_MEM_RESET_LIT_SIZE
   vector_memory_lit :
         org = XCHAL_MEMERROR_VECTOR_PADDR + SOF_MEM_ERROR_LIT_SIZE,
         len = SOF_MEM_ERROR_LIT_SIZE
@@ -27,65 +21,62 @@ MEMORY
         org = XCHAL_MEMERROR_VECTOR_PADDR,
         len = SOF_MEM_ERROR_TEXT_SIZE
   vector_base_text :
-        org = XCHAL_VECBASE_RESET_PADDR,
+        org = SOF_MEM_VECBASE,
         len = SOF_MEM_VECBASE_LIT_SIZE
   vector_int2_lit :
-        org = XCHAL_INTLEVEL2_VECTOR_PADDR - SOF_MEM_VECT_LIT_SIZE,
+        org = SOF_MEM_VECBASE + XCHAL_INTLEVEL2_VECOFS - SOF_MEM_VECT_LIT_SIZE,
         len = SOF_MEM_VECT_LIT_SIZE
   vector_int2_text :
-        org = XCHAL_INTLEVEL2_VECTOR_PADDR,
+        org = SOF_MEM_VECBASE + XCHAL_INTLEVEL2_VECOFS,
         len = SOF_MEM_VECT_TEXT_SIZE
   vector_int3_lit :
-        org = XCHAL_INTLEVEL3_VECTOR_PADDR - SOF_MEM_VECT_LIT_SIZE,
+        org = SOF_MEM_VECBASE + XCHAL_INTLEVEL3_VECOFS - SOF_MEM_VECT_LIT_SIZE,
         len = SOF_MEM_VECT_LIT_SIZE
   vector_int3_text :
-        org = XCHAL_INTLEVEL3_VECTOR_PADDR,
+        org = SOF_MEM_VECBASE + XCHAL_INTLEVEL3_VECOFS,
         len = SOF_MEM_VECT_TEXT_SIZE
   vector_int4_lit :
-        org = XCHAL_INTLEVEL4_VECTOR_PADDR - SOF_MEM_VECT_LIT_SIZE,
+        org = SOF_MEM_VECBASE + XCHAL_INTLEVEL4_VECOFS - SOF_MEM_VECT_LIT_SIZE,
         len = SOF_MEM_VECT_LIT_SIZE
   vector_int4_text :
-        org = XCHAL_INTLEVEL4_VECTOR_PADDR,
+        org = SOF_MEM_VECBASE + XCHAL_INTLEVEL4_VECOFS,
         len = SOF_MEM_VECT_TEXT_SIZE
   vector_int5_lit :
-        org = XCHAL_INTLEVEL5_VECTOR_PADDR - SOF_MEM_VECT_LIT_SIZE,
+        org = SOF_MEM_VECBASE + XCHAL_INTLEVEL5_VECOFS - SOF_MEM_VECT_LIT_SIZE,
         len = SOF_MEM_VECT_LIT_SIZE
   vector_int5_text :
-        org = XCHAL_INTLEVEL5_VECTOR_PADDR,
+        org = SOF_MEM_VECBASE + XCHAL_INTLEVEL5_VECOFS,
         len = SOF_MEM_VECT_TEXT_SIZE
   vector_int6_lit :
-        org = XCHAL_INTLEVEL6_VECTOR_PADDR - SOF_MEM_VECT_LIT_SIZE,
+        org = SOF_MEM_VECBASE + XCHAL_INTLEVEL6_VECOFS - SOF_MEM_VECT_LIT_SIZE,
         len = SOF_MEM_VECT_LIT_SIZE
   vector_int6_text :
-        org = XCHAL_INTLEVEL6_VECTOR_PADDR,
+        org = SOF_MEM_VECBASE + XCHAL_INTLEVEL6_VECOFS,
         len = SOF_MEM_VECT_TEXT_SIZE
   vector_int7_lit :
-        org = XCHAL_INTLEVEL7_VECTOR_PADDR - SOF_MEM_VECT_LIT_SIZE,
+        org = SOF_MEM_VECBASE + XCHAL_INTLEVEL7_VECOFS - SOF_MEM_VECT_LIT_SIZE,
         len = SOF_MEM_VECT_LIT_SIZE
   vector_int7_text :
-        org = XCHAL_INTLEVEL7_VECTOR_PADDR,
+        org = SOF_MEM_VECBASE + XCHAL_INTLEVEL7_VECOFS,
         len = SOF_MEM_VECT_TEXT_SIZE
   vector_kernel_lit :
-        org = XCHAL_KERNEL_VECTOR_PADDR - SOF_MEM_VECT_LIT_SIZE,
+        org = SOF_MEM_VECBASE + XCHAL_KERNEL_VECOFS - SOF_MEM_VECT_LIT_SIZE,
         len = SOF_MEM_VECT_LIT_SIZE
   vector_kernel_text :
-        org = XCHAL_KERNEL_VECTOR_PADDR,
+        org = SOF_MEM_VECBASE + XCHAL_KERNEL_VECOFS,
         len = SOF_MEM_VECT_TEXT_SIZE
   vector_user_lit :
-        org = XCHAL_USER_VECTOR_PADDR - SOF_MEM_VECT_LIT_SIZE,
+        org = SOF_MEM_VECBASE + XCHAL_USER_VECOFS - SOF_MEM_VECT_LIT_SIZE,
         len = SOF_MEM_VECT_LIT_SIZE
   vector_user_text :
-        org = XCHAL_USER_VECTOR_PADDR,
+        org = SOF_MEM_VECBASE + XCHAL_USER_VECOFS,
         len = SOF_MEM_VECT_TEXT_SIZE
   vector_double_lit :
-        org = XCHAL_DOUBLEEXC_VECTOR_PADDR - SOF_MEM_VECT_LIT_SIZE,
+        org = SOF_MEM_VECBASE + XCHAL_DOUBLEEXC_VECOFS - SOF_MEM_VECT_LIT_SIZE,
         len = SOF_MEM_VECT_LIT_SIZE
   vector_double_text :
-        org = XCHAL_DOUBLEEXC_VECTOR_PADDR,
+        org = SOF_MEM_VECBASE + XCHAL_DOUBLEEXC_VECOFS,
         len = SOF_MEM_VECT_TEXT_SIZE
-  sof_text_start :
-        org = SOF_TEXT_START,
-        len = SOF_TEXT_START_SIZE,
   sof_text :
         org = SOF_TEXT_BASE,
         len = SOF_TEXT_SIZE,
@@ -111,8 +102,6 @@ MEMORY
 
 PHDRS
 {
-  vector_reset_text_phdr PT_LOAD;
-  vector_reset_lit_phdr PT_LOAD;
   vector_memory_lit_phdr PT_LOAD;
   vector_memory_text_phdr PT_LOAD;
   vector_base_text_phdr PT_LOAD;
@@ -134,7 +123,6 @@ PHDRS
   vector_user_text_phdr PT_LOAD;
   vector_double_lit_phdr PT_LOAD;
   vector_double_text_phdr PT_LOAD;
-  sof_text_start_phdr PT_LOAD;
   sof_text_phdr PT_LOAD;
   sof_data_phdr PT_LOAD;
   sof_bss_data_phdr PT_LOAD;
@@ -171,27 +159,6 @@ PROVIDE(_memmap_cacheattr_reset = _memmap_cacheattr_wbna_trapnull);
 
 SECTIONS
 {
-  .ResetVector.text : ALIGN(4)
-  {
-    _ResetVector_text_start = ABSOLUTE(.);
-    KEEP (*(.ResetVector.text))
-    _ResetVector_text_end = ABSOLUTE(.);
-  } >vector_reset_text :vector_reset_text_phdr
-
-  .ResetVector.literal : ALIGN(4)
-  {
-    _ResetVector_literal_start = ABSOLUTE(.);
-    *(.ResetVector.literal)
-    _ResetVector_literal_end = ABSOLUTE(.);
-  } >vector_reset_lit :vector_reset_lit_phdr
-
- .MemoryExceptionVector.literal : ALIGN(4)
-  {
-    _MemoryExceptionVector_literal_start = ABSOLUTE(.);
-    KEEP (*(.MemoryExceptionVector.literal))
-    _MemoryExceptionVector_literal_end = ABSOLUTE(.);
-  } >vector_memory_lit :vector_memory_lit_phdr
-
   .MemoryExceptionVector.text : ALIGN(4)
   {
     _MemoryExceptionVector_text_start = ABSOLUTE(.);
@@ -199,7 +166,7 @@ SECTIONS
     _MemoryExceptionVector_text_end = ABSOLUTE(.);
   } >vector_memory_text :vector_memory_text_phdr
 
-   .WindowVectors.text : ALIGN(4)
+  .WindowVectors.text : ALIGN(4)
   {
     _WindowVectors_text_start = ABSOLUTE(.);
     KEEP (*(.WindowVectors.text))
@@ -332,17 +299,11 @@ SECTIONS
     _DoubleExceptionVector_text_end = ABSOLUTE(.);
   } >vector_double_text :vector_double_text_phdr
 
-  .MainEntry.text : ALIGN(4)
-  {
-    _MainEntry_text_start = ABSOLUTE(.);
-    KEEP (*(.MainEntry.text))
-    _MainEntry_text_end = ABSOLUTE(.);
-  } >sof_text_start :sof_text_start_phdr
-
   .text : ALIGN(4)
   {
     _stext = .;
     _text_start = ABSOLUTE(.);
+    KEEP (*(.MainEntry.text))
     *(.entry.text)
     *(.init.literal)
     KEEP(*(.init))
diff --git a/src/platform/cannonlake/include/Makefile.am b/src/platform/cannonlake/include/Makefile.am
index 19f40eb..c5113a4 100644
--- a/src/platform/cannonlake/include/Makefile.am
+++ b/src/platform/cannonlake/include/Makefile.am
@@ -1 +1 @@
-SUBDIRS = platform xtensa
+SUBDIRS = arch platform
diff --git a/src/platform/cannonlake/include/arch/Makefile.am b/src/platform/cannonlake/include/arch/Makefile.am
new file mode 100644
index 0000000..63616bf
--- /dev/null
+++ b/src/platform/cannonlake/include/arch/Makefile.am
@@ -0,0 +1 @@
+SUBDIRS = xtensa
diff --git a/src/platform/cannonlake/include/xtensa/Makefile.am b/src/platform/cannonlake/include/arch/xtensa/Makefile.am
similarity index 100%
rename from src/platform/cannonlake/include/xtensa/Makefile.am
rename to src/platform/cannonlake/include/arch/xtensa/Makefile.am
diff --git a/src/platform/cannonlake/include/xtensa/config/Makefile.am b/src/platform/cannonlake/include/arch/xtensa/config/Makefile.am
similarity index 84%
rename from src/platform/cannonlake/include/xtensa/config/Makefile.am
rename to src/platform/cannonlake/include/arch/xtensa/config/Makefile.am
index bfca58b..99c21a5 100644
--- a/src/platform/cannonlake/include/xtensa/config/Makefile.am
+++ b/src/platform/cannonlake/include/arch/xtensa/config/Makefile.am
@@ -5,5 +5,4 @@ noinst_HEADERS = \
 	specreg.h \
 	system.h \
 	tie.h \
-	core-isa-boot.h \
 	tie-asm.h
diff --git a/src/platform/cannonlake/include/xtensa/config/core-isa-boot.h b/src/platform/cannonlake/include/arch/xtensa/config/core-isa.h
similarity index 95%
rename from src/platform/cannonlake/include/xtensa/config/core-isa-boot.h
rename to src/platform/cannonlake/include/arch/xtensa/config/core-isa.h
index 186643b..8a02768 100644
--- a/src/platform/cannonlake/include/xtensa/config/core-isa-boot.h
+++ b/src/platform/cannonlake/include/arch/xtensa/config/core-isa.h
@@ -28,8 +28,10 @@
    TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
    SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.  */
 
-#ifndef _XTENSA_CORE_BOOT_CONFIGURATION_H
-#define _XTENSA_CORE_BOOT_CONFIGURATION_H
+#if !defined __XCC__
+
+#ifndef _XTENSA_CORE_CONFIGURATION_H
+#define _XTENSA_CORE_CONFIGURATION_H
 
 
 /****************************************************************************
@@ -439,12 +441,12 @@
 #define XCHAL_HAVE_XEAX			0	/* External Exception Arch. */
 #define XCHAL_HAVE_EXCEPTIONS		1	/* exception option */
 #define XCHAL_HAVE_HALT			0	/* halt architecture option */
-#define XCHAL_HAVE_BOOTLOADER		0	/* boot loader (for TX) */
+#define XCHAL_HAVE_BOOTLOADER		1	/* boot loader (for TX) */
 #define XCHAL_HAVE_MEM_ECC_PARITY	1	/* local memory ECC/parity */
 #define XCHAL_HAVE_VECTOR_SELECT	1	/* relocatable vectors */
 #define XCHAL_HAVE_VECBASE		1	/* relocatable vectors */
-#define XCHAL_VECBASE_RESET_VADDR	0xB003A000  /* VECBASE reset value */
-#define XCHAL_VECBASE_RESET_PADDR	0xB003A000
+#define XCHAL_VECBASE_RESET_VADDR	0xBEFE0800  /* VECBASE reset value */
+#define XCHAL_VECBASE_RESET_PADDR	0xBEFE0800
 #define XCHAL_RESET_VECBASE_OVERLAP	0
 
 #define XCHAL_RESET_VECTOR0_VADDR	0xBEFE0000
@@ -460,43 +462,43 @@
 #define XCHAL_MEMERROR_VECTOR_VADDR	0xBEFE0400
 #define XCHAL_MEMERROR_VECTOR_PADDR	0xBEFE0400
 #define XCHAL_USER_VECOFS		0x00000340
-#define XCHAL_USER_VECTOR_VADDR		0xB003A340
-#define XCHAL_USER_VECTOR_PADDR		0xB003A340
+#define XCHAL_USER_VECTOR_VADDR		0xBEFE0B40
+#define XCHAL_USER_VECTOR_PADDR		0xBEFE0B40
 #define XCHAL_KERNEL_VECOFS		0x00000300
-#define XCHAL_KERNEL_VECTOR_VADDR	0xB003A300
-#define XCHAL_KERNEL_VECTOR_PADDR	0xB003A300
+#define XCHAL_KERNEL_VECTOR_VADDR	0xBEFE0B00
+#define XCHAL_KERNEL_VECTOR_PADDR	0xBEFE0B00
 #define XCHAL_DOUBLEEXC_VECOFS		0x000003C0
-#define XCHAL_DOUBLEEXC_VECTOR_VADDR	0xB003A3C0
-#define XCHAL_DOUBLEEXC_VECTOR_PADDR	0xB003A3C0
+#define XCHAL_DOUBLEEXC_VECTOR_VADDR	0xBEFE0BC0
+#define XCHAL_DOUBLEEXC_VECTOR_PADDR	0xBEFE0BC0
 #define XCHAL_WINDOW_OF4_VECOFS		0x00000000
 #define XCHAL_WINDOW_UF4_VECOFS		0x00000040
 #define XCHAL_WINDOW_OF8_VECOFS		0x00000080
 #define XCHAL_WINDOW_UF8_VECOFS		0x000000C0
 #define XCHAL_WINDOW_OF12_VECOFS	0x00000100
 #define XCHAL_WINDOW_UF12_VECOFS	0x00000140
-#define XCHAL_WINDOW_VECTORS_VADDR	0xB003A000
-#define XCHAL_WINDOW_VECTORS_PADDR	0xB003A000
+#define XCHAL_WINDOW_VECTORS_VADDR	0xBEFE0800
+#define XCHAL_WINDOW_VECTORS_PADDR	0xBEFE0800
 #define XCHAL_INTLEVEL2_VECOFS		0x00000180
-#define XCHAL_INTLEVEL2_VECTOR_VADDR	0xB003A180
-#define XCHAL_INTLEVEL2_VECTOR_PADDR	0xB003A180
+#define XCHAL_INTLEVEL2_VECTOR_VADDR	0xBEFE0980
+#define XCHAL_INTLEVEL2_VECTOR_PADDR	0xBEFE0980
 #define XCHAL_INTLEVEL3_VECOFS		0x000001C0
-#define XCHAL_INTLEVEL3_VECTOR_VADDR	0xB003A1C0
-#define XCHAL_INTLEVEL3_VECTOR_PADDR	0xB003A1C0
+#define XCHAL_INTLEVEL3_VECTOR_VADDR	0xBEFE09C0
+#define XCHAL_INTLEVEL3_VECTOR_PADDR	0xBEFE09C0
 #define XCHAL_INTLEVEL4_VECOFS		0x00000200
-#define XCHAL_INTLEVEL4_VECTOR_VADDR	0xB003A200
-#define XCHAL_INTLEVEL4_VECTOR_PADDR	0xB003A200
+#define XCHAL_INTLEVEL4_VECTOR_VADDR	0xBEFE0A00
+#define XCHAL_INTLEVEL4_VECTOR_PADDR	0xBEFE0A00
 #define XCHAL_INTLEVEL5_VECOFS		0x00000240
-#define XCHAL_INTLEVEL5_VECTOR_VADDR	0xB003A240
-#define XCHAL_INTLEVEL5_VECTOR_PADDR	0xB003A240
+#define XCHAL_INTLEVEL5_VECTOR_VADDR	0xBEFE0A40
+#define XCHAL_INTLEVEL5_VECTOR_PADDR	0xBEFE0A40
 #define XCHAL_INTLEVEL6_VECOFS		0x00000280
-#define XCHAL_INTLEVEL6_VECTOR_VADDR	0xB003A280
-#define XCHAL_INTLEVEL6_VECTOR_PADDR	0xB003A280
+#define XCHAL_INTLEVEL6_VECTOR_VADDR	0xBEFE0A80
+#define XCHAL_INTLEVEL6_VECTOR_PADDR	0xBEFE0A80
 #define XCHAL_DEBUG_VECOFS		XCHAL_INTLEVEL6_VECOFS
 #define XCHAL_DEBUG_VECTOR_VADDR	XCHAL_INTLEVEL6_VECTOR_VADDR
 #define XCHAL_DEBUG_VECTOR_PADDR	XCHAL_INTLEVEL6_VECTOR_PADDR
 #define XCHAL_NMI_VECOFS		0x000002C0
-#define XCHAL_NMI_VECTOR_VADDR		0xB003A2C0
-#define XCHAL_NMI_VECTOR_PADDR		0xB003A2C0
+#define XCHAL_NMI_VECTOR_VADDR		0xBEFE0AC0
+#define XCHAL_NMI_VECTOR_PADDR		0xBEFE0AC0
 #define XCHAL_INTLEVEL7_VECOFS		XCHAL_NMI_VECOFS
 #define XCHAL_INTLEVEL7_VECTOR_VADDR	XCHAL_NMI_VECTOR_VADDR
 #define XCHAL_INTLEVEL7_VECTOR_PADDR	XCHAL_NMI_VECTOR_PADDR
@@ -555,3 +557,9 @@
 
 
 #endif /* _XTENSA_CORE_CONFIGURATION_H */
+
+#else
+
+#error "xcc should not use this header"
+
+#endif /* __XCC__ */
diff --git a/src/platform/apollolake/include/xtensa/config/core-matmap.h b/src/platform/cannonlake/include/arch/xtensa/config/core-matmap.h
similarity index 99%
rename from src/platform/apollolake/include/xtensa/config/core-matmap.h
rename to src/platform/cannonlake/include/arch/xtensa/config/core-matmap.h
index c4f479a..ad0f0d7 100644
--- a/src/platform/apollolake/include/xtensa/config/core-matmap.h
+++ b/src/platform/cannonlake/include/arch/xtensa/config/core-matmap.h
@@ -43,6 +43,7 @@
    TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
    SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.  */
 
+#if !defined __XCC__
 
 #ifndef XTENSA_CONFIG_CORE_MATMAP_H
 #define XTENSA_CONFIG_CORE_MATMAP_H
@@ -311,3 +312,9 @@
 
 
 #endif /*XTENSA_CONFIG_CORE_MATMAP_H*/
+
+#else
+
+#error "xcc should not use this header"
+
+#endif /* __XCC__ */
diff --git a/src/platform/haswell/include/xtensa/config/defs.h b/src/platform/cannonlake/include/arch/xtensa/config/defs.h
similarity index 94%
rename from src/platform/haswell/include/xtensa/config/defs.h
rename to src/platform/cannonlake/include/arch/xtensa/config/defs.h
index b695e59..c2ef1d9 100644
--- a/src/platform/haswell/include/xtensa/config/defs.h
+++ b/src/platform/cannonlake/include/arch/xtensa/config/defs.h
@@ -25,6 +25,8 @@
    and earlier Xtensa releases.  It includes only a subset of the
    available header files.  */
 
+#if !defined __XCC__
+
 #ifndef _XTENSA_BASE_HEADER
 #define _XTENSA_BASE_HEADER
 
@@ -36,3 +38,9 @@
 
 #endif /* __XTENSA__ */
 #endif /* !_XTENSA_BASE_HEADER */
+
+#else
+
+#error "xcc should not use this header"
+
+#endif /* __XCC__ */
diff --git a/src/platform/apollolake/include/xtensa/config/specreg.h b/src/platform/cannonlake/include/arch/xtensa/config/specreg.h
similarity index 96%
rename from src/platform/apollolake/include/xtensa/config/specreg.h
rename to src/platform/cannonlake/include/arch/xtensa/config/specreg.h
index 96bfa94..c99cda6 100644
--- a/src/platform/apollolake/include/xtensa/config/specreg.h
+++ b/src/platform/cannonlake/include/arch/xtensa/config/specreg.h
@@ -25,6 +25,8 @@
    TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
    SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.  */
 
+#if !defined __XCC__
+
 #ifndef XTENSA_SPECREG_H
 #define XTENSA_SPECREG_H
 
@@ -104,3 +106,9 @@
 #define INTCLEAR	227
 
 #endif /* XTENSA_SPECREG_H */
+
+#else
+
+#error "xcc should not use this header"
+
+#endif /* __XCC__ */
diff --git a/src/platform/cannonlake/include/xtensa/config/system.h b/src/platform/cannonlake/include/arch/xtensa/config/system.h
similarity index 99%
rename from src/platform/cannonlake/include/xtensa/config/system.h
rename to src/platform/cannonlake/include/arch/xtensa/config/system.h
index aad1d8c..f1fd8a0 100644
--- a/src/platform/cannonlake/include/xtensa/config/system.h
+++ b/src/platform/cannonlake/include/arch/xtensa/config/system.h
@@ -31,6 +31,7 @@
    TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
    SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.  */
 
+#if !defined __XCC__
 
 #ifndef XTENSA_CONFIG_SYSTEM_H
 #define XTENSA_CONFIG_SYSTEM_H
@@ -269,3 +270,9 @@
 
 
 #endif /*XTENSA_CONFIG_SYSTEM_H*/
+
+#else
+
+#error "xcc should not use this header"
+
+#endif /* __XCC__ */
diff --git a/src/platform/cannonlake/include/xtensa/config/tie-asm.h b/src/platform/cannonlake/include/arch/xtensa/config/tie-asm.h
similarity index 99%
rename from src/platform/cannonlake/include/xtensa/config/tie-asm.h
rename to src/platform/cannonlake/include/arch/xtensa/config/tie-asm.h
index 15f6e89..706545a 100644
--- a/src/platform/cannonlake/include/xtensa/config/tie-asm.h
+++ b/src/platform/cannonlake/include/arch/xtensa/config/tie-asm.h
@@ -29,6 +29,8 @@
    TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
    SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.  */
 
+#if !defined __XCC__
+
 #ifndef _XTENSA_CORE_TIE_ASM_H
 #define _XTENSA_CORE_TIE_ASM_H
 
@@ -237,3 +239,9 @@
 	.macro xchal_cp7_load	p a b c d continue=0 ofs=-1 select=-1 ; .endm
 
 #endif /*_XTENSA_CORE_TIE_ASM_H*/
+
+#else
+
+#error "xcc should not use this header"
+
+#endif /* __XCC__ */
diff --git a/src/platform/apollolake/include/xtensa/config/tie.h b/src/platform/cannonlake/include/arch/xtensa/config/tie.h
similarity index 98%
rename from src/platform/apollolake/include/xtensa/config/tie.h
rename to src/platform/cannonlake/include/arch/xtensa/config/tie.h
index d47e427..b5fd4c9 100644
--- a/src/platform/apollolake/include/xtensa/config/tie.h
+++ b/src/platform/cannonlake/include/arch/xtensa/config/tie.h
@@ -29,6 +29,8 @@
    TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
    SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.  */
 
+#if !defined __XCC__
+
 #ifndef _XTENSA_CORE_TIE_H
 #define _XTENSA_CORE_TIE_H
 
@@ -167,3 +169,9 @@
 	3,3,3,3,3,3,3,3,2,2,2,2,2,2,3,8, 3,3,3,3,3,3,3,3,2,2,2,2,2,2,3,8
 
 #endif /*_XTENSA_CORE_TIE_H*/
+
+#else
+
+#error "xcc should not use this header"
+
+#endif /* __XCC__ */
diff --git a/src/platform/cannonlake/include/platform/memory.h b/src/platform/cannonlake/include/platform/memory.h
index 244dd25..85e7996 100644
--- a/src/platform/cannonlake/include/platform/memory.h
+++ b/src/platform/cannonlake/include/platform/memory.h
@@ -127,12 +127,6 @@
 #define ROM_BASE		0xBEFE0000
 #define ROM_SIZE		0x00002000
 
-#define TEXT_BASE		0xb0039000
-#define TEXT_LENGTH		0xB000
-#define DATA_BASE		0xb0044000
-#define DATA_LENGTH		0x4000
-
-
 /*
  * The HP SRAM Region on Cannonlake is organised like this :-
  * +--------------------------------------------------------------------------+
@@ -167,6 +161,7 @@
  */
 
 /* HP SRAM */
+#define SRAM_ALIAS_OFFSET	0x20000000
 #define HP_SRAM_BASE		0xBE000000
 #define HP_SRAM_SIZE		0x002F0000
 
@@ -183,9 +178,6 @@
 #define HEAP_RT_COUNT512		8
 #define HEAP_RT_COUNT1024		4
 
-/* text and data share the same L2 SRAM on Cannonlake */
-#define SOF_TEXT_START		0xBE040400
-#define SOF_TEXT_START_SIZE		0x40
 #define L2_VECTOR_SIZE		0x1000
 
 /* HP SRAM windows */
@@ -236,8 +228,10 @@
 #define HEAP_HP_BUFFER_COUNT \
 			(HEAP_HP_BUFFER_SIZE / HEAP_HP_BUFFER_BLOCK_SIZE)
 
-#define SOF_TEXT_BASE		(SOF_TEXT_START + SOF_TEXT_START_SIZE)
-#define SOF_TEXT_SIZE		0x18000
+/* text and data share the same HP L2 SRAM on Cannonlake */
+#define SOF_TEXT_START		0xBE040400
+#define SOF_TEXT_BASE		(SOF_TEXT_START)
+#define SOF_TEXT_SIZE		(0x18000 - 0x400)
 
 /* initialized data */
 #if defined CONFIG_DMIC
@@ -339,7 +333,8 @@
 #define SOF_LP_STACK_END			(SOF_LP_STACK_BASE - SOF_LP_STACK_SIZE)
 
 
-/* Vector and literal sizes - not in core-isa.h */
+/* Vector and literal sizes - do not use core-isa.h */
+#define SOF_MEM_VECBASE			HP_SRAM_VECBASE_RESET
 #define SOF_MEM_VECT_LIT_SIZE		0x8
 #define SOF_MEM_VECT_TEXT_SIZE		0x38
 #define SOF_MEM_VECT_SIZE		(SOF_MEM_VECT_TEXT_SIZE + SOF_MEM_VECT_LIT_SIZE)
@@ -354,19 +349,18 @@
 #define SOF_MEM_RO_SIZE			0x8
 
 /* boot loader in IMR */
+#define IMR_BOOT_LDR_MANIFEST_BASE	0xB0032000
+#define IMR_BOOT_LDR_MANIFEST_SIZE	0x6000
+
 #define IMR_BOOT_LDR_TEXT_ENTRY_BASE	0xB0038000
-#define IMR_BOOT_LDR_TEXT_ENTRY_SIZE	0x40
+#define IMR_BOOT_LDR_TEXT_ENTRY_SIZE	0x66
 #define IMR_BOOT_LDR_LIT_BASE		(IMR_BOOT_LDR_TEXT_ENTRY_BASE + IMR_BOOT_LDR_TEXT_ENTRY_SIZE)
-#define IMR_BOOT_LDR_LIT_SIZE		0x70
+#define IMR_BOOT_LDR_LIT_SIZE		0x20
 #define IMR_BOOT_LDR_TEXT_BASE		(IMR_BOOT_LDR_LIT_BASE + IMR_BOOT_LDR_LIT_SIZE)
 #define IMR_BOOT_LDR_TEXT_SIZE		0x1C00
-#define IMR_BOOT_LDR_TEXT1_BASE		(IMR_BOOT_LDR_TEXT_BASE + IMR_BOOT_LDR_TEXT_SIZE)
-#define IMR_BOOT_LDR_TEXT1_SIZE		0x2000
-#define IMR_BOOT_LDR_DATA_BASE		0xB0002000
+#define IMR_BOOT_LDR_DATA_BASE		0xB0039000
 #define IMR_BOOT_LDR_DATA_SIZE		0x1000
 #define IMR_BOOT_LDR_BSS_BASE		0xB0100000
 #define IMR_BOOT_LDR_BSS_SIZE		0x10000
-#define IMR_BOOT_LDR_MANIFEST_BASE	0xB0032000
-#define IMR_BOOT_LDR_MANIFEST_SIZE	0x6000
 
 #endif
diff --git a/src/platform/cannonlake/include/platform/platcfg.h b/src/platform/cannonlake/include/platform/platcfg.h
new file mode 100644
index 0000000..f51ee4f
--- /dev/null
+++ b/src/platform/cannonlake/include/platform/platcfg.h
@@ -0,0 +1,36 @@
+/*
+ * Copyright (c) 2018, Intel Corporation
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *   * Redistributions of source code must retain the above copyright
+ *     notice, this list of conditions and the following disclaimer.
+ *   * Redistributions in binary form must reproduce the above copyright
+ *     notice, this list of conditions and the following disclaimer in the
+ *     documentation and/or other materials provided with the distribution.
+ *   * Neither the name of the Intel Corporation nor the
+ *     names of its contributors may be used to endorse or promote products
+ *     derived from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ *
+ * Author: Liam Girdwood <liam.r.girdwood at linux.intel.com>
+ */
+
+#ifndef __PLATFORM_PLATCFG_H__
+#define __PLATFORM_PLATCFG_H__
+
+#define PLATFORM_RESET_MHE_AT_BOOT	1
+
+#endif
diff --git a/src/platform/cannonlake/include/platform/platform.h b/src/platform/cannonlake/include/platform/platform.h
index 35219d7..88614ab 100644
--- a/src/platform/cannonlake/include/platform/platform.h
+++ b/src/platform/cannonlake/include/platform/platform.h
@@ -34,6 +34,7 @@
 #ifndef __PLATFORM_PLATFORM_H__
 #define __PLATFORM_PLATFORM_H__
 
+#include <platform/platcfg.h>
 #include <platform/shim.h>
 #include <platform/interrupt.h>
 #include <uapi/ipc.h>
diff --git a/src/platform/cannonlake/include/platform/shim.h b/src/platform/cannonlake/include/platform/shim.h
index 6654335..82281f8 100644
--- a/src/platform/cannonlake/include/platform/shim.h
+++ b/src/platform/cannonlake/include/platform/shim.h
@@ -232,12 +232,14 @@ static inline void shim_write64(uint32_t reg, uint64_t val)
 
 static inline uint32_t sw_reg_read(uint32_t reg)
 {
-	return *((volatile uint32_t*)(SRAM_SW_REG_BASE + reg));
+	return *((volatile uint32_t*)((SRAM_SW_REG_BASE -
+		SRAM_ALIAS_OFFSET) + reg));
 }
 
 static inline void sw_reg_write(uint32_t reg, uint32_t val)
 {
-	*((volatile uint32_t*)(SRAM_SW_REG_BASE + reg)) = val;
+	*((volatile uint32_t*)((SRAM_SW_REG_BASE -
+		SRAM_ALIAS_OFFSET) + reg)) = val;
 }
 
 static inline uint32_t mn_reg_read(uint32_t reg)
diff --git a/src/platform/cannonlake/include/xtensa/config/core-isa.h b/src/platform/cannonlake/include/xtensa/config/core-isa.h
deleted file mode 100644
index bfad40c..0000000
--- a/src/platform/cannonlake/include/xtensa/config/core-isa.h
+++ /dev/null
@@ -1,557 +0,0 @@
-/*
- * xtensa/config/core-isa.h -- HAL definitions that are dependent on Xtensa
- *				processor CORE configuration
- *
- *  See <xtensa/config/core.h>, which includes this file, for more details.
- */
-
-/* Xtensa processor core configuration information.
-
-   Customer ID=10631; Build=0x60f88; Copyright (c) 1999-2016 Tensilica Inc.
-
-   Permission is hereby granted, free of charge, to any person obtaining
-   a copy of this software and associated documentation files (the
-   "Software"), to deal in the Software without restriction, including
-   without limitation the rights to use, copy, modify, merge, publish,
-   distribute, sublicense, and/or sell copies of the Software, and to
-   permit persons to whom the Software is furnished to do so, subject to
-   the following conditions:
-
-   The above copyright notice and this permission notice shall be included
-   in all copies or substantial portions of the Software.
-
-   THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
-   EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
-   MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
-   IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
-   CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
-   TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
-   SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.  */
-
-#ifndef _XTENSA_CORE_CONFIGURATION_H
-#define _XTENSA_CORE_CONFIGURATION_H
-
-
-/****************************************************************************
-	    Parameters Useful for Any Code, USER or PRIVILEGED
- ****************************************************************************/
-
-/*
- *  Note:  Macros of the form XCHAL_HAVE_*** have a value of 1 if the option is
- *  configured, and a value of 0 otherwise.  These macros are always defined.
- */
-
-
-/*----------------------------------------------------------------------
-				ISA
-  ----------------------------------------------------------------------*/
-
-#define XCHAL_HAVE_BE			0	/* big-endian byte ordering */
-#define XCHAL_HAVE_WINDOWED		1	/* windowed registers option */
-#define XCHAL_NUM_AREGS			64	/* num of physical addr regs */
-#define XCHAL_NUM_AREGS_LOG2		6	/* log2(XCHAL_NUM_AREGS) */
-#define XCHAL_MAX_INSTRUCTION_SIZE	8	/* max instr bytes (3..8) */
-#define XCHAL_HAVE_DEBUG		1	/* debug option */
-#define XCHAL_HAVE_DENSITY		1	/* 16-bit instructions */
-#define XCHAL_HAVE_LOOPS		1	/* zero-overhead loops */
-#define XCHAL_LOOP_BUFFER_SIZE		64	/* zero-ov. loop instr buffer size */
-#define XCHAL_HAVE_NSA			1	/* NSA/NSAU instructions */
-#define XCHAL_HAVE_MINMAX		1	/* MIN/MAX instructions */
-#define XCHAL_HAVE_SEXT			1	/* SEXT instruction */
-#define XCHAL_HAVE_DEPBITS		0	/* DEPBITS instruction */
-#define XCHAL_HAVE_CLAMPS		1	/* CLAMPS instruction */
-#define XCHAL_HAVE_MUL16		1	/* MUL16S/MUL16U instructions */
-#define XCHAL_HAVE_MUL32		1	/* MULL instruction */
-#define XCHAL_HAVE_MUL32_HIGH		1	/* MULUH/MULSH instructions */
-#define XCHAL_HAVE_DIV32		1	/* QUOS/QUOU/REMS/REMU instructions */
-#define XCHAL_HAVE_L32R			1	/* L32R instruction */
-#define XCHAL_HAVE_ABSOLUTE_LITERALS	0	/* non-PC-rel (extended) L32R */
-#define XCHAL_HAVE_CONST16		0	/* CONST16 instruction */
-#define XCHAL_HAVE_ADDX			1	/* ADDX#/SUBX# instructions */
-#define XCHAL_HAVE_WIDE_BRANCHES	0	/* B*.W18 or B*.W15 instr's */
-#define XCHAL_HAVE_PREDICTED_BRANCHES	0	/* B[EQ/EQZ/NE/NEZ]T instr's */
-#define XCHAL_HAVE_CALL4AND12		1	/* (obsolete option) */
-#define XCHAL_HAVE_ABS			1	/* ABS instruction */
-/*#define XCHAL_HAVE_POPC		0*/	/* POPC instruction */
-/*#define XCHAL_HAVE_CRC		0*/	/* CRC instruction */
-#define XCHAL_HAVE_RELEASE_SYNC		1	/* L32AI/S32RI instructions */
-#define XCHAL_HAVE_S32C1I		1	/* S32C1I instruction */
-#define XCHAL_HAVE_SPECULATION		0	/* speculation */
-#define XCHAL_HAVE_FULL_RESET		1	/* all regs/state reset */
-#define XCHAL_NUM_CONTEXTS		1	/* */
-#define XCHAL_NUM_MISC_REGS		0	/* num of scratch regs (0..4) */
-#define XCHAL_HAVE_TAP_MASTER		0	/* JTAG TAP control instr's */
-#define XCHAL_HAVE_PRID			1	/* processor ID register */
-#define XCHAL_HAVE_EXTERN_REGS		1	/* WER/RER instructions */
-#define XCHAL_HAVE_MX			0	/* MX core (Tensilica internal) */
-#define XCHAL_HAVE_MP_INTERRUPTS	0	/* interrupt distributor port */
-#define XCHAL_HAVE_MP_RUNSTALL		0	/* core RunStall control port */
-#define XCHAL_HAVE_PSO			0	/* Power Shut-Off */
-#define XCHAL_HAVE_PSO_CDM		0	/* core/debug/mem pwr domains */
-#define XCHAL_HAVE_PSO_FULL_RETENTION	0	/* all regs preserved on PSO */
-#define XCHAL_HAVE_THREADPTR		1	/* THREADPTR register */
-#define XCHAL_HAVE_BOOLEANS		1	/* boolean registers */
-/* TODO: CP is 1 - need assembler support */
-#define XCHAL_HAVE_CP			0	/* CPENABLE reg (coprocessor) */
-#define XCHAL_CP_MAXCFG			2	/* max allowed cp id plus one */
-#define XCHAL_HAVE_MAC16		0	/* MAC16 package */
-
-#define XCHAL_HAVE_FUSION		 0	/* Fusion*/
-#define XCHAL_HAVE_FUSION_FP	 0	        /* Fusion FP option */
-#define XCHAL_HAVE_FUSION_LOW_POWER 0	/* Fusion Low Power option */
-#define XCHAL_HAVE_FUSION_AES	 0	        /* Fusion BLE/Wifi AES-128 CCM option */
-#define XCHAL_HAVE_FUSION_CONVENC	 0       /* Fusion Conv Encode option */
-#define XCHAL_HAVE_FUSION_LFSR_CRC	 0	/* Fusion LFSR-CRC option */
-#define XCHAL_HAVE_FUSION_BITOPS	 0	/* Fusion Bit Operations Support option */
-#define XCHAL_HAVE_FUSION_AVS	 0	/* Fusion AVS option */
-#define XCHAL_HAVE_FUSION_16BIT_BASEBAND	 0	/* Fusion 16-bit Baseband option */
-#define XCHAL_HAVE_FUSION_VITERBI        0     /* Fusion Viterbi option */
-#define XCHAL_HAVE_FUSION_SOFTDEMAP      0   /* Fusion Soft Bit Demap option */
-#define XCHAL_HAVE_HIFIPRO		0	/* HiFiPro Audio Engine pkg */
-#define XCHAL_HAVE_HIFI4		0	/* HiFi4 Audio Engine pkg */
-#define XCHAL_HAVE_HIFI4_VFPU		0	/* HiFi4 Audio Engine VFPU option */
-#define XCHAL_HAVE_HIFI3		1	/* HiFi3 Audio Engine pkg */
-#define XCHAL_HAVE_HIFI3_VFPU		0	/* HiFi3 Audio Engine VFPU option */
-#define XCHAL_HAVE_HIFI2		0	/* HiFi2 Audio Engine pkg */
-#define XCHAL_HAVE_HIFI2EP		0	/* HiFi2EP */
-#define XCHAL_HAVE_HIFI_MINI		0
-
-
-#define XCHAL_HAVE_VECTORFPU2005	0	/* vector or user floating-point pkg */
-#define XCHAL_HAVE_USER_DPFPU         0       /* user DP floating-point pkg */
-#define XCHAL_HAVE_USER_SPFPU         0       /* user DP floating-point pkg */
-#define XCHAL_HAVE_FP                 1      /* single prec floating point */
-#define XCHAL_HAVE_FP_DIV             1  /* FP with DIV instructions */
-#define XCHAL_HAVE_FP_RECIP           1        /* FP with RECIP instructions */
-#define XCHAL_HAVE_FP_SQRT            1 /* FP with SQRT instructions */
-#define XCHAL_HAVE_FP_RSQRT           1        /* FP with RSQRT instructions */
-#define XCHAL_HAVE_DFP                        0     /* double precision FP pkg */
-#define XCHAL_HAVE_DFP_DIV            0 /* DFP with DIV instructions */
-#define XCHAL_HAVE_DFP_RECIP          0       /* DFP with RECIP instructions*/
-#define XCHAL_HAVE_DFP_SQRT           0        /* DFP with SQRT instructions */
-#define XCHAL_HAVE_DFP_RSQRT          0       /* DFP with RSQRT instructions*/
-#define XCHAL_HAVE_DFP_ACCEL		0	/* double precision FP acceleration pkg */
-#define XCHAL_HAVE_DFP_accel		XCHAL_HAVE_DFP_ACCEL				/* for backward compatibility */
-
-#define XCHAL_HAVE_DFPU_SINGLE_ONLY    1			/* DFPU Coprocessor, single precision only */
-#define XCHAL_HAVE_DFPU_SINGLE_DOUBLE  0		/* DFPU Coprocessor, single and double precision */
-#define XCHAL_HAVE_VECTRA1		0	/* Vectra I  pkg */
-#define XCHAL_HAVE_VECTRALX		0	/* Vectra LX pkg */
-#define XCHAL_HAVE_PDX4		        0	/* PDX4 */
-#define XCHAL_HAVE_CONNXD2		0	/* ConnX D2 pkg */
-#define XCHAL_HAVE_CONNXD2_DUALLSFLIX   0	/* ConnX D2 & Dual LoadStore Flix */
-#define XCHAL_HAVE_BBE16		0	/* ConnX BBE16 pkg */
-#define XCHAL_HAVE_BBE16_RSQRT		0	/* BBE16 & vector recip sqrt */
-#define XCHAL_HAVE_BBE16_VECDIV		0	/* BBE16 & vector divide */
-#define XCHAL_HAVE_BBE16_DESPREAD	0	/* BBE16 & despread */
-#define XCHAL_HAVE_BBENEP		0	/* ConnX BBENEP pkgs */
-#define XCHAL_HAVE_BSP3			0	/* ConnX BSP3 pkg */
-#define XCHAL_HAVE_BSP3_TRANSPOSE	0	/* BSP3 & transpose32x32 */
-#define XCHAL_HAVE_SSP16		0	/* ConnX SSP16 pkg */
-#define XCHAL_HAVE_SSP16_VITERBI	0	/* SSP16 & viterbi */
-#define XCHAL_HAVE_TURBO16		0	/* ConnX Turbo16 pkg */
-#define XCHAL_HAVE_BBP16		0	/* ConnX BBP16 pkg */
-#define XCHAL_HAVE_FLIX3		0	/* basic 3-way FLIX option */
-#define XCHAL_HAVE_GRIVPEP              0   /*  GRIVPEP is General Release of IVPEP */
-#define XCHAL_HAVE_GRIVPEP_HISTOGRAM    0   /* Histogram option on GRIVPEP */
-
-
-/*----------------------------------------------------------------------
-				MISC
-  ----------------------------------------------------------------------*/
-
-#define XCHAL_NUM_LOADSTORE_UNITS	1	/* load/store units */
-#define XCHAL_NUM_WRITEBUFFER_ENTRIES	16	/* size of write buffer */
-#define XCHAL_INST_FETCH_WIDTH		8	/* instr-fetch width in bytes */
-#define XCHAL_DATA_WIDTH		8	/* data width in bytes */
-#define XCHAL_DATA_PIPE_DELAY		2	/* d-side pipeline delay
-						   (1 = 5-stage, 2 = 7-stage) */
-#define XCHAL_CLOCK_GATING_GLOBAL	1	/* global clock gating */
-#define XCHAL_CLOCK_GATING_FUNCUNIT	1	/* funct. unit clock gating */
-/*  In T1050, applies to selected core load and store instructions (see ISA): */
-#define XCHAL_UNALIGNED_LOAD_EXCEPTION	1	/* unaligned loads cause exc. */
-#define XCHAL_UNALIGNED_STORE_EXCEPTION	1	/* unaligned stores cause exc.*/
-#define XCHAL_UNALIGNED_LOAD_HW		0	/* unaligned loads work in hw */
-#define XCHAL_UNALIGNED_STORE_HW	0	/* unaligned stores work in hw*/
-
-#define XCHAL_SW_VERSION		1100003	/* sw version of this header */
-
-#define XCHAL_CORE_ID			"cavs21_LX6HiFi3_RF3_WB16"	/* alphanum core name
-						   (CoreID) set in the Xtensa
-						   Processor Generator */
-
-#define XCHAL_BUILD_UNIQUE_ID		0x00060F88	/* 22-bit sw build ID */
-
-/*
- *  These definitions describe the hardware targeted by this software.
- */
-#define XCHAL_HW_CONFIGID0		0xC2F3FBFE	/* ConfigID hi 32 bits*/
-#define XCHAL_HW_CONFIGID1		0x1CC60F88	/* ConfigID lo 32 bits*/
-#define XCHAL_HW_VERSION_NAME		"LX6.0.3"	/* full version name */
-#define XCHAL_HW_VERSION_MAJOR		2600	/* major ver# of targeted hw */
-#define XCHAL_HW_VERSION_MINOR		3	/* minor ver# of targeted hw */
-#define XCHAL_HW_VERSION		260003	/* major*100+minor */
-#define XCHAL_HW_REL_LX6		1
-#define XCHAL_HW_REL_LX6_0		1
-#define XCHAL_HW_REL_LX6_0_3		1
-#define XCHAL_HW_CONFIGID_RELIABLE	1
-/*  If software targets a *range* of hardware versions, these are the bounds: */
-#define XCHAL_HW_MIN_VERSION_MAJOR	2600	/* major v of earliest tgt hw */
-#define XCHAL_HW_MIN_VERSION_MINOR	3	/* minor v of earliest tgt hw */
-#define XCHAL_HW_MIN_VERSION		260003	/* earliest targeted hw */
-#define XCHAL_HW_MAX_VERSION_MAJOR	2600	/* major v of latest tgt hw */
-#define XCHAL_HW_MAX_VERSION_MINOR	3	/* minor v of latest tgt hw */
-#define XCHAL_HW_MAX_VERSION		260003	/* latest targeted hw */
-
-
-/*----------------------------------------------------------------------
-				CACHE
-  ----------------------------------------------------------------------*/
-
-#define XCHAL_ICACHE_LINESIZE		64	/* I-cache line size in bytes */
-#define XCHAL_DCACHE_LINESIZE		64	/* D-cache line size in bytes */
-#define XCHAL_ICACHE_LINEWIDTH		6	/* log2(I line size in bytes) */
-#define XCHAL_DCACHE_LINEWIDTH		6	/* log2(D line size in bytes) */
-
-#define XCHAL_ICACHE_SIZE		16384	/* I-cache size in bytes or 0 */
-#define XCHAL_DCACHE_SIZE		49152	/* D-cache size in bytes or 0 */
-
-#define XCHAL_DCACHE_IS_WRITEBACK	1	/* writeback feature */
-#define XCHAL_DCACHE_IS_COHERENT	0	/* MP coherence feature */
-
-#define XCHAL_HAVE_PREFETCH		1	/* PREFCTL register */
-#define XCHAL_HAVE_PREFETCH_L1		1	/* prefetch to L1 dcache */
-#define XCHAL_PREFETCH_CASTOUT_LINES	2	/* dcache pref. castout bufsz */
-#define XCHAL_PREFETCH_ENTRIES		8	/* cache prefetch entries */
-#define XCHAL_PREFETCH_BLOCK_ENTRIES	0	/* prefetch block streams */
-#define XCHAL_HAVE_CACHE_BLOCKOPS	0	/* block prefetch for caches */
-#define XCHAL_HAVE_ICACHE_TEST		1	/* Icache test instructions */
-#define XCHAL_HAVE_DCACHE_TEST		1	/* Dcache test instructions */
-#define XCHAL_HAVE_ICACHE_DYN_WAYS	1	/* Icache dynamic way support */
-#define XCHAL_HAVE_DCACHE_DYN_WAYS	1	/* Dcache dynamic way support */
-
-
-
-
-/****************************************************************************
-    Parameters Useful for PRIVILEGED (Supervisory or Non-Virtualized) Code
- ****************************************************************************/
-
-
-#ifndef XTENSA_HAL_NON_PRIVILEGED_ONLY
-
-/*----------------------------------------------------------------------
-				CACHE
-  ----------------------------------------------------------------------*/
-
-#define XCHAL_HAVE_PIF			1	/* any outbound PIF present */
-#define XCHAL_HAVE_AXI			0	/* AXI bus */
-
-#define XCHAL_HAVE_PIF_WR_RESP			0	/* pif write response */
-#define XCHAL_HAVE_PIF_REQ_ATTR			1	/* pif attribute */
-
-/*  If present, cache size in bytes == (ways * 2^(linewidth + setwidth)).  */
-
-/*  Number of cache sets in log2(lines per way):  */
-#define XCHAL_ICACHE_SETWIDTH		6
-#define XCHAL_DCACHE_SETWIDTH		8
-
-/*  Cache set associativity (number of ways):  */
-#define XCHAL_ICACHE_WAYS		4
-#define XCHAL_DCACHE_WAYS		3
-
-/*  Cache features:  */
-#define XCHAL_ICACHE_LINE_LOCKABLE	1
-#define XCHAL_DCACHE_LINE_LOCKABLE	1
-#define XCHAL_ICACHE_ECC_PARITY		XTHAL_MEMEP_ECC
-#define XCHAL_DCACHE_ECC_PARITY		XTHAL_MEMEP_ECC
-
-/*  Cache access size in bytes (affects operation of SICW instruction):  */
-#define XCHAL_ICACHE_ACCESS_SIZE	8
-#define XCHAL_DCACHE_ACCESS_SIZE	8
-
-#define XCHAL_DCACHE_BANKS		1	/* number of banks */
-
-/*  Number of encoded cache attr bits (see <xtensa/hal.h> for decoded bits):  */
-#define XCHAL_CA_BITS			4
-
-
-/*----------------------------------------------------------------------
-			INTERNAL I/D RAM/ROMs and XLMI
-  ----------------------------------------------------------------------*/
-
-#define XCHAL_NUM_INSTROM		0	/* number of core instr. ROMs */
-#define XCHAL_NUM_INSTRAM		0	/* number of core instr. RAMs */
-#define XCHAL_NUM_DATAROM		0	/* number of core data ROMs */
-#define XCHAL_NUM_DATARAM		0	/* number of core data RAMs */
-#define XCHAL_NUM_URAM			0	/* number of core unified RAMs*/
-#define XCHAL_NUM_XLMI			0	/* number of core XLMI ports */
-
-#define XCHAL_HAVE_IMEM_LOADSTORE	1	/* can load/store to IROM/IRAM*/
-
-
-/*----------------------------------------------------------------------
-			INTERRUPTS and TIMERS
-  ----------------------------------------------------------------------*/
-
-#define XCHAL_HAVE_INTERRUPTS		1	/* interrupt option */
-#define XCHAL_HAVE_HIGHPRI_INTERRUPTS	1	/* med/high-pri. interrupts */
-#define XCHAL_HAVE_NMI			1	/* non-maskable interrupt */
-#define XCHAL_HAVE_CCOUNT		1	/* CCOUNT reg. (timer option) */
-#define XCHAL_NUM_TIMERS		3	/* number of CCOMPAREn regs */
-#define XCHAL_NUM_INTERRUPTS		21	/* number of interrupts */
-#define XCHAL_NUM_INTERRUPTS_LOG2	5	/* ceil(log2(NUM_INTERRUPTS)) */
-#define XCHAL_NUM_EXTINTERRUPTS		8	/* num of external interrupts */
-#define XCHAL_NUM_INTLEVELS		6	/* number of interrupt levels
-						   (not including level zero) */
-#define XCHAL_EXCM_LEVEL		5	/* level masked by PS.EXCM */
-	/* (always 1 in XEA1; levels 2 .. EXCM_LEVEL are "medium priority") */
-
-/*  Masks of interrupts at each interrupt level:  */
-#define XCHAL_INTLEVEL1_MASK		0x0000000F
-#define XCHAL_INTLEVEL2_MASK		0x000000F0
-#define XCHAL_INTLEVEL3_MASK		0x00000F00
-#define XCHAL_INTLEVEL4_MASK		0x00007000
-#define XCHAL_INTLEVEL5_MASK		0x000F8000
-#define XCHAL_INTLEVEL6_MASK		0x00000000
-#define XCHAL_INTLEVEL7_MASK		0x00100000
-
-/*  Masks of interrupts at each range 1..n of interrupt levels:  */
-#define XCHAL_INTLEVEL1_ANDBELOW_MASK	0x0000000F
-#define XCHAL_INTLEVEL2_ANDBELOW_MASK	0x000000FF
-#define XCHAL_INTLEVEL3_ANDBELOW_MASK	0x00000FFF
-#define XCHAL_INTLEVEL4_ANDBELOW_MASK	0x00007FFF
-#define XCHAL_INTLEVEL5_ANDBELOW_MASK	0x000FFFFF
-#define XCHAL_INTLEVEL6_ANDBELOW_MASK	0x000FFFFF
-#define XCHAL_INTLEVEL7_ANDBELOW_MASK	0x001FFFFF
-
-/*  Level of each interrupt:  */
-#define XCHAL_INT0_LEVEL		1
-#define XCHAL_INT1_LEVEL		1
-#define XCHAL_INT2_LEVEL		1
-#define XCHAL_INT3_LEVEL		1
-#define XCHAL_INT4_LEVEL		2
-#define XCHAL_INT5_LEVEL		2
-#define XCHAL_INT6_LEVEL		2
-#define XCHAL_INT7_LEVEL		2
-#define XCHAL_INT8_LEVEL		3
-#define XCHAL_INT9_LEVEL		3
-#define XCHAL_INT10_LEVEL		3
-#define XCHAL_INT11_LEVEL		3
-#define XCHAL_INT12_LEVEL		4
-#define XCHAL_INT13_LEVEL		4
-#define XCHAL_INT14_LEVEL		4
-#define XCHAL_INT15_LEVEL		5
-#define XCHAL_INT16_LEVEL		5
-#define XCHAL_INT17_LEVEL		5
-#define XCHAL_INT18_LEVEL		5
-#define XCHAL_INT19_LEVEL		5
-#define XCHAL_INT20_LEVEL		7
-#define XCHAL_DEBUGLEVEL		6	/* debug interrupt level */
-#define XCHAL_HAVE_DEBUG_EXTERN_INT	1	/* OCD external db interrupt */
-#define XCHAL_NMILEVEL			7	/* NMI "level" (for use with
-						   EXCSAVE/EPS/EPC_n, RFI n) */
-
-/*  Type of each interrupt:  */
-#define XCHAL_INT0_TYPE		XTHAL_INTTYPE_SOFTWARE
-#define XCHAL_INT1_TYPE		XTHAL_INTTYPE_TIMER
-#define XCHAL_INT2_TYPE		XTHAL_INTTYPE_EXTERN_LEVEL
-#define XCHAL_INT3_TYPE		XTHAL_INTTYPE_SOFTWARE
-#define XCHAL_INT4_TYPE		XTHAL_INTTYPE_SOFTWARE
-#define XCHAL_INT5_TYPE		XTHAL_INTTYPE_TIMER
-#define XCHAL_INT6_TYPE		XTHAL_INTTYPE_EXTERN_LEVEL
-#define XCHAL_INT7_TYPE		XTHAL_INTTYPE_SOFTWARE
-#define XCHAL_INT8_TYPE		XTHAL_INTTYPE_SOFTWARE
-#define XCHAL_INT9_TYPE		XTHAL_INTTYPE_TIMER
-#define XCHAL_INT10_TYPE	XTHAL_INTTYPE_EXTERN_LEVEL
-#define XCHAL_INT11_TYPE	XTHAL_INTTYPE_SOFTWARE
-#define XCHAL_INT12_TYPE	XTHAL_INTTYPE_SOFTWARE
-#define XCHAL_INT13_TYPE	XTHAL_INTTYPE_EXTERN_LEVEL
-#define XCHAL_INT14_TYPE	XTHAL_INTTYPE_SOFTWARE
-#define XCHAL_INT15_TYPE	XTHAL_INTTYPE_SOFTWARE
-#define XCHAL_INT16_TYPE	XTHAL_INTTYPE_EXTERN_LEVEL
-#define XCHAL_INT17_TYPE	XTHAL_INTTYPE_EXTERN_LEVEL
-#define XCHAL_INT18_TYPE	XTHAL_INTTYPE_EXTERN_LEVEL
-#define XCHAL_INT19_TYPE	XTHAL_INTTYPE_SOFTWARE
-#define XCHAL_INT20_TYPE	XTHAL_INTTYPE_NMI
-
-/*  Masks of interrupts for each type of interrupt:  */
-#define XCHAL_INTTYPE_MASK_UNCONFIGURED	0xFFE00000
-#define XCHAL_INTTYPE_MASK_SOFTWARE	0x0008D999
-#define XCHAL_INTTYPE_MASK_EXTERN_EDGE	0x00000000
-#define XCHAL_INTTYPE_MASK_EXTERN_LEVEL	0x00072444
-#define XCHAL_INTTYPE_MASK_TIMER	0x00000222
-#define XCHAL_INTTYPE_MASK_NMI		0x00100000
-#define XCHAL_INTTYPE_MASK_WRITE_ERROR	0x00000000
-#define XCHAL_INTTYPE_MASK_PROFILING	0x00000000
-
-/*  Interrupt numbers assigned to specific interrupt sources:  */
-#define XCHAL_TIMER0_INTERRUPT		1	/* CCOMPARE0 */
-#define XCHAL_TIMER1_INTERRUPT		5	/* CCOMPARE1 */
-#define XCHAL_TIMER2_INTERRUPT		9	/* CCOMPARE2 */
-#define XCHAL_TIMER3_INTERRUPT		XTHAL_TIMER_UNCONFIGURED
-#define XCHAL_NMI_INTERRUPT		20	/* non-maskable interrupt */
-
-/*  Interrupt numbers for levels at which only one interrupt is configured:  */
-#define XCHAL_INTLEVEL7_NUM		20
-/*  (There are many interrupts each at level(s) 1, 2, 3, 4, 5.)  */
-
-
-/*
- *  External interrupt mapping.
- *  These macros describe how Xtensa processor interrupt numbers
- *  (as numbered internally, eg. in INTERRUPT and INTENABLE registers)
- *  map to external BInterrupt<n> pins, for those interrupts
- *  configured as external (level-triggered, edge-triggered, or NMI).
- *  See the Xtensa processor databook for more details.
- */
-
-/*  Core interrupt numbers mapped to each EXTERNAL BInterrupt pin number:  */
-#define XCHAL_EXTINT0_NUM		2	/* (intlevel 1) */
-#define XCHAL_EXTINT1_NUM		6	/* (intlevel 2) */
-#define XCHAL_EXTINT2_NUM		10	/* (intlevel 3) */
-#define XCHAL_EXTINT3_NUM		13	/* (intlevel 4) */
-#define XCHAL_EXTINT4_NUM		16	/* (intlevel 5) */
-#define XCHAL_EXTINT5_NUM		17	/* (intlevel 5) */
-#define XCHAL_EXTINT6_NUM		18	/* (intlevel 5) */
-#define XCHAL_EXTINT7_NUM		20	/* (intlevel 7) */
-/*  EXTERNAL BInterrupt pin numbers mapped to each core interrupt number:  */
-#define XCHAL_INT2_EXTNUM		0	/* (intlevel 1) */
-#define XCHAL_INT6_EXTNUM		1	/* (intlevel 2) */
-#define XCHAL_INT10_EXTNUM		2	/* (intlevel 3) */
-#define XCHAL_INT13_EXTNUM		3	/* (intlevel 4) */
-#define XCHAL_INT16_EXTNUM		4	/* (intlevel 5) */
-#define XCHAL_INT17_EXTNUM		5	/* (intlevel 5) */
-#define XCHAL_INT18_EXTNUM		6	/* (intlevel 5) */
-#define XCHAL_INT20_EXTNUM		7	/* (intlevel 7) */
-
-
-/*----------------------------------------------------------------------
-			EXCEPTIONS and VECTORS
-  ----------------------------------------------------------------------*/
-
-#define XCHAL_XEA_VERSION		2	/* Xtensa Exception Architecture
-						   number: 1 == XEA1 (old)
-							   2 == XEA2 (new)
-							   0 == XEAX (extern) or TX */
-#define XCHAL_HAVE_XEA1			0	/* Exception Architecture 1 */
-#define XCHAL_HAVE_XEA2			1	/* Exception Architecture 2 */
-#define XCHAL_HAVE_XEAX			0	/* External Exception Arch. */
-#define XCHAL_HAVE_EXCEPTIONS		1	/* exception option */
-#define XCHAL_HAVE_HALT			0	/* halt architecture option */
-#define XCHAL_HAVE_BOOTLOADER		1	/* boot loader (for TX) */
-#define XCHAL_HAVE_MEM_ECC_PARITY	1	/* local memory ECC/parity */
-#define XCHAL_HAVE_VECTOR_SELECT	1	/* relocatable vectors */
-#define XCHAL_HAVE_VECBASE		1	/* relocatable vectors */
-#define XCHAL_VECBASE_RESET_VADDR	0xBE040000  /* VECBASE reset value */
-#define XCHAL_VECBASE_RESET_PADDR	0xBE040000
-#define XCHAL_RESET_VECBASE_OVERLAP	0
-
-#define XCHAL_RESET_VECTOR0_VADDR	0xBEFE0000
-#define XCHAL_RESET_VECTOR0_PADDR	0xBEFE0000
-#define XCHAL_RESET_VECTOR1_VADDR	0xBE800000
-#define XCHAL_RESET_VECTOR1_PADDR	0xBE800000
-#define XCHAL_RESET_VECTOR_VADDR	0xBEFE0000
-#define XCHAL_RESET_VECTOR_PADDR	0xBEFE0000
-#define XCHAL_MEMERROR_VECTOR0_VADDR	0xBEFE0500
-#define XCHAL_MEMERROR_VECTOR0_PADDR	0xBEFE0500
-#define XCHAL_MEMERROR_VECTOR1_VADDR	0xBEFE0500
-#define XCHAL_MEMERROR_VECTOR1_PADDR	0xBEFE0500
-#define XCHAL_MEMERROR_VECTOR_VADDR	0xBEFE0500
-#define XCHAL_MEMERROR_VECTOR_PADDR	0xBEFE0500
-#define XCHAL_USER_VECOFS		0x00000340
-#define XCHAL_USER_VECTOR_VADDR		0xBE040340
-#define XCHAL_USER_VECTOR_PADDR		0xBE040340
-#define XCHAL_KERNEL_VECOFS		0x00000300
-#define XCHAL_KERNEL_VECTOR_VADDR	0xBE040300
-#define XCHAL_KERNEL_VECTOR_PADDR	0xBE040300
-#define XCHAL_DOUBLEEXC_VECOFS		0x000003C0
-#define XCHAL_DOUBLEEXC_VECTOR_VADDR	0xBE0403C0
-#define XCHAL_DOUBLEEXC_VECTOR_PADDR	0xBE0403C0
-#define XCHAL_WINDOW_OF4_VECOFS		0x00000000
-#define XCHAL_WINDOW_UF4_VECOFS		0x00000040
-#define XCHAL_WINDOW_OF8_VECOFS		0x00000080
-#define XCHAL_WINDOW_UF8_VECOFS		0x000000C0
-#define XCHAL_WINDOW_OF12_VECOFS	0x00000100
-#define XCHAL_WINDOW_UF12_VECOFS	0x00000140
-#define XCHAL_WINDOW_VECTORS_VADDR	0xBE040400
-#define XCHAL_WINDOW_VECTORS_PADDR	0xBE040400
-#define XCHAL_INTLEVEL2_VECOFS		0x00000180
-#define XCHAL_INTLEVEL2_VECTOR_VADDR	0xBE040180
-#define XCHAL_INTLEVEL2_VECTOR_PADDR	0xBE040180
-#define XCHAL_INTLEVEL3_VECOFS		0x000001C0
-#define XCHAL_INTLEVEL3_VECTOR_VADDR	0xBE0401C0
-#define XCHAL_INTLEVEL3_VECTOR_PADDR	0xBE0401C0
-#define XCHAL_INTLEVEL4_VECOFS		0x00000200
-#define XCHAL_INTLEVEL4_VECTOR_VADDR	0xBE040200
-#define XCHAL_INTLEVEL4_VECTOR_PADDR	0xBE040200
-#define XCHAL_INTLEVEL5_VECOFS		0x00000240
-#define XCHAL_INTLEVEL5_VECTOR_VADDR	0xBE040240
-#define XCHAL_INTLEVEL5_VECTOR_PADDR	0xBE040240
-#define XCHAL_INTLEVEL6_VECOFS		0x00000280
-#define XCHAL_INTLEVEL6_VECTOR_VADDR	0xBE040280
-#define XCHAL_INTLEVEL6_VECTOR_PADDR	0xBE040280
-#define XCHAL_DEBUG_VECOFS		XCHAL_INTLEVEL6_VECOFS
-#define XCHAL_DEBUG_VECTOR_VADDR	XCHAL_INTLEVEL6_VECTOR_VADDR
-#define XCHAL_DEBUG_VECTOR_PADDR	XCHAL_INTLEVEL6_VECTOR_PADDR
-#define XCHAL_NMI_VECOFS		0x000002C0
-#define XCHAL_NMI_VECTOR_VADDR		0xBE0402C0
-#define XCHAL_NMI_VECTOR_PADDR		0xBE0402C0
-#define XCHAL_INTLEVEL7_VECOFS		XCHAL_NMI_VECOFS
-#define XCHAL_INTLEVEL7_VECTOR_VADDR	XCHAL_NMI_VECTOR_VADDR
-#define XCHAL_INTLEVEL7_VECTOR_PADDR	XCHAL_NMI_VECTOR_PADDR
-
-
-/*----------------------------------------------------------------------
-				DEBUG MODULE
-  ----------------------------------------------------------------------*/
-
-/*  Misc  */
-#define XCHAL_HAVE_DEBUG_ERI		0	/* ERI to debug module */
-#define XCHAL_HAVE_DEBUG_APB		0	/* APB to debug module */
-#define XCHAL_HAVE_DEBUG_JTAG		1	/* JTAG to debug module */
-
-/*  On-Chip Debug (OCD)  */
-#define XCHAL_HAVE_OCD			1	/* OnChipDebug option */
-#define XCHAL_NUM_IBREAK		2	/* number of IBREAKn regs */
-#define XCHAL_NUM_DBREAK		2	/* number of DBREAKn regs */
-#define XCHAL_HAVE_OCD_DIR_ARRAY	0	/* faster OCD option (to LX4) */
-#define XCHAL_HAVE_OCD_LS32DDR		1	/* L32DDR/S32DDR (faster OCD) */
-
-/*  TRAX (in core)  */
-#define XCHAL_HAVE_TRAX			0	/* TRAX in debug module */
-#define XCHAL_TRAX_MEM_SIZE		0	/* TRAX memory size in bytes */
-#define XCHAL_TRAX_MEM_SHAREABLE	0	/* start/end regs; ready sig. */
-#define XCHAL_TRAX_ATB_WIDTH		0	/* ATB width (bits), 0=no ATB */
-#define XCHAL_TRAX_TIME_WIDTH		0	/* timestamp bitwidth, 0=none */
-
-/*  Perf counters  */
-#define XCHAL_NUM_PERF_COUNTERS		0	/* performance counters */
-
-
-/*----------------------------------------------------------------------
-				MMU
-  ----------------------------------------------------------------------*/
-
-/*  See core-matmap.h header file for more details.  */
-
-#define XCHAL_HAVE_TLBS			1	/* inverse of HAVE_CACHEATTR */
-#define XCHAL_HAVE_SPANNING_WAY		1	/* one way maps I+D 4GB vaddr */
-#define XCHAL_SPANNING_WAY		0	/* TLB spanning way number */
-#define XCHAL_HAVE_IDENTITY_MAP		1	/* vaddr == paddr always */
-#define XCHAL_HAVE_CACHEATTR		0	/* CACHEATTR register present */
-#define XCHAL_HAVE_MIMIC_CACHEATTR	1	/* region protection */
-#define XCHAL_HAVE_XLT_CACHEATTR	0	/* region prot. w/translation */
-#define XCHAL_HAVE_PTP_MMU		0	/* full MMU (with page table
-						   [autorefill] and protection)
-						   usable for an MMU-based OS */
-/*  If none of the above last 4 are set, it's a custom TLB configuration.  */
-
-#define XCHAL_MMU_ASID_BITS		0	/* number of bits in ASIDs */
-#define XCHAL_MMU_RINGS			1	/* number of rings (1..4) */
-#define XCHAL_MMU_RING_BITS		0	/* num of bits in RING field */
-
-#endif /* !XTENSA_HAL_NON_PRIVILEGED_ONLY */
-
-
-#endif /* _XTENSA_CORE_CONFIGURATION_H */
diff --git a/src/platform/haswell/include/Makefile.am b/src/platform/haswell/include/Makefile.am
index 19f40eb..c5113a4 100644
--- a/src/platform/haswell/include/Makefile.am
+++ b/src/platform/haswell/include/Makefile.am
@@ -1 +1 @@
-SUBDIRS = platform xtensa
+SUBDIRS = arch platform
diff --git a/src/platform/haswell/include/arch/Makefile.am b/src/platform/haswell/include/arch/Makefile.am
new file mode 100644
index 0000000..63616bf
--- /dev/null
+++ b/src/platform/haswell/include/arch/Makefile.am
@@ -0,0 +1 @@
+SUBDIRS = xtensa
diff --git a/src/platform/haswell/include/xtensa/Makefile.am b/src/platform/haswell/include/arch/xtensa/Makefile.am
similarity index 100%
rename from src/platform/haswell/include/xtensa/Makefile.am
rename to src/platform/haswell/include/arch/xtensa/Makefile.am
diff --git a/src/platform/haswell/include/xtensa/config/Makefile.am b/src/platform/haswell/include/arch/xtensa/config/Makefile.am
similarity index 100%
rename from src/platform/haswell/include/xtensa/config/Makefile.am
rename to src/platform/haswell/include/arch/xtensa/config/Makefile.am
diff --git a/src/platform/haswell/include/xtensa/config/core-isa-bdw.h b/src/platform/haswell/include/arch/xtensa/config/core-isa-bdw.h
similarity index 100%
rename from src/platform/haswell/include/xtensa/config/core-isa-bdw.h
rename to src/platform/haswell/include/arch/xtensa/config/core-isa-bdw.h
diff --git a/src/platform/haswell/include/xtensa/config/core-isa-hsw.h b/src/platform/haswell/include/arch/xtensa/config/core-isa-hsw.h
similarity index 100%
rename from src/platform/haswell/include/xtensa/config/core-isa-hsw.h
rename to src/platform/haswell/include/arch/xtensa/config/core-isa-hsw.h
diff --git a/src/platform/haswell/include/xtensa/config/core-isa.h b/src/platform/haswell/include/arch/xtensa/config/core-isa.h
similarity index 100%
rename from src/platform/haswell/include/xtensa/config/core-isa.h
rename to src/platform/haswell/include/arch/xtensa/config/core-isa.h
diff --git a/src/platform/haswell/include/xtensa/config/core-matmap.h b/src/platform/haswell/include/arch/xtensa/config/core-matmap.h
similarity index 100%
rename from src/platform/haswell/include/xtensa/config/core-matmap.h
rename to src/platform/haswell/include/arch/xtensa/config/core-matmap.h
diff --git a/src/platform/baytrail/include/xtensa/config/defs.h b/src/platform/haswell/include/arch/xtensa/config/defs.h
similarity index 100%
rename from src/platform/baytrail/include/xtensa/config/defs.h
rename to src/platform/haswell/include/arch/xtensa/config/defs.h
diff --git a/src/platform/haswell/include/xtensa/config/specreg.h b/src/platform/haswell/include/arch/xtensa/config/specreg.h
similarity index 100%
rename from src/platform/haswell/include/xtensa/config/specreg.h
rename to src/platform/haswell/include/arch/xtensa/config/specreg.h
diff --git a/src/platform/haswell/include/xtensa/config/system.h b/src/platform/haswell/include/arch/xtensa/config/system.h
similarity index 100%
rename from src/platform/haswell/include/xtensa/config/system.h
rename to src/platform/haswell/include/arch/xtensa/config/system.h
diff --git a/src/platform/haswell/include/xtensa/config/tie-asm.h b/src/platform/haswell/include/arch/xtensa/config/tie-asm.h
similarity index 100%
rename from src/platform/haswell/include/xtensa/config/tie-asm.h
rename to src/platform/haswell/include/arch/xtensa/config/tie-asm.h
diff --git a/src/platform/haswell/include/xtensa/config/tie.h b/src/platform/haswell/include/arch/xtensa/config/tie.h
similarity index 100%
rename from src/platform/haswell/include/xtensa/config/tie.h
rename to src/platform/haswell/include/arch/xtensa/config/tie.h
-- 
2.17.1



More information about the Sound-open-firmware mailing list