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