1 /* 2 * Copyright (c) 2006-2021, RT-Thread Development Team 3 * 4 * SPDX-License-Identifier: Apache-2.0 5 * 6 * Change Logs: 7 * Date Author Notes 8 * 2018/12/23 Bernard The first version 9 * 2018/12/27 Jesven Add secondary cpu boot 10 */ 11 12 #include <rthw.h> 13 #include <rtthread.h> 14 #include <stdint.h> 15 16 #include "board.h" 17 #include <encoding.h> 18 #include <clint.h> 19 #include <atomic.h> 20 21 #ifdef RT_USING_SMP 22 rt_hw_cpu_id(void)23int rt_hw_cpu_id(void) 24 { 25 return read_csr(mhartid); 26 } 27 rt_hw_spin_lock_init(rt_hw_spinlock_t * lock)28void rt_hw_spin_lock_init(rt_hw_spinlock_t *lock) 29 { 30 ((spinlock_t *)lock)->lock = 0; 31 } 32 rt_hw_spin_lock(rt_hw_spinlock_t * lock)33void rt_hw_spin_lock(rt_hw_spinlock_t *lock) 34 { 35 spinlock_lock((spinlock_t *)lock); 36 } 37 rt_hw_spin_unlock(rt_hw_spinlock_t * lock)38void rt_hw_spin_unlock(rt_hw_spinlock_t *lock) 39 { 40 spinlock_unlock((spinlock_t *)lock); 41 } 42 rt_hw_ipi_send(int ipi_vector,unsigned int cpu_mask)43void rt_hw_ipi_send(int ipi_vector, unsigned int cpu_mask) 44 { 45 int idx; 46 47 for (idx = 0; idx < RT_CPUS_NR; idx ++) 48 { 49 if (cpu_mask & (1 << idx)) 50 { 51 clint_ipi_send(idx); 52 } 53 } 54 } 55 56 extern rt_base_t secondary_boot_flag; rt_hw_secondary_cpu_up(void)57void rt_hw_secondary_cpu_up(void) 58 { 59 mb(); 60 secondary_boot_flag = 0xa55a; 61 } 62 63 extern void rt_hw_scondary_interrupt_init(void); 64 extern int rt_hw_tick_init(void); 65 extern int rt_hw_clint_ipi_enable(void); 66 secondary_cpu_c_start(void)67void secondary_cpu_c_start(void) 68 { 69 rt_hw_spin_lock(&_cpus_lock); 70 71 /* initialize interrupt controller */ 72 rt_hw_scondary_interrupt_init(); 73 74 rt_hw_tick_init(); 75 76 rt_hw_clint_ipi_enable(); 77 78 rt_system_scheduler_start(); 79 } 80 rt_hw_secondary_cpu_idle_exec(void)81void rt_hw_secondary_cpu_idle_exec(void) 82 { 83 asm volatile ("wfi"); 84 } 85 #endif /*RT_USING_SMP*/ 86