/* * Copyright(c) 2016 Intel Corporation. All rights reserved. * * SPDX-License-Identifier: Apache-2.0 * * Author: Liam Girdwood */ /* * Entry point from ROM - assumes :- * * 1) C runtime environment is initialized by ROM. * 2) Stack is in first HPSRAM bank. */ #include #include #include #include #include #include #include "platform.h" #define PLATFORM_PRIMARY_CORE_ID 0 #define SHIM_ADDR DT_REG_ADDR(DT_NODELABEL(shim)) #define SHIM_L2_MECS (SHIM_ADDR + 0xd0) #define SHIM_L2_PREF_CFG (SHIM_ADDR + 0x508) .type boot_master_core, @function .begin literal_prefix .boot_entry .section .boot_entry.text, "ax" .align 4 .global boot_entry boot_entry: entry a1, 48 j boot_init .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 wnd0_status_address: .word HP_SRAM_WIN0_BASE wnd0_error_address: .word HP_SRAM_WIN0_BASE | 0x4 #if defined(PLATFORM_MEM_INIT_AT_BOOT) shim_ldoctl_address: .word (SHIM_ADDR + 0xa4) ldoctl_hpsram_ldo_on: .word SHIM_LDOCTL_HPSRAM_LDO_ON ldoctl_hpsram_ldo_bypass: .word SHIM_LDOCTL_HPSRAM_LDO_BYPASS hspgctl0_address: .word HSPGCTL0 hsrmctl0_address: .word HSRMCTL0 hspgctl1_address: .word HSPGCTL1 hsrmctl1_address: .word HSRMCTL1 hspgists0_address: .word HSPGISTS0 hspgists1_address: .word HSPGISTS1 #endif fw_loaded_status_value: .word 0x00000005 fw_no_errors_value: .word 0x00000000 boot_init: .align 4 #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 #if defined(PLATFORM_MEM_INIT_AT_BOOT) /* turn on memory _before_ stack reprogramming */ l32r a3, ldoctl_hpsram_ldo_on l32r a5, shim_ldoctl_address s32i a3, a5, 0 memw /* delay for 256 iterations before touching pwr regs */ movi a2, 256 1: addi.n a2, a2, -1 bnez a2, 1b movi a3, 0 l32r a5, hspgctl0_address s32i a3, a5, 0 memw l32r a5, hsrmctl0_address s32i a3, a5, 0 memw l32r a5, hspgctl1_address s32i a3, a5, 0 memw l32r a5, hsrmctl1_address s32i a3, a5, 0 memw /* wait for status of first bank group */ l32r a5, hspgists0_address 2: l32i a3, a5, 0 bnez a3, 2b /* wait for status of second bank group */ l32r a5, hspgists1_address 3: l32i a3, a5, 0 bnez a3, 3b /* delay for 256 iterations before touching pwr regs */ movi a2, 256 4: addi.n a2, a2, -1 bnez a2, 4b l32r a3, ldoctl_hpsram_ldo_bypass l32r a5, shim_ldoctl_address s32i a3, a5, 0 memw #endif /* reprogram stack to the area defined by main FW */ l32r a3, sof_stack_base mov sp, a3 /* set status register to 0x00000005 in wnd0 */ l32r a3, fw_loaded_status_value l32r a5, wnd0_status_address s32i a3, a5, 0 /* set error register to 0x00 in wnd0 */ l32r a3, fw_no_errors_value l32r a5, wnd0_error_address s32i a3, a5, 0 /* 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, and snoop responses, if configured. */ movi a3, (MEMCTL_SNOOP_EN | MEMCTL_L0IBUF_EN) rsr a2, MEMCTL or a2, a2, a3 wsr a2, MEMCTL #endif /* determine core we are running on */ rsr.prid a2 movi a3, PLATFORM_PRIMARY_CORE_ID beq a2, a3, 1f /* no core should get here */ j dead 1: /* we are primary core so boot it */ call8 boot_master_core dead: /* should never get here - we are dead */ j dead .size boot_entry, . - boot_entry .end literal_prefix