xtensa: mmu: Simplify initialization
Simplify the logic around xtensa_mmu_init. - Do not have a different path to init part of kernel - Call xtensa_mmu_init from C Signed-off-by: Flavio Ceolin <flavio.ceolin@intel.com>
This commit is contained in:
parent
a1bb2b9c64
commit
fff91cb542
4 changed files with 8 additions and 35 deletions
|
@ -24,10 +24,6 @@
|
||||||
.global __start
|
.global __start
|
||||||
.type z_cstart, @function
|
.type z_cstart, @function
|
||||||
|
|
||||||
#ifdef CONFIG_XTENSA_MMU
|
|
||||||
.type z_xtensa_mmu_init, @function
|
|
||||||
#endif
|
|
||||||
|
|
||||||
|
|
||||||
/* Macros to abstract away ABI differences */
|
/* Macros to abstract away ABI differences */
|
||||||
|
|
||||||
|
@ -192,10 +188,6 @@ _start:
|
||||||
|
|
||||||
#endif /* !XCHAL_HAVE_BOOTLOADER */
|
#endif /* !XCHAL_HAVE_BOOTLOADER */
|
||||||
|
|
||||||
#ifdef CONFIG_XTENSA_MMU
|
|
||||||
CALL z_xtensa_mmu_init
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/* Enter C domain, never returns from here */
|
/* Enter C domain, never returns from here */
|
||||||
CALL z_cstart
|
CALL z_cstart
|
||||||
|
|
||||||
|
|
|
@ -213,19 +213,18 @@ __weak void arch_xtensa_mmu_post_init(bool is_core0)
|
||||||
ARG_UNUSED(is_core0);
|
ARG_UNUSED(is_core0);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void xtensa_mmu_init(bool is_core0)
|
void z_xtensa_mmu_init(void)
|
||||||
{
|
{
|
||||||
volatile uint8_t entry;
|
volatile uint8_t entry;
|
||||||
uint32_t ps, vecbase;
|
uint32_t ps, vecbase;
|
||||||
|
|
||||||
if (is_core0) {
|
if (_current_cpu->id == 0) {
|
||||||
/* This is normally done via arch_kernel_init() inside z_cstart().
|
/* This is normally done via arch_kernel_init() inside z_cstart().
|
||||||
* However, before that is called, we go through the sys_init of
|
* However, before that is called, we go through the sys_init of
|
||||||
* INIT_LEVEL_EARLY, which is going to result in TLB misses.
|
* INIT_LEVEL_EARLY, which is going to result in TLB misses.
|
||||||
* So setup whatever necessary so the exception handler can work
|
* So setup whatever necessary so the exception handler can work
|
||||||
* properly.
|
* properly.
|
||||||
*/
|
*/
|
||||||
z_xtensa_kernel_init();
|
|
||||||
xtensa_init_page_tables();
|
xtensa_init_page_tables();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -326,17 +325,7 @@ static void xtensa_mmu_init(bool is_core0)
|
||||||
xtensa_dtlb_entry_invalidate_sync(Z_XTENSA_TLB_ENTRY(Z_XTENSA_PTEVADDR + MB(4), 3));
|
xtensa_dtlb_entry_invalidate_sync(Z_XTENSA_TLB_ENTRY(Z_XTENSA_PTEVADDR + MB(4), 3));
|
||||||
xtensa_itlb_entry_invalidate_sync(Z_XTENSA_TLB_ENTRY(Z_XTENSA_PTEVADDR + MB(4), 3));
|
xtensa_itlb_entry_invalidate_sync(Z_XTENSA_TLB_ENTRY(Z_XTENSA_PTEVADDR + MB(4), 3));
|
||||||
|
|
||||||
arch_xtensa_mmu_post_init(is_core0);
|
arch_xtensa_mmu_post_init(_current_cpu->id == 0);
|
||||||
}
|
|
||||||
|
|
||||||
void z_xtensa_mmu_init(void)
|
|
||||||
{
|
|
||||||
xtensa_mmu_init(true);
|
|
||||||
}
|
|
||||||
|
|
||||||
void z_xtensa_mmu_smp_init(void)
|
|
||||||
{
|
|
||||||
xtensa_mmu_init(false);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef CONFIG_ARCH_HAS_RESERVED_PAGE_FRAMES
|
#ifdef CONFIG_ARCH_HAS_RESERVED_PAGE_FRAMES
|
||||||
|
|
|
@ -25,7 +25,7 @@ extern void z_xtensa_fatal_error(unsigned int reason, const z_arch_esf_t *esf);
|
||||||
K_KERNEL_STACK_ARRAY_DECLARE(z_interrupt_stacks, CONFIG_MP_MAX_NUM_CPUS,
|
K_KERNEL_STACK_ARRAY_DECLARE(z_interrupt_stacks, CONFIG_MP_MAX_NUM_CPUS,
|
||||||
CONFIG_ISR_STACK_SIZE);
|
CONFIG_ISR_STACK_SIZE);
|
||||||
|
|
||||||
static ALWAYS_INLINE void z_xtensa_kernel_init(void)
|
static ALWAYS_INLINE void arch_kernel_init(void)
|
||||||
{
|
{
|
||||||
_cpu_t *cpu0 = &_kernel.cpus[0];
|
_cpu_t *cpu0 = &_kernel.cpus[0];
|
||||||
|
|
||||||
|
@ -51,21 +51,15 @@ static ALWAYS_INLINE void z_xtensa_kernel_init(void)
|
||||||
* win.
|
* win.
|
||||||
*/
|
*/
|
||||||
XTENSA_WSR(ZSR_CPU_STR, cpu0);
|
XTENSA_WSR(ZSR_CPU_STR, cpu0);
|
||||||
}
|
|
||||||
|
|
||||||
static ALWAYS_INLINE void arch_kernel_init(void)
|
|
||||||
{
|
|
||||||
#ifndef CONFIG_XTENSA_MMU
|
|
||||||
/* This is called in z_xtensa_mmu_init() before z_cstart()
|
|
||||||
* so we do not need to call it again.
|
|
||||||
*/
|
|
||||||
z_xtensa_kernel_init();
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifdef CONFIG_INIT_STACKS
|
#ifdef CONFIG_INIT_STACKS
|
||||||
memset(Z_KERNEL_STACK_BUFFER(z_interrupt_stacks[0]), 0xAA,
|
memset(Z_KERNEL_STACK_BUFFER(z_interrupt_stacks[0]), 0xAA,
|
||||||
K_KERNEL_STACK_SIZEOF(z_interrupt_stacks[0]));
|
K_KERNEL_STACK_SIZEOF(z_interrupt_stacks[0]));
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#ifdef CONFIG_XTENSA_MMU
|
||||||
|
z_xtensa_mmu_init();
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
void xtensa_switch(void *switch_to, void **switched_from);
|
void xtensa_switch(void *switch_to, void **switched_from);
|
||||||
|
|
|
@ -26,6 +26,4 @@ extern int xtensa_soc_mmu_ranges_num;
|
||||||
|
|
||||||
void z_xtensa_mmu_init(void);
|
void z_xtensa_mmu_init(void);
|
||||||
|
|
||||||
void z_xtensa_mmu_smp_init(void);
|
|
||||||
|
|
||||||
#endif /* ZEPHYR_INCLUDE_ARCH_XTENSA_XTENSA_MMU_H */
|
#endif /* ZEPHYR_INCLUDE_ARCH_XTENSA_XTENSA_MMU_H */
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue