xref: /haiku/src/system/kernel/arch/riscv64/arch_smp.cpp (revision 4c8e85b316c35a9161f5a1c50ad70bc91c83a76f)
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