xref: /haiku/src/system/kernel/arch/riscv64/arch_cpu.cpp (revision d031c09ceba481fc318b99f18f070475ca8809c0)
1c085f386SAlexander von Gluck IV /*
2c085f386SAlexander von Gluck IV  * Copyright 2019, Adrien Destugues, pulkomandy@pulkomandy.tk.
3c085f386SAlexander von Gluck IV  * Distributed under the terms of the MIT License.
4c085f386SAlexander von Gluck IV  */
5c085f386SAlexander von Gluck IV 
6c085f386SAlexander von Gluck IV 
7c085f386SAlexander von Gluck IV #include <KernelExport.h>
8c085f386SAlexander von Gluck IV 
9c085f386SAlexander von Gluck IV #include <arch/cpu.h>
10c085f386SAlexander von Gluck IV #include <boot/kernel_args.h>
11*d031c09cSX512 #include <vm/VMAddressSpace.h>
12c085f386SAlexander von Gluck IV #include <commpage.h>
13c085f386SAlexander von Gluck IV #include <elf.h>
14*d031c09cSX512 #include <Htif.h>
15*d031c09cSX512 #include <platform/sbi/sbi_syscalls.h>
16*d031c09cSX512 
17*d031c09cSX512 
18*d031c09cSX512 extern uint32 gPlatform1;
19*d031c09cSX512 extern uint32 gPlatform2;
20c085f386SAlexander von Gluck IV 
21c085f386SAlexander von Gluck IV 
22c085f386SAlexander von Gluck IV status_t
23c085f386SAlexander von Gluck IV arch_cpu_preboot_init_percpu(kernel_args *args, int curr_cpu)
24c085f386SAlexander von Gluck IV {
25c085f386SAlexander von Gluck IV 	return B_OK;
26c085f386SAlexander von Gluck IV }
27c085f386SAlexander von Gluck IV 
28c085f386SAlexander von Gluck IV 
29c085f386SAlexander von Gluck IV status_t
30c085f386SAlexander von Gluck IV arch_cpu_init_percpu(kernel_args *args, int curr_cpu)
31c085f386SAlexander von Gluck IV {
32c085f386SAlexander von Gluck IV 	//detect_cpu(curr_cpu);
33c085f386SAlexander von Gluck IV 
34c085f386SAlexander von Gluck IV 	// we only support one anyway...
35c085f386SAlexander von Gluck IV 	return 0;
36c085f386SAlexander von Gluck IV }
37c085f386SAlexander von Gluck IV 
38c085f386SAlexander von Gluck IV 
39c085f386SAlexander von Gluck IV status_t
40c085f386SAlexander von Gluck IV arch_cpu_init(kernel_args *args)
41c085f386SAlexander von Gluck IV {
42*d031c09cSX512 /*
43*d031c09cSX512 	uint64 conversionFactor
44*d031c09cSX512 		= (1LL << 32) * 1000000LL / args->arch_args.timerFrequrency;
45*d031c09cSX512 
46*d031c09cSX512 	__riscv64_setup_system_time(conversionFactor);
47*d031c09cSX512 */
48c085f386SAlexander von Gluck IV 	return B_OK;
49c085f386SAlexander von Gluck IV }
50c085f386SAlexander von Gluck IV 
51c085f386SAlexander von Gluck IV 
52c085f386SAlexander von Gluck IV status_t
53c085f386SAlexander von Gluck IV arch_cpu_init_post_vm(kernel_args *args)
54c085f386SAlexander von Gluck IV {
55*d031c09cSX512 	// Set address space ownership to currently running threads
56*d031c09cSX512 	for (uint32 i = 0; i < args->num_cpus; i++) {
57*d031c09cSX512 		VMAddressSpace::Kernel()->Get();
58*d031c09cSX512 	}
59*d031c09cSX512 
60c085f386SAlexander von Gluck IV 	return B_OK;
61c085f386SAlexander von Gluck IV }
62c085f386SAlexander von Gluck IV 
63c085f386SAlexander von Gluck IV 
64c085f386SAlexander von Gluck IV status_t
65c085f386SAlexander von Gluck IV arch_cpu_init_post_modules(kernel_args *args)
66c085f386SAlexander von Gluck IV {
67c085f386SAlexander von Gluck IV 	return B_OK;
68c085f386SAlexander von Gluck IV }
69c085f386SAlexander von Gluck IV 
70c085f386SAlexander von Gluck IV 
71c085f386SAlexander von Gluck IV void
72c085f386SAlexander von Gluck IV arch_cpu_sync_icache(void *address, size_t len)
73c085f386SAlexander von Gluck IV {
74c085f386SAlexander von Gluck IV }
75c085f386SAlexander von Gluck IV 
76c085f386SAlexander von Gluck IV 
77c085f386SAlexander von Gluck IV void
78c085f386SAlexander von Gluck IV arch_cpu_memory_read_barrier(void)
79c085f386SAlexander von Gluck IV {
80c085f386SAlexander von Gluck IV }
81c085f386SAlexander von Gluck IV 
82c085f386SAlexander von Gluck IV 
83c085f386SAlexander von Gluck IV void
84c085f386SAlexander von Gluck IV arch_cpu_memory_write_barrier(void)
85c085f386SAlexander von Gluck IV {
86c085f386SAlexander von Gluck IV }
87c085f386SAlexander von Gluck IV 
88c085f386SAlexander von Gluck IV 
89c085f386SAlexander von Gluck IV void
90c085f386SAlexander von Gluck IV arch_cpu_invalidate_TLB_range(addr_t start, addr_t end)
91c085f386SAlexander von Gluck IV {
92c085f386SAlexander von Gluck IV }
93c085f386SAlexander von Gluck IV 
94c085f386SAlexander von Gluck IV 
95c085f386SAlexander von Gluck IV void
96c085f386SAlexander von Gluck IV arch_cpu_invalidate_TLB_list(addr_t pages[], int num_pages)
97c085f386SAlexander von Gluck IV {
98c085f386SAlexander von Gluck IV }
99c085f386SAlexander von Gluck IV 
100c085f386SAlexander von Gluck IV 
101c085f386SAlexander von Gluck IV void
102c085f386SAlexander von Gluck IV arch_cpu_global_TLB_invalidate(void)
103c085f386SAlexander von Gluck IV {
104c085f386SAlexander von Gluck IV }
105c085f386SAlexander von Gluck IV 
106c085f386SAlexander von Gluck IV 
107c085f386SAlexander von Gluck IV void
108c085f386SAlexander von Gluck IV arch_cpu_user_TLB_invalidate(void)
109c085f386SAlexander von Gluck IV {
110c085f386SAlexander von Gluck IV }
111c085f386SAlexander von Gluck IV 
112c085f386SAlexander von Gluck IV 
113c085f386SAlexander von Gluck IV status_t
114c085f386SAlexander von Gluck IV arch_cpu_shutdown(bool reboot)
115c085f386SAlexander von Gluck IV {
116*d031c09cSX512 	if (gPlatform1 == kPlatform1Sbi) {
117*d031c09cSX512 		sbi_system_reset(
118*d031c09cSX512 			reboot ? SBI_RESET_TYPE_COLD_REBOOT : SBI_RESET_TYPE_SHUTDOWN,
119*d031c09cSX512 			SBI_RESET_REASON_NONE);
120*d031c09cSX512 	}
121*d031c09cSX512 
122*d031c09cSX512 	HtifShutdown();
123c085f386SAlexander von Gluck IV 	return B_ERROR;
124c085f386SAlexander von Gluck IV }
125