kernel/arch/platform: implement for riscv64

Change-Id: Id1839ef39d927e6a2017c8b8ac3482d9eeb00fa1
Reviewed-on: https://review.haiku-os.org/c/haiku/+/4059
Reviewed-by: Alex von Gluck IV <[email protected]>
This commit is contained in:
X512
2021-08-13 20:36:30 +00:00
committed by Alex von Gluck IV
parent 56ac584a91
commit fa41d6fa7a
5 changed files with 67 additions and 28 deletions
@@ -19,19 +19,11 @@
enum { enum {
kPlatform1None, kPlatformNone,
kPlatform1Riscv, kPlatformMNative,
kPlatform1Sbi, kPlatformSbi,
}; };
enum {
kPlatform2None,
kPlatform2Riscv,
kPlatform2Efi,
kPlatform2UBoot,
};
enum { enum {
kUartKindNone, kUartKindNone,
kUartKind8250, kUartKind8250,
@@ -57,8 +49,8 @@ typedef struct {
uint32 num_virtual_ranges_to_keep; uint32 num_virtual_ranges_to_keep;
addr_range virtual_ranges_to_keep[MAX_VIRTUAL_RANGES_TO_KEEP]; addr_range virtual_ranges_to_keep[MAX_VIRTUAL_RANGES_TO_KEEP];
uint32 platform1; // MNative hooks, or SBI
uint32 platform2; uint32 machine_platform;
uint bootHart; uint bootHart;
uint64 timerFrequrency; // in Hz uint64 timerFrequrency; // in Hz
@@ -37,9 +37,8 @@ extern uint64_t arch_mmu_generate_post_efi_page_tables(size_t memory_map_size,
void void
arch_start_kernel(addr_t kernelEntry) arch_start_kernel(addr_t kernelEntry)
{ {
// Set RV64 platform information // EFI assumed to be SBI booted
gKernelArgs.arch_args.platform1 = kPlatform1Sbi; gKernelArgs.arch_args.machine_platform = kPlatformSbi;
gKernelArgs.arch_args.platform2 = kPlatform2Efi;
// Prepare to exit EFI boot services. // Prepare to exit EFI boot services.
// Read the memory map. // Read the memory map.
+2 -3
View File
@@ -15,8 +15,7 @@
#include <platform/sbi/sbi_syscalls.h> #include <platform/sbi/sbi_syscalls.h>
extern uint32 gPlatform1; extern uint32 gPlatform;
extern uint32 gPlatform2;
status_t status_t
@@ -113,7 +112,7 @@ arch_cpu_user_TLB_invalidate(void)
status_t status_t
arch_cpu_shutdown(bool reboot) arch_cpu_shutdown(bool reboot)
{ {
if (gPlatform1 == kPlatform1Sbi) { if (gPlatform == kPlatformSbi) {
sbi_system_reset( sbi_system_reset(
reboot ? SBI_RESET_TYPE_COLD_REBOOT : SBI_RESET_TYPE_SHUTDOWN, reboot ? SBI_RESET_TYPE_COLD_REBOOT : SBI_RESET_TYPE_SHUTDOWN,
SBI_RESET_REASON_NONE); SBI_RESET_REASON_NONE);
@@ -4,11 +4,48 @@
#include <arch/platform.h> #include <arch/platform.h>
#include <boot/kernel_args.h>
#include <Htif.h>
#include <Plic.h>
#include <Clint.h>
#include <platform/sbi/sbi_syscalls.h>
#include <debug.h>
uint32 gPlatform;
void* gFDT = NULL;
HtifRegs *volatile gHtifRegs = (HtifRegs *volatile)0x40008000;
PlicRegs *volatile gPlicRegs;
ClintRegs *volatile gClintRegs;
status_t status_t
arch_platform_init(struct kernel_args *kernelArgs) arch_platform_init(struct kernel_args *args)
{ {
gPlatform = args->arch_args.machine_platform;
debug_early_boot_message("machine_platform: ");
switch (gPlatform) {
case kPlatformMNative:
debug_early_boot_message("Native mmode hooks\n");
break;
case kPlatformSbi:
debug_early_boot_message("SBI\n");
break;
default:
debug_early_boot_message("?\n");
break;
}
gFDT = args->arch_args.fdt;
gHtifRegs = (HtifRegs *volatile)args->arch_args.htif.start;
gPlicRegs = (PlicRegs *volatile)args->arch_args.plic.start;
gClintRegs = (ClintRegs *volatile)args->arch_args.clint.start;
return B_OK; return B_OK;
} }
@@ -16,6 +53,19 @@ arch_platform_init(struct kernel_args *kernelArgs)
status_t status_t
arch_platform_init_post_vm(struct kernel_args *kernelArgs) arch_platform_init_post_vm(struct kernel_args *kernelArgs)
{ {
if (gPlatform == kPlatformSbi) {
sbiret res;
res = sbi_get_spec_version();
dprintf("SBI spec version: %#lx\n", res.value);
res = sbi_get_impl_id();
dprintf("SBI implementation ID: %#lx\n", res.value);
res = sbi_get_impl_version();
dprintf("SBI implementation version: %#lx\n", res.value);
res = sbi_get_mvendorid();
dprintf("SBI vendor ID: %#lx\n", res.value);
res = sbi_get_marchid();
dprintf("SBI arch ID: %#lx\n", res.value);
}
return B_OK; return B_OK;
} }
@@ -18,20 +18,19 @@
#include <Clint.h> #include <Clint.h>
extern uint32 gPlatform1; extern uint32 gPlatform;
extern uint32 gPlatform2;
void void
arch_timer_set_hardware_timer(bigtime_t timeout) arch_timer_set_hardware_timer(bigtime_t timeout)
{ {
// TODO: Read timer frequency from FDT // TODO: Read timer frequency from FDT
switch (gPlatform1) { switch (gPlatform) {
case kPlatform1Riscv: case kPlatformMNative:
MSyscall(kMSyscallSetTimer, true, MSyscall(kMSyscallSetTimer, true,
gClintRegs->mtime + timeout * 10); gClintRegs->mtime + timeout * 10);
break; break;
case kPlatform1Sbi: { case kPlatformSbi: {
sbi_set_timer(CpuTime() + timeout); sbi_set_timer(CpuTime() + timeout);
break; break;
} }
@@ -44,11 +43,11 @@ arch_timer_set_hardware_timer(bigtime_t timeout)
void void
arch_timer_clear_hardware_timer() arch_timer_clear_hardware_timer()
{ {
switch (gPlatform1) { switch (gPlatform) {
case kPlatform1Riscv: case kPlatformMNative:
MSyscall(kMSyscallSetTimer, false); MSyscall(kMSyscallSetTimer, false);
break; break;
case kPlatform1Sbi: { case kPlatformSbi: {
sbi_set_timer(CpuTime() + (uint64)10000000 * 3600); sbi_set_timer(CpuTime() + (uint64)10000000 * 3600);
break; break;
} }