The generic bootloader code used a per-device "platform.h" file imported from SOF. These turn out to have very little actual content. Move them to the core directory in a single header for now, pending some rework to place the settings in devicetree. Signed-off-by: Andy Ross <andrew.j.ross@intel.com>
232 lines
4.1 KiB
ArmAsm
232 lines
4.1 KiB
ArmAsm
/*
|
|
* Copyright(c) 2016 Intel Corporation. All rights reserved.
|
|
*
|
|
* SPDX-License-Identifier: Apache-2.0
|
|
*
|
|
* Author: Liam Girdwood <liam.r.girdwood@linux.intel.com>
|
|
*/
|
|
|
|
/*
|
|
* Entry point from ROM - assumes :-
|
|
*
|
|
* 1) C runtime environment is initialized by ROM.
|
|
* 2) Stack is in first HPSRAM bank.
|
|
*/
|
|
|
|
#include <devicetree.h>
|
|
#include <soc/shim.h>
|
|
#include <cavs-shim.h>
|
|
#include <soc/memory.h>
|
|
#include <xtensa/corebits.h>
|
|
#include <xtensa/config/core-isa.h>
|
|
#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
|