1 /* 2 * Copyright 2007, Haiku Inc. All rights reserved. 3 * Distributed under the terms of the MIT License. 4 * 5 * Authors: 6 * François Revol <revol@free.fr> 7 * 8 * Copyright 2004, Axel Dörfler, axeld@pinc-software.de 9 * Distributed under the terms of the MIT License. 10 */ 11 12 13 #include <KernelExport.h> 14 15 #include <boot/stage2.h> 16 #include <arch/smp.h> 17 #include <debug.h> 18 #include <int.h> 19 20 #include <cpu.h> 21 #include <platform/sbi/sbi_syscalls.h> 22 23 24 extern uint32 gPlatform; 25 26 27 status_t 28 arch_smp_init(kernel_args *args) 29 { 30 dprintf("arch_smp_init()\n"); 31 return B_OK; 32 } 33 34 35 status_t 36 arch_smp_per_cpu_init(kernel_args *args, int32 cpuId) 37 { 38 return B_OK; 39 } 40 41 42 void 43 arch_smp_send_multicast_ici(CPUSet& cpuSet) 44 { 45 switch (gPlatform) { 46 case kPlatformSbi: { 47 uint64 hartMask = 0; 48 int32 cpuCount = smp_get_num_cpus(); 49 for (int32 i = 0; i < cpuCount; i++) { 50 if (cpuSet.GetBit(i) && i != smp_get_current_cpu()) 51 hartMask |= (uint64)1 << gCPU[i].arch.hartId; 52 } 53 // TODO: handle hart ID >= 64 54 sbi_send_ipi(hartMask, 0); 55 break; 56 } 57 case kPlatformMNative: 58 default: 59 dprintf("arch_smp_send_multicast_ici: not implemented\n"); 60 } 61 #if KDEBUG 62 if (are_interrupts_enabled()) 63 panic("arch_smp_send_multicast_ici: called with interrupts enabled"); 64 #endif 65 } 66 67 68 void 69 arch_smp_send_ici(int32 target_cpu) 70 { 71 switch (gPlatform) { 72 case kPlatformSbi: 73 // dprintf("arch_smp_send_ici(%" B_PRId32 ")\n", target_cpu); 74 sbi_send_ipi((uint64)1 << gCPU[target_cpu].arch.hartId, 0); 75 break; 76 case kPlatformMNative: 77 default: 78 dprintf("arch_smp_send_ici: not implemented\n"); 79 } 80 } 81 82 83 void 84 arch_smp_send_broadcast_ici() 85 { 86 switch (gPlatform) { 87 case kPlatformSbi: 88 // dprintf("arch_smp_send_broadcast_ici()\n"); 89 sbi_send_ipi(0, -1); 90 break; 91 case kPlatformMNative: 92 default: 93 dprintf("arch_smp_send_broadcast_ici: not implemented\n"); 94 } 95 } 96