Skip to content

Commit

Permalink
kern: Further wiring up of uACPI (PCI related)
Browse files Browse the repository at this point in the history
  • Loading branch information
mintsuki committed Mar 2, 2025
1 parent b2a64bf commit 62dbfb9
Show file tree
Hide file tree
Showing 2 changed files with 43 additions and 9 deletions.
13 changes: 12 additions & 1 deletion kernel/main.v
Original file line number Diff line number Diff line change
Expand Up @@ -59,7 +59,6 @@ fn kmain_thread() {
pipe.initialise()
futex.initialise()
fs.initialise()
pci.initialise()

fs.mount(vfs_root, '', '/', 'tmpfs') or {}
fs.create(vfs_root, '/dev', 0o644 | stat.ifdir) or {}
Expand Down Expand Up @@ -124,6 +123,8 @@ pub fn kmain() {
acpi.initialise()
hpet.initialise()

pci.initialise()

mut uacpi_status := uacpi.UACPIStatus.ok

uacpi_status = C.uacpi_initialize(0)
Expand All @@ -136,6 +137,16 @@ pub fn kmain() {
panic('uacpi_namespace_load(): ${C.uacpi_status_to_string(uacpi_status)}')
}

uacpi_status = C.uacpi_set_interrupt_model(uacpi.InterruptModel.ioapic)
if uacpi_status != uacpi.UACPIStatus.ok {
panic('uacpi_interrupt_model(): ${C.uacpi_status_to_string(uacpi_status)}')
}

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

smp.initialise()

time.initialise()
Expand Down
39 changes: 31 additions & 8 deletions kernel/modules/uacpi/uacpi.v
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@ import lib
import kprint
import lib.stubs
import x86.hpet
import pci

pub enum UACPIStatus {
ok = 0
Expand Down Expand Up @@ -47,8 +48,16 @@ pub enum UACPIStatus {
aml_call_stack_depth_limit = 0x0eff000a
}

pub enum InterruptModel {
pic = 0
ioapic = 1
iosapic = 2
}

fn C.uacpi_initialize(flags u64) UACPIStatus
fn C.uacpi_namespace_load() UACPIStatus
fn C.uacpi_namespace_initialize() UACPIStatus
fn C.uacpi_set_interrupt_model(InterruptModel) UACPIStatus
fn C.uacpi_status_to_string(UACPIStatus) charptr

@[export: 'uacpi_kernel_log']
Expand Down Expand Up @@ -309,8 +318,10 @@ struct UACPIPCIAddress {

@[export: 'uacpi_kernel_pci_device_open']
pub fn uacpi_kernel_pci_device_open(addr UACPIPCIAddress, out_handle &voidptr) UACPIStatus {
dev := u64(addr.segment) << 32 | u64(addr.bus) << 16 | u64(addr.device) << 8 | u64(addr.function)
unsafe { *out_handle = voidptr(dev) }
mut pci_device := pci.get_device_by_coordinates(addr.bus, addr.device, addr.function, 0) or {
return UACPIStatus.not_found
}
unsafe { *out_handle = voidptr(pci_device) }
return UACPIStatus.ok
}

Expand All @@ -321,30 +332,42 @@ pub fn uacpi_kernel_pci_device_close(handle voidptr) {

@[export: 'uacpi_kernel_pci_read8']
pub fn uacpi_kernel_pci_read8(handle voidptr, offset u64, value &u8) UACPIStatus {
return UACPIStatus.unimplemented
mut pci_device := unsafe { &pci.PCIDevice(handle) }
unsafe { *value = pci_device.read[u8](u32(offset)) }
return UACPIStatus.ok
}

@[export: 'uacpi_kernel_pci_read16']
pub fn uacpi_kernel_pci_read16(handle voidptr, offset u64, value &u16) UACPIStatus {
return UACPIStatus.unimplemented
mut pci_device := unsafe { &pci.PCIDevice(handle) }
unsafe { *value = pci_device.read[u16](u32(offset)) }
return UACPIStatus.ok
}

@[export: 'uacpi_kernel_pci_read32']
pub fn uacpi_kernel_pci_read32(handle voidptr, offset u64, value &u32) UACPIStatus {
return UACPIStatus.unimplemented
mut pci_device := unsafe { &pci.PCIDevice(handle) }
unsafe { *value = pci_device.read[u32](u32(offset)) }
return UACPIStatus.ok
}

@[export: 'uacpi_kernel_pci_write8']
pub fn uacpi_kernel_pci_write8(handle voidptr, offset u64, value u8) UACPIStatus {
return UACPIStatus.unimplemented
mut pci_device := unsafe { &pci.PCIDevice(handle) }
pci_device.write[u8](u32(offset), value)
return UACPIStatus.ok
}

@[export: 'uacpi_kernel_pci_write16']
pub fn uacpi_kernel_pci_write16(handle voidptr, offset u64, value u16) UACPIStatus {
return UACPIStatus.unimplemented
mut pci_device := unsafe { &pci.PCIDevice(handle) }
pci_device.write[u16](u32(offset), value)
return UACPIStatus.ok
}

@[export: 'uacpi_kernel_pci_write32']
pub fn uacpi_kernel_pci_write32(handle voidptr, offset u64, value u32) UACPIStatus {
return UACPIStatus.unimplemented
mut pci_device := unsafe { &pci.PCIDevice(handle) }
pci_device.write[u32](u32(offset), value)
return UACPIStatus.ok
}

0 comments on commit 62dbfb9

Please sign in to comment.