87 lines
2.0 KiB
C
87 lines
2.0 KiB
C
/*
|
|
* Copyright (c) 2025 Ambiq Micro Inc.
|
|
*
|
|
* SPDX-License-Identifier: Apache-2.0
|
|
*/
|
|
|
|
#include <zephyr/init.h>
|
|
#include <zephyr/cache.h>
|
|
#include <zephyr/logging/log.h>
|
|
#include <zephyr/mem_mgmt/mem_attr.h>
|
|
#ifdef CONFIG_CACHE_MANAGEMENT
|
|
#include <zephyr/dt-bindings/memory-attr/memory-attr-arm.h>
|
|
#endif /* CONFIG_CACHE_MANAGEMENT */
|
|
|
|
#ifdef CONFIG_NOCACHE_MEMORY
|
|
#include <zephyr/linker/linker-defs.h>
|
|
#endif /* CONFIG_NOCACHE_MEMORY */
|
|
|
|
#include <soc.h>
|
|
|
|
LOG_MODULE_REGISTER(soc, CONFIG_SOC_LOG_LEVEL);
|
|
|
|
#define SCRATCH0_OEM_RCV_RETRY_MAGIC 0xA86
|
|
|
|
void soc_early_init_hook(void)
|
|
{
|
|
/* Enable Loop and branch info cache */
|
|
SCB->CCR |= SCB_CCR_LOB_Msk;
|
|
__DSB();
|
|
__ISB();
|
|
|
|
if ((MCUCTRL->SCRATCH0 >> 20) == SCRATCH0_OEM_RCV_RETRY_MAGIC) {
|
|
/*
|
|
* Clear the scratch register
|
|
*/
|
|
MCUCTRL->SCRATCH0 = 0x00;
|
|
}
|
|
|
|
/* Internal timer15 for SPOT manager */
|
|
IRQ_CONNECT(82, 0, hal_internal_timer_isr, 0, 0);
|
|
|
|
/* Initialize for low power in the power control block */
|
|
am_hal_pwrctrl_low_power_init();
|
|
|
|
/* Enable SIMOBUCK for the apollo5 Family */
|
|
am_hal_pwrctrl_control(AM_HAL_PWRCTRL_CONTROL_SIMOBUCK_INIT, NULL);
|
|
|
|
/*
|
|
* Set default temperature for spotmgr to room temperature
|
|
*/
|
|
am_hal_pwrctrl_temp_thresh_t dummy[32];
|
|
|
|
am_hal_pwrctrl_temp_update(25.0f, dummy);
|
|
|
|
/* Enable Icache*/
|
|
sys_cache_instr_enable();
|
|
|
|
/* Enable Dcache */
|
|
sys_cache_data_enable();
|
|
}
|
|
|
|
#if CONFIG_CACHE_MANAGEMENT
|
|
bool buf_in_nocache(uintptr_t buf, size_t len_bytes)
|
|
{
|
|
bool buf_within_nocache = false;
|
|
|
|
if (buf == 0 || len_bytes == 0) {
|
|
return buf_within_nocache;
|
|
}
|
|
|
|
#if CONFIG_NOCACHE_MEMORY
|
|
/* Check if buffer is in nocache region defined by the linker */
|
|
buf_within_nocache = (buf >= ((uintptr_t)_nocache_ram_start)) &&
|
|
((buf + len_bytes - 1) <= ((uintptr_t)_nocache_ram_end));
|
|
if (buf_within_nocache) {
|
|
return true;
|
|
}
|
|
#endif /* CONFIG_NOCACHE_MEMORY */
|
|
|
|
/* Check if buffer is in nocache memory region defined in DT */
|
|
buf_within_nocache = mem_attr_check_buf((void *)buf, len_bytes,
|
|
DT_MEM_ARM(ATTR_MPU_RAM_NOCACHE)) == 0;
|
|
|
|
return buf_within_nocache;
|
|
}
|
|
#endif
|