Skip to content

Commit

Permalink
kern: Initial support for the HPET
Browse files Browse the repository at this point in the history
  • Loading branch information
mintsuki committed Feb 25, 2025
1 parent 7929d65 commit 5b5c08a
Show file tree
Hide file tree
Showing 4 changed files with 85 additions and 20 deletions.
15 changes: 15 additions & 0 deletions kernel/main.v
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@ import lib.stubs
import memory
import term
import acpi
import uacpi
import x86.gdt
import x86.idt
import x86.isr
Expand All @@ -35,6 +36,7 @@ import dev.mouse
import syscall.table
import socket
import time
import x86.hpet
import limine

#include <symbols.h>
Expand Down Expand Up @@ -120,6 +122,19 @@ pub fn kmain() {

// ACPI init
acpi.initialise()
hpet.initialise()

mut uacpi_status := uacpi.UACPIStatus.ok

uacpi_status = C.uacpi_initialize(0)
if uacpi_status != uacpi.UACPIStatus.ok {
panic('uacpi_initialize(): ${C.uacpi_status_to_string(uacpi_status)}')
}

uacpi_status = C.uacpi_namespace_load()
if uacpi_status != uacpi.UACPIStatus.ok {
panic('uacpi_namespace_load(): ${C.uacpi_status_to_string(uacpi_status)}')
}

smp.initialise()

Expand Down
12 changes: 0 additions & 12 deletions kernel/modules/acpi/acpi.v
Original file line number Diff line number Diff line change
Expand Up @@ -85,18 +85,6 @@ pub fn initialise() {
}

madt_init()

mut uacpi_status := UACPIStatus.ok

uacpi_status = C.uacpi_initialize(0)
if uacpi_status != UACPIStatus.ok {
panic('uacpi_initialize(): ${C.uacpi_status_to_string(uacpi_status)}')
}

uacpi_status = C.uacpi_namespace_load()
if uacpi_status != UACPIStatus.ok {
panic('uacpi_namespace_load(): ${C.uacpi_status_to_string(uacpi_status)}')
}
}

pub fn find_sdt(signature string, index int) !voidptr {
Expand Down
12 changes: 4 additions & 8 deletions kernel/modules/acpi/uacpi.v → kernel/modules/uacpi/uacpi.v
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
module acpi
module uacpi

import klock
import event
Expand All @@ -9,12 +9,9 @@ import memory
import lib
import kprint
import lib.stubs
import x86.hpet

//#include <uacpi/uacpi.h>
//#include <uacpi/kernel_api.h>

@[typedef]
enum UACPIStatus {
pub enum UACPIStatus {
ok = 0
mapping_failed = 1
out_of_memory = 2
Expand Down Expand Up @@ -248,8 +245,7 @@ pub fn uacpi_kernel_unmap(addr voidptr, len u64) {

@[export: 'uacpi_kernel_get_nanoseconds_since_boot']
pub fn uacpi_kernel_get_nanoseconds_since_boot() u64 {
clock := monotonic_clock
return u64(clock.tv_sec * 1000000000 + clock.tv_nsec)
return hpet.read_counter() * (1000000000 / hpet_frequency)
}

@[export: 'uacpi_kernel_io_map']
Expand Down
66 changes: 66 additions & 0 deletions kernel/modules/x86/hpet/hpet.v
Original file line number Diff line number Diff line change
@@ -0,0 +1,66 @@
module hpet

import acpi
import x86.kio

@[packed]
pub struct HPETTable {
pub mut:
header acpi.SDT

hardware_rev_id u8
misc_bits u8
pci_vendor_id u16
address_space_id u8
register_bit_width u8
register_bit_offset u8
reserved1 u8
address u64
hpet_number u8
minimum_tick u16
page_protection u8
}

pub struct HPET {
pub mut:
general_capabilities u64
unused0 u64
general_configuration u64
unused1 u64
general_int_status u64
unused2 u64
unused3 [24]u64
main_counter_value u64
unused4 u64
}

__global (
hpet &HPET
hpet_frequency u64
)

pub fn read_counter() u64 {
return kio.mmin(&hpet.main_counter_value)
}

pub fn initialise() {
hpet_table := unsafe { &HPETTable(acpi.find_sdt('HPET', 0) or {
panic('HPET ACPI table not found')
}) }

hpet = &HPET(hpet_table.address + higher_half)

mut tmp := kio.mmin(&hpet.general_capabilities)

counter_clk_period := tmp >> 32;
hpet_frequency = u64(1000000000000000) / counter_clk_period

println('hpet: Detected frequency of ${hpet_frequency} Hz')

kio.mmout(&hpet.main_counter_value, 0)

println('hpet: Enabling')
tmp = kio.mmin(&hpet.general_configuration)
tmp |= 0b01
kio.mmout(&hpet.general_configuration, tmp)
}

0 comments on commit 5b5c08a

Please sign in to comment.