You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
86 lines
2.0 KiB
86 lines
2.0 KiB
/* |
|
* 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
|
|
|