1 /* 2 * @ : Copyright (c) 2020 Phytium Information Technology, Inc. 3 * 4 * SPDX-License-Identifier: Apache-2.0. 5 * 6 * @Date: 2021-05-26 10:09:45 7 * @LastEditTime: 2021-08-16 16:32:08 8 * @Description: This files is for 9 * 10 * @Modify History: 11 * Ver Who Date Changes 12 * ----- ------ -------- -------------------------------------- 13 */ 14 15 #include <rtthread.h> 16 #include "board.h" 17 #include <gicv3.h> 18 19 #ifdef RT_USING_SMP 20 #include <interrupt.h> 21 #include "ft_psci.h" 22 #include "ft_generic_timer.h" 23 24 extern int rt_hw_timer_init(void); 25 extern void secondary_cpu_start(void); 26 rt_hw_secondary_cpu_up(void)27void rt_hw_secondary_cpu_up(void) 28 { 29 30 rt_uint32_t i; 31 rt_uint32_t cpu_mask = 0; 32 33 rt_kprintf("rt_hw_secondary_cpu_up is processing \r\n"); 34 for (i = 1; i < RT_CPUS_NR; i++) 35 { 36 if (i == 1) 37 { 38 /* code */ 39 FPsci_CpuOn(1 << i, (rt_uint32_t)secondary_cpu_start); 40 cpu_mask = 2; 41 } 42 else if (i == 2) 43 { 44 FPsci_CpuOn(1 << i, (rt_uint32_t)secondary_cpu_start); 45 cpu_mask = 4; 46 } 47 else if (i == 3) 48 { 49 FPsci_CpuOn(1 << i, (rt_uint32_t)secondary_cpu_start); 50 cpu_mask = 8; 51 } 52 else 53 { 54 continue; 55 } 56 57 __asm__ volatile("dsb" :: 58 : "memory"); 59 rt_hw_ipi_send(RT_SCHEDULE_IPI, cpu_mask); 60 Ft_GenericTimer_UsDelay(1000000); 61 } 62 } 63 secondary_cpu_c_start(void)64void secondary_cpu_c_start(void) 65 { 66 rt_hw_vector_init(); 67 rt_hw_spin_lock(&_cpus_lock); 68 69 arm_gic_cpu_init(0); 70 arm_gic_redist_init(0); 71 72 rt_hw_timer_init(); 73 74 rt_hw_interrupt_set_priority(RT_SCHEDULE_IPI, 16); 75 rt_hw_interrupt_umask(RT_SCHEDULE_IPI); 76 77 rt_system_scheduler_start(); 78 } 79 rt_hw_secondary_cpu_idle_exec(void)80void rt_hw_secondary_cpu_idle_exec(void) 81 { 82 asm volatile("wfe" :: 83 : "memory", "cc"); 84 } 85 86 #endif 87